Re: [TLS] Length of a variable-length vector: Could it be an odd multiple?

=JeffH <Jeff.Hodges@KingsMountain.com> Sat, 23 January 2016 00:43 UTC

Return-Path: <Jeff.Hodges@kingsmountain.com>
X-Original-To: tls@ietfa.amsl.com
Delivered-To: tls@ietfa.amsl.com
Received: from localhost (ietfa.amsl.com [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 1270E1B2DFD for <tls@ietfa.amsl.com>; Fri, 22 Jan 2016 16:43:27 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -101.667
X-Spam-Level:
X-Spam-Status: No, score=-101.667 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, IP_NOT_FRIENDLY=0.334, RCVD_IN_DNSWL_NONE=-0.0001, SPF_PASS=-0.001, USER_IN_WHITELIST=-100] autolearn=no
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 5nuNrh4mFrCI for <tls@ietfa.amsl.com>; Fri, 22 Jan 2016 16:43:25 -0800 (PST)
Received: from gproxy9-pub.mail.unifiedlayer.com (gproxy9-pub.mail.unifiedlayer.com [69.89.20.122]) by ietfa.amsl.com (Postfix) with SMTP id 4D2CD1B2E0B for <tls@ietf.org>; Fri, 22 Jan 2016 16:43:25 -0800 (PST)
Received: (qmail 28092 invoked by uid 0); 23 Jan 2016 00:43:21 -0000
Received: from unknown (HELO cmgw4) (10.0.90.85) by gproxy9.mail.unifiedlayer.com with SMTP; 23 Jan 2016 00:43:21 -0000
Received: from box514.bluehost.com ([74.220.219.114]) by cmgw4 with id 9CjH1s0062UhLwi01CjL8X; Fri, 22 Jan 2016 17:43:21 -0700
X-Authority-Analysis: v=2.1 cv=IekUBwaa c=1 sm=1 tr=0 a=9W6Fsu4pMcyimqnCr1W0/w==:117 a=9W6Fsu4pMcyimqnCr1W0/w==:17 a=cNaOj0WVAAAA:8 a=f5113yIGAAAA:8 a=L9H7d07YOLsA:10 a=9cW_t1CCXrUA:10 a=s5jvgZ67dGcA:10 a=ieNpE_y6AAAA:8 a=IkcTkHD0fZMA:10 a=XYUc-DgfXtMA:10 a=-GPFTR9Xtg4A:10 a=7aQ_Q-yQQ-AA:10 a=X7Ea-ya5AAAA:8 a=48vgC7mUAAAA:8 a=IJWUrp6PSUii0mu9BcUA:9 a=qWIPLJvxHmr-F-aF:21 a=-s_J8KhJsfBUT8S0:21 a=QEXdDO2ut3YA:10
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=kingsmountain.com; s=default; h=Content-Transfer-Encoding:Content-Type:MIME-Version:Date:Message-ID:Subject:To:From; bh=v1cAU2AXm+7YIDpjd2gcATRBIykWI8SZgWi9upCj4S0=; b=VPjtv/gcx3nlXFBGRoOBSAvi19rqrSD1GYSne96GJu6j86Z7o9h+A+g3wUB1CyqCzVGoeucTBV7xquVFuh/xNBK8OBdalk0rb8O/+UOLBsRKsHDDZu0N/P3Ut1Wd3ZWM;
Received: from [73.202.80.238] (port=48512 helo=[192.168.11.22]) by box514.bluehost.com with esmtpsa (TLSv1.2:DHE-RSA-AES128-SHA:128) (Exim 4.84) (envelope-from <Jeff.Hodges@KingsMountain.com>) id 1aMmIO-0004rY-Vp for tls@ietf.org; Fri, 22 Jan 2016 17:43:17 -0700
From: =JeffH <Jeff.Hodges@KingsMountain.com>
To: IETF TLS WG <tls@ietf.org>
Message-ID: <56A2CC9F.7070007@KingsMountain.com>
Date: Fri, 22 Jan 2016 16:43:11 -0800
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"; format="flowed"
Content-Transfer-Encoding: 7bit
X-Identified-User: {11025:box514.bluehost.com:kingsmou:kingsmountain.com} {sentby:smtp auth 73.202.80.238 authed with jeff.hodges+kingsmountain.com}
Archived-At: <http://mailarchive.ietf.org/arch/msg/tls/JJbcll6kMVowGQwPv00lj4UM0gE>
Subject: Re: [TLS] Length of a variable-length vector: Could it be an odd multiple?
X-BeenThere: tls@ietf.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: "This is the mailing list for the Transport Layer Security working group of the IETF." <tls.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/tls>, <mailto:tls-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/tls/>
List-Post: <mailto:tls@ietf.org>
List-Help: <mailto:tls-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/tls>, <mailto:tls-request@ietf.org?subject=subscribe>
X-List-Received-Date: Sat, 23 Jan 2016 00:43:27 -0000

ON Fri, 22 Jan 2016 15:53:27 Benjamin Kaduk noted:
 > On 01/22/2016 03:26 PM, =JeffH wrote:
 > > On 01/22/2016 12:29 PM, =JeffH wrote:
 > >> [ fixed pitch font advised here ]
 > >
 > > the below is corrected to use "byte count" rather than "index" or
 > > "indicies" (and to ditch the tabs)..
 > >
 > >
 > > > On 01/22/2016 09:42 AM, =JeffH wrote:
 > > > > [ resending from different account - my work addr ends up in spam
 > > > > bucket for many it seems ]
 > > > >
 > > > > On 1/20/16, 11:01 AM, "Benjamin Kaduk" <bkaduk@akamai.com> wrote:
 > > > > >On 01/20/2016 12:47 PM, Hodges, Jeff wrote:
 > > > > >> On 1/13/16, 12:53 PM, "Benjamin Kaduk" <bkaduk@akamai.com> wrote:
 > > > > >>> On 01/13/2016 02:44 PM, Jong-Shian Wu wrote:
 >>>>>>>> I have a question about the even-vs-odd restrictions on the
 >>>>>>>> length of a valid variable-length vector defined in TLS
 >>>>>>>> specification  after reading the section 4.3 of RFC 5246
 >>>>>>>> [1] which states that: "The length of an encoded vector
 >>>>>>>> must be an even multiple of the length of a single element
 >>>>>>>> (for example, a 17-byte vector of uint16 would be
 >>>>>>>> illegal)."
 >>>>>>>>
 >>>>>>> It means "whole-number" as opposed to fractional, i.e., there
 >>>>>>> should not be unused "junk bytes" at the end.
 >>>>>>
 >>>>>> In case it's helpful, here's a suggested re-write of that
 >>>>>> quoted sentence above..
 > > > > >>
 > > > > >> The length of an encoded variable-length vector must be an
 > > > > >> exact multiple of the length of a single element. For example,
 > > > > >> an encoded 17-byte vector of uint16 would be illegal, and an
 > > > > >> encoded variable-length vector of four 32 byte elements,
 > > > > >> having a ceiling of 2^16-1, will be 130 bytes long overall
 > > > > >> (2 byte length field followed by 128 bytes of data).
 > > > > >
 > > > > >Wouldn't the ceiling more properly be 2^16-4 in that case?
 > > > >
 > > > > hm, I'm not sure -- what would be the rationale? The exact multiple
 > > > > criteria? but 2^16 / 32 = 2048 while (2^16-4) / 32 = 2047.875
 > > >
 > > > Ah, I seem to have conflated bits and bytes due to reading too quickly
 > > > and should have said (2^16-32), as Ilari alluded to with "or rounding
 > > > thereof to integral multiple of
 > > > elements".
 > >
 > > hm, but in this case it seems that a variable-length vector declared
 > > with a length range of <0..2^16-1> would exactly accommodate up to
 > > 2048 32-byte elements..
 > >
 > > opaque Foo[32] ;
 > >
 > > Foo fooSequence<0..2^16-1>; /* will accommodate up to 2048
 > > Foo instances */
 > >
 > > ..because it has a zero-based byte count, as in this example..
 > >
 > >
 > > opaque Array<0..2^2-1> ; /* should accommodate
 > > 2^2 = 4 1-byte elements */
 > >
 > > /*
 > > Array with 4
 > > elements in memory: [ xx xx xx xx ]
 > > byte count (hex): 0 1 2 3 3 = 2^2-1
 > >
 > > byte count (binary): 00 01 10 11
 > >
 > > */
 > >
 > >
 > > ..yes? or am I missing something?
 >
 > You are missing something.
 >
 > The encoded length represents the actual number of bytes that will
 > follow, so that a zero-length array with maximum length 2^16-1 is
 > encoded as just 00 00. So, even though the index into the array starts
 > at zero, the actual length "starts at" 1, just like in C.

Ok, thanks, yes, I was confusing byte count with indices.

To test my understanding:

Given..

    opaque Foo[32] ;

    Foo fooSequence<0..2^16-32> ;


..fooSequence will accommodate up to 2047 Foo instances, and the length 
prefix of fooSequence will itself be two bytes long, yes?


AFAICT, though, from [1] (and prior TLS specs), it seems legit to declare 
fooSequence like so..

  Foo fooSequence<0..2^16-1> ;

..with the expectation that a correct implementation will allow only 2047 
Foo instances to be encoded into a fooSequence on the wire, yes ?


Also, if one actually needs to be able to accommodate up to _2048_ Foo 
instances, and can tolerate having the length prefix be three bytes long, 
then one could declare fooSequence as..

    Foo fooSequence<0..2^16>;

..or..

    Foo fooSequence<0..2^24-1>;

..yes?


thanks again,


=JeffH

[1] https://tools.ietf.org/html/draft-ietf-tls-tls13-11#section-4.3