Ogni messaggio di handshake ha un'intestazione, che contiene il suo tipo (come messaggio di handshake) e la lunghezza. Questa intestazione è in aggiunta all'intestazione del record. Vedi sezione 7.4 per una descrizione dell'intestazione: un byte per il tipo di messaggio e tre byte per il lunghezza del messaggio.
Nel caso del messaggio Finished
, l'intestazione deve essere 14 00 00 0C
(in esadecimale), con 0x14 che significa "Finito" e 00 00 0C
che codifica la lunghezza del contenuto del messaggio (12 byte). Pertanto, ciò che è crittografato con GCM è in realtà 16 byte, non 12. GCM aggiunge il nonce esplicito a 8 byte (che è combinato con il nonce implicito a 4 byte, producendo il nonce a 12 byte che raw GCM ha effettivamente bisogno) e il tag di autenticazione a 16 byte, per un totale complessivo di 40 byte, come si osserva.
Naturalmente, questo record è crittografato, quindi non ne vedi il contenuto; in particolare, Wireshark non mostrerà l'intestazione del messaggio di handshake. Tutto ciò che sa dall'intestazione record è che il record contiene "alcuni dati di handshake".
Per quanto riguarda la tua seconda domanda, è possibile che il client non sia contento dell'handshake e desideri iniziarne uno nuovo, inviando immediatamente un ClientHello
subito dopo Finished
. Due messaggi di handshake possono essere uniti in un singolo record "handshake".