Sorry, I am having a dull moment trying to understand the Transcript-hash, could someone help please?

From *TLS 1.3: section 4* I have:

   enum {
       client_hello(1),
       server_hello(2),
       new_session_ticket(4),
       end_of_early_data(5),
       hello_retry_request(6),
       encrypted_extensions(8),
       certificate(11),
       certificate_request(13),
       certificate_verify(15),
       finished(20),
       key_update(24),
       message_hash(254),
       (255)
   } HandshakeType;

   struct {
       HandshakeType msg_type;    /* handshake type */
       uint24 length;             /* bytes in message */
       select (Handshake.msg_type) {
           case client_hello:          ClientHello;
           case server_hello:          ServerHello;
           case end_of_early_data:     EndOfEarlyData;
           case hello_retry_request:   HelloRetryRequest;
           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;
       } body;
   } Handshake;

and from *TLS 1.3: Section 4.1* I have:

   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;

So combining the two for a ClientHello gives something like

   struct {
        HandshakeType msg_type  = 0x01;         /* handshake type client_hello*/
        uint24 length           = 0x001234;     /* example of number of bytes 
in message */
        struct {
            ProtocolVersion legacy_version = 0x0303;    /* TLS v1.2 */
            Random random;
            ...
        } ClientHello;
    }  ClientHelloHandshake

In trying to understand the transcript hash, I read in *TLS **1.3: section 7*

"Note that because the handshake transcript includes the random values in the Hello messages, any given handshake will have different traffic secrets"

This gives me a warm fuzzy feeling but *TLS 1.3: section 7.1* states

"Messages are the concatenation of the indicated handshake messages, including the handshake message type and length fields, but not including record layer headers."

I am guessing that "handshake message" is the ClientHelloHandshake I created above and the "record layer headers" is the ClientHello,

Does this mean that the transcript-hash just uses the ClientHelloHandshake.msg_type and ClientHelloHandshake.length highlighted below?

   struct {
*HandshakeType msg_type = 0x01; /* handshake type client_hello*/ uint24 length = 0x001234; /* example of number of bytes in message */*
        struct {
            ProtocolVersion legacy_version = 0x0303;    /* TLS v1.2 */
            Random random;
            ...
        } ClientHello;
    }  ClientHelloHandshake

If so, how does ClientHelloHandshake.ClientHello.random get included in the handshake transcript?


_______________________________________________
TLS mailing list
TLS@ietf.org
https://www.ietf.org/mailman/listinfo/tls

Reply via email to