YACA: HMAC and CMAC vector tests
authorLukasz Pawelczyk <l.pawelczyk@samsung.com>
Tue, 28 Jun 2016 16:20:32 +0000 (18:20 +0200)
committerKrzysztof Jackiewicz <k.jackiewicz@samsung.com>
Wed, 29 Jun 2016 10:37:12 +0000 (12:37 +0200)
Change-Id: I0d72539de1792e056a16ff4f29d86ea785836672

src/yaca/test-vectors/sign_cmac_ascii.txt [new file with mode: 0644]
src/yaca/test-vectors/sign_hmac_ascii.txt [new file with mode: 0644]
src/yaca/yaca-test-sign.cpp

diff --git a/src/yaca/test-vectors/sign_cmac_ascii.txt b/src/yaca/test-vectors/sign_cmac_ascii.txt
new file mode 100644 (file)
index 0000000..e49b01d
--- /dev/null
@@ -0,0 +1,85 @@
+##################### AES-128-CBC #####################
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f4
+repeats=1
+input=
+output=abc0b7b8d415716230c892c786a1b699
+
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f4
+repeats=1
+input=a
+output=fdb60985fef85ed01f259ab8aba3da43
+
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f4
+repeats=1
+input=message signature
+output=9c1879f350713722e786f5c67f26c429
+
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f4
+repeats=1
+input=qwertyuiopasdfghjklzxcvbnm
+output=ee6fa7733f6bd2c018bff1d76b455af8
+
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f4
+repeats=1
+input=1234567890qwertyuiop !@#$%^&*() POIUYTREWQ
+output=f5915331a8710e6cc2911440fe538b47
+
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f4
+repeats=10
+input=repeat test
+output=4a5925050bc4a391b5c5bf180eb8a691
+
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f4
+repeats=1000
+input=qwerty
+output=c9b541252628ac53ee27a36afa7a3e39
+
+##################### AES-256-CBC #####################
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=
+output=1743c3b9157af33aff0f36dca4ad2571
+
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=a
+output=ac53f9ab1d6fc5e998db9d53c783a64c
+
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=message signature
+output=bcda18e89f9c23af816c83534cf84f36
+
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=qwertyuiopasdfghjklzxcvbnm
+output=53e27292cde100e92f5d5c3418cc3c7b
+
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=1234567890qwertyuiop !@#$%^&*() POIUYTREWQ
+output=2e96d8c1d77bb09dc53798bde48be0f4
+
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=10
+input=repeat test
+output=c37d4facd55eb645ad123dcf7d6e2143
+
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1000
+input=qwerty
+output=2c82129dc0c274cd1563154b331d746a
diff --git a/src/yaca/test-vectors/sign_hmac_ascii.txt b/src/yaca/test-vectors/sign_hmac_ascii.txt
new file mode 100644 (file)
index 0000000..b8b1ff7
--- /dev/null
@@ -0,0 +1,85 @@
+##################### MD5 #####################
+algo=MD5
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=
+output=213cfe14aee97a6a0da820c74315b357
+
+algo=MD5
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=a
+output=208d870f6228ff283e6c7e4463adc618
+
+algo=MD5
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=message signature
+output=051e3bb9264e67fadfe18fef12a92449
+
+algo=MD5
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=qwertyuiopasdfghjklzxcvbnm
+output=1958335f446c0c6710a0b3c85a223c73
+
+algo=MD5
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=1234567890qwertyuiop !@#$%^&*() POIUYTREWQ
+output=294ee23ddcc73a51578040e8af50f6eb
+
+algo=MD5
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=10
+input=repeat test
+output=19eac925eafe7d0eeb7d0076b5d4cee7
+
+algo=MD5
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1000
+input=qwerty
+output=f496aebea8a5a40157101ea1765f02f1
+
+##################### SHA256 #####################
+algo=SHA256
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=
+output=5f897d6c00afcc234202776bc332fef4e25eb45e4d8337100d5a75afc8302f89
+
+algo=SHA256
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=a
+output=6144b106f94dfc8673e9ab9b0d10194f7ba4cd8e325047010e6ac6f584ecc0f3
+
+algo=SHA256
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=message signature
+output=e3f20825b0a34b36618ed456de3a188be597fff26ff733028676a4502d19ea22
+
+algo=SHA256
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=qwertyuiopasdfghjklzxcvbnm
+output=3a0d6e608b56ee234c77b1f380a23ea4b18e8fec1f78979a9f380c3dcd851307
+
+algo=SHA256
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=1234567890qwertyuiop !@#$%^&*() POIUYTREWQ
+output=8da6e59304b054ee143b480058e106be9a9b201504a0408416642d26597cb88f
+
+algo=SHA256
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=10
+input=repeat test
+output=d66a2e3f327b376083ff91cb36a0df157e568f666d72a29f360d255ad19a343c
+
+algo=SHA256
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1000
+input=qwerty
+output=e4dbbd5f5c606f3fcec5dca5f5b22557dc46a8aad9a0a2c2c11668989001466e
index 41b0ae3..7b48de2 100644 (file)
@@ -277,3 +277,101 @@ RUNNER_TEST(T6100_yaca_sign_verify_test_vectors, YacaTest)
                         << digest2str(algo) << " and " << keytype2str(key_type) << " key" );
     }
 }
+
+RUNNER_TEST(T6110_yaca_sign_hmac_test_vectors, YacaTest)
+{
+    auto tvv = loadTestVector("sign_hmac_ascii.txt");
+
+    for (const auto& tv : tvv) {
+        yaca_digest_algorithm_e algo;
+        Buffer key_data;
+        size_t repeats;
+        std::string input;
+        Buffer expected;
+
+        tv.get("algo", algo);
+        tv.get("key", key_data);
+        tv.get("repeats", repeats);
+        tv.get("input", input);
+        tv.get("output", expected);
+
+        KeyPtr key = import_key(YACA_KEY_TYPE_SYMMETRIC, nullptr, key_data.data(), key_data.size());
+
+        CtxPtr ctx = hmac_init(algo, key);
+        size_t output_len = get_output_length(ctx);
+
+        if (input.size() > 0) {
+            for (size_t i = 0; i < repeats; i++)
+                YACA_SUCCESS(yaca_sign_update(ctx.get(),
+                                              input.c_str(),
+                                              input.size()));
+        }
+
+        Buffer output(output_len);
+        YACA_SUCCESS(yaca_sign_finalize(ctx.get(), output.data(), &output_len));
+        RUNNER_ASSERT_MSG(output.size() >= output_len,
+                          "Length returned from yaca_sign_finalize() (" << output_len <<
+                          ") is greater than the one returned from yaca_context_get_output_length() ("
+                          << output.size() << ")");
+        output.resize(output_len);
+
+        YACA_ASSERT_MSG(output.size() == expected.size(),
+                        "HMAC calculated for \""  << truncate_str(input, 16) << "\" with "
+                        << digest2str(algo) << " is " << output.size() * 8
+                        <<" bits long. Expected " << expected.size() * 8 << " bits");
+
+        int ret = yaca_memcmp(output.data(), expected.data(), output.size());
+        YACA_ASSERT_MSG(YACA_ERROR_NONE == ret,
+                        "HMAC calculated for \"" << truncate_str(input, 16) << "\" with "
+                        << digest2str(algo) << " is different than expected");
+    }
+}
+
+RUNNER_TEST(T6120_yaca_sign_cmac_test_vectors, YacaTest)
+{
+    auto tvv = loadTestVector("sign_cmac_ascii.txt");
+
+    for (const auto& tv : tvv) {
+        yaca_encrypt_algorithm_e algo;
+        Buffer key_data;
+        size_t repeats;
+        std::string input;
+        Buffer expected;
+
+        tv.get("algo", algo);
+        tv.get("key", key_data);
+        tv.get("repeats", repeats);
+        tv.get("input", input);
+        tv.get("output", expected);
+
+        KeyPtr key = import_key(YACA_KEY_TYPE_SYMMETRIC, nullptr, key_data.data(), key_data.size());
+
+        CtxPtr ctx = cmac_init(algo, key);
+        size_t output_len = get_output_length(ctx);
+
+        if (input.size() > 0) {
+            for (size_t i = 0; i < repeats; i++)
+                YACA_SUCCESS(yaca_sign_update(ctx.get(),
+                                              input.c_str(),
+                                              input.size()));
+        }
+
+        Buffer output(output_len);
+        YACA_SUCCESS(yaca_sign_finalize(ctx.get(), output.data(), &output_len));
+        RUNNER_ASSERT_MSG(output.size() >= output_len,
+                          "Length returned from yaca_sign_finalize() (" << output_len <<
+                          ") is greater than the one returned from yaca_context_get_output_length() ("
+                          << output.size() << ")");
+        output.resize(output_len);
+
+        YACA_ASSERT_MSG(output.size() == expected.size(),
+                        "CMAC calculated for \""  << truncate_str(input, 16) << "\" with "
+                        << encrypt2str(algo) << " is " << output.size() * 8
+                        <<" bits long. Expected " << expected.size() * 8 << " bits");
+
+        int ret = yaca_memcmp(output.data(), expected.data(), output.size());
+        YACA_ASSERT_MSG(YACA_ERROR_NONE == ret,
+                        "CMAC calculated for \"" << truncate_str(input, 16) << "\" with "
+                        << encrypt2str(algo) << " is different than expected");
+    }
+}