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