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,