mbedtls: Update to upstream version 2.16.9

(cherry picked from commit 2872006039)
This commit is contained in:
Rémi Verschelde 2020-12-18 21:22:37 +01:00
parent 742a3f461c
commit 387390d638
No known key found for this signature in database
GPG key ID: C3336907360768E1
35 changed files with 733 additions and 630 deletions

View file

@ -246,7 +246,7 @@ changes are marked with `// -- GODOT --` comments.
## mbedtls ## mbedtls
- Upstream: https://tls.mbed.org/ - Upstream: https://tls.mbed.org/
- Version: 2.16.8 (2020) - Version: 2.16.9 (2020)
- License: Apache 2.0 - License: Apache 2.0
File extracted from upstream release tarball: File extracted from upstream release tarball:

View file

@ -88,12 +88,12 @@
* Maximum window size used for modular exponentiation. Default: 6 * Maximum window size used for modular exponentiation. Default: 6
* Minimum value: 1. Maximum value: 6. * Minimum value: 1. Maximum value: 6.
* *
* Result is an array of ( 2 << MBEDTLS_MPI_WINDOW_SIZE ) MPIs used * Result is an array of ( 2 ** MBEDTLS_MPI_WINDOW_SIZE ) MPIs used
* for the sliding window calculation. (So 64 by default) * for the sliding window calculation. (So 64 by default)
* *
* Reduction in size, reduces speed. * Reduction in size, reduces speed.
*/ */
#define MBEDTLS_MPI_WINDOW_SIZE 6 /**< Maximum windows size used. */ #define MBEDTLS_MPI_WINDOW_SIZE 6 /**< Maximum window size used. */
#endif /* !MBEDTLS_MPI_WINDOW_SIZE */ #endif /* !MBEDTLS_MPI_WINDOW_SIZE */
#if !defined(MBEDTLS_MPI_MAX_SIZE) #if !defined(MBEDTLS_MPI_MAX_SIZE)

View file

@ -175,7 +175,7 @@ void mbedtls_ccm_free( mbedtls_ccm_context *ctx );
* than zero, \p output must be a writable buffer of at least * than zero, \p output must be a writable buffer of at least
* that length. * that length.
* \param tag The buffer holding the authentication field. This must be a * \param tag The buffer holding the authentication field. This must be a
* readable buffer of at least \p tag_len Bytes. * writable buffer of at least \p tag_len Bytes.
* \param tag_len The length of the authentication field to generate in Bytes: * \param tag_len The length of the authentication field to generate in Bytes:
* 4, 6, 8, 10, 12, 14 or 16. * 4, 6, 8, 10, 12, 14 or 16.
* *
@ -220,7 +220,7 @@ int mbedtls_ccm_encrypt_and_tag( mbedtls_ccm_context *ctx, size_t length,
* than zero, \p output must be a writable buffer of at least * than zero, \p output must be a writable buffer of at least
* that length. * that length.
* \param tag The buffer holding the authentication field. This must be a * \param tag The buffer holding the authentication field. This must be a
* readable buffer of at least \p tag_len Bytes. * writable buffer of at least \p tag_len Bytes.
* \param tag_len The length of the authentication field to generate in Bytes: * \param tag_len The length of the authentication field to generate in Bytes:
* 0, 4, 6, 8, 10, 12, 14 or 16. * 0, 4, 6, 8, 10, 12, 14 or 16.
* *

View file

@ -3128,7 +3128,7 @@
*/ */
/* MPI / BIGNUM options */ /* MPI / BIGNUM options */
//#define MBEDTLS_MPI_WINDOW_SIZE 6 /**< Maximum windows size used. */ //#define MBEDTLS_MPI_WINDOW_SIZE 6 /**< Maximum window size used. */
//#define MBEDTLS_MPI_MAX_SIZE 1024 /**< Maximum number of bytes for usable MPIs. */ //#define MBEDTLS_MPI_MAX_SIZE 1024 /**< Maximum number of bytes for usable MPIs. */
/* CTR_DRBG options */ /* CTR_DRBG options */

View file

@ -224,6 +224,11 @@ mbedtls_ctr_drbg_context;
* and prepares it for mbedtls_ctr_drbg_seed() * and prepares it for mbedtls_ctr_drbg_seed()
* or mbedtls_ctr_drbg_free(). * or mbedtls_ctr_drbg_free().
* *
* \note The reseed interval is
* #MBEDTLS_CTR_DRBG_RESEED_INTERVAL by default.
* You can override it by calling
* mbedtls_ctr_drbg_set_reseed_interval().
*
* \param ctx The CTR_DRBG context to initialize. * \param ctx The CTR_DRBG context to initialize.
*/ */
void mbedtls_ctr_drbg_init( mbedtls_ctr_drbg_context *ctx ); void mbedtls_ctr_drbg_init( mbedtls_ctr_drbg_context *ctx );
@ -305,7 +310,8 @@ int mbedtls_ctr_drbg_seed( mbedtls_ctr_drbg_context *ctx,
size_t len ); size_t len );
/** /**
* \brief This function clears CTR_CRBG context data. * \brief This function resets CTR_DRBG context to the state immediately
* after initial call of mbedtls_ctr_drbg_init().
* *
* \param ctx The CTR_DRBG context to clear. * \param ctx The CTR_DRBG context to clear.
*/ */

View file

@ -182,7 +182,7 @@ int mbedtls_gcm_setkey( mbedtls_gcm_context *ctx,
* than zero, this must be a writable buffer of at least that * than zero, this must be a writable buffer of at least that
* size in Bytes. * size in Bytes.
* \param tag_len The length of the tag to generate. * \param tag_len The length of the tag to generate.
* \param tag The buffer for holding the tag. This must be a readable * \param tag The buffer for holding the tag. This must be a writable
* buffer of at least \p tag_len Bytes. * buffer of at least \p tag_len Bytes.
* *
* \return \c 0 if the encryption or decryption was performed * \return \c 0 if the encryption or decryption was performed
@ -310,7 +310,7 @@ int mbedtls_gcm_update( mbedtls_gcm_context *ctx,
* tag. The tag can have a maximum length of 16 Bytes. * tag. The tag can have a maximum length of 16 Bytes.
* *
* \param ctx The GCM context. This must be initialized. * \param ctx The GCM context. This must be initialized.
* \param tag The buffer for holding the tag. This must be a readable * \param tag The buffer for holding the tag. This must be a writable
* buffer of at least \p tag_len Bytes. * buffer of at least \p tag_len Bytes.
* \param tag_len The length of the tag to generate. This must be at least * \param tag_len The length of the tag to generate. This must be at least
* four. * four.

View file

@ -138,6 +138,10 @@ typedef struct mbedtls_hmac_drbg_context
* This function makes the context ready for mbedtls_hmac_drbg_seed(), * This function makes the context ready for mbedtls_hmac_drbg_seed(),
* mbedtls_hmac_drbg_seed_buf() or mbedtls_hmac_drbg_free(). * mbedtls_hmac_drbg_seed_buf() or mbedtls_hmac_drbg_free().
* *
* \note The reseed interval is #MBEDTLS_HMAC_DRBG_RESEED_INTERVAL
* by default. Override this value by calling
* mbedtls_hmac_drbg_set_reseed_interval().
*
* \param ctx HMAC_DRBG context to be initialized. * \param ctx HMAC_DRBG context to be initialized.
*/ */
void mbedtls_hmac_drbg_init( mbedtls_hmac_drbg_context *ctx ); void mbedtls_hmac_drbg_init( mbedtls_hmac_drbg_context *ctx );
@ -361,7 +365,8 @@ int mbedtls_hmac_drbg_random_with_add( void *p_rng,
int mbedtls_hmac_drbg_random( void *p_rng, unsigned char *output, size_t out_len ); int mbedtls_hmac_drbg_random( void *p_rng, unsigned char *output, size_t out_len );
/** /**
* \brief Free an HMAC_DRBG context * \brief This function resets HMAC_DRBG context to the state immediately
* after initial call of mbedtls_hmac_drbg_init().
* *
* \param ctx The HMAC_DRBG context to free. * \param ctx The HMAC_DRBG context to free.
*/ */

View file

@ -152,8 +152,7 @@ int mbedtls_sha512_update_ret( mbedtls_sha512_context *ctx,
/** /**
* \brief This function finishes the SHA-512 operation, and writes * \brief This function finishes the SHA-512 operation, and writes
* the result to the output buffer. This function is for * the result to the output buffer.
* internal use only.
* *
* \param ctx The SHA-512 context. This must be initialized * \param ctx The SHA-512 context. This must be initialized
* and have a hash operation started. * and have a hash operation started.
@ -169,6 +168,7 @@ int mbedtls_sha512_finish_ret( mbedtls_sha512_context *ctx,
/** /**
* \brief This function processes a single data block within * \brief This function processes a single data block within
* the ongoing SHA-512 computation. * the ongoing SHA-512 computation.
* This function is for internal use only.
* *
* \param ctx The SHA-512 context. This must be initialized. * \param ctx The SHA-512 context. This must be initialized.
* \param data The buffer holding one block of data. This * \param data The buffer holding one block of data. This

View file

@ -1409,7 +1409,7 @@ void mbedtls_ssl_conf_dbg( mbedtls_ssl_config *conf,
* \note For DTLS, you need to provide either a non-NULL * \note For DTLS, you need to provide either a non-NULL
* f_recv_timeout callback, or a f_recv that doesn't block. * f_recv_timeout callback, or a f_recv that doesn't block.
* *
* \note See the documentations of \c mbedtls_ssl_sent_t, * \note See the documentations of \c mbedtls_ssl_send_t,
* \c mbedtls_ssl_recv_t and \c mbedtls_ssl_recv_timeout_t for * \c mbedtls_ssl_recv_t and \c mbedtls_ssl_recv_timeout_t for
* the conventions those callbacks must follow. * the conventions those callbacks must follow.
* *

View file

@ -65,16 +65,16 @@
*/ */
#define MBEDTLS_VERSION_MAJOR 2 #define MBEDTLS_VERSION_MAJOR 2
#define MBEDTLS_VERSION_MINOR 16 #define MBEDTLS_VERSION_MINOR 16
#define MBEDTLS_VERSION_PATCH 8 #define MBEDTLS_VERSION_PATCH 9
/** /**
* The single version number has the following structure: * The single version number has the following structure:
* MMNNPP00 * MMNNPP00
* Major version | Minor version | Patch version * Major version | Minor version | Patch version
*/ */
#define MBEDTLS_VERSION_NUMBER 0x02100800 #define MBEDTLS_VERSION_NUMBER 0x02100900
#define MBEDTLS_VERSION_STRING "2.16.8" #define MBEDTLS_VERSION_STRING "2.16.9"
#define MBEDTLS_VERSION_STRING_FULL "mbed TLS 2.16.8" #define MBEDTLS_VERSION_STRING_FULL "mbed TLS 2.16.9"
#if defined(MBEDTLS_VERSION_C) #if defined(MBEDTLS_VERSION_C)

View file

@ -760,6 +760,7 @@ exit:
return( ret ); return( ret );
} }
#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
#if defined(MBEDTLS_CIPHER_MODE_XTS) #if defined(MBEDTLS_CIPHER_MODE_XTS)
static int mbedtls_aes_xts_decode_keys( const unsigned char *key, static int mbedtls_aes_xts_decode_keys( const unsigned char *key,
@ -838,8 +839,6 @@ int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx,
} }
#endif /* MBEDTLS_CIPHER_MODE_XTS */ #endif /* MBEDTLS_CIPHER_MODE_XTS */
#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */
#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \ #define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
do \ do \
{ \ { \
@ -897,63 +896,56 @@ int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
unsigned char output[16] ) unsigned char output[16] )
{ {
int i; int i;
uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3; uint32_t *RK = ctx->rk;
struct
{
uint32_t X[4];
uint32_t Y[4];
} t;
RK = ctx->rk; GET_UINT32_LE( t.X[0], input, 0 ); t.X[0] ^= *RK++;
GET_UINT32_LE( t.X[1], input, 4 ); t.X[1] ^= *RK++;
GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++; GET_UINT32_LE( t.X[2], input, 8 ); t.X[2] ^= *RK++;
GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++; GET_UINT32_LE( t.X[3], input, 12 ); t.X[3] ^= *RK++;
GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- ) for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
{ {
AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); AES_FROUND( t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3] );
AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); AES_FROUND( t.X[0], t.X[1], t.X[2], t.X[3], t.Y[0], t.Y[1], t.Y[2], t.Y[3] );
} }
AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); AES_FROUND( t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3] );
X0 = *RK++ ^ \ t.X[0] = *RK++ ^ \
( (uint32_t) FSb[ ( Y0 ) & 0xFF ] ) ^ ( (uint32_t) FSb[ ( t.Y[0] ) & 0xFF ] ) ^
( (uint32_t) FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) FSb[ ( t.Y[1] >> 8 ) & 0xFF ] << 8 ) ^
( (uint32_t) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) FSb[ ( t.Y[2] >> 16 ) & 0xFF ] << 16 ) ^
( (uint32_t) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 ); ( (uint32_t) FSb[ ( t.Y[3] >> 24 ) & 0xFF ] << 24 );
X1 = *RK++ ^ \ t.X[1] = *RK++ ^ \
( (uint32_t) FSb[ ( Y1 ) & 0xFF ] ) ^ ( (uint32_t) FSb[ ( t.Y[1] ) & 0xFF ] ) ^
( (uint32_t) FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) FSb[ ( t.Y[2] >> 8 ) & 0xFF ] << 8 ) ^
( (uint32_t) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) FSb[ ( t.Y[3] >> 16 ) & 0xFF ] << 16 ) ^
( (uint32_t) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 ); ( (uint32_t) FSb[ ( t.Y[0] >> 24 ) & 0xFF ] << 24 );
X2 = *RK++ ^ \ t.X[2] = *RK++ ^ \
( (uint32_t) FSb[ ( Y2 ) & 0xFF ] ) ^ ( (uint32_t) FSb[ ( t.Y[2] ) & 0xFF ] ) ^
( (uint32_t) FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) FSb[ ( t.Y[3] >> 8 ) & 0xFF ] << 8 ) ^
( (uint32_t) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) FSb[ ( t.Y[0] >> 16 ) & 0xFF ] << 16 ) ^
( (uint32_t) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 ); ( (uint32_t) FSb[ ( t.Y[1] >> 24 ) & 0xFF ] << 24 );
X3 = *RK++ ^ \ t.X[3] = *RK++ ^ \
( (uint32_t) FSb[ ( Y3 ) & 0xFF ] ) ^ ( (uint32_t) FSb[ ( t.Y[3] ) & 0xFF ] ) ^
( (uint32_t) FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) FSb[ ( t.Y[0] >> 8 ) & 0xFF ] << 8 ) ^
( (uint32_t) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) FSb[ ( t.Y[1] >> 16 ) & 0xFF ] << 16 ) ^
( (uint32_t) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 ); ( (uint32_t) FSb[ ( t.Y[2] >> 24 ) & 0xFF ] << 24 );
PUT_UINT32_LE( X0, output, 0 ); PUT_UINT32_LE( t.X[0], output, 0 );
PUT_UINT32_LE( X1, output, 4 ); PUT_UINT32_LE( t.X[1], output, 4 );
PUT_UINT32_LE( X2, output, 8 ); PUT_UINT32_LE( t.X[2], output, 8 );
PUT_UINT32_LE( X3, output, 12 ); PUT_UINT32_LE( t.X[3], output, 12 );
mbedtls_platform_zeroize( &X0, sizeof( X0 ) ); mbedtls_platform_zeroize( &t, sizeof( t ) );
mbedtls_platform_zeroize( &X1, sizeof( X1 ) );
mbedtls_platform_zeroize( &X2, sizeof( X2 ) );
mbedtls_platform_zeroize( &X3, sizeof( X3 ) );
mbedtls_platform_zeroize( &Y0, sizeof( Y0 ) );
mbedtls_platform_zeroize( &Y1, sizeof( Y1 ) );
mbedtls_platform_zeroize( &Y2, sizeof( Y2 ) );
mbedtls_platform_zeroize( &Y3, sizeof( Y3 ) );
mbedtls_platform_zeroize( &RK, sizeof( RK ) );
return( 0 ); return( 0 );
} }
@ -977,63 +969,56 @@ int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
unsigned char output[16] ) unsigned char output[16] )
{ {
int i; int i;
uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3; uint32_t *RK = ctx->rk;
struct
{
uint32_t X[4];
uint32_t Y[4];
} t;
RK = ctx->rk; GET_UINT32_LE( t.X[0], input, 0 ); t.X[0] ^= *RK++;
GET_UINT32_LE( t.X[1], input, 4 ); t.X[1] ^= *RK++;
GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++; GET_UINT32_LE( t.X[2], input, 8 ); t.X[2] ^= *RK++;
GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++; GET_UINT32_LE( t.X[3], input, 12 ); t.X[3] ^= *RK++;
GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++;
GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;
for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- ) for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )
{ {
AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); AES_RROUND( t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3] );
AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); AES_RROUND( t.X[0], t.X[1], t.X[2], t.X[3], t.Y[0], t.Y[1], t.Y[2], t.Y[3] );
} }
AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); AES_RROUND( t.Y[0], t.Y[1], t.Y[2], t.Y[3], t.X[0], t.X[1], t.X[2], t.X[3] );
X0 = *RK++ ^ \ t.X[0] = *RK++ ^ \
( (uint32_t) RSb[ ( Y0 ) & 0xFF ] ) ^ ( (uint32_t) RSb[ ( t.Y[0] ) & 0xFF ] ) ^
( (uint32_t) RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) RSb[ ( t.Y[3] >> 8 ) & 0xFF ] << 8 ) ^
( (uint32_t) RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) RSb[ ( t.Y[2] >> 16 ) & 0xFF ] << 16 ) ^
( (uint32_t) RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 ); ( (uint32_t) RSb[ ( t.Y[1] >> 24 ) & 0xFF ] << 24 );
X1 = *RK++ ^ \ t.X[1] = *RK++ ^ \
( (uint32_t) RSb[ ( Y1 ) & 0xFF ] ) ^ ( (uint32_t) RSb[ ( t.Y[1] ) & 0xFF ] ) ^
( (uint32_t) RSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) RSb[ ( t.Y[0] >> 8 ) & 0xFF ] << 8 ) ^
( (uint32_t) RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) RSb[ ( t.Y[3] >> 16 ) & 0xFF ] << 16 ) ^
( (uint32_t) RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 ); ( (uint32_t) RSb[ ( t.Y[2] >> 24 ) & 0xFF ] << 24 );
X2 = *RK++ ^ \ t.X[2] = *RK++ ^ \
( (uint32_t) RSb[ ( Y2 ) & 0xFF ] ) ^ ( (uint32_t) RSb[ ( t.Y[2] ) & 0xFF ] ) ^
( (uint32_t) RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) RSb[ ( t.Y[1] >> 8 ) & 0xFF ] << 8 ) ^
( (uint32_t) RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) RSb[ ( t.Y[0] >> 16 ) & 0xFF ] << 16 ) ^
( (uint32_t) RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 ); ( (uint32_t) RSb[ ( t.Y[3] >> 24 ) & 0xFF ] << 24 );
X3 = *RK++ ^ \ t.X[3] = *RK++ ^ \
( (uint32_t) RSb[ ( Y3 ) & 0xFF ] ) ^ ( (uint32_t) RSb[ ( t.Y[3] ) & 0xFF ] ) ^
( (uint32_t) RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) RSb[ ( t.Y[2] >> 8 ) & 0xFF ] << 8 ) ^
( (uint32_t) RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) RSb[ ( t.Y[1] >> 16 ) & 0xFF ] << 16 ) ^
( (uint32_t) RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 ); ( (uint32_t) RSb[ ( t.Y[0] >> 24 ) & 0xFF ] << 24 );
PUT_UINT32_LE( X0, output, 0 ); PUT_UINT32_LE( t.X[0], output, 0 );
PUT_UINT32_LE( X1, output, 4 ); PUT_UINT32_LE( t.X[1], output, 4 );
PUT_UINT32_LE( X2, output, 8 ); PUT_UINT32_LE( t.X[2], output, 8 );
PUT_UINT32_LE( X3, output, 12 ); PUT_UINT32_LE( t.X[3], output, 12 );
mbedtls_platform_zeroize( &X0, sizeof( X0 ) ); mbedtls_platform_zeroize( &t, sizeof( t ) );
mbedtls_platform_zeroize( &X1, sizeof( X1 ) );
mbedtls_platform_zeroize( &X2, sizeof( X2 ) );
mbedtls_platform_zeroize( &X3, sizeof( X3 ) );
mbedtls_platform_zeroize( &Y0, sizeof( Y0 ) );
mbedtls_platform_zeroize( &Y1, sizeof( Y1 ) );
mbedtls_platform_zeroize( &Y2, sizeof( Y2 ) );
mbedtls_platform_zeroize( &Y3, sizeof( Y3 ) );
mbedtls_platform_zeroize( &RK, sizeof( RK ) );
return( 0 ); return( 0 );
} }

View file

@ -1364,7 +1364,10 @@ int mbedtls_mpi_sub_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi
/* If we ran out of space for the carry, it means that the result /* If we ran out of space for the carry, it means that the result
* is negative. */ * is negative. */
if( n == X->n ) if( n == X->n )
return( MBEDTLS_ERR_MPI_NEGATIVE_VALUE ); {
ret = MBEDTLS_ERR_MPI_NEGATIVE_VALUE;
goto cleanup;
}
--X->p[n]; --X->p[n];
} }
@ -2044,7 +2047,7 @@ int mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A,
size_t i, j, nblimbs; size_t i, j, nblimbs;
size_t bufsize, nbits; size_t bufsize, nbits;
mbedtls_mpi_uint ei, mm, state; mbedtls_mpi_uint ei, mm, state;
mbedtls_mpi RR, T, W[ 2 << MBEDTLS_MPI_WINDOW_SIZE ], Apos; mbedtls_mpi RR, T, W[ 1 << MBEDTLS_MPI_WINDOW_SIZE ], Apos;
int neg; int neg;
MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( X != NULL );
@ -2058,6 +2061,10 @@ int mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A,
if( mbedtls_mpi_cmp_int( E, 0 ) < 0 ) if( mbedtls_mpi_cmp_int( E, 0 ) < 0 )
return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
if( mbedtls_mpi_bitlen( E ) > MBEDTLS_MPI_MAX_BITS ||
mbedtls_mpi_bitlen( N ) > MBEDTLS_MPI_MAX_BITS )
return ( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
/* /*
* Init temps and window size * Init temps and window size
*/ */
@ -2334,7 +2341,7 @@ int mbedtls_mpi_fill_random( mbedtls_mpi *X, size_t size,
MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) );
Xp = (unsigned char*) X->p; Xp = (unsigned char*) X->p;
f_rng( p_rng, Xp + overhead, size ); MBEDTLS_MPI_CHK( f_rng( p_rng, Xp + overhead, size ) );
mpi_bigendian_to_host( X->p, limbs ); mpi_bigendian_to_host( X->p, limbs );

View file

@ -779,7 +779,7 @@ static const mbedtls_cipher_info_t camellia_128_ecb_info = {
MBEDTLS_MODE_ECB, MBEDTLS_MODE_ECB,
128, 128,
"CAMELLIA-128-ECB", "CAMELLIA-128-ECB",
16, 0,
0, 0,
16, 16,
&camellia_info &camellia_info
@ -790,7 +790,7 @@ static const mbedtls_cipher_info_t camellia_192_ecb_info = {
MBEDTLS_MODE_ECB, MBEDTLS_MODE_ECB,
192, 192,
"CAMELLIA-192-ECB", "CAMELLIA-192-ECB",
16, 0,
0, 0,
16, 16,
&camellia_info &camellia_info
@ -801,7 +801,7 @@ static const mbedtls_cipher_info_t camellia_256_ecb_info = {
MBEDTLS_MODE_ECB, MBEDTLS_MODE_ECB,
256, 256,
"CAMELLIA-256-ECB", "CAMELLIA-256-ECB",
16, 0,
0, 0,
16, 16,
&camellia_info &camellia_info
@ -1155,7 +1155,7 @@ static const mbedtls_cipher_info_t aria_128_ecb_info = {
MBEDTLS_MODE_ECB, MBEDTLS_MODE_ECB,
128, 128,
"ARIA-128-ECB", "ARIA-128-ECB",
16, 0,
0, 0,
16, 16,
&aria_info &aria_info
@ -1166,7 +1166,7 @@ static const mbedtls_cipher_info_t aria_192_ecb_info = {
MBEDTLS_MODE_ECB, MBEDTLS_MODE_ECB,
192, 192,
"ARIA-192-ECB", "ARIA-192-ECB",
16, 0,
0, 0,
16, 16,
&aria_info &aria_info
@ -1177,7 +1177,7 @@ static const mbedtls_cipher_info_t aria_256_ecb_info = {
MBEDTLS_MODE_ECB, MBEDTLS_MODE_ECB,
256, 256,
"ARIA-256-ECB", "ARIA-256-ECB",
16, 0,
0, 0,
16, 16,
&aria_info &aria_info
@ -1579,7 +1579,7 @@ static const mbedtls_cipher_info_t des_ecb_info = {
MBEDTLS_MODE_ECB, MBEDTLS_MODE_ECB,
MBEDTLS_KEY_LENGTH_DES, MBEDTLS_KEY_LENGTH_DES,
"DES-ECB", "DES-ECB",
8, 0,
0, 0,
8, 8,
&des_info &des_info
@ -1630,7 +1630,7 @@ static const mbedtls_cipher_info_t des_ede_ecb_info = {
MBEDTLS_MODE_ECB, MBEDTLS_MODE_ECB,
MBEDTLS_KEY_LENGTH_DES_EDE, MBEDTLS_KEY_LENGTH_DES_EDE,
"DES-EDE-ECB", "DES-EDE-ECB",
8, 0,
0, 0,
8, 8,
&des_ede_info &des_ede_info
@ -1681,7 +1681,7 @@ static const mbedtls_cipher_info_t des_ede3_ecb_info = {
MBEDTLS_MODE_ECB, MBEDTLS_MODE_ECB,
MBEDTLS_KEY_LENGTH_DES_EDE3, MBEDTLS_KEY_LENGTH_DES_EDE3,
"DES-EDE3-ECB", "DES-EDE3-ECB",
8, 0,
0, 0,
8, 8,
&des_ede3_info &des_ede3_info
@ -1796,7 +1796,7 @@ static const mbedtls_cipher_info_t blowfish_ecb_info = {
MBEDTLS_MODE_ECB, MBEDTLS_MODE_ECB,
128, 128,
"BLOWFISH-ECB", "BLOWFISH-ECB",
8, 0,
MBEDTLS_CIPHER_VARIABLE_KEY_LEN, MBEDTLS_CIPHER_VARIABLE_KEY_LEN,
8, 8,
&blowfish_info &blowfish_info

View file

@ -450,7 +450,7 @@ exit:
*/ */
int mbedtls_aes_cmac_prf_128( const unsigned char *key, size_t key_length, int mbedtls_aes_cmac_prf_128( const unsigned char *key, size_t key_length,
const unsigned char *input, size_t in_len, const unsigned char *input, size_t in_len,
unsigned char *output ) unsigned char output[16] )
{ {
int ret; int ret;
const mbedtls_cipher_info_t *cipher_info; const mbedtls_cipher_info_t *cipher_info;

View file

@ -82,11 +82,17 @@ void mbedtls_ctr_drbg_init( mbedtls_ctr_drbg_context *ctx )
{ {
memset( ctx, 0, sizeof( mbedtls_ctr_drbg_context ) ); memset( ctx, 0, sizeof( mbedtls_ctr_drbg_context ) );
ctx->reseed_interval = MBEDTLS_CTR_DRBG_RESEED_INTERVAL;
#if defined(MBEDTLS_THREADING_C) #if defined(MBEDTLS_THREADING_C)
mbedtls_mutex_init( &ctx->mutex ); mbedtls_mutex_init( &ctx->mutex );
#endif #endif
} }
/*
* This function resets CTR_DRBG context to the state immediately
* after initial call of mbedtls_ctr_drbg_init().
*/
void mbedtls_ctr_drbg_free( mbedtls_ctr_drbg_context *ctx ) void mbedtls_ctr_drbg_free( mbedtls_ctr_drbg_context *ctx )
{ {
if( ctx == NULL ) if( ctx == NULL )
@ -97,6 +103,10 @@ void mbedtls_ctr_drbg_free( mbedtls_ctr_drbg_context *ctx )
#endif #endif
mbedtls_aes_free( &ctx->aes_ctx ); mbedtls_aes_free( &ctx->aes_ctx );
mbedtls_platform_zeroize( ctx, sizeof( mbedtls_ctr_drbg_context ) ); mbedtls_platform_zeroize( ctx, sizeof( mbedtls_ctr_drbg_context ) );
ctx->reseed_interval = MBEDTLS_CTR_DRBG_RESEED_INTERVAL;
#if defined(MBEDTLS_THREADING_C)
mbedtls_mutex_init( &ctx->mutex );
#endif
} }
void mbedtls_ctr_drbg_set_prediction_resistance( mbedtls_ctr_drbg_context *ctx, int resistance ) void mbedtls_ctr_drbg_set_prediction_resistance( mbedtls_ctr_drbg_context *ctx, int resistance )
@ -419,7 +429,6 @@ int mbedtls_ctr_drbg_seed( mbedtls_ctr_drbg_context *ctx,
if( ctx->entropy_len == 0 ) if( ctx->entropy_len == 0 )
ctx->entropy_len = MBEDTLS_CTR_DRBG_ENTROPY_LEN; ctx->entropy_len = MBEDTLS_CTR_DRBG_ENTROPY_LEN;
ctx->reseed_interval = MBEDTLS_CTR_DRBG_RESEED_INTERVAL;
/* /*
* Initialize with an empty key * Initialize with an empty key

View file

@ -1044,7 +1044,7 @@ static inline void sub32( uint32_t *dst, uint32_t src, signed char *carry )
STORE32; i++; \ STORE32; i++; \
cur = c > 0 ? c : 0; STORE32; \ cur = c > 0 ? c : 0; STORE32; \
cur = 0; while( ++i < MAX32 ) { STORE32; } \ cur = 0; while( ++i < MAX32 ) { STORE32; } \
if( c < 0 ) fix_negative( N, c, &C, bits ); if( c < 0 ) MBEDTLS_MPI_CHK( fix_negative( N, c, &C, bits ) );
/* /*
* If the result is negative, we get it in the form * If the result is negative, we get it in the form

View file

@ -44,7 +44,7 @@
* ********** * **********
*/ */
#if defined(__linux__) #if defined(__linux__) && !defined(_GNU_SOURCE)
/* Ensure that syscall() is available even when compiling with -std=c99 */ /* Ensure that syscall() is available even when compiling with -std=c99 */
#define _GNU_SOURCE #define _GNU_SOURCE
#endif #endif

View file

@ -51,20 +51,19 @@
#endif #endif
#if defined(MBEDTLS_ERROR_C) || defined(MBEDTLS_ERROR_STRERROR_DUMMY) #if defined(MBEDTLS_ERROR_C) || defined(MBEDTLS_ERROR_STRERROR_DUMMY)
#include "mbedtls/error.h" #include "mbedtls/error.h"
#include <string.h>
#endif #if defined(MBEDTLS_ERROR_C)
#if defined(MBEDTLS_PLATFORM_C) #if defined(MBEDTLS_PLATFORM_C)
#include "mbedtls/platform.h" #include "mbedtls/platform.h"
#else #else
#define mbedtls_snprintf snprintf #define mbedtls_snprintf snprintf
#define mbedtls_time_t time_t
#endif #endif
#if defined(MBEDTLS_ERROR_C)
#include <stdio.h> #include <stdio.h>
#include <string.h>
#if defined(MBEDTLS_AES_C) #if defined(MBEDTLS_AES_C)
#include "mbedtls/aes.h" #include "mbedtls/aes.h"
@ -929,8 +928,6 @@ void mbedtls_strerror( int ret, char *buf, size_t buflen )
#else /* MBEDTLS_ERROR_C */ #else /* MBEDTLS_ERROR_C */
#if defined(MBEDTLS_ERROR_STRERROR_DUMMY)
/* /*
* Provide an non-function in case MBEDTLS_ERROR_C is not defined * Provide an non-function in case MBEDTLS_ERROR_C is not defined
*/ */
@ -942,6 +939,6 @@ void mbedtls_strerror( int ret, char *buf, size_t buflen )
buf[0] = '\0'; buf[0] = '\0';
} }
#endif /* MBEDTLS_ERROR_STRERROR_DUMMY */
#endif /* MBEDTLS_ERROR_C */ #endif /* MBEDTLS_ERROR_C */
#endif /* MBEDTLS_ERROR_C || MBEDTLS_ERROR_STRERROR_DUMMY */

View file

@ -83,6 +83,8 @@ void mbedtls_hmac_drbg_init( mbedtls_hmac_drbg_context *ctx )
{ {
memset( ctx, 0, sizeof( mbedtls_hmac_drbg_context ) ); memset( ctx, 0, sizeof( mbedtls_hmac_drbg_context ) );
ctx->reseed_interval = MBEDTLS_HMAC_DRBG_RESEED_INTERVAL;
#if defined(MBEDTLS_THREADING_C) #if defined(MBEDTLS_THREADING_C)
mbedtls_mutex_init( &ctx->mutex ); mbedtls_mutex_init( &ctx->mutex );
#endif #endif
@ -296,8 +298,6 @@ int mbedtls_hmac_drbg_seed( mbedtls_hmac_drbg_context *ctx,
ctx->f_entropy = f_entropy; ctx->f_entropy = f_entropy;
ctx->p_entropy = p_entropy; ctx->p_entropy = p_entropy;
ctx->reseed_interval = MBEDTLS_HMAC_DRBG_RESEED_INTERVAL;
if( ctx->entropy_len == 0 ) if( ctx->entropy_len == 0 )
{ {
/* /*
@ -442,7 +442,8 @@ int mbedtls_hmac_drbg_random( void *p_rng, unsigned char *output, size_t out_len
} }
/* /*
* Free an HMAC_DRBG context * This function resets HMAC_DRBG context to the state immediately
* after initial call of mbedtls_hmac_drbg_init().
*/ */
void mbedtls_hmac_drbg_free( mbedtls_hmac_drbg_context *ctx ) void mbedtls_hmac_drbg_free( mbedtls_hmac_drbg_context *ctx )
{ {
@ -454,6 +455,10 @@ void mbedtls_hmac_drbg_free( mbedtls_hmac_drbg_context *ctx )
#endif #endif
mbedtls_md_free( &ctx->md_ctx ); mbedtls_md_free( &ctx->md_ctx );
mbedtls_platform_zeroize( ctx, sizeof( mbedtls_hmac_drbg_context ) ); mbedtls_platform_zeroize( ctx, sizeof( mbedtls_hmac_drbg_context ) );
ctx->reseed_interval = MBEDTLS_HMAC_DRBG_RESEED_INTERVAL;
#if defined(MBEDTLS_THREADING_C)
mbedtls_mutex_init( &ctx->mutex );
#endif
} }
#if defined(MBEDTLS_FS_IO) #if defined(MBEDTLS_FS_IO)

View file

@ -177,6 +177,9 @@ int mbedtls_internal_md2_process( mbedtls_md2_context *ctx )
t = ctx->cksum[i]; t = ctx->cksum[i];
} }
/* Zeroise variables to clear sensitive data from memory. */
mbedtls_platform_zeroize( &t, sizeof( t ) );
return( 0 ); return( 0 );
} }

View file

@ -143,31 +143,34 @@ void mbedtls_md4_starts( mbedtls_md4_context *ctx )
int mbedtls_internal_md4_process( mbedtls_md4_context *ctx, int mbedtls_internal_md4_process( mbedtls_md4_context *ctx,
const unsigned char data[64] ) const unsigned char data[64] )
{ {
uint32_t X[16], A, B, C, D; struct
{
uint32_t X[16], A, B, C, D;
} local;
GET_UINT32_LE( X[ 0], data, 0 ); GET_UINT32_LE( local.X[ 0], data, 0 );
GET_UINT32_LE( X[ 1], data, 4 ); GET_UINT32_LE( local.X[ 1], data, 4 );
GET_UINT32_LE( X[ 2], data, 8 ); GET_UINT32_LE( local.X[ 2], data, 8 );
GET_UINT32_LE( X[ 3], data, 12 ); GET_UINT32_LE( local.X[ 3], data, 12 );
GET_UINT32_LE( X[ 4], data, 16 ); GET_UINT32_LE( local.X[ 4], data, 16 );
GET_UINT32_LE( X[ 5], data, 20 ); GET_UINT32_LE( local.X[ 5], data, 20 );
GET_UINT32_LE( X[ 6], data, 24 ); GET_UINT32_LE( local.X[ 6], data, 24 );
GET_UINT32_LE( X[ 7], data, 28 ); GET_UINT32_LE( local.X[ 7], data, 28 );
GET_UINT32_LE( X[ 8], data, 32 ); GET_UINT32_LE( local.X[ 8], data, 32 );
GET_UINT32_LE( X[ 9], data, 36 ); GET_UINT32_LE( local.X[ 9], data, 36 );
GET_UINT32_LE( X[10], data, 40 ); GET_UINT32_LE( local.X[10], data, 40 );
GET_UINT32_LE( X[11], data, 44 ); GET_UINT32_LE( local.X[11], data, 44 );
GET_UINT32_LE( X[12], data, 48 ); GET_UINT32_LE( local.X[12], data, 48 );
GET_UINT32_LE( X[13], data, 52 ); GET_UINT32_LE( local.X[13], data, 52 );
GET_UINT32_LE( X[14], data, 56 ); GET_UINT32_LE( local.X[14], data, 56 );
GET_UINT32_LE( X[15], data, 60 ); GET_UINT32_LE( local.X[15], data, 60 );
#define S(x,n) (((x) << (n)) | (((x) & 0xFFFFFFFF) >> (32 - (n)))) #define S(x,n) (((x) << (n)) | (((x) & 0xFFFFFFFF) >> (32 - (n))))
A = ctx->state[0]; local.A = ctx->state[0];
B = ctx->state[1]; local.B = ctx->state[1];
C = ctx->state[2]; local.C = ctx->state[2];
D = ctx->state[3]; local.D = ctx->state[3];
#define F(x, y, z) (((x) & (y)) | ((~(x)) & (z))) #define F(x, y, z) (((x) & (y)) | ((~(x)) & (z)))
#define P(a,b,c,d,x,s) \ #define P(a,b,c,d,x,s) \
@ -178,22 +181,22 @@ int mbedtls_internal_md4_process( mbedtls_md4_context *ctx,
} while( 0 ) } while( 0 )
P( A, B, C, D, X[ 0], 3 ); P( local.A, local.B, local.C, local.D, local.X[ 0], 3 );
P( D, A, B, C, X[ 1], 7 ); P( local.D, local.A, local.B, local.C, local.X[ 1], 7 );
P( C, D, A, B, X[ 2], 11 ); P( local.C, local.D, local.A, local.B, local.X[ 2], 11 );
P( B, C, D, A, X[ 3], 19 ); P( local.B, local.C, local.D, local.A, local.X[ 3], 19 );
P( A, B, C, D, X[ 4], 3 ); P( local.A, local.B, local.C, local.D, local.X[ 4], 3 );
P( D, A, B, C, X[ 5], 7 ); P( local.D, local.A, local.B, local.C, local.X[ 5], 7 );
P( C, D, A, B, X[ 6], 11 ); P( local.C, local.D, local.A, local.B, local.X[ 6], 11 );
P( B, C, D, A, X[ 7], 19 ); P( local.B, local.C, local.D, local.A, local.X[ 7], 19 );
P( A, B, C, D, X[ 8], 3 ); P( local.A, local.B, local.C, local.D, local.X[ 8], 3 );
P( D, A, B, C, X[ 9], 7 ); P( local.D, local.A, local.B, local.C, local.X[ 9], 7 );
P( C, D, A, B, X[10], 11 ); P( local.C, local.D, local.A, local.B, local.X[10], 11 );
P( B, C, D, A, X[11], 19 ); P( local.B, local.C, local.D, local.A, local.X[11], 19 );
P( A, B, C, D, X[12], 3 ); P( local.A, local.B, local.C, local.D, local.X[12], 3 );
P( D, A, B, C, X[13], 7 ); P( local.D, local.A, local.B, local.C, local.X[13], 7 );
P( C, D, A, B, X[14], 11 ); P( local.C, local.D, local.A, local.B, local.X[14], 11 );
P( B, C, D, A, X[15], 19 ); P( local.B, local.C, local.D, local.A, local.X[15], 19 );
#undef P #undef P
#undef F #undef F
@ -206,22 +209,22 @@ int mbedtls_internal_md4_process( mbedtls_md4_context *ctx,
(a) = S((a),(s)); \ (a) = S((a),(s)); \
} while( 0 ) } while( 0 )
P( A, B, C, D, X[ 0], 3 ); P( local.A, local.B, local.C, local.D, local.X[ 0], 3 );
P( D, A, B, C, X[ 4], 5 ); P( local.D, local.A, local.B, local.C, local.X[ 4], 5 );
P( C, D, A, B, X[ 8], 9 ); P( local.C, local.D, local.A, local.B, local.X[ 8], 9 );
P( B, C, D, A, X[12], 13 ); P( local.B, local.C, local.D, local.A, local.X[12], 13 );
P( A, B, C, D, X[ 1], 3 ); P( local.A, local.B, local.C, local.D, local.X[ 1], 3 );
P( D, A, B, C, X[ 5], 5 ); P( local.D, local.A, local.B, local.C, local.X[ 5], 5 );
P( C, D, A, B, X[ 9], 9 ); P( local.C, local.D, local.A, local.B, local.X[ 9], 9 );
P( B, C, D, A, X[13], 13 ); P( local.B, local.C, local.D, local.A, local.X[13], 13 );
P( A, B, C, D, X[ 2], 3 ); P( local.A, local.B, local.C, local.D, local.X[ 2], 3 );
P( D, A, B, C, X[ 6], 5 ); P( local.D, local.A, local.B, local.C, local.X[ 6], 5 );
P( C, D, A, B, X[10], 9 ); P( local.C, local.D, local.A, local.B, local.X[10], 9 );
P( B, C, D, A, X[14], 13 ); P( local.B, local.C, local.D, local.A, local.X[14], 13 );
P( A, B, C, D, X[ 3], 3 ); P( local.A, local.B, local.C, local.D, local.X[ 3], 3 );
P( D, A, B, C, X[ 7], 5 ); P( local.D, local.A, local.B, local.C, local.X[ 7], 5 );
P( C, D, A, B, X[11], 9 ); P( local.C, local.D, local.A, local.B, local.X[11], 9 );
P( B, C, D, A, X[15], 13 ); P( local.B, local.C, local.D, local.A, local.X[15], 13 );
#undef P #undef P
#undef F #undef F
@ -234,30 +237,33 @@ int mbedtls_internal_md4_process( mbedtls_md4_context *ctx,
(a) = S((a),(s)); \ (a) = S((a),(s)); \
} while( 0 ) } while( 0 )
P( A, B, C, D, X[ 0], 3 ); P( local.A, local.B, local.C, local.D, local.X[ 0], 3 );
P( D, A, B, C, X[ 8], 9 ); P( local.D, local.A, local.B, local.C, local.X[ 8], 9 );
P( C, D, A, B, X[ 4], 11 ); P( local.C, local.D, local.A, local.B, local.X[ 4], 11 );
P( B, C, D, A, X[12], 15 ); P( local.B, local.C, local.D, local.A, local.X[12], 15 );
P( A, B, C, D, X[ 2], 3 ); P( local.A, local.B, local.C, local.D, local.X[ 2], 3 );
P( D, A, B, C, X[10], 9 ); P( local.D, local.A, local.B, local.C, local.X[10], 9 );
P( C, D, A, B, X[ 6], 11 ); P( local.C, local.D, local.A, local.B, local.X[ 6], 11 );
P( B, C, D, A, X[14], 15 ); P( local.B, local.C, local.D, local.A, local.X[14], 15 );
P( A, B, C, D, X[ 1], 3 ); P( local.A, local.B, local.C, local.D, local.X[ 1], 3 );
P( D, A, B, C, X[ 9], 9 ); P( local.D, local.A, local.B, local.C, local.X[ 9], 9 );
P( C, D, A, B, X[ 5], 11 ); P( local.C, local.D, local.A, local.B, local.X[ 5], 11 );
P( B, C, D, A, X[13], 15 ); P( local.B, local.C, local.D, local.A, local.X[13], 15 );
P( A, B, C, D, X[ 3], 3 ); P( local.A, local.B, local.C, local.D, local.X[ 3], 3 );
P( D, A, B, C, X[11], 9 ); P( local.D, local.A, local.B, local.C, local.X[11], 9 );
P( C, D, A, B, X[ 7], 11 ); P( local.C, local.D, local.A, local.B, local.X[ 7], 11 );
P( B, C, D, A, X[15], 15 ); P( local.B, local.C, local.D, local.A, local.X[15], 15 );
#undef F #undef F
#undef P #undef P
ctx->state[0] += A; ctx->state[0] += local.A;
ctx->state[1] += B; ctx->state[1] += local.B;
ctx->state[2] += C; ctx->state[2] += local.C;
ctx->state[3] += D; ctx->state[3] += local.D;
/* Zeroise variables to clear sensitive data from memory. */
mbedtls_platform_zeroize( &local, sizeof( local ) );
return( 0 ); return( 0 );
} }

View file

@ -142,128 +142,134 @@ void mbedtls_md5_starts( mbedtls_md5_context *ctx )
int mbedtls_internal_md5_process( mbedtls_md5_context *ctx, int mbedtls_internal_md5_process( mbedtls_md5_context *ctx,
const unsigned char data[64] ) const unsigned char data[64] )
{ {
uint32_t X[16], A, B, C, D; struct
{
uint32_t X[16], A, B, C, D;
} local;
GET_UINT32_LE( X[ 0], data, 0 ); GET_UINT32_LE( local.X[ 0], data, 0 );
GET_UINT32_LE( X[ 1], data, 4 ); GET_UINT32_LE( local.X[ 1], data, 4 );
GET_UINT32_LE( X[ 2], data, 8 ); GET_UINT32_LE( local.X[ 2], data, 8 );
GET_UINT32_LE( X[ 3], data, 12 ); GET_UINT32_LE( local.X[ 3], data, 12 );
GET_UINT32_LE( X[ 4], data, 16 ); GET_UINT32_LE( local.X[ 4], data, 16 );
GET_UINT32_LE( X[ 5], data, 20 ); GET_UINT32_LE( local.X[ 5], data, 20 );
GET_UINT32_LE( X[ 6], data, 24 ); GET_UINT32_LE( local.X[ 6], data, 24 );
GET_UINT32_LE( X[ 7], data, 28 ); GET_UINT32_LE( local.X[ 7], data, 28 );
GET_UINT32_LE( X[ 8], data, 32 ); GET_UINT32_LE( local.X[ 8], data, 32 );
GET_UINT32_LE( X[ 9], data, 36 ); GET_UINT32_LE( local.X[ 9], data, 36 );
GET_UINT32_LE( X[10], data, 40 ); GET_UINT32_LE( local.X[10], data, 40 );
GET_UINT32_LE( X[11], data, 44 ); GET_UINT32_LE( local.X[11], data, 44 );
GET_UINT32_LE( X[12], data, 48 ); GET_UINT32_LE( local.X[12], data, 48 );
GET_UINT32_LE( X[13], data, 52 ); GET_UINT32_LE( local.X[13], data, 52 );
GET_UINT32_LE( X[14], data, 56 ); GET_UINT32_LE( local.X[14], data, 56 );
GET_UINT32_LE( X[15], data, 60 ); GET_UINT32_LE( local.X[15], data, 60 );
#define S(x,n) \ #define S(x,n) \
( ( (x) << (n) ) | ( ( (x) & 0xFFFFFFFF) >> ( 32 - (n) ) ) ) ( ( (x) << (n) ) | ( ( (x) & 0xFFFFFFFF) >> ( 32 - (n) ) ) )
#define P(a,b,c,d,k,s,t) \ #define P(a,b,c,d,k,s,t) \
do \ do \
{ \ { \
(a) += F((b),(c),(d)) + X[(k)] + (t); \ (a) += F((b),(c),(d)) + local.X[(k)] + (t); \
(a) = S((a),(s)) + (b); \ (a) = S((a),(s)) + (b); \
} while( 0 ) } while( 0 )
A = ctx->state[0]; local.A = ctx->state[0];
B = ctx->state[1]; local.B = ctx->state[1];
C = ctx->state[2]; local.C = ctx->state[2];
D = ctx->state[3]; local.D = ctx->state[3];
#define F(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) #define F(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
P( A, B, C, D, 0, 7, 0xD76AA478 ); P( local.A, local.B, local.C, local.D, 0, 7, 0xD76AA478 );
P( D, A, B, C, 1, 12, 0xE8C7B756 ); P( local.D, local.A, local.B, local.C, 1, 12, 0xE8C7B756 );
P( C, D, A, B, 2, 17, 0x242070DB ); P( local.C, local.D, local.A, local.B, 2, 17, 0x242070DB );
P( B, C, D, A, 3, 22, 0xC1BDCEEE ); P( local.B, local.C, local.D, local.A, 3, 22, 0xC1BDCEEE );
P( A, B, C, D, 4, 7, 0xF57C0FAF ); P( local.A, local.B, local.C, local.D, 4, 7, 0xF57C0FAF );
P( D, A, B, C, 5, 12, 0x4787C62A ); P( local.D, local.A, local.B, local.C, 5, 12, 0x4787C62A );
P( C, D, A, B, 6, 17, 0xA8304613 ); P( local.C, local.D, local.A, local.B, 6, 17, 0xA8304613 );
P( B, C, D, A, 7, 22, 0xFD469501 ); P( local.B, local.C, local.D, local.A, 7, 22, 0xFD469501 );
P( A, B, C, D, 8, 7, 0x698098D8 ); P( local.A, local.B, local.C, local.D, 8, 7, 0x698098D8 );
P( D, A, B, C, 9, 12, 0x8B44F7AF ); P( local.D, local.A, local.B, local.C, 9, 12, 0x8B44F7AF );
P( C, D, A, B, 10, 17, 0xFFFF5BB1 ); P( local.C, local.D, local.A, local.B, 10, 17, 0xFFFF5BB1 );
P( B, C, D, A, 11, 22, 0x895CD7BE ); P( local.B, local.C, local.D, local.A, 11, 22, 0x895CD7BE );
P( A, B, C, D, 12, 7, 0x6B901122 ); P( local.A, local.B, local.C, local.D, 12, 7, 0x6B901122 );
P( D, A, B, C, 13, 12, 0xFD987193 ); P( local.D, local.A, local.B, local.C, 13, 12, 0xFD987193 );
P( C, D, A, B, 14, 17, 0xA679438E ); P( local.C, local.D, local.A, local.B, 14, 17, 0xA679438E );
P( B, C, D, A, 15, 22, 0x49B40821 ); P( local.B, local.C, local.D, local.A, 15, 22, 0x49B40821 );
#undef F #undef F
#define F(x,y,z) ((y) ^ ((z) & ((x) ^ (y)))) #define F(x,y,z) ((y) ^ ((z) & ((x) ^ (y))))
P( A, B, C, D, 1, 5, 0xF61E2562 ); P( local.A, local.B, local.C, local.D, 1, 5, 0xF61E2562 );
P( D, A, B, C, 6, 9, 0xC040B340 ); P( local.D, local.A, local.B, local.C, 6, 9, 0xC040B340 );
P( C, D, A, B, 11, 14, 0x265E5A51 ); P( local.C, local.D, local.A, local.B, 11, 14, 0x265E5A51 );
P( B, C, D, A, 0, 20, 0xE9B6C7AA ); P( local.B, local.C, local.D, local.A, 0, 20, 0xE9B6C7AA );
P( A, B, C, D, 5, 5, 0xD62F105D ); P( local.A, local.B, local.C, local.D, 5, 5, 0xD62F105D );
P( D, A, B, C, 10, 9, 0x02441453 ); P( local.D, local.A, local.B, local.C, 10, 9, 0x02441453 );
P( C, D, A, B, 15, 14, 0xD8A1E681 ); P( local.C, local.D, local.A, local.B, 15, 14, 0xD8A1E681 );
P( B, C, D, A, 4, 20, 0xE7D3FBC8 ); P( local.B, local.C, local.D, local.A, 4, 20, 0xE7D3FBC8 );
P( A, B, C, D, 9, 5, 0x21E1CDE6 ); P( local.A, local.B, local.C, local.D, 9, 5, 0x21E1CDE6 );
P( D, A, B, C, 14, 9, 0xC33707D6 ); P( local.D, local.A, local.B, local.C, 14, 9, 0xC33707D6 );
P( C, D, A, B, 3, 14, 0xF4D50D87 ); P( local.C, local.D, local.A, local.B, 3, 14, 0xF4D50D87 );
P( B, C, D, A, 8, 20, 0x455A14ED ); P( local.B, local.C, local.D, local.A, 8, 20, 0x455A14ED );
P( A, B, C, D, 13, 5, 0xA9E3E905 ); P( local.A, local.B, local.C, local.D, 13, 5, 0xA9E3E905 );
P( D, A, B, C, 2, 9, 0xFCEFA3F8 ); P( local.D, local.A, local.B, local.C, 2, 9, 0xFCEFA3F8 );
P( C, D, A, B, 7, 14, 0x676F02D9 ); P( local.C, local.D, local.A, local.B, 7, 14, 0x676F02D9 );
P( B, C, D, A, 12, 20, 0x8D2A4C8A ); P( local.B, local.C, local.D, local.A, 12, 20, 0x8D2A4C8A );
#undef F #undef F
#define F(x,y,z) ((x) ^ (y) ^ (z)) #define F(x,y,z) ((x) ^ (y) ^ (z))
P( A, B, C, D, 5, 4, 0xFFFA3942 ); P( local.A, local.B, local.C, local.D, 5, 4, 0xFFFA3942 );
P( D, A, B, C, 8, 11, 0x8771F681 ); P( local.D, local.A, local.B, local.C, 8, 11, 0x8771F681 );
P( C, D, A, B, 11, 16, 0x6D9D6122 ); P( local.C, local.D, local.A, local.B, 11, 16, 0x6D9D6122 );
P( B, C, D, A, 14, 23, 0xFDE5380C ); P( local.B, local.C, local.D, local.A, 14, 23, 0xFDE5380C );
P( A, B, C, D, 1, 4, 0xA4BEEA44 ); P( local.A, local.B, local.C, local.D, 1, 4, 0xA4BEEA44 );
P( D, A, B, C, 4, 11, 0x4BDECFA9 ); P( local.D, local.A, local.B, local.C, 4, 11, 0x4BDECFA9 );
P( C, D, A, B, 7, 16, 0xF6BB4B60 ); P( local.C, local.D, local.A, local.B, 7, 16, 0xF6BB4B60 );
P( B, C, D, A, 10, 23, 0xBEBFBC70 ); P( local.B, local.C, local.D, local.A, 10, 23, 0xBEBFBC70 );
P( A, B, C, D, 13, 4, 0x289B7EC6 ); P( local.A, local.B, local.C, local.D, 13, 4, 0x289B7EC6 );
P( D, A, B, C, 0, 11, 0xEAA127FA ); P( local.D, local.A, local.B, local.C, 0, 11, 0xEAA127FA );
P( C, D, A, B, 3, 16, 0xD4EF3085 ); P( local.C, local.D, local.A, local.B, 3, 16, 0xD4EF3085 );
P( B, C, D, A, 6, 23, 0x04881D05 ); P( local.B, local.C, local.D, local.A, 6, 23, 0x04881D05 );
P( A, B, C, D, 9, 4, 0xD9D4D039 ); P( local.A, local.B, local.C, local.D, 9, 4, 0xD9D4D039 );
P( D, A, B, C, 12, 11, 0xE6DB99E5 ); P( local.D, local.A, local.B, local.C, 12, 11, 0xE6DB99E5 );
P( C, D, A, B, 15, 16, 0x1FA27CF8 ); P( local.C, local.D, local.A, local.B, 15, 16, 0x1FA27CF8 );
P( B, C, D, A, 2, 23, 0xC4AC5665 ); P( local.B, local.C, local.D, local.A, 2, 23, 0xC4AC5665 );
#undef F #undef F
#define F(x,y,z) ((y) ^ ((x) | ~(z))) #define F(x,y,z) ((y) ^ ((x) | ~(z)))
P( A, B, C, D, 0, 6, 0xF4292244 ); P( local.A, local.B, local.C, local.D, 0, 6, 0xF4292244 );
P( D, A, B, C, 7, 10, 0x432AFF97 ); P( local.D, local.A, local.B, local.C, 7, 10, 0x432AFF97 );
P( C, D, A, B, 14, 15, 0xAB9423A7 ); P( local.C, local.D, local.A, local.B, 14, 15, 0xAB9423A7 );
P( B, C, D, A, 5, 21, 0xFC93A039 ); P( local.B, local.C, local.D, local.A, 5, 21, 0xFC93A039 );
P( A, B, C, D, 12, 6, 0x655B59C3 ); P( local.A, local.B, local.C, local.D, 12, 6, 0x655B59C3 );
P( D, A, B, C, 3, 10, 0x8F0CCC92 ); P( local.D, local.A, local.B, local.C, 3, 10, 0x8F0CCC92 );
P( C, D, A, B, 10, 15, 0xFFEFF47D ); P( local.C, local.D, local.A, local.B, 10, 15, 0xFFEFF47D );
P( B, C, D, A, 1, 21, 0x85845DD1 ); P( local.B, local.C, local.D, local.A, 1, 21, 0x85845DD1 );
P( A, B, C, D, 8, 6, 0x6FA87E4F ); P( local.A, local.B, local.C, local.D, 8, 6, 0x6FA87E4F );
P( D, A, B, C, 15, 10, 0xFE2CE6E0 ); P( local.D, local.A, local.B, local.C, 15, 10, 0xFE2CE6E0 );
P( C, D, A, B, 6, 15, 0xA3014314 ); P( local.C, local.D, local.A, local.B, 6, 15, 0xA3014314 );
P( B, C, D, A, 13, 21, 0x4E0811A1 ); P( local.B, local.C, local.D, local.A, 13, 21, 0x4E0811A1 );
P( A, B, C, D, 4, 6, 0xF7537E82 ); P( local.A, local.B, local.C, local.D, 4, 6, 0xF7537E82 );
P( D, A, B, C, 11, 10, 0xBD3AF235 ); P( local.D, local.A, local.B, local.C, 11, 10, 0xBD3AF235 );
P( C, D, A, B, 2, 15, 0x2AD7D2BB ); P( local.C, local.D, local.A, local.B, 2, 15, 0x2AD7D2BB );
P( B, C, D, A, 9, 21, 0xEB86D391 ); P( local.B, local.C, local.D, local.A, 9, 21, 0xEB86D391 );
#undef F #undef F
ctx->state[0] += A; ctx->state[0] += local.A;
ctx->state[1] += B; ctx->state[1] += local.B;
ctx->state[2] += C; ctx->state[2] += local.C;
ctx->state[3] += D; ctx->state[3] += local.D;
/* Zeroise variables to clear sensitive data from memory. */
mbedtls_platform_zeroize( &local, sizeof( local ) );
return( 0 ); return( 0 );
} }

View file

@ -508,8 +508,12 @@ int mbedtls_pem_write_buffer( const char *header, const char *footer,
*p++ = '\0'; *p++ = '\0';
*olen = p - buf; *olen = p - buf;
/* Clean any remaining data previously written to the buffer */
memset( buf + *olen, 0, buf_len - *olen );
mbedtls_free( encode_buf ); mbedtls_free( encode_buf );
return( 0 ); return( 0 );
} }
#endif /* MBEDTLS_PEM_WRITE_C */ #endif /* MBEDTLS_PEM_WRITE_C */
#endif /* MBEDTLS_PEM_PARSE_C || MBEDTLS_PEM_WRITE_C */ #endif /* MBEDTLS_PEM_PARSE_C || MBEDTLS_PEM_WRITE_C */

View file

@ -247,7 +247,7 @@ int mbedtls_pkcs5_pbkdf2_hmac( mbedtls_md_context_t *ctx, const unsigned char *p
unsigned int iteration_count, unsigned int iteration_count,
uint32_t key_length, unsigned char *output ) uint32_t key_length, unsigned char *output )
{ {
int ret, j; int ret = 0, j;
unsigned int i; unsigned int i;
unsigned char md1[MBEDTLS_MD_MAX_SIZE]; unsigned char md1[MBEDTLS_MD_MAX_SIZE];
unsigned char work[MBEDTLS_MD_MAX_SIZE]; unsigned char work[MBEDTLS_MD_MAX_SIZE];
@ -269,16 +269,16 @@ int mbedtls_pkcs5_pbkdf2_hmac( mbedtls_md_context_t *ctx, const unsigned char *p
// U1 ends up in work // U1 ends up in work
// //
if( ( ret = mbedtls_md_hmac_starts( ctx, password, plen ) ) != 0 ) if( ( ret = mbedtls_md_hmac_starts( ctx, password, plen ) ) != 0 )
return( ret ); goto cleanup;
if( ( ret = mbedtls_md_hmac_update( ctx, salt, slen ) ) != 0 ) if( ( ret = mbedtls_md_hmac_update( ctx, salt, slen ) ) != 0 )
return( ret ); goto cleanup;
if( ( ret = mbedtls_md_hmac_update( ctx, counter, 4 ) ) != 0 ) if( ( ret = mbedtls_md_hmac_update( ctx, counter, 4 ) ) != 0 )
return( ret ); goto cleanup;
if( ( ret = mbedtls_md_hmac_finish( ctx, work ) ) != 0 ) if( ( ret = mbedtls_md_hmac_finish( ctx, work ) ) != 0 )
return( ret ); goto cleanup;
memcpy( md1, work, md_size ); memcpy( md1, work, md_size );
@ -287,13 +287,13 @@ int mbedtls_pkcs5_pbkdf2_hmac( mbedtls_md_context_t *ctx, const unsigned char *p
// U2 ends up in md1 // U2 ends up in md1
// //
if( ( ret = mbedtls_md_hmac_starts( ctx, password, plen ) ) != 0 ) if( ( ret = mbedtls_md_hmac_starts( ctx, password, plen ) ) != 0 )
return( ret ); goto cleanup;
if( ( ret = mbedtls_md_hmac_update( ctx, md1, md_size ) ) != 0 ) if( ( ret = mbedtls_md_hmac_update( ctx, md1, md_size ) ) != 0 )
return( ret ); goto cleanup;
if( ( ret = mbedtls_md_hmac_finish( ctx, md1 ) ) != 0 ) if( ( ret = mbedtls_md_hmac_finish( ctx, md1 ) ) != 0 )
return( ret ); goto cleanup;
// U1 xor U2 // U1 xor U2
// //
@ -312,7 +312,12 @@ int mbedtls_pkcs5_pbkdf2_hmac( mbedtls_md_context_t *ctx, const unsigned char *p
break; break;
} }
return( 0 ); cleanup:
/* Zeroise buffers to clear sensitive data from memory. */
mbedtls_platform_zeroize( work, MBEDTLS_MD_MAX_SIZE );
mbedtls_platform_zeroize( md1, MBEDTLS_MD_MAX_SIZE );
return( ret );
} }
#if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_SELF_TEST)

View file

@ -692,7 +692,7 @@ int mbedtls_pk_parse_subpubkey( unsigned char **p, const unsigned char *end,
ret = MBEDTLS_ERR_PK_UNKNOWN_PK_ALG; ret = MBEDTLS_ERR_PK_UNKNOWN_PK_ALG;
if( ret == 0 && *p != end ) if( ret == 0 && *p != end )
ret = MBEDTLS_ERR_PK_INVALID_PUBKEY ret = MBEDTLS_ERR_PK_INVALID_PUBKEY +
MBEDTLS_ERR_ASN1_LENGTH_MISMATCH; MBEDTLS_ERR_ASN1_LENGTH_MISMATCH;
if( ret != 0 ) if( ret != 0 )

View file

@ -115,7 +115,7 @@ void mbedtls_platform_zeroize( void *buf, size_t len )
#if !( ( defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L ) || \ #if !( ( defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L ) || \
( defined(_POSIX_THREAD_SAFE_FUNCTIONS ) && \ ( defined(_POSIX_THREAD_SAFE_FUNCTIONS ) && \
_POSIX_THREAD_SAFE_FUNCTIONS >= 20112L ) ) _POSIX_THREAD_SAFE_FUNCTIONS >= 200112L ) )
/* /*
* This is a convenience shorthand macro to avoid checking the long * This is a convenience shorthand macro to avoid checking the long
* preprocessor conditions above. Ideally, we could expose this macro in * preprocessor conditions above. Ideally, we could expose this macro in
@ -129,7 +129,7 @@ void mbedtls_platform_zeroize( void *buf, size_t len )
#endif /* !( ( defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L ) || \ #endif /* !( ( defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L ) || \
( defined(_POSIX_THREAD_SAFE_FUNCTIONS ) && \ ( defined(_POSIX_THREAD_SAFE_FUNCTIONS ) && \
_POSIX_THREAD_SAFE_FUNCTIONS >= 20112L ) ) */ _POSIX_THREAD_SAFE_FUNCTIONS >= 200112L ) ) */
struct tm *mbedtls_platform_gmtime_r( const mbedtls_time_t *tt, struct tm *mbedtls_platform_gmtime_r( const mbedtls_time_t *tt,
struct tm *tm_buf ) struct tm *tm_buf )

View file

@ -147,30 +147,33 @@ void mbedtls_ripemd160_starts( mbedtls_ripemd160_context *ctx )
int mbedtls_internal_ripemd160_process( mbedtls_ripemd160_context *ctx, int mbedtls_internal_ripemd160_process( mbedtls_ripemd160_context *ctx,
const unsigned char data[64] ) const unsigned char data[64] )
{ {
uint32_t A, B, C, D, E, Ap, Bp, Cp, Dp, Ep, X[16]; struct
{
uint32_t A, B, C, D, E, Ap, Bp, Cp, Dp, Ep, X[16];
} local;
GET_UINT32_LE( X[ 0], data, 0 ); GET_UINT32_LE( local.X[ 0], data, 0 );
GET_UINT32_LE( X[ 1], data, 4 ); GET_UINT32_LE( local.X[ 1], data, 4 );
GET_UINT32_LE( X[ 2], data, 8 ); GET_UINT32_LE( local.X[ 2], data, 8 );
GET_UINT32_LE( X[ 3], data, 12 ); GET_UINT32_LE( local.X[ 3], data, 12 );
GET_UINT32_LE( X[ 4], data, 16 ); GET_UINT32_LE( local.X[ 4], data, 16 );
GET_UINT32_LE( X[ 5], data, 20 ); GET_UINT32_LE( local.X[ 5], data, 20 );
GET_UINT32_LE( X[ 6], data, 24 ); GET_UINT32_LE( local.X[ 6], data, 24 );
GET_UINT32_LE( X[ 7], data, 28 ); GET_UINT32_LE( local.X[ 7], data, 28 );
GET_UINT32_LE( X[ 8], data, 32 ); GET_UINT32_LE( local.X[ 8], data, 32 );
GET_UINT32_LE( X[ 9], data, 36 ); GET_UINT32_LE( local.X[ 9], data, 36 );
GET_UINT32_LE( X[10], data, 40 ); GET_UINT32_LE( local.X[10], data, 40 );
GET_UINT32_LE( X[11], data, 44 ); GET_UINT32_LE( local.X[11], data, 44 );
GET_UINT32_LE( X[12], data, 48 ); GET_UINT32_LE( local.X[12], data, 48 );
GET_UINT32_LE( X[13], data, 52 ); GET_UINT32_LE( local.X[13], data, 52 );
GET_UINT32_LE( X[14], data, 56 ); GET_UINT32_LE( local.X[14], data, 56 );
GET_UINT32_LE( X[15], data, 60 ); GET_UINT32_LE( local.X[15], data, 60 );
A = Ap = ctx->state[0]; local.A = local.Ap = ctx->state[0];
B = Bp = ctx->state[1]; local.B = local.Bp = ctx->state[1];
C = Cp = ctx->state[2]; local.C = local.Cp = ctx->state[2];
D = Dp = ctx->state[3]; local.D = local.Dp = ctx->state[3];
E = Ep = ctx->state[4]; local.E = local.Ep = ctx->state[4];
#define F1( x, y, z ) ( (x) ^ (y) ^ (z) ) #define F1( x, y, z ) ( (x) ^ (y) ^ (z) )
#define F2( x, y, z ) ( ( (x) & (y) ) | ( ~(x) & (z) ) ) #define F2( x, y, z ) ( ( (x) & (y) ) | ( ~(x) & (z) ) )
@ -180,12 +183,12 @@ int mbedtls_internal_ripemd160_process( mbedtls_ripemd160_context *ctx,
#define S( x, n ) ( ( (x) << (n) ) | ( (x) >> (32 - (n)) ) ) #define S( x, n ) ( ( (x) << (n) ) | ( (x) >> (32 - (n)) ) )
#define P( a, b, c, d, e, r, s, f, k ) \ #define P( a, b, c, d, e, r, s, f, k ) \
do \ do \
{ \ { \
(a) += f( (b), (c), (d) ) + X[r] + (k); \ (a) += f( (b), (c), (d) ) + local.X[r] + (k); \
(a) = S( (a), (s) ) + (e); \ (a) = S( (a), (s) ) + (e); \
(c) = S( (c), 10 ); \ (c) = S( (c), 10 ); \
} while( 0 ) } while( 0 )
#define P2( a, b, c, d, e, r, s, rp, sp ) \ #define P2( a, b, c, d, e, r, s, rp, sp ) \
@ -200,22 +203,22 @@ int mbedtls_internal_ripemd160_process( mbedtls_ripemd160_context *ctx,
#define K 0x00000000 #define K 0x00000000
#define Fp F5 #define Fp F5
#define Kp 0x50A28BE6 #define Kp 0x50A28BE6
P2( A, B, C, D, E, 0, 11, 5, 8 ); P2( local.A, local.B, local.C, local.D, local.E, 0, 11, 5, 8 );
P2( E, A, B, C, D, 1, 14, 14, 9 ); P2( local.E, local.A, local.B, local.C, local.D, 1, 14, 14, 9 );
P2( D, E, A, B, C, 2, 15, 7, 9 ); P2( local.D, local.E, local.A, local.B, local.C, 2, 15, 7, 9 );
P2( C, D, E, A, B, 3, 12, 0, 11 ); P2( local.C, local.D, local.E, local.A, local.B, 3, 12, 0, 11 );
P2( B, C, D, E, A, 4, 5, 9, 13 ); P2( local.B, local.C, local.D, local.E, local.A, 4, 5, 9, 13 );
P2( A, B, C, D, E, 5, 8, 2, 15 ); P2( local.A, local.B, local.C, local.D, local.E, 5, 8, 2, 15 );
P2( E, A, B, C, D, 6, 7, 11, 15 ); P2( local.E, local.A, local.B, local.C, local.D, 6, 7, 11, 15 );
P2( D, E, A, B, C, 7, 9, 4, 5 ); P2( local.D, local.E, local.A, local.B, local.C, 7, 9, 4, 5 );
P2( C, D, E, A, B, 8, 11, 13, 7 ); P2( local.C, local.D, local.E, local.A, local.B, 8, 11, 13, 7 );
P2( B, C, D, E, A, 9, 13, 6, 7 ); P2( local.B, local.C, local.D, local.E, local.A, 9, 13, 6, 7 );
P2( A, B, C, D, E, 10, 14, 15, 8 ); P2( local.A, local.B, local.C, local.D, local.E, 10, 14, 15, 8 );
P2( E, A, B, C, D, 11, 15, 8, 11 ); P2( local.E, local.A, local.B, local.C, local.D, 11, 15, 8, 11 );
P2( D, E, A, B, C, 12, 6, 1, 14 ); P2( local.D, local.E, local.A, local.B, local.C, 12, 6, 1, 14 );
P2( C, D, E, A, B, 13, 7, 10, 14 ); P2( local.C, local.D, local.E, local.A, local.B, 13, 7, 10, 14 );
P2( B, C, D, E, A, 14, 9, 3, 12 ); P2( local.B, local.C, local.D, local.E, local.A, 14, 9, 3, 12 );
P2( A, B, C, D, E, 15, 8, 12, 6 ); P2( local.A, local.B, local.C, local.D, local.E, 15, 8, 12, 6 );
#undef F #undef F
#undef K #undef K
#undef Fp #undef Fp
@ -225,22 +228,22 @@ int mbedtls_internal_ripemd160_process( mbedtls_ripemd160_context *ctx,
#define K 0x5A827999 #define K 0x5A827999
#define Fp F4 #define Fp F4
#define Kp 0x5C4DD124 #define Kp 0x5C4DD124
P2( E, A, B, C, D, 7, 7, 6, 9 ); P2( local.E, local.A, local.B, local.C, local.D, 7, 7, 6, 9 );
P2( D, E, A, B, C, 4, 6, 11, 13 ); P2( local.D, local.E, local.A, local.B, local.C, 4, 6, 11, 13 );
P2( C, D, E, A, B, 13, 8, 3, 15 ); P2( local.C, local.D, local.E, local.A, local.B, 13, 8, 3, 15 );
P2( B, C, D, E, A, 1, 13, 7, 7 ); P2( local.B, local.C, local.D, local.E, local.A, 1, 13, 7, 7 );
P2( A, B, C, D, E, 10, 11, 0, 12 ); P2( local.A, local.B, local.C, local.D, local.E, 10, 11, 0, 12 );
P2( E, A, B, C, D, 6, 9, 13, 8 ); P2( local.E, local.A, local.B, local.C, local.D, 6, 9, 13, 8 );
P2( D, E, A, B, C, 15, 7, 5, 9 ); P2( local.D, local.E, local.A, local.B, local.C, 15, 7, 5, 9 );
P2( C, D, E, A, B, 3, 15, 10, 11 ); P2( local.C, local.D, local.E, local.A, local.B, 3, 15, 10, 11 );
P2( B, C, D, E, A, 12, 7, 14, 7 ); P2( local.B, local.C, local.D, local.E, local.A, 12, 7, 14, 7 );
P2( A, B, C, D, E, 0, 12, 15, 7 ); P2( local.A, local.B, local.C, local.D, local.E, 0, 12, 15, 7 );
P2( E, A, B, C, D, 9, 15, 8, 12 ); P2( local.E, local.A, local.B, local.C, local.D, 9, 15, 8, 12 );
P2( D, E, A, B, C, 5, 9, 12, 7 ); P2( local.D, local.E, local.A, local.B, local.C, 5, 9, 12, 7 );
P2( C, D, E, A, B, 2, 11, 4, 6 ); P2( local.C, local.D, local.E, local.A, local.B, 2, 11, 4, 6 );
P2( B, C, D, E, A, 14, 7, 9, 15 ); P2( local.B, local.C, local.D, local.E, local.A, 14, 7, 9, 15 );
P2( A, B, C, D, E, 11, 13, 1, 13 ); P2( local.A, local.B, local.C, local.D, local.E, 11, 13, 1, 13 );
P2( E, A, B, C, D, 8, 12, 2, 11 ); P2( local.E, local.A, local.B, local.C, local.D, 8, 12, 2, 11 );
#undef F #undef F
#undef K #undef K
#undef Fp #undef Fp
@ -250,22 +253,22 @@ int mbedtls_internal_ripemd160_process( mbedtls_ripemd160_context *ctx,
#define K 0x6ED9EBA1 #define K 0x6ED9EBA1
#define Fp F3 #define Fp F3
#define Kp 0x6D703EF3 #define Kp 0x6D703EF3
P2( D, E, A, B, C, 3, 11, 15, 9 ); P2( local.D, local.E, local.A, local.B, local.C, 3, 11, 15, 9 );
P2( C, D, E, A, B, 10, 13, 5, 7 ); P2( local.C, local.D, local.E, local.A, local.B, 10, 13, 5, 7 );
P2( B, C, D, E, A, 14, 6, 1, 15 ); P2( local.B, local.C, local.D, local.E, local.A, 14, 6, 1, 15 );
P2( A, B, C, D, E, 4, 7, 3, 11 ); P2( local.A, local.B, local.C, local.D, local.E, 4, 7, 3, 11 );
P2( E, A, B, C, D, 9, 14, 7, 8 ); P2( local.E, local.A, local.B, local.C, local.D, 9, 14, 7, 8 );
P2( D, E, A, B, C, 15, 9, 14, 6 ); P2( local.D, local.E, local.A, local.B, local.C, 15, 9, 14, 6 );
P2( C, D, E, A, B, 8, 13, 6, 6 ); P2( local.C, local.D, local.E, local.A, local.B, 8, 13, 6, 6 );
P2( B, C, D, E, A, 1, 15, 9, 14 ); P2( local.B, local.C, local.D, local.E, local.A, 1, 15, 9, 14 );
P2( A, B, C, D, E, 2, 14, 11, 12 ); P2( local.A, local.B, local.C, local.D, local.E, 2, 14, 11, 12 );
P2( E, A, B, C, D, 7, 8, 8, 13 ); P2( local.E, local.A, local.B, local.C, local.D, 7, 8, 8, 13 );
P2( D, E, A, B, C, 0, 13, 12, 5 ); P2( local.D, local.E, local.A, local.B, local.C, 0, 13, 12, 5 );
P2( C, D, E, A, B, 6, 6, 2, 14 ); P2( local.C, local.D, local.E, local.A, local.B, 6, 6, 2, 14 );
P2( B, C, D, E, A, 13, 5, 10, 13 ); P2( local.B, local.C, local.D, local.E, local.A, 13, 5, 10, 13 );
P2( A, B, C, D, E, 11, 12, 0, 13 ); P2( local.A, local.B, local.C, local.D, local.E, 11, 12, 0, 13 );
P2( E, A, B, C, D, 5, 7, 4, 7 ); P2( local.E, local.A, local.B, local.C, local.D, 5, 7, 4, 7 );
P2( D, E, A, B, C, 12, 5, 13, 5 ); P2( local.D, local.E, local.A, local.B, local.C, 12, 5, 13, 5 );
#undef F #undef F
#undef K #undef K
#undef Fp #undef Fp
@ -275,22 +278,22 @@ int mbedtls_internal_ripemd160_process( mbedtls_ripemd160_context *ctx,
#define K 0x8F1BBCDC #define K 0x8F1BBCDC
#define Fp F2 #define Fp F2
#define Kp 0x7A6D76E9 #define Kp 0x7A6D76E9
P2( C, D, E, A, B, 1, 11, 8, 15 ); P2( local.C, local.D, local.E, local.A, local.B, 1, 11, 8, 15 );
P2( B, C, D, E, A, 9, 12, 6, 5 ); P2( local.B, local.C, local.D, local.E, local.A, 9, 12, 6, 5 );
P2( A, B, C, D, E, 11, 14, 4, 8 ); P2( local.A, local.B, local.C, local.D, local.E, 11, 14, 4, 8 );
P2( E, A, B, C, D, 10, 15, 1, 11 ); P2( local.E, local.A, local.B, local.C, local.D, 10, 15, 1, 11 );
P2( D, E, A, B, C, 0, 14, 3, 14 ); P2( local.D, local.E, local.A, local.B, local.C, 0, 14, 3, 14 );
P2( C, D, E, A, B, 8, 15, 11, 14 ); P2( local.C, local.D, local.E, local.A, local.B, 8, 15, 11, 14 );
P2( B, C, D, E, A, 12, 9, 15, 6 ); P2( local.B, local.C, local.D, local.E, local.A, 12, 9, 15, 6 );
P2( A, B, C, D, E, 4, 8, 0, 14 ); P2( local.A, local.B, local.C, local.D, local.E, 4, 8, 0, 14 );
P2( E, A, B, C, D, 13, 9, 5, 6 ); P2( local.E, local.A, local.B, local.C, local.D, 13, 9, 5, 6 );
P2( D, E, A, B, C, 3, 14, 12, 9 ); P2( local.D, local.E, local.A, local.B, local.C, 3, 14, 12, 9 );
P2( C, D, E, A, B, 7, 5, 2, 12 ); P2( local.C, local.D, local.E, local.A, local.B, 7, 5, 2, 12 );
P2( B, C, D, E, A, 15, 6, 13, 9 ); P2( local.B, local.C, local.D, local.E, local.A, 15, 6, 13, 9 );
P2( A, B, C, D, E, 14, 8, 9, 12 ); P2( local.A, local.B, local.C, local.D, local.E, 14, 8, 9, 12 );
P2( E, A, B, C, D, 5, 6, 7, 5 ); P2( local.E, local.A, local.B, local.C, local.D, 5, 6, 7, 5 );
P2( D, E, A, B, C, 6, 5, 10, 15 ); P2( local.D, local.E, local.A, local.B, local.C, 6, 5, 10, 15 );
P2( C, D, E, A, B, 2, 12, 14, 8 ); P2( local.C, local.D, local.E, local.A, local.B, 2, 12, 14, 8 );
#undef F #undef F
#undef K #undef K
#undef Fp #undef Fp
@ -300,33 +303,36 @@ int mbedtls_internal_ripemd160_process( mbedtls_ripemd160_context *ctx,
#define K 0xA953FD4E #define K 0xA953FD4E
#define Fp F1 #define Fp F1
#define Kp 0x00000000 #define Kp 0x00000000
P2( B, C, D, E, A, 4, 9, 12, 8 ); P2( local.B, local.C, local.D, local.E, local.A, 4, 9, 12, 8 );
P2( A, B, C, D, E, 0, 15, 15, 5 ); P2( local.A, local.B, local.C, local.D, local.E, 0, 15, 15, 5 );
P2( E, A, B, C, D, 5, 5, 10, 12 ); P2( local.E, local.A, local.B, local.C, local.D, 5, 5, 10, 12 );
P2( D, E, A, B, C, 9, 11, 4, 9 ); P2( local.D, local.E, local.A, local.B, local.C, 9, 11, 4, 9 );
P2( C, D, E, A, B, 7, 6, 1, 12 ); P2( local.C, local.D, local.E, local.A, local.B, 7, 6, 1, 12 );
P2( B, C, D, E, A, 12, 8, 5, 5 ); P2( local.B, local.C, local.D, local.E, local.A, 12, 8, 5, 5 );
P2( A, B, C, D, E, 2, 13, 8, 14 ); P2( local.A, local.B, local.C, local.D, local.E, 2, 13, 8, 14 );
P2( E, A, B, C, D, 10, 12, 7, 6 ); P2( local.E, local.A, local.B, local.C, local.D, 10, 12, 7, 6 );
P2( D, E, A, B, C, 14, 5, 6, 8 ); P2( local.D, local.E, local.A, local.B, local.C, 14, 5, 6, 8 );
P2( C, D, E, A, B, 1, 12, 2, 13 ); P2( local.C, local.D, local.E, local.A, local.B, 1, 12, 2, 13 );
P2( B, C, D, E, A, 3, 13, 13, 6 ); P2( local.B, local.C, local.D, local.E, local.A, 3, 13, 13, 6 );
P2( A, B, C, D, E, 8, 14, 14, 5 ); P2( local.A, local.B, local.C, local.D, local.E, 8, 14, 14, 5 );
P2( E, A, B, C, D, 11, 11, 0, 15 ); P2( local.E, local.A, local.B, local.C, local.D, 11, 11, 0, 15 );
P2( D, E, A, B, C, 6, 8, 3, 13 ); P2( local.D, local.E, local.A, local.B, local.C, 6, 8, 3, 13 );
P2( C, D, E, A, B, 15, 5, 9, 11 ); P2( local.C, local.D, local.E, local.A, local.B, 15, 5, 9, 11 );
P2( B, C, D, E, A, 13, 6, 11, 11 ); P2( local.B, local.C, local.D, local.E, local.A, 13, 6, 11, 11 );
#undef F #undef F
#undef K #undef K
#undef Fp #undef Fp
#undef Kp #undef Kp
C = ctx->state[1] + C + Dp; local.C = ctx->state[1] + local.C + local.Dp;
ctx->state[1] = ctx->state[2] + D + Ep; ctx->state[1] = ctx->state[2] + local.D + local.Ep;
ctx->state[2] = ctx->state[3] + E + Ap; ctx->state[2] = ctx->state[3] + local.E + local.Ap;
ctx->state[3] = ctx->state[4] + A + Bp; ctx->state[3] = ctx->state[4] + local.A + local.Bp;
ctx->state[4] = ctx->state[0] + B + Cp; ctx->state[4] = ctx->state[0] + local.B + local.Cp;
ctx->state[0] = C; ctx->state[0] = local.C;
/* Zeroise variables to clear sensitive data from memory. */
mbedtls_platform_zeroize( &local, sizeof( local ) );
return( 0 ); return( 0 );
} }

View file

@ -841,15 +841,14 @@ static int rsa_prepare_blinding( mbedtls_rsa_context *ctx,
* which one, we just loop and choose new values for both of them. * which one, we just loop and choose new values for both of them.
* (Each iteration succeeds with overwhelming probability.) */ * (Each iteration succeeds with overwhelming probability.) */
ret = mbedtls_mpi_inv_mod( &ctx->Vi, &ctx->Vi, &ctx->N ); ret = mbedtls_mpi_inv_mod( &ctx->Vi, &ctx->Vi, &ctx->N );
if( ret == MBEDTLS_ERR_MPI_NOT_ACCEPTABLE ) if( ret != 0 && ret != MBEDTLS_ERR_MPI_NOT_ACCEPTABLE )
continue;
if( ret != 0 )
goto cleanup; goto cleanup;
/* Finish the computation of Vf^-1 = R * (R Vf)^-1 */ } while( ret == MBEDTLS_ERR_MPI_NOT_ACCEPTABLE );
MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->Vi, &ctx->Vi, &R ) );
MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->Vi, &ctx->Vi, &ctx->N ) ); /* Finish the computation of Vf^-1 = R * (R Vf)^-1 */
} while( 0 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->Vi, &ctx->Vi, &R ) );
MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->Vi, &ctx->Vi, &ctx->N ) );
/* Blinding value: Vi = Vf^(-e) mod N /* Blinding value: Vi = Vf^(-e) mod N
* (Vi already contains Vf^-1 at this point) */ * (Vi already contains Vf^-1 at this point) */

View file

@ -155,35 +155,40 @@ void mbedtls_sha1_starts( mbedtls_sha1_context *ctx )
int mbedtls_internal_sha1_process( mbedtls_sha1_context *ctx, int mbedtls_internal_sha1_process( mbedtls_sha1_context *ctx,
const unsigned char data[64] ) const unsigned char data[64] )
{ {
uint32_t temp, W[16], A, B, C, D, E; struct
{
uint32_t temp, W[16], A, B, C, D, E;
} local;
SHA1_VALIDATE_RET( ctx != NULL ); SHA1_VALIDATE_RET( ctx != NULL );
SHA1_VALIDATE_RET( (const unsigned char *)data != NULL ); SHA1_VALIDATE_RET( (const unsigned char *)data != NULL );
GET_UINT32_BE( W[ 0], data, 0 ); GET_UINT32_BE( local.W[ 0], data, 0 );
GET_UINT32_BE( W[ 1], data, 4 ); GET_UINT32_BE( local.W[ 1], data, 4 );
GET_UINT32_BE( W[ 2], data, 8 ); GET_UINT32_BE( local.W[ 2], data, 8 );
GET_UINT32_BE( W[ 3], data, 12 ); GET_UINT32_BE( local.W[ 3], data, 12 );
GET_UINT32_BE( W[ 4], data, 16 ); GET_UINT32_BE( local.W[ 4], data, 16 );
GET_UINT32_BE( W[ 5], data, 20 ); GET_UINT32_BE( local.W[ 5], data, 20 );
GET_UINT32_BE( W[ 6], data, 24 ); GET_UINT32_BE( local.W[ 6], data, 24 );
GET_UINT32_BE( W[ 7], data, 28 ); GET_UINT32_BE( local.W[ 7], data, 28 );
GET_UINT32_BE( W[ 8], data, 32 ); GET_UINT32_BE( local.W[ 8], data, 32 );
GET_UINT32_BE( W[ 9], data, 36 ); GET_UINT32_BE( local.W[ 9], data, 36 );
GET_UINT32_BE( W[10], data, 40 ); GET_UINT32_BE( local.W[10], data, 40 );
GET_UINT32_BE( W[11], data, 44 ); GET_UINT32_BE( local.W[11], data, 44 );
GET_UINT32_BE( W[12], data, 48 ); GET_UINT32_BE( local.W[12], data, 48 );
GET_UINT32_BE( W[13], data, 52 ); GET_UINT32_BE( local.W[13], data, 52 );
GET_UINT32_BE( W[14], data, 56 ); GET_UINT32_BE( local.W[14], data, 56 );
GET_UINT32_BE( W[15], data, 60 ); GET_UINT32_BE( local.W[15], data, 60 );
#define S(x,n) (((x) << (n)) | (((x) & 0xFFFFFFFF) >> (32 - (n)))) #define S(x,n) (((x) << (n)) | (((x) & 0xFFFFFFFF) >> (32 - (n))))
#define R(t) \ #define R(t) \
( \ ( \
temp = W[( (t) - 3 ) & 0x0F] ^ W[( (t) - 8 ) & 0x0F] ^ \ local.temp = local.W[( (t) - 3 ) & 0x0F] ^ \
W[( (t) - 14 ) & 0x0F] ^ W[ (t) & 0x0F], \ local.W[( (t) - 8 ) & 0x0F] ^ \
( W[(t) & 0x0F] = S(temp,1) ) \ local.W[( (t) - 14 ) & 0x0F] ^ \
local.W[ (t) & 0x0F], \
( local.W[(t) & 0x0F] = S(local.temp,1) ) \
) )
#define P(a,b,c,d,e,x) \ #define P(a,b,c,d,e,x) \
@ -193,35 +198,35 @@ int mbedtls_internal_sha1_process( mbedtls_sha1_context *ctx,
(b) = S((b),30); \ (b) = S((b),30); \
} while( 0 ) } while( 0 )
A = ctx->state[0]; local.A = ctx->state[0];
B = ctx->state[1]; local.B = ctx->state[1];
C = ctx->state[2]; local.C = ctx->state[2];
D = ctx->state[3]; local.D = ctx->state[3];
E = ctx->state[4]; local.E = ctx->state[4];
#define F(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) #define F(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
#define K 0x5A827999 #define K 0x5A827999
P( A, B, C, D, E, W[0] ); P( local.A, local.B, local.C, local.D, local.E, local.W[0] );
P( E, A, B, C, D, W[1] ); P( local.E, local.A, local.B, local.C, local.D, local.W[1] );
P( D, E, A, B, C, W[2] ); P( local.D, local.E, local.A, local.B, local.C, local.W[2] );
P( C, D, E, A, B, W[3] ); P( local.C, local.D, local.E, local.A, local.B, local.W[3] );
P( B, C, D, E, A, W[4] ); P( local.B, local.C, local.D, local.E, local.A, local.W[4] );
P( A, B, C, D, E, W[5] ); P( local.A, local.B, local.C, local.D, local.E, local.W[5] );
P( E, A, B, C, D, W[6] ); P( local.E, local.A, local.B, local.C, local.D, local.W[6] );
P( D, E, A, B, C, W[7] ); P( local.D, local.E, local.A, local.B, local.C, local.W[7] );
P( C, D, E, A, B, W[8] ); P( local.C, local.D, local.E, local.A, local.B, local.W[8] );
P( B, C, D, E, A, W[9] ); P( local.B, local.C, local.D, local.E, local.A, local.W[9] );
P( A, B, C, D, E, W[10] ); P( local.A, local.B, local.C, local.D, local.E, local.W[10] );
P( E, A, B, C, D, W[11] ); P( local.E, local.A, local.B, local.C, local.D, local.W[11] );
P( D, E, A, B, C, W[12] ); P( local.D, local.E, local.A, local.B, local.C, local.W[12] );
P( C, D, E, A, B, W[13] ); P( local.C, local.D, local.E, local.A, local.B, local.W[13] );
P( B, C, D, E, A, W[14] ); P( local.B, local.C, local.D, local.E, local.A, local.W[14] );
P( A, B, C, D, E, W[15] ); P( local.A, local.B, local.C, local.D, local.E, local.W[15] );
P( E, A, B, C, D, R(16) ); P( local.E, local.A, local.B, local.C, local.D, R(16) );
P( D, E, A, B, C, R(17) ); P( local.D, local.E, local.A, local.B, local.C, R(17) );
P( C, D, E, A, B, R(18) ); P( local.C, local.D, local.E, local.A, local.B, R(18) );
P( B, C, D, E, A, R(19) ); P( local.B, local.C, local.D, local.E, local.A, R(19) );
#undef K #undef K
#undef F #undef F
@ -229,26 +234,26 @@ int mbedtls_internal_sha1_process( mbedtls_sha1_context *ctx,
#define F(x,y,z) ((x) ^ (y) ^ (z)) #define F(x,y,z) ((x) ^ (y) ^ (z))
#define K 0x6ED9EBA1 #define K 0x6ED9EBA1
P( A, B, C, D, E, R(20) ); P( local.A, local.B, local.C, local.D, local.E, R(20) );
P( E, A, B, C, D, R(21) ); P( local.E, local.A, local.B, local.C, local.D, R(21) );
P( D, E, A, B, C, R(22) ); P( local.D, local.E, local.A, local.B, local.C, R(22) );
P( C, D, E, A, B, R(23) ); P( local.C, local.D, local.E, local.A, local.B, R(23) );
P( B, C, D, E, A, R(24) ); P( local.B, local.C, local.D, local.E, local.A, R(24) );
P( A, B, C, D, E, R(25) ); P( local.A, local.B, local.C, local.D, local.E, R(25) );
P( E, A, B, C, D, R(26) ); P( local.E, local.A, local.B, local.C, local.D, R(26) );
P( D, E, A, B, C, R(27) ); P( local.D, local.E, local.A, local.B, local.C, R(27) );
P( C, D, E, A, B, R(28) ); P( local.C, local.D, local.E, local.A, local.B, R(28) );
P( B, C, D, E, A, R(29) ); P( local.B, local.C, local.D, local.E, local.A, R(29) );
P( A, B, C, D, E, R(30) ); P( local.A, local.B, local.C, local.D, local.E, R(30) );
P( E, A, B, C, D, R(31) ); P( local.E, local.A, local.B, local.C, local.D, R(31) );
P( D, E, A, B, C, R(32) ); P( local.D, local.E, local.A, local.B, local.C, R(32) );
P( C, D, E, A, B, R(33) ); P( local.C, local.D, local.E, local.A, local.B, R(33) );
P( B, C, D, E, A, R(34) ); P( local.B, local.C, local.D, local.E, local.A, R(34) );
P( A, B, C, D, E, R(35) ); P( local.A, local.B, local.C, local.D, local.E, R(35) );
P( E, A, B, C, D, R(36) ); P( local.E, local.A, local.B, local.C, local.D, R(36) );
P( D, E, A, B, C, R(37) ); P( local.D, local.E, local.A, local.B, local.C, R(37) );
P( C, D, E, A, B, R(38) ); P( local.C, local.D, local.E, local.A, local.B, R(38) );
P( B, C, D, E, A, R(39) ); P( local.B, local.C, local.D, local.E, local.A, R(39) );
#undef K #undef K
#undef F #undef F
@ -256,26 +261,26 @@ int mbedtls_internal_sha1_process( mbedtls_sha1_context *ctx,
#define F(x,y,z) (((x) & (y)) | ((z) & ((x) | (y)))) #define F(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))
#define K 0x8F1BBCDC #define K 0x8F1BBCDC
P( A, B, C, D, E, R(40) ); P( local.A, local.B, local.C, local.D, local.E, R(40) );
P( E, A, B, C, D, R(41) ); P( local.E, local.A, local.B, local.C, local.D, R(41) );
P( D, E, A, B, C, R(42) ); P( local.D, local.E, local.A, local.B, local.C, R(42) );
P( C, D, E, A, B, R(43) ); P( local.C, local.D, local.E, local.A, local.B, R(43) );
P( B, C, D, E, A, R(44) ); P( local.B, local.C, local.D, local.E, local.A, R(44) );
P( A, B, C, D, E, R(45) ); P( local.A, local.B, local.C, local.D, local.E, R(45) );
P( E, A, B, C, D, R(46) ); P( local.E, local.A, local.B, local.C, local.D, R(46) );
P( D, E, A, B, C, R(47) ); P( local.D, local.E, local.A, local.B, local.C, R(47) );
P( C, D, E, A, B, R(48) ); P( local.C, local.D, local.E, local.A, local.B, R(48) );
P( B, C, D, E, A, R(49) ); P( local.B, local.C, local.D, local.E, local.A, R(49) );
P( A, B, C, D, E, R(50) ); P( local.A, local.B, local.C, local.D, local.E, R(50) );
P( E, A, B, C, D, R(51) ); P( local.E, local.A, local.B, local.C, local.D, R(51) );
P( D, E, A, B, C, R(52) ); P( local.D, local.E, local.A, local.B, local.C, R(52) );
P( C, D, E, A, B, R(53) ); P( local.C, local.D, local.E, local.A, local.B, R(53) );
P( B, C, D, E, A, R(54) ); P( local.B, local.C, local.D, local.E, local.A, R(54) );
P( A, B, C, D, E, R(55) ); P( local.A, local.B, local.C, local.D, local.E, R(55) );
P( E, A, B, C, D, R(56) ); P( local.E, local.A, local.B, local.C, local.D, R(56) );
P( D, E, A, B, C, R(57) ); P( local.D, local.E, local.A, local.B, local.C, R(57) );
P( C, D, E, A, B, R(58) ); P( local.C, local.D, local.E, local.A, local.B, R(58) );
P( B, C, D, E, A, R(59) ); P( local.B, local.C, local.D, local.E, local.A, R(59) );
#undef K #undef K
#undef F #undef F
@ -283,35 +288,38 @@ int mbedtls_internal_sha1_process( mbedtls_sha1_context *ctx,
#define F(x,y,z) ((x) ^ (y) ^ (z)) #define F(x,y,z) ((x) ^ (y) ^ (z))
#define K 0xCA62C1D6 #define K 0xCA62C1D6
P( A, B, C, D, E, R(60) ); P( local.A, local.B, local.C, local.D, local.E, R(60) );
P( E, A, B, C, D, R(61) ); P( local.E, local.A, local.B, local.C, local.D, R(61) );
P( D, E, A, B, C, R(62) ); P( local.D, local.E, local.A, local.B, local.C, R(62) );
P( C, D, E, A, B, R(63) ); P( local.C, local.D, local.E, local.A, local.B, R(63) );
P( B, C, D, E, A, R(64) ); P( local.B, local.C, local.D, local.E, local.A, R(64) );
P( A, B, C, D, E, R(65) ); P( local.A, local.B, local.C, local.D, local.E, R(65) );
P( E, A, B, C, D, R(66) ); P( local.E, local.A, local.B, local.C, local.D, R(66) );
P( D, E, A, B, C, R(67) ); P( local.D, local.E, local.A, local.B, local.C, R(67) );
P( C, D, E, A, B, R(68) ); P( local.C, local.D, local.E, local.A, local.B, R(68) );
P( B, C, D, E, A, R(69) ); P( local.B, local.C, local.D, local.E, local.A, R(69) );
P( A, B, C, D, E, R(70) ); P( local.A, local.B, local.C, local.D, local.E, R(70) );
P( E, A, B, C, D, R(71) ); P( local.E, local.A, local.B, local.C, local.D, R(71) );
P( D, E, A, B, C, R(72) ); P( local.D, local.E, local.A, local.B, local.C, R(72) );
P( C, D, E, A, B, R(73) ); P( local.C, local.D, local.E, local.A, local.B, R(73) );
P( B, C, D, E, A, R(74) ); P( local.B, local.C, local.D, local.E, local.A, R(74) );
P( A, B, C, D, E, R(75) ); P( local.A, local.B, local.C, local.D, local.E, R(75) );
P( E, A, B, C, D, R(76) ); P( local.E, local.A, local.B, local.C, local.D, R(76) );
P( D, E, A, B, C, R(77) ); P( local.D, local.E, local.A, local.B, local.C, R(77) );
P( C, D, E, A, B, R(78) ); P( local.C, local.D, local.E, local.A, local.B, R(78) );
P( B, C, D, E, A, R(79) ); P( local.B, local.C, local.D, local.E, local.A, R(79) );
#undef K #undef K
#undef F #undef F
ctx->state[0] += A; ctx->state[0] += local.A;
ctx->state[1] += B; ctx->state[1] += local.B;
ctx->state[2] += C; ctx->state[2] += local.C;
ctx->state[3] += D; ctx->state[3] += local.D;
ctx->state[4] += E; ctx->state[4] += local.E;
/* Zeroise buffers and variables to clear sensitive data from memory. */
mbedtls_platform_zeroize( &local, sizeof( local ) );
return( 0 ); return( 0 );
} }

View file

@ -209,77 +209,104 @@ static const uint32_t K[] =
#define F0(x,y,z) (((x) & (y)) | ((z) & ((x) | (y)))) #define F0(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))
#define F1(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) #define F1(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
#define R(t) \ #define R(t) \
( \ ( \
W[t] = S1(W[(t) - 2]) + W[(t) - 7] + \ local.W[t] = S1(local.W[(t) - 2]) + local.W[(t) - 7] + \
S0(W[(t) - 15]) + W[(t) - 16] \ S0(local.W[(t) - 15]) + local.W[(t) - 16] \
) )
#define P(a,b,c,d,e,f,g,h,x,K) \ #define P(a,b,c,d,e,f,g,h,x,K) \
do \ do \
{ \ { \
temp1 = (h) + S3(e) + F1((e),(f),(g)) + (K) + (x); \ local.temp1 = (h) + S3(e) + F1((e),(f),(g)) + (K) + (x); \
temp2 = S2(a) + F0((a),(b),(c)); \ local.temp2 = S2(a) + F0((a),(b),(c)); \
(d) += temp1; (h) = temp1 + temp2; \ (d) += local.temp1; (h) = local.temp1 + local.temp2; \
} while( 0 ) } while( 0 )
int mbedtls_internal_sha256_process( mbedtls_sha256_context *ctx, int mbedtls_internal_sha256_process( mbedtls_sha256_context *ctx,
const unsigned char data[64] ) const unsigned char data[64] )
{ {
uint32_t temp1, temp2, W[64]; struct
uint32_t A[8]; {
uint32_t temp1, temp2, W[64];
uint32_t A[8];
} local;
unsigned int i; unsigned int i;
SHA256_VALIDATE_RET( ctx != NULL ); SHA256_VALIDATE_RET( ctx != NULL );
SHA256_VALIDATE_RET( (const unsigned char *)data != NULL ); SHA256_VALIDATE_RET( (const unsigned char *)data != NULL );
for( i = 0; i < 8; i++ ) for( i = 0; i < 8; i++ )
A[i] = ctx->state[i]; local.A[i] = ctx->state[i];
#if defined(MBEDTLS_SHA256_SMALLER) #if defined(MBEDTLS_SHA256_SMALLER)
for( i = 0; i < 64; i++ ) for( i = 0; i < 64; i++ )
{ {
if( i < 16 ) if( i < 16 )
GET_UINT32_BE( W[i], data, 4 * i ); GET_UINT32_BE( local.W[i], data, 4 * i );
else else
R( i ); R( i );
P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i], K[i] ); P( local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
local.A[5], local.A[6], local.A[7], local.W[i], K[i] );
temp1 = A[7]; A[7] = A[6]; A[6] = A[5]; A[5] = A[4]; A[4] = A[3]; local.temp1 = local.A[7]; local.A[7] = local.A[6];
A[3] = A[2]; A[2] = A[1]; A[1] = A[0]; A[0] = temp1; local.A[6] = local.A[5]; local.A[5] = local.A[4];
local.A[4] = local.A[3]; local.A[3] = local.A[2];
local.A[2] = local.A[1]; local.A[1] = local.A[0];
local.A[0] = local.temp1;
} }
#else /* MBEDTLS_SHA256_SMALLER */ #else /* MBEDTLS_SHA256_SMALLER */
for( i = 0; i < 16; i++ ) for( i = 0; i < 16; i++ )
GET_UINT32_BE( W[i], data, 4 * i ); GET_UINT32_BE( local.W[i], data, 4 * i );
for( i = 0; i < 16; i += 8 ) for( i = 0; i < 16; i += 8 )
{ {
P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i+0], K[i+0] ); P( local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], W[i+1], K[i+1] ); local.A[5], local.A[6], local.A[7], local.W[i+0], K[i+0] );
P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], W[i+2], K[i+2] ); P( local.A[7], local.A[0], local.A[1], local.A[2], local.A[3],
P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], W[i+3], K[i+3] ); local.A[4], local.A[5], local.A[6], local.W[i+1], K[i+1] );
P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], W[i+4], K[i+4] ); P( local.A[6], local.A[7], local.A[0], local.A[1], local.A[2],
P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], W[i+5], K[i+5] ); local.A[3], local.A[4], local.A[5], local.W[i+2], K[i+2] );
P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], W[i+6], K[i+6] ); P( local.A[5], local.A[6], local.A[7], local.A[0], local.A[1],
P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], W[i+7], K[i+7] ); local.A[2], local.A[3], local.A[4], local.W[i+3], K[i+3] );
P( local.A[4], local.A[5], local.A[6], local.A[7], local.A[0],
local.A[1], local.A[2], local.A[3], local.W[i+4], K[i+4] );
P( local.A[3], local.A[4], local.A[5], local.A[6], local.A[7],
local.A[0], local.A[1], local.A[2], local.W[i+5], K[i+5] );
P( local.A[2], local.A[3], local.A[4], local.A[5], local.A[6],
local.A[7], local.A[0], local.A[1], local.W[i+6], K[i+6] );
P( local.A[1], local.A[2], local.A[3], local.A[4], local.A[5],
local.A[6], local.A[7], local.A[0], local.W[i+7], K[i+7] );
} }
for( i = 16; i < 64; i += 8 ) for( i = 16; i < 64; i += 8 )
{ {
P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], R(i+0), K[i+0] ); P( local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], R(i+1), K[i+1] ); local.A[5], local.A[6], local.A[7], R(i+0), K[i+0] );
P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], R(i+2), K[i+2] ); P( local.A[7], local.A[0], local.A[1], local.A[2], local.A[3],
P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], R(i+3), K[i+3] ); local.A[4], local.A[5], local.A[6], R(i+1), K[i+1] );
P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], R(i+4), K[i+4] ); P( local.A[6], local.A[7], local.A[0], local.A[1], local.A[2],
P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], R(i+5), K[i+5] ); local.A[3], local.A[4], local.A[5], R(i+2), K[i+2] );
P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], R(i+6), K[i+6] ); P( local.A[5], local.A[6], local.A[7], local.A[0], local.A[1],
P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], R(i+7), K[i+7] ); local.A[2], local.A[3], local.A[4], R(i+3), K[i+3] );
P( local.A[4], local.A[5], local.A[6], local.A[7], local.A[0],
local.A[1], local.A[2], local.A[3], R(i+4), K[i+4] );
P( local.A[3], local.A[4], local.A[5], local.A[6], local.A[7],
local.A[0], local.A[1], local.A[2], R(i+5), K[i+5] );
P( local.A[2], local.A[3], local.A[4], local.A[5], local.A[6],
local.A[7], local.A[0], local.A[1], R(i+6), K[i+6] );
P( local.A[1], local.A[2], local.A[3], local.A[4], local.A[5],
local.A[6], local.A[7], local.A[0], R(i+7), K[i+7] );
} }
#endif /* MBEDTLS_SHA256_SMALLER */ #endif /* MBEDTLS_SHA256_SMALLER */
for( i = 0; i < 8; i++ ) for( i = 0; i < 8; i++ )
ctx->state[i] += A[i]; ctx->state[i] += local.A[i];
/* Zeroise buffers and variables to clear sensitive data from memory. */
mbedtls_platform_zeroize( &local, sizeof( local ) );
return( 0 ); return( 0 );
} }

View file

@ -243,8 +243,11 @@ int mbedtls_internal_sha512_process( mbedtls_sha512_context *ctx,
const unsigned char data[128] ) const unsigned char data[128] )
{ {
int i; int i;
uint64_t temp1, temp2, W[80]; struct
uint64_t A, B, C, D, E, F, G, H; {
uint64_t temp1, temp2, W[80];
uint64_t A, B, C, D, E, F, G, H;
} local;
SHA512_VALIDATE_RET( ctx != NULL ); SHA512_VALIDATE_RET( ctx != NULL );
SHA512_VALIDATE_RET( (const unsigned char *)data != NULL ); SHA512_VALIDATE_RET( (const unsigned char *)data != NULL );
@ -261,56 +264,67 @@ int mbedtls_internal_sha512_process( mbedtls_sha512_context *ctx,
#define F0(x,y,z) (((x) & (y)) | ((z) & ((x) | (y)))) #define F0(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))
#define F1(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) #define F1(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
#define P(a,b,c,d,e,f,g,h,x,K) \ #define P(a,b,c,d,e,f,g,h,x,K) \
do \ do \
{ \ { \
temp1 = (h) + S3(e) + F1((e),(f),(g)) + (K) + (x); \ local.temp1 = (h) + S3(e) + F1((e),(f),(g)) + (K) + (x); \
temp2 = S2(a) + F0((a),(b),(c)); \ local.temp2 = S2(a) + F0((a),(b),(c)); \
(d) += temp1; (h) = temp1 + temp2; \ (d) += local.temp1; (h) = local.temp1 + local.temp2; \
} while( 0 ) } while( 0 )
for( i = 0; i < 16; i++ ) for( i = 0; i < 16; i++ )
{ {
GET_UINT64_BE( W[i], data, i << 3 ); GET_UINT64_BE( local.W[i], data, i << 3 );
} }
for( ; i < 80; i++ ) for( ; i < 80; i++ )
{ {
W[i] = S1(W[i - 2]) + W[i - 7] + local.W[i] = S1(local.W[i - 2]) + local.W[i - 7] +
S0(W[i - 15]) + W[i - 16]; S0(local.W[i - 15]) + local.W[i - 16];
} }
A = ctx->state[0]; local.A = ctx->state[0];
B = ctx->state[1]; local.B = ctx->state[1];
C = ctx->state[2]; local.C = ctx->state[2];
D = ctx->state[3]; local.D = ctx->state[3];
E = ctx->state[4]; local.E = ctx->state[4];
F = ctx->state[5]; local.F = ctx->state[5];
G = ctx->state[6]; local.G = ctx->state[6];
H = ctx->state[7]; local.H = ctx->state[7];
i = 0; i = 0;
do do
{ {
P( A, B, C, D, E, F, G, H, W[i], K[i] ); i++; P( local.A, local.B, local.C, local.D, local.E,
P( H, A, B, C, D, E, F, G, W[i], K[i] ); i++; local.F, local.G, local.H, local.W[i], K[i] ); i++;
P( G, H, A, B, C, D, E, F, W[i], K[i] ); i++; P( local.H, local.A, local.B, local.C, local.D,
P( F, G, H, A, B, C, D, E, W[i], K[i] ); i++; local.E, local.F, local.G, local.W[i], K[i] ); i++;
P( E, F, G, H, A, B, C, D, W[i], K[i] ); i++; P( local.G, local.H, local.A, local.B, local.C,
P( D, E, F, G, H, A, B, C, W[i], K[i] ); i++; local.D, local.E, local.F, local.W[i], K[i] ); i++;
P( C, D, E, F, G, H, A, B, W[i], K[i] ); i++; P( local.F, local.G, local.H, local.A, local.B,
P( B, C, D, E, F, G, H, A, W[i], K[i] ); i++; local.C, local.D, local.E, local.W[i], K[i] ); i++;
P( local.E, local.F, local.G, local.H, local.A,
local.B, local.C, local.D, local.W[i], K[i] ); i++;
P( local.D, local.E, local.F, local.G, local.H,
local.A, local.B, local.C, local.W[i], K[i] ); i++;
P( local.C, local.D, local.E, local.F, local.G,
local.H, local.A, local.B, local.W[i], K[i] ); i++;
P( local.B, local.C, local.D, local.E, local.F,
local.G, local.H, local.A, local.W[i], K[i] ); i++;
} }
while( i < 80 ); while( i < 80 );
ctx->state[0] += A; ctx->state[0] += local.A;
ctx->state[1] += B; ctx->state[1] += local.B;
ctx->state[2] += C; ctx->state[2] += local.C;
ctx->state[3] += D; ctx->state[3] += local.D;
ctx->state[4] += E; ctx->state[4] += local.E;
ctx->state[5] += F; ctx->state[5] += local.F;
ctx->state[6] += G; ctx->state[6] += local.G;
ctx->state[7] += H; ctx->state[7] += local.H;
/* Zeroise buffers and variables to clear sensitive data from memory. */
mbedtls_platform_zeroize( &local, sizeof( local ) );
return( 0 ); return( 0 );
} }

View file

@ -3587,11 +3587,12 @@ static int ssl_parse_encrypted_pms( mbedtls_ssl_context *ssl,
/* In case of a failure in decryption, the decryption may write less than /* In case of a failure in decryption, the decryption may write less than
* 2 bytes of output, but we always read the first two bytes. It doesn't * 2 bytes of output, but we always read the first two bytes. It doesn't
* matter in the end because diff will be nonzero in that case due to * matter in the end because diff will be nonzero in that case due to
* peer_pmslen being less than 48, and we only care whether diff is 0. * ret being nonzero, and we only care whether diff is 0.
* But do initialize peer_pms for robustness anyway. This also makes * But do initialize peer_pms and peer_pmslen for robustness anyway. This
* memory analyzers happy (don't access uninitialized memory, even * also makes memory analyzers happy (don't access uninitialized memory,
* if it's an unsigned char). */ * even if it's an unsigned char). */
peer_pms[0] = peer_pms[1] = ~0; peer_pms[0] = peer_pms[1] = ~0;
peer_pmslen = 0;
ret = ssl_decrypt_encrypted_pms( ssl, p, end, ret = ssl_decrypt_encrypted_pms( ssl, p, end,
peer_pms, peer_pms,

View file

@ -621,7 +621,7 @@ static void ssl_calc_finished_tls( mbedtls_ssl_context *, unsigned char *, int )
#if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
#if defined(MBEDTLS_SHA256_C) #if defined(MBEDTLS_SHA256_C)
static void ssl_update_checksum_sha256( mbedtls_ssl_context *, const unsigned char *, size_t ); static void ssl_update_checksum_sha256( mbedtls_ssl_context *, const unsigned char *, size_t );
static void ssl_calc_verify_tls_sha256( mbedtls_ssl_context *,unsigned char * ); static void ssl_calc_verify_tls_sha256( mbedtls_ssl_context *, unsigned char * );
static void ssl_calc_finished_tls_sha256( mbedtls_ssl_context *,unsigned char *, int ); static void ssl_calc_finished_tls_sha256( mbedtls_ssl_context *,unsigned char *, int );
#endif #endif
@ -1142,7 +1142,7 @@ int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl )
} }
#if defined(MBEDTLS_SSL_PROTO_SSL3) #if defined(MBEDTLS_SSL_PROTO_SSL3)
void ssl_calc_verify_ssl( mbedtls_ssl_context *ssl, unsigned char hash[36] ) void ssl_calc_verify_ssl( mbedtls_ssl_context *ssl, unsigned char *hash )
{ {
mbedtls_md5_context md5; mbedtls_md5_context md5;
mbedtls_sha1_context sha1; mbedtls_sha1_context sha1;
@ -1191,7 +1191,7 @@ void ssl_calc_verify_ssl( mbedtls_ssl_context *ssl, unsigned char hash[36] )
#endif /* MBEDTLS_SSL_PROTO_SSL3 */ #endif /* MBEDTLS_SSL_PROTO_SSL3 */
#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
void ssl_calc_verify_tls( mbedtls_ssl_context *ssl, unsigned char hash[36] ) void ssl_calc_verify_tls( mbedtls_ssl_context *ssl, unsigned char *hash )
{ {
mbedtls_md5_context md5; mbedtls_md5_context md5;
mbedtls_sha1_context sha1; mbedtls_sha1_context sha1;
@ -1219,7 +1219,7 @@ void ssl_calc_verify_tls( mbedtls_ssl_context *ssl, unsigned char hash[36] )
#if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
#if defined(MBEDTLS_SHA256_C) #if defined(MBEDTLS_SHA256_C)
void ssl_calc_verify_tls_sha256( mbedtls_ssl_context *ssl, unsigned char hash[32] ) void ssl_calc_verify_tls_sha256( mbedtls_ssl_context *ssl, unsigned char *hash )
{ {
mbedtls_sha256_context sha256; mbedtls_sha256_context sha256;
@ -1240,7 +1240,7 @@ void ssl_calc_verify_tls_sha256( mbedtls_ssl_context *ssl, unsigned char hash[32
#endif /* MBEDTLS_SHA256_C */ #endif /* MBEDTLS_SHA256_C */
#if defined(MBEDTLS_SHA512_C) #if defined(MBEDTLS_SHA512_C)
void ssl_calc_verify_tls_sha384( mbedtls_ssl_context *ssl, unsigned char hash[48] ) void ssl_calc_verify_tls_sha384( mbedtls_ssl_context *ssl, unsigned char *hash )
{ {
mbedtls_sha512_context sha512; mbedtls_sha512_context sha512;
@ -6363,6 +6363,9 @@ static void ssl_calc_finished_tls_sha256(
#endif /* MBEDTLS_SHA256_C */ #endif /* MBEDTLS_SHA256_C */
#if defined(MBEDTLS_SHA512_C) #if defined(MBEDTLS_SHA512_C)
typedef int (*finish_sha384_t)(mbedtls_sha512_context*, unsigned char*);
static void ssl_calc_finished_tls_sha384( static void ssl_calc_finished_tls_sha384(
mbedtls_ssl_context *ssl, unsigned char *buf, int from ) mbedtls_ssl_context *ssl, unsigned char *buf, int from )
{ {
@ -6370,6 +6373,12 @@ static void ssl_calc_finished_tls_sha384(
const char *sender; const char *sender;
mbedtls_sha512_context sha512; mbedtls_sha512_context sha512;
unsigned char padbuf[48]; unsigned char padbuf[48];
/*
* For SHA-384, we can save 16 bytes by keeping padbuf 48 bytes long.
* However, to avoid stringop-overflow warning in gcc, we have to cast
* mbedtls_sha512_finish_ret().
*/
finish_sha384_t finish_sha384 = (finish_sha384_t)mbedtls_sha512_finish_ret;
mbedtls_ssl_session *session = ssl->session_negotiate; mbedtls_ssl_session *session = ssl->session_negotiate;
if( !session ) if( !session )
@ -6396,7 +6405,7 @@ static void ssl_calc_finished_tls_sha384(
? "client finished" ? "client finished"
: "server finished"; : "server finished";
mbedtls_sha512_finish_ret( &sha512, padbuf ); finish_sha384( &sha512, padbuf );
ssl->handshake->tls_prf( session->master, 48, sender, ssl->handshake->tls_prf( session->master, 48, sender,
padbuf, 48, buf, len ); padbuf, 48, buf, len );

View file

@ -73,7 +73,7 @@
#if !( ( defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L ) || \ #if !( ( defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L ) || \
( defined(_POSIX_THREAD_SAFE_FUNCTIONS ) && \ ( defined(_POSIX_THREAD_SAFE_FUNCTIONS ) && \
_POSIX_THREAD_SAFE_FUNCTIONS >= 20112L ) ) _POSIX_THREAD_SAFE_FUNCTIONS >= 200112L ) )
/* /*
* This is a convenience shorthand macro to avoid checking the long * This is a convenience shorthand macro to avoid checking the long
* preprocessor conditions above. Ideally, we could expose this macro in * preprocessor conditions above. Ideally, we could expose this macro in
@ -88,7 +88,7 @@
#endif /* !( ( defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L ) || \ #endif /* !( ( defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L ) || \
( defined(_POSIX_THREAD_SAFE_FUNCTIONS ) && \ ( defined(_POSIX_THREAD_SAFE_FUNCTIONS ) && \
_POSIX_THREAD_SAFE_FUNCTIONS >= 20112L ) ) */ _POSIX_THREAD_SAFE_FUNCTIONS >= 200112L ) ) */
#endif /* MBEDTLS_HAVE_TIME_DATE && !MBEDTLS_PLATFORM_GMTIME_R_ALT */ #endif /* MBEDTLS_HAVE_TIME_DATE && !MBEDTLS_PLATFORM_GMTIME_R_ALT */

View file

@ -1101,6 +1101,7 @@ static int x509_crt_parse_der_core( mbedtls_x509_crt *crt, const unsigned char *
if( crt->sig_oid.len != sig_oid2.len || if( crt->sig_oid.len != sig_oid2.len ||
memcmp( crt->sig_oid.p, sig_oid2.p, crt->sig_oid.len ) != 0 || memcmp( crt->sig_oid.p, sig_oid2.p, crt->sig_oid.len ) != 0 ||
sig_params1.tag != sig_params2.tag ||
sig_params1.len != sig_params2.len || sig_params1.len != sig_params2.len ||
( sig_params1.len != 0 && ( sig_params1.len != 0 &&
memcmp( sig_params1.p, sig_params2.p, sig_params1.len ) != 0 ) ) memcmp( sig_params1.p, sig_params2.p, sig_params1.len ) != 0 ) )