Add tests for CCM via cipher layer
diff --git a/tests/suites/test_suite_cipher.function b/tests/suites/test_suite_cipher.function
index c39da5b..03be2b8 100644
--- a/tests/suites/test_suite_cipher.function
+++ b/tests/suites/test_suite_cipher.function
@@ -411,6 +411,92 @@
}
/* END_CASE */
+/* BEGIN_CASE depends_on:POLARSSL_CIPHER_MODE_AEAD */
+void auth_crypt_tv( int cipher_id, char *hex_key, char *hex_iv,
+ char *hex_ad, char *hex_cipher,
+ char *hex_tag, char *hex_clear )
+{
+ int ret;
+ unsigned char key[50];
+ unsigned char iv[50];
+ unsigned char cipher[200];
+ unsigned char clear[200];
+ unsigned char ad[200];
+ unsigned char tag[20];
+ unsigned char my_tag[20];
+ size_t key_len, iv_len, cipher_len, clear_len, ad_len, tag_len;
+ cipher_context_t ctx;
+ unsigned char output[200];
+ size_t outlen;
+
+ memset( key, 0x00, sizeof( key ) );
+ memset( iv, 0x00, sizeof( iv ) );
+ memset( cipher, 0x00, sizeof( cipher ) );
+ memset( clear, 0x00, sizeof( clear ) );
+ memset( ad, 0x00, sizeof( ad ) );
+ memset( tag, 0x00, sizeof( tag ) );
+ memset( my_tag, 0xFF, sizeof( my_tag ) );
+ memset( output, 0xFF, sizeof( output ) );
+
+ key_len = unhexify( key, hex_key );
+ iv_len = unhexify( iv, hex_iv );
+ cipher_len = unhexify( cipher, hex_cipher );
+ ad_len = unhexify( ad, hex_ad );
+ tag_len = unhexify( tag, hex_tag );
+
+ /* Prepare context */
+ TEST_ASSERT( 0 == cipher_init_ctx( &ctx,
+ cipher_info_from_type( cipher_id ) ) );
+ TEST_ASSERT( 0 == cipher_setkey( &ctx, key, 8 * key_len, POLARSSL_DECRYPT ) );
+
+ /* decode buffer and check tag */
+ ret = cipher_auth_decrypt( &ctx, iv, iv_len, ad, ad_len,
+ cipher, cipher_len, output, &outlen,
+ tag, tag_len );
+
+ /* make sure we didn't overwrite */
+ TEST_ASSERT( output[outlen + 0] == 0xFF );
+ TEST_ASSERT( output[outlen + 1] == 0xFF );
+
+ /* make sure the message is rejected if it should be */
+ if( strcmp( hex_clear, "FAIL" ) == 0 )
+ {
+ TEST_ASSERT( ret == POLARSSL_ERR_CIPHER_AUTH_FAILED );
+ goto cleanup;
+ }
+
+ /* otherwise, make sure it was decrypted properly */
+ TEST_ASSERT( ret == 0 );
+
+ clear_len = unhexify( clear, hex_clear );
+ TEST_ASSERT( outlen == clear_len );
+ TEST_ASSERT( memcmp( output, clear, clear_len ) == 0 );
+
+ /* then encrypt the clear and make sure we get the same ciphertext and tag */
+ memset( output, 0xFF, sizeof( output ) );
+ outlen = 0;
+
+ ret = cipher_auth_encrypt( &ctx, iv, iv_len, ad, ad_len,
+ clear, clear_len, output, &outlen,
+ my_tag, tag_len );
+ TEST_ASSERT( ret == 0 );
+
+ TEST_ASSERT( outlen == clear_len );
+ TEST_ASSERT( memcmp( output, cipher, clear_len ) == 0 );
+ TEST_ASSERT( memcmp( my_tag, tag, tag_len ) == 0 );
+
+ /* make sure we didn't overwrite */
+ TEST_ASSERT( output[outlen + 0] == 0xFF );
+ TEST_ASSERT( output[outlen + 1] == 0xFF );
+ TEST_ASSERT( my_tag[tag_len + 0] == 0xFF );
+ TEST_ASSERT( my_tag[tag_len + 1] == 0xFF );
+
+
+cleanup:
+ cipher_free_ctx( &ctx );
+}
+/* END_CASE */
+
/* BEGIN_CASE */
void test_vec_ecb( int cipher_id, int operation, char *hex_key,
char *hex_input, char *hex_result,