YACA: Add GCM/CCM output tests 35/87135/5
authorDariusz Michaluk <d.michaluk@samsung.com>
Mon, 5 Sep 2016 15:24:17 +0000 (17:24 +0200)
committerDariusz Michaluk <d.michaluk@samsung.com>
Fri, 9 Sep 2016 10:36:53 +0000 (12:36 +0200)
Change-Id: I0e91408959ec6c0adda63263d2dcb8026c114186

src/yaca/test-vectors/encrypt_output_comparison_aes_gcm_ccm.txt [new file with mode: 0644]
src/yaca/yaca-test-encrypt.cpp

diff --git a/src/yaca/test-vectors/encrypt_output_comparison_aes_gcm_ccm.txt b/src/yaca/test-vectors/encrypt_output_comparison_aes_gcm_ccm.txt
new file mode 100644 (file)
index 0000000..bd94e35
--- /dev/null
@@ -0,0 +1,242 @@
+input=
+algo=AES
+bcm=GCM
+key=00000000000000000000000000000000
+iv=000000000000000000000000
+aad=
+tag=58e2fccefa7e3061367f1d57a4e7455a
+output=
+
+input=00000000000000000000000000000000
+algo=AES
+bcm=GCM
+key=00000000000000000000000000000000
+iv=000000000000000000000000
+aad=
+tag=ab6e47d42cec13bdf53a67b21257bddf
+output=0388dace60b6a392f328c2b971b2fe78
+
+input=d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255
+algo=AES
+bcm=GCM
+key=feffe9928665731c6d6a8f9467308308
+iv=cafebabefacedbaddecaf888
+aad=
+tag=4d5c2af327cd64a62cf35abd2ba6fab4
+output=42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f5985
+
+input=d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39
+algo=AES
+bcm=GCM
+key=feffe9928665731c6d6a8f9467308308
+iv=cafebabefacedbaddecaf888
+aad=feedfacedeadbeeffeedfacedeadbeefabaddad2
+tag=5bc94fbc3221a5db94fae95ae7121a47
+output=42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091
+
+input=d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39
+algo=AES
+bcm=GCM
+key=feffe9928665731c6d6a8f9467308308
+iv=cafebabefacedbad
+aad=feedfacedeadbeeffeedfacedeadbeefabaddad2
+tag=3612d2e79e3b0785561be14aaca2fccb
+output=61353b4c2806934a777ff51fa22a4755699b2a714fcdc6f83766e5f97b6c742373806900e49f24b22b097544d4896b424989b5e1ebac0f07c23f4598
+
+input=d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39
+algo=AES
+bcm=GCM
+key=feffe9928665731c6d6a8f9467308308
+iv=9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b
+aad=feedfacedeadbeeffeedfacedeadbeefabaddad2
+tag=619cc5aefffe0bfa462af43c1699d050
+output=8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca701e4a9a4fba43c90ccdcb281d48c7c6fd62875d2aca417034c34aee5
+
+input=
+algo=AES
+bcm=GCM
+key=000000000000000000000000000000000000000000000000
+iv=000000000000000000000000
+aad=
+tag=cd33b28ac773f74ba00ed1f312572435
+output=
+
+input=00000000000000000000000000000000
+algo=AES
+bcm=GCM
+key=000000000000000000000000000000000000000000000000
+iv=000000000000000000000000
+aad=
+tag=2ff58d80033927ab8ef4d4587514f0fb
+output=98e7247c07f0fe411c267e4384b0f600
+
+input=d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255
+algo=AES
+bcm=GCM
+key=feffe9928665731c6d6a8f9467308308feffe9928665731c
+iv=cafebabefacedbaddecaf888
+aad=
+tag=9924a7c8587336bfb118024db8674a14
+output=3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710acade256
+
+input=d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39
+algo=AES
+bcm=GCM
+key=feffe9928665731c6d6a8f9467308308feffe9928665731c
+iv=cafebabefacedbaddecaf888
+aad=feedfacedeadbeeffeedfacedeadbeefabaddad2
+tag=2519498e80f1478f37ba55bd6d27618c
+output=3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710
+
+input=d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39
+algo=AES
+bcm=GCM
+key=feffe9928665731c6d6a8f9467308308feffe9928665731c
+iv=cafebabefacedbad
+aad=feedfacedeadbeeffeedfacedeadbeefabaddad2
+tag=65dcc57fcf623a24094fcca40d3533f8
+output=0f10f599ae14a154ed24b36e25324db8c566632ef2bbb34f8347280fc4507057fddc29df9a471f75c66541d4d4dad1c9e93a19a58e8b473fa0f062f7
+
+input=d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39
+algo=AES
+bcm=GCM
+key=feffe9928665731c6d6a8f9467308308feffe9928665731c
+iv=9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b
+aad=feedfacedeadbeeffeedfacedeadbeefabaddad2
+tag=dcf566ff291c25bbb8568fc3d376a6d9
+output=d27e88681ce3243c4830165a8fdcf9ff1de9a1d8e6b447ef6ef7b79828666e4581e79012af34ddd9e2f037589b292db3e67c036745fa22e7e9b7373b
+
+input=
+algo=AES
+bcm=GCM
+key=0000000000000000000000000000000000000000000000000000000000000000
+iv=000000000000000000000000
+aad=
+tag=530f8afbc74536b9a963b4f1c4cb738b
+output=
+
+input=00000000000000000000000000000000
+algo=AES
+bcm=GCM
+key=0000000000000000000000000000000000000000000000000000000000000000
+iv=000000000000000000000000
+aad=
+tag=d0d1c8a799996bf0265b98b5d48ab919
+output=cea7403d4d606b6e074ec5d3baf39d18
+
+input=d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255
+algo=AES
+bcm=GCM
+key=feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308
+iv=cafebabefacedbaddecaf888
+aad=
+tag=b094dac5d93471bdec1a502270e3cc6c
+output=522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662898015ad
+
+input=d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39
+algo=AES
+bcm=GCM
+key=feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308
+iv=cafebabefacedbaddecaf888
+aad=feedfacedeadbeeffeedfacedeadbeefabaddad2
+tag=76fc6ece0f4e1768cddf8853bb2d551b
+output=522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662
+
+input=d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39
+algo=AES
+bcm=GCM
+key=feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308
+iv=cafebabefacedbad
+aad=feedfacedeadbeeffeedfacedeadbeefabaddad2
+tag=3a337dbf46a792c45e454913fe2ea8f2
+output=c3762df1ca787d32ae47c13bf19844cbaf1ae14d0b976afac52ff7d79bba9de0feb582d33934a4f0954cc2363bc73f7862ac430e64abe499f47c9b1f
+
+input=d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39
+algo=AES
+bcm=GCM
+key=feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308
+iv=9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b
+aad=feedfacedeadbeeffeedfacedeadbeefabaddad2
+tag=a44a8266ee1c8eb0c8b5d4cf5ae9f19a
+output=5a8def2f0c9e53f1f75d7853659e2a20eeb2b22aafde6419a058ab4f6f746bf40fc0c3b780f244452da3ebf1c5d82cdea2418997200ef82e44ae7e3f
+
+input=08090A0B0C0D0E0F101112131415161718191A1B1C1D1E
+algo=AES
+bcm=CCM
+key=C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF
+iv=00000003020100A0A1A2A3A4A5
+aad=0001020304050607
+tag=17E8D12CFDF926E0
+output=588C979A61C663D2F066D0C2C0F989806D5F6B61DAC384
+
+input=08090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
+algo=AES
+bcm=CCM
+key=C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF
+iv=00000004030201A0A1A2A3A4A5
+aad=0001020304050607
+tag=A091D56E10400916
+output=72C91A36E135F8CF291CA894085C87E3CC15C439C9E43A3B
+
+input=08090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20
+algo=AES
+bcm=CCM
+key=C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF
+iv=00000005040302A0A1A2A3A4A5
+aad=0001020304050607
+tag=4ADAA76FBD9FB0C5
+output=51B1E5F44A197D1DA46B0F8E2D282AE871E838BB64DA859657
+
+input=0C0D0E0F101112131415161718191A1B1C1D1E
+algo=AES
+bcm=CCM
+key=C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF
+iv=00000006050403A0A1A2A3A4A5
+aad=000102030405060708090A0B
+tag=96C861B9C9E61EF1
+output=A28C6865939A9A79FAAA5C4C2A9D4A91CDAC8C
+
+input=0C0D0E0F101112131415161718191A1B1C1D1E1F
+algo=AES
+bcm=CCM
+key=C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF
+iv=00000007060504A0A1A2A3A4A5
+aad=000102030405060708090A0B
+tag=51E83F077D9C2D93
+output=DCF1FB7B5D9E23FB9D4E131253658AD86EBDCA3E
+
+input=0C0D0E0F101112131415161718191A1B1C1D1E1F20
+algo=AES
+bcm=CCM
+key=C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF
+iv=00000008070605A0A1A2A3A4A5
+aad=000102030405060708090A0B
+tag=405A0443AC91CB94
+output=6FC1B011F006568B5171A42D953D469B2570A4BD87
+
+input=08090A0B0C0D0E0F101112131415161718191A1B1C1D1E
+algo=AES
+bcm=CCM
+key=C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF
+iv=00000009080706A0A1A2A3A4A5
+aad=0001020304050607
+tag=048C56602C97ACBB7490
+output=0135D1B2C95F41D5D1D4FEC185D166B8094E999DFED96C
+
+input=20212223
+algo=AES
+bcm=CCM
+key=404142434445464748494a4b4c4d4e4f
+iv=10111213141516
+aad=0001020304050607
+tag=4dac255d
+output=7162015b
+
+input=202122232425262728292a2b2c2d2e2f
+algo=AES
+bcm=CCM
+key=404142434445464748494a4b4c4d4e4f
+iv=1011121314151617
+aad=000102030405060708090a0b0c0d0e0f
+tag=1fc64fbfaccd
+output=d2a1f0e051ea5f62081a7792073d593d
index 8f18940..5feaa42 100644 (file)
@@ -353,6 +353,158 @@ void test_vector_ccm_tag_len(size_t key_len,
     YACA_RESULT(expected, encryptor.set_tag_len(YACA_BCM_CCM, tag_len));
 }
 
+void aes_gcm_test_output(const Buffer &input,
+                         yaca_encrypt_algorithm_e algo,
+                         yaca_block_cipher_mode_e bcm,
+                         const Buffer &key,
+                         const Buffer &iv,
+                         const Buffer &aad,
+                         const Buffer &tag,
+                         const Buffer &output)
+{
+    auto key_ptr = import_key(algo_to_key_type(algo), nullptr, key.data(), key.size());
+    auto iv_ptr = (iv.size() > 0) ? import_key(YACA_KEY_TYPE_IV, nullptr, iv.data(), iv.size())
+                                  : null_key();
+
+    size_t tag_len = tag.size();
+    auto tag_output = create_yaca_buffer(tag_len);
+
+    // encryption
+    Buffer encrypt_output;
+    auto enc_ctx_ptr = encrypt_init(algo, bcm, key_ptr, iv_ptr);
+    size_t update_len = 0;
+    size_t final_len = 0;
+
+    if (!aad.empty())
+        YACA_SUCCESS(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_GCM_AAD,
+                                               aad.data(), aad.size()));
+
+    if (!input.empty()) {
+        auto update_ptr = out_buf_alloc(enc_ctx_ptr, input.size(), update_len);
+        YACA_SUCCESS(yaca_encrypt_update(enc_ctx_ptr.get(), input.data(), input.size(),
+                                         update_ptr.get(), &update_len));
+        encrypt_output.insert(encrypt_output.end(), update_ptr.get(), update_ptr.get() + update_len);
+    }
+
+    auto final_ptr = out_buf_alloc(enc_ctx_ptr, 0, final_len);
+    YACA_SUCCESS(yaca_encrypt_finalize(enc_ctx_ptr.get(), final_ptr.get(), &final_len));
+    encrypt_output.insert(encrypt_output.end(), final_ptr.get(), final_ptr.get() + final_len);
+
+    YACA_SUCCESS(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG_LEN,
+                                           (void*)&tag_len, sizeof(tag_len)));
+    YACA_SUCCESS(yaca_context_get_property(enc_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG,
+                                           (void**)tag_output.get(), &tag_len));
+
+    YACA_ASSERT_MSG(output.size() == encrypt_output.size(), "Ciphertext size after encrypt differs\n");
+    YACA_ASSERT_MSG(output == encrypt_output, "Ciphertext after encrypt differs\n");
+    YACA_ASSERT_MSG(tag.size() == tag_len, "Tag size after encrypt differs\n");
+    YACA_ASSERT_MSG(yaca_memcmp(tag.data(), tag_output.get(), tag_len) == YACA_ERROR_NONE,
+                    "Tag after encrypt differs\n");
+
+    // decryption
+    Buffer decrypt_output;
+    auto dec_ctx_ptr = decrypt_init(YACA_ENCRYPT_AES, YACA_BCM_GCM, key_ptr, iv_ptr);
+
+    if (!aad.empty())
+        YACA_SUCCESS(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_GCM_AAD,
+                                               aad.data(), aad.size()));
+    if (!output.empty()) {
+        auto update_ptr = out_buf_alloc(dec_ctx_ptr, output.size(), update_len);
+        YACA_SUCCESS(yaca_decrypt_update(dec_ctx_ptr.get(), output.data(), output.size(),
+                                         update_ptr.get(), &update_len));
+        decrypt_output.insert(decrypt_output.end(), update_ptr.get(), update_ptr.get() + update_len);
+    }
+
+    YACA_SUCCESS(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG,
+                                           tag.data(), tag.size()));
+
+    final_ptr = out_buf_alloc(dec_ctx_ptr, 0, final_len);
+    YACA_SUCCESS(yaca_decrypt_finalize(dec_ctx_ptr.get(), final_ptr.get(), &final_len));
+    decrypt_output.insert(decrypt_output.end(), final_ptr.get(), final_ptr.get() + final_len);
+
+    YACA_ASSERT_MSG(input.size() == decrypt_output.size(), "Size after encrypt-decrypt differs\n");
+    YACA_ASSERT_MSG(input == decrypt_output, "Text after encrypt-decrypt has changed\n");
+}
+
+void aes_ccm_test_output(const Buffer &input,
+                         yaca_encrypt_algorithm_e algo,
+                         yaca_block_cipher_mode_e bcm,
+                         const Buffer &key,
+                         const Buffer &iv,
+                         const Buffer &aad,
+                         const Buffer &tag,
+                         const Buffer &output)
+{
+    auto key_ptr = import_key(algo_to_key_type(algo), nullptr, key.data(), key.size());
+    auto iv_ptr = (iv.size() > 0) ? import_key(YACA_KEY_TYPE_IV, nullptr, iv.data(), iv.size())
+                                  : null_key();
+
+    size_t tag_len = tag.size();
+    auto tag_output = create_yaca_buffer(tag_len);
+
+    // encryption
+    Buffer encrypt_output;
+    auto enc_ctx_ptr = encrypt_init(algo, bcm, key_ptr, iv_ptr);
+    size_t update_len = 0;
+    size_t final_len = 0;
+
+    YACA_SUCCESS(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG_LEN,
+                                           (void*)&tag_len, sizeof(tag_len)));
+
+    if (!aad.empty()) {
+        YACA_SUCCESS(yaca_encrypt_update(enc_ctx_ptr.get(), NULL, input.size(), NULL, &update_len));
+        YACA_SUCCESS(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_CCM_AAD,
+                                               aad.data(), aad.size()));
+    }
+
+    if (!input.empty()) {
+        auto update_ptr = out_buf_alloc(enc_ctx_ptr, input.size(), update_len);
+        YACA_SUCCESS(yaca_encrypt_update(enc_ctx_ptr.get(), input.data(), input.size(),
+                                         update_ptr.get(), &update_len));
+        encrypt_output.insert(encrypt_output.end(), update_ptr.get(), update_ptr.get() + update_len);
+    }
+
+    auto final_ptr = out_buf_alloc(enc_ctx_ptr, 0, final_len);
+    YACA_SUCCESS(yaca_encrypt_finalize(enc_ctx_ptr.get(), final_ptr.get(), &final_len));
+    encrypt_output.insert(encrypt_output.end(), final_ptr.get(), final_ptr.get() + final_len);
+
+    YACA_SUCCESS(yaca_context_get_property(enc_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG,
+                                           (void**)tag_output.get(), &tag_len));
+
+    YACA_ASSERT_MSG(output.size() == encrypt_output.size(), "Ciphertext size after encrypt differs \n");
+    YACA_ASSERT_MSG(output == encrypt_output, "ciphertext after encrypt differs\n");
+    YACA_ASSERT_MSG(tag.size() == tag_len, "Tag size after encrypt differs\n");
+    YACA_ASSERT_MSG(yaca_memcmp(tag.data(), tag_output.get(), tag_len) == YACA_ERROR_NONE,
+                    "Tag after encrypt differs\n");
+
+    // decryption
+    Buffer decrypt_output;
+    auto dec_ctx_ptr = decrypt_init(algo, bcm, key_ptr, iv_ptr);
+
+    YACA_SUCCESS(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG,
+                                           tag.data(), tag.size()));
+
+    if (!aad.empty()) {
+        YACA_SUCCESS(yaca_decrypt_update(dec_ctx_ptr.get(), NULL, output.size(), NULL, &update_len));
+        YACA_SUCCESS(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_CCM_AAD,
+                                               aad.data(), aad.size()));
+    }
+
+    if (!output.empty()) {
+        auto update_ptr = out_buf_alloc(dec_ctx_ptr, output.size(), update_len);
+        YACA_SUCCESS(yaca_decrypt_update(dec_ctx_ptr.get(), output.data(), output.size(),
+                                         update_ptr.get(), &update_len));
+        decrypt_output.insert(decrypt_output.end(), update_ptr.get(), update_ptr.get() + update_len);
+    }
+
+    final_ptr = out_buf_alloc(dec_ctx_ptr, 0, final_len);
+    YACA_SUCCESS(yaca_decrypt_finalize(dec_ctx_ptr.get(), final_ptr.get(), &final_len));
+    decrypt_output.insert(decrypt_output.end(), final_ptr.get(), final_ptr.get() + final_len);
+
+    YACA_ASSERT_MSG(input.size() == decrypt_output.size(), "Size after encrypt-decrypt differs\n");
+    YACA_ASSERT_MSG(input == decrypt_output, "Text after encrypt-decrypt has changed\n");
+}
+
 }//namespace anonymous
 
 RUNNER_TEST_GROUP_INIT(T3000_YACA_ENCRYPT);
@@ -873,3 +1025,31 @@ RUNNER_TEST(T3140_yaca_aes_ccm_tag_len_combs_invalid_param, YacaTest)
         test_vector_ccm_tag_len(key_len, iv_len, tag_len, valid);
     }
 }
+
+RUNNER_TEST(T3150_yaca_aes_gcm_ccm_output_comparison, YacaTest)
+{
+    auto tvv = loadTestVector("encrypt_output_comparison_aes_gcm_ccm.txt");
+
+    for (const auto& tv : tvv) {
+        Buffer input;
+        yaca_encrypt_algorithm_e algo;
+        yaca_block_cipher_mode_e bcm;
+        Buffer key;
+        Buffer iv;
+        Buffer aad;
+        Buffer tag;
+        Buffer output;
+
+        tv.get("input", input);
+        tv.get("algo", algo);
+        tv.get("bcm", bcm);
+        tv.get("key", key);
+        tv.get("iv", iv);
+        tv.get("aad", aad);
+        tv.get("tag", tag);
+        tv.get("output", output);
+
+        bcm == YACA_BCM_GCM ? aes_gcm_test_output(input, algo, bcm, key, iv, aad, tag, output)
+                            : aes_ccm_test_output(input, algo, bcm, key, iv, aad, tag, output);
+    }
+}