<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">I was reading through the NDN packet spec, at <a href="https://named-data.net/doc/NDN-packet-spec/current/tlv.html" class="">https://named-data.net/doc/NDN-packet-spec/current/tlv.html</a>, currently documenting version 0.3, and noticed an issue as follows:<div class=""><br class=""></div><div class="">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.</div><div class=""><br class=""></div><div class="">This has consequences in the canonical ordering and matching code as specified in <a href="https://named-data.net/doc/NDN-packet-spec/current/name.html" class="">https://named-data.net/doc/NDN-packet-spec/current/name.html</a> -- 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.</div><div class=""><br class=""></div><div class=""><blockquote type="cite" class=""><div style="margin: 0px 0px 0.5em; padding: 0px; box-sizing: border-box; direction: ltr; font-family: 'Helvetica Neue', Helvetica, Helvetica, Arial, sans-serif; line-height: 1.6em;" class="">If components <code class="literal notranslate docutils" style="margin: 0px; padding: 1px; box-sizing: border-box; font-weight: bold; background-color: rgb(238, 238, 236); font-size: 13px; background-position: initial initial; background-repeat: initial initial;"><span class="pre" style="margin: 0px; padding: 0px; box-sizing: border-box;">component1</span></code> and <code class="literal notranslate docutils" style="margin: 0px; padding: 1px; box-sizing: border-box; font-weight: bold; background-color: rgb(238, 238, 236); font-size: 13px; background-position: initial initial; background-repeat: initial initial;"><span class="pre" style="margin: 0px; padding: 0px; box-sizing: border-box;">component2</span></code> have different types, then</div><ul style="margin: 0px 0px 0px 1.5em; padding: 0px; box-sizing: border-box; direction: ltr; line-height: 1.6; list-style: square;" class=""><li style="margin: 0px; padding: 0px; box-sizing: border-box; direction: ltr;" class=""><div style="margin: 0px 0px 0.5em; padding: 0px; box-sizing: border-box; direction: ltr; font-family: 'Helvetica Neue', Helvetica, Helvetica, Arial, sans-serif; line-height: 1.6em; color: rgb(34, 34, 34);" class=""><code class="literal notranslate docutils" style="margin: 0px; padding: 1px; box-sizing: border-box; font-weight: bold; background-color: rgb(238, 238, 236); font-size: 13px; background-position: initial initial; background-repeat: initial initial;"><span class="pre" style="margin: 0px; padding: 0px; box-sizing: border-box;">component1</span></code> is less than <code class="literal notranslate docutils" style="margin: 0px; padding: 1px; box-sizing: border-box; font-weight: bold; background-color: rgb(238, 238, 236); font-size: 13px; background-position: initial initial; background-repeat: initial initial;"><span class="pre" style="margin: 0px; padding: 0px; box-sizing: border-box;">component2</span></code> if numerical value of <code class="literal notranslate docutils" style="margin: 0px; padding: 1px; box-sizing: border-box; font-weight: bold; background-color: rgb(238, 238, 236); font-size: 13px; background-position: initial initial; background-repeat: initial initial;"><span class="pre" style="margin: 0px; padding: 0px; box-sizing: border-box;">TLV-TYPE(component1)</span></code> is less than numerical value of <code class="literal notranslate docutils" style="margin: 0px; padding: 1px; box-sizing: border-box; font-weight: bold; background-color: rgb(238, 238, 236); font-size: 13px; background-position: initial initial; background-repeat: initial initial;"><span class="pre" style="margin: 0px; padding: 0px; box-sizing: border-box;">TLV-TYPE(component2)</span></code></div></li></ul></blockquote><div class=""><br class=""></div>For example, the numerical value of TLV-TYPE encoded as 0x42 is equal to that of a TLV-TYPE encoded 0xFD0042)</div><div class=""><br class=""></div><div class=""><blockquote type="cite" class=""><ul style="margin: 0px 0px 10px 1.5em; padding: 0px; box-sizing: border-box; direction: ltr; line-height: 1.6; list-style: square; color: rgb(34, 34, 34); font-family: 'Helvetica Neue', Helvetica, Helvetica, Arial, sans-serif;" class=""><li style="margin: 0px; padding: 0px; box-sizing: border-box; direction: ltr;" class=""><div style="margin: 0px 0px 0.5em; padding: 0px; box-sizing: border-box; direction: ltr; line-height: 1.6em;" class="">If components have the same type, then</div><blockquote style="margin: 0px 0px 17px; padding: 0px 3em; box-sizing: border-box; direction: ltr; line-height: 1.5;" class=""><div style="margin: 0px; padding: 0px; box-sizing: border-box; direction: ltr;" class=""><ul class="simple" style="margin: 0px 0px 0px 1.5em; padding: 0px; box-sizing: border-box; direction: ltr; line-height: 1.6; list-style: square;"><li style="margin: 0px; padding: 0px; box-sizing: border-box; direction: ltr;" class="">If <span style="margin: 0px; padding: 0px; box-sizing: border-box; line-height: inherit; border: none;" class="">a</span> is shorter than <span style="margin: 0px; padding: 0px; box-sizing: border-box; line-height: inherit; border: none;" class="">b</span> (i.e., has fewer bytes), then <span style="margin: 0px; padding: 0px; box-sizing: border-box; line-height: inherit; border: none;" class="">a</span> comes before <span style="margin: 0px; padding: 0px; box-sizing: border-box; line-height: inherit; border: none;" class="">b</span>.</li><li style="margin: 0px; padding: 0px; box-sizing: border-box; direction: ltr;" class="">If <span style="margin: 0px; padding: 0px; box-sizing: border-box; line-height: inherit; border: none;" class="">a</span> and <span style="margin: 0px; padding: 0px; box-sizing: border-box; line-height: inherit; border: none;" class="">b</span> 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.)</li></ul></div></blockquote></li></ul></blockquote>again, if TLV-LENGTH(a) was encoded 0x20 and TLV-LENGTH(b) was encoded 0xFD0010 a simple memcmp as specified in</div><div class=""><br class=""></div><div class=""><blockquote type="cite" class=""><div style="margin: 0px 0px 0.5em; padding: 0px; box-sizing: border-box; direction: ltr; font-family: 'Helvetica Neue', Helvetica, Helvetica, Arial, sans-serif; line-height: 1.6em; color: rgb(34, 34, 34);" class="">The canonical order can be enforced by directly comparing the wire encoding of the <code class="literal notranslate docutils" style="margin: 0px; padding: 1px; box-sizing: border-box; font-weight: bold; background-color: rgb(238, 238, 236); font-size: 13px; background-position: initial initial; background-repeat: initial initial;"><span class="pre" style="margin: 0px; padding: 0px; box-sizing: border-box;">Name</span></code> field’s TLV-VALUE (i.e., excluding TLV-TYPE and TLV-LEGNTH of the whole Name TLV):</div><div class="notranslate last highlight-default" style="margin: 0px; padding: 0px; box-sizing: border-box; direction: ltr; color: rgb(34, 34, 34); font-family: 'Helvetica Neue', Helvetica, Helvetica, Arial, sans-serif;"><div class="highlight" style="margin: 0px 0px 0.8em; padding: 3px; box-sizing: border-box; direction: ltr; background-color: rgb(238, 238, 236); border-top-width: 2px; border-top-style: solid; border-top-color: rgb(221, 221, 221); border-bottom-width: 2px; border-bottom-style: solid; border-bottom-color: rgb(221, 221, 221);"><pre style="margin-top: 0px; margin-bottom: 0px; padding: 1.5em; box-sizing: border-box; font-size: 0.9em; direction: ltr; background-color: rgb(247, 247, 247); border-width: 2px; border-style: solid none; border-color: rgb(198, 201, 203);" class=""><span style="margin: 0px; padding: 0px; box-sizing: border-box;" class=""></span><span class="nb" style="margin: 0px; padding: 0px; box-sizing: border-box; color: rgb(0, 112, 32);">int</span>
<span class="n" style="margin: 0px; padding: 0px; box-sizing: border-box;">canonicalOrder</span><span class="p" style="margin: 0px; padding: 0px; box-sizing: border-box;">(</span><span class="n" style="margin: 0px; padding: 0px; box-sizing: border-box;">Name</span> <span class="n" style="margin: 0px; padding: 0px; box-sizing: border-box;">lhs</span><span class="p" style="margin: 0px; padding: 0px; box-sizing: border-box;">,</span> <span class="n" style="margin: 0px; padding: 0px; box-sizing: border-box;">Name</span> <span class="n" style="margin: 0px; padding: 0px; box-sizing: border-box;">rhs</span><span class="p" style="margin: 0px; padding: 0px; box-sizing: border-box;">)</span> <span class="p" style="margin: 0px; padding: 0px; box-sizing: border-box;">{</span>
   <span class="nb" style="margin: 0px; padding: 0px; box-sizing: border-box; color: rgb(0, 112, 32);">int</span> <span class="n" style="margin: 0px; padding: 0px; box-sizing: border-box;">result</span> <span class="o" style="margin: 0px; padding: 0px; box-sizing: border-box; color: rgb(102, 102, 102);">=</span> <span class="n" style="margin: 0px; padding: 0px; box-sizing: border-box;">memcmp</span><span class="p" style="margin: 0px; padding: 0px; box-sizing: border-box;">(</span><span class="n" style="margin: 0px; padding: 0px; box-sizing: border-box;">lhs</span><span class="o" style="margin: 0px; padding: 0px; box-sizing: border-box; color: rgb(102, 102, 102);">.</span><span class="n" style="margin: 0px; padding: 0px; box-sizing: border-box;">value</span><span class="p" style="margin: 0px; padding: 0px; box-sizing: border-box;">(),</span> <span class="n" style="margin: 0px; padding: 0px; box-sizing: border-box;">rhs</span><span class="o" style="margin: 0px; padding: 0px; box-sizing: border-box; color: rgb(102, 102, 102);">.</span><span class="n" style="margin: 0px; padding: 0px; box-sizing: border-box;">value</span><span class="p" style="margin: 0px; padding: 0px; box-sizing: border-box;">(),</span> <span class="nb" style="margin: 0px; padding: 0px; box-sizing: border-box; color: rgb(0, 112, 32);">min</span><span class="p" style="margin: 0px; padding: 0px; box-sizing: border-box;">(</span><span class="n" style="margin: 0px; padding: 0px; box-sizing: border-box;">lhs</span><span class="o" style="margin: 0px; padding: 0px; box-sizing: border-box; color: rgb(102, 102, 102);">.</span><span class="n" style="margin: 0px; padding: 0px; box-sizing: border-box;">value_size</span><span class="p" style="margin: 0px; padding: 0px; box-sizing: border-box;">(),</span> <span class="n" style="margin: 0px; padding: 0px; box-sizing: border-box;">rhs</span><span class="o" style="margin: 0px; padding: 0px; box-sizing: border-box; color: rgb(102, 102, 102);">.</span><span class="n" style="margin: 0px; padding: 0px; box-sizing: border-box;">value_size</span><span class="p" style="margin: 0px; padding: 0px; box-sizing: border-box;">()));</span>
   <span class="k" style="margin: 0px; padding: 0px; box-sizing: border-box; color: rgb(0, 112, 32); font-weight: bold;">if</span> <span class="p" style="margin: 0px; padding: 0px; box-sizing: border-box;">(</span><span class="n" style="margin: 0px; padding: 0px; box-sizing: border-box;">result</span> <span class="o" style="margin: 0px; padding: 0px; box-sizing: border-box; color: rgb(102, 102, 102);">==</span> <span class="mi" style="margin: 0px; padding: 0px; box-sizing: border-box; color: rgb(32, 128, 80);">0</span><span class="p" style="margin: 0px; padding: 0px; box-sizing: border-box;">)</span> <span class="p" style="margin: 0px; padding: 0px; box-sizing: border-box;">{</span>
     <span class="n" style="margin: 0px; padding: 0px; box-sizing: border-box;">result</span> <span class="o" style="margin: 0px; padding: 0px; box-sizing: border-box; color: rgb(102, 102, 102);">=</span> <span class="n" style="margin: 0px; padding: 0px; box-sizing: border-box;">lhs</span><span class="o" style="margin: 0px; padding: 0px; box-sizing: border-box; color: rgb(102, 102, 102);">.</span><span class="n" style="margin: 0px; padding: 0px; box-sizing: border-box;">value_size</span><span class="p" style="margin: 0px; padding: 0px; box-sizing: border-box;">()</span> <span class="o" style="margin: 0px; padding: 0px; box-sizing: border-box; color: rgb(102, 102, 102);">-</span> <span class="n" style="margin: 0px; padding: 0px; box-sizing: border-box;">rhs</span><span class="o" style="margin: 0px; padding: 0px; box-sizing: border-box; color: rgb(102, 102, 102);">.</span><span class="n" style="margin: 0px; padding: 0px; box-sizing: border-box;">value_size</span><span class="p" style="margin: 0px; padding: 0px; box-sizing: border-box;">();</span>
   <span class="p" style="margin: 0px; padding: 0px; box-sizing: border-box;">}</span>
   <span class="k" style="margin: 0px; padding: 0px; box-sizing: border-box; color: rgb(0, 112, 32); font-weight: bold;">return</span> <span class="n" style="margin: 0px; padding: 0px; box-sizing: border-box;">result</span><span class="p" style="margin: 0px; padding: 0px; box-sizing: border-box;">;</span>
<span class="p" style="margin: 0px; padding: 0px; box-sizing: border-box;">}</span></pre></div></div></blockquote><div class="">will produced an incorrect result.</div></div><div class=""><br class=""></div><div class="">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.</div><div class=""><br class=""></div><div class=""><blockquote type="cite" class=""></blockquote></div></body></html>