CCM*: Implement variable tag length
diff --git a/library/ccm.c b/library/ccm.c
index 9461c3d..6b944bf 100644
--- a/library/ccm.c
+++ b/library/ccm.c
@@ -335,6 +335,24 @@
add_len, input, output, tag, tag_len ) );
}
+#define CCM_MAX_IV_LEN 13
+
+int mbedtls_ccm_svar_encrypt_and_tag( mbedtls_ccm_context *ctx, size_t length,
+ size_t iv_len, const unsigned char *add,
+ size_t add_len, const unsigned char *input,
+ unsigned char *output, unsigned char *tag,
+ size_t tag_len, mbedtls_ccm_star_get_iv_t get_iv,
+ void *get_iv_ctx )
+{
+ unsigned char iv[CCM_MAX_IV_LEN];
+
+ if( get_iv( get_iv_ctx, tag_len, iv, iv_len ) != 0 )
+ return MBEDTLS_ERR_CCM_BAD_INPUT;
+
+ return( mbedtls_ccm_sfix_encrypt_and_tag( ctx, length, iv, iv_len, add,
+ add_len, input, output, tag, tag_len ) );
+}
+
/*
* Authenticated decryption
*/
@@ -381,6 +399,26 @@
return( mbedtls_ccm_sfix_auth_decrypt( ctx, length, iv, iv_len, add,
add_len, input, output, tag, tag_len ) );
}
+
+
+int mbedtls_ccm_svar_auth_decrypt( mbedtls_ccm_context *ctx, size_t length,
+ const unsigned char *iv, size_t iv_len,
+ const unsigned char *add, size_t add_len,
+ const unsigned char *input, unsigned char *output,
+ size_t* output_len,
+ mbedtls_ccm_star_get_tag_len_t get_tag_len,
+ void *get_tlen_ctx )
+{
+ size_t tag_len = 0;
+
+ if( get_tag_len( get_tlen_ctx, &tag_len, iv, iv_len ) != 0 )
+ return( MBEDTLS_ERR_CCM_BAD_INPUT );
+
+ *output_len = length - tag_len;
+
+ return( mbedtls_ccm_sfix_auth_decrypt( ctx, length, iv, iv_len, add,
+ add_len, input, output, input + length, tag_len ) );
+}
#endif /* !MBEDTLS_CCM_ALT */
#if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C)