mirror of
				https://github.com/cuberite/polarssl.git
				synced 2025-10-30 19:20:40 -04:00 
			
		
		
		
	Implement TLS 1.3 key evolution function
Signed-off-by: Hanno Becker <hanno.becker@arm.com>
This commit is contained in:
		
							parent
							
								
									e4849d10a6
								
							
						
					
					
						commit
						e9cccb440c
					
				| @ -285,4 +285,66 @@ int mbedtls_ssl_tls1_3_derive_secret( | |||||||
|                                                   dstbuf, buflen ) ); |                                                   dstbuf, buflen ) ); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | int mbedtls_ssl_tls1_3_evolve_secret( | ||||||
|  |                    mbedtls_md_type_t hash_alg, | ||||||
|  |                    const unsigned char *secret_old, | ||||||
|  |                    const unsigned char *input, size_t input_len, | ||||||
|  |                    unsigned char *secret_new ) | ||||||
|  | { | ||||||
|  |     int ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR; | ||||||
|  |     size_t hlen, ilen; | ||||||
|  |     unsigned char _secret[ MBEDTLS_MD_MAX_SIZE ] = { 0 }; | ||||||
|  |     unsigned char _input [ MBEDTLS_MD_MAX_SIZE ] = { 0 }; | ||||||
|  | 
 | ||||||
|  |     const mbedtls_md_info_t *md; | ||||||
|  |     md = mbedtls_md_info_from_type( hash_alg ); | ||||||
|  |     if( md == NULL ) | ||||||
|  |         return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); | ||||||
|  | 
 | ||||||
|  |     hlen = mbedtls_md_get_size( md ); | ||||||
|  | 
 | ||||||
|  |     /* For non-initial runs, call Derive-Secret( ., "derived", "")
 | ||||||
|  |      * on the old secreet. */ | ||||||
|  |     if( secret_old != NULL ) | ||||||
|  |     { | ||||||
|  |         ret = mbedtls_ssl_tls1_3_derive_secret( | ||||||
|  |                    hash_alg, | ||||||
|  |                    secret_old, hlen, | ||||||
|  |                    MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( derived ), | ||||||
|  |                    NULL, 0, /* context */ | ||||||
|  |                    MBEDTLS_SSL_TLS1_3_CONTEXT_UNHASHED, | ||||||
|  |                    _secret, hlen ); | ||||||
|  |         if( ret != 0 ) | ||||||
|  |             goto cleanup; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if( input != NULL ) | ||||||
|  |     { | ||||||
|  |         memcpy( _input, input, input_len ); | ||||||
|  |         ilen = input_len; | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         ilen = hlen; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /* HKDF-Extract takes a salt and input key material.
 | ||||||
|  |      * The salt is the old secret, and the input key material | ||||||
|  |      * is the input secret (PSK / ECDHE). */ | ||||||
|  |     ret = mbedtls_hkdf_extract( md, | ||||||
|  |                     _secret, hlen, | ||||||
|  |                     _input, ilen, | ||||||
|  |                     secret_new ); | ||||||
|  |     if( ret != 0 ) | ||||||
|  |         goto cleanup; | ||||||
|  | 
 | ||||||
|  |     ret = 0; | ||||||
|  | 
 | ||||||
|  |  cleanup: | ||||||
|  | 
 | ||||||
|  |     mbedtls_platform_zeroize( _secret, sizeof(_secret) ); | ||||||
|  |     mbedtls_platform_zeroize( _input,  sizeof(_input)  ); | ||||||
|  |     return( ret ); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */ | #endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */ | ||||||
|  | |||||||
| @ -182,6 +182,79 @@ int mbedtls_ssl_tls1_3_derive_secret( | |||||||
|                    int context_already_hashed, |                    int context_already_hashed, | ||||||
|                    unsigned char *dstbuf, size_t buflen ); |                    unsigned char *dstbuf, size_t buflen ); | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * \brief Compute the next secret in the TLS 1.3 key schedule | ||||||
|  |  * | ||||||
|  |  * The TLS 1.3 key schedule proceeds as follows to compute | ||||||
|  |  * the three main secrets during the handshake: The early | ||||||
|  |  * secret for early data, the handshake secret for all | ||||||
|  |  * other encrypted handshake messages, and the master | ||||||
|  |  * secret for all application traffic. | ||||||
|  |  * | ||||||
|  |  * <tt> | ||||||
|  |  *                    0 | ||||||
|  |  *                    | | ||||||
|  |  *                    v | ||||||
|  |  *     PSK ->  HKDF-Extract = Early Secret | ||||||
|  |  *                    | | ||||||
|  |  *                    v | ||||||
|  |  *     Derive-Secret( ., "derived", "" ) | ||||||
|  |  *                    | | ||||||
|  |  *                    v | ||||||
|  |  *  (EC)DHE -> HKDF-Extract = Handshake Secret | ||||||
|  |  *                    | | ||||||
|  |  *                    v | ||||||
|  |  *     Derive-Secret( ., "derived", "" ) | ||||||
|  |  *                    | | ||||||
|  |  *                    v | ||||||
|  |  *     0 -> HKDF-Extract = Master Secret | ||||||
|  |  * </tt> | ||||||
|  |  * | ||||||
|  |  * Each of the three secrets in turn is the basis for further | ||||||
|  |  * key derivations, such as the derivation of traffic keys and IVs; | ||||||
|  |  * see e.g. mbedtls_ssl_tls1_3_make_traffic_keys(). | ||||||
|  |  * | ||||||
|  |  * This function implements one step in this evolution of secrets: | ||||||
|  |  * | ||||||
|  |  * <tt> | ||||||
|  |  *                old_secret | ||||||
|  |  *                    | | ||||||
|  |  *                    v | ||||||
|  |  *     Derive-Secret( ., "derived", "" ) | ||||||
|  |  *                    | | ||||||
|  |  *                    v | ||||||
|  |  *     input -> HKDF-Extract = new_secret | ||||||
|  |  * </tt> | ||||||
|  |  * | ||||||
|  |  * \param hash_alg    The identifier for the hash function used for the | ||||||
|  |  *                    applications of HKDF. | ||||||
|  |  * \param secret_old  The address of the buffer holding the old secret | ||||||
|  |  *                    on function entry. If not \c NULL, this must be a | ||||||
|  |  *                    readable buffer whose size matches the output size | ||||||
|  |  *                    of the hash function represented by \p hash_alg. | ||||||
|  |  *                    If \c NULL, an all \c 0 array will be used instead. | ||||||
|  |  * \param input       The address of the buffer holding the additional | ||||||
|  |  *                    input for the key derivation (e.g., the PSK or the | ||||||
|  |  *                    ephemeral (EC)DH secret). If not \c NULL, this must be | ||||||
|  |  *                    a readable buffer whose size \p input_len Bytes. | ||||||
|  |  *                    If \c NULL, an all \c 0 array will be used instead. | ||||||
|  |  * \param input_len   The length of \p input in Bytes. | ||||||
|  |  * \param secret_new  The address of the buffer holding the new secret | ||||||
|  |  *                    on function exit. This must be a writable buffer | ||||||
|  |  *                    whose size matches the output size of the hash | ||||||
|  |  *                    function represented by \p hash_alg. | ||||||
|  |  *                    This may be the same as \p secret_old. | ||||||
|  |  * | ||||||
|  |  * \returns           \c 0 on success. | ||||||
|  |  * \returns           A negative error code on failure. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | int mbedtls_ssl_tls1_3_evolve_secret( | ||||||
|  |                    mbedtls_md_type_t hash_alg, | ||||||
|  |                    const unsigned char *secret_old, | ||||||
|  |                    const unsigned char *input, size_t input_len, | ||||||
|  |                    unsigned char *secret_new ); | ||||||
|  | 
 | ||||||
| #endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */ | #endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */ | ||||||
| 
 | 
 | ||||||
| #endif /* MBEDTLS_SSL_TLS1_3_KEYS_H */ | #endif /* MBEDTLS_SSL_TLS1_3_KEYS_H */ | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Hanno Becker
						Hanno Becker