1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "hks_test_cipher.h"
16 #include "hks_api.h"
17 #include "hks_param.h"
18 #include "hks_test_api_performance.h"
19 #include "hks_test_common.h"
20 #include "hks_test_log.h"
21
22 #define DEFAULT_AES_CIPHER_PLAIN_SIZE 1000
23 #define AES_DEFAULT_GCM_NONCE_LENGTH 12
24 #define AES_DEFAULT_AAD_LEN 4
25 #define DEFAULT_AES_LOCAL_PARAM_SET_OUT_SIZE 256
26 #define AES_LOCAL_KEY_SIZE_128 16
27 #define AES_LOCAL_KEY_SIZE_256 32
28
29 static const struct HksTestCipherParams g_testCipherParams[] = {
30 /* success: local aes256-gcm-none */
31 { 0, HKS_SUCCESS, { false, 0, false, 0 },
32 {
33 true, /* genKey params */
34 true, HKS_ALG_AES,
35 true, HKS_AES_KEY_SIZE_256,
36 true, HKS_KEY_PURPOSE_ENCRYPT | HKS_KEY_PURPOSE_DECRYPT,
37 false, 0,
38 true, HKS_PADDING_NONE,
39 true, HKS_MODE_GCM,
40 true, HKS_STORAGE_TEMP
41 },
42 { false, 0 },
43 {
44 HKS_TEST_CIPHER_TYPE_AES, true, /* encrypt params */
45 true, HKS_ALG_AES,
46 true, HKS_KEY_PURPOSE_ENCRYPT,
47 false, 0,
48 true, HKS_PADDING_NONE,
49 true, HKS_MODE_GCM,
50 false, 0,
51 true, AES_DEFAULT_GCM_NONCE_LENGTH,
52 true, AES_DEFAULT_AAD_LEN,
53 true, false
54 },
55 {
56 HKS_TEST_CIPHER_TYPE_AES, true, /* decrypt params */
57 true, HKS_ALG_AES,
58 true, HKS_KEY_PURPOSE_DECRYPT,
59 false, 0,
60 true, HKS_PADDING_NONE,
61 true, HKS_MODE_GCM,
62 false, 0,
63 true, AES_DEFAULT_GCM_NONCE_LENGTH,
64 true, AES_DEFAULT_AAD_LEN,
65 true, false
66 },
67 {
68 true, DEFAULT_AES_CIPHER_PLAIN_SIZE, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
69 {
70 true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16, true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16 },
71 {
72 true, DEFAULT_AES_CIPHER_PLAIN_SIZE, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
73 {
74 true, AES_LOCAL_KEY_SIZE_256, true, AES_LOCAL_KEY_SIZE_256 }
75 },
76
77 /* success: aes256-gcm-none */
78 { 1, HKS_SUCCESS, { true, DEFAULT_KEY_ALIAS_SIZE, true, DEFAULT_KEY_ALIAS_SIZE },
79 {
80 true, /* genKey params */
81 true, HKS_ALG_AES,
82 true, HKS_AES_KEY_SIZE_256,
83 true, HKS_KEY_PURPOSE_ENCRYPT | HKS_KEY_PURPOSE_DECRYPT,
84 false, 0,
85 true, HKS_PADDING_NONE,
86 true, HKS_MODE_GCM,
87 false, 0
88 },
89 { false, 0 },
90 {
91 HKS_TEST_CIPHER_TYPE_AES, true, /* encrypt params */
92 true, HKS_ALG_AES,
93 true, HKS_KEY_PURPOSE_ENCRYPT,
94 false, 0,
95 true, HKS_PADDING_NONE,
96 true, HKS_MODE_GCM,
97 false, 0,
98 true, AES_DEFAULT_GCM_NONCE_LENGTH,
99 true, AES_DEFAULT_AAD_LEN
100 },
101 {
102 HKS_TEST_CIPHER_TYPE_AES, true, /* decrypt params */
103 true, HKS_ALG_AES,
104 true, HKS_KEY_PURPOSE_DECRYPT,
105 false, 0,
106 true, HKS_PADDING_NONE,
107 true, HKS_MODE_GCM,
108 false, 0,
109 true, AES_DEFAULT_GCM_NONCE_LENGTH,
110 true, AES_DEFAULT_AAD_LEN
111 },
112 { true, DEFAULT_AES_CIPHER_PLAIN_SIZE, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
113 { true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16, true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16 },
114 { true, DEFAULT_AES_CIPHER_PLAIN_SIZE, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
115 { false, 0, false, 0 }
116 },
117 };
118
119 static const struct HksTestEncryptParams g_testEncryptParams[] = {
120 /* aes gcm nonce not set */
121 { 0, HKS_ERROR_CHECK_GET_NONCE_FAIL, { true, DEFAULT_KEY_ALIAS_SIZE, true, DEFAULT_KEY_ALIAS_SIZE },
122 {
123 true, /* genKey params */
124 true, HKS_ALG_AES,
125 true, HKS_AES_KEY_SIZE_256,
126 true, HKS_KEY_PURPOSE_ENCRYPT | HKS_KEY_PURPOSE_DECRYPT,
127 false, 0,
128 true, HKS_PADDING_NONE,
129 true, HKS_MODE_GCM
130 },
131 { 0 },
132 {
133 HKS_TEST_CIPHER_TYPE_AES, true, /* encrypt params */
134 true, HKS_ALG_AES,
135 true, HKS_KEY_PURPOSE_ENCRYPT,
136 false, 0,
137 true, HKS_PADDING_NONE,
138 true, HKS_MODE_GCM,
139 false, 0,
140 false, 0,
141 true, AES_DEFAULT_AAD_LEN,
142 false, true
143 },
144 { true, DEFAULT_AES_CIPHER_PLAIN_SIZE, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
145 { true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16, true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16 },
146 { false, 0, false, 0 }
147 },
148
149 /* aes gcm nonce size invalid */
150 { 1, HKS_ERROR_INVALID_NONCE, { true, DEFAULT_KEY_ALIAS_SIZE, true, DEFAULT_KEY_ALIAS_SIZE },
151 {
152 true, /* genKey params */
153 true, HKS_ALG_AES,
154 true, HKS_AES_KEY_SIZE_256,
155 true, HKS_KEY_PURPOSE_ENCRYPT | HKS_KEY_PURPOSE_DECRYPT,
156 false, 0,
157 true, HKS_PADDING_NONE,
158 true, HKS_MODE_GCM
159 },
160 { 0 },
161 {
162 HKS_TEST_CIPHER_TYPE_AES, true, /* encrypt params */
163 true, HKS_ALG_AES,
164 true, HKS_KEY_PURPOSE_ENCRYPT,
165 false, 0,
166 true, HKS_PADDING_NONE,
167 true, HKS_MODE_GCM,
168 false, 0,
169 true, AES_DEFAULT_GCM_NONCE_LENGTH - 1,
170 true, AES_DEFAULT_AAD_LEN,
171 false, true
172 },
173 { true, DEFAULT_AES_CIPHER_PLAIN_SIZE, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
174 { true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16, true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16 },
175 { false, 0, false, 0 }
176 },
177
178 /* aes gcm aad not set */
179 { 2, HKS_ERROR_CHECK_GET_AAD_FAIL, { true, DEFAULT_KEY_ALIAS_SIZE, true, DEFAULT_KEY_ALIAS_SIZE },
180 {
181 true, /* genKey params */
182 true, HKS_ALG_AES,
183 true, HKS_AES_KEY_SIZE_256,
184 true, HKS_KEY_PURPOSE_ENCRYPT | HKS_KEY_PURPOSE_DECRYPT,
185 false, 0,
186 true, HKS_PADDING_NONE,
187 true, HKS_MODE_GCM
188 },
189 { 0 },
190 {
191 HKS_TEST_CIPHER_TYPE_AES, true, /* encrypt params */
192 true, HKS_ALG_AES,
193 true, HKS_KEY_PURPOSE_ENCRYPT,
194 false, 0,
195 true, HKS_PADDING_NONE,
196 true, HKS_MODE_GCM,
197 false, 0,
198 true, AES_DEFAULT_GCM_NONCE_LENGTH,
199 false, 0,
200 false, true
201 },
202 { true, DEFAULT_AES_CIPHER_PLAIN_SIZE, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
203 { true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16, true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16 },
204 { false, 0, false, 0 }
205 },
206 /* aes gcm inSize == 0 */
207 { 3, HKS_ERROR_INVALID_ARGUMENT, { true, DEFAULT_KEY_ALIAS_SIZE, true, DEFAULT_KEY_ALIAS_SIZE },
208 {
209 true, /* genKey params */
210 true, HKS_ALG_AES,
211 true, HKS_AES_KEY_SIZE_256,
212 true, HKS_KEY_PURPOSE_ENCRYPT | HKS_KEY_PURPOSE_DECRYPT,
213 false, 0,
214 true, HKS_PADDING_NONE,
215 true, HKS_MODE_GCM
216 },
217 { 0 },
218 {
219 HKS_TEST_CIPHER_TYPE_AES, true, /* encrypt params */
220 true, HKS_ALG_AES,
221 true, HKS_KEY_PURPOSE_ENCRYPT,
222 false, 0,
223 true, HKS_PADDING_NONE,
224 true, HKS_MODE_GCM,
225 false, 0,
226 true, AES_DEFAULT_GCM_NONCE_LENGTH,
227 true, AES_DEFAULT_AAD_LEN,
228 false, true
229 },
230 { true, 0, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
231 { true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16, true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16 },
232 { false, 0, false, 0 }
233 },
234
235 /* aes gcm outSize too small */
236 { 4, HKS_ERROR_BUFFER_TOO_SMALL, { true, DEFAULT_KEY_ALIAS_SIZE, true, DEFAULT_KEY_ALIAS_SIZE },
237 {
238 true, /* genKey params */
239 true, HKS_ALG_AES,
240 true, HKS_AES_KEY_SIZE_256,
241 true, HKS_KEY_PURPOSE_ENCRYPT | HKS_KEY_PURPOSE_DECRYPT,
242 false, 0,
243 true, HKS_PADDING_NONE,
244 true, HKS_MODE_GCM },
245 { 0 },
246 {
247 HKS_TEST_CIPHER_TYPE_AES, true, /* encrypt params */
248 true, HKS_ALG_AES,
249 true, HKS_KEY_PURPOSE_ENCRYPT,
250 false, 0,
251 true, HKS_PADDING_NONE,
252 true, HKS_MODE_GCM,
253 false, 0,
254 true, AES_DEFAULT_GCM_NONCE_LENGTH,
255 true, AES_DEFAULT_AAD_LEN,
256 false, true
257 },
258 { true, DEFAULT_AES_CIPHER_PLAIN_SIZE, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
259 { true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16 - 1, true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16 - 1 },
260 { false, 0, false, 0 }
261 },
262 };
263
264 static const struct HksTestDecryptParams g_testDecryptParams[] = {
265 /* aes gcm nonce not set */
266 { 0, HKS_ERROR_CHECK_GET_NONCE_FAIL, { true, DEFAULT_KEY_ALIAS_SIZE, true, DEFAULT_KEY_ALIAS_SIZE },
267 {
268 true, /* genKey params */
269 true, HKS_ALG_AES,
270 true, HKS_AES_KEY_SIZE_256,
271 true, HKS_KEY_PURPOSE_ENCRYPT | HKS_KEY_PURPOSE_DECRYPT,
272 false, 0,
273 true, HKS_PADDING_NONE,
274 true, HKS_MODE_GCM
275 },
276 { 0 },
277 {
278 HKS_TEST_CIPHER_TYPE_AES, true, /* decrypt params */
279 true, HKS_ALG_AES,
280 true, HKS_KEY_PURPOSE_DECRYPT,
281 false, 0,
282 true, HKS_PADDING_NONE,
283 true, HKS_MODE_GCM,
284 false, 0,
285 false, AES_DEFAULT_GCM_NONCE_LENGTH,
286 true, AES_DEFAULT_AAD_LEN,
287 false, true
288 },
289 { true, DEFAULT_AES_CIPHER_PLAIN_SIZE, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
290 { true, DEFAULT_AES_CIPHER_PLAIN_SIZE - 16, true, DEFAULT_AES_CIPHER_PLAIN_SIZE - 16 },
291 { false, 0, false, 0 }
292 },
293
294 /* aes gcm nonce size invalid */
295 { 1, HKS_ERROR_INVALID_NONCE, { true, DEFAULT_KEY_ALIAS_SIZE, true, DEFAULT_KEY_ALIAS_SIZE },
296 {
297 true, /* genKey params */
298 true, HKS_ALG_AES,
299 true, HKS_AES_KEY_SIZE_256,
300 true, HKS_KEY_PURPOSE_ENCRYPT | HKS_KEY_PURPOSE_DECRYPT,
301 false, 0,
302 true, HKS_PADDING_NONE,
303 true, HKS_MODE_GCM
304 },
305 { 0 },
306 {
307 HKS_TEST_CIPHER_TYPE_AES, true, /* decrypt params */
308 true, HKS_ALG_AES,
309 true, HKS_KEY_PURPOSE_DECRYPT,
310 false, 0,
311 true, HKS_PADDING_NONE,
312 true, HKS_MODE_GCM,
313 false, 0,
314 true, AES_DEFAULT_GCM_NONCE_LENGTH - 1,
315 true, AES_DEFAULT_AAD_LEN,
316 false, true
317 },
318 { true, DEFAULT_AES_CIPHER_PLAIN_SIZE, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
319 { true, DEFAULT_AES_CIPHER_PLAIN_SIZE - 16, true, DEFAULT_AES_CIPHER_PLAIN_SIZE - 16 },
320 { false, 0, false, 0 }
321 },
322
323 /* aes gcm aad not set */
324 { 2, HKS_ERROR_CHECK_GET_AAD_FAIL, { true, DEFAULT_KEY_ALIAS_SIZE, true, DEFAULT_KEY_ALIAS_SIZE },
325 {
326 true, /* genKey params */
327 true, HKS_ALG_AES,
328 true, HKS_AES_KEY_SIZE_256,
329 true, HKS_KEY_PURPOSE_ENCRYPT | HKS_KEY_PURPOSE_DECRYPT,
330 false, 0,
331 true, HKS_PADDING_NONE,
332 true, HKS_MODE_GCM
333 },
334 { 0 },
335 {
336 HKS_TEST_CIPHER_TYPE_AES, true, /* decrypt params */
337 true, HKS_ALG_AES,
338 true, HKS_KEY_PURPOSE_DECRYPT,
339 false, 0,
340 true, HKS_PADDING_NONE,
341 true, HKS_MODE_GCM,
342 false, 0,
343 true, AES_DEFAULT_GCM_NONCE_LENGTH,
344 false, 0,
345 false, true
346 },
347 { true, DEFAULT_AES_CIPHER_PLAIN_SIZE, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
348 { true, DEFAULT_AES_CIPHER_PLAIN_SIZE - 16, true, DEFAULT_AES_CIPHER_PLAIN_SIZE - 16 },
349 { false, 0, false, 0 }
350 },
351 /* aes gcm inSize <= 16 */
352 { 3, HKS_ERROR_INVALID_ARGUMENT, { true, DEFAULT_KEY_ALIAS_SIZE, true, DEFAULT_KEY_ALIAS_SIZE },
353 {
354 true, /* genKey params */
355 true, HKS_ALG_AES,
356 true, HKS_AES_KEY_SIZE_256,
357 true, HKS_KEY_PURPOSE_ENCRYPT | HKS_KEY_PURPOSE_DECRYPT,
358 false, 0,
359 true, HKS_PADDING_NONE,
360 true, HKS_MODE_GCM
361 },
362 { 0 },
363 {
364 HKS_TEST_CIPHER_TYPE_AES, true, /* decrypt params */
365 true, HKS_ALG_AES,
366 true, HKS_KEY_PURPOSE_DECRYPT,
367 false, 0,
368 true, HKS_PADDING_NONE,
369 true, HKS_MODE_GCM,
370 false, 0,
371 true, AES_DEFAULT_GCM_NONCE_LENGTH,
372 true, AES_DEFAULT_AAD_LEN,
373 false, true
374 },
375 { true, 16, true, 16 },
376 { true, DEFAULT_AES_CIPHER_PLAIN_SIZE - 16, true, DEFAULT_AES_CIPHER_PLAIN_SIZE - 16 },
377 { false, 0, false, 0 }
378 },
379
380 /* aes gcm outSize too small */
381 { 4, HKS_ERROR_BUFFER_TOO_SMALL, { true, DEFAULT_KEY_ALIAS_SIZE, true, DEFAULT_KEY_ALIAS_SIZE },
382 {
383 true, /* genKey params */
384 true, HKS_ALG_AES,
385 true, HKS_AES_KEY_SIZE_256,
386 true, HKS_KEY_PURPOSE_ENCRYPT | HKS_KEY_PURPOSE_DECRYPT,
387 false, 0,
388 true, HKS_PADDING_NONE,
389 true, HKS_MODE_GCM
390 },
391 { 0 },
392 {
393 HKS_TEST_CIPHER_TYPE_AES, true, /* decrypt params */
394 true, HKS_ALG_AES,
395 true, HKS_KEY_PURPOSE_DECRYPT,
396 false, 0,
397 true, HKS_PADDING_NONE,
398 true, HKS_MODE_GCM,
399 false, 0,
400 true, AES_DEFAULT_GCM_NONCE_LENGTH,
401 true, AES_DEFAULT_AAD_LEN,
402 false, true
403 },
404 { true, DEFAULT_AES_CIPHER_PLAIN_SIZE, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
405 { true, DEFAULT_AES_CIPHER_PLAIN_SIZE - 16 - 1, true, DEFAULT_AES_CIPHER_PLAIN_SIZE - 16 -1 },
406 { false, 0, false, 0 }
407 },
408 };
409
ConstructDataToBlob(struct HksBlob ** inData,struct HksBlob ** outData,const struct HksTestBlobParams * inTextParams,const struct HksTestBlobParams * outTextParams)410 static int32_t ConstructDataToBlob(struct HksBlob **inData, struct HksBlob **outData,
411 const struct HksTestBlobParams *inTextParams, const struct HksTestBlobParams *outTextParams)
412 {
413 int32_t ret = TestConstuctBlob(inData,
414 inTextParams->blobExist,
415 inTextParams->blobSize,
416 inTextParams->blobDataExist,
417 inTextParams->blobDataSize);
418 HKS_TEST_ASSERT(ret == 0);
419
420 ret = TestConstuctBlob(outData,
421 outTextParams->blobExist,
422 outTextParams->blobSize,
423 outTextParams->blobDataExist,
424 outTextParams->blobDataSize);
425 HKS_TEST_ASSERT(ret == 0);
426 return ret;
427 }
428
Encrypt(struct CipherEncryptStructure * encryptStruct)429 static int32_t Encrypt(struct CipherEncryptStructure *encryptStruct)
430 {
431 int32_t ret;
432 struct HksParamSet *encryptParamSet = NULL;
433
434 if (encryptStruct->cipherParms->cipherType == HKS_TEST_CIPHER_TYPE_RSA) {
435 struct TestRsaCipherParamSet rsaCipherParamStructure = {
436 &encryptParamSet,
437 encryptStruct->cipherParms->paramSetExist,
438 encryptStruct->cipherParms->setAlg, encryptStruct->cipherParms->alg,
439 encryptStruct->cipherParms->setPurpose, encryptStruct->cipherParms->purpose,
440 encryptStruct->cipherParms->setDigest, encryptStruct->cipherParms->digest,
441 encryptStruct->cipherParms->setPadding, encryptStruct->cipherParms->padding
442 };
443 ret = TestConstructRsaCipherParamSet(&rsaCipherParamStructure);
444 } else {
445 uint32_t ivSize = encryptStruct->cipherParms->ivSize;
446 uint32_t nonceSize = encryptStruct->cipherParms->nonceSize;
447 uint32_t aadSize = encryptStruct->cipherParms->aadSize;
448 if (ivSize != 0) {
449 ret = TestConstuctBlob(encryptStruct->ivData, true, ivSize, true, ivSize);
450 HKS_TEST_ASSERT(ret == 0);
451 }
452 if (nonceSize != 0) {
453 ret = TestConstuctBlob(encryptStruct->nonceData, true, nonceSize, true, nonceSize);
454 HKS_TEST_ASSERT(ret == 0);
455 }
456 if (aadSize != 0) {
457 ret = TestConstuctBlob(encryptStruct->aadData, true, aadSize, true, aadSize);
458 HKS_TEST_ASSERT(ret == 0);
459 }
460 struct AesCipherParamSetStructure enParamStruct = {
461 &encryptParamSet,
462 encryptStruct->cipherParms->paramSetExist,
463 encryptStruct->cipherParms->setAlg, encryptStruct->cipherParms->alg,
464 encryptStruct->cipherParms->setPurpose, encryptStruct->cipherParms->purpose,
465 encryptStruct->cipherParms->setPadding, encryptStruct->cipherParms->padding,
466 encryptStruct->cipherParms->setBlockMode, encryptStruct->cipherParms->mode,
467 encryptStruct->cipherParms->setIv, *(encryptStruct->ivData),
468 encryptStruct->cipherParms->setNonce, *(encryptStruct->nonceData),
469 encryptStruct->cipherParms->setAad, *(encryptStruct->aadData),
470 encryptStruct->cipherParms->setIsKeyAlias, encryptStruct->cipherParms->isKeyAlias
471 };
472 ret = TestConstructAesCipherParamSet(&enParamStruct);
473 HKS_TEST_ASSERT(ret == 0);
474 }
475
476 ret = HksEncryptRun(encryptStruct->keyAlias, encryptParamSet, encryptStruct->plainData, encryptStruct->cipherData,
477 encryptStruct->performTimes);
478 HksFreeParamSet(&encryptParamSet);
479 return ret;
480 }
481
DecryptCipher(struct CipherDecryptStructure * decryptStruct)482 static int32_t DecryptCipher(struct CipherDecryptStructure *decryptStruct)
483 {
484 int32_t ret = TestConstuctBlob(decryptStruct->decryptedData,
485 decryptStruct->cipherParms->decryptedTextParams.blobExist,
486 decryptStruct->cipherParms->decryptedTextParams.blobSize,
487 decryptStruct->cipherParms->decryptedTextParams.blobDataExist,
488 decryptStruct->cipherParms->decryptedTextParams.blobDataSize);
489 HKS_TEST_ASSERT(ret == 0);
490
491 struct HksParamSet *decryptParamSet = NULL;
492 if (decryptStruct->cipherParms->decryptParamSetParams.cipherType == HKS_TEST_CIPHER_TYPE_RSA) {
493 struct TestRsaCipherParamSet rsaDeCipherParamStructure = {
494 &decryptParamSet,
495 decryptStruct->cipherParms->decryptParamSetParams.paramSetExist,
496 decryptStruct->cipherParms->decryptParamSetParams.setAlg,
497 decryptStruct->cipherParms->decryptParamSetParams.alg,
498 decryptStruct->cipherParms->decryptParamSetParams.setPurpose,
499 decryptStruct->cipherParms->decryptParamSetParams.purpose,
500 decryptStruct->cipherParms->decryptParamSetParams.setDigest,
501 decryptStruct->cipherParms->decryptParamSetParams.digest,
502 decryptStruct->cipherParms->decryptParamSetParams.setPadding,
503 decryptStruct->cipherParms->decryptParamSetParams.padding
504 };
505 ret = TestConstructRsaCipherParamSet(&rsaDeCipherParamStructure);
506 } else {
507 struct AesCipherParamSetStructure deParamStruct = {
508 &decryptParamSet,
509 decryptStruct->cipherParms->decryptParamSetParams.paramSetExist,
510 decryptStruct->cipherParms->decryptParamSetParams.setAlg,
511 decryptStruct->cipherParms->decryptParamSetParams.alg,
512 decryptStruct->cipherParms->decryptParamSetParams.setPurpose,
513 decryptStruct->cipherParms->decryptParamSetParams.purpose,
514 decryptStruct->cipherParms->decryptParamSetParams.setPadding,
515 decryptStruct->cipherParms->decryptParamSetParams.padding,
516 decryptStruct->cipherParms->decryptParamSetParams.setBlockMode,
517 decryptStruct->cipherParms->decryptParamSetParams.mode,
518 decryptStruct->cipherParms->decryptParamSetParams.setIv, decryptStruct->ivData,
519 decryptStruct->cipherParms->decryptParamSetParams.setNonce, decryptStruct->nonceData,
520 decryptStruct->cipherParms->decryptParamSetParams.setAad, decryptStruct->aadData,
521 decryptStruct->cipherParms->decryptParamSetParams.setIsKeyAlias,
522 decryptStruct->cipherParms->decryptParamSetParams.isKeyAlias
523 };
524 ret = TestConstructAesCipherParamSet(&deParamStruct);
525 HKS_TEST_ASSERT(ret == 0);
526 }
527
528 ret = HksDecryptRun(decryptStruct->keyAlias, decryptParamSet, decryptStruct->cipherData,
529 *(decryptStruct->decryptedData), decryptStruct->performTimes);
530 HksFreeParamSet(&decryptParamSet);
531 return ret;
532 }
533
Decrypt(struct OnlyDecryptStructure * onlyDecryptStruct)534 static int32_t Decrypt(struct OnlyDecryptStructure *onlyDecryptStruct)
535 {
536 struct HksParamSet *decryptParamSet = NULL;
537 int32_t ret;
538 if (onlyDecryptStruct->cipherParms->cipherType == HKS_TEST_CIPHER_TYPE_RSA) {
539 struct TestRsaCipherParamSet rsaCipherParamStructure = {
540 &decryptParamSet,
541 onlyDecryptStruct->cipherParms->paramSetExist,
542 onlyDecryptStruct->cipherParms->setAlg, onlyDecryptStruct->cipherParms->alg,
543 onlyDecryptStruct->cipherParms->setPurpose, onlyDecryptStruct->cipherParms->purpose,
544 onlyDecryptStruct->cipherParms->setDigest, onlyDecryptStruct->cipherParms->digest,
545 onlyDecryptStruct->cipherParms->setPadding, onlyDecryptStruct->cipherParms->padding
546 };
547 ret = TestConstructRsaCipherParamSet(&rsaCipherParamStructure);
548 } else {
549 uint32_t ivSize = onlyDecryptStruct->cipherParms->ivSize;
550 uint32_t nonceSize = onlyDecryptStruct->cipherParms->nonceSize;
551 uint32_t aadSize = onlyDecryptStruct->cipherParms->aadSize;
552 if (ivSize != 0) {
553 ret = TestConstuctBlob(onlyDecryptStruct->ivData, true, ivSize, true, ivSize);
554 HKS_TEST_ASSERT(ret == 0);
555 }
556 if (nonceSize != 0) {
557 ret = TestConstuctBlob(onlyDecryptStruct->nonceData, true, nonceSize, true, nonceSize);
558 HKS_TEST_ASSERT(ret == 0);
559 }
560 if (aadSize != 0) {
561 ret = TestConstuctBlob(onlyDecryptStruct->aadData, true, aadSize, true, aadSize);
562 HKS_TEST_ASSERT(ret == 0);
563 }
564 struct AesCipherParamSetStructure onlyDeParamStruct = {
565 &decryptParamSet,
566 onlyDecryptStruct->cipherParms->paramSetExist,
567 onlyDecryptStruct->cipherParms->setAlg, onlyDecryptStruct->cipherParms->alg,
568 onlyDecryptStruct->cipherParms->setPurpose, onlyDecryptStruct->cipherParms->purpose,
569 onlyDecryptStruct->cipherParms->setPadding, onlyDecryptStruct->cipherParms->padding,
570 onlyDecryptStruct->cipherParms->setBlockMode, onlyDecryptStruct->cipherParms->mode,
571 onlyDecryptStruct->cipherParms->setIv, *(onlyDecryptStruct->ivData),
572 onlyDecryptStruct->cipherParms->setNonce, *(onlyDecryptStruct->nonceData),
573 onlyDecryptStruct->cipherParms->setAad, *(onlyDecryptStruct->aadData),
574 onlyDecryptStruct->cipherParms->setIsKeyAlias, onlyDecryptStruct->cipherParms->isKeyAlias
575 };
576 ret = TestConstructAesCipherParamSet(&onlyDeParamStruct);
577 }
578 HKS_TEST_ASSERT(ret == 0);
579
580 ret = HksDecryptRun(onlyDecryptStruct->keyAlias, decryptParamSet, onlyDecryptStruct->cipherData,
581 onlyDecryptStruct->decryptedData, onlyDecryptStruct->performTimes);
582 HksFreeParamSet(&decryptParamSet);
583 return ret;
584 }
585
586
BaseTestCipher(uint32_t times,uint32_t index,uint32_t performTimes)587 int32_t BaseTestCipher(uint32_t times, uint32_t index, uint32_t performTimes)
588 {
589 /* 1. generate key */
590 struct HksBlob *keyAlias = NULL;
591 int32_t ret;
592 if ((g_testCipherParams[index].genKeyParamSetParams.setKeyStorageFlag) &&
593 g_testCipherParams[index].genKeyParamSetParams.keyStorageFlag == HKS_STORAGE_TEMP) {
594 ret = GenerateLocalRandomKey(&keyAlias, &g_testCipherParams[index].localKeyParams);
595 } else {
596 ret = HuksGenerateKey(&keyAlias, &g_testCipherParams[index].keyAliasParams,
597 &g_testCipherParams[index].genKeyParamSetParams, &g_testCipherParams[index].genKeyParamSetParamsOut);
598 }
599 HKS_TEST_ASSERT(ret == 0);
600 struct HksBlob *plainData = NULL;
601 struct HksBlob *cipherData = NULL;
602 ret = ConstructDataToBlob(&plainData, &cipherData,
603 &g_testCipherParams[index].plainTextParams, &g_testCipherParams[index].cipherTextParams);
604 HKS_TEST_ASSERT(ret == 0);
605 struct HksBlob *ivData = NULL;
606 struct HksBlob *nonceData = NULL;
607 struct HksBlob *aadData = NULL;
608 /* 2. encrypt */
609 struct CipherEncryptStructure testEncryptStruct = {
610 keyAlias, &g_testCipherParams[index].encryptParamSetParams,
611 plainData, cipherData, &ivData, &nonceData, &aadData, performTimes
612 };
613 ret = Encrypt(&testEncryptStruct);
614 HKS_TEST_ASSERT(ret == g_testCipherParams[index].expectResult);
615
616 /* 3. decrypt */
617 struct HksBlob *decryptedData = NULL;
618 struct CipherDecryptStructure testDecryptStruct = {
619 keyAlias, &g_testCipherParams[index], cipherData,
620 &decryptedData, ivData, nonceData, aadData, performTimes
621 };
622 ret = DecryptCipher(&testDecryptStruct);
623 HKS_TEST_ASSERT(ret == g_testCipherParams[index].expectResult);
624
625 HKS_TEST_ASSERT(plainData->size == decryptedData->size);
626 HKS_TEST_ASSERT(memcmp(plainData->data, decryptedData->data, plainData->size) == 0);
627 if (!((g_testCipherParams[index].genKeyParamSetParams.setKeyStorageFlag) &&
628 g_testCipherParams[index].genKeyParamSetParams.keyStorageFlag == HKS_STORAGE_TEMP)) {
629 HKS_TEST_ASSERT(HksDeleteKey(keyAlias, NULL) == 0);
630 }
631 TestFreeBlob(&keyAlias);
632 TestFreeBlob(&plainData);
633 TestFreeBlob(&cipherData);
634 TestFreeBlob(&decryptedData);
635 TestFreeBlob(&ivData);
636 TestFreeBlob(&nonceData);
637 TestFreeBlob(&aadData);
638 return (ret != g_testCipherParams[index].expectResult);
639 }
640
BaseTestEncrypt(uint32_t times,uint32_t index,uint32_t performTimes)641 int32_t BaseTestEncrypt(uint32_t times, uint32_t index, uint32_t performTimes)
642 {
643 /* 1. generate key */
644 struct HksBlob *keyAlias = NULL;
645 int32_t ret;
646 if (g_testEncryptParams[index].encryptParamSetParams.setIsKeyAlias &&
647 !g_testEncryptParams[index].encryptParamSetParams.isKeyAlias) {
648 ret = GenerateLocalRandomKey(&keyAlias, &g_testEncryptParams[index].localKeyParams);
649 } else {
650 if (g_testEncryptParams[index].keyAliasParams.blobExist) {
651 ret = HuksGenerateKey(&keyAlias, &g_testEncryptParams[index].keyAliasParams,
652 &g_testEncryptParams[index].genKeyParamSetParams, NULL);
653 } else {
654 ret = TestConstuctBlob(&keyAlias,
655 g_testEncryptParams[index].encryptAliasParams.blobExist,
656 g_testEncryptParams[index].encryptAliasParams.blobSize,
657 g_testEncryptParams[index].encryptAliasParams.blobDataExist,
658 g_testEncryptParams[index].encryptAliasParams.blobDataSize);
659 }
660 }
661 HKS_TEST_ASSERT(ret == 0);
662
663 struct HksBlob *plainData = NULL;
664 struct HksBlob *cipherData = NULL;
665 ret = ConstructDataToBlob(&plainData, &cipherData,
666 &g_testEncryptParams[index].inDataParams, &g_testEncryptParams[index].outDataParams);
667 HKS_TEST_ASSERT(ret == 0);
668
669 struct HksBlob *ivData = NULL;
670 struct HksBlob *nonceData = NULL;
671 struct HksBlob *aadData = NULL;
672 /* 2. encrypt */
673 struct CipherEncryptStructure encryptStruct = {
674 keyAlias, &g_testEncryptParams[index].encryptParamSetParams, plainData, cipherData, &ivData,
675 &nonceData, &aadData, performTimes
676 };
677 ret = Encrypt(&encryptStruct);
678 HKS_TEST_ASSERT(ret == g_testEncryptParams[index].expectResult);
679
680 /* 4. delete key */
681 if (g_testEncryptParams[index].keyAliasParams.blobExist) {
682 HKS_TEST_ASSERT(HksDeleteKey(keyAlias, NULL) == 0);
683 }
684 TestFreeBlob(&keyAlias);
685 TestFreeBlob(&plainData);
686 TestFreeBlob(&cipherData);
687 TestFreeBlob(&ivData);
688 TestFreeBlob(&nonceData);
689 TestFreeBlob(&aadData);
690 return (ret != g_testEncryptParams[index].expectResult);
691 }
692
BaseTestDecrypt(uint32_t times,uint32_t index,uint32_t performTimes)693 int32_t BaseTestDecrypt(uint32_t times, uint32_t index, uint32_t performTimes)
694 {
695 /* 1. generate key */
696 struct HksBlob *keyAlias = NULL;
697 int32_t ret;
698 if (g_testDecryptParams[index].decryptParamSetParams.setIsKeyAlias &&
699 !g_testDecryptParams[index].decryptParamSetParams.isKeyAlias) {
700 ret = GenerateLocalRandomKey(&keyAlias, &g_testDecryptParams[index].localKeyParams);
701 } else {
702 if (g_testDecryptParams[index].keyAliasParams.blobExist) {
703 ret = HuksGenerateKey(&keyAlias, &g_testDecryptParams[index].keyAliasParams,
704 &g_testDecryptParams[index].genKeyParamSetParams, NULL);
705 } else {
706 ret = TestConstuctBlob(&keyAlias,
707 g_testDecryptParams[index].decryptAliasParams.blobExist,
708 g_testDecryptParams[index].decryptAliasParams.blobSize,
709 g_testDecryptParams[index].decryptAliasParams.blobDataExist,
710 g_testDecryptParams[index].decryptAliasParams.blobDataSize);
711 }
712 }
713 HKS_TEST_ASSERT(ret == 0);
714
715 struct HksBlob *cipherData = NULL;
716 struct HksBlob *decryptedData = NULL;
717 ret = ConstructDataToBlob(&cipherData, &decryptedData,
718 &g_testDecryptParams[index].inDataParams, &g_testDecryptParams[index].outDataParams);
719 HKS_TEST_ASSERT(ret == 0);
720
721 struct HksBlob *ivData = NULL;
722 struct HksBlob *nonceData = NULL;
723 struct HksBlob *aadData = NULL;
724 /* 3. encrypt */
725 struct OnlyDecryptStructure onlyDecryptStruct = {
726 keyAlias, &g_testDecryptParams[index].decryptParamSetParams, cipherData, decryptedData, &ivData,
727 &nonceData, &aadData, performTimes
728 };
729 ret = Decrypt(&onlyDecryptStruct);
730 HKS_TEST_ASSERT(ret == g_testDecryptParams[index].expectResult);
731
732 /* 4. delete key */
733 if (g_testDecryptParams[index].keyAliasParams.blobExist) {
734 HKS_TEST_ASSERT(HksDeleteKey(keyAlias, NULL) == 0);
735 }
736 TestFreeBlob(&keyAlias);
737 TestFreeBlob(&decryptedData);
738 TestFreeBlob(&cipherData);
739 TestFreeBlob(&ivData);
740 TestFreeBlob(&nonceData);
741 TestFreeBlob(&aadData);
742 return (ret != g_testDecryptParams[index].expectResult);
743 }