[Ndn-interest] issue in the NDN packet encoding spec 0.3.0

Nick Briggs nicholas.h.briggs at gmail.com
Fri Jun 7 12:40:03 PDT 2019

Hi Junxiao—

I’ll have a look at the changes soon. There may need to be changes in client libraries to enforce this and potentially changes in debug/validation code to detect errors

Sent from my iPhone
(Where it’s hard to do code/document reviews)

> On Jun 7, 2019, at 9:13 AM, Junxiao Shi <shijunxiao at email.arizona.edu> wrote:
> Hi Nick
> Thanks for reporting this issue. I have entered this bug as https://redmine.named-data.net/issues/4946 , and the fix has been merged.
> Yours, Junxiao
>> On Mon, May 20, 2019, 13:47 Nick Briggs via Ndn-interest <ndn-interest at lists.cs.ucla.edu> wrote:
>> I was reading through the NDN packet spec, at https://named-data.net/doc/NDN-packet-spec/current/tlv.html, currently documenting version 0.3, and noticed an issue as follows:
>> When the variable length encoding for Type and Length was specified there was no requirement to use the minimum length encoding for any given value.  That is, a length of 0x20 MAY be encoded as 0x20, or 0xFD0020, or 0xFE00000020, or even 0xFF0000000000000020.
>> This has consequences in the canonical ordering and matching code as specified in https://named-data.net/doc/NDN-packet-spec/current/name.html -- the suggestion that one can use "memcmp" on the wire encoding of the Name field's TLV-VALUE is incorrect.  As currently specified, even a simple equality match for Names must decode each individual T and L value from the top level Name TLV through the component T and L values.
>>> If components component1 and component2 have different types, then
>>> component1 is less than component2 if numerical value of TLV-TYPE(component1) is less than numerical value of TLV-TYPE(component2)
>> For example, the numerical value of TLV-TYPE encoded as 0x42 is equal to that of a TLV-TYPE encoded 0xFD0042)
>>> If components have the same type, then
>>> If a is shorter than b (i.e., has fewer bytes), then a comes before b.
>>> If a and b have the same length, then they are compared in lexicographic order based on absolute value of octet values (e.g., ordering based on memcmp() operation.)
>> again, if TLV-LENGTH(a) was encoded 0x20 and TLV-LENGTH(b) was encoded 0xFD0010 a simple memcmp as specified in
>>> The canonical order can be enforced by directly comparing the wire encoding of the Name field’s TLV-VALUE (i.e., excluding TLV-TYPE and TLV-LEGNTH of the whole Name TLV):
>>> int
>>> canonicalOrder(Name lhs, Name rhs) {
>>>    int result = memcmp(lhs.value(), rhs.value(), min(lhs.value_size(), rhs.value_size()));
>>>    if (result == 0) {
>>>      result = lhs.value_size() - rhs.value_size();
>>>    }
>>>    return result;
>>> }
>> will produced an incorrect result.
>> You probably need to say that a VAR-NUMBER MUST use the minimum length encoding necessary to represent the value and that failure to do so will result in unspecified behavior.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.lists.cs.ucla.edu/pipermail/ndn-interest/attachments/20190607/454e079d/attachment.html>

More information about the Ndn-interest mailing list