enum {
	hello_request_RESERVED(0),
	client_hello(1),
	server_hello(2),
	new_session_ticket(4),
	hello_retry_request(6),
	encrypted_extensions(8),
	certificate(11),
	server_key_exchange_RESERVED(12),
	certificate_request(13),
	server_hello_done_RESERVED(14),
	certificate_verify(15),
	client_key_exchange_RESERVED(16),
	finished(20),
	key_update(24),
	(255)
} HandshakeType;

struct {
	HandshakeType msg_type;    
	uint24 length;             
	select (HandshakeType.msg_type) {
		case client_hello:          ClientHello;
		case server_hello:          ServerHello;
		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;
