Subject: [TLS] I-D Action: draft-ietf-tls-ctls-00.txt

From: [email-masked]
Date: Sun, 26 Apr 2020 14:10:02 -0700

A New Internet-Draft is available from the on-line Internet-Drafts directories.
This draft is a work item of the Transport Layer Security WG of the IETF.

        Title           : Compact TLS 1.3
        Authors         : Eric Rescorla
                          Richard Barnes
                          Hannes Tschofenig
	Filename        : draft-ietf-tls-ctls-00.txt
	Pages           : 17
	Date            : 2020-04-26

Abstract:
   This document specifies a "compact" version of TLS 1.3.  It is
   isomorphic to TLS 1.3 but saves space by trimming obsolete material,
   tighter encoding, and a template-based specialization technique. cTLS
   is not directly interoperable with TLS 1.3, but it should eventually
   be possible for a cTLS/TLS 1.3 server to exist and successfully
   interoperate.

The IETF datatracker status page for this draft is:
https://datatracker.ietf.org/doc/draft-ietf-tls-ctls/

There are also htmlized versions available at:
https://tools.ietf.org/html/draft-ietf-tls-ctls-00
https://datatracker.ietf.org/doc/html/draft-ietf-tls-ctls-00

Please note that it may take a couple of minutes from the time of submission
until the htmlized version and diff are available at tools.ietf.org.

Internet-Drafts are also available by anonymous FTP at:
ftp://ftp.ietf.org/internet-drafts/

---

From: Ilari Liusvaara <[email-masked]>
Date: Mon, 27 Apr 2020 15:47:46 +0300

> https://datatracker.ietf.org/doc/html/draft-ietf-tls-ctls-00

First impressions:

- I think this protocol should use different label in key derivations
  from the "tls13" label used by TLS 1.3. I do not see any fundamential
  reason why transcripts could not collide with TLS 1.3 ones.

- It seems not be possible for server to support multiple profiles at
  once. This could be useful for things like updating clients to use
  better algorithms.

- It probably makes sense to support the case where client profile has
  incomplete list of certificates. E.g., some IoT client only knows its
  own and server certificates, whereas the server knows all
  certificates.

- If one wanted dual TLS 1.3/cTLS server, one would presumably have to
  define TCP mapping.

  Simplest one that might work: Connection starts with fixed byte
  (which should not be 20-126 to be able to tell the thing apart from
  both TLS 1.x and HTTP), followed by sequence of records, where each
  record is prefixed with varint length. Application data records
  transport application data.

  However, cTLS is not quite "TLS 2.0", as that would presumably move
  some important extensions into top-level messages. Especially stuff
  like supported_groups, key_share and pre_shared_key.

- There is one special case where epoch is not clear: alert mesages in
  response to server handshake. These can be unprotected despite being
  in position where protected record is possible.

  It is possible to tell apart unprotected alerts from everything else
  by size. Unprotected alerts are 2 bytes (if the useless severity field
  is stripped out), and no protected record can be that small.

- Just blindly switching all integers to varints does not work, as there
  are integer fields that can legimately have integer values >=2^22.

  TLS 1.3 spec itself has two of those: PskIdentity.obfuscated_ticket_age
  and NewSessionTicket.ticket_age_add. And with those two, it is not
  even possible to just take modulo 2^22, as the time unit is
  milliseconds, so that would limit the ticket age to just ~70 minutes.

  Some extensions have more integer fields that can be >=2^22, but none
  that I can find where limiting to 2^22-1 would be a significant issue.

- Strict ascending extension sort probably does not work, as extension
  41 is magic due to having to be last in client hello. If there is
  strict extension sort, most straightforward fix would be to make the
  order 0,1,2,3,4,..,39,40,42,43,,..,65534,65535,41.

- Some ways to eke a few more bytes out of profiling:

  * If group is specified, move key share out of extensions.
  * If group is specified to something with fixed length, omit the 
    group length.
  * If using uncompressed P-x keys, strip the 04 prefix (does not work
    with X25519 nor X448, as there is no prefix).
  * If using compressed P-521 keys, stuff the sign bit into unused bit
    of the x coordinate field (does not work with P-256 nor P-384 as
    there are no unused bits in x coordinate field, nor with X25519 nor
    X448 as there is no sign bit).
  * If signature algorith is specified, omit the signature algorithm.
  * If EncryptedExtensions is empty, omit it (can tell if it is there
    from type sequence).
  * Re-encode ECDSA signatures to raw form (can also be done without
    profiling; does not work with Ed25519 nor Ed448 as the signatures
    are already in raw form).
  * If signature algorithm has fixed signature length, omit it in
    signatures (e.g., Ed25519 and raw form ECDSA/P-256 are always
    64 bytes; can also be done without profiling).

- The example in A.1 looks suspect:

  * Why is client_shares.length encoded as 2 bytes? it is vector
    length <128, so should be 1 byte?
  * Why is KeyShareEntry.group encoded as 2 bytes? It is enumeration
    value <128, so should be 1 byte? (Both in Client Hello and Server
    Hello).
  * Why is length of KeyShareEntry.key_exchange encoded as 2 bytes?
    It is vector length <128, so should be 1 byte? (Both in Client
    Hello and Server Hello).
  * Why does the signature start with 4047? The signature should be
    71 bytes, so should be 47? (Both in server and client flights).

- And example in A.2 has this:

  * Server hello has 18 bytes = RANDOM(16) + 2 ... Those 2 are
    presumably  overhead?
  * Client Flight: 1 byte = Overhead(3) ... Should presumably be
    1 byte of overhead.

-Ilari

---

From: Raja Ashok <[email-masked]>
Date: Tue, 28 Apr 2020 22:54:27 +0530

Some suggestion from my side for cTLS

1. Currently supported ciphersuites in cTLS are only 5. In that case I feel
changing 2 byte "CipherSuite" also to "varint" will help to reduce few more
bytes on wire. Similarly for "NamedGroup" and "SignatureScheme".

2. In section 5.1, last sentence in the explanation of "version" should
contain "SeverHello.extensions"

   version (integer):  indicates that both sides agree to the single TLS
      version specified by the given integer value (772 == 0x0304 for
      TLS 1.3).  The supported_versions extension is omitted from
      ClientHello.extensions and reconstructed in the transcript as a
      single-valued list with the specified value.  The
      supported_versions extension is omitted from
      ClientHello.extensions and reconstructed in the transcript with
      the specified value.

Thanks & Regards
Raja Ashok

On Mon, Apr 27, 2020 at 2:41 AM <[email-masked]> wrote:

> _______________________________________________
> TLS mailing list
> [email-masked]
> https://www.ietf.org/mailman/listinfo/tls
>