Internet DRAFT - draft-schaad-ace-tls-cbor-handshake

draft-schaad-ace-tls-cbor-handshake







Network Working Group                                          J. Schaad
Internet-Draft                                             March 5, 2019
Intended status: Experimental
Expires: September 6, 2019


                         TLS Handshake in CBOR
                 draft-schaad-ace-tls-cbor-handshake-00

Abstract

   None

Status of This Memo

   This Internet-Draft is submitted in full conformance with the
   provisions of BCP 78 and BCP 79.

   Internet-Drafts are working documents of the Internet Engineering
   Task Force (IETF).  Note that other groups may also distribute
   working documents as Internet-Drafts.  The list of current Internet-
   Drafts is at https://datatracker.ietf.org/drafts/current/.

   Internet-Drafts are draft documents valid for a maximum of six months
   and may be updated, replaced, or obsoleted by other documents at any
   time.  It is inappropriate to use Internet-Drafts as reference
   material or to cite them other than as "work in progress."

   This Internet-Draft will expire on September 6, 2019.

Copyright Notice

   Copyright (c) 2019 IETF Trust and the persons identified as the
   document authors.  All rights reserved.

   This document is subject to BCP 78 and the IETF Trust's Legal
   Provisions Relating to IETF Documents
   (https://trustee.ietf.org/license-info) in effect on the date of
   publication of this document.  Please review these documents
   carefully, as they describe your rights and restrictions with respect
   to this document.  Code Components extracted from this document must
   include Simplified BSD License text as described in Section 4.e of
   the Trust Legal Provisions and are provided without warranty as
   described in the Simplified BSD License.







Schaad                  Expires September 6, 2019               [Page 1]

Internet-Draft            TLS Handshake in CBOR               March 2019


Table of Contents

   1.  Summary . . . . . . . . . . . . . . . . . . . . . . . . . . .   2
   2.  Handshake Protocol  . . . . . . . . . . . . . . . . . . . . .   4
   3.  Client Hello  . . . . . . . . . . . . . . . . . . . . . . . .   5
   4.  Server Hello  . . . . . . . . . . . . . . . . . . . . . . . .   5
   5.  Extensions  . . . . . . . . . . . . . . . . . . . . . . . . .   6
     5.1.  Supported Versions  . . . . . . . . . . . . . . . . . . .   7
     5.2.  Cookie  . . . . . . . . . . . . . . . . . . . . . . . . .   7
     5.3.  Signature Algorithms  . . . . . . . . . . . . . . . . . .   7
     5.4.  Certificate Authorities . . . . . . . . . . . . . . . . .   9
     5.5.  OID Filters . . . . . . . . . . . . . . . . . . . . . . .   9
     5.6.  Post-Handshake Client Authentication  . . . . . . . . . .   9
     5.7.  Supported Groups  . . . . . . . . . . . . . . . . . . . .   9
     5.8.  Key Share . . . . . . . . . . . . . . . . . . . . . . . .  10
       5.8.1.  ECDHE Parameters  . . . . . . . . . . . . . . . . . .  11
     5.9.  Pre-Shared Key Exchange Modes . . . . . . . . . . . . . .  11
     5.10. Early Data Indication . . . . . . . . . . . . . . . . . .  12
     5.11. Pre-Shared Key Extension  . . . . . . . . . . . . . . . .  12
     5.12. Other Extensions  . . . . . . . . . . . . . . . . . . . .  13
   6.  Server Parameters . . . . . . . . . . . . . . . . . . . . . .  13
     6.1.  Encrypted Extensions  . . . . . . . . . . . . . . . . . .  13
   7.  Certificate Request . . . . . . . . . . . . . . . . . . . . .  14
   8.  Authentication Messages . . . . . . . . . . . . . . . . . . .  14
     8.1.  Certificate . . . . . . . . . . . . . . . . . . . . . . .  14
     8.2.  Certificate Verify  . . . . . . . . . . . . . . . . . . .  15
     8.3.  Finish  . . . . . . . . . . . . . . . . . . . . . . . . .  15
   9.  Record Protocol . . . . . . . . . . . . . . . . . . . . . . .  15
     9.1.  Record Layer  . . . . . . . . . . . . . . . . . . . . . .  15
     9.2.  Record Payload Protection . . . . . . . . . . . . . . . .  16
   10. CBOR Slashed Version  . . . . . . . . . . . . . . . . . . . .  17
   11. Transport with CoAP . . . . . . . . . . . . . . . . . . . . .  17
   12. Informational . . . . . . . . . . . . . . . . . . . . . . . .  18
   Appendix A.  Sample Messages  . . . . . . . . . . . . . . . . . .  18
     A.1.  Standard TLS for X25519 and Ed25519 . . . . . . . . . . .  18
     A.2.  Pre-shared key for authentication w/ ephemeral DH . . . .  20
     A.3.  Stripped TLS w/ Ed25519 . . . . . . . . . . . . . . . . .  22
     A.4.  Stripped TLS w/ PSK . . . . . . . . . . . . . . . . . . .  24
   Appendix B.  Open ideas for ways to make things smaller . . . . .  25
   Appendix C.  EDHOC issues that worry me . . . . . . . . . . . . .  26
   Author's Address  . . . . . . . . . . . . . . . . . . . . . . . .  26

1.  Summary

   There are two measures that can be looked at when measuring how good
   the different options presented below are going to be.





Schaad                  Expires September 6, 2019               [Page 2]

Internet-Draft            TLS Handshake in CBOR               March 2019


   o  Total Number Of Bytes: The total number of bytes that are needed
      to perform the key establishment protocol.

   o  Total Number of Messages: The total number of messages that are
      needed to perform the key establishment protocol.  This measure is
      going to be dependent on which of the transports is being used.
      For UDP the sizes are going to be from 576 to 1152 in the course
      of normal events.  This means that all of the protocols being
      looked at can be run in three messages without any problems.  For
      6LoWPAN L2 however, the packet size is 127 bytes which leads to
      many more messages needed to be used.  One can send approximately
      80 bytes of payload in a single message, but if one is using
      blockwise transfer then the payloads are going to be limited to 64
      bytes.

   Summary of message sizes in bytes.

        +------------+-----+-----+-------+-------+-------+-------+
        |            | TLS | TLS | TLS-C | TLS-C | TLS-S | TLS-S |
        +------------+-----+-----+-------+-------+-------+-------+
        |            | RPK | PSK | RPK   | PSK   | RPK   | PSK   |
        |            |     |     |       |       |       |       |
        | Message #1 | 122 | 164 | 97    | 134   | 47    | 64    |
        |            |     |     |       |       |       |       |
        | Message #2 | 306 | 163 | 262   | 143   | 145   | 66    |
        |            |     |     |       |       |       |       |
        | Message #3 | 205 | 72  | 175   | 54    | 101   | 21    |
        |            |     |     |       |       |       |       |
        | Total      | 633 | 399 | 534   | 331   | 293   | 151   |
        +------------+-----+-----+-------+-------+-------+-------+

   Summary of message sizes in estimated number of messages.

        +------------+-----+-----+-------+-------+-------+-------+
        |            | TLS | TLS | TLS-C | TLS-C | TLS-S | TLS-S |
        +------------+-----+-----+-------+-------+-------+-------+
        |            | RPK | PSK | RPK   | PSK   | RPK   | PSK   |
        |            |     |     |       |       |       |       |
        | Message #1 | 2   | 3   | 2     | 3     | 1     | 1     |
        |            |     |     |       |       |       |       |
        | Message #2 | 5   | 3   | 5     | 3     | 3     | 1     |
        |            |     |     |       |       |       |       |
        | Message #3 | 4   | 1   | 3     | 1     | 2     | 1     |
        |            |     |     |       |       |       |       |
        | Total      | 11  | 7   | 10    | 7     | 6     | 3     |
        +------------+-----+-----+-------+-------+-------+-------+





Schaad                  Expires September 6, 2019               [Page 3]

Internet-Draft            TLS Handshake in CBOR               March 2019


2.  Handshake Protocol

   The TLS Handshake message is:

   struct {
       HandshakeType msg_type;    /* handshake type */
       uint24 length;             /* remaining bytes in message */
       select (Handshake.msg_type) {
           case client_hello:          ClientHello;
           case server_hello:          ServerHello;
           case end_of_early_data:     EndOfEarlyData;
           case encrypted_extensions:  EncryptedExtensions;
           case certificate_request:   CertificateRequest;
           case certificate:           Certificate;
           case certificate_verify:    CertificateVerify;
           case finished:              Finished;
           case new_session_ticket:    NewSessionTicket;
           case key_update:            KeyUpdate;
       };
   } Handshake;

   For the CBOR encoding make the following changes:

   o  Remove the length field: It is expected that this can be passed
      down from the record layer.

   o  Make the message type and field be a map.

   Handshake = handshakeMessage

   handshakeMessage = {
      1 : ClientHello,
      2 : ServerHello,
      3 : EndOfEarlyData,
      4 : EncryptedExtensions,
      5 : CertificateRequest,
      6 : Certificate,
      7 : CertificateVerify,
      8 : Finished,
      9 : NewSessionTicket,
      10 : KeyUpdate
   }

   Expected space savings:

   o  3 bytes for the length





Schaad                  Expires September 6, 2019               [Page 4]

Internet-Draft            TLS Handshake in CBOR               March 2019


3.  Client Hello

   The TLS Client Hello structure is:

   uint16 ProtocolVersion;
   opaque Random[32];

   uint8 CipherSuite[2];    /* Cryptographic suite selector */

   struct {
       ProtocolVersion legacy_version = 0x0303;    /* TLS v1.2 */
       Random random;
       opaque legacy_session_id<0..32>;
       CipherSuite cipher_suites<2..2^16-2>;
       opaque legacy_compression_methods<1..2^8-1>;
       Extension extensions<8..2^16-1>;
   } ClientHello;

   For the CBOR encoding make the following changes:

   o  Remove all of the legacy items - reduction of 5 bytes + lengths?.

   ClientHello = [
       random : bstr .len 32,
       cipher_suites : [+ int . len 1], // max 2^8-1
       extensions : [ + Extension ]
   ]

4.  Server Hello

   The TLS Server Hello structure is:

   struct {
       ProtocolVersion legacy_version = 0x0303;    /* TLS v1.2 */
       Random random;
       opaque legacy_session_id_echo<0..32>;
       CipherSuite cipher_suite;
       uint8 legacy_compression_method = 0;
       Extension extensions<6..2^16-1>;
   } ServerHello;

   For the CBOR encoding make the following changes:

   o  Remove all of the legacy fields.







Schaad                  Expires September 6, 2019               [Page 5]

Internet-Draft            TLS Handshake in CBOR               March 2019


   ServerHello = [
      random : bstr .len 32
      cipher_suite : int,
      extensions : [ + Extension ]
   ]

5.  Extensions

   The TLS Extenions field is:

   struct {
        ExtensionType extension_type;
        opaque extension_data<0..2^16-1>;
    } Extension;

    enum {
        server_name(0),                             /* RFC 6066 */
        max_fragment_length(1),                     /* RFC 6066 */
        status_request(5),                          /* RFC 6066 */
        supported_groups(10),                       /* RFC 8422, 7919 */
        signature_algorithms(13),                   /* RFC 8446 */
        use_srtp(14),                               /* RFC 5764 */
        heartbeat(15),                              /* RFC 6520 */
        application_layer_protocol_negotiation(16), /* RFC 7301 */
        signed_certificate_timestamp(18),           /* RFC 6962 */
        client_certificate_type(19),                /* RFC 7250 */
        server_certificate_type(20),                /* RFC 7250 */
        padding(21),                                /* RFC 7685 */
        pre_shared_key(41),                         /* RFC 8446 */
        early_data(42),                             /* RFC 8446 */
        supported_versions(43),                     /* RFC 8446 */
        cookie(44),                                 /* RFC 8446 */
        psk_key_exchange_modes(45),                 /* RFC 8446 */
        certificate_authorities(47),                /* RFC 8446 */
        oid_filters(48),                            /* RFC 8446 */
        post_handshake_auth(49),                    /* RFC 8446 */
        signature_algorithms_cert(50),              /* RFC 8446 */
        key_share(51),                              /* RFC 8446 */
        (65535)
    } ExtensionType;

   For the CBOR encoding make the following changes:

   o  Remove items we don't care about

   o  Encode as a map.





Schaad                  Expires September 6, 2019               [Page 6]

Internet-Draft            TLS Handshake in CBOR               March 2019


   ExtensionType = (
   //  0 : ServerName,
   //  1 : max_fragment_length,
   //  5 : status_request,
     10 : supported_groups,
     13 : signature_algorithms,
   //  14 : use_srtp,
   //  15 : heartbeat,
   //  16 : application_layer_protocol_negoiation,
   //  18 : signed_certificate_timestamp,
   //  19 : client_certificate_type,
   //  20 : server_certificate_type,
   //  21 : padding,
     41 : pre_shared_key,
   //  42 : early_data,
   //  43 : supported_versions,
   //  44 : cookie,
     45 : psk_key_exchange_modes,
   //  47 : certificate_authorities,
   //  48 : oid_filters,
   //  49 : post_handshake_auth,
   //  50 : signature_algoirthms_cert,
     51 : key_share
   )

   Extension = ( int, any )

5.1.  Supported Versions

   Not currently used as we only have one version.  If absent it will be
   assumed to be this version.

5.2.  Cookie

   There is no reason for this extension to be used in CoRE.  For the
   same functionality use [I-D.ietf-core-echo-request-tag].

5.3.  Signature Algorithms

   The TLS signature algorithm structures are:











Schaad                  Expires September 6, 2019               [Page 7]

Internet-Draft            TLS Handshake in CBOR               March 2019


   enum {
       /* RSASSA-PKCS1-v1_5 algorithms */
       rsa_pkcs1_sha256(0x0401),
       rsa_pkcs1_sha384(0x0501),
       rsa_pkcs1_sha512(0x0601),

       /* ECDSA algorithms */
       ecdsa_secp256r1_sha256(0x0403),
       ecdsa_secp384r1_sha384(0x0503),
       ecdsa_secp521r1_sha512(0x0603),

       /* RSASSA-PSS algorithms with public key OID rsaEncryption */
       rsa_pss_rsae_sha256(0x0804),
       rsa_pss_rsae_sha384(0x0805),
       rsa_pss_rsae_sha512(0x0806),

       /* EdDSA algorithms */
       ed25519(0x0807),
       ed448(0x0808),

       /* RSASSA-PSS algorithms with public key OID RSASSA-PSS */
       rsa_pss_pss_sha256(0x0809),
       rsa_pss_pss_sha384(0x080a),
       rsa_pss_pss_sha512(0x080b),

       /* Legacy algorithms */
       rsa_pkcs1_sha1(0x0201),
       ecdsa_sha1(0x0203),

       /* Reserved Code Points */
       private_use(0xFE00..0xFFFF),
       (0xFFFF)
   } SignatureScheme;

   struct {
       SignatureScheme supported_signature_algorithms<2..2^16-2>;
   } SignatureSchemeList;

   One of the differences that may need to be dealt with at this point
   is the question of keeping the same enumeration as TLS uses or if the
   enumeration should be changed.  For this document the same
   enumeration is being kept.  TLS uses the current two byte format
   because it separates the hash algorithm from the public key
   algorithms.  For a single algorithm this ends up being 3 bytes for
   CBOR and 4 bytes for TLS.  Each additional algorithm adds 2 bytes
   until you get to 12 algorithms.  If one switched to using integer
   values from the COSE tables, then one ends up with the same byte
   count.



Schaad                  Expires September 6, 2019               [Page 8]

Internet-Draft            TLS Handshake in CBOR               March 2019


   For the CBOR encoding make the following changes:

   o  None

             signature_algorithms = bstr

5.4.  Certificate Authorities

   Not used.

5.5.  OID Filters

   Not used.

5.6.  Post-Handshake Client Authentication

   Not used.

5.7.  Supported Groups

   The TLS structure is:

   enum {

       /* Elliptic Curve Groups (ECDHE) */
       secp256r1(0x0017), secp384r1(0x0018), secp521r1(0x0019),
       x25519(0x001D), x448(0x001E),

       /* Finite Field Groups (DHE) */
       ffdhe2048(0x0100), ffdhe3072(0x0101), ffdhe4096(0x0102),
       ffdhe6144(0x0103), ffdhe8192(0x0104),

       /* Reserved Code Points */
       ffdhe_private_use(0x01FC..0x01FF),
       ecdhe_private_use(0xFE00..0xFEFF),
       (0xFFFF)
   } NamedGroup;

   struct {
       NamedGroup named_group_list<2..2^16-1>;
   } NamedGroupList;

   It makes more sense to change the enumeration from that used by TLS
   to the COSE EC curve registry as those values are only single byte
   values and are small.  One implication is that all of the Finite
   Field Groups are dropped, but this should not be a problem.  This
   means a 2 byte value for a single curve in the CBOR version rather




Schaad                  Expires September 6, 2019               [Page 9]

Internet-Draft            TLS Handshake in CBOR               March 2019


   than a 4 byte encoding for TLS.  Adding a second curve adds one byte
   for CBOR and 2 bytes for TLS.

   For the CBOR encoding make the following changes:

   o  Change from a two byte enumeration to the the integer values from
      the COSE EC curve registry.

   NamedGroup = {
       secp256r1: 1, secp384r1: 2, secp521r1: 3,
       x25519: 4, x448:5
   }

   supported_groups = [ + NamedGroup ]

5.8.  Key Share

   The TLS structure for key share is:

   struct {
       NamedGroup group;
       opaque key_exchange<1..2^16-1>;
   } KeyShareEntry;

   struct {
       KeyShareEntry client_shares<0..2^16-1>;
   } KeyShareClientHello;

   struct {
       NamedGroup selected_group;
   } KeyShareHelloRetryRequest;

   struct {
      KeyShareEntry server_share;
   } KeyShareServerHello;

   For the CBOR encoding make the following changes:














Schaad                  Expires September 6, 2019              [Page 10]

Internet-Draft            TLS Handshake in CBOR               March 2019


   keyShareEntry = {
       secp256r1 : CompressedPointRepresentation,
       secp384r1 : CompressedPointRepresentation,
       secp521r1 : CompressedPointRepresentation,
       x25519 : bstr,
       x448 : bstr,
       * NamedGroup : any
   }

   key_share = KeyShare_ClientHello | KeyShare_HelloRetryRequest |
           KeyShare_ServerHello

   KeyShare_ClientHello = [ *keyShareEntry]
   KeyShare_HelloRetryRequest = NamedGroup
   KeyShare_ServerHello = keyShareEntry


5.8.1.  ECDHE Parameters

   The TLS structure is:

   struct {
       uint8 legacy_form = 4;
       opaque X[coordinate_length];
       opaque Y[coordinate_length];
   } UncompressedPointRepresentation;

   For the CBOR encoding make the following changes:

   o  Switched to compressed points for space savings.

   CompressedPointReprentation = [
       x : bstr,
       y : bool
   ]

5.9.  Pre-Shared Key Exchange Modes

   The TLS structure is:

   enum { psk_ke(0), psk_dhe_ke(1), (255) } PskKeyExchangeMode;

   struct {
       PskKeyExchangeMode ke_modes<1..255>;
   } PskKeyExchangeModes;

   Changes for CBOR:




Schaad                  Expires September 6, 2019              [Page 11]

Internet-Draft            TLS Handshake in CBOR               March 2019


   pskKeyExchangeMode = ( psk_key: 0, psk_dhe_ke:1 }

   psk_key_exchange_modes = [ + pskKeyExchangeMode]

5.10.  Early Data Indication

   Not used.

5.11.  Pre-Shared Key Extension

   The TLS structure is:

   struct {
       opaque identity<1..2^16-1>;
       uint32 obfuscated_ticket_age;
   } PskIdentity;

   opaque PskBinderEntry<32..255>;

   struct {
       PskIdentity identities<7..2^16-1>;
       PskBinderEntry binders<33..2^16-1>;
   } OfferedPsks;

   struct {
       select (Handshake.msg_type) {
           case client_hello: OfferedPsks;
           case server_hello: uint16 selected_identity;
       };
   } PreSharedKeyExtension;

   The changes for CBOR are:

   pre_shared_key = clientHello_PSK | serverHello_PSK

   clientHello_PSK = OfferedPsks

   serverHello_PSK = int

   OfferedPsks = [
      identities : [ +PskIdentity ],
      binders : bstr
   ]

   PskIdentity = (
       identity : bstr,
       ? obfuscated_ticket_age : int
   )



Schaad                  Expires September 6, 2019              [Page 12]

Internet-Draft            TLS Handshake in CBOR               March 2019


5.12.  Other Extensions

   TLS

     struct {
       select(ClientOrServerExtension) {
           case client:
               CertificateType client_certificate_types<1..2^8-1>;
           case server:
               CertificateType client_certificate_type;
      }
   } ClientCertTypeExtension;

   struct {
       select(ClientOrServerExtension) {
           case client:
               CertificateType server_certificate_types<1..2^8-1>;
           case server:
               CertificateType server_certificate_type;
       }
   } ServerCertTypeExtension;

   CBOR

   clientCertType = certTypeRequest | certTypeResponse
   serverCertType = certTypeRequest | certTypeResponse

   certTypeRequest = [+ cerType]
   certTypeResponse = certType

   certType = (x509:0, rawPublicKey:1 }


6.  Server Parameters

6.1.  Encrypted Extensions

   The TLS structure is:

   struct {
       Extension extensions<0..2^16-1>;
   } EncryptedExtensions;

   For CBOR:

   EncryptedExtensions = [ * Extension ]





Schaad                  Expires September 6, 2019              [Page 13]

Internet-Draft            TLS Handshake in CBOR               March 2019


7.  Certificate Request

   Not Used

8.  Authentication Messages

8.1.  Certificate

   TLS

   enum {
       X509(0),
       RawPublicKey(2),
       (255)
   } CertificateType;

   struct {
       select (certificate_type) {
           case RawPublicKey:
             /* From RFC 7250 ASN.1_subjectPublicKeyInfo */
             opaque ASN1_subjectPublicKeyInfo<1..2^24-1>;

           case X509:
             opaque cert_data<1..2^24-1>;
       };
       Extension extensions<0..2^16-1>;
   } CertificateEntry;

   struct {
       opaque certificate_request_context<0..2^8-1>;
       CertificateEntry certificate_list<0..2^24-1>;
   } Certificate;

   certificate = [
       ? certificate_request_context : bstr,
       certificate_list : [* CertificateEntry]
   ]

   CertificateEntry = [
       certificate : {
           0 : bstr, // cert_data,
           1 : bstr  // ASN1_subjectPublicKeyInfo
       },
       extensions : [* Extension]
   ]






Schaad                  Expires September 6, 2019              [Page 14]

Internet-Draft            TLS Handshake in CBOR               March 2019


8.2.  Certificate Verify

   TLS

   struct {
       SignatureScheme algorithm;
       opaque signature<0..2^16-1>;
   } CertificateVerify;

   CBOR

   CertificateVerify = [
       algorithm : SignatureScheme,
       signature : bstr
   ]

8.3.  Finish

   TLS

   struct {
       opaque verify_data[Hash.length];
   } Finished;

   CBOR

   Finished = bstr

9.  Record Protocol

9.1.  Record Layer

   TLS


















Schaad                  Expires September 6, 2019              [Page 15]

Internet-Draft            TLS Handshake in CBOR               March 2019


   enum {
       invalid(0),
       change_cipher_spec(20),
       alert(21),
       handshake(22),
       application_data(23),
       (255)
   } ContentType;

   struct {
       ContentType type;
       ProtocolVersion legacy_record_version;
       uint16 length;
       opaque fragment[TLSPlaintext.length];
   } TLSPlaintext;

   CBOR

   contentType = (
       invalid: 0, change_cipher_spec: 20, alert:21, handshake:22,
       application_data:23
   )

   TLSPlaintext = (
       type : contentType,
       fragment : bstr
   )

9.2.  Record Payload Protection

   TLS

   struct {
       opaque content[TLSPlaintext.length];
       ContentType type;
       uint8 zeros[length_of_padding];
   } TLSInnerPlaintext;

   struct {
       ContentType opaque_type = application_data; /* 23 */
       ProtocolVersion legacy_record_version = 0x0303; /* TLS v1.2 */
       uint16 length;
       opaque encrypted_record[TLSCiphertext.length];
   } TLSCiphertext;

   CBOR





Schaad                  Expires September 6, 2019              [Page 16]

Internet-Draft            TLS Handshake in CBOR               March 2019


   TLSCiphertext = (
       type : application_data,
       encrypted_record : bstr
   )

10.  CBOR Slashed Version

   There are many things that the EDHOC system did that slashed down
   size that has not been done for the previous version of TLS.  If
   these changes are made then a non-trivial amount of savings can be
   done that might or might not be considered acceptable in this
   situation.

   For the puspose of making things even small we are making the
   following assumptions:

   o  Remove the random number strings from the system.  Since we are
      always going to do new ephemeral keys on both sides when the
      protocol is done, then the random numbers are not needed.  If new
      ephemeral keys are not done on both sides, then the perfect
      forward secrecy requirement is not met.

   o  Trucate all HMAC values to 64-bits.

   o  If the encrypted extensions handshake message is empty, then omit
      it.

   o  In cases where a single value can be in an array, change the
      syntax to be either the single value or an array of values.

   o  Change the behavior of some of the extensions by adding additional
      operations and changing defaults.

      *  Change the default value for client and server certificate type
         from "certificate" to "RPK" and "reference".

      *  Change the behavior of the curves extension so that if it is
         omitted, then the cruve offered in the key share is assumed to
         be the only one supported by the client.

11.  Transport with CoAP

   Transporting the messages w/ CoAP is fairly simple:

   1.  Message #1 is a POST to a fixed location.

   2.  Message #2 is the response to the POST.  The message returns
       either Created (2.01) or a TLS Alert message with Bad Request



Schaad                  Expires September 6, 2019              [Page 17]

Internet-Draft            TLS Handshake in CBOR               March 2019


       (4.00).  If the message is successful, then a Location-Path will
       be returned as part of the message.

   3.  Message #3 is a PUT to the returned location path from the above
       response.

   4.  Message #4 is either a TLS Alert message with Bad Request (4.00)
       or an empty Changed (2.04) message.  At this point the location
       path is deleted on the server.

12.  Informational

   [I-D.ietf-core-echo-request-tag]
              Amsuess, C., Mattsson, J., and G. Selander, "Echo and
              Request-Tag", draft-ietf-core-echo-request-tag-03 (work in
              progress), October 2018.

Appendix A.  Sample Messages

A.1.  Standard TLS for X25519 and Ed25519

   The size of messge #1 is 97 bytes

   22,
   << 1,
      [
      h'0011223344556677889900112233445566778899001122334455
      667788990011',  / random /
         [ h'1304' / TLS_AES_128_CCM_SHA256 ], / cipher suites /
         [ 51, [ 4 / x25519 /, h'00112233445566778899001122334455
         66778899001122334455667788990011' ],
           13, [ h'0807' / Ed2215 / ],  / signature algorithms /
           10, [ 4 / secp256r1 / ],
           19, [ 1 ] / client_cert_type /,
           20, [ 1 ] / server_cert_type /,
         ]
      ]
   >>


                                Message #1

   The size of message #2 is 262 bytes.  If you directly encode what is
   below it will be 16 bytes short as there is no provision in the CDDL
   for the 16 bytes of the MAC appended to the end of the encrypted
   data.





Schaad                  Expires September 6, 2019              [Page 18]

Internet-Draft            TLS Handshake in CBOR               March 2019


   22,
   <<
      2,
      [
      h'00112233445566778899001122334455667788990011223344
      55667788990011',  / random /
         h'1304', / cipher suite /
         [
         51, [ 4 / x25519 /,  h'001122334455667788990011223344
         5566778899001122334455667788990011' ] / key share /
         ]
      ]
   >>,

   23,
   <<
      4,
      [ 19, 1, / client_cert_type /
        20, 1  / server_cert_type /
      ],
      11,
      [
         [ 1 / rpk /,
         h'1122334455667788990011223344556677889900112233445566
         778899001122334455667788990011223344'
         ]
      ],
      12,
      [
         h'0807',
         h'1122334455667788990011223344556677889900112233445566
         778899001122334455667788990011223344556677889900112233
         4455667788990011223344'
      ],
      13,
      h'1122334455667788990011223344556677889900112233445566
      778899001122'
   >>

                                Message #2

   Size of message #3 is 175 bytes









Schaad                  Expires September 6, 2019              [Page 19]

Internet-Draft            TLS Handshake in CBOR               March 2019


   23,
   <<
      11,
      [
         [ 1 / rpk /,
         h'11223344556677889900112233445566778899001122334455
         66778899001122334455667788990011223344'
         ]
      ],
      12,
      [
         h'0807',
         h'112233445566778899001122334455667788990011223344
         55667788990011223344556677889900112233445566778899
         001122334455667788990011223344'
      ],
      13,
      h'1122334455667788990011223344556677889900112233445566
      778899001122'
   >>

                                Message #3

A.2.  Pre-shared key for authentication w/ ephemeral DH

   The size of messge #1 is 97 bytes

   22,
   << 1,
      [
      h'001122334455667788990011223344556677889
      9001122334455667788990011',  / random /
         [ h'1304' / TLS_AES_128_CCM_SHA256 ], / cipher suites /
         [ 51, [ 4 / x25519 /, h'0011223344556677889900112233445
         566778899001122334455667788990011' ],
           13, [ h'0807' / Ed2215 / ],  / signature algorithms /
           10, [ 4 / secp256r1 / ],
           19, [ 1 ] / client_cert_type /,
           20, [ 1 ] / server_cert_type /,
         ]
      ]
   >>


                                Message #1

   The size of message #2 is 262 bytes.  If you directly encode what is
   below it will be 16 bytes short as there is no provision in the CDDL



Schaad                  Expires September 6, 2019              [Page 20]

Internet-Draft            TLS Handshake in CBOR               March 2019


   for the 16 bytes of the MAC appended to the end of the encrypted
   data.

   22,
   <<
      2,
      [
      h'001122334455667788990011223344556677889900112233445
      5667788990011',  / random /
         h'1304', / cipher suite /
         [
         51, [ 4 / x25519 /,  h'00112233445566778899001122
         33445566778899001122334455667788990011' ] / key share /
         ]
      ]
   >>,

   23,
   <<
      4,
      [ 19, 1, / client_cert_type /
        20, 1  / server_cert_type /
      ],
      11,
      [
         [ 1 / rpk /,
         h'1122334455667788990011223344556677889900112233445566
         778899001122334455667788990011223344'
         ]
      ],
      12,
      [
         h'0807',
         h'1122334455667788990011223344556677889900112233445566
         7788990011223344556677889900112233445566778899001122
         334455667788990011223344'
      ],
      13,
      h'112233445566778899001122334455667788990011223344556677
        8899001122'
   >>

                                Message #2

   Size of message #3 is 175 bytes






Schaad                  Expires September 6, 2019              [Page 21]

Internet-Draft            TLS Handshake in CBOR               March 2019


   23,
   <<
      11,
      [
         [ 1 / rpk /,
           h'11223344556677889900112233445566778899001122334455
             66778899001122334455667788990011223344'
         ]
      ],
      12,
      [
         h'0807',
         h'1122334455667788990011223344556677889900112233445566
          77889900112233445566778899001122334455667788990011223
          34455667788990011223344'
      ],
      13,
      h'1122334455667788990011223344556677889900112233445566778
        899001122'
   >>

                                Message #3

A.3.  Stripped TLS w/ Ed25519

   The size of messge #1 is 47 bytes

   22,
   << 1,
      [
         1 / TLS_AES_128_CCM_SHA256_64 /,     / cipher suites /
         [ 1, [ 4 / x25519 /, h'00112233445566778899001122334455
                                66778899001122334455667788990011' ],
           2, 99 / Ed2215 /                   / signature algorithms /
         ]
      ]
   >>


                                Message #1

   The size of message #2 is 146 bytes.  The encryption authentication
   code is added as a separate at the end of the encrypted handshake
   block.







Schaad                  Expires September 6, 2019              [Page 22]

Internet-Draft            TLS Handshake in CBOR               March 2019


   22,
   <<
      2,
      [
         1 / TLS_AES_128_CCM_SHA256_64 /,           / cipher suite /
         [
         1, [ 4 / x25519 /,  h'001122334455667788990011223344
               5566778899001122334455667788990011' ] / key share /
         ]
      ]
   >>,

   23,
   <<
      11,
      [
         [ 9 / reference /,
           h'1122334455'
         ]  / certificate /
      ],
      12,
      [
         99,
         h'11223344556677889900112233445566778899001122
         3344556677889900112233445566778899001122334455
         66778899001122334455667788990011223344'
         / signature /
      ], / certificate verify /
      13,
      h'1122334455667788', / finish /
      h'11223344556677'  / encryption authentication code /
   >>

                                Message #2

   Size of message #3 is 102 bytes















Schaad                  Expires September 6, 2019              [Page 23]

Internet-Draft            TLS Handshake in CBOR               March 2019


   23,
   <<
      11,
      [
         [ 9 / reference /,
           h'1122334455'
         ]
      ],  / certificate /
      12,
      [
         99,
         h'11223344556677889900112233445566778899001122
           33445566778899001122334455667788990011223344
           5566778899001122334455667788990011223344'
      ], / certificate verify /
      13,
      h'1122334455667788', / finish /
      h'1122334455667788'  / encryption authentication code /
   >>

                                Message #3

A.4.  Stripped TLS w/ PSK

   The size of messge #1 is 65 bytes

   22,
   << 1,
      [
         1,                  / cipher suites /
         [ 1, [ 4 / x25519 /, h'001122334455667788990011
                       2233445566778899001122334455667788990011' ],
           2, 99,         / signature algorithms /
           6, [ h'0102030405', h'0102030405060708' ]
         ]
      ]
   >>


                                Message #1

   The size of message #2 is 59 bytes.  If you directly encode what is
   below it will be 16 bytes short as there is no provision in the CDDL
   for the 16 bytes of the MAC appended to the end of the encrypted
   data.






Schaad                  Expires September 6, 2019              [Page 24]

Internet-Draft            TLS Handshake in CBOR               March 2019


   22,
   <<
      2,
      [
         1, / cipher suite /
         [
           1, [ 4 / x25519 /,  h'0011223344556677889900112233445
                566778899001122334455667788990011' ], / key share /
           6, 1
         ]
     ]
   >>,

   23,
   <<
      13,
      h'1122334455667788'
   >>

                                Message #2

   Size of message #3 is 12 bytes

   23,
   <<
      13,
      h'1122334455667788'
   >>

                                Message #3

Appendix B.  Open ideas for ways to make things smaller

   The following things can still be considered for shrinking things:

   o  Make the random values optional.  This would kill 66 bytes from
      the first and second messages.

   o  Think of a way to shorten the SKI encoding of the raw public key.

   o  Decode to re-encode the signature and cipher suite numbers

   o  Change some of the default values.  For example we could change to
      RPK being the default certificate type.

   o  Create a HMAC cipher suite which truncates the output for doing
      finish messages.  This is not unusual for the world of IoT and




Schaad                  Expires September 6, 2019              [Page 25]

Internet-Draft            TLS Handshake in CBOR               March 2019


      thus should be considered.  Halving the length of this saves 17
      bytes in message 2 and 3.

Appendix C.  EDHOC issues that worry me

   I still need to actually read the current document.  From a quick
   glance through I have the following issues:

   o  It is limited to four cipher suites of which only two are globally
      defined.

   o  Need to validate that P-256 can do key agreement correctly with
      only an X coordinate.

Author's Address

   Jim Schaad

   Email: ietf@augustcellars.com
































Schaad                  Expires September 6, 2019              [Page 26]