cipher: handle ChaCha20 as a stream cipher
That's what it is. So we shouldn't set a block size != 1.
While at it, move call to chachapoly_update() closer to the one for GCM, as
they are similar (AEAD).
diff --git a/include/mbedtls/cipher.h b/include/mbedtls/cipher.h
index 591aa79..1ae847d 100644
--- a/include/mbedtls/cipher.h
+++ b/include/mbedtls/cipher.h
@@ -193,7 +193,7 @@
/** Maximum length of any IV, in Bytes. */
#define MBEDTLS_MAX_IV_LENGTH 16
/** Maximum block size of any cipher, in Bytes. */
-#define MBEDTLS_MAX_BLOCK_LENGTH 64
+#define MBEDTLS_MAX_BLOCK_LENGTH 16
/**
* Base cipher information (opaque struct).
diff --git a/library/cipher.c b/library/cipher.c
index 2463a61..cf10094 100644
--- a/library/cipher.c
+++ b/library/cipher.c
@@ -367,6 +367,15 @@
}
#endif
+#if defined(MBEDTLS_CHACHAPOLY_C)
+ if ( ctx->cipher_info->type == MBEDTLS_CIPHER_CHACHA20_POLY1305 )
+ {
+ *olen = ilen;
+ return mbedtls_chachapoly_update( (mbedtls_chachapoly_context*) ctx->cipher_ctx,
+ ilen, input, output );
+ }
+#endif
+
if ( 0 == block_size )
{
return MBEDTLS_ERR_CIPHER_INVALID_CONTEXT;
@@ -378,31 +387,6 @@
return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
}
-
-#if defined(MBEDTLS_CHACHA20_C)
- if ( ctx->cipher_info->type == MBEDTLS_CIPHER_CHACHA20 )
- {
- *olen = ilen;
- return mbedtls_chacha20_update( (mbedtls_chacha20_context*) ctx->cipher_ctx,
- ilen, input, output );
- }
-#endif
-
- if( input == output &&
- ( ctx->unprocessed_len != 0 || ilen % mbedtls_cipher_get_block_size( ctx ) ) )
- {
- return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
- }
-
-#if defined(MBEDTLS_CHACHAPOLY_C)
- if ( ctx->cipher_info->type == MBEDTLS_CIPHER_CHACHA20_POLY1305 )
- {
- *olen = ilen;
- return mbedtls_chachapoly_update( (mbedtls_chachapoly_context*) ctx->cipher_ctx,
- ilen, input, output );
- }
-#endif
-
#if defined(MBEDTLS_CIPHER_MODE_CBC)
if( ctx->cipher_info->mode == MBEDTLS_MODE_CBC )
{
diff --git a/library/cipher_wrap.c b/library/cipher_wrap.c
index 5c80828..9110b96 100644
--- a/library/cipher_wrap.c
+++ b/library/cipher_wrap.c
@@ -1305,6 +1305,19 @@
return( 0 );
}
+static int chacha20_stream_wrap( void *ctx, size_t length,
+ const unsigned char *input,
+ unsigned char *output )
+{
+ int ret;
+
+ ret = mbedtls_chacha20_update( ctx, length, input, output );
+ if( ret == MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA )
+ return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
+
+ return( ret );
+}
+
static void * chacha20_ctx_alloc( void )
{
mbedtls_chacha20_context *ctx;
@@ -1337,7 +1350,7 @@
NULL,
#endif
#if defined(MBEDTLS_CIPHER_MODE_STREAM)
- NULL,
+ chacha20_stream_wrap,
#endif
chacha20_setkey_wrap,
chacha20_setkey_wrap,
@@ -1346,12 +1359,12 @@
};
static const mbedtls_cipher_info_t chacha20_info = {
MBEDTLS_CIPHER_CHACHA20,
- MBEDTLS_MODE_NONE,
+ MBEDTLS_MODE_STREAM,
256,
"CHACHA20",
12,
0,
- 64,
+ 1,
&chacha20_base_info
};
#endif /* MBEDTLS_CHACHA20_C */
@@ -1417,7 +1430,7 @@
"CHACHA20-POLY1305",
12,
0,
- 64,
+ 1,
&chachapoly_base_info
};
#endif /* MBEDTLS_CHACHAPOLY_C */