diff --git a/include/mbedtls/ssl_internal.h b/include/mbedtls/ssl_internal.h index 40391d581..fb9a1605e 100644 --- a/include/mbedtls/ssl_internal.h +++ b/include/mbedtls/ssl_internal.h @@ -728,6 +728,12 @@ struct mbedtls_ssl_transform z_stream ctx_deflate; /*!< compression context */ z_stream ctx_inflate; /*!< decompression context */ #endif + +#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION) + /* We need the Hello random bytes in order to re-derive keys from the + * Master Secret and other session info, see ssl_populate_transform() */ + unsigned char randbytes[64]; /*!< ServerHello.random+ClientHello.random */ +#endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */ }; static inline int mbedtls_ssl_transform_get_minor_ver( mbedtls_ssl_transform const *transform ) diff --git a/library/ssl_tls.c b/library/ssl_tls.c index 0b1ebddcf..39522197c 100644 --- a/library/ssl_tls.c +++ b/library/ssl_tls.c @@ -812,7 +812,9 @@ static int ssl_populate_transform( mbedtls_ssl_transform *transform, (void) ssl; #endif - /* Copy info about negotiated version and extensions */ + /* + * Some data just needs copying into the structure + */ #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) && \ defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) transform->encrypt_then_mac = encrypt_then_mac; @@ -824,6 +826,10 @@ static int ssl_populate_transform( mbedtls_ssl_transform *transform, ((void) minor_ver); #endif /* !MBEDTLS_SSL_CONF_FIXED_MINOR_VER */ +#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION) + memcpy( transform->randbytes, randbytes, sizeof( transform->randbytes ) ); +#endif + /* * Get various info structures */