From 5b3c9427a8d3b3ca9f24bd3e95859dee66f328cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Baylac=20Jacqu=C3=A9?= Date: Fri, 15 Sep 2023 10:25:25 +0200 Subject: [PATCH] AddToStore: implement payload/response The AddToStore operation is performed in 3 packets: 1. AddToStore request metadata. 2. AddToStore payload. 3. Response from the daemon. This means we need to keep some sort of processing state for the operation. --- nix-packet.lua | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/nix-packet.lua b/nix-packet.lua index 7560775..784795e 100644 --- a/nix-packet.lua +++ b/nix-packet.lua @@ -19,6 +19,10 @@ local op_addtostore_camstr = ProtoField.string("nix.addtostore.camstr", "Add to local op_addtostore_nb_references = ProtoField.uint64("nix.addtostore.nbreferences", "Number of References") local op_addtostore_reference = ProtoField.string("nix.addtostore.reference", "Reference") local op_addtostore_repairflag = ProtoField.bool("nix.addtostore.repairflag", "Repair Flag") +local op_addtostore_payload = ProtoField.bytes("nix.addtostore.payload", "Request Payload") +local op_addtostore_response = ProtoField.bytes("nix.addtostore.response", "Response") + +op_addtostore_step = 0 nix_proto.fields = { dst_field, @@ -38,6 +42,8 @@ nix_proto.fields = { op_addtostore_nb_references, op_addtostore_reference, op_addtostore_repairflag, + op_addtostore_payload, + op_addtostore_response, } local op_table = { @@ -165,11 +171,25 @@ function parse_add_to_store(tvb, pinfo, tree, offset) end local repairflag = subtree:add(op_addtostore_repairflag, tvb(offset, 1)) + offset = offset + 8 + op_addtostore_step = 2 return offset end +function process_op_addtostore_step(tvb, pinfo, tree, offset) + if op_addtostore_step == 2 then + local subtree = tree:add(op_addtostore, tvb(offset, tvb:len() - offset)) + subtree:add(op_addtostore_payload, tvb(offset, tvb:len() - offset)) + elseif op_addtostore_step == 1 then + local subtree = tree:add(op_addtostore, tvb(offset, tvb:len() - offset)) + subtree:add(op_addtostore_response, tvb(offset, tvb:len() - offset)) + end + + op_addtostore_step = op_addtostore_step - 1 +end + function parse_op(tvb, pinfo, tree, offset, op) tree:add(op_name_field, tvb(offset, 8), op_table[op]) offset = offset + 8 @@ -191,7 +211,10 @@ function nix_proto.dissector(tvb, pinfo, tree) offset = offset + 8 local first_word = tvb(offset, 4):le_uint() - if first_word == 0x6e697863 then + + if op_addtostore_step > 0 then + process_op_addtostore_step(tvb, pinfo, subtree, offset) + elseif first_word == 0x6e697863 then offset = parse_client_hello(tvb, pinfo, subtree, offset) elseif first_word == 0x6478696f then offset = parse_daemon_hello(tvb, pinfo, subtree, offset)