<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto">Hi Junxiao—<div><br><div>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<br><br><div id="AppleMailSignature" dir="ltr">Sent from my iPhone</div><div id="AppleMailSignature" dir="ltr">(Where it’s hard to do code/document reviews)</div><div dir="ltr"><br>On Jun 7, 2019, at 9:13 AM, Junxiao Shi <<a href="mailto:shijunxiao@email.arizona.edu">shijunxiao@email.arizona.edu</a>> wrote:<br><br></div><blockquote type="cite"><div dir="ltr"><div dir="auto"><div>Hi Nick<div dir="auto"><br></div><div dir="auto">Thanks for reporting this issue. I have entered this bug as <a href="https://redmine.named-data.net/issues/4946">https://redmine.named-data.net/issues/4946</a> , and the fix has been merged.</div><div dir="auto"><br></div><div dir="auto">Yours, Junxiao</div><br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, May 20, 2019, 13:47 Nick Briggs via Ndn-interest <<a href="mailto:ndn-interest@lists.cs.ucla.edu">ndn-interest@lists.cs.ucla.edu</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word">I was reading through the NDN packet spec, at <a href="https://named-data.net/doc/NDN-packet-spec/current/tlv.html" target="_blank" rel="noreferrer">https://named-data.net/doc/NDN-packet-spec/current/tlv.html</a>, currently documenting version 0.3, and noticed an issue as follows:<div><br></div><div>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><br></div><div>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" target="_blank" rel="noreferrer">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><br></div><div><blockquote type="cite"><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">If components <code class="m_-2296721205000704307literal notranslate m_-2296721205000704307docutils" 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="m_-2296721205000704307pre" style="margin:0px;padding:0px;box-sizing:border-box">component1</span></code> and <code class="m_-2296721205000704307literal notranslate m_-2296721205000704307docutils" 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="m_-2296721205000704307pre" 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"><li style="margin:0px;padding:0px;box-sizing:border-box;direction:ltr"><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)"><code class="m_-2296721205000704307literal notranslate m_-2296721205000704307docutils" 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="m_-2296721205000704307pre" style="margin:0px;padding:0px;box-sizing:border-box">component1</span></code> is less than <code class="m_-2296721205000704307literal notranslate m_-2296721205000704307docutils" 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="m_-2296721205000704307pre" style="margin:0px;padding:0px;box-sizing:border-box">component2</span></code> if numerical value of <code class="m_-2296721205000704307literal notranslate m_-2296721205000704307docutils" 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="m_-2296721205000704307pre" style="margin:0px;padding:0px;box-sizing:border-box">TLV-TYPE(component1)</span></code> is less than numerical value of <code class="m_-2296721205000704307literal notranslate m_-2296721205000704307docutils" 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="m_-2296721205000704307pre" style="margin:0px;padding:0px;box-sizing:border-box">TLV-TYPE(component2)</span></code></div></li></ul></blockquote><div><br></div>For example, the numerical value of TLV-TYPE encoded as 0x42 is equal to that of a TLV-TYPE encoded 0xFD0042)</div><div><br></div><div><blockquote type="cite"><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"><li style="margin:0px;padding:0px;box-sizing:border-box;direction:ltr"><div style="margin:0px 0px 0.5em;padding:0px;box-sizing:border-box;direction:ltr;line-height:1.6em">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"><div style="margin:0px;padding:0px;box-sizing:border-box;direction:ltr"><ul class="m_-2296721205000704307simple" 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">If <span style="margin:0px;padding:0px;box-sizing:border-box;line-height:inherit;border:none">a</span> is shorter than <span style="margin:0px;padding:0px;box-sizing:border-box;line-height:inherit;border:none">b</span> (i.e., has fewer bytes), then <span style="margin:0px;padding:0px;box-sizing:border-box;line-height:inherit;border:none">a</span> comes before <span style="margin:0px;padding:0px;box-sizing:border-box;line-height:inherit;border:none">b</span>.</li><li style="margin:0px;padding:0px;box-sizing:border-box;direction:ltr">If <span style="margin:0px;padding:0px;box-sizing:border-box;line-height:inherit;border:none">a</span> and <span style="margin:0px;padding:0px;box-sizing:border-box;line-height:inherit;border:none">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><br></div><div><blockquote type="cite"><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)">The canonical order can be enforced by directly comparing the wire encoding of the <code class="m_-2296721205000704307literal notranslate m_-2296721205000704307docutils" 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="m_-2296721205000704307pre" 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 m_-2296721205000704307last m_-2296721205000704307highlight-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="m_-2296721205000704307highlight" 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)"><span style="margin:0px;padding:0px;box-sizing:border-box"></span><span class="m_-2296721205000704307nb" style="margin:0px;padding:0px;box-sizing:border-box;color:rgb(0,112,32)">int</span>
<span class="m_-2296721205000704307n" style="margin:0px;padding:0px;box-sizing:border-box">canonicalOrder</span><span class="m_-2296721205000704307p" style="margin:0px;padding:0px;box-sizing:border-box">(</span><span class="m_-2296721205000704307n" style="margin:0px;padding:0px;box-sizing:border-box">Name</span> <span class="m_-2296721205000704307n" style="margin:0px;padding:0px;box-sizing:border-box">lhs</span><span class="m_-2296721205000704307p" style="margin:0px;padding:0px;box-sizing:border-box">,</span> <span class="m_-2296721205000704307n" style="margin:0px;padding:0px;box-sizing:border-box">Name</span> <span class="m_-2296721205000704307n" style="margin:0px;padding:0px;box-sizing:border-box">rhs</span><span class="m_-2296721205000704307p" style="margin:0px;padding:0px;box-sizing:border-box">)</span> <span class="m_-2296721205000704307p" style="margin:0px;padding:0px;box-sizing:border-box">{</span>
   <span class="m_-2296721205000704307nb" style="margin:0px;padding:0px;box-sizing:border-box;color:rgb(0,112,32)">int</span> <span class="m_-2296721205000704307n" style="margin:0px;padding:0px;box-sizing:border-box">result</span> <span class="m_-2296721205000704307o" style="margin:0px;padding:0px;box-sizing:border-box;color:rgb(102,102,102)">=</span> <span class="m_-2296721205000704307n" style="margin:0px;padding:0px;box-sizing:border-box">memcmp</span><span class="m_-2296721205000704307p" style="margin:0px;padding:0px;box-sizing:border-box">(</span><span class="m_-2296721205000704307n" style="margin:0px;padding:0px;box-sizing:border-box">lhs</span><span class="m_-2296721205000704307o" style="margin:0px;padding:0px;box-sizing:border-box;color:rgb(102,102,102)">.</span><span class="m_-2296721205000704307n" style="margin:0px;padding:0px;box-sizing:border-box">value</span><span class="m_-2296721205000704307p" style="margin:0px;padding:0px;box-sizing:border-box">(),</span> <span class="m_-2296721205000704307n" style="margin:0px;padding:0px;box-sizing:border-box">rhs</span><span class="m_-2296721205000704307o" style="margin:0px;padding:0px;box-sizing:border-box;color:rgb(102,102,102)">.</span><span class="m_-2296721205000704307n" style="margin:0px;padding:0px;box-sizing:border-box">value</span><span class="m_-2296721205000704307p" style="margin:0px;padding:0px;box-sizing:border-box">(),</span> <span class="m_-2296721205000704307nb" style="margin:0px;padding:0px;box-sizing:border-box;color:rgb(0,112,32)">min</span><span class="m_-2296721205000704307p" style="margin:0px;padding:0px;box-sizing:border-box">(</span><span class="m_-2296721205000704307n" style="margin:0px;padding:0px;box-sizing:border-box">lhs</span><span class="m_-2296721205000704307o" style="margin:0px;padding:0px;box-sizing:border-box;color:rgb(102,102,102)">.</span><span class="m_-2296721205000704307n" style="margin:0px;padding:0px;box-sizing:border-box">value_size</span><span class="m_-2296721205000704307p" style="margin:0px;padding:0px;box-sizing:border-box">(),</span> <span class="m_-2296721205000704307n" style="margin:0px;padding:0px;box-sizing:border-box">rhs</span><span class="m_-2296721205000704307o" style="margin:0px;padding:0px;box-sizing:border-box;color:rgb(102,102,102)">.</span><span class="m_-2296721205000704307n" style="margin:0px;padding:0px;box-sizing:border-box">value_size</span><span class="m_-2296721205000704307p" style="margin:0px;padding:0px;box-sizing:border-box">()));</span>
   <span class="m_-2296721205000704307k" style="margin:0px;padding:0px;box-sizing:border-box;color:rgb(0,112,32);font-weight:bold">if</span> <span class="m_-2296721205000704307p" style="margin:0px;padding:0px;box-sizing:border-box">(</span><span class="m_-2296721205000704307n" style="margin:0px;padding:0px;box-sizing:border-box">result</span> <span class="m_-2296721205000704307o" style="margin:0px;padding:0px;box-sizing:border-box;color:rgb(102,102,102)">==</span> <span class="m_-2296721205000704307mi" style="margin:0px;padding:0px;box-sizing:border-box;color:rgb(32,128,80)">0</span><span class="m_-2296721205000704307p" style="margin:0px;padding:0px;box-sizing:border-box">)</span> <span class="m_-2296721205000704307p" style="margin:0px;padding:0px;box-sizing:border-box">{</span>
     <span class="m_-2296721205000704307n" style="margin:0px;padding:0px;box-sizing:border-box">result</span> <span class="m_-2296721205000704307o" style="margin:0px;padding:0px;box-sizing:border-box;color:rgb(102,102,102)">=</span> <span class="m_-2296721205000704307n" style="margin:0px;padding:0px;box-sizing:border-box">lhs</span><span class="m_-2296721205000704307o" style="margin:0px;padding:0px;box-sizing:border-box;color:rgb(102,102,102)">.</span><span class="m_-2296721205000704307n" style="margin:0px;padding:0px;box-sizing:border-box">value_size</span><span class="m_-2296721205000704307p" style="margin:0px;padding:0px;box-sizing:border-box">()</span> <span class="m_-2296721205000704307o" style="margin:0px;padding:0px;box-sizing:border-box;color:rgb(102,102,102)">-</span> <span class="m_-2296721205000704307n" style="margin:0px;padding:0px;box-sizing:border-box">rhs</span><span class="m_-2296721205000704307o" style="margin:0px;padding:0px;box-sizing:border-box;color:rgb(102,102,102)">.</span><span class="m_-2296721205000704307n" style="margin:0px;padding:0px;box-sizing:border-box">value_size</span><span class="m_-2296721205000704307p" style="margin:0px;padding:0px;box-sizing:border-box">();</span>
   <span class="m_-2296721205000704307p" style="margin:0px;padding:0px;box-sizing:border-box">}</span>
   <span class="m_-2296721205000704307k" style="margin:0px;padding:0px;box-sizing:border-box;color:rgb(0,112,32);font-weight:bold">return</span> <span class="m_-2296721205000704307n" style="margin:0px;padding:0px;box-sizing:border-box">result</span><span class="m_-2296721205000704307p" style="margin:0px;padding:0px;box-sizing:border-box">;</span>
<span class="m_-2296721205000704307p" style="margin:0px;padding:0px;box-sizing:border-box">}</span></pre></div></div></blockquote><div>will produced an incorrect result.</div></div><div><br></div><div>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><br></div></div>
</blockquote></div></div></div>
</div></blockquote></div></div></body></html>