diff options
Diffstat (limited to 'solec-wireshark.lua')
| -rw-r--r-- | solec-wireshark.lua | 340 |
1 files changed, 340 insertions, 0 deletions
diff --git a/solec-wireshark.lua b/solec-wireshark.lua new file mode 100644 index 0000000..c09c564 --- /dev/null +++ b/solec-wireshark.lua @@ -0,0 +1,340 @@ +-- This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild +-- +-- This file is compatible with Lua 5.3 + +package.path = "kaitai_struct_lua_runtime/?.lua" .. package.path +local class = require("class") +require("tvbstream") +require("kaitaistruct") +local proto = Proto('solec', 'Solec') +proto.fields = {} +local enum = require("enum") +local Solec_type_payload = ProtoField.new('type_payload', 'Solec.type_payload', ftypes.BYTES) +table.insert(proto.fields, Solec_type_payload) +local Solec_len_payload = ProtoField.new('len_payload', 'Solec.len_payload', ftypes.UINT32) +table.insert(proto.fields, Solec_len_payload) +local Solec_Test_num1 = ProtoField.new('num1', 'Solec.Test.num1', ftypes.UINT8) +table.insert(proto.fields, Solec_Test_num1) +local Solec_Test_time1 = ProtoField.new('time1', 'Solec.Test.time1', ftypes.UINT32) +table.insert(proto.fields, Solec_Test_time1) +local Solec_Test_num2 = ProtoField.new('num2', 'Solec.Test.num2', ftypes.UINT32) +table.insert(proto.fields, Solec_Test_num2) +local Solec_Test_num3 = ProtoField.new('num3', 'Solec.Test.num3', ftypes.UINT32) +table.insert(proto.fields, Solec_Test_num3) +local Solec_Test_num4 = ProtoField.new('num4', 'Solec.Test.num4', ftypes.UINT32) +table.insert(proto.fields, Solec_Test_num4) +local Solec_String_len_payload = ProtoField.new('len_payload', 'Solec.String.len_payload', ftypes.UINT32) +table.insert(proto.fields, Solec_String_len_payload) +local str_decode = require("string_decode") +local Solec_String_payload = ProtoField.new('payload', 'Solec.String.payload', ftypes.STRINGZ) +table.insert(proto.fields, Solec_String_payload) +local Solec_Error_error_code = ProtoField.new('error_code', 'Solec.Error.error_code', ftypes.BYTES) +table.insert(proto.fields, Solec_Error_error_code) +local Solec_Handshake_proto_ver_major = ProtoField.new('proto_ver_major', 'Solec.Handshake.proto_ver_major', ftypes.UINT8) +table.insert(proto.fields, Solec_Handshake_proto_ver_major) +local Solec_Handshake_proto_ver_minor = ProtoField.new('proto_ver_minor', 'Solec.Handshake.proto_ver_minor', ftypes.UINT8) +table.insert(proto.fields, Solec_Handshake_proto_ver_minor) +local Solec_Handshake_conn_type = ProtoField.new('conn_type', 'Solec.Handshake.conn_type', ftypes.BYTES) +table.insert(proto.fields, Solec_Handshake_conn_type) +local Solec_Message_timestamp = ProtoField.new('timestamp', 'Solec.Message.timestamp', ftypes.UINT32) +table.insert(proto.fields, Solec_Message_timestamp) + +function proto.dissector(tvb, pinfo, root) + pinfo.cols.protocol = 'Solec' + local tree = root:add(proto, tvb(), 'Solec') + local io = KaitaiStream(TVBStream(tvb)) + local obj = Solec(io, tree) +end + +-- +-- SOLEC protocol. +-- See also: Source (https://git.rctt.net/solec/plain/docs/protocol.svg?h=main) +Solec = class.class(KaitaiStruct) + +Solec.PayloadType = enum.Enum { + success = 1, + error = 2, + handshake = 3, + user_auth = 4, + message = 5, + server_auth = 6, + test = 255, +} + +Solec.ErrorType = enum.Enum { + auth_failed = 1, + not_found = 2, +} + +Solec.ConnType = enum.Enum { + user_conn = 1, + server_conn = 2, +} + +function Solec:_init(io, tree, parent, root) + KaitaiStruct._init(self, io) + self._parent = parent + self._root = root or self + self._tree = tree + self:_read() +end + +function Solec:_read() + local _offset = self._io:pos() + self.type_payload = Solec.PayloadType(self._io:read_u1()) + self._tree:add(Solec_type_payload, self._io._io.tvb(_offset, self._io:pos() - _offset)) + local _offset = self._io:pos() + self.len_payload = self._io:read_u2be() + self._tree:add(Solec_len_payload, self._io._io.tvb(_offset, self._io:pos() - _offset), self.len_payload) + local _offset = self._io:pos() + local _on = self.type_payload + if _on == Solec.PayloadType.user_auth then + self._raw_payload = self._io:read_bytes(self.len_payload) + local _tvb = self._io._io.tvb(_offset, self._io:pos() - _offset) + local _io = KaitaiStream(TVBStream(_tvb)) + local _tree = self._tree:add(_tvb, 'payload') + self.payload = Solec.UserAuth(_io, _tree, self, self._root) + elseif _on == Solec.PayloadType.server_auth then + self._raw_payload = self._io:read_bytes(self.len_payload) + local _tvb = self._io._io.tvb(_offset, self._io:pos() - _offset) + local _io = KaitaiStream(TVBStream(_tvb)) + local _tree = self._tree:add(_tvb, 'payload') + self.payload = Solec.ServerAuth(_io, _tree, self, self._root) + elseif _on == Solec.PayloadType.handshake then + self._raw_payload = self._io:read_bytes(self.len_payload) + local _tvb = self._io._io.tvb(_offset, self._io:pos() - _offset) + local _io = KaitaiStream(TVBStream(_tvb)) + local _tree = self._tree:add(_tvb, 'payload') + self.payload = Solec.Handshake(_io, _tree, self, self._root) + elseif _on == Solec.PayloadType.test then + self._raw_payload = self._io:read_bytes(self.len_payload) + local _tvb = self._io._io.tvb(_offset, self._io:pos() - _offset) + local _io = KaitaiStream(TVBStream(_tvb)) + local _tree = self._tree:add(_tvb, 'payload') + self.payload = Solec.Test(_io, _tree, self, self._root) + elseif _on == Solec.PayloadType.error then + self._raw_payload = self._io:read_bytes(self.len_payload) + local _tvb = self._io._io.tvb(_offset, self._io:pos() - _offset) + local _io = KaitaiStream(TVBStream(_tvb)) + local _tree = self._tree:add(_tvb, 'payload') + self.payload = Solec.Error(_io, _tree, self, self._root) + elseif _on == Solec.PayloadType.success then + self._raw_payload = self._io:read_bytes(self.len_payload) + local _tvb = self._io._io.tvb(_offset, self._io:pos() - _offset) + local _io = KaitaiStream(TVBStream(_tvb)) + local _tree = self._tree:add(_tvb, 'payload') + self.payload = Solec.Success(_io, _tree, self, self._root) + elseif _on == Solec.PayloadType.message then + self._raw_payload = self._io:read_bytes(self.len_payload) + local _tvb = self._io._io.tvb(_offset, self._io:pos() - _offset) + local _io = KaitaiStream(TVBStream(_tvb)) + local _tree = self._tree:add(_tvb, 'payload') + self.payload = Solec.Message(_io, _tree, self, self._root) + else + self.payload = self._io:read_bytes(self.len_payload) + end +end + + +-- +-- Test payload, used for parsers testing. +Solec.Test = class.class(KaitaiStruct) + +function Solec.Test:_init(io, tree, parent, root) + KaitaiStruct._init(self, io) + self._parent = parent + self._root = root or self + self._tree = tree + self:_read() +end + +function Solec.Test:_read() + local _offset = self._io:pos() + self.num1 = self._io:read_u1() + self._tree:add(Solec_Test_num1, self._io._io.tvb(_offset, self._io:pos() - _offset), self.num1) + local _offset = self._io:pos() + self.time1 = self._io:read_u8be() + self._tree:add(Solec_Test_time1, self._io._io.tvb(_offset, self._io:pos() - _offset), self.time1) + local _offset = self._io:pos() + local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'str1') + self.str1 = Solec.String(self._io, _tree, self, self._root) + _tree:set_len(self._io:pos() - _offset) + local _offset = self._io:pos() + self.num2 = self._io:read_u2be() + self._tree:add(Solec_Test_num2, self._io._io.tvb(_offset, self._io:pos() - _offset), self.num2) + local _offset = self._io:pos() + local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'str2') + self.str2 = Solec.String(self._io, _tree, self, self._root) + _tree:set_len(self._io:pos() - _offset) + local _offset = self._io:pos() + self.num3 = self._io:read_u4be() + self._tree:add(Solec_Test_num3, self._io._io.tvb(_offset, self._io:pos() - _offset), self.num3) + local _offset = self._io:pos() + local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'str3') + self.str3 = Solec.String(self._io, _tree, self, self._root) + _tree:set_len(self._io:pos() - _offset) + local _offset = self._io:pos() + self.num4 = self._io:read_u8be() + self._tree:add(Solec_Test_num4, self._io._io.tvb(_offset, self._io:pos() - _offset), self.num4) +end + + +Solec.UserAuth = class.class(KaitaiStruct) + +function Solec.UserAuth:_init(io, tree, parent, root) + KaitaiStruct._init(self, io) + self._parent = parent + self._root = root or self + self._tree = tree + self:_read() +end + +function Solec.UserAuth:_read() + local _offset = self._io:pos() + local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'name') + self.name = Solec.String(self._io, _tree, self, self._root) + _tree:set_len(self._io:pos() - _offset) + local _offset = self._io:pos() + local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'pass') + self.pass = Solec.String(self._io, _tree, self, self._root) + _tree:set_len(self._io:pos() - _offset) +end + + +-- +-- Send from server if operation succeded. +Solec.Success = class.class(KaitaiStruct) + +function Solec.Success:_init(io, tree, parent, root) + KaitaiStruct._init(self, io) + self._parent = parent + self._root = root or self + self._tree = tree + self:_read() +end + +function Solec.Success:_read() +end + + +-- +-- UTF-8 encoded string. +Solec.String = class.class(KaitaiStruct) + +function Solec.String:_init(io, tree, parent, root) + KaitaiStruct._init(self, io) + self._parent = parent + self._root = root or self + self._tree = tree + self:_read() +end + +function Solec.String:_read() + local _offset = self._io:pos() + self.len_payload = self._io:read_u2be() + self._tree:add(Solec_String_len_payload, self._io._io.tvb(_offset, self._io:pos() - _offset), self.len_payload) + local _offset = self._io:pos() + self.payload = str_decode.decode(self._io:read_bytes(self.len_payload), "UTF-8") + self._tree:add(Solec_String_payload, self._io._io.tvb(_offset, self._io:pos() - _offset), self.payload) +end + + +-- +-- Senf from server if operation failed. +Solec.Error = class.class(KaitaiStruct) + +function Solec.Error:_init(io, tree, parent, root) + KaitaiStruct._init(self, io) + self._parent = parent + self._root = root or self + self._tree = tree + self:_read() +end + +function Solec.Error:_read() + local _offset = self._io:pos() + self.error_code = Solec.ErrorType(self._io:read_u1()) + self._tree:add(Solec_Error_error_code, self._io._io.tvb(_offset, self._io:pos() - _offset), self.error_code) +end + + +-- +-- Handshake is sent by the client during connection initialization. +-- If protocol_ver_major is different than version used by the server +-- connection will be aborted. +Solec.Handshake = class.class(KaitaiStruct) + +function Solec.Handshake:_init(io, tree, parent, root) + KaitaiStruct._init(self, io) + self._parent = parent + self._root = root or self + self._tree = tree + self:_read() +end + +function Solec.Handshake:_read() + local _offset = self._io:pos() + self.proto_ver_major = self._io:read_u1() + self._tree:add(Solec_Handshake_proto_ver_major, self._io._io.tvb(_offset, self._io:pos() - _offset), self.proto_ver_major) + local _offset = self._io:pos() + self.proto_ver_minor = self._io:read_u1() + self._tree:add(Solec_Handshake_proto_ver_minor, self._io._io.tvb(_offset, self._io:pos() - _offset), self.proto_ver_minor) + local _offset = self._io:pos() + self.conn_type = Solec.ConnType(self._io:read_u1()) + self._tree:add(Solec_Handshake_conn_type, self._io._io.tvb(_offset, self._io:pos() - _offset), self.conn_type) +end + + +-- +-- Source and target fields are addresses in user@server format. +Solec.Message = class.class(KaitaiStruct) + +function Solec.Message:_init(io, tree, parent, root) + KaitaiStruct._init(self, io) + self._parent = parent + self._root = root or self + self._tree = tree + self:_read() +end + +function Solec.Message:_read() + local _offset = self._io:pos() + local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'source') + self.source = Solec.String(self._io, _tree, self, self._root) + _tree:set_len(self._io:pos() - _offset) + local _offset = self._io:pos() + local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'target') + self.target = Solec.String(self._io, _tree, self, self._root) + _tree:set_len(self._io:pos() - _offset) + local _offset = self._io:pos() + self.timestamp = self._io:read_u8be() + self._tree:add(Solec_Message_timestamp, self._io._io.tvb(_offset, self._io:pos() - _offset), self.timestamp) + local _offset = self._io:pos() + local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'content') + self.content = Solec.String(self._io, _tree, self, self._root) + _tree:set_len(self._io:pos() - _offset) +end + +-- +-- Set just before sending the message. + +Solec.ServerAuth = class.class(KaitaiStruct) + +function Solec.ServerAuth:_init(io, tree, parent, root) + KaitaiStruct._init(self, io) + self._parent = parent + self._root = root or self + self._tree = tree + self:_read() +end + +function Solec.ServerAuth:_read() + local _offset = self._io:pos() + local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'name') + self.name = Solec.String(self._io, _tree, self, self._root) + _tree:set_len(self._io:pos() - _offset) +end + + +local tcp_port = DissectorTable.get("tcp.port") +tcp_port:add(9999, proto) |
