2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Contact: Dariusz Michaluk (d.michaluk@samsumg.com)
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License
21 * @author Dariusz Michaluk (d.michaluk@samsumg.com)
24 #include <yaca_simple.h>
26 #include "dpl/test/test_runner.h"
27 #include "yaca-test-common.h"
28 #include "yaca-test-vector.h"
32 void digest_check_test_vector(yaca_digest_algorithm_e algo,
34 const Buffer &single_input,
35 const Buffer &expected)
37 /* concatenate input if needed */
38 Buffer input(single_input);
39 for (size_t i = 1; i < repeats; i++)
40 input.insert(input.end(), single_input.begin(), single_input.end());
44 YACA_SUCCESS(yaca_simple_calculate_digest(algo,
49 RUNNER_ASSERT_MSG(digest != NULL, "NULL digest calculated");
51 auto digest_ptr = wrap_ptr(digest);
53 YACA_ASSERT_MSG(digest_len == expected.size(),
54 "Digest calculated for \"" <<
55 truncate_str(std::string(input.data(), input.size()), 16)
56 << "\" with " << digest2str(algo) << " is " <<
57 digest_len * 8 <<" bits long. Expected " <<
58 expected.size() * 8 << " bits");
60 int ret = yaca_memcmp(digest, expected.data(), digest_len);
61 YACA_ASSERT_MSG(YACA_ERROR_NONE == ret,
62 "Digest calculated for \"" <<
63 truncate_str(std::string(input.data(), input.size()), 16)
64 << "\" with " << digest2str(algo) <<
65 " is different than expected");
68 } // anonymous namespace
71 RUNNER_TEST_GROUP_INIT(T7000_YACA_SIMPLE);
73 RUNNER_TEST(T7010_yaca_simple_calculate_digest_invalid_param, YacaTest)
77 Buffer data = random_buffer(42);
79 YACA_INVALID_PARAM(yaca_simple_calculate_digest(static_cast<yaca_digest_algorithm_e>(-1),
84 YACA_INVALID_PARAM(yaca_simple_calculate_digest(YACA_DIGEST_MD5,
89 YACA_INVALID_PARAM(yaca_simple_calculate_digest(YACA_DIGEST_MD5,
94 YACA_INVALID_PARAM(yaca_simple_calculate_digest(YACA_DIGEST_MD5,
99 YACA_INVALID_PARAM(yaca_simple_calculate_digest(YACA_DIGEST_MD5,
106 RUNNER_TEST(T7020_yaca_simple_calculate_digest_ascii_vectors, YacaTest)
108 auto tvv = loadTestVector("digest_ascii.txt");
110 for (const auto &tv : tvv) {
111 yaca_digest_algorithm_e algo;
116 tv.get("algo", algo);
117 tv.get("repeats", repeats);
118 tv.get("input", input);
119 tv.get("output", expected);
121 digest_check_test_vector(algo, repeats, Buffer(input.begin(), input.end()), expected);
125 RUNNER_TEST(T7030_yaca_simple_calculate_digest_binary_vectors, YacaTest)
127 auto tvv = loadTestVector("digest_binary.txt");
129 for (const auto &tv : tvv) {
130 yaca_digest_algorithm_e algo;
135 tv.get("algo", algo);
136 tv.get("repeats", repeats);
137 tv.get("input", input);
138 tv.get("output", expected);
140 digest_check_test_vector(algo, repeats, input, expected);
144 RUNNER_TEST(T7040_yaca_simple_calculate_signature_invalid_param, YacaTest)
147 size_t signature_len;
148 Buffer data = random_buffer(42);
149 KeyPtr key_prv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
150 KeyPtr key_pub = extract_public_key(key_prv);
151 KeyPtr key_sym = generate_key(YACA_KEY_TYPE_SYMMETRIC, 256);
153 YACA_INVALID_PARAM(yaca_simple_calculate_signature(static_cast<yaca_digest_algorithm_e>(-1),
159 YACA_INVALID_PARAM(yaca_simple_calculate_signature(YACA_DIGEST_MD5,
165 YACA_INVALID_PARAM(yaca_simple_calculate_signature(YACA_DIGEST_MD5,
171 YACA_INVALID_PARAM(yaca_simple_calculate_signature(YACA_DIGEST_MD5,
177 YACA_INVALID_PARAM(yaca_simple_calculate_signature(YACA_DIGEST_MD5,
183 YACA_INVALID_PARAM(yaca_simple_calculate_signature(YACA_DIGEST_MD5,
189 YACA_INVALID_PARAM(yaca_simple_calculate_signature(YACA_DIGEST_MD5,
195 YACA_INVALID_PARAM(yaca_simple_calculate_signature(YACA_DIGEST_MD5,
203 RUNNER_TEST(T7050_yaca_simple_verify_signature_invalid_param, YacaTest)
205 size_t signature_len;
206 Buffer data = random_buffer(42);
207 KeyPtr key_prv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
208 KeyPtr key_pub = extract_public_key(key_prv);
209 KeyPtr key_sym = generate_key(YACA_KEY_TYPE_SYMMETRIC, 256);
210 ChrPtr signature = simple_sign(YACA_DIGEST_MD5, key_prv, data.data(), data.size(), &signature_len);
212 YACA_INVALID_PARAM(yaca_simple_verify_signature(static_cast<yaca_digest_algorithm_e>(-1),
218 YACA_INVALID_PARAM(yaca_simple_verify_signature(YACA_DIGEST_MD5,
224 YACA_INVALID_PARAM(yaca_simple_verify_signature(YACA_DIGEST_MD5,
230 YACA_INVALID_PARAM(yaca_simple_verify_signature(YACA_DIGEST_MD5,
236 YACA_INVALID_PARAM(yaca_simple_verify_signature(YACA_DIGEST_MD5,
242 YACA_INVALID_PARAM(yaca_simple_verify_signature(YACA_DIGEST_MD5,
248 YACA_INVALID_PARAM(yaca_simple_verify_signature(YACA_DIGEST_MD5,
254 YACA_INVALID_PARAM(yaca_simple_verify_signature(YACA_DIGEST_MD5,
262 RUNNER_TEST(T7060_yaca_simple_calculate_hmac_invalid_param, YacaTest)
266 Buffer data = random_buffer(42);
267 KeyPtr key_sym = generate_key(YACA_KEY_TYPE_SYMMETRIC, 256);
268 KeyPtr key_prv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
269 KeyPtr key_pub = extract_public_key(key_prv);
271 YACA_INVALID_PARAM(yaca_simple_calculate_hmac(static_cast<yaca_digest_algorithm_e>(-1),
277 YACA_INVALID_PARAM(yaca_simple_calculate_hmac(YACA_DIGEST_MD5,
283 YACA_INVALID_PARAM(yaca_simple_calculate_hmac(YACA_DIGEST_MD5,
289 YACA_INVALID_PARAM(yaca_simple_calculate_hmac(YACA_DIGEST_MD5,
295 YACA_INVALID_PARAM(yaca_simple_calculate_hmac(YACA_DIGEST_MD5,
301 YACA_INVALID_PARAM(yaca_simple_calculate_hmac(YACA_DIGEST_MD5,
307 YACA_INVALID_PARAM(yaca_simple_calculate_hmac(YACA_DIGEST_MD5,
313 YACA_INVALID_PARAM(yaca_simple_calculate_hmac(YACA_DIGEST_MD5,
321 RUNNER_TEST(T7070_yaca_simple_calculate_cmac_invalid_param, YacaTest)
325 Buffer data = random_buffer(42);
326 KeyPtr key_sym = generate_key(YACA_KEY_TYPE_SYMMETRIC, 256);
327 KeyPtr key_prv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
328 KeyPtr key_pub = extract_public_key(key_prv);
330 YACA_INVALID_PARAM(yaca_simple_calculate_cmac(static_cast<yaca_encrypt_algorithm_e>(-1),
336 YACA_INVALID_PARAM(yaca_simple_calculate_cmac(YACA_ENCRYPT_AES,
342 YACA_INVALID_PARAM(yaca_simple_calculate_cmac(YACA_ENCRYPT_AES,
348 YACA_INVALID_PARAM(yaca_simple_calculate_cmac(YACA_ENCRYPT_AES,
354 YACA_INVALID_PARAM(yaca_simple_calculate_cmac(YACA_ENCRYPT_AES,
360 YACA_INVALID_PARAM(yaca_simple_calculate_cmac(YACA_ENCRYPT_AES,
366 YACA_INVALID_PARAM(yaca_simple_calculate_cmac(YACA_ENCRYPT_AES,
372 YACA_INVALID_PARAM(yaca_simple_calculate_cmac(YACA_ENCRYPT_AES,
380 RUNNER_TEST(T7080_yaca_simple_calculate_signature_vectors, YacaTest)
382 auto tvv = loadTestVector("sign_ascii.txt");
384 for (const auto &tv : tvv) {
385 yaca_digest_algorithm_e algo;
386 yaca_key_type_e key_type;
389 std::string single_input;
392 tv.get("algo", algo);
393 tv.get("key_type", key_type);
394 tv.get("key", key_data);
395 tv.get("repeats", repeats);
396 tv.get("input", single_input);
397 tv.get("output", expected);
399 KeyPtr key = import_key(key_type, nullptr, key_data.data(), key_data.size());
401 /* concatenate input if needed */
402 Buffer input(single_input.begin(), single_input.end());
403 for (size_t i = 1; i < repeats; i++)
404 input.insert(input.end(), single_input.begin(), single_input.end());
407 size_t signature_len;
408 YACA_SUCCESS(yaca_simple_calculate_signature(algo,
414 RUNNER_ASSERT_MSG(signature != NULL, "NULL signature calculated");
416 ChrPtr signature_ptr = wrap_ptr(signature);
418 YACA_ASSERT_MSG(signature_len == expected.size(),
419 "Signature calculated for \"" <<
420 truncate_str(std::string(input.data(), input.size()), 16)
421 << "\" with " << digest2str(algo) << " and " << keytype2str(key_type)
422 << " key is " << signature_len * 8
423 <<" bits long. Expected " << expected.size() * 8 << " bits");
425 int ret = yaca_memcmp(signature, expected.data(), signature_len);
426 YACA_ASSERT_MSG(YACA_ERROR_NONE == ret,
427 "Signature calculated for \"" <<
428 truncate_str(std::string(input.data(), input.size()), 16) << "\" with "
429 << digest2str(algo) << " and " << keytype2str(key_type)
430 << "key is different than expected");
434 RUNNER_TEST(T7090_yaca_simple_calculate_signature_verify_vectors, YacaTest)
436 auto tvv = loadTestVector("sign_verify_ascii.txt");
438 for (const auto &tv : tvv) {
439 yaca_digest_algorithm_e algo;
440 yaca_key_type_e key_type;
443 std::string single_input;
445 tv.get("algo", algo);
446 tv.get("key_type", key_type);
447 tv.get("key", key_data);
448 tv.get("repeats", repeats);
449 tv.get("input", single_input);
451 KeyPtr key_prv = import_key(key_type, nullptr, key_data.data(), key_data.size());
452 KeyPtr key_pub = extract_public_key(key_prv);
454 /* concatenate input if needed */
455 Buffer input(single_input.begin(), single_input.end());
456 for (size_t i = 1; i < repeats; i++)
457 input.insert(input.end(), single_input.begin(), single_input.end());
460 size_t signature_len;
461 YACA_SUCCESS(yaca_simple_calculate_signature(algo,
467 RUNNER_ASSERT_MSG(signature != NULL, "NULL signature calculated");
469 ChrPtr signature_ptr = wrap_ptr(signature);
471 int ret = yaca_simple_verify_signature(algo,
478 YACA_ASSERT_MSG(YACA_ERROR_NONE == ret,
479 "Verification failed for \"" <<
480 truncate_str(std::string(input.data(), input.size()), 16) << "\" with "
481 << digest2str(algo) << " and " << keytype2str(key_type) << " key");
483 Buffer input_wrong = input;
484 input_wrong.push_back('!');
486 ret = yaca_simple_verify_signature(algo,
493 YACA_ASSERT_MSG(YACA_ERROR_DATA_MISMATCH == ret,
494 "Verification succeeded for \"" <<
495 truncate_str(std::string(input.data(), input.size()), 16) << "\" with "
496 << digest2str(algo) << " and " << keytype2str(key_type)
497 << " key while the input has been tampered with");
501 RUNNER_TEST(T7100_yaca_simple_calculate_hmac_vectors, YacaTest)
503 auto tvv = loadTestVector("sign_hmac_ascii.txt");
505 for (const auto &tv : tvv) {
506 yaca_digest_algorithm_e algo;
509 std::string single_input;
512 tv.get("algo", algo);
513 tv.get("key", key_data);
514 tv.get("repeats", repeats);
515 tv.get("input", single_input);
516 tv.get("output", expected);
518 KeyPtr key = import_key(YACA_KEY_TYPE_SYMMETRIC, nullptr, key_data.data(), key_data.size());
520 /* concatenate input if needed */
521 Buffer input(single_input.begin(), single_input.end());
522 for (size_t i = 1; i < repeats; i++)
523 input.insert(input.end(), single_input.begin(), single_input.end());
527 YACA_SUCCESS(yaca_simple_calculate_hmac(algo,
533 RUNNER_ASSERT_MSG(mac != NULL, "NULL signature calculated");
535 ChrPtr mac_ptr = wrap_ptr(mac);
537 YACA_ASSERT_MSG(mac_len == expected.size(),
538 "HMAC calculated for \"" <<
539 truncate_str(std::string(input.data(), input.size()), 16)
540 << "\" with " << digest2str(algo) << " is " << mac_len * 8
541 <<" bits long. Expected " << expected.size() * 8 << " bits");
543 int ret = yaca_memcmp(mac, expected.data(), mac_len);
544 YACA_ASSERT_MSG(YACA_ERROR_NONE == ret,
545 "HMAC calculated for \"" <<
546 truncate_str(std::string(input.data(), input.size()), 16) << "\" with "
547 << digest2str(algo) << " is different than expected");
551 RUNNER_TEST(T7110_yaca_simple_calculate_cmac_vectors, YacaTest)
553 auto tvv = loadTestVector("sign_cmac_ascii.txt");
555 for (const auto &tv : tvv) {
556 yaca_encrypt_algorithm_e algo;
559 std::string single_input;
562 tv.get("algo", algo);
563 tv.get("key", key_data);
564 tv.get("repeats", repeats);
565 tv.get("input", single_input);
566 tv.get("output", expected);
568 KeyPtr key = import_key(YACA_KEY_TYPE_SYMMETRIC, nullptr, key_data.data(), key_data.size());
570 /* concatenate input if needed */
571 Buffer input(single_input.begin(), single_input.end());
572 for (size_t i = 1; i < repeats; i++)
573 input.insert(input.end(), single_input.begin(), single_input.end());
577 YACA_SUCCESS(yaca_simple_calculate_cmac(algo,
583 RUNNER_ASSERT_MSG(mac != NULL, "NULL signature calculated");
585 ChrPtr mac_ptr = wrap_ptr(mac);
587 YACA_ASSERT_MSG(mac_len == expected.size(),
588 "CMAC calculated for \"" <<
589 truncate_str(std::string(input.data(), input.size()), 16)
590 << "\" with " << encrypt2str(algo) << " is " << mac_len * 8
591 <<" bits long. Expected " << expected.size() * 8 << " bits");
593 int ret = yaca_memcmp(mac, expected.data(), mac_len);
594 YACA_ASSERT_MSG(YACA_ERROR_NONE == ret,
595 "CMAC calculated for \"" <<
596 truncate_str(std::string(input.data(), input.size()), 16) << "\" with "
597 << encrypt2str(algo) << " is different than expected");