dissect-wireshark: show Name and FinalBlockId as URIs
refs #3106
Change-Id: I0c43bb07588839b553f4584ce2ca44b3819e3d78
diff --git a/tests/dissect-wireshark/README.md b/tests/dissect-wireshark/README.md
index 7933e6d..afc497b 100644
--- a/tests/dissect-wireshark/README.md
+++ b/tests/dissect-wireshark/README.md
@@ -150,6 +150,29 @@
All packets are valid and do not contain unrecognized TLV elements.
Expected results of the dissection:
-- Packet 1 is recognized as "Interest" type, and has "CanBePrefix: Yes", "MustBeFresh: Yes",
- "HopLimit: 214", and "Parameters" field.
-- Packet 3 is recognized as "Data" type.
+- Packet 1 is recognized as "Interest" type, and has `CanBePrefix: Yes`, `MustBeFresh: Yes`,
+ `HopLimit: 214`, as well as a "Parameters" field.
+- Packet 2 is recognized as "Interest" type, and has `Name: /2=A/7=B/C/252=D/256=E/65535=E/sha256digest=ee357c5791dcaa4494d9b301047b875d8833caa76dada3e95837bbc3eaf7b300`.
+- Packet 3 is recognized as "Data" type, and has `Name: /`.
+
+### 12. URI Scheme
+
+Trace file: `nameuri.pcap`
+
+Trace summary: Hand-crafted packet for testing URI encoding in Name and FinalBlockId
+(`xxd -p -r < nameuri.hex > nameuri.pcap`).
+
+Expected results of the dissection:
+- Packet 1 is recognized as "Data" type.
+- Its name has eight components.
+- First name component is `NameComponent: ...`.
+- Second name component is `NameComponent: ....`.
+- Third name component is `NameComponent: .....`.
+- Fourth name component is `NameComponent: .A`.
+- Fifth name component is `NameComponent: %00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F`.
+ Notice that digits, HYPHEN (`-`), and PERIOD (`.`) are not percent-encoded.
+- Sixth name component is `NameComponent: %40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F`.
+ Notice that upper case letters, lower case letters, UNDERSCORE (`_`), and TILDE (`~`) are not percent-encoded.
+- Seventh name component is `NameComponent: %80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF`.
+- Eighth name component is `NameComponent: %C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF`.
+- FinalBlockId and its nested NameComponent are both `%02`.
diff --git a/tests/dissect-wireshark/nameuri.hex b/tests/dissect-wireshark/nameuri.hex
new file mode 100644
index 0000000..7144b5b
--- /dev/null
+++ b/tests/dissect-wireshark/nameuri.hex
@@ -0,0 +1,41 @@
+A1B2C3D4
+00020004
+00000000
+00000000
+00010000
+00000001
+
+# packet 1
+00000000
+00000000
+00000159
+00000159
+
+01005E0017AA
+000000000000
+8624
+
+## Data
+06FD0147
+
+## Name
+07FD0115
+0800
+08012E
+08022E2E
+08022E41
+0840000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F
+0840404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F
+0840808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF
+0840C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF
+
+## MetaInfo
+1405
+1A03080102
+
+## SignatureInfo
+1603
+1B0100
+
+## SignatureValue
+1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76
diff --git a/tests/dissect-wireshark/nameuri.pcap b/tests/dissect-wireshark/nameuri.pcap
new file mode 100644
index 0000000..92ff93c
--- /dev/null
+++ b/tests/dissect-wireshark/nameuri.pcap
Binary files differ
diff --git a/tests/dissect-wireshark/packet03.hex b/tests/dissect-wireshark/packet03.hex
index da0d7e4..0c33095 100644
--- a/tests/dissect-wireshark/packet03.hex
+++ b/tests/dissect-wireshark/packet03.hex
@@ -5,6 +5,7 @@
00010000
00000001
+# packet 1
00000000
00000000
00000039
@@ -14,6 +15,7 @@
000000000000
8624
+## Interest with CanBePrefix, MustBeFresh, HopLimit, Parameters
0529
0703080149
2100
@@ -24,6 +26,7 @@
2201D6
2304C0C1C2C3
+# packet 2
00000000
00000000
00000050
@@ -33,10 +36,12 @@
000000000000
8624
+## Interest Name contains typed name components
0540
0738 020141 070142 080143 FC0144 FD01000145 FDFFFF0145 0120EE357C5791DCAA4494D9B301047B875D8833CAA76DADA3E95837BBC3EAF7B300
0A044ACB1E4C
+# packet 3
00000000
00000000
00000039
@@ -46,6 +51,7 @@
000000000000
8624
+## Data without MetaInfo or Content
0629
0700
16031B0100
diff --git a/tools/dissect-wireshark/ndn.lua b/tools/dissect-wireshark/ndn.lua
index f3463e2..91ab21c 100755
--- a/tools/dissect-wireshark/ndn.lua
+++ b/tools/dissect-wireshark/ndn.lua
@@ -37,38 +37,61 @@
-----------------------------------------------------
-- Field formatting helpers
--- Borrowed from http://lua-users.org/wiki/StringRecipes
-function escapeString(str)
- if (str) then
- str = string.gsub(str, "\n", "\r\n")
- str = string.gsub(str, "([^%w %-%_%.%~])",
- function (c) return string.format ("%%%02X", string.byte(c)) end)
- str = string.gsub(str, " ", "+")
- end
- return str
-end
-
-- @return TLV-VALUE portion of a TLV block
function getValue(b)
return b.tvb(b.offset + b.typeLen + b.lengthLen, b.length)
end
-function getUriFromNameComponent(b)
- -- @todo Implement proper proper URL escaping
- return getValue(b):string()
+function getUriFromImplicitSha256DigestComponent(b)
+ s = "sha256digest="
+ for i = 0, (b.length - 1) do
+ byte = b.tvb(b.offset + b.typeLen + b.lengthLen + i, 1)
+ s = s .. string.format("%02x", byte:uint())
+ end
+ return s
end
-function getUriFromName(nameBlock)
- if (nameBlock.elements == nil) then
- return ""
- else
- components = {}
- for i, block in pairs(nameBlock.elements) do
- table.insert(components, getUriFromNameComponent(block))
- end
-
- return "/" .. table.concat(components, "/")
+function getUriFromNameComponent(b)
+ if b.type == 1 then
+ return getUriFromImplicitSha256DigestComponent(b)
end
+ s = ""
+ if b.type ~= 8 then
+ s = string.format("%d=", b.type)
+ end
+ hasNonPeriod = false
+ for i = 0, (b.length - 1) do
+ byte = b.tvb(b.offset + b.typeLen + b.lengthLen + i, 1)
+ ch = byte:uint()
+ hasNonPeriod = hasNonPeriod or ch ~= 0x2E
+ if (ch >= 0x41 and ch <= 0x5A) or (ch >= 0x61 and ch <= 0x7A) or (ch >= 0x30 and ch <= 0x39) or ch == 0x2D or ch == 0x2E or ch == 0x5F or ch == 0x7E then
+ s = s .. byte:string()
+ else
+ s = s .. string.format("%%%02X", ch)
+ end
+ end
+ if not hasNonPeriod then
+ s = s .. "..."
+ end
+ return s
+end
+
+function getUriFromName(b)
+ if b.elements == nil then
+ return "/"
+ end
+ components = {}
+ for i, comp in pairs(b.elements) do
+ table.insert(components, getUriFromNameComponent(comp))
+ end
+ return "/" .. table.concat(components, "/")
+end
+
+function getUriFromFinalBlockId(b)
+ if b.elements == nil then
+ return "/"
+ end
+ return getUriFromNameComponent(b.elements[1])
end
function getUriFromExclude(block)
@@ -182,7 +205,7 @@
[20] = {name = "MetaInfo" , summary = true},
[24] = {name = "ContentType" , field = ProtoField.uint32("ndn.contenttype", "Content Type", base.DEC) , value = getNonNegativeInteger},
[25] = {name = "FreshnessPeriod" , field = ProtoField.uint32("ndn.freshnessperiod", "FreshnessPeriod", base.DEC) , value = getNonNegativeInteger},
- [26] = {name = "FinalBlockId" , field = ProtoField.string("ndn.finalblockid", "FinalBlockId") , value = getUriFromNameComponent},
+ [26] = {name = "FinalBlockId" , field = ProtoField.string("ndn.finalblockid", "FinalBlockId") , value = getUriFromFinalBlockId},
[21] = {name = "Content" , field = ProtoField.string("ndn.content", "Content")},
[22] = {name = "SignatureInfo" , summary = true},
[27] = {name = "SignatureType" , field = ProtoField.uint32("ndn.signaturetype", "SignatureType", base.DEC) , value = getNonNegativeInteger},