Add ChaCha20+Poly1305 to the Cipher module
diff --git a/library/cipher_wrap.c b/library/cipher_wrap.c
index f4e7964..d8c5f06 100644
--- a/library/cipher_wrap.c
+++ b/library/cipher_wrap.c
@@ -33,6 +33,10 @@
#include "mbedtls/cipher_internal.h"
+#if defined(MBEDTLS_AEAD_CHACHA20_POLY1305_C)
+#include "mbedtls/aead_chacha20_poly1305.h"
+#endif
+
#if defined(MBEDTLS_AES_C)
#include "mbedtls/aes.h"
#endif
@@ -1352,6 +1356,71 @@
};
#endif /* MBEDTLS_CHACHA20_C */
+#if defined(MBEDTLS_AEAD_CHACHA20_POLY1305_C)
+
+static int aead_chacha20_poly1305_setkey_wrap( void *ctx, const unsigned char *key,
+ unsigned int key_bitlen )
+{
+ if( key_bitlen != 256U )
+ return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
+
+ if ( 0 != mbedtls_aead_chacha20_poly1305_setkey( (mbedtls_aead_chacha20_poly1305_context*)ctx, key ) )
+ return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
+
+ return( 0 );
+}
+
+static void * aead_chacha20_poly1305_ctx_alloc( void )
+{
+ mbedtls_aead_chacha20_poly1305_context *ctx;
+ ctx = mbedtls_calloc( 1, sizeof( mbedtls_aead_chacha20_poly1305_context ) );
+
+ if( ctx == NULL )
+ return( NULL );
+
+ mbedtls_aead_chacha20_poly1305_init( ctx );
+
+ return( ctx );
+}
+
+static void aead_chacha20_poly1305_ctx_free( void *ctx )
+{
+ mbedtls_aead_chacha20_poly1305_free( (mbedtls_aead_chacha20_poly1305_context *) ctx );
+ mbedtls_free( ctx );
+}
+
+static const mbedtls_cipher_base_t aead_chacha20_poly1305_base_info = {
+ MBEDTLS_CIPHER_ID_CHACHA20,
+ NULL,
+#if defined(MBEDTLS_CIPHER_MODE_CBC)
+ NULL,
+#endif
+#if defined(MBEDTLS_CIPHER_MODE_CFB)
+ NULL,
+#endif
+#if defined(MBEDTLS_CIPHER_MODE_CTR)
+ NULL,
+#endif
+#if defined(MBEDTLS_CIPHER_MODE_STREAM)
+ NULL,
+#endif
+ aead_chacha20_poly1305_setkey_wrap,
+ aead_chacha20_poly1305_setkey_wrap,
+ aead_chacha20_poly1305_ctx_alloc,
+ aead_chacha20_poly1305_ctx_free
+};
+static const mbedtls_cipher_info_t aead_chacha20_poly1305_info = {
+ MBEDTLS_CIPHER_CHACHA20_POLY1305,
+ MBEDTLS_MODE_NONE,
+ 256,
+ "CHACHA20-POLY1305",
+ 12,
+ 0,
+ 64,
+ &aead_chacha20_poly1305_base_info
+};
+#endif /* MBEDTLS_AEAD_CHACHA20_POLY1305_C */
+
#if defined(MBEDTLS_CIPHER_NULL_CIPHER)
static int null_crypt_stream( void *ctx, size_t length,
const unsigned char *input,
@@ -1511,6 +1580,10 @@
{ MBEDTLS_CIPHER_CHACHA20, &chacha20_info },
#endif
+#if defined(MBEDTLS_AEAD_CHACHA20_POLY1305_C)
+ { MBEDTLS_CIPHER_CHACHA20_POLY1305, &aead_chacha20_poly1305_info },
+#endif
+
#if defined(MBEDTLS_CIPHER_NULL_CIPHER)
{ MBEDTLS_CIPHER_NULL, &null_cipher_info },
#endif /* MBEDTLS_CIPHER_NULL_CIPHER */