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 Seal API unit tests.
25 #include <boost/test/unit_test.hpp>
28 #include <yaca_crypto.h>
29 #include <yaca_seal.h>
31 #include <yaca_encrypt.h>
32 #include <yaca_error.h>
37 BOOST_AUTO_TEST_SUITE(TESTS_SEAL)
39 BOOST_FIXTURE_TEST_CASE(T701__positive__seal_open, InitDebugFixture)
42 yaca_encrypt_algorithm_e algo;
43 yaca_block_cipher_mode_e bcm;
45 yaca_padding_e padding;
49 const std::vector<seal_args> sargs = {
50 {YACA_ENCRYPT_AES, YACA_BCM_CBC, 128, YACA_INVALID_PADDING, 16},
51 {YACA_ENCRYPT_AES, YACA_BCM_CBC, 128, YACA_PADDING_NONE, 8},
52 {YACA_ENCRYPT_AES, YACA_BCM_CBC, 128, YACA_PADDING_PKCS7, 11},
53 {YACA_ENCRYPT_AES, YACA_BCM_CFB, 128, YACA_INVALID_PADDING, 24},
54 {YACA_ENCRYPT_AES, YACA_BCM_CFB1, 128, YACA_INVALID_PADDING, 13},
55 {YACA_ENCRYPT_AES, YACA_BCM_CFB8, 128, YACA_INVALID_PADDING, 4},
56 {YACA_ENCRYPT_AES, YACA_BCM_CTR, 128, YACA_INVALID_PADDING, 66},
57 {YACA_ENCRYPT_AES, YACA_BCM_ECB, 128, YACA_INVALID_PADDING, 3},
58 {YACA_ENCRYPT_AES, YACA_BCM_ECB, 128, YACA_PADDING_NONE, 11},
59 {YACA_ENCRYPT_AES, YACA_BCM_ECB, 128, YACA_PADDING_PKCS7, 34},
60 {YACA_ENCRYPT_AES, YACA_BCM_OFB, 128, YACA_INVALID_PADDING, 27},
62 {YACA_ENCRYPT_AES, YACA_BCM_CBC, 192, YACA_INVALID_PADDING, 9},
63 {YACA_ENCRYPT_AES, YACA_BCM_CBC, 192, YACA_PADDING_NONE, 12},
64 {YACA_ENCRYPT_AES, YACA_BCM_CBC, 192, YACA_PADDING_PKCS7, 11},
65 {YACA_ENCRYPT_AES, YACA_BCM_CFB, 192, YACA_INVALID_PADDING, 31},
66 {YACA_ENCRYPT_AES, YACA_BCM_CFB1, 192, YACA_INVALID_PADDING, 17},
67 {YACA_ENCRYPT_AES, YACA_BCM_CFB8, 192, YACA_INVALID_PADDING, 2},
68 {YACA_ENCRYPT_AES, YACA_BCM_CTR, 192, YACA_INVALID_PADDING, 1},
69 {YACA_ENCRYPT_AES, YACA_BCM_ECB, 192, YACA_INVALID_PADDING, 24},
70 {YACA_ENCRYPT_AES, YACA_BCM_ECB, 192, YACA_PADDING_NONE, 15},
71 {YACA_ENCRYPT_AES, YACA_BCM_ECB, 192, YACA_PADDING_PKCS7, 33},
72 {YACA_ENCRYPT_AES, YACA_BCM_OFB, 192, YACA_INVALID_PADDING, 44},
74 {YACA_ENCRYPT_AES, YACA_BCM_CBC, 256, YACA_INVALID_PADDING, 10},
75 {YACA_ENCRYPT_AES, YACA_BCM_CBC, 256, YACA_PADDING_NONE, 11},
76 {YACA_ENCRYPT_AES, YACA_BCM_CBC, 256, YACA_PADDING_PKCS7, 23},
77 {YACA_ENCRYPT_AES, YACA_BCM_CFB, 256, YACA_INVALID_PADDING, 17},
78 {YACA_ENCRYPT_AES, YACA_BCM_CFB1, 256, YACA_INVALID_PADDING, 23},
79 {YACA_ENCRYPT_AES, YACA_BCM_CFB8, 256, YACA_INVALID_PADDING, 29},
80 {YACA_ENCRYPT_AES, YACA_BCM_CTR, 256, YACA_INVALID_PADDING, 21},
81 {YACA_ENCRYPT_AES, YACA_BCM_ECB, 256, YACA_INVALID_PADDING, 9},
82 {YACA_ENCRYPT_AES, YACA_BCM_ECB, 256, YACA_PADDING_NONE, 3},
83 {YACA_ENCRYPT_AES, YACA_BCM_ECB, 256, YACA_PADDING_PKCS7, 15},
84 {YACA_ENCRYPT_AES, YACA_BCM_OFB, 256, YACA_INVALID_PADDING, 13},
86 {YACA_ENCRYPT_UNSAFE_DES, YACA_BCM_CBC, 64, YACA_INVALID_PADDING, 31},
87 {YACA_ENCRYPT_UNSAFE_DES, YACA_BCM_CBC, 64, YACA_PADDING_NONE, 22},
88 {YACA_ENCRYPT_UNSAFE_DES, YACA_BCM_CBC, 64, YACA_PADDING_PKCS7, 39},
89 {YACA_ENCRYPT_UNSAFE_DES, YACA_BCM_CFB, 64, YACA_INVALID_PADDING, 24},
90 {YACA_ENCRYPT_UNSAFE_DES, YACA_BCM_CFB1, 64, YACA_INVALID_PADDING, 11},
91 {YACA_ENCRYPT_UNSAFE_DES, YACA_BCM_CFB8, 64, YACA_INVALID_PADDING, 22},
92 {YACA_ENCRYPT_UNSAFE_DES, YACA_BCM_ECB, 64, YACA_INVALID_PADDING, 7},
93 {YACA_ENCRYPT_UNSAFE_DES, YACA_BCM_ECB, 64, YACA_PADDING_NONE, 19},
94 {YACA_ENCRYPT_UNSAFE_DES, YACA_BCM_ECB, 64, YACA_PADDING_PKCS7, 9},
95 {YACA_ENCRYPT_UNSAFE_DES, YACA_BCM_OFB, 64, YACA_INVALID_PADDING, 2},
97 {YACA_ENCRYPT_UNSAFE_3DES_2TDEA, YACA_BCM_CBC, 128, YACA_INVALID_PADDING, 16},
98 {YACA_ENCRYPT_UNSAFE_3DES_2TDEA, YACA_BCM_CBC, 128, YACA_PADDING_NONE, 25},
99 {YACA_ENCRYPT_UNSAFE_3DES_2TDEA, YACA_BCM_CBC, 128, YACA_PADDING_PKCS7, 26},
100 {YACA_ENCRYPT_UNSAFE_3DES_2TDEA, YACA_BCM_CFB, 128, YACA_INVALID_PADDING, 23},
101 {YACA_ENCRYPT_UNSAFE_3DES_2TDEA, YACA_BCM_ECB, 128, YACA_INVALID_PADDING, 13},
102 {YACA_ENCRYPT_UNSAFE_3DES_2TDEA, YACA_BCM_ECB, 128, YACA_PADDING_NONE, 10},
103 {YACA_ENCRYPT_UNSAFE_3DES_2TDEA, YACA_BCM_ECB, 128, YACA_PADDING_PKCS7, 29},
104 {YACA_ENCRYPT_UNSAFE_3DES_2TDEA, YACA_BCM_OFB, 128, YACA_INVALID_PADDING, 32},
106 {YACA_ENCRYPT_3DES_3TDEA, YACA_BCM_CBC, 192, YACA_INVALID_PADDING, 39},
107 {YACA_ENCRYPT_3DES_3TDEA, YACA_BCM_CBC, 192, YACA_PADDING_NONE, 29},
108 {YACA_ENCRYPT_3DES_3TDEA, YACA_BCM_CBC, 192, YACA_PADDING_PKCS7, 19},
109 {YACA_ENCRYPT_3DES_3TDEA, YACA_BCM_CFB, 192, YACA_INVALID_PADDING, 9},
110 {YACA_ENCRYPT_3DES_3TDEA, YACA_BCM_CFB1, 192, YACA_INVALID_PADDING, 44},
111 {YACA_ENCRYPT_3DES_3TDEA, YACA_BCM_CFB8, 192, YACA_INVALID_PADDING, 33},
112 {YACA_ENCRYPT_3DES_3TDEA, YACA_BCM_ECB, 192, YACA_INVALID_PADDING, 22},
113 {YACA_ENCRYPT_3DES_3TDEA, YACA_BCM_ECB, 192, YACA_PADDING_NONE, 11},
114 {YACA_ENCRYPT_3DES_3TDEA, YACA_BCM_ECB, 192, YACA_PADDING_PKCS7, 13},
115 {YACA_ENCRYPT_3DES_3TDEA, YACA_BCM_OFB, 192, YACA_INVALID_PADDING, 1},
117 {YACA_ENCRYPT_UNSAFE_RC4, YACA_BCM_NONE, 256, YACA_INVALID_PADDING, 17},
119 {YACA_ENCRYPT_CAST5, YACA_BCM_CBC, 128, YACA_INVALID_PADDING, 3},
120 {YACA_ENCRYPT_CAST5, YACA_BCM_CBC, 128, YACA_PADDING_NONE, 24},
121 {YACA_ENCRYPT_CAST5, YACA_BCM_CBC, 128, YACA_PADDING_PKCS7, 21},
122 {YACA_ENCRYPT_CAST5, YACA_BCM_CFB, 128, YACA_INVALID_PADDING, 19},
123 {YACA_ENCRYPT_CAST5, YACA_BCM_ECB, 128, YACA_INVALID_PADDING, 7},
124 {YACA_ENCRYPT_CAST5, YACA_BCM_ECB, 128, YACA_PADDING_NONE, 6},
125 {YACA_ENCRYPT_CAST5, YACA_BCM_ECB, 128, YACA_PADDING_PKCS7, 18},
126 {YACA_ENCRYPT_CAST5, YACA_BCM_OFB, 128, YACA_INVALID_PADDING, 2},
129 for (const auto &sa: sargs) {
131 yaca_context_h ctx = YACA_CONTEXT_NULL;
132 yaca_key_h key_prv = YACA_KEY_NULL, key_pub = YACA_KEY_NULL;
133 yaca_key_h key_sym = YACA_KEY_NULL, iv = YACA_KEY_NULL;
135 char *encrypted = NULL, *decrypted = NULL;
136 size_t encrypted_len = 0, decrypted_len = 0;
138 generate_asymmetric_keys(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT, &key_prv, &key_pub);
142 ret = yaca_seal_initialize(&ctx, key_pub, sa.algo, sa.bcm,
143 sa.key_bit_len, &key_sym, &iv);
144 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
146 size_t total = allocate_output(ctx, INPUT_DATA_SIZE, sa.split, encrypted);
149 call_update_loop(ctx, INPUT_DATA, INPUT_DATA_SIZE,
150 encrypted, encrypted_len, sa.split,
153 if (sa.padding != YACA_INVALID_PADDING) {
154 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING, &sa.padding,
155 sizeof(yaca_padding_e));
156 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
159 ret = yaca_seal_finalize(ctx, encrypted + encrypted_len, &written);
160 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
161 encrypted_len += written;
163 BOOST_REQUIRE(encrypted_len <= total);
164 ret = yaca_realloc(encrypted_len, (void **)&encrypted);
165 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
167 yaca_context_destroy(ctx);
168 ctx = YACA_CONTEXT_NULL;
173 ret = yaca_open_initialize(&ctx, key_prv, sa.algo, sa.bcm,
174 sa.key_bit_len, key_sym, iv);
175 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
177 if (sa.padding != YACA_INVALID_PADDING) {
178 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING, &sa.padding,
179 sizeof(yaca_padding_e));
180 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
183 size_t total = allocate_output(ctx, encrypted_len, sa.split, decrypted);
186 call_update_loop(ctx, encrypted, encrypted_len,
187 decrypted, decrypted_len, sa.split,
190 ret = yaca_open_finalize(ctx, decrypted + decrypted_len, &written);
191 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
192 decrypted_len += written;
194 BOOST_REQUIRE(decrypted_len <= total);
195 ret = yaca_realloc(decrypted_len, (void **)&decrypted);
196 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
198 yaca_context_destroy(ctx);
199 ctx = YACA_CONTEXT_NULL;
202 BOOST_REQUIRE(decrypted_len == INPUT_DATA_SIZE);
203 ret = yaca_memcmp(INPUT_DATA, decrypted, INPUT_DATA_SIZE);
204 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
206 yaca_key_destroy(key_prv);
207 yaca_key_destroy(key_pub);
208 yaca_key_destroy(key_sym);
209 yaca_key_destroy(iv);
210 yaca_free(encrypted);
211 yaca_free(decrypted);
215 BOOST_FIXTURE_TEST_CASE(T702__negative__seal_open, InitDebugFixture)
218 yaca_context_h ctx = YACA_CONTEXT_NULL, ctx_encrypt = YACA_CONTEXT_NULL;
219 yaca_key_h key_rsa_prv = YACA_KEY_NULL, key_rsa_pub = YACA_KEY_NULL;
220 yaca_key_h key_rsa_prv2 = YACA_KEY_NULL, key_rsa_pub2 = YACA_KEY_NULL;
221 yaca_key_h key_dsa_prv = YACA_KEY_NULL, key_dsa_pub = YACA_KEY_NULL;
222 yaca_key_h key_sym = YACA_KEY_NULL, key_sym2 = YACA_KEY_NULL;
223 yaca_key_h iv = YACA_KEY_NULL, iv2 = YACA_KEY_NULL;
224 yaca_padding_e pad_pkcs7 = YACA_PADDING_PKCS7;
225 yaca_padding_e pad_invalid = YACA_PADDING_X931;
228 char *encrypted = NULL, *decrypted = NULL;
229 size_t encrypted_len = 0, decrypted_len = 0;
231 ret = yaca_key_generate(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_256BIT, &key_sym2);
232 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
233 ret = yaca_key_generate(YACA_KEY_TYPE_IV, YACA_KEY_LENGTH_IV_128BIT, &iv2);
234 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
235 ret = yaca_encrypt_initialize(&ctx_encrypt, YACA_ENCRYPT_AES, YACA_BCM_CBC, key_sym2, iv2);
236 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
238 generate_asymmetric_keys(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT, &key_rsa_prv, &key_rsa_pub);
239 generate_asymmetric_keys(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT, &key_rsa_prv2, &key_rsa_pub2);
240 generate_asymmetric_keys(YACA_KEY_TYPE_DSA_PRIV, YACA_KEY_LENGTH_1024BIT, &key_dsa_prv, &key_dsa_pub);
242 /* get an encrypted key_sym2 */
243 yaca_key_destroy(key_sym2);
244 key_sym2 = YACA_KEY_NULL;
245 ret = yaca_seal_initialize(&ctx, key_rsa_pub2, YACA_ENCRYPT_AES, YACA_BCM_CBC,
246 YACA_KEY_LENGTH_256BIT, &key_sym2, &iv);
247 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
248 yaca_context_destroy(ctx);
249 ctx = YACA_CONTEXT_NULL;
250 yaca_key_destroy(iv);
255 ret = yaca_seal_initialize(NULL, key_rsa_pub, YACA_ENCRYPT_AES, YACA_BCM_CBC,
256 YACA_KEY_LENGTH_256BIT, &key_sym, &iv);
257 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
259 ret = yaca_seal_initialize(&ctx, YACA_KEY_NULL, YACA_ENCRYPT_AES, YACA_BCM_CBC,
260 YACA_KEY_LENGTH_256BIT, &key_sym, &iv);
261 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
263 ret = yaca_seal_initialize(&ctx, key_rsa_prv, YACA_ENCRYPT_AES, YACA_BCM_CBC,
264 YACA_KEY_LENGTH_256BIT, &key_sym, &iv);
265 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
267 ret = yaca_seal_initialize(&ctx, key_dsa_pub, YACA_ENCRYPT_AES, YACA_BCM_CBC,
268 YACA_KEY_LENGTH_256BIT, &key_sym, &iv);
269 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
271 ret = yaca_seal_initialize(&ctx, key_dsa_prv, YACA_ENCRYPT_AES, YACA_BCM_CBC,
272 YACA_KEY_LENGTH_256BIT, &key_sym, &iv);
273 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
275 ret = yaca_seal_initialize(&ctx, key_sym2, YACA_ENCRYPT_AES, YACA_BCM_CBC,
276 YACA_KEY_LENGTH_256BIT, &key_sym, &iv);
277 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
279 ret = yaca_seal_initialize(&ctx, key_rsa_pub, YACA_INVALID_ENCRYPT_ALGORITHM, YACA_BCM_CBC,
280 YACA_KEY_LENGTH_256BIT, &key_sym, &iv);
281 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
283 ret = yaca_seal_initialize(&ctx, key_rsa_pub, YACA_ENCRYPT_AES, YACA_INVALID_BLOCK_CIPHER_MODE,
284 YACA_KEY_LENGTH_256BIT, &key_sym, &iv);
285 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
287 ret = yaca_seal_initialize(&ctx, key_rsa_pub, YACA_ENCRYPT_AES, YACA_BCM_CBC,
289 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
291 ret = yaca_seal_initialize(&ctx, key_rsa_pub, YACA_ENCRYPT_AES, YACA_BCM_CBC,
292 YACA_KEY_LENGTH_256BIT, NULL, &iv);
293 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
295 ret = yaca_seal_initialize(&ctx, key_rsa_pub, YACA_ENCRYPT_AES, YACA_BCM_CBC,
296 YACA_KEY_LENGTH_256BIT, &key_sym, NULL);
297 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
299 ret = yaca_seal_initialize(&ctx, key_rsa_pub, YACA_ENCRYPT_3DES_3TDEA, YACA_BCM_CTR,
300 YACA_KEY_LENGTH_256BIT, &key_sym, &iv);
301 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
303 ret = yaca_seal_initialize(&ctx, key_rsa_pub, YACA_ENCRYPT_AES, YACA_BCM_CBC,
304 YACA_KEY_LENGTH_256BIT, &key_sym, &iv);
305 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
307 ret = yaca_context_get_output_length(ctx, INPUT_DATA_SIZE, NULL);
308 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
310 size_t total = allocate_output(ctx, INPUT_DATA_SIZE, 1, encrypted);
313 ret = yaca_seal_update(YACA_CONTEXT_NULL, INPUT_DATA, INPUT_DATA_SIZE, encrypted, &written);
314 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
316 ret = yaca_seal_update(ctx_encrypt, INPUT_DATA, INPUT_DATA_SIZE, encrypted, &written);
317 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
319 ret = yaca_seal_update(ctx, NULL, INPUT_DATA_SIZE, encrypted, &written);
320 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
322 ret = yaca_seal_update(ctx, INPUT_DATA, 0, encrypted, &written);
323 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
325 ret = yaca_seal_update(ctx, INPUT_DATA, INPUT_DATA_SIZE, NULL, &written);
326 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
328 ret = yaca_seal_update(ctx, INPUT_DATA, INPUT_DATA_SIZE, encrypted, NULL);
329 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
331 ret = yaca_seal_update(ctx, INPUT_DATA, INPUT_DATA_SIZE, encrypted, &written);
332 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
333 encrypted_len = written;
335 ret = yaca_context_set_property(ctx, YACA_PROPERTY_RC2_EFFECTIVE_KEY_BITS,
336 &len, sizeof(size_t));
337 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
339 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
340 &pad_invalid, sizeof(yaca_padding_e));
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_PADDING, &pad_pkcs7,
348 sizeof(yaca_padding_e));
349 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
351 ret = yaca_seal_finalize(YACA_CONTEXT_NULL, encrypted + encrypted_len, &written);
352 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
354 ret = yaca_seal_finalize(ctx_encrypt, encrypted + encrypted_len, &written);
355 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
357 ret = yaca_seal_finalize(ctx, NULL, &written);
358 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
360 ret = yaca_seal_finalize(ctx, encrypted + encrypted_len, NULL);
361 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
363 ret = yaca_seal_finalize(ctx, encrypted + encrypted_len, &written);
364 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
365 encrypted_len += written;
366 BOOST_REQUIRE(encrypted_len <= total);
367 ret = yaca_realloc(encrypted_len, (void **)&encrypted);
368 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
370 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING, &pad_pkcs7,
371 sizeof(yaca_padding_e));
372 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
374 ret = yaca_seal_update(ctx, INPUT_DATA, INPUT_DATA_SIZE, encrypted, &written);
375 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
377 ret = yaca_seal_finalize(ctx, encrypted + encrypted_len, &written);
378 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
380 yaca_context_destroy(ctx);
381 ctx = YACA_CONTEXT_NULL;
386 ret = yaca_open_initialize(NULL, key_rsa_prv, YACA_ENCRYPT_AES, YACA_BCM_CBC,
387 YACA_KEY_LENGTH_256BIT, key_sym, iv);
388 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
390 ret = yaca_open_initialize(&ctx, key_rsa_pub, YACA_ENCRYPT_AES, YACA_BCM_CBC,
391 YACA_KEY_LENGTH_256BIT, key_sym, iv);
392 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
394 ret = yaca_open_initialize(&ctx, key_dsa_prv, YACA_ENCRYPT_AES, YACA_BCM_CBC,
395 YACA_KEY_LENGTH_256BIT, key_sym, iv);
396 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
398 ret = yaca_open_initialize(&ctx, key_dsa_pub, YACA_ENCRYPT_AES, YACA_BCM_CBC,
399 YACA_KEY_LENGTH_256BIT, key_sym, iv);
400 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
402 ret = yaca_open_initialize(&ctx, key_sym2, YACA_ENCRYPT_AES, YACA_BCM_CBC,
403 YACA_KEY_LENGTH_256BIT, key_sym, iv);
404 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
406 ret = yaca_open_initialize(&ctx, key_rsa_prv, YACA_INVALID_ENCRYPT_ALGORITHM, YACA_BCM_CBC,
407 YACA_KEY_LENGTH_256BIT, key_sym, iv);
408 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
410 ret = yaca_open_initialize(&ctx, key_rsa_prv, YACA_ENCRYPT_AES, YACA_INVALID_BLOCK_CIPHER_MODE,
411 YACA_KEY_LENGTH_256BIT, key_sym, iv);
412 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
414 ret = yaca_open_initialize(&ctx, key_rsa_prv, YACA_ENCRYPT_AES, YACA_BCM_CBC,
415 YACA_KEY_LENGTH_192BIT, key_sym, iv);
416 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
418 ret = yaca_open_initialize(&ctx, key_rsa_prv, YACA_ENCRYPT_AES, YACA_BCM_CBC,
419 YACA_KEY_LENGTH_256BIT, YACA_KEY_NULL, iv);
420 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
422 ret = yaca_open_initialize(&ctx, key_rsa_prv, YACA_ENCRYPT_AES, YACA_BCM_CBC,
423 YACA_KEY_LENGTH_256BIT, key_sym2, iv);
424 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
426 ret = yaca_open_initialize(&ctx, key_rsa_prv, YACA_ENCRYPT_AES, YACA_BCM_CBC,
427 YACA_KEY_LENGTH_256BIT, key_rsa_prv, iv);
428 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
430 ret = yaca_open_initialize(&ctx, key_rsa_prv, YACA_ENCRYPT_AES, YACA_BCM_CBC,
431 YACA_KEY_LENGTH_256BIT, iv, iv);
432 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
434 ret = yaca_open_initialize(&ctx, key_rsa_prv, YACA_ENCRYPT_AES, YACA_BCM_CBC,
435 YACA_KEY_LENGTH_256BIT, key_sym, YACA_KEY_NULL);
436 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
438 ret = yaca_open_initialize(&ctx, key_rsa_prv, YACA_ENCRYPT_AES, YACA_BCM_CBC,
439 YACA_KEY_LENGTH_256BIT, key_sym, key_sym2);
440 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
442 ret = yaca_open_initialize(&ctx, key_rsa_prv, YACA_ENCRYPT_AES, YACA_BCM_CBC,
443 YACA_KEY_LENGTH_256BIT, key_sym, iv);
444 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
446 ret = yaca_context_set_property(ctx, YACA_PROPERTY_RC2_EFFECTIVE_KEY_BITS,
447 &len, sizeof(size_t));
448 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
450 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
452 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
454 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
455 &pad_pkcs7, sizeof(yaca_padding_e));
456 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
458 ret = yaca_context_get_output_length(ctx, encrypted_len, NULL);
459 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
461 allocate_output(ctx, encrypted_len, 1, decrypted);
464 ret = yaca_open_update(YACA_CONTEXT_NULL, encrypted, encrypted_len, decrypted, &written);
465 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
467 ret = yaca_open_update(ctx_encrypt, encrypted, encrypted_len, decrypted, &written);
468 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
470 ret = yaca_open_update(ctx, NULL, encrypted_len, decrypted, &written);
471 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
473 ret = yaca_open_update(ctx, encrypted, 0, decrypted, &written);
474 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
476 ret = yaca_open_update(ctx, encrypted, encrypted_len, NULL, &written);
477 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
479 ret = yaca_open_update(ctx, encrypted, encrypted_len, decrypted, NULL);
480 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
482 ret = yaca_open_update(ctx, encrypted, encrypted_len, decrypted, &written);
483 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
484 decrypted_len = written;
486 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
487 &pad_pkcs7, sizeof(yaca_padding_e));
488 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
490 ret = yaca_open_finalize(YACA_CONTEXT_NULL, decrypted + decrypted_len, &written);
491 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
493 ret = yaca_open_finalize(ctx_encrypt, decrypted + decrypted_len, &written);
494 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
496 ret = yaca_open_finalize(ctx, NULL, &written);
497 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
499 ret = yaca_open_finalize(ctx, decrypted + decrypted_len, NULL);
500 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
502 ret = yaca_open_finalize(ctx, decrypted + decrypted_len, &written);
503 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
505 ret = yaca_open_update(ctx, encrypted, encrypted_len, decrypted, &written);
506 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
508 ret = yaca_open_finalize(ctx, decrypted + decrypted_len, &written);
509 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
511 yaca_context_destroy(ctx);
512 ctx = YACA_CONTEXT_NULL;
513 yaca_free(decrypted);
517 /* OPEN, wrong asym key */
519 ret = yaca_open_initialize(&ctx, key_rsa_prv2, YACA_ENCRYPT_AES, YACA_BCM_CBC,
520 YACA_KEY_LENGTH_256BIT, key_sym, iv);
521 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
524 /* OPEN, wrong BCM */
526 ret = yaca_open_initialize(&ctx, key_rsa_prv, YACA_ENCRYPT_AES, YACA_BCM_ECB,
527 YACA_KEY_LENGTH_256BIT, key_sym, YACA_KEY_NULL);
528 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
530 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
531 &pad_pkcs7, sizeof(yaca_padding_e));
532 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
534 allocate_output(ctx, encrypted_len, 1, decrypted);
537 ret = yaca_open_update(ctx, encrypted, encrypted_len, decrypted, &written);
538 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
539 decrypted_len = written;
541 ret = yaca_open_finalize(ctx, decrypted + decrypted_len, &written);
542 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
544 yaca_context_destroy(ctx);
545 ctx = YACA_CONTEXT_NULL;
546 yaca_free(decrypted);
550 /* OPEN, wrong symmetric key */
552 ret = yaca_open_initialize(&ctx, key_rsa_prv, YACA_ENCRYPT_AES, YACA_BCM_CBC,
553 YACA_KEY_LENGTH_256BIT, key_sym2, iv);
554 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
557 /* OPEN, broken the end of ciphertext */
559 encrypted[encrypted_len - 1] = ~encrypted[encrypted_len - 1];
560 encrypted[encrypted_len - 2] = ~encrypted[encrypted_len - 2];
562 ret = yaca_open_initialize(&ctx, key_rsa_prv, YACA_ENCRYPT_AES, YACA_BCM_CBC,
563 YACA_KEY_LENGTH_256BIT, key_sym, iv);
564 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
566 ret = yaca_context_set_property(ctx, YACA_PROPERTY_PADDING,
567 &pad_pkcs7, sizeof(yaca_padding_e));
568 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
570 allocate_output(ctx, encrypted_len, 1, decrypted);
573 ret = yaca_open_update(ctx, encrypted, encrypted_len, decrypted, &written);
574 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
575 decrypted_len = written;
577 ret = yaca_open_finalize(ctx, decrypted + decrypted_len, &written);
578 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
580 yaca_context_destroy(ctx);
581 ctx = YACA_CONTEXT_NULL;
582 yaca_free(decrypted);
586 yaca_key_destroy(key_rsa_prv);
587 yaca_key_destroy(key_rsa_pub);
588 yaca_key_destroy(key_rsa_prv2);
589 yaca_key_destroy(key_rsa_pub2);
590 yaca_key_destroy(key_dsa_prv);
591 yaca_key_destroy(key_dsa_pub);
592 yaca_key_destroy(key_sym);
593 yaca_key_destroy(key_sym2);
594 yaca_key_destroy(iv);
595 yaca_free(encrypted);
598 BOOST_FIXTURE_TEST_CASE(T703__positive__seal_open_rc2, InitDebugFixture)
601 yaca_block_cipher_mode_e bcm;
603 size_t effective_key_bits;
607 const std::vector<seal_args> sargs = {
608 {YACA_BCM_CBC, 128, IGNORE, 11},
609 {YACA_BCM_CBC, 192, 64, 22},
610 {YACA_BCM_CBC, 200, 128, 3},
611 {YACA_BCM_CBC, 192, 255, 7},
612 {YACA_BCM_CBC, 192, 713, 2},
613 {YACA_BCM_CBC, 224, 1, 19},
614 {YACA_BCM_CBC, 256, 1024, 19},
615 {YACA_BCM_CFB, 192, IGNORE, 13},
616 {YACA_BCM_CFB, 192, 333, 33},
617 {YACA_BCM_ECB, 272, IGNORE, 8},
618 {YACA_BCM_ECB, 192, 666, 15},
619 {YACA_BCM_OFB, 520, IGNORE, 25},
620 {YACA_BCM_OFB, 224, 999, 35},
623 for (const auto &sa: sargs) {
625 yaca_context_h ctx = YACA_CONTEXT_NULL;
626 yaca_key_h key_prv = YACA_KEY_NULL, key_pub = YACA_KEY_NULL;
627 yaca_key_h key_sym = YACA_KEY_NULL, iv = YACA_KEY_NULL;
629 char *encrypted = NULL, *decrypted = NULL;
630 size_t encrypted_len = 0, decrypted_len = 0;
632 generate_asymmetric_keys(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT, &key_prv, &key_pub);
636 ret = yaca_seal_initialize(&ctx, key_pub, YACA_ENCRYPT_UNSAFE_RC2, sa.bcm,
637 sa.key_bit_len, &key_sym, &iv);
638 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
640 if (sa.effective_key_bits != IGNORE) {
641 ret = yaca_context_set_property(ctx, YACA_PROPERTY_RC2_EFFECTIVE_KEY_BITS,
642 &sa.effective_key_bits, sizeof(size_t));
643 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
646 size_t total = allocate_output(ctx, INPUT_DATA_SIZE, sa.split, encrypted);
649 call_update_loop(ctx, INPUT_DATA, INPUT_DATA_SIZE,
650 encrypted, encrypted_len, sa.split,
653 ret = yaca_seal_finalize(ctx, encrypted + encrypted_len, &written);
654 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
655 encrypted_len += written;
657 BOOST_REQUIRE(encrypted_len <= total);
658 ret = yaca_realloc(encrypted_len, (void **)&encrypted);
659 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
661 yaca_context_destroy(ctx);
662 ctx = YACA_CONTEXT_NULL;
667 ret = yaca_open_initialize(&ctx, key_prv, YACA_ENCRYPT_UNSAFE_RC2, sa.bcm,
668 sa.key_bit_len, key_sym, iv);
669 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
671 if (sa.effective_key_bits != IGNORE) {
672 ret = yaca_context_set_property(ctx, YACA_PROPERTY_RC2_EFFECTIVE_KEY_BITS,
673 &sa.effective_key_bits, sizeof(size_t));
674 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
677 size_t total = allocate_output(ctx, encrypted_len, sa.split, decrypted);
680 call_update_loop(ctx, encrypted, encrypted_len,
681 decrypted, decrypted_len, sa.split,
684 ret = yaca_open_finalize(ctx, decrypted + decrypted_len, &written);
685 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
686 decrypted_len += written;
688 BOOST_REQUIRE(decrypted_len <= total);
689 ret = yaca_realloc(decrypted_len, (void **)&decrypted);
690 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
692 yaca_context_destroy(ctx);
693 ctx = YACA_CONTEXT_NULL;
696 BOOST_REQUIRE(decrypted_len == INPUT_DATA_SIZE);
697 ret = yaca_memcmp(INPUT_DATA, decrypted, INPUT_DATA_SIZE);
698 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
700 yaca_key_destroy(key_prv);
701 yaca_key_destroy(key_pub);
702 yaca_key_destroy(key_sym);
703 yaca_key_destroy(iv);
704 yaca_free(encrypted);
705 yaca_free(decrypted);
709 BOOST_FIXTURE_TEST_CASE(T704__negative__encrypt_decrypt_rc2, InitDebugFixture)
712 yaca_context_h ctx = YACA_CONTEXT_NULL;
713 yaca_key_h key_prv = YACA_KEY_NULL, key_pub = YACA_KEY_NULL;
714 yaca_key_h key_sym = YACA_KEY_NULL, iv = YACA_KEY_NULL;
716 generate_asymmetric_keys(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT, &key_prv, &key_pub);
720 ret = yaca_seal_initialize(&ctx, key_pub, YACA_ENCRYPT_UNSAFE_RC2, YACA_BCM_CFB1,
721 YACA_KEY_LENGTH_192BIT, &key_sym, &iv);
722 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
724 ret = yaca_seal_initialize(&ctx, key_pub, YACA_ENCRYPT_UNSAFE_RC2, YACA_BCM_CTR,
725 YACA_KEY_LENGTH_192BIT, &key_sym, &iv);
726 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
728 ret = yaca_seal_initialize(&ctx, key_pub, YACA_ENCRYPT_UNSAFE_RC2, YACA_BCM_CBC,
729 YACA_KEY_LENGTH_192BIT, &key_sym, &iv);
730 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
732 yaca_context_destroy(ctx);
733 ctx = YACA_CONTEXT_NULL;
738 ret = yaca_open_initialize(&ctx, key_prv, YACA_ENCRYPT_UNSAFE_RC2, YACA_BCM_CFB1,
739 YACA_KEY_LENGTH_192BIT, key_sym, iv);
740 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
742 ret = yaca_open_initialize(&ctx, key_prv, YACA_ENCRYPT_UNSAFE_RC2, YACA_BCM_CTR,
743 YACA_KEY_LENGTH_192BIT, key_sym, iv);
744 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
747 yaca_key_destroy(key_prv);
748 yaca_key_destroy(key_pub);
749 yaca_key_destroy(key_sym);
750 yaca_key_destroy(iv);
753 BOOST_FIXTURE_TEST_CASE(T705__positive__open_seal_ccm, InitDebugFixture)
761 const std::vector<seal_args> sargs = {
762 {128, IGNORE, IGNORE},
767 {192, IGNORE, IGNORE},
772 {256, IGNORE, IGNORE},
778 for (const auto &sa: sargs) {
780 yaca_context_h ctx = YACA_CONTEXT_NULL;
781 yaca_key_h key_prv = YACA_KEY_NULL, key_pub = YACA_KEY_NULL;
782 yaca_key_h key_sym = YACA_KEY_NULL, iv = YACA_KEY_NULL;
784 char *tag = NULL, *aad = NULL;
787 char *encrypted = NULL, *decrypted = NULL;
788 size_t encrypted_len, decrypted_len;
790 generate_asymmetric_keys(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT, &key_prv, &key_pub);
794 ret = yaca_seal_initialize(&ctx, key_pub, YACA_ENCRYPT_AES, YACA_BCM_CCM,
795 sa.key_bit_len, &key_sym, &iv);
796 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
798 size_t total = allocate_output(ctx, INPUT_DATA_SIZE, 1, encrypted);
801 if (sa.ccm_tag_len != IGNORE) {
802 tag_len = sa.ccm_tag_len;
804 ret = yaca_context_set_property(ctx, YACA_PROPERTY_CCM_TAG_LEN,
805 &tag_len, sizeof(tag_len));
806 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
809 if (sa.aad_len != IGNORE) {
810 ret = yaca_malloc(sa.aad_len, (void**)&aad);
811 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
813 ret = yaca_randomize_bytes(aad, sa.aad_len);
814 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
816 ret = yaca_seal_update(ctx, NULL, INPUT_DATA_SIZE,
818 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
820 ret = yaca_context_set_property(ctx, YACA_PROPERTY_CCM_AAD,
822 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
825 ret = yaca_seal_update(ctx, INPUT_DATA, INPUT_DATA_SIZE, encrypted, &written);
826 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
827 encrypted_len = written;
829 ret = yaca_seal_finalize(ctx, encrypted + encrypted_len, &written);
830 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
831 encrypted_len += written;
833 BOOST_REQUIRE(encrypted_len <= total);
834 ret = yaca_realloc(encrypted_len, (void **)&encrypted);
835 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
837 ret = yaca_context_get_property(ctx, YACA_PROPERTY_CCM_TAG, (void**)&tag, &tag_len);
838 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
840 yaca_context_destroy(ctx);
841 ctx = YACA_CONTEXT_NULL;
846 ret = yaca_open_initialize(&ctx, key_prv, YACA_ENCRYPT_AES, YACA_BCM_CCM,
847 sa.key_bit_len, key_sym, iv);
848 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
850 size_t total = allocate_output(ctx, encrypted_len, 1, decrypted);
852 ret = yaca_context_set_property(ctx, YACA_PROPERTY_CCM_TAG, tag, tag_len);
853 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
857 if (sa.aad_len != IGNORE) {
858 ret = yaca_open_update(ctx, NULL, encrypted_len,
860 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
862 ret = yaca_context_set_property(ctx, YACA_PROPERTY_CCM_AAD,
864 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
867 ret = yaca_open_update(ctx, encrypted, encrypted_len, decrypted, &written);
868 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
869 decrypted_len = written;
871 ret = yaca_open_finalize(ctx, decrypted + decrypted_len, &written);
872 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
873 decrypted_len += written;
875 BOOST_REQUIRE(decrypted_len <= total);
876 ret = yaca_realloc(decrypted_len, (void **)&decrypted);
877 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
879 yaca_context_destroy(ctx);
880 ctx = YACA_CONTEXT_NULL;
883 BOOST_REQUIRE(decrypted_len == INPUT_DATA_SIZE);
884 ret = yaca_memcmp(INPUT_DATA, decrypted, INPUT_DATA_SIZE);
885 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
887 yaca_key_destroy(key_prv);
888 yaca_key_destroy(key_pub);
889 yaca_key_destroy(key_sym);
890 yaca_key_destroy(iv);
891 yaca_free(encrypted);
892 yaca_free(decrypted);
898 BOOST_FIXTURE_TEST_CASE(T706__negative__open_seal_ccm, InitDebugFixture)
901 yaca_context_h ctx = YACA_CONTEXT_NULL;
902 yaca_key_h key_prv = YACA_KEY_NULL, key_pub = YACA_KEY_NULL;
903 yaca_key_h key_sym = YACA_KEY_NULL, iv = YACA_KEY_NULL;
905 char *tag = NULL, *aad = NULL;
906 size_t tag_len = 0, tag_len_invalid = 17, aad_len = 55;
908 char *encrypted = NULL, *decrypted = NULL;
909 size_t encrypted_len, decrypted_len;
911 generate_asymmetric_keys(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT, &key_prv, &key_pub);
913 ret = yaca_malloc(aad_len, (void**)&aad);
914 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
915 ret = yaca_randomize_bytes(aad, aad_len);
916 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
918 /* SEAL, AAD without pre-update */
920 ret = yaca_seal_initialize(&ctx, key_pub, YACA_ENCRYPT_AES, YACA_BCM_CCM,
921 YACA_KEY_LENGTH_256BIT, &key_sym, &iv);
922 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
924 ret = yaca_context_set_property(ctx, YACA_PROPERTY_CCM_AAD, aad, aad_len);
925 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
927 yaca_context_destroy(ctx);
928 ctx = YACA_CONTEXT_NULL;
929 yaca_key_destroy(key_sym);
930 key_sym = YACA_KEY_NULL;
931 yaca_key_destroy(iv);
935 /* SEAL, pre-update without AAD */
937 ret = yaca_seal_initialize(&ctx, key_pub, YACA_ENCRYPT_AES, YACA_BCM_CCM,
938 YACA_KEY_LENGTH_256BIT, &key_sym, &iv);
939 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
941 allocate_output(ctx, INPUT_DATA_SIZE, 1, encrypted);
944 ret = yaca_context_set_property(ctx, YACA_PROPERTY_CCM_TAG_LEN,
945 &tag_len_invalid, sizeof(tag_len_invalid));
946 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
948 ret = yaca_seal_update(ctx, NULL, INPUT_DATA_SIZE, NULL, &written);
949 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
951 ret = yaca_seal_update(ctx, INPUT_DATA, INPUT_DATA_SIZE, encrypted, &written);
952 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
954 yaca_context_destroy(ctx);
955 ctx = YACA_CONTEXT_NULL;
956 yaca_key_destroy(key_sym);
957 key_sym = YACA_KEY_NULL;
958 yaca_key_destroy(iv);
964 ret = yaca_seal_initialize(&ctx, key_pub, YACA_ENCRYPT_AES, YACA_BCM_CCM,
965 YACA_KEY_LENGTH_256BIT, &key_sym, &iv);
966 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
968 size_t total = allocate_output(ctx, INPUT_DATA_SIZE, 1, encrypted);
971 ret = yaca_context_set_property(ctx, YACA_PROPERTY_CCM_TAG_LEN,
972 &tag_len_invalid, sizeof(tag_len_invalid));
973 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
975 ret = yaca_seal_update(ctx, NULL, INPUT_DATA_SIZE, encrypted, &written);
976 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
978 ret = yaca_seal_update(ctx, INPUT_DATA, INPUT_DATA_SIZE, NULL, &written);
979 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
981 ret = yaca_context_get_property(ctx, YACA_PROPERTY_CCM_TAG, (void**)&tag, &tag_len);
982 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
984 ret = yaca_seal_update(ctx, NULL, INPUT_DATA_SIZE, NULL, &written);
985 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
987 ret = yaca_seal_update(ctx, INPUT_DATA, INPUT_DATA_SIZE, encrypted, &written);
988 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
990 ret = yaca_context_set_property(ctx, YACA_PROPERTY_CCM_AAD, aad, aad_len);
991 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
993 ret = yaca_seal_update(ctx, NULL, INPUT_DATA_SIZE, NULL, &written);
994 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
996 ret = yaca_seal_update(ctx, INPUT_DATA, INPUT_DATA_SIZE, encrypted, &written);
997 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
998 encrypted_len = written;
1000 ret = yaca_seal_update(ctx, INPUT_DATA, INPUT_DATA_SIZE, encrypted, &written);
1001 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1003 ret = yaca_seal_finalize(ctx, encrypted + encrypted_len, &written);
1004 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1005 encrypted_len += written;
1006 BOOST_REQUIRE(encrypted_len <= total);
1007 ret = yaca_realloc(encrypted_len, (void **)&encrypted);
1008 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1010 ret = yaca_context_set_property(ctx, YACA_PROPERTY_CCM_AAD, aad, aad_len);
1011 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1013 ret = yaca_seal_update(ctx, INPUT_DATA, INPUT_DATA_SIZE, encrypted, &written);
1014 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1016 ret = yaca_seal_finalize(ctx, encrypted + encrypted_len, &written);
1017 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1019 ret = yaca_context_get_property(ctx, YACA_PROPERTY_CCM_TAG, (void**)&tag, &tag_len);
1020 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1022 yaca_context_destroy(ctx);
1023 ctx = YACA_CONTEXT_NULL;
1028 ret = yaca_open_initialize(&ctx, key_prv, YACA_ENCRYPT_AES, YACA_BCM_CCM,
1029 YACA_KEY_LENGTH_256BIT, key_sym, iv);
1030 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1032 allocate_output(ctx, encrypted_len, 1, decrypted);
1035 ret = yaca_open_update(ctx, NULL, encrypted_len, NULL, &written);
1036 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1037 ret = yaca_context_set_property(ctx, YACA_PROPERTY_CCM_AAD, aad, aad_len);
1038 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1040 ret = yaca_open_update(ctx, encrypted, encrypted_len, decrypted, &written);
1041 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1043 yaca_context_destroy(ctx);
1044 ctx = YACA_CONTEXT_NULL;
1045 yaca_free(decrypted);
1049 /* OPEN, AAD without pre-update */
1051 ret = yaca_open_initialize(&ctx, key_prv, YACA_ENCRYPT_AES, YACA_BCM_CCM,
1052 YACA_KEY_LENGTH_256BIT, key_sym, iv);
1053 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1055 ret = yaca_context_set_property(ctx, YACA_PROPERTY_CCM_TAG, tag, tag_len);
1056 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1058 ret = yaca_context_set_property(ctx, YACA_PROPERTY_CCM_AAD, aad, aad_len);
1059 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1061 yaca_context_destroy(ctx);
1062 ctx = YACA_CONTEXT_NULL;
1065 /* OPEN, pre-update without AAD */
1067 ret = yaca_open_initialize(&ctx, key_prv, YACA_ENCRYPT_AES, YACA_BCM_CCM,
1068 YACA_KEY_LENGTH_256BIT, key_sym, iv);
1069 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1071 allocate_output(ctx, encrypted_len, 1, decrypted);
1074 ret = yaca_context_set_property(ctx, YACA_PROPERTY_CCM_TAG, tag, tag_len);
1075 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1077 ret = yaca_open_update(ctx, NULL, encrypted_len, NULL, &written);
1078 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1080 ret = yaca_open_update(ctx, encrypted, encrypted_len, decrypted, &written);
1081 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1083 yaca_context_destroy(ctx);
1084 ctx = YACA_CONTEXT_NULL;
1085 yaca_free(decrypted);
1091 ret = yaca_open_initialize(&ctx, key_prv, YACA_ENCRYPT_AES, YACA_BCM_CCM,
1092 YACA_KEY_LENGTH_256BIT, key_sym, iv);
1093 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1095 allocate_output(ctx, encrypted_len, 1, decrypted);
1098 ret = yaca_context_set_property(ctx, YACA_PROPERTY_CCM_TAG, tag, tag_len);
1099 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1101 ret = yaca_open_update(ctx, encrypted, encrypted_len, decrypted, &written);
1102 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1104 yaca_context_destroy(ctx);
1105 ctx = YACA_CONTEXT_NULL;
1106 yaca_free(decrypted);
1112 ret = yaca_open_initialize(&ctx, key_prv, YACA_ENCRYPT_AES, YACA_BCM_CCM,
1113 YACA_KEY_LENGTH_256BIT, key_sym, iv);
1114 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1116 allocate_output(ctx, encrypted_len, 1, decrypted);
1119 ret = yaca_context_set_property(ctx, YACA_PROPERTY_CCM_TAG, tag, tag_len);
1120 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1122 ret = yaca_open_update(ctx, NULL, encrypted_len, decrypted, &written);
1123 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1125 ret = yaca_open_update(ctx, encrypted, encrypted_len, NULL, &written);
1126 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1128 ret = yaca_open_update(ctx, NULL, encrypted_len, NULL, &written);
1129 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1131 ret = yaca_open_update(ctx, encrypted, encrypted_len, decrypted, &written);
1132 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1134 ret = yaca_context_set_property(ctx, YACA_PROPERTY_CCM_AAD, aad, aad_len);
1135 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1137 ret = yaca_open_update(ctx, NULL, encrypted_len, NULL, &written);
1138 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1140 ret = yaca_open_update(ctx, encrypted, encrypted_len, decrypted, &written);
1141 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1142 decrypted_len = written;
1144 ret = yaca_open_update(ctx, encrypted, encrypted_len, decrypted, &written);
1145 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1147 ret = yaca_open_finalize(ctx, decrypted + decrypted_len, &written);
1148 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1150 ret = yaca_context_set_property(ctx, YACA_PROPERTY_CCM_AAD, aad, aad_len);
1151 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1153 ret = yaca_context_set_property(ctx, YACA_PROPERTY_CCM_TAG, tag, tag_len);
1154 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1156 ret = yaca_open_update(ctx, encrypted, encrypted_len, decrypted, &written);
1157 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1159 ret = yaca_open_finalize(ctx, decrypted + decrypted_len, &written);
1160 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1162 yaca_context_destroy(ctx);
1163 ctx = YACA_CONTEXT_NULL;
1164 yaca_free(decrypted);
1168 /* OPEN, broken TAG */
1171 ret = yaca_malloc(tag_len, (void**)&tag2);
1172 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1173 memcpy((void*)tag2, (void*)tag, tag_len);
1177 ret = yaca_open_initialize(&ctx, key_prv, YACA_ENCRYPT_AES, YACA_BCM_CCM,
1178 YACA_KEY_LENGTH_256BIT, key_sym, iv);
1179 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1181 allocate_output(ctx, encrypted_len, 1, decrypted);
1184 ret = yaca_context_set_property(ctx, YACA_PROPERTY_CCM_TAG, tag2, tag_len);
1185 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1187 ret = yaca_open_update(ctx, NULL, encrypted_len, NULL, &written);
1188 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1189 ret = yaca_context_set_property(ctx, YACA_PROPERTY_CCM_AAD, aad, aad_len);
1190 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1192 ret = yaca_open_update(ctx, encrypted, encrypted_len, decrypted, &written);
1193 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1195 yaca_context_destroy(ctx);
1196 ctx = YACA_CONTEXT_NULL;
1197 yaca_free(decrypted);
1202 /* OPEN, broken AAD */
1205 ret = yaca_malloc(aad_len, (void**)&aad2);
1206 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1207 memcpy((void*)aad2, (void*)aad, aad_len);
1211 ret = yaca_open_initialize(&ctx, key_prv, YACA_ENCRYPT_AES, YACA_BCM_CCM,
1212 YACA_KEY_LENGTH_256BIT, key_sym, iv);
1213 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1215 allocate_output(ctx, encrypted_len, 1, decrypted);
1218 ret = yaca_context_set_property(ctx, YACA_PROPERTY_CCM_TAG, tag, tag_len);
1219 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1221 ret = yaca_open_update(ctx, NULL, encrypted_len, NULL, &written);
1222 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1223 ret = yaca_context_set_property(ctx, YACA_PROPERTY_CCM_AAD, aad2, aad_len);
1224 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1226 ret = yaca_open_update(ctx, encrypted, encrypted_len, decrypted, &written);
1227 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1229 yaca_context_destroy(ctx);
1230 ctx = YACA_CONTEXT_NULL;
1231 yaca_free(decrypted);
1236 /* OPEN, broken ciphertext */
1238 encrypted[0] = ~encrypted[0];
1239 encrypted[1] = ~encrypted[1];
1241 ret = yaca_open_initialize(&ctx, key_prv, YACA_ENCRYPT_AES, YACA_BCM_CCM,
1242 YACA_KEY_LENGTH_256BIT, key_sym, iv);
1243 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1245 allocate_output(ctx, encrypted_len, 1, decrypted);
1248 ret = yaca_context_set_property(ctx, YACA_PROPERTY_CCM_TAG, tag, tag_len);
1249 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1251 ret = yaca_open_update(ctx, NULL, encrypted_len, NULL, &written);
1252 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1253 ret = yaca_context_set_property(ctx, YACA_PROPERTY_CCM_AAD, aad, aad_len);
1254 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1256 ret = yaca_open_update(ctx, encrypted, encrypted_len, decrypted, &written);
1257 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1259 yaca_context_destroy(ctx);
1260 ctx = YACA_CONTEXT_NULL;
1261 yaca_free(decrypted);
1265 yaca_key_destroy(key_prv);
1266 yaca_key_destroy(key_pub);
1267 yaca_key_destroy(key_sym);
1268 yaca_key_destroy(iv);
1269 yaca_free(encrypted);
1274 BOOST_FIXTURE_TEST_CASE(T707__positive__seal_open_gcm, InitDebugFixture)
1283 const std::vector<seal_args> sargs = {
1284 {128, IGNORE, IGNORE, 11},
1285 {128, 4, IGNORE, 12},
1286 {128, IGNORE, 21, 13},
1289 {192, IGNORE, IGNORE, 22},
1290 {192, 8, IGNORE, 23},
1291 {192, IGNORE, 32, 24},
1294 {256, IGNORE, IGNORE, 33},
1295 {256, 14, IGNORE, 34},
1296 {256, IGNORE, 17, 35},
1300 for (const auto &sa: sargs) {
1302 yaca_context_h ctx = YACA_CONTEXT_NULL;
1303 yaca_key_h key_prv = YACA_KEY_NULL, key_pub = YACA_KEY_NULL;
1304 yaca_key_h key_sym = YACA_KEY_NULL, iv = YACA_KEY_NULL;
1306 char *encrypted = NULL, *decrypted = NULL;
1307 size_t encrypted_len = 0, decrypted_len = 0;
1309 char *tag = NULL, *aad = NULL;
1312 generate_asymmetric_keys(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT, &key_prv, &key_pub);
1316 ret = yaca_seal_initialize(&ctx, key_pub, YACA_ENCRYPT_AES, YACA_BCM_GCM,
1317 sa.key_bit_len, &key_sym, &iv);
1318 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1320 size_t total = allocate_output(ctx, INPUT_DATA_SIZE, sa.split, encrypted);
1323 if (sa.aad_len != IGNORE) {
1324 ret = yaca_malloc(sa.aad_len, (void**)&aad);
1325 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1327 ret = yaca_randomize_bytes(aad, sa.aad_len);
1328 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1330 ret = yaca_context_set_property(ctx, YACA_PROPERTY_GCM_AAD,
1332 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1335 call_update_loop(ctx, INPUT_DATA, INPUT_DATA_SIZE,
1336 encrypted, encrypted_len, sa.split,
1339 ret = yaca_seal_finalize(ctx, encrypted + encrypted_len, &written);
1340 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1341 encrypted_len += written;
1343 BOOST_REQUIRE(encrypted_len <= total);
1344 ret = yaca_realloc(encrypted_len, (void **)&encrypted);
1345 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1347 if (sa.gcm_tag_len != IGNORE) {
1348 tag_len = sa.gcm_tag_len;
1350 ret = yaca_context_set_property(ctx, YACA_PROPERTY_GCM_TAG_LEN,
1351 &tag_len, sizeof(tag_len));
1352 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1356 ret = yaca_context_get_property(ctx, YACA_PROPERTY_GCM_TAG,
1357 (void**)&tag, &tag_len);
1358 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1360 yaca_context_destroy(ctx);
1361 ctx = YACA_CONTEXT_NULL;
1366 ret = yaca_open_initialize(&ctx, key_prv, YACA_ENCRYPT_AES, YACA_BCM_GCM,
1367 sa.key_bit_len, key_sym, iv);
1368 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1370 size_t total = allocate_output(ctx, encrypted_len, sa.split, decrypted);
1373 if (sa.aad_len != IGNORE) {
1374 ret = yaca_context_set_property(ctx, YACA_PROPERTY_GCM_AAD,
1376 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1379 call_update_loop(ctx, encrypted, encrypted_len,
1380 decrypted, decrypted_len, sa.split,
1383 ret = yaca_context_set_property(ctx, YACA_PROPERTY_GCM_TAG,
1385 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1387 ret = yaca_open_finalize(ctx, decrypted + decrypted_len, &written);
1388 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1389 decrypted_len += written;
1391 BOOST_REQUIRE(decrypted_len <= total);
1392 ret = yaca_realloc(decrypted_len, (void **)&decrypted);
1393 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1395 yaca_context_destroy(ctx);
1396 ctx = YACA_CONTEXT_NULL;
1399 BOOST_REQUIRE(decrypted_len == INPUT_DATA_SIZE);
1400 ret = yaca_memcmp(INPUT_DATA, decrypted, INPUT_DATA_SIZE);
1401 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1403 yaca_key_destroy(key_prv);
1404 yaca_key_destroy(key_pub);
1405 yaca_key_destroy(key_sym);
1406 yaca_key_destroy(iv);
1407 yaca_free(encrypted);
1408 yaca_free(decrypted);
1414 BOOST_FIXTURE_TEST_CASE(T708__negative__seal_open_gcm, InitDebugFixture)
1417 yaca_context_h ctx = YACA_CONTEXT_NULL;
1418 yaca_key_h key_prv = YACA_KEY_NULL, key_pub = YACA_KEY_NULL;
1419 yaca_key_h key_sym = YACA_KEY_NULL, iv = YACA_KEY_NULL;
1421 char *encrypted = NULL, *decrypted = NULL;
1422 size_t encrypted_len = 0, decrypted_len = 0;
1424 char *tag = NULL, *aad = NULL;
1425 size_t tag_len = 0, tag_len_invalid = 17, aad_len = 55;
1427 generate_asymmetric_keys(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT, &key_prv, &key_pub);
1429 ret = yaca_malloc(aad_len, (void**)&aad);
1430 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1431 ret = yaca_randomize_bytes(aad, aad_len);
1432 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1436 ret = yaca_seal_initialize(&ctx, key_pub, YACA_ENCRYPT_AES, YACA_BCM_GCM,
1437 YACA_KEY_LENGTH_256BIT, &key_sym, &iv);
1438 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1440 size_t total = allocate_output(ctx, INPUT_DATA_SIZE, 1, encrypted);
1443 ret = yaca_seal_update(ctx, NULL, INPUT_DATA_SIZE, NULL, &written);
1444 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1446 ret = yaca_context_set_property(ctx, YACA_PROPERTY_GCM_AAD, aad, aad_len);
1447 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1449 ret = yaca_seal_update(ctx, NULL, INPUT_DATA_SIZE, NULL, &written);
1450 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1452 ret = yaca_seal_update(ctx, INPUT_DATA, INPUT_DATA_SIZE, encrypted, &written);
1453 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1454 encrypted_len = written;
1456 ret = yaca_seal_finalize(ctx, encrypted + encrypted_len, &written);
1457 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1458 encrypted_len += written;
1459 BOOST_REQUIRE(encrypted_len <= total);
1460 ret = yaca_realloc(encrypted_len, (void **)&encrypted);
1461 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1463 ret = yaca_seal_update(ctx, INPUT_DATA, INPUT_DATA_SIZE, encrypted, &written);
1464 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1466 ret = yaca_seal_finalize(ctx, encrypted + encrypted_len, &written);
1467 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1469 ret = yaca_context_set_property(ctx, YACA_PROPERTY_GCM_TAG_LEN,
1470 &tag_len_invalid, sizeof(tag_len_invalid));
1471 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1473 ret = yaca_context_get_property(ctx, YACA_PROPERTY_GCM_TAG,
1474 (void**)&tag, &tag_len);
1475 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1477 yaca_context_destroy(ctx);
1478 ctx = YACA_CONTEXT_NULL;
1483 ret = yaca_open_initialize(&ctx, key_prv, YACA_ENCRYPT_AES, YACA_BCM_GCM,
1484 YACA_KEY_LENGTH_256BIT, key_sym, iv);
1485 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1487 allocate_output(ctx, encrypted_len, 1, decrypted);
1490 ret = yaca_context_set_property(ctx, YACA_PROPERTY_GCM_AAD, aad, aad_len);
1491 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1493 ret = yaca_open_update(ctx, encrypted, encrypted_len, decrypted, &written);
1494 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1495 decrypted_len = written;
1497 ret = yaca_open_finalize(ctx, decrypted + decrypted_len, &written);
1498 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1500 yaca_context_destroy(ctx);
1501 ctx = YACA_CONTEXT_NULL;
1502 yaca_free(decrypted);
1508 ret = yaca_open_initialize(&ctx, key_prv, YACA_ENCRYPT_AES, YACA_BCM_GCM,
1509 YACA_KEY_LENGTH_256BIT, key_sym, iv);
1510 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1512 allocate_output(ctx, encrypted_len, 1, decrypted);
1515 ret = yaca_open_update(ctx, encrypted, encrypted_len, decrypted, &written);
1516 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1517 decrypted_len = written;
1519 ret = yaca_context_set_property(ctx, YACA_PROPERTY_GCM_TAG, tag, tag_len);
1520 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1522 ret = yaca_open_finalize(ctx, decrypted + decrypted_len, &written);
1523 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1525 yaca_context_destroy(ctx);
1526 ctx = YACA_CONTEXT_NULL;
1527 yaca_free(decrypted);
1533 ret = yaca_open_initialize(&ctx, key_prv, YACA_ENCRYPT_AES, YACA_BCM_GCM,
1534 YACA_KEY_LENGTH_256BIT, key_sym, iv);
1535 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1537 allocate_output(ctx, encrypted_len, 1, decrypted);
1540 ret = yaca_open_update(ctx, NULL, encrypted_len, NULL, &written);
1541 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1543 ret = yaca_context_set_property(ctx, YACA_PROPERTY_GCM_AAD, aad, aad_len);
1544 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1546 ret = yaca_open_update(ctx, NULL, encrypted_len, NULL, &written);
1547 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1549 ret = yaca_open_update(ctx, encrypted, encrypted_len, decrypted, &written);
1550 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1551 decrypted_len = written;
1553 ret = yaca_context_set_property(ctx, YACA_PROPERTY_GCM_TAG, tag, tag_len);
1554 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1556 ret = yaca_open_finalize(ctx, decrypted + decrypted_len, &written);
1557 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1559 ret = yaca_open_update(ctx, encrypted, encrypted_len, decrypted, &written);
1560 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1562 ret = yaca_open_finalize(ctx, decrypted + decrypted_len, &written);
1563 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1565 yaca_context_destroy(ctx);
1566 ctx = YACA_CONTEXT_NULL;
1567 yaca_free(decrypted);
1571 /* OPEN, broken TAG */
1574 ret = yaca_malloc(tag_len, (void**)&tag2);
1575 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1576 memcpy((void*)tag2, (void*)tag, tag_len);
1580 ret = yaca_open_initialize(&ctx, key_prv, YACA_ENCRYPT_AES, YACA_BCM_GCM,
1581 YACA_KEY_LENGTH_256BIT, key_sym, iv);
1582 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1584 allocate_output(ctx, encrypted_len, 1, decrypted);
1587 ret = yaca_context_set_property(ctx, YACA_PROPERTY_GCM_AAD, aad, aad_len);
1588 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1590 ret = yaca_open_update(ctx, encrypted, encrypted_len, decrypted, &written);
1591 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1592 decrypted_len = written;
1594 ret = yaca_context_set_property(ctx, YACA_PROPERTY_GCM_TAG, tag2, tag_len);
1595 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1597 ret = yaca_open_finalize(ctx, decrypted + decrypted_len, &written);
1598 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1600 yaca_context_destroy(ctx);
1601 ctx = YACA_CONTEXT_NULL;
1602 yaca_free(decrypted);
1607 /* OPEN, broken AAD */
1610 ret = yaca_malloc(aad_len, (void**)&aad2);
1611 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1612 memcpy((void*)aad2, (void*)aad, aad_len);
1616 ret = yaca_open_initialize(&ctx, key_prv, YACA_ENCRYPT_AES, YACA_BCM_GCM,
1617 YACA_KEY_LENGTH_256BIT, key_sym, iv);
1618 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1620 allocate_output(ctx, encrypted_len, 1, decrypted);
1623 ret = yaca_context_set_property(ctx, YACA_PROPERTY_GCM_AAD, aad2, aad_len);
1624 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1626 ret = yaca_open_update(ctx, encrypted, encrypted_len, decrypted, &written);
1627 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1628 decrypted_len = written;
1630 ret = yaca_context_set_property(ctx, YACA_PROPERTY_GCM_TAG, tag, tag_len);
1631 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1633 ret = yaca_open_finalize(ctx, decrypted + decrypted_len, &written);
1634 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1636 yaca_context_destroy(ctx);
1637 ctx = YACA_CONTEXT_NULL;
1638 yaca_free(decrypted);
1643 /* OPEN, broken ciphertext */
1645 encrypted[0] = ~encrypted[0];
1646 encrypted[1] = ~encrypted[1];
1648 ret = yaca_open_initialize(&ctx, key_prv, YACA_ENCRYPT_AES, YACA_BCM_GCM,
1649 YACA_KEY_LENGTH_256BIT, key_sym, iv);
1650 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1652 allocate_output(ctx, encrypted_len, 1, decrypted);
1655 ret = yaca_context_set_property(ctx, YACA_PROPERTY_GCM_AAD, aad, aad_len);
1656 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1658 ret = yaca_open_update(ctx, encrypted, encrypted_len, decrypted, &written);
1659 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1660 decrypted_len = written;
1662 ret = yaca_context_set_property(ctx, YACA_PROPERTY_GCM_TAG, tag, tag_len);
1663 BOOST_REQUIRE(ret == YACA_ERROR_NONE);
1665 ret = yaca_open_finalize(ctx, decrypted + decrypted_len, &written);
1666 BOOST_REQUIRE(ret == YACA_ERROR_INVALID_PARAMETER);
1668 yaca_context_destroy(ctx);
1669 ctx = YACA_CONTEXT_NULL;
1670 yaca_free(decrypted);
1674 yaca_key_destroy(key_prv);
1675 yaca_key_destroy(key_pub);
1676 yaca_key_destroy(key_sym);
1677 yaca_key_destroy(iv);
1678 yaca_free(encrypted);
1683 BOOST_AUTO_TEST_SUITE_END()