Remove key length field from ssl_transform

The `ssl_transform` security parameter structure contains opaque
cipher contexts for use by the record encryption/decryption functions
`ssl_decrypt_buf`/`ssl_encrypt_buf`, while the underlying key material
is configured once in `ssl_derive_keys` and is not explicitly dealt with
anymore afterwards. In particular, the key length is not needed
explicitly by the encryption/decryption functions but is nonetheless
stored in an explicit yet superfluous `keylen` field in `ssl_transform`.
This commit removes this field.
This commit is contained in:
Hanno Becker 2017-12-27 08:17:40 +00:00 committed by Manuel Pégourié-Gonnard
parent 7326bc8577
commit e7f2df03a3
2 changed files with 15 additions and 13 deletions

View file

@ -432,7 +432,6 @@ struct mbedtls_ssl_transform
*/ */
const mbedtls_ssl_ciphersuite_t *ciphersuite_info; const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
/*!< Chosen cipersuite_info */ /*!< Chosen cipersuite_info */
unsigned int keylen; /*!< symmetric key length (bytes) */
size_t minlen; /*!< min. ciphertext length */ size_t minlen; /*!< min. ciphertext length */
size_t ivlen; /*!< IV length */ size_t ivlen; /*!< IV length */
size_t fixed_ivlen; /*!< Fixed part of IV (AEAD) */ size_t fixed_ivlen; /*!< Fixed part of IV (AEAD) */

View file

@ -618,6 +618,7 @@ int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl )
unsigned char *mac_dec; unsigned char *mac_dec;
size_t mac_key_len; size_t mac_key_len;
size_t iv_copy_len; size_t iv_copy_len;
unsigned keylen;
const mbedtls_cipher_info_t *cipher_info; const mbedtls_cipher_info_t *cipher_info;
const mbedtls_md_info_t *md_info; const mbedtls_md_info_t *md_info;
@ -804,7 +805,7 @@ int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl )
* Determine the appropriate key, IV and MAC length. * Determine the appropriate key, IV and MAC length.
*/ */
transform->keylen = cipher_info->key_bitlen / 8; keylen = cipher_info->key_bitlen / 8;
if( cipher_info->mode == MBEDTLS_MODE_GCM || if( cipher_info->mode == MBEDTLS_MODE_GCM ||
cipher_info->mode == MBEDTLS_MODE_CCM || cipher_info->mode == MBEDTLS_MODE_CCM ||
@ -916,9 +917,11 @@ int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl )
} }
} }
MBEDTLS_SSL_DEBUG_MSG( 3, ( "keylen: %d, minlen: %d, ivlen: %d, maclen: %d", MBEDTLS_SSL_DEBUG_MSG( 3, ( "keylen: %u, minlen: %u, ivlen: %u, maclen: %u",
transform->keylen, transform->minlen, transform->ivlen, (unsigned) keylen,
transform->maclen ) ); (unsigned) transform->minlen,
(unsigned) transform->ivlen,
(unsigned) transform->maclen ) );
/* /*
* Finally setup the cipher contexts, IVs and MAC secrets. * Finally setup the cipher contexts, IVs and MAC secrets.
@ -927,7 +930,7 @@ int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl )
if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
{ {
key1 = keyblk + mac_key_len * 2; key1 = keyblk + mac_key_len * 2;
key2 = keyblk + mac_key_len * 2 + transform->keylen; key2 = keyblk + mac_key_len * 2 + keylen;
mac_enc = keyblk; mac_enc = keyblk;
mac_dec = keyblk + mac_key_len; mac_dec = keyblk + mac_key_len;
@ -937,8 +940,8 @@ int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl )
*/ */
iv_copy_len = ( transform->fixed_ivlen ) ? iv_copy_len = ( transform->fixed_ivlen ) ?
transform->fixed_ivlen : transform->ivlen; transform->fixed_ivlen : transform->ivlen;
memcpy( transform->iv_enc, key2 + transform->keylen, iv_copy_len ); memcpy( transform->iv_enc, key2 + keylen, iv_copy_len );
memcpy( transform->iv_dec, key2 + transform->keylen + iv_copy_len, memcpy( transform->iv_dec, key2 + keylen + iv_copy_len,
iv_copy_len ); iv_copy_len );
} }
else else
@ -946,7 +949,7 @@ int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl )
#if defined(MBEDTLS_SSL_SRV_C) #if defined(MBEDTLS_SSL_SRV_C)
if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
{ {
key1 = keyblk + mac_key_len * 2 + transform->keylen; key1 = keyblk + mac_key_len * 2 + keylen;
key2 = keyblk + mac_key_len * 2; key2 = keyblk + mac_key_len * 2;
mac_enc = keyblk + mac_key_len; mac_enc = keyblk + mac_key_len;
@ -957,8 +960,8 @@ int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl )
*/ */
iv_copy_len = ( transform->fixed_ivlen ) ? iv_copy_len = ( transform->fixed_ivlen ) ?
transform->fixed_ivlen : transform->ivlen; transform->fixed_ivlen : transform->ivlen;
memcpy( transform->iv_dec, key1 + transform->keylen, iv_copy_len ); memcpy( transform->iv_dec, key1 + keylen, iv_copy_len );
memcpy( transform->iv_enc, key1 + transform->keylen + iv_copy_len, memcpy( transform->iv_enc, key1 + keylen + iv_copy_len,
iv_copy_len ); iv_copy_len );
} }
else else
@ -1008,7 +1011,7 @@ int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl )
MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_init()" ) ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_init()" ) );
if( ( ret = mbedtls_ssl_hw_record_init( ssl, key1, key2, transform->keylen, if( ( ret = mbedtls_ssl_hw_record_init( ssl, key1, key2, keylen,
transform->iv_enc, transform->iv_dec, transform->iv_enc, transform->iv_dec,
iv_copy_len, iv_copy_len,
mac_enc, mac_dec, mac_enc, mac_dec,
@ -1025,7 +1028,7 @@ int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl )
{ {
ssl->conf->f_export_keys( ssl->conf->p_export_keys, ssl->conf->f_export_keys( ssl->conf->p_export_keys,
session->master, keyblk, session->master, keyblk,
mac_key_len, transform->keylen, mac_key_len, keylen,
iv_copy_len ); iv_copy_len );
} }
#endif #endif