1 /*
2  * Copyright (c) 2023 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 
16 #ifndef HKS_TEST_CIPHER_C_H
17 #define HKS_TEST_CIPHER_C_H
18 
19 #include "hks_test_cipher.h"
20 #include "hks_api.h"
21 #include "hks_param.h"
22 #include "hks_test_api_performance.h"
23 #include "hks_test_common.h"
24 #include "hks_test_log.h"
25 
26 #define DEFAULT_AES_CIPHER_PLAIN_SIZE 1000
27 #define AES_DEFAULT_GCM_NONCE_LENGTH 12
28 #define AES_DEFAULT_AAD_LEN 4
29 #define DEFAULT_AES_LOCAL_PARAM_SET_OUT_SIZE 256
30 #define AES_LOCAL_KEY_SIZE_128 16
31 #define AES_LOCAL_KEY_SIZE_256 32
32 
33 static const struct HksTestCipherParams g_testCipherParams[] = {
34     /* success: local aes256-gcm-none */
35     { 0, HKS_SUCCESS, { false, 0, false, 0 },
36         {
37             true, /* genKey params */
38             true, HKS_ALG_AES,
39             true, HKS_AES_KEY_SIZE_256,
40             true, HKS_KEY_PURPOSE_ENCRYPT | HKS_KEY_PURPOSE_DECRYPT,
41             false, 0,
42             true, HKS_PADDING_NONE,
43             true, HKS_MODE_GCM,
44             true, HKS_STORAGE_TEMP
45         },
46         { false, 0 },
47         {
48             HKS_TEST_CIPHER_TYPE_AES,  true, /* encrypt params */
49             true, HKS_ALG_AES,
50             true, HKS_KEY_PURPOSE_ENCRYPT,
51             false, 0,
52             true, HKS_PADDING_NONE,
53             true, HKS_MODE_GCM,
54             false, 0,
55             true, AES_DEFAULT_GCM_NONCE_LENGTH,
56             true, AES_DEFAULT_AAD_LEN,
57             true, false
58         },
59         {
60             HKS_TEST_CIPHER_TYPE_AES,  true, /* decrypt params */
61             true, HKS_ALG_AES,
62             true, HKS_KEY_PURPOSE_DECRYPT,
63             false, 0,
64             true, HKS_PADDING_NONE,
65             true, HKS_MODE_GCM,
66             false, 0,
67             true, AES_DEFAULT_GCM_NONCE_LENGTH,
68             true, AES_DEFAULT_AAD_LEN,
69             true, false
70         },
71         { true, DEFAULT_AES_CIPHER_PLAIN_SIZE, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
72         { true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16, true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16 },
73         { true, DEFAULT_AES_CIPHER_PLAIN_SIZE, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
74         { true, AES_LOCAL_KEY_SIZE_256, true, AES_LOCAL_KEY_SIZE_256 }
75     },
76     { 1, HKS_SUCCESS, { true, DEFAULT_KEY_ALIAS_SIZE, true, DEFAULT_KEY_ALIAS_SIZE },
77         {
78             true, /* genKey params */
79             true, HKS_ALG_AES,
80             true, HKS_AES_KEY_SIZE_256,
81             true, HKS_KEY_PURPOSE_ENCRYPT | HKS_KEY_PURPOSE_DECRYPT,
82             false, 0,
83             true, HKS_PADDING_NONE,
84             true, HKS_MODE_GCM,
85             false, 0
86         },
87         { false, 0 },
88         {
89             HKS_TEST_CIPHER_TYPE_AES,  true, /* encrypt params */
90             true, HKS_ALG_AES,
91             true, HKS_KEY_PURPOSE_ENCRYPT,
92             false, 0,
93             true, HKS_PADDING_NONE,
94             true, HKS_MODE_GCM,
95             false, 0,
96             true, AES_DEFAULT_GCM_NONCE_LENGTH,
97             true, AES_DEFAULT_AAD_LEN
98         },
99         {
100             HKS_TEST_CIPHER_TYPE_AES,  true, /* decrypt params */
101             true, HKS_ALG_AES,
102             true, HKS_KEY_PURPOSE_DECRYPT,
103             false, 0,
104             true, HKS_PADDING_NONE,
105             true, HKS_MODE_GCM,
106             false, 0,
107             true, AES_DEFAULT_GCM_NONCE_LENGTH,
108             true, AES_DEFAULT_AAD_LEN
109         },
110         { true, DEFAULT_AES_CIPHER_PLAIN_SIZE, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
111         { true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16, true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16 },
112         { true, DEFAULT_AES_CIPHER_PLAIN_SIZE, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
113         { false, 0, false, 0 }
114     },
115 };
116 
117 static const struct HksTestEncryptParams g_testEncryptParams[] = {
118     { 0, HKS_ERROR_CHECK_GET_NONCE_FAIL, { true, DEFAULT_KEY_ALIAS_SIZE, true, DEFAULT_KEY_ALIAS_SIZE },
119         {
120             true, /* genKey params */
121             true, HKS_ALG_AES,
122             true, HKS_AES_KEY_SIZE_256,
123             true, HKS_KEY_PURPOSE_ENCRYPT | HKS_KEY_PURPOSE_DECRYPT,
124             false, 0,
125             true, HKS_PADDING_NONE,
126             true, HKS_MODE_GCM
127         },
128         { 0 },
129         {
130             HKS_TEST_CIPHER_TYPE_AES, true, /* encrypt params */
131             true, HKS_ALG_AES,
132             true, HKS_KEY_PURPOSE_ENCRYPT,
133             false, 0,
134             true, HKS_PADDING_NONE,
135             true, HKS_MODE_GCM,
136             false, 0,
137             false, 0,
138             true, AES_DEFAULT_AAD_LEN,
139             false, true
140         },
141         { true, DEFAULT_AES_CIPHER_PLAIN_SIZE, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
142         { true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16, true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16 },
143         { false, 0, false, 0 }
144     },
145     { 1, HKS_ERROR_INVALID_NONCE, { true, DEFAULT_KEY_ALIAS_SIZE, true, DEFAULT_KEY_ALIAS_SIZE },
146         {
147             true, /* genKey params */
148             true, HKS_ALG_AES,
149             true, HKS_AES_KEY_SIZE_256,
150             true, HKS_KEY_PURPOSE_ENCRYPT | HKS_KEY_PURPOSE_DECRYPT,
151             false, 0,
152             true, HKS_PADDING_NONE,
153             true, HKS_MODE_GCM
154         },
155         { 0 },
156         {
157             HKS_TEST_CIPHER_TYPE_AES, true, /* encrypt params */
158             true, HKS_ALG_AES,
159             true, HKS_KEY_PURPOSE_ENCRYPT,
160             false, 0,
161             true, HKS_PADDING_NONE,
162             true, HKS_MODE_GCM,
163             false, 0,
164             true, AES_DEFAULT_GCM_NONCE_LENGTH - 1,
165             true, AES_DEFAULT_AAD_LEN,
166             false, true
167         },
168         { true, DEFAULT_AES_CIPHER_PLAIN_SIZE, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
169         { true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16, true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16 },
170         { false, 0, false, 0 }
171     },
172     { 2, HKS_ERROR_CHECK_GET_AAD_FAIL, { true, DEFAULT_KEY_ALIAS_SIZE, true, DEFAULT_KEY_ALIAS_SIZE },
173         {
174             true, /* genKey params */
175             true, HKS_ALG_AES,
176             true, HKS_AES_KEY_SIZE_256,
177             true, HKS_KEY_PURPOSE_ENCRYPT | HKS_KEY_PURPOSE_DECRYPT,
178             false, 0,
179             true, HKS_PADDING_NONE,
180             true, HKS_MODE_GCM
181         },
182         { 0 },
183         {
184             HKS_TEST_CIPHER_TYPE_AES, true, /* encrypt params */
185             true, HKS_ALG_AES,
186             true, HKS_KEY_PURPOSE_ENCRYPT,
187             false, 0,
188             true, HKS_PADDING_NONE,
189             true, HKS_MODE_GCM,
190             false, 0,
191             true, AES_DEFAULT_GCM_NONCE_LENGTH,
192             false, 0,
193             false, true
194         },
195         { true, DEFAULT_AES_CIPHER_PLAIN_SIZE, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
196         { true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16, true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16 },
197         { false, 0, false, 0 }
198     },
199     { 3, HKS_ERROR_INVALID_ARGUMENT, { true, DEFAULT_KEY_ALIAS_SIZE, true, DEFAULT_KEY_ALIAS_SIZE },
200         {
201             true, /* genKey params */
202             true, HKS_ALG_AES,
203             true, HKS_AES_KEY_SIZE_256,
204             true, HKS_KEY_PURPOSE_ENCRYPT | HKS_KEY_PURPOSE_DECRYPT,
205             false, 0,
206             true, HKS_PADDING_NONE,
207             true, HKS_MODE_GCM
208         },
209         { 0 },
210         {
211             HKS_TEST_CIPHER_TYPE_AES, true, /* encrypt params */
212             true, HKS_ALG_AES,
213             true, HKS_KEY_PURPOSE_ENCRYPT,
214             false, 0,
215             true, HKS_PADDING_NONE,
216             true, HKS_MODE_GCM,
217             false, 0,
218             true, AES_DEFAULT_GCM_NONCE_LENGTH,
219             true, AES_DEFAULT_AAD_LEN,
220             false, true
221         },
222         { true, 0, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
223         { true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16, true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16 },
224         { false, 0, false, 0 }
225     },
226     { 4, HKS_ERROR_BUFFER_TOO_SMALL, { true, DEFAULT_KEY_ALIAS_SIZE, true, DEFAULT_KEY_ALIAS_SIZE },
227         {
228             true, /* genKey params */
229             true, HKS_ALG_AES,
230             true, HKS_AES_KEY_SIZE_256,
231             true, HKS_KEY_PURPOSE_ENCRYPT | HKS_KEY_PURPOSE_DECRYPT,
232             false, 0,
233             true, HKS_PADDING_NONE,
234             true, HKS_MODE_GCM },
235         { 0 },
236         {
237             HKS_TEST_CIPHER_TYPE_AES, true, /* encrypt params */
238             true, HKS_ALG_AES,
239             true, HKS_KEY_PURPOSE_ENCRYPT,
240             false, 0,
241             true, HKS_PADDING_NONE,
242             true, HKS_MODE_GCM,
243             false, 0,
244             true, AES_DEFAULT_GCM_NONCE_LENGTH,
245             true, AES_DEFAULT_AAD_LEN,
246             false, true
247         },
248         { true, DEFAULT_AES_CIPHER_PLAIN_SIZE, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
249         { true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16 - 1, true, DEFAULT_AES_CIPHER_PLAIN_SIZE + 16 - 1 },
250         { false, 0, false, 0 }
251     },
252 };
253 
254 static const struct HksTestDecryptParams g_testDecryptParams[] = {
255     { 0, HKS_ERROR_CHECK_GET_NONCE_FAIL, { true, DEFAULT_KEY_ALIAS_SIZE, true, DEFAULT_KEY_ALIAS_SIZE },
256         {
257             true, /* genKey params */
258             true, HKS_ALG_AES,
259             true, HKS_AES_KEY_SIZE_256,
260             true, HKS_KEY_PURPOSE_ENCRYPT | HKS_KEY_PURPOSE_DECRYPT,
261             false, 0,
262             true, HKS_PADDING_NONE,
263             true, HKS_MODE_GCM
264         },
265         { 0 },
266         {
267             HKS_TEST_CIPHER_TYPE_AES,  true, /* decrypt params */
268             true, HKS_ALG_AES,
269             true, HKS_KEY_PURPOSE_DECRYPT,
270             false, 0,
271             true, HKS_PADDING_NONE,
272             true, HKS_MODE_GCM,
273             false, 0,
274             false, AES_DEFAULT_GCM_NONCE_LENGTH,
275             true, AES_DEFAULT_AAD_LEN,
276             false, true
277         },
278         { true, DEFAULT_AES_CIPHER_PLAIN_SIZE, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
279         { true, DEFAULT_AES_CIPHER_PLAIN_SIZE - 16, true, DEFAULT_AES_CIPHER_PLAIN_SIZE - 16 },
280         { false, 0, false, 0 }
281     },
282     { 1, HKS_ERROR_INVALID_NONCE, { true, DEFAULT_KEY_ALIAS_SIZE, true, DEFAULT_KEY_ALIAS_SIZE },
283         {
284             true, /* genKey params */
285             true, HKS_ALG_AES,
286             true, HKS_AES_KEY_SIZE_256,
287             true, HKS_KEY_PURPOSE_ENCRYPT | HKS_KEY_PURPOSE_DECRYPT,
288             false, 0,
289             true, HKS_PADDING_NONE,
290             true, HKS_MODE_GCM
291         },
292         { 0 },
293         {
294             HKS_TEST_CIPHER_TYPE_AES,  true, /* decrypt params */
295             true, HKS_ALG_AES,
296             true, HKS_KEY_PURPOSE_DECRYPT,
297             false, 0,
298             true, HKS_PADDING_NONE,
299             true, HKS_MODE_GCM,
300             false, 0,
301             true, AES_DEFAULT_GCM_NONCE_LENGTH - 1,
302             true, AES_DEFAULT_AAD_LEN,
303             false, true
304         },
305         { true, DEFAULT_AES_CIPHER_PLAIN_SIZE, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
306         { true, DEFAULT_AES_CIPHER_PLAIN_SIZE - 16, true, DEFAULT_AES_CIPHER_PLAIN_SIZE - 16 },
307         { false, 0, false, 0 }
308     },
309     { 2, HKS_ERROR_CHECK_GET_AAD_FAIL, { true, DEFAULT_KEY_ALIAS_SIZE, true, DEFAULT_KEY_ALIAS_SIZE },
310         {
311             true, /* genKey params */
312             true, HKS_ALG_AES,
313             true, HKS_AES_KEY_SIZE_256,
314             true, HKS_KEY_PURPOSE_ENCRYPT | HKS_KEY_PURPOSE_DECRYPT,
315             false, 0,
316             true, HKS_PADDING_NONE,
317             true, HKS_MODE_GCM
318         },
319         { 0 },
320         {
321             HKS_TEST_CIPHER_TYPE_AES,  true, /* decrypt params */
322             true, HKS_ALG_AES,
323             true, HKS_KEY_PURPOSE_DECRYPT,
324             false, 0,
325             true, HKS_PADDING_NONE,
326             true, HKS_MODE_GCM,
327             false, 0,
328             true, AES_DEFAULT_GCM_NONCE_LENGTH,
329             false, 0,
330             false, true
331         },
332         { true, DEFAULT_AES_CIPHER_PLAIN_SIZE, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
333         { true, DEFAULT_AES_CIPHER_PLAIN_SIZE - 16, true, DEFAULT_AES_CIPHER_PLAIN_SIZE - 16 },
334         { false, 0, false, 0 }
335     },
336     { 3, HKS_ERROR_INVALID_ARGUMENT, { true, DEFAULT_KEY_ALIAS_SIZE, true, DEFAULT_KEY_ALIAS_SIZE },
337         {
338             true, /* genKey params */
339             true, HKS_ALG_AES,
340             true, HKS_AES_KEY_SIZE_256,
341             true, HKS_KEY_PURPOSE_ENCRYPT | HKS_KEY_PURPOSE_DECRYPT,
342             false, 0,
343             true, HKS_PADDING_NONE,
344             true, HKS_MODE_GCM
345         },
346         { 0 },
347         {
348             HKS_TEST_CIPHER_TYPE_AES,  true, /* decrypt params */
349             true, HKS_ALG_AES,
350             true, HKS_KEY_PURPOSE_DECRYPT,
351             false, 0,
352             true, HKS_PADDING_NONE,
353             true, HKS_MODE_GCM,
354             false, 0,
355             true, AES_DEFAULT_GCM_NONCE_LENGTH,
356             true, AES_DEFAULT_AAD_LEN,
357             false, true
358         },
359         { true, 16, true, 16 },
360         { true, DEFAULT_AES_CIPHER_PLAIN_SIZE - 16, true, DEFAULT_AES_CIPHER_PLAIN_SIZE - 16 },
361         { false, 0, false, 0 }
362     },
363     { 4, HKS_ERROR_BUFFER_TOO_SMALL, { true, DEFAULT_KEY_ALIAS_SIZE, true, DEFAULT_KEY_ALIAS_SIZE },
364         {
365             true, /* genKey params */
366             true, HKS_ALG_AES,
367             true, HKS_AES_KEY_SIZE_256,
368             true, HKS_KEY_PURPOSE_ENCRYPT | HKS_KEY_PURPOSE_DECRYPT,
369             false, 0,
370             true, HKS_PADDING_NONE,
371             true, HKS_MODE_GCM
372         },
373         { 0 },
374         {
375             HKS_TEST_CIPHER_TYPE_AES, true, /* decrypt params */
376             true, HKS_ALG_AES,
377             true, HKS_KEY_PURPOSE_DECRYPT,
378             false, 0,
379             true, HKS_PADDING_NONE,
380             true, HKS_MODE_GCM,
381             false, 0,
382             true, AES_DEFAULT_GCM_NONCE_LENGTH,
383             true, AES_DEFAULT_AAD_LEN,
384             false, true
385         },
386         { true, DEFAULT_AES_CIPHER_PLAIN_SIZE, true, DEFAULT_AES_CIPHER_PLAIN_SIZE },
387         { true, DEFAULT_AES_CIPHER_PLAIN_SIZE - 16 - 1, true, DEFAULT_AES_CIPHER_PLAIN_SIZE - 16 -1 },
388         { false, 0, false, 0 }
389     },
390 };
391 int32_t ConstructDataToBlobTest(struct HksBlob **inData, struct HksBlob **outData,
392     const struct HksTestBlobParams *inTextParams, const struct HksTestBlobParams *outTextParams);
393 
394 int32_t EncryptTest(struct CipherEncryptStructure *encryptStruct);
395 
396 int32_t DecryptCipherTest(struct CipherDecryptStructure *decryptStruct);
397 
398 int32_t Decrypt(struct OnlyDecryptStructure *onlyDecryptStruct);
399 
400 int32_t BaseTestCipher(uint32_t times, uint32_t index, uint32_t performTimes);
401 
402 int32_t BaseTestEncrypt(uint32_t times, uint32_t index, uint32_t performTimes);
403 
404 int32_t BaseTestDecrypt(uint32_t times, uint32_t index, uint32_t performTimes);
405 
406 #endif