Remove UPDATE_CBC macro and working b buffer.
Signed-off-by: Mateusz Starzyk <mateusz.starzyk@mobica.com>
diff --git a/include/mbedtls/ccm.h b/include/mbedtls/ccm.h
index 813959b..72dfd3d 100644
--- a/include/mbedtls/ccm.h
+++ b/include/mbedtls/ccm.h
@@ -77,7 +77,6 @@
typedef struct mbedtls_ccm_context
{
mbedtls_cipher_context_t MBEDTLS_PRIVATE(cipher_ctx); /*!< The cipher context used. */
- unsigned char MBEDTLS_PRIVATE(b)[16]; /*!< The B working buffer */
unsigned char MBEDTLS_PRIVATE(y)[16]; /*!< The Y working buffer */
unsigned char MBEDTLS_PRIVATE(ctr)[16]; /*!< The counter buffer */
unsigned char MBEDTLS_PRIVATE(q); /*!< The Q working value */
diff --git a/library/ccm.c b/library/ccm.c
index 5450e40..399a936 100644
--- a/library/ccm.c
+++ b/library/ccm.c
@@ -106,22 +106,6 @@
mbedtls_platform_zeroize( ctx, sizeof( mbedtls_ccm_context ) );
}
-/*
- * Update the CBC-MAC state in y using a block in b
- * (Always using b as the source helps the compiler optimise a bit better.)
- *
- * Macro results in smaller compiled code than static inline functions.
- */
-#define UPDATE_CBC_MAC \
- for( i = 0; i < 16; i++ ) \
- ctx->y[i] ^= ctx->b[i]; \
- \
- if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, ctx->y, 16, ctx->y, &olen ) ) != 0 ) \
- { \
- ctx->state |= CCM_STATE__ERROR; \
- return( ret ); \
- } \
-
#define CCM_STATE__CLEAR 0
#define CCM_STATE__STARTED 0x0001
#define CCM_STATE__LENGHTS_SET 0x0002
@@ -155,7 +139,6 @@
static void mbedtls_ccm_clear_state(mbedtls_ccm_context *ctx) {
ctx->state = CCM_STATE__CLEAR;
- memset( ctx->b, 0, 16);
memset( ctx->y, 0, 16);
memset( ctx->ctr, 0, 16);
}
@@ -177,7 +160,7 @@
return( MBEDTLS_ERR_CCM_BAD_INPUT );
/*
- * First block B_0:
+ * First block:
* 0 .. 0 flags
* 1 .. iv_len nonce (aka iv) - set by: mbedtls_ccm_starts()
* iv_len+1 .. 15 length
@@ -188,12 +171,12 @@
* 5 .. 3 (t - 2) / 2
* 2 .. 0 q - 1
*/
- ctx->b[0] |= ( ctx->add_len > 0 ) << 6;
- ctx->b[0] |= ( ( ctx->tag_len - 2 ) / 2 ) << 3;
- ctx->b[0] |= ctx->q - 1;
+ ctx->y[0] |= ( ctx->add_len > 0 ) << 6;
+ ctx->y[0] |= ( ( ctx->tag_len - 2 ) / 2 ) << 3;
+ ctx->y[0] |= ctx->q - 1;
for( i = 0, len_left = ctx->plaintext_len; i < ctx->q; i++, len_left >>= 8 )
- ctx->b[15-i] = (unsigned char)( len_left & 0xFF );
+ ctx->y[15-i] = (unsigned char)( len_left & 0xFF );
if( len_left > 0 )
{
@@ -202,7 +185,11 @@
}
/* Start CBC-MAC with first block*/
- UPDATE_CBC_MAC;
+ if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, ctx->y, 16, ctx->y, &olen ) ) != 0 )
+ {
+ ctx->state |= CCM_STATE__ERROR;
+ return( ret );
+ }
return (0);
}
@@ -248,9 +235,9 @@
ctx->ctr[15] = 1;
/*
- * See mbedtls_ccm_calculate_first_block() for B block layout description
+ * See mbedtls_ccm_calculate_first_block() for block layout description
*/
- memcpy( ctx->b + 1, iv, iv_len );
+ memcpy( ctx->y + 1, iv, iv_len );
ctx->state |= CCM_STATE__STARTED;
return mbedtls_ccm_calculate_first_block(ctx);
@@ -304,9 +291,8 @@
{
if( ctx->processed == 0 )
{
- memset( ctx->b, 0, 16 );
- ctx->b[0] = (unsigned char)( ( ctx->add_len >> 8 ) & 0xFF );
- ctx->b[1] = (unsigned char)( ( ctx->add_len ) & 0xFF );
+ ctx->y[0] ^= (unsigned char)( ( ctx->add_len >> 8 ) & 0xFF );
+ ctx->y[1] ^= (unsigned char)( ( ctx->add_len ) & 0xFF );
ctx->processed += 2;
}
@@ -320,15 +306,20 @@
if( use_len > add_len )
use_len = add_len;
- memcpy( ctx->b + offset, add, use_len );
+ for( i = 0; i < use_len; i++ )
+ ctx->y[i + offset] ^= add[i];
+
ctx->processed += use_len;
add_len -= use_len;
add += use_len;
if( use_len + offset == 16 || ctx->processed - 2 == ctx->add_len )
{
- UPDATE_CBC_MAC;
- memset( ctx->b, 0, 16 );
+ if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, ctx->y, 16, ctx->y, &olen ) ) != 0 )
+ {
+ ctx->state |= CCM_STATE__ERROR;
+ return( ret );
+ }
}
}
}
@@ -356,11 +347,6 @@
CCM_VALIDATE_RET( output_length != NULL );
*output_len = input_len;
- if( ctx->processed == 0 )
- {
- memset( ctx->b, 0, 16 );
- }
-
while ( input_len > 0 )
{
offset = ctx->processed % 16;
@@ -371,16 +357,23 @@
use_len = input_len;
ctx->processed += use_len;
- memcpy( ctx->b + offset, input, use_len );
if( ctx->mode == MBEDTLS_CCM_ENCRYPT || \
ctx->mode == MBEDTLS_CCM_STAR_ENCRYPT )
{
+ for( i = 0; i < use_len; i++ )
+ ctx->y[i + offset] ^= input[i];
+
if( use_len + offset == 16 || ctx->processed == ctx->plaintext_len )
{
- UPDATE_CBC_MAC;
+ if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, ctx->y, 16, ctx->y, &olen ) ) != 0 )
+ {
+ ctx->state |= CCM_STATE__ERROR;
+ return( ret );
+ }
}
- ret = mbedtls_ccm_crypt( ctx, offset, use_len, ctx->b + offset, output );
+
+ ret = mbedtls_ccm_crypt( ctx, offset, use_len, input, output );
if( ret != 0 )
return ret;
}
@@ -388,7 +381,7 @@
if( ctx->mode == MBEDTLS_CCM_DECRYPT || \
ctx->mode == MBEDTLS_CCM_STAR_DECRYPT )
{
- ret = mbedtls_ccm_crypt( ctx, offset, use_len, ctx->b + offset, output );
+ ret = mbedtls_ccm_crypt( ctx, offset, use_len, input, output );
if( ret != 0 )
return ret;
@@ -410,7 +403,6 @@
for( i = 0; i < ctx->q; i++ )
if( ++(ctx->ctr)[15-i] != 0 )
break;
- memset( ctx->b, 0, 16 );
}
input_len -= use_len;