2 * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
4 * Contact: Lukasz Pawelczyk <l.pawelczyk@samsung.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 Lukasz Pawelczyk <l.pawelczyk@samsung.com>
22 * @brief Signature API unit tests.
25 #include <boost/test/unit_test.hpp>
28 #include <yaca_crypto.h>
29 #include <yaca_sign.h>
31 #include <yaca_digest.h>
32 #include <yaca_error.h>
39 using update_fun_3_t = int(yaca_context_h ctx, const char *input, size_t input_len);
41 void call_update_loop(yaca_context_h &ctx, const char *input, size_t input_len,
42 size_t split, update_fun_3_t *fun)
44 BOOST_REQUIRE_MESSAGE(split >= 1, "Fix your test");
47 size_t left = input_len;
48 size_t part = input_len / split;
50 BOOST_REQUIRE_MESSAGE(part >= 1, "Fix your test");
53 ret = fun(ctx, input, part);
54 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
70 BOOST_AUTO_TEST_SUITE(TESTS_SIGN)
72 BOOST_FIXTURE_TEST_CASE(T801__positive__sign_verify, InitDebugFixture)
75 yaca_key_type_e type_prv;
76 yaca_key_bit_length_e key_bit_len;
77 yaca_digest_algorithm_e digest;
82 const std::vector<sign_args> sargs = {
83 {YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_512BIT,
84 YACA_DIGEST_MD5, YACA_INVALID_PADDING, 27},
85 {YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT,
86 YACA_DIGEST_MD5, YACA_PADDING_PKCS1_PSS, 14},
87 {YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_2048BIT,
88 YACA_DIGEST_SHA1, YACA_PADDING_X931, 34},
89 {YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT,
90 YACA_DIGEST_SHA384, YACA_PADDING_PKCS1, 9},
91 {YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_2048BIT,
92 YACA_DIGEST_SHA512, YACA_PADDING_PKCS1_PSS, 12},
94 {YACA_KEY_TYPE_DSA_PRIV, YACA_KEY_LENGTH_1024BIT,
95 YACA_DIGEST_SHA256, YACA_INVALID_PADDING, 5},
96 {YACA_KEY_TYPE_DSA_PRIV, YACA_KEY_LENGTH_1024BIT,
97 YACA_DIGEST_SHA224, YACA_INVALID_PADDING, 31},
98 {YACA_KEY_TYPE_DSA_PRIV, YACA_KEY_LENGTH_2048BIT,
99 YACA_DIGEST_SHA1, YACA_INVALID_PADDING, 29},
100 {YACA_KEY_TYPE_DSA_PRIV, YACA_KEY_LENGTH_1024BIT,
101 YACA_DIGEST_SHA384, YACA_INVALID_PADDING, 19},
102 {YACA_KEY_TYPE_DSA_PRIV, YACA_KEY_LENGTH_2048BIT,
103 YACA_DIGEST_SHA512, YACA_INVALID_PADDING, 11},
105 {YACA_KEY_TYPE_EC_PRIV,
106 (yaca_key_bit_length_e)YACA_KEY_LENGTH_EC_SECP256K1,
107 YACA_DIGEST_SHA256, YACA_INVALID_PADDING, 13},
108 {YACA_KEY_TYPE_EC_PRIV,
109 (yaca_key_bit_length_e)YACA_KEY_LENGTH_EC_SECP384R1,
110 YACA_DIGEST_SHA224, YACA_INVALID_PADDING, 23},
111 {YACA_KEY_TYPE_EC_PRIV,
112 (yaca_key_bit_length_e)YACA_KEY_LENGTH_EC_SECP521R1,
113 YACA_DIGEST_SHA1, YACA_INVALID_PADDING, 33},
114 {YACA_KEY_TYPE_EC_PRIV,
115 (yaca_key_bit_length_e)YACA_KEY_LENGTH_EC_PRIME192V1,
116 YACA_DIGEST_SHA384, YACA_INVALID_PADDING, 22},
117 {YACA_KEY_TYPE_EC_PRIV,
118 (yaca_key_bit_length_e)YACA_KEY_LENGTH_EC_PRIME256V1,
119 YACA_DIGEST_SHA512, YACA_INVALID_PADDING, 20},
122 for (const auto &sa: sargs) {
124 yaca_context_h ctx = YACA_CONTEXT_NULL;
125 yaca_key_h key_prv = YACA_KEY_NULL, key_pub = YACA_KEY_NULL;
127 char *signature = NULL;
128 size_t signature_len;
130 generate_asymmetric_keys(sa.type_prv, sa.key_bit_len, &key_prv, &key_pub);
134 ret = yaca_sign_initialize(&ctx, sa.digest, key_prv);
135 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
137 if (sa.pad != YACA_INVALID_PADDING) {
138 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
139 &sa.pad, sizeof(sa.pad));
140 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
143 call_update_loop(ctx, INPUT_DATA, INPUT_DATA_SIZE,
144 sa.split, &yaca_sign_update);
146 ret = yaca_context_get_output_length(ctx, 0, &signature_len);
147 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
149 ret = yaca_malloc(signature_len, (void **)&signature);
150 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
152 ret = yaca_sign_finalize(ctx, signature, &signature_len);
153 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
155 yaca_context_destroy(ctx);
156 ctx = YACA_CONTEXT_NULL;
161 ret = yaca_verify_initialize(&ctx, sa.digest, key_pub);
162 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
164 if (sa.pad != YACA_INVALID_PADDING) {
165 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
166 &sa.pad, sizeof(sa.pad));
167 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
170 call_update_loop(ctx, INPUT_DATA, INPUT_DATA_SIZE,
171 sa.split + 3, &yaca_verify_update);
173 ret = yaca_verify_finalize(ctx, signature, signature_len);
174 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
176 yaca_context_destroy(ctx);
177 ctx = YACA_CONTEXT_NULL;
180 yaca_key_destroy(key_prv);
181 yaca_key_destroy(key_pub);
182 yaca_free(signature);
186 BOOST_FIXTURE_TEST_CASE(T802__negative__sign_verify, InitDebugFixture)
189 yaca_context_h ctx = YACA_CONTEXT_NULL, ctx_digest = YACA_CONTEXT_NULL;
190 yaca_key_h key_rsa_prv = YACA_KEY_NULL, key_rsa_pub = YACA_KEY_NULL;
191 yaca_key_h key_rsa_prv2 = YACA_KEY_NULL, key_rsa_pub2 = YACA_KEY_NULL;
192 yaca_key_h key_dsa_prv = YACA_KEY_NULL, key_dsa_pub = YACA_KEY_NULL;
193 yaca_key_h key_sym = YACA_KEY_NULL, key_rsa_prv_short = YACA_KEY_NULL;
194 yaca_padding_e pad_invalid = YACA_PADDING_X931, pad_none = YACA_PADDING_NONE;
195 yaca_padding_e pad = YACA_PADDING_PKCS1, pad2 = YACA_PADDING_PKCS1_PSS;
199 char *signature = NULL;
200 size_t signature_len;
202 ret = yaca_digest_initialize(&ctx_digest, YACA_DIGEST_MD5);
203 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
204 ret = yaca_key_generate(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_256BIT, &key_sym);
205 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
207 generate_asymmetric_keys(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_512BIT, &key_rsa_prv_short);
208 generate_asymmetric_keys(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT, &key_rsa_prv, &key_rsa_pub);
209 generate_asymmetric_keys(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT, &key_rsa_prv2, &key_rsa_pub2);
210 generate_asymmetric_keys(YACA_KEY_TYPE_DSA_PRIV, YACA_KEY_LENGTH_1024BIT, &key_dsa_prv, &key_dsa_pub);
214 ret = yaca_sign_initialize(NULL, YACA_DIGEST_MD5, key_rsa_prv);
215 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
217 ret = yaca_sign_initialize(&ctx, YACA_INVALID_DIGEST_ALGORITHM, key_rsa_prv);
218 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
220 ret = yaca_sign_initialize(&ctx, YACA_DIGEST_MD5, YACA_KEY_NULL);
221 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
223 ret = yaca_sign_initialize(&ctx, YACA_DIGEST_MD5, key_rsa_pub);
224 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
226 ret = yaca_sign_initialize(&ctx, YACA_DIGEST_MD5, key_sym);
227 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
229 ret = yaca_sign_initialize(&ctx, YACA_DIGEST_SHA384, key_rsa_prv_short);
230 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
232 ret = yaca_sign_initialize(&ctx, YACA_DIGEST_MD5, key_rsa_prv);
233 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
235 ret = yaca_context_set_property(ctx, YACA_INVALID_PROPERTY,
237 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
239 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
241 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
243 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
245 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
247 ret = yaca_context_set_property(ctx, YACA_PROPERTY_RC2_EFFECTIVE_KEY_BITS,
248 &len, sizeof(size_t));
249 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
251 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
252 &pad_none, sizeof(pad_none));
253 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
255 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
256 &pad_invalid, sizeof(pad_invalid));
257 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
259 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
261 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
263 ret = yaca_sign_update(YACA_CONTEXT_NULL, INPUT_DATA, INPUT_DATA_SIZE);
264 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
266 ret = yaca_sign_update(ctx, NULL, INPUT_DATA_SIZE);
267 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
269 ret = yaca_sign_update(ctx, INPUT_DATA, 0);
270 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
272 ret = yaca_sign_update(ctx_digest, INPUT_DATA, INPUT_DATA_SIZE);
273 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
275 ret = yaca_sign_update(ctx, INPUT_DATA, INPUT_DATA_SIZE);
276 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
278 ret = yaca_context_get_output_length(ctx, 0, NULL);
279 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
281 ret = yaca_context_get_output_length(ctx, 1, &signature_len);
282 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
284 ret = yaca_context_get_output_length(ctx, 0, &signature_len);
285 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
287 ret = yaca_malloc(signature_len, (void **)&signature);
288 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
290 ret = yaca_sign_finalize(YACA_CONTEXT_NULL, signature, &signature_len);
291 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
293 ret = yaca_sign_finalize(ctx, NULL, &signature_len);
294 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
296 ret = yaca_sign_finalize(ctx, signature, NULL);
297 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
299 ret = yaca_sign_finalize(ctx, signature, &signature_len);
300 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
302 ret = yaca_sign_update(ctx, INPUT_DATA, INPUT_DATA_SIZE);
303 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
305 ret = yaca_sign_finalize(ctx, signature, &signature_len);
306 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
308 yaca_context_destroy(ctx);
309 ctx = YACA_CONTEXT_NULL;
314 ret = yaca_verify_initialize(NULL, YACA_DIGEST_MD5, key_rsa_pub);
315 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
317 ret = yaca_verify_initialize(&ctx, YACA_INVALID_DIGEST_ALGORITHM, key_rsa_pub);
318 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
320 ret = yaca_verify_initialize(&ctx, YACA_DIGEST_MD5, YACA_KEY_NULL);
321 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
323 ret = yaca_verify_initialize(&ctx, YACA_DIGEST_MD5, key_rsa_prv);
324 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
326 ret = yaca_verify_initialize(&ctx, YACA_DIGEST_MD5, key_sym);
327 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
329 ret = yaca_verify_initialize(&ctx, YACA_DIGEST_SHA384, key_rsa_prv_short);
330 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
332 ret = yaca_verify_initialize(&ctx, YACA_DIGEST_MD5, key_rsa_pub);
333 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
335 ret = yaca_context_set_property(ctx, YACA_INVALID_PROPERTY,
337 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
339 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
341 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
343 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
345 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
347 ret = yaca_context_set_property(ctx, YACA_PROPERTY_RC2_EFFECTIVE_KEY_BITS,
348 &len, sizeof(size_t));
349 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
351 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
352 &pad_none, sizeof(pad_none));
353 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
355 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
356 &pad_invalid, sizeof(pad_invalid));
357 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
359 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
361 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
363 ret = yaca_verify_update(YACA_CONTEXT_NULL, INPUT_DATA, INPUT_DATA_SIZE);
364 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
366 ret = yaca_verify_update(ctx, NULL, INPUT_DATA_SIZE);
367 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
369 ret = yaca_verify_update(ctx, INPUT_DATA, 0);
370 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
372 ret = yaca_verify_update(ctx_digest, INPUT_DATA, INPUT_DATA_SIZE);
373 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
375 ret = yaca_verify_update(ctx, INPUT_DATA, INPUT_DATA_SIZE);
376 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
378 ret = yaca_verify_finalize(YACA_CONTEXT_NULL, signature, signature_len);
379 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
381 ret = yaca_verify_finalize(ctx, NULL, signature_len);
382 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
384 ret = yaca_verify_finalize(ctx, signature, 0);
385 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
387 ret = yaca_verify_finalize(ctx_digest, signature, signature_len);
388 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
390 ret = yaca_verify_finalize(ctx, signature, signature_len - 1);
391 BOOST_REQUIRE(ret == YACA_ERROR_DATA_MISMATCH);
393 ret = yaca_verify_finalize(ctx, signature + 1, signature_len - 1);
394 BOOST_REQUIRE(ret == YACA_ERROR_DATA_MISMATCH);
396 ret = yaca_verify_finalize(ctx, signature, signature_len);
397 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
399 ret = yaca_verify_update(ctx, INPUT_DATA, INPUT_DATA_SIZE);
400 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
402 ret = yaca_verify_finalize(ctx, signature, signature_len);
403 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
405 yaca_context_destroy(ctx);
406 ctx = YACA_CONTEXT_NULL;
409 /* VERIFY, wrong algo */
411 ret = yaca_verify_initialize(&ctx, YACA_DIGEST_SHA1, key_rsa_pub);
412 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
414 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
416 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
418 ret = yaca_verify_update(ctx, INPUT_DATA, INPUT_DATA_SIZE);
419 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
421 ret = yaca_verify_finalize(ctx, signature, signature_len);
422 BOOST_REQUIRE(ret == YACA_ERROR_DATA_MISMATCH);
424 yaca_context_destroy(ctx);
425 ctx = YACA_CONTEXT_NULL;
428 /* VERIFY, wrong key */
430 ret = yaca_verify_initialize(&ctx, YACA_DIGEST_MD5, key_rsa_pub2);
431 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
433 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
435 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
437 ret = yaca_verify_update(ctx, INPUT_DATA, INPUT_DATA_SIZE);
438 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
440 ret = yaca_verify_finalize(ctx, signature, signature_len);
441 BOOST_REQUIRE(ret == YACA_ERROR_DATA_MISMATCH);
443 yaca_context_destroy(ctx);
444 ctx = YACA_CONTEXT_NULL;
447 /* VERIFY, wrong padding */
449 ret = yaca_verify_initialize(&ctx, YACA_DIGEST_MD5, key_rsa_pub);
450 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
452 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
453 &pad2, sizeof(pad2));
454 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
456 ret = yaca_verify_update(ctx, INPUT_DATA, INPUT_DATA_SIZE);
457 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
459 ret = yaca_verify_finalize(ctx, signature, signature_len);
460 BOOST_REQUIRE(ret == YACA_ERROR_DATA_MISMATCH);
462 yaca_context_destroy(ctx);
463 ctx = YACA_CONTEXT_NULL;
468 ret = yaca_sign_initialize(&ctx, YACA_DIGEST_SHA1, key_dsa_prv);
469 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
471 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
473 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
475 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
476 &pad2, sizeof(pad2));
477 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
479 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
480 &pad_invalid, sizeof(pad_invalid));
481 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
483 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
484 &pad_none, sizeof(pad_none));
485 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
487 yaca_context_destroy(ctx);
488 ctx = YACA_CONTEXT_NULL;
493 ret = yaca_verify_initialize(&ctx, YACA_DIGEST_SHA1, key_dsa_pub);
494 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
496 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
498 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
500 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
501 &pad2, sizeof(pad2));
502 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
504 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
505 &pad_invalid, sizeof(pad_invalid));
506 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
508 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
509 &pad_none, sizeof(pad_none));
510 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
512 yaca_context_destroy(ctx);
513 ctx = YACA_CONTEXT_NULL;
516 yaca_key_destroy(key_rsa_prv);
517 yaca_key_destroy(key_rsa_pub);
518 yaca_key_destroy(key_rsa_prv2);
519 yaca_key_destroy(key_rsa_pub2);
520 yaca_key_destroy(key_rsa_prv_short);
521 yaca_key_destroy(key_dsa_prv);
522 yaca_key_destroy(key_dsa_pub);
523 yaca_key_destroy(key_sym);
524 yaca_context_destroy(ctx_digest);
525 yaca_free(signature);
528 BOOST_FIXTURE_TEST_CASE(T803__positive__sign_cmac, InitDebugFixture)
531 yaca_key_type_e type;
532 yaca_key_bit_length_e len;
533 yaca_encrypt_algorithm_e algo;
537 const std::vector<cmac_args> cargs = {
538 {YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_256BIT,
539 YACA_ENCRYPT_AES, 11},
540 {YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_UNSAFE_128BIT,
541 YACA_ENCRYPT_CAST5, 22},
542 {YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_192BIT,
543 YACA_ENCRYPT_3DES_3TDEA, 33},
544 {YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_256BIT,
545 YACA_ENCRYPT_UNSAFE_RC2, 44},
546 {YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_UNSAFE_64BIT,
547 YACA_ENCRYPT_UNSAFE_DES, 13},
549 {YACA_KEY_TYPE_DES, YACA_KEY_LENGTH_UNSAFE_128BIT,
550 YACA_ENCRYPT_AES, 15},
551 {YACA_KEY_TYPE_DES, YACA_KEY_LENGTH_UNSAFE_128BIT,
552 YACA_ENCRYPT_CAST5, 41},
553 {YACA_KEY_TYPE_DES, YACA_KEY_LENGTH_192BIT,
554 YACA_ENCRYPT_3DES_3TDEA, 17},
555 {YACA_KEY_TYPE_DES, YACA_KEY_LENGTH_UNSAFE_128BIT,
556 YACA_ENCRYPT_UNSAFE_RC2, 9},
557 {YACA_KEY_TYPE_DES, YACA_KEY_LENGTH_UNSAFE_64BIT,
558 YACA_ENCRYPT_UNSAFE_DES, 12},
561 for (const auto &ca: cargs) {
563 yaca_context_h ctx = YACA_CONTEXT_NULL;
564 yaca_key_h key = YACA_KEY_NULL;
566 char *signature = NULL, *signature2 = NULL;
567 size_t signature_len, signature2_len;
569 ret = yaca_key_generate(ca.type, ca.len, &key);
570 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
574 ret = yaca_sign_initialize_cmac(&ctx, ca.algo, key);
575 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
577 call_update_loop(ctx, INPUT_DATA, INPUT_DATA_SIZE,
578 ca.split, yaca_sign_update);
580 ret = yaca_context_get_output_length(ctx, 0, &signature_len);
581 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
583 ret = yaca_malloc(signature_len, (void **)&signature);
584 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
586 ret = yaca_sign_finalize(ctx, signature, &signature_len);
587 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
589 yaca_context_destroy(ctx);
590 ctx = YACA_CONTEXT_NULL;
595 ret = yaca_sign_initialize_cmac(&ctx, ca.algo, key);
596 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
598 call_update_loop(ctx, INPUT_DATA, INPUT_DATA_SIZE,
599 ca.split + 3, yaca_sign_update);
601 ret = yaca_context_get_output_length(ctx, 0, &signature2_len);
602 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
604 ret = yaca_malloc(signature2_len, (void **)&signature2);
605 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
607 ret = yaca_sign_finalize(ctx, signature2, &signature2_len);
608 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
610 yaca_context_destroy(ctx);
611 ctx = YACA_CONTEXT_NULL;
613 BOOST_REQUIRE(signature_len == signature2_len);
614 ret = yaca_memcmp(signature, signature2, signature_len);
615 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
618 yaca_key_destroy(key);
619 yaca_free(signature);
620 yaca_free(signature2);
624 BOOST_FIXTURE_TEST_CASE(T804__negative__sign_cmac, InitDebugFixture)
627 yaca_context_h ctx = YACA_CONTEXT_NULL;
628 yaca_key_h key = YACA_KEY_NULL, key2 = YACA_KEY_NULL;
629 yaca_key_h key_rsa = YACA_KEY_NULL, key_dsa = YACA_KEY_NULL;
631 char *signature = NULL, *signature2 = NULL;
632 size_t signature_len, signature2_len;
634 ret = yaca_key_generate(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_192BIT, &key);
635 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
636 ret = yaca_key_generate(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_192BIT, &key2);
637 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
639 generate_asymmetric_keys(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_512BIT, &key_rsa);
640 generate_asymmetric_keys(YACA_KEY_TYPE_DSA_PRIV, YACA_KEY_LENGTH_1024BIT, &key_dsa);
644 ret = yaca_sign_initialize_cmac(NULL, YACA_ENCRYPT_AES, key);
645 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
647 ret = yaca_sign_initialize_cmac(&ctx, YACA_INVALID_ENCRYPT_ALGORITHM, key);
648 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
650 ret = yaca_sign_initialize_cmac(&ctx, YACA_ENCRYPT_AES, YACA_KEY_NULL);
651 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
653 ret = yaca_sign_initialize_cmac(&ctx, YACA_ENCRYPT_AES, key_rsa);
654 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
656 ret = yaca_sign_initialize_cmac(&ctx, YACA_ENCRYPT_AES, key_dsa);
657 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
659 ret = yaca_sign_initialize_cmac(&ctx, YACA_ENCRYPT_AES, key);
660 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
662 ret = yaca_sign_update(ctx, INPUT_DATA, INPUT_DATA_SIZE);
663 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
665 ret = yaca_context_get_output_length(ctx, 0, &signature_len);
666 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
668 ret = yaca_malloc(signature_len, (void **)&signature);
669 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
671 ret = yaca_sign_finalize(ctx, signature, &signature_len);
672 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
674 yaca_context_destroy(ctx);
675 ctx = YACA_CONTEXT_NULL;
678 /* VERIFY, wrong algo */
680 ret = yaca_sign_initialize_cmac(&ctx, YACA_ENCRYPT_3DES_3TDEA, key);
681 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
683 ret = yaca_sign_update(ctx, INPUT_DATA, INPUT_DATA_SIZE);
684 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
686 ret = yaca_context_get_output_length(ctx, 0, &signature2_len);
687 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
689 ret = yaca_malloc(signature2_len, (void **)&signature2);
690 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
692 ret = yaca_sign_finalize(ctx, signature2, &signature2_len);
693 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
695 signature2_len = std::min(signature_len, signature2_len);
696 ret = yaca_memcmp(signature, signature2, signature2_len);
697 BOOST_REQUIRE(ret == YACA_ERROR_DATA_MISMATCH);
699 yaca_context_destroy(ctx);
700 ctx = YACA_CONTEXT_NULL;
701 yaca_free(signature2);
705 /* VERIFY, wrong key */
707 ret = yaca_sign_initialize_cmac(&ctx, YACA_ENCRYPT_AES, key2);
708 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
710 ret = yaca_sign_update(ctx, INPUT_DATA, INPUT_DATA_SIZE);
711 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
713 ret = yaca_context_get_output_length(ctx, 0, &signature2_len);
714 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
716 ret = yaca_malloc(signature2_len, (void **)&signature2);
717 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
719 ret = yaca_sign_finalize(ctx, signature2, &signature2_len);
720 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
722 BOOST_REQUIRE(signature_len == signature2_len);
723 ret = yaca_memcmp(signature, signature2, signature_len);
724 BOOST_REQUIRE(ret == YACA_ERROR_DATA_MISMATCH);
726 yaca_context_destroy(ctx);
727 ctx = YACA_CONTEXT_NULL;
728 yaca_free(signature2);
732 yaca_key_destroy(key);
733 yaca_key_destroy(key2);
734 yaca_key_destroy(key_rsa);
735 yaca_key_destroy(key_dsa);
736 yaca_free(signature);
739 BOOST_FIXTURE_TEST_CASE(T805__positive__sign_hmac, InitDebugFixture)
742 yaca_key_type_e type;
743 yaca_key_bit_length_e len;
744 yaca_digest_algorithm_e digest;
748 const std::vector<hmac_args> hargs = {
749 {YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_256BIT,
750 YACA_DIGEST_MD5, 13},
751 {YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_UNSAFE_128BIT,
752 YACA_DIGEST_SHA1, 32},
753 {YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_192BIT,
754 YACA_DIGEST_SHA224, 23},
755 {YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_256BIT,
756 YACA_DIGEST_SHA256, 20},
757 {YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_UNSAFE_64BIT,
758 YACA_DIGEST_SHA384, 13},
760 {YACA_KEY_TYPE_DES, YACA_KEY_LENGTH_UNSAFE_128BIT,
762 {YACA_KEY_TYPE_DES, YACA_KEY_LENGTH_UNSAFE_128BIT,
763 YACA_DIGEST_SHA1, 7},
764 {YACA_KEY_TYPE_DES, YACA_KEY_LENGTH_192BIT,
765 YACA_DIGEST_SHA224, 14},
766 {YACA_KEY_TYPE_DES, YACA_KEY_LENGTH_UNSAFE_128BIT,
767 YACA_DIGEST_SHA384, 20},
768 {YACA_KEY_TYPE_DES, YACA_KEY_LENGTH_UNSAFE_64BIT,
769 YACA_DIGEST_SHA512, 10},
772 for (const auto &ha: hargs) {
774 yaca_context_h ctx = YACA_CONTEXT_NULL;
775 yaca_key_h key = YACA_KEY_NULL;
777 char *signature = NULL, *signature2 = NULL;
778 size_t signature_len, signature2_len;
780 ret = yaca_key_generate(ha.type, ha.len, &key);
781 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
785 ret = yaca_sign_initialize_hmac(&ctx, ha.digest, key);
786 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
788 call_update_loop(ctx, INPUT_DATA, INPUT_DATA_SIZE,
789 ha.split, yaca_sign_update);
791 ret = yaca_context_get_output_length(ctx, 0, &signature_len);
792 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
794 ret = yaca_malloc(signature_len, (void **)&signature);
795 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
797 ret = yaca_sign_finalize(ctx, signature, &signature_len);
798 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
800 yaca_context_destroy(ctx);
801 ctx = YACA_CONTEXT_NULL;
806 ret = yaca_sign_initialize_hmac(&ctx, ha.digest, key);
807 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
809 call_update_loop(ctx, INPUT_DATA, INPUT_DATA_SIZE,
810 ha.split + 3, yaca_sign_update);
812 ret = yaca_context_get_output_length(ctx, 0, &signature2_len);
813 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
815 ret = yaca_malloc(signature2_len, (void **)&signature2);
816 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
818 ret = yaca_sign_finalize(ctx, signature2, &signature2_len);
819 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
821 yaca_context_destroy(ctx);
822 ctx = YACA_CONTEXT_NULL;
824 BOOST_REQUIRE(signature_len == signature2_len);
825 ret = yaca_memcmp(signature, signature2, signature_len);
826 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
829 yaca_key_destroy(key);
830 yaca_free(signature);
831 yaca_free(signature2);
835 BOOST_FIXTURE_TEST_CASE(T806__negative__sign_hmac, InitDebugFixture)
838 yaca_context_h ctx = YACA_CONTEXT_NULL;
839 yaca_key_h key = YACA_KEY_NULL, key2 = YACA_KEY_NULL;
840 yaca_key_h key_rsa = YACA_KEY_NULL, key_dsa = YACA_KEY_NULL;
842 char *signature = NULL, *signature2 = NULL;
843 size_t signature_len, signature2_len;
845 ret = yaca_key_generate(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_192BIT, &key);
846 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
847 ret = yaca_key_generate(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_192BIT, &key2);
848 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
850 generate_asymmetric_keys(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_512BIT, &key_rsa);
851 generate_asymmetric_keys(YACA_KEY_TYPE_DSA_PRIV, YACA_KEY_LENGTH_1024BIT, &key_dsa);
855 ret = yaca_sign_initialize_hmac(NULL, YACA_DIGEST_MD5, key);
856 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
858 ret = yaca_sign_initialize_hmac(&ctx, YACA_INVALID_DIGEST_ALGORITHM, key);
859 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
861 ret = yaca_sign_initialize_hmac(&ctx, YACA_DIGEST_MD5, YACA_KEY_NULL);
862 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
864 ret = yaca_sign_initialize_hmac(&ctx, YACA_DIGEST_MD5, key_rsa);
865 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
867 ret = yaca_sign_initialize_hmac(&ctx, YACA_DIGEST_MD5, key_dsa);
868 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
870 ret = yaca_sign_initialize_hmac(&ctx, YACA_DIGEST_MD5, key);
871 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
873 ret = yaca_sign_update(ctx, INPUT_DATA, INPUT_DATA_SIZE);
874 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
876 ret = yaca_context_get_output_length(ctx, 0, &signature_len);
877 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
879 ret = yaca_malloc(signature_len, (void **)&signature);
880 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
882 ret = yaca_sign_finalize(ctx, signature, &signature_len);
883 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
885 yaca_context_destroy(ctx);
886 ctx = YACA_CONTEXT_NULL;
889 /* VERIFY, wrong algo */
891 ret = yaca_sign_initialize_hmac(&ctx, YACA_DIGEST_SHA1, key);
892 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
894 ret = yaca_sign_update(ctx, INPUT_DATA, INPUT_DATA_SIZE);
895 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
897 ret = yaca_context_get_output_length(ctx, 0, &signature2_len);
898 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
900 ret = yaca_malloc(signature2_len, (void **)&signature2);
901 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
903 ret = yaca_sign_finalize(ctx, signature2, &signature2_len);
904 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
906 signature2_len = std::min(signature_len, signature2_len);
907 ret = yaca_memcmp(signature, signature2, signature2_len);
908 BOOST_REQUIRE(ret == YACA_ERROR_DATA_MISMATCH);
910 yaca_context_destroy(ctx);
911 ctx = YACA_CONTEXT_NULL;
912 yaca_free(signature2);
916 /* VERIFY, wrong key */
918 ret = yaca_sign_initialize_hmac(&ctx, YACA_DIGEST_MD5, key2);
919 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
921 ret = yaca_sign_update(ctx, INPUT_DATA, INPUT_DATA_SIZE);
922 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
924 ret = yaca_context_get_output_length(ctx, 0, &signature2_len);
925 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
927 ret = yaca_malloc(signature2_len, (void **)&signature2);
928 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
930 ret = yaca_sign_finalize(ctx, signature2, &signature2_len);
931 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
933 BOOST_REQUIRE(signature_len == signature2_len);
934 ret = yaca_memcmp(signature, signature2, signature_len);
935 BOOST_REQUIRE(ret == YACA_ERROR_DATA_MISMATCH);
937 yaca_context_destroy(ctx);
938 ctx = YACA_CONTEXT_NULL;
939 yaca_free(signature2);
943 yaca_key_destroy(key);
944 yaca_key_destroy(key2);
945 yaca_key_destroy(key_rsa);
946 yaca_key_destroy(key_dsa);
947 yaca_free(signature);
950 BOOST_AUTO_TEST_SUITE_END()