已合并
feat: Add context copy capability for cipher,kdf and MAC algorithms. #981
Dongjianwei001创建于 1月5日
feat: Add context copy capability for cipher,kdf and MAC algorithms. #981
已合并
共 76 个文件变更+3576-81
| @@ -100,6 +100,13 @@ int32_t CRYPT_CBC_MAC_Ctrl(CRYPT_CBC_MAC_Ctx *ctx, uint32_t opt, void *val, uint | |||
| 100 | */ | 100 | */ |
| 101 | void CRYPT_CBC_MAC_FreeCtx(CRYPT_CBC_MAC_Ctx *ctx); | 101 | void CRYPT_CBC_MAC_FreeCtx(CRYPT_CBC_MAC_Ctx *ctx); |
| 102 | 102 | ||
| 103 | +/** | ||
| 104 | + * @brief Dup the CBC_MAC context. | ||
| 105 | + * @param ctx [IN] CBC_MAC context. | ||
| 106 | + * @retval CBC_MAC context. | ||
| 107 | + */ | ||
| 108 | +CRYPT_CBC_MAC_Ctx *CRYPT_CBC_MAC_DupCtx(const CRYPT_CBC_MAC_Ctx *ctx); | ||
| 109 | + | ||
| 103 | #ifdef __cplusplus | 110 | #ifdef __cplusplus |
| 104 | } | 111 | } |
| 105 | #endif /* __cpluscplus */ | 112 | #endif /* __cpluscplus */ |
| @@ -98,6 +98,13 @@ int32_t CRYPT_CMAC_Ctrl(CRYPT_CMAC_Ctx *ctx, uint32_t opt, void *val, uint32_t l | |||
| 98 | */ | 98 | */ |
| 99 | void CRYPT_CMAC_FreeCtx(CRYPT_CMAC_Ctx *ctx); | 99 | void CRYPT_CMAC_FreeCtx(CRYPT_CMAC_Ctx *ctx); |
| 100 | 100 | ||
| 101 | +/** | ||
| 102 | + * @brief Dup the CMAC context. | ||
| 103 | + * @param ctx [IN] CMAC context. | ||
| 104 | + * @retval CMAC context. | ||
| 105 | + */ | ||
| 106 | +CRYPT_CMAC_Ctx *CRYPT_CMAC_DupCtx(const CRYPT_CMAC_Ctx *ctx); | ||
| 107 | + | ||
| 101 | #ifdef __cplusplus | 108 | #ifdef __cplusplus |
| 102 | } | 109 | } |
| 103 | #endif /* __cpluscplus */ | 110 | #endif /* __cpluscplus */ |
| @@ -164,4 +164,27 @@ void CRYPT_CBC_MAC_FreeCtx(CRYPT_CBC_MAC_Ctx *ctx) | |||
| 164 | CipherMacDeinitCtx(&ctx->common); | 164 | CipherMacDeinitCtx(&ctx->common); |
| 165 | BSL_SAL_Free(ctx); | 165 | BSL_SAL_Free(ctx); |
| 166 | } | 166 | } |
| 167 | + | ||
| 168 | +CRYPT_CBC_MAC_Ctx *CRYPT_CBC_MAC_DupCtx(const CRYPT_CBC_MAC_Ctx *ctx) | ||
| 169 | +{ | ||
| 170 | + if (ctx == NULL) { | ||
| 171 | + BSL_ERR_PUSH_ERROR(CRYPT_NULL_INPUT); | ||
| 172 | + return NULL; | ||
| 173 | + } | ||
| 174 | + | ||
| 175 | + CRYPT_CBC_MAC_Ctx *newCtx = BSL_SAL_Dump(ctx, sizeof(CRYPT_CBC_MAC_Ctx)); | ||
| 176 | + if (newCtx == NULL) { | ||
| 177 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 178 | + return NULL; | ||
| 179 | + } | ||
| 180 | + | ||
| 181 | + void *key = BSL_SAL_Dump(ctx->common.key, ctx->common.method->ctxSize); | ||
| 182 | + if (key == NULL) { | ||
| 183 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 184 | + BSL_SAL_Free(newCtx); | ||
| 185 | + return NULL; | ||
| 186 | + } | ||
| 187 | + newCtx->common.key = key; | ||
| 188 | + return newCtx; | ||
| 189 | +} | ||
| 167 | #endif | 190 | #endif |
| @@ -173,4 +173,27 @@ void CRYPT_CMAC_FreeCtx(CRYPT_CMAC_Ctx *ctx) | |||
| 173 | BSL_SAL_Free(ctx); | 173 | BSL_SAL_Free(ctx); |
| 174 | } | 174 | } |
| 175 | 175 | ||
| 176 | +CRYPT_CMAC_Ctx *CRYPT_CMAC_DupCtx(const CRYPT_CMAC_Ctx *ctx) | ||
| 177 | +{ | ||
| 178 | + if (ctx == NULL) { | ||
| 179 | + BSL_ERR_PUSH_ERROR(CRYPT_NULL_INPUT); | ||
| 180 | + return NULL; | ||
| 181 | + } | ||
| 182 | + | ||
| 183 | + CRYPT_CMAC_Ctx *newCtx = BSL_SAL_Dump(ctx, sizeof(CRYPT_CMAC_Ctx)); | ||
| 184 | + if (newCtx == NULL) { | ||
| 185 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 186 | + return NULL; | ||
| 187 | + } | ||
| 188 | + | ||
| 189 | + void *key = BSL_SAL_Dump(ctx->key, ctx->method->ctxSize); | ||
| 190 | + if (key == NULL) { | ||
| 191 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 192 | + BSL_SAL_Free(newCtx); | ||
| 193 | + return NULL; | ||
| 194 | + } | ||
| 195 | + newCtx->key = key; | ||
| 196 | + return newCtx; | ||
| 197 | +} | ||
| 198 | + | ||
| 176 | #endif /* HITLS_CRYPTO_CMAC */ | 199 | #endif /* HITLS_CRYPTO_CMAC */ |
| @@ -40,6 +40,7 @@ static void CipherCopyMethod(const EAL_CipherMethod *modeMethod, EAL_CipherUnita | |||
| 40 | method->final = modeMethod->final; | 40 | method->final = modeMethod->final; |
| 41 | method->ctrl = modeMethod->ctrl; | 41 | method->ctrl = modeMethod->ctrl; |
| 42 | method->freeCtx = modeMethod->freeCtx; | 42 | method->freeCtx = modeMethod->freeCtx; |
| 43 | + method->dupCtx = modeMethod->dupCtx; | ||
| 43 | } | 44 | } |
| 44 | 45 | ||
| 45 | static CRYPT_EAL_CipherCtx *CipherNewDefaultCtx(CRYPT_CIPHER_AlgId id) | 46 | static CRYPT_EAL_CipherCtx *CipherNewDefaultCtx(CRYPT_CIPHER_AlgId id) |
| @@ -115,6 +116,9 @@ static int32_t CRYPT_EAL_SetCipherMethod(CRYPT_EAL_CipherCtx *ctx, const CRYPT_E | |||
| 115 | case CRYPT_EAL_IMPLCIPHER_CTRL: | 116 | case CRYPT_EAL_IMPLCIPHER_CTRL: |
| 116 | method->ctrl = funcs[index].func; | 117 | method->ctrl = funcs[index].func; |
| 117 | break; | 118 | break; |
| 119 | + case CRYPT_EAL_IMPLCIPHER_DUPCTX: | ||
| 120 | + method->dupCtx = funcs[index].func; | ||
| 121 | + break; | ||
| 118 | default: | 122 | default: |
| 119 | BSL_SAL_FREE(method); | 123 | BSL_SAL_FREE(method); |
| 120 | BSL_ERR_PUSH_ERROR(CRYPT_PROVIDER_ERR_UNEXPECTED_IMPL); | 124 | BSL_ERR_PUSH_ERROR(CRYPT_PROVIDER_ERR_UNEXPECTED_IMPL); |
| @@ -539,4 +543,68 @@ int32_t CRYPT_EAL_CipherGetInfo(CRYPT_CIPHER_AlgId id, int32_t type, uint32_t *i | |||
| 539 | return CRYPT_SUCCESS; | 543 | return CRYPT_SUCCESS; |
| 540 | } | 544 | } |
| 541 | 545 | ||
| 546 | +int32_t CRYPT_EAL_CipherCopyCtx(CRYPT_EAL_CipherCtx *to, const CRYPT_EAL_CipherCtx *from) | ||
| 547 | +{ | ||
| 548 | + if (to == NULL || from == NULL || from->method == NULL || from->method->dupCtx == NULL) { | ||
| 549 | + EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_CIPHER, CRYPT_CIPHER_MAX, CRYPT_NULL_INPUT); | ||
| 550 | + return CRYPT_NULL_INPUT; | ||
| 551 | + } | ||
| 552 | + | ||
| 553 | + if (to->ctx != NULL) { | ||
| 554 | + if (to->method == NULL || to->method->freeCtx == NULL) { | ||
| 555 | + EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_CIPHER, from->id, CRYPT_INVALID_ARG); | ||
| 556 | + return CRYPT_INVALID_ARG; | ||
| 557 | + } | ||
| 558 | + to->method->freeCtx(to->ctx); | ||
| 559 | + to->ctx = NULL; | ||
| 560 | + } | ||
| 561 | + if (to->method != NULL) { | ||
| 562 | + BSL_SAL_FREE(to->method); | ||
| 563 | + } | ||
| 564 | + | ||
| 565 | + EAL_CipherUnitaryMethod *tmpMethod = BSL_SAL_Dump(from->method, sizeof(EAL_CipherUnitaryMethod)); | ||
| 566 | + if (tmpMethod == NULL) { | ||
| 567 | + EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_CIPHER, from->id, CRYPT_MEM_ALLOC_FAIL); | ||
| 568 | + return CRYPT_MEM_ALLOC_FAIL; | ||
| 569 | + } | ||
| 570 | + void *ctx = from->method->dupCtx(from->ctx); | ||
| 571 | + if (ctx == NULL) { | ||
| 572 | + EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_CIPHER, from->id, CRYPT_MEM_ALLOC_FAIL); | ||
| 573 | + BSL_SAL_Free(tmpMethod); | ||
| 574 | + return CRYPT_MEM_ALLOC_FAIL; | ||
| 575 | + } | ||
| 576 | + (void)memcpy_s(to, sizeof(CRYPT_EAL_CipherCtx), from, sizeof(CRYPT_EAL_CipherCtx)); | ||
| 577 | + to->ctx = ctx; | ||
| 578 | + to->method = tmpMethod; | ||
| 579 | + return CRYPT_SUCCESS; | ||
| 580 | +} | ||
| 581 | + | ||
| 582 | +CRYPT_EAL_CipherCtx *CRYPT_EAL_CipherDupCtx(const CRYPT_EAL_CipherCtx *from) | ||
| 583 | +{ | ||
| 584 | + if (from == NULL || from->method == NULL || from->method->dupCtx == NULL) { | ||
| 585 | + EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_CIPHER, CRYPT_CIPHER_MAX, CRYPT_NULL_INPUT); | ||
| 586 | + return NULL; | ||
| 587 | + } | ||
| 588 | + | ||
| 589 | + CRYPT_EAL_CipherCtx *newCtx = BSL_SAL_Dump(from, sizeof(CRYPT_EAL_CipherCtx)); | ||
| 590 | + if (newCtx == NULL) { | ||
| 591 | + EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_CIPHER, from->id, CRYPT_MEM_ALLOC_FAIL); | ||
| 592 | + return NULL; | ||
| 593 | + } | ||
| 594 | + newCtx->method = BSL_SAL_Dump(from->method, sizeof(EAL_CipherUnitaryMethod)); | ||
| 595 | + if (newCtx->method == NULL) { | ||
| 596 | + EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_CIPHER, from->id, CRYPT_MEM_ALLOC_FAIL); | ||
| 597 | + BSL_SAL_Free(newCtx); | ||
| 598 | + return NULL; | ||
| 599 | + } | ||
| 600 | + newCtx->ctx = from->method->dupCtx(from->ctx); | ||
| 601 | + if (newCtx->ctx == NULL) { | ||
| 602 | + EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_CIPHER, from->id, CRYPT_MEM_ALLOC_FAIL); | ||
| 603 | + BSL_SAL_Free(newCtx->method); | ||
| 604 | + BSL_SAL_Free(newCtx); | ||
| 605 | + return NULL; | ||
| 606 | + } | ||
| 607 | + return newCtx; | ||
| 608 | +} | ||
| 609 | + | ||
| 542 | #endif | 610 | #endif |
| @@ -72,7 +72,8 @@ static const EAL_CipherMethod CHACHA20_POLY1305_METHOD = { | |||
| 72 | (CipherUpdate)MODES_CHACHA20POLY1305_Update, | 72 | (CipherUpdate)MODES_CHACHA20POLY1305_Update, |
| 73 | (CipherFinal)MODES_CHACHA20POLY1305_Final, | 73 | (CipherFinal)MODES_CHACHA20POLY1305_Final, |
| 74 | (CipherCtrl)MODES_CHACHA20POLY1305_Ctrl, | 74 | (CipherCtrl)MODES_CHACHA20POLY1305_Ctrl, |
| 75 | - (CipherFreeCtx)MODES_CHACHA20POLY1305_FreeCtx | 75 | + (CipherFreeCtx)MODES_CHACHA20POLY1305_FreeCtx, |
| 76 | + (CipherDupCtx)MODES_CHACHA20POLY1305_DupCtx | ||
| 76 | }; | 77 | }; |
| 77 | #endif | 78 | #endif |
| 78 | 79 | ||
| @@ -84,7 +85,8 @@ static const EAL_CipherMethod CTR_METHOD = { | |||
| 84 | (CipherUpdate)MODES_CTR_UpdateEx, | 85 | (CipherUpdate)MODES_CTR_UpdateEx, |
| 85 | (CipherFinal)MODES_CTR_Final, | 86 | (CipherFinal)MODES_CTR_Final, |
| 86 | (CipherCtrl)MODES_CTR_Ctrl, | 87 | (CipherCtrl)MODES_CTR_Ctrl, |
| 87 | - (CipherFreeCtx)MODES_CTR_FreeCtx | 88 | + (CipherFreeCtx)MODES_CTR_FreeCtx, |
| 89 | + (CipherDupCtx)MODES_CipherDupCtx | ||
| 88 | }; | 90 | }; |
| 89 | #endif | 91 | #endif |
| 90 | 92 | ||
| @@ -96,7 +98,8 @@ static const EAL_CipherMethod CBC_METHOD = { | |||
| 96 | (CipherUpdate)MODES_CBC_UpdateEx, | 98 | (CipherUpdate)MODES_CBC_UpdateEx, |
| 97 | (CipherFinal)MODES_CBC_FinalEx, | 99 | (CipherFinal)MODES_CBC_FinalEx, |
| 98 | (CipherCtrl)MODES_CBC_Ctrl, | 100 | (CipherCtrl)MODES_CBC_Ctrl, |
| 99 | - (CipherFreeCtx)MODES_CBC_FreeCtx | 101 | + (CipherFreeCtx)MODES_CBC_FreeCtx, |
| 102 | + (CipherDupCtx)MODES_CipherDupCtx | ||
| 100 | }; | 103 | }; |
| 101 | #endif | 104 | #endif |
| 102 | 105 | ||
| @@ -108,7 +111,8 @@ static const EAL_CipherMethod ECB_METHOD = { | |||
| 108 | (CipherUpdate)MODES_ECB_UpdateEx, | 111 | (CipherUpdate)MODES_ECB_UpdateEx, |
| 109 | (CipherFinal)MODES_ECB_FinalEx, | 112 | (CipherFinal)MODES_ECB_FinalEx, |
| 110 | (CipherCtrl)MODES_ECB_Ctrl, | 113 | (CipherCtrl)MODES_ECB_Ctrl, |
| 111 | - (CipherFreeCtx)MODES_ECB_FreeCtx | 114 | + (CipherFreeCtx)MODES_ECB_FreeCtx, |
| 115 | + (CipherDupCtx)MODES_CipherDupCtx | ||
| 112 | }; | 116 | }; |
| 113 | #endif | 117 | #endif |
| 114 | 118 | ||
| @@ -120,7 +124,8 @@ static const EAL_CipherMethod CCM_METHOD = { | |||
| 120 | (CipherUpdate)MODES_CCM_UpdateEx, | 124 | (CipherUpdate)MODES_CCM_UpdateEx, |
| 121 | (CipherFinal)MODES_CCM_Final, | 125 | (CipherFinal)MODES_CCM_Final, |
| 122 | (CipherCtrl)MODES_CCM_Ctrl, | 126 | (CipherCtrl)MODES_CCM_Ctrl, |
| 123 | - (CipherFreeCtx)MODES_CCM_FreeCtx | 127 | + (CipherFreeCtx)MODES_CCM_FreeCtx, |
| 128 | + (CipherDupCtx)MODES_CCM_DupCtx | ||
| 124 | }; | 129 | }; |
| 125 | #endif | 130 | #endif |
| 126 | 131 | ||
| @@ -132,7 +137,8 @@ static const EAL_CipherMethod GCM_METHOD = { | |||
| 132 | (CipherUpdate)MODES_GCM_UpdateEx, | 137 | (CipherUpdate)MODES_GCM_UpdateEx, |
| 133 | (CipherFinal)MODES_GCM_Final, | 138 | (CipherFinal)MODES_GCM_Final, |
| 134 | (CipherCtrl)MODES_GCM_Ctrl, | 139 | (CipherCtrl)MODES_GCM_Ctrl, |
| 135 | - (CipherFreeCtx)MODES_GCM_FreeCtx | 140 | + (CipherFreeCtx)MODES_GCM_FreeCtx, |
| 141 | + (CipherDupCtx)MODES_GCM_DupCtx | ||
| 136 | }; | 142 | }; |
| 137 | #endif | 143 | #endif |
| 138 | 144 | ||
| @@ -145,7 +151,8 @@ static const EAL_CipherMethod CFB_METHOD = { | |||
| 145 | (CipherUpdate)MODES_CFB_UpdateEx, | 151 | (CipherUpdate)MODES_CFB_UpdateEx, |
| 146 | (CipherFinal)MODES_CFB_Final, | 152 | (CipherFinal)MODES_CFB_Final, |
| 147 | (CipherCtrl)MODES_CFB_Ctrl, | 153 | (CipherCtrl)MODES_CFB_Ctrl, |
| 148 | - (CipherFreeCtx)MODES_CFB_FreeCtx | 154 | + (CipherFreeCtx)MODES_CFB_FreeCtx, |
| 155 | + (CipherDupCtx)MODES_CFB_DupCtx | ||
| 149 | }; | 156 | }; |
| 150 | #endif | 157 | #endif |
| 151 | 158 | ||
| @@ -157,7 +164,8 @@ static const EAL_CipherMethod OFB_METHOD = { | |||
| 157 | (CipherUpdate)MODES_OFB_UpdateEx, | 164 | (CipherUpdate)MODES_OFB_UpdateEx, |
| 158 | (CipherFinal)MODES_OFB_Final, | 165 | (CipherFinal)MODES_OFB_Final, |
| 159 | (CipherCtrl)MODES_OFB_Ctrl, | 166 | (CipherCtrl)MODES_OFB_Ctrl, |
| 160 | - (CipherFreeCtx)MODES_OFB_FreeCtx | 167 | + (CipherFreeCtx)MODES_OFB_FreeCtx, |
| 168 | + (CipherDupCtx)MODES_CipherDupCtx | ||
| 161 | }; | 169 | }; |
| 162 | #endif | 170 | #endif |
| 163 | 171 | ||
| @@ -169,7 +177,8 @@ static const EAL_CipherMethod XTS_METHOD = { | |||
| 169 | (CipherUpdate)MODES_XTS_UpdateEx, | 177 | (CipherUpdate)MODES_XTS_UpdateEx, |
| 170 | (CipherFinal)MODES_XTS_Final, | 178 | (CipherFinal)MODES_XTS_Final, |
| 171 | (CipherCtrl)MODES_XTS_Ctrl, | 179 | (CipherCtrl)MODES_XTS_Ctrl, |
| 172 | - (CipherFreeCtx)MODES_XTS_FreeCtx | 180 | + (CipherFreeCtx)MODES_XTS_FreeCtx, |
| 181 | + (CipherDupCtx)MODES_XTS_DupCtx | ||
| 173 | }; | 182 | }; |
| 174 | #endif | 183 | #endif |
| 175 | 184 | ||
| @@ -181,7 +190,8 @@ static const EAL_CipherMethod AES_WRAP_NOPAD_METHOD = { | |||
| 181 | (CipherUpdate)MODES_WRAP_Update, | 190 | (CipherUpdate)MODES_WRAP_Update, |
| 182 | (CipherFinal)MODES_WRAP_Final, | 191 | (CipherFinal)MODES_WRAP_Final, |
| 183 | (CipherCtrl)MODE_WRAP_Ctrl, | 192 | (CipherCtrl)MODE_WRAP_Ctrl, |
| 184 | - (CipherFreeCtx)MODES_WRAP_FreeCtx | 193 | + (CipherFreeCtx)MODES_WRAP_FreeCtx, |
| 194 | + (CipherDupCtx)MODES_WRAP_DupCtx, | ||
| 185 | }; | 195 | }; |
| 186 | 196 | ||
| 187 | static const EAL_CipherMethod AES_WRAP_PAD_METHOD = { | 197 | static const EAL_CipherMethod AES_WRAP_PAD_METHOD = { |
| @@ -191,7 +201,8 @@ static const EAL_CipherMethod AES_WRAP_PAD_METHOD = { | |||
| 191 | (CipherUpdate)MODES_WRAP_Update, | 201 | (CipherUpdate)MODES_WRAP_Update, |
| 192 | (CipherFinal)MODES_WRAP_Final, | 202 | (CipherFinal)MODES_WRAP_Final, |
| 193 | (CipherCtrl)MODE_WRAP_Ctrl, | 203 | (CipherCtrl)MODE_WRAP_Ctrl, |
| 194 | - (CipherFreeCtx)MODES_WRAP_FreeCtx | 204 | + (CipherFreeCtx)MODES_WRAP_FreeCtx, |
| 205 | + (CipherDupCtx)MODES_WRAP_DupCtx, | ||
| 195 | }; | 206 | }; |
| 196 | #endif // HITLS_CRYPTO_WRAP | 207 | #endif // HITLS_CRYPTO_WRAP |
| 197 | 208 | ||
| @@ -74,6 +74,7 @@ static void EalKdfCopyMethod(const EAL_KdfMethod *method, EAL_KdfUnitaryMethod * | |||
| 74 | dest->deinit = method->deinit; | 74 | dest->deinit = method->deinit; |
| 75 | dest->freeCtx = method->freeCtx; | 75 | dest->freeCtx = method->freeCtx; |
| 76 | dest->ctrl = method->ctrl; | 76 | dest->ctrl = method->ctrl; |
| 77 | + dest->dupCtx = method->dupCtx; | ||
| 77 | } | 78 | } |
| 78 | 79 | ||
| 79 | #ifdef HITLS_CRYPTO_PROVIDER | 80 | #ifdef HITLS_CRYPTO_PROVIDER |
| @@ -106,6 +107,9 @@ static int32_t CRYPT_EAL_SetKdfMethod(CRYPT_EAL_KdfCTX *ctx, const CRYPT_EAL_Fun | |||
| 106 | case CRYPT_EAL_IMPLKDF_FREECTX: | 107 | case CRYPT_EAL_IMPLKDF_FREECTX: |
| 107 | method->freeCtx = funcs[index].func; | 108 | method->freeCtx = funcs[index].func; |
| 108 | break; | 109 | break; |
| 110 | + case CRYPT_EAL_IMPLKDF_DUPCTX: | ||
| 111 | + method->dupCtx = funcs[index].func; | ||
| 112 | + break; | ||
| 109 | default: | 113 | default: |
| 110 | BSL_SAL_FREE(method); | 114 | BSL_SAL_FREE(method); |
| 111 | BSL_ERR_PUSH_ERROR(CRYPT_PROVIDER_ERR_UNEXPECTED_IMPL); | 115 | BSL_ERR_PUSH_ERROR(CRYPT_PROVIDER_ERR_UNEXPECTED_IMPL); |
| @@ -261,4 +265,70 @@ void CRYPT_EAL_KdfFreeCtx(CRYPT_EAL_KdfCTX *ctx) | |||
| 261 | return; | 265 | return; |
| 262 | } | 266 | } |
| 263 | 267 | ||
| 268 | +int32_t CRYPT_EAL_KdfCopyCtx(CRYPT_EAL_KdfCTX *to, const CRYPT_EAL_KdfCTX *from) | ||
| 269 | +{ | ||
| 270 | + if (to == NULL || from == NULL || from->method == NULL || from->method->dupCtx == NULL) { | ||
| 271 | + EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_KDF, CRYPT_KDF_MAX, CRYPT_NULL_INPUT); | ||
| 272 | + return CRYPT_NULL_INPUT; | ||
| 273 | + } | ||
| 274 | + if (to->data != NULL) { | ||
| 275 | + if (to->method == NULL || to->method->freeCtx == NULL) { | ||
| 276 | + EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_KDF, from->id, CRYPT_INVALID_ARG); | ||
| 277 | + return CRYPT_INVALID_ARG; | ||
| 278 | + } | ||
| 279 | + to->method->freeCtx(to->data); | ||
| 280 | + to->data = NULL; | ||
| 281 | + } | ||
| 282 | + if (to->method != NULL) { | ||
| 283 | + BSL_SAL_FREE(to->method); | ||
| 284 | + } | ||
| 285 | + | ||
| 286 | + EAL_KdfUnitaryMethod *tmpMethod = BSL_SAL_Dump(from->method, sizeof(EAL_KdfUnitaryMethod)); | ||
| 287 | + if (tmpMethod == NULL) { | ||
| 288 | + EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_KDF, from->id, CRYPT_MEM_ALLOC_FAIL); | ||
| 289 | + return CRYPT_MEM_ALLOC_FAIL; | ||
| 290 | + } | ||
| 291 | + | ||
| 292 | + void *newData = from->method->dupCtx(from->data); | ||
| 293 | + if (newData == NULL) { | ||
| 294 | + EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_KDF, from->id, CRYPT_MEM_ALLOC_FAIL); | ||
| 295 | + BSL_SAL_Free(tmpMethod); | ||
| 296 | + return CRYPT_MEM_ALLOC_FAIL; | ||
| 297 | + } | ||
| 298 | + (void)memcpy_s(to, sizeof(CRYPT_EAL_KdfCTX), from, sizeof(CRYPT_EAL_KdfCTX)); | ||
| 299 | + to->data = newData; | ||
| 300 | + to->method = tmpMethod; | ||
| 301 | + return CRYPT_SUCCESS; | ||
| 302 | +} | ||
| 303 | + | ||
| 304 | +CRYPT_EAL_KdfCTX *CRYPT_EAL_KdfDupCtx(const CRYPT_EAL_KdfCTX *from) | ||
| 305 | +{ | ||
| 306 | + if (from == NULL || from->method == NULL || from->method->dupCtx == NULL) { | ||
| 307 | + EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_KDF, CRYPT_KDF_MAX, CRYPT_NULL_INPUT); | ||
| 308 | + return NULL; | ||
| 309 | + } | ||
| 310 | + | ||
| 311 | + CRYPT_EAL_KdfCTX *newCtx = BSL_SAL_Dump(from, sizeof(CRYPT_EAL_KdfCTX)); | ||
| 312 | + if (newCtx == NULL ) { | ||
| 313 | + EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_KDF, from->id, CRYPT_MEM_ALLOC_FAIL); | ||
| 314 | + return NULL; | ||
| 315 | + } | ||
| 316 | + | ||
| 317 | + newCtx->method = BSL_SAL_Dump(from->method, sizeof(EAL_KdfUnitaryMethod)); | ||
| 318 | + if (newCtx->method == NULL) { | ||
| 319 | + EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_KDF, from->id, CRYPT_MEM_ALLOC_FAIL); | ||
| 320 | + BSL_SAL_Free(newCtx); | ||
| 321 | + return NULL; | ||
| 322 | + } | ||
| 323 | + | ||
| 324 | + newCtx->data = from->method->dupCtx(from->data); | ||
| 325 | + if (newCtx->data == NULL) { | ||
| 326 | + EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_KDF, from->id, CRYPT_MEM_ALLOC_FAIL); | ||
| 327 | + BSL_SAL_Free(newCtx->method); | ||
| 328 | + BSL_SAL_Free(newCtx); | ||
| 329 | + return NULL; | ||
| 330 | + } | ||
| 331 | + return newCtx; | ||
| 332 | +} | ||
| 333 | + | ||
| 264 | #endif | 334 | #endif |
| @@ -38,7 +38,7 @@ | |||
| 38 | EAL_KdfMethod g_kdfMethod_##name = { \ | 38 | EAL_KdfMethod g_kdfMethod_##name = { \ |
| 39 | (KdfNewCtx)CRYPT_##name##_NewCtx, (KdfSetParam)CRYPT_##name##_SetParam, \ | 39 | (KdfNewCtx)CRYPT_##name##_NewCtx, (KdfSetParam)CRYPT_##name##_SetParam, \ |
| 40 | (KdfDerive)CRYPT_##name##_Derive, (KdfDeinit)CRYPT_##name##_Deinit, \ | 40 | (KdfDerive)CRYPT_##name##_Derive, (KdfDeinit)CRYPT_##name##_Deinit, \ |
| 41 | - (KdfFreeCtx)CRYPT_##name##_FreeCtx, NULL \ | 41 | + (KdfFreeCtx)CRYPT_##name##_FreeCtx, NULL, (KdfDupCtx)CRYPT_##name##_DupCtx \ |
| 42 | } | 42 | } |
| 43 | 43 | ||
| 44 | #ifdef HITLS_CRYPTO_PBKDF2 | 44 | #ifdef HITLS_CRYPTO_PBKDF2 |
| @@ -87,4 +87,4 @@ const EAL_KdfMethod *EAL_KdfFindMethod(CRYPT_KDF_AlgId id) | |||
| 87 | return NULL; | 87 | return NULL; |
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | -#endif | 90 | +#endif |
| @@ -46,6 +46,7 @@ static void EalMacCopyMethod(const EAL_MacMethod *src, EAL_MacUnitaryMethod *dst | |||
| 46 | dst->newCtx = src->newCtx; | 46 | dst->newCtx = src->newCtx; |
| 47 | dst->ctrl = src->ctrl; | 47 | dst->ctrl = src->ctrl; |
| 48 | dst->freeCtx = src->freeCtx; | 48 | dst->freeCtx = src->freeCtx; |
| 49 | + dst->dupCtx = src->dupCtx; | ||
| 49 | } | 50 | } |
| 50 | 51 | ||
| 51 | #ifdef HITLS_CRYPTO_PROVIDER | 52 | #ifdef HITLS_CRYPTO_PROVIDER |
| @@ -83,6 +84,9 @@ static int32_t CRYPT_EAL_SetMacMethod(CRYPT_EAL_MacCtx *ctx, const CRYPT_EAL_Fun | |||
| 83 | case CRYPT_EAL_IMPLMAC_FREECTX: | 84 | case CRYPT_EAL_IMPLMAC_FREECTX: |
| 84 | method->freeCtx = funcs[index].func; | 85 | method->freeCtx = funcs[index].func; |
| 85 | break; | 86 | break; |
| 87 | + case CRYPT_EAL_IMPLMAC_DUPCTX: | ||
| 88 | + method->dupCtx = funcs[index].func; | ||
| 89 | + break; | ||
| 86 | default: | 90 | default: |
| 87 | BSL_SAL_Free(method); | 91 | BSL_SAL_Free(method); |
| 88 | BSL_ERR_PUSH_ERROR(CRYPT_PROVIDER_ERR_UNEXPECTED_IMPL); | 92 | BSL_ERR_PUSH_ERROR(CRYPT_PROVIDER_ERR_UNEXPECTED_IMPL); |
| @@ -379,4 +383,70 @@ bool CRYPT_EAL_MacIsValidAlgId(CRYPT_MAC_AlgId id) | |||
| 379 | return EAL_MacFindMethod(id, &method) == CRYPT_SUCCESS; | 383 | return EAL_MacFindMethod(id, &method) == CRYPT_SUCCESS; |
| 380 | } | 384 | } |
| 381 | 385 | ||
| 386 | +int32_t CRYPT_EAL_MacCopyCtx(CRYPT_EAL_MacCtx *to, const CRYPT_EAL_MacCtx *from) | ||
| 387 | +{ | ||
| 388 | + if (to == NULL || from == NULL || from->macMeth == NULL || from->macMeth->dupCtx == NULL) { | ||
| 389 | + EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_MAC, CRYPT_MAC_MAX, CRYPT_NULL_INPUT); | ||
| 390 | + return CRYPT_NULL_INPUT; | ||
| 391 | + } | ||
| 392 | + | ||
| 393 | + if (to->ctx != NULL) { | ||
| 394 | + if (to->macMeth->freeCtx == NULL) { | ||
| 395 | + EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_MAC, from->id, CRYPT_INVALID_ARG); | ||
| 396 | + return CRYPT_INVALID_ARG; | ||
| 397 | + } | ||
| 398 | + to->macMeth->freeCtx(to->ctx); | ||
| 399 | + to->ctx = NULL; | ||
| 400 | + } | ||
| 401 | + | ||
| 402 | + if (to->macMeth != NULL) { | ||
| 403 | + BSL_SAL_FREE(to->macMeth); | ||
| 404 | + } | ||
| 405 | + | ||
| 406 | + EAL_MacUnitaryMethod *tmpMethod = BSL_SAL_Dump(from->macMeth, sizeof(EAL_MacUnitaryMethod)); | ||
| 407 | + if (tmpMethod == NULL) { | ||
| 408 | + EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_MAC, from->id, CRYPT_MEM_ALLOC_FAIL); | ||
| 409 | + return CRYPT_MEM_ALLOC_FAIL; | ||
| 410 | + } | ||
| 411 | + | ||
| 412 | + void *ctx = from->macMeth->dupCtx(from->ctx); | ||
| 413 | + if (ctx == NULL) { | ||
| 414 | + EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_MAC, from->id, CRYPT_MEM_ALLOC_FAIL); | ||
| 415 | + BSL_SAL_Free(tmpMethod); | ||
| 416 | + return CRYPT_INVALID_ARG; | ||
| 417 | + } | ||
| 418 | + (void)memcpy_s(to, sizeof(CRYPT_EAL_MacCtx), from, sizeof(CRYPT_EAL_MacCtx)); | ||
| 419 | + to->ctx = ctx; | ||
| 420 | + to->macMeth = tmpMethod; | ||
| 421 | + return CRYPT_SUCCESS; | ||
| 422 | +} | ||
| 423 | + | ||
| 424 | +CRYPT_EAL_MacCtx *CRYPT_EAL_MacDupCtx(const CRYPT_EAL_MacCtx *from) | ||
| 425 | +{ | ||
| 426 | + if (from == NULL || from->macMeth == NULL || from->macMeth->dupCtx == NULL) { | ||
| 427 | + EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_MAC, CRYPT_MAC_MAX, CRYPT_NULL_INPUT); | ||
| 428 | + return NULL; | ||
| 429 | + } | ||
| 430 | + | ||
| 431 | + CRYPT_EAL_MacCtx *newCtx = BSL_SAL_Dump(from, sizeof(CRYPT_EAL_MacCtx)); | ||
| 432 | + if (newCtx == NULL ) { | ||
| 433 | + EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_MAC, from->id, CRYPT_MEM_ALLOC_FAIL); | ||
| 434 | + return NULL; | ||
| 435 | + } | ||
| 436 | + newCtx->macMeth = BSL_SAL_Dump(from->macMeth, sizeof(EAL_MacUnitaryMethod)); | ||
| 437 | + if (newCtx->macMeth == NULL) { | ||
| 438 | + EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_MAC, from->id, CRYPT_MEM_ALLOC_FAIL); | ||
| 439 | + BSL_SAL_Free(newCtx); | ||
| 440 | + return NULL; | ||
| 441 | + } | ||
| 442 | + newCtx->ctx = from->macMeth->dupCtx(from->ctx); | ||
| 443 | + if (newCtx->ctx == NULL) { | ||
| 444 | + EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_MAC, from->id, CRYPT_MEM_ALLOC_FAIL); | ||
| 445 | + BSL_SAL_Free(newCtx->macMeth); | ||
| 446 | + BSL_SAL_Free(newCtx); | ||
| 447 | + return NULL; | ||
| 448 | + } | ||
| 449 | + return newCtx; | ||
| 450 | +} | ||
| 451 | + | ||
| 382 | #endif | 452 | #endif |
| @@ -52,7 +52,8 @@ | |||
| 52 | (MacDeinit)CRYPT_##name##_Deinit, \ | 52 | (MacDeinit)CRYPT_##name##_Deinit, \ |
| 53 | (MacReinit)CRYPT_##name##_Reinit, \ | 53 | (MacReinit)CRYPT_##name##_Reinit, \ |
| 54 | (MacCtrl)CRYPT_##name##_Ctrl, \ | 54 | (MacCtrl)CRYPT_##name##_Ctrl, \ |
| 55 | - (MacFreeCtx)CRYPT_##name##_FreeCtx \ | 55 | + (MacFreeCtx)CRYPT_##name##_FreeCtx, \ |
| 56 | + (MacDupCtx)CRYPT_##name##_DupCtx, \ | ||
| 56 | } | 57 | } |
| 57 | 58 | ||
| 58 | #ifdef HITLS_CRYPTO_HMAC | 59 | #ifdef HITLS_CRYPTO_HMAC |
| @@ -77,7 +78,8 @@ EAL_MacMethod g_macMethod_GMAC = { | |||
| 77 | // (MacReinit) | 78 | // (MacReinit) |
| 78 | NULL, | 79 | NULL, |
| 79 | (MacCtrl)CRYPT_GMAC_Ctrl, | 80 | (MacCtrl)CRYPT_GMAC_Ctrl, |
| 80 | - (MacFreeCtx)CRYPT_GMAC_FreeCtx | 81 | + (MacFreeCtx)CRYPT_GMAC_FreeCtx, |
| 82 | + (MacDupCtx)CRYPT_GMAC_DupCtx, | ||
| 81 | }; | 83 | }; |
| 82 | #endif | 84 | #endif |
| 83 | 85 | ||
| @@ -40,6 +40,8 @@ void CRYPT_GMAC_Deinit(MODES_GCM_Ctx *ctx); | |||
| 40 | 40 | ||
| 41 | int32_t CRYPT_GMAC_Ctrl(MODES_GCM_Ctx *ctx, int32_t opt, void *val, uint32_t len); | 41 | int32_t CRYPT_GMAC_Ctrl(MODES_GCM_Ctx *ctx, int32_t opt, void *val, uint32_t len); |
| 42 | 42 | ||
| 43 | +#define CRYPT_GMAC_DupCtx MODES_GCM_DupCtx | ||
| 44 | + | ||
| 43 | #ifdef __cplusplus | 45 | #ifdef __cplusplus |
| 44 | } | 46 | } |
| 45 | #endif /* __cpluscplus */ | 47 | #endif /* __cpluscplus */ |
| @@ -82,6 +82,15 @@ int32_t CRYPT_HKDF_Deinit(CRYPT_HKDF_Ctx *ctx); | |||
| 82 | */ | 82 | */ |
| 83 | void CRYPT_HKDF_FreeCtx(CRYPT_HKDF_Ctx *ctx); | 83 | void CRYPT_HKDF_FreeCtx(CRYPT_HKDF_Ctx *ctx); |
| 84 | 84 | ||
| 85 | +/** | ||
| 86 | + * @ingroup HKDF | ||
| 87 | + * @brief Copy HKDF context. | ||
| 88 | + * | ||
| 89 | + * @param ctx [IN] HKDF handle. | ||
| 90 | + * @retval New HKDF handle. | ||
| 91 | + */ | ||
| 92 | +CRYPT_HKDF_Ctx *CRYPT_HKDF_DupCtx(const CRYPT_HKDF_Ctx *ctx); | ||
| 93 | + | ||
| 85 | #ifdef __cplusplus | 94 | #ifdef __cplusplus |
| 86 | } | 95 | } |
| 87 | #endif // __cplusplus | 96 | #endif // __cplusplus |
| @@ -396,4 +396,51 @@ void CRYPT_HKDF_FreeCtx(CRYPT_HKDF_Ctx *ctx) | |||
| 396 | BSL_SAL_ClearFree((void *)ctx->info, ctx->infoLen); | 396 | BSL_SAL_ClearFree((void *)ctx->info, ctx->infoLen); |
| 397 | BSL_SAL_Free(ctx); | 397 | BSL_SAL_Free(ctx); |
| 398 | } | 398 | } |
| 399 | + | ||
| 400 | +CRYPT_HKDF_Ctx *CRYPT_HKDF_DupCtx(const CRYPT_HKDF_Ctx *ctx) | ||
| 401 | +{ | ||
| 402 | + if (ctx == NULL) { | ||
| 403 | + return NULL; | ||
| 404 | + } | ||
| 405 | + uint8_t *key = NULL; | ||
| 406 | + uint8_t *salt = NULL; | ||
| 407 | + uint8_t *prk = NULL; | ||
| 408 | + uint8_t *info = NULL; | ||
| 409 | + | ||
| 410 | + CRYPT_HKDF_Ctx *newCtx = BSL_SAL_Dump(ctx, sizeof(CRYPT_HKDF_Ctx)); | ||
| 411 | + if (newCtx == NULL) { | ||
| 412 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 413 | + return NULL; | ||
| 414 | + } | ||
| 415 | + if (ctx->key != NULL) { | ||
| 416 | + key = BSL_SAL_Dump(ctx->key, ctx->keyLen); | ||
| 417 | + GOTO_EXIT_IF((key == NULL), CRYPT_MEM_ALLOC_FAIL); | ||
| 418 | + } | ||
| 419 | + if (ctx->salt != NULL) { | ||
| 420 | + salt = BSL_SAL_Dump(ctx->salt, ctx->saltLen); | ||
| 421 | + GOTO_EXIT_IF((salt == NULL), CRYPT_MEM_ALLOC_FAIL); | ||
| 422 | + } | ||
| 423 | + if (ctx->prk != NULL) { | ||
| 424 | + prk = BSL_SAL_Dump(ctx->prk, ctx->prkLen); | ||
| 425 | + GOTO_EXIT_IF((prk == NULL), CRYPT_MEM_ALLOC_FAIL); | ||
| 426 | + } | ||
| 427 | + if (ctx->info != NULL) { | ||
| 428 | + info = BSL_SAL_Dump(ctx->info, ctx->infoLen); | ||
| 429 | + GOTO_EXIT_IF((info == NULL), CRYPT_MEM_ALLOC_FAIL); | ||
| 430 | + } | ||
| 431 | + newCtx->key = key; | ||
| 432 | + newCtx->salt = salt; | ||
| 433 | + newCtx->prk = prk; | ||
| 434 | + newCtx->info = info; | ||
| 435 | + newCtx->outLen = NULL; | ||
| 436 | + return newCtx; | ||
| 437 | +EXIT: | ||
| 438 | + BSL_SAL_ClearFree(key, ctx->keyLen); | ||
| 439 | + BSL_SAL_ClearFree(prk, ctx->prkLen); | ||
| 440 | + BSL_SAL_ClearFree(info, ctx->infoLen); | ||
| 441 | + BSL_SAL_Free(salt); | ||
| 442 | + BSL_SAL_Free(newCtx); | ||
| 443 | + return NULL; | ||
| 444 | +} | ||
| 445 | + | ||
| 399 | #endif // HITLS_CRYPTO_HKDF | 446 | #endif // HITLS_CRYPTO_HKDF |
| @@ -40,6 +40,7 @@ void CRYPT_HMAC_Reinit(CRYPT_HMAC_Ctx *ctx); | |||
| 40 | void CRYPT_HMAC_Deinit(CRYPT_HMAC_Ctx *ctx); | 40 | void CRYPT_HMAC_Deinit(CRYPT_HMAC_Ctx *ctx); |
| 41 | int32_t CRYPT_HMAC_Ctrl(CRYPT_HMAC_Ctx *ctx, CRYPT_MacCtrl opt, void *val, uint32_t len); | 41 | int32_t CRYPT_HMAC_Ctrl(CRYPT_HMAC_Ctx *ctx, CRYPT_MacCtrl opt, void *val, uint32_t len); |
| 42 | void CRYPT_HMAC_FreeCtx(CRYPT_HMAC_Ctx *ctx); | 42 | void CRYPT_HMAC_FreeCtx(CRYPT_HMAC_Ctx *ctx); |
| 43 | +CRYPT_HMAC_Ctx *CRYPT_HMAC_DupCtx(const CRYPT_HMAC_Ctx *macCtx); | ||
| 43 | 44 | ||
| 44 | #ifdef __cplusplus | 45 | #ifdef __cplusplus |
| 45 | } | 46 | } |
| @@ -250,4 +250,39 @@ void CRYPT_HMAC_FreeCtx(CRYPT_HMAC_Ctx *ctx) | |||
| 250 | 250 | ||
| 251 | BSL_SAL_FREE(ctx); | 251 | BSL_SAL_FREE(ctx); |
| 252 | } | 252 | } |
| 253 | + | ||
| 254 | +CRYPT_HMAC_Ctx *CRYPT_HMAC_DupCtx(const CRYPT_HMAC_Ctx *macCtx) | ||
| 255 | +{ | ||
| 256 | + if (macCtx == NULL) { | ||
| 257 | + BSL_ERR_PUSH_ERROR(CRYPT_NULL_INPUT); | ||
| 258 | + return NULL; | ||
| 259 | + } | ||
| 260 | + | ||
| 261 | + if (macCtx->method->dupCtx == NULL) { | ||
| 262 | + BSL_ERR_PUSH_ERROR(CRYPT_NULL_INPUT); | ||
| 263 | + return NULL; | ||
| 264 | + } | ||
| 265 | + CRYPT_HMAC_Ctx *ctx = BSL_SAL_Dump(macCtx, sizeof(CRYPT_HMAC_Ctx)); | ||
| 266 | + if (ctx == NULL) { | ||
| 267 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 268 | + return NULL; | ||
| 269 | + } | ||
| 270 | + | ||
| 271 | + void *mdCtx = macCtx->method->dupCtx(macCtx->mdCtx); | ||
| 272 | + void *oCtx = macCtx->method->dupCtx(macCtx->oCtx); | ||
| 273 | + void *iCtx = macCtx->method->dupCtx(macCtx->iCtx); | ||
| 274 | + if (mdCtx == NULL || oCtx == NULL || iCtx == NULL) { | ||
| 275 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 276 | + BSL_SAL_Free(ctx); | ||
| 277 | + BSL_SAL_Free(mdCtx); | ||
| 278 | + BSL_SAL_Free(oCtx); | ||
| 279 | + BSL_SAL_Free(iCtx); | ||
| 280 | + return NULL; | ||
| 281 | + } | ||
| 282 | + ctx->mdCtx = mdCtx; | ||
| 283 | + ctx->oCtx = oCtx; | ||
| 284 | + ctx->iCtx = iCtx; | ||
| 285 | + return ctx; | ||
| 286 | +} | ||
| 287 | + | ||
| 253 | #endif // HITLS_CRYPTO_HMAC | 288 | #endif // HITLS_CRYPTO_HMAC |
| @@ -227,6 +227,7 @@ typedef int32_t (*CipherUpdate)(void *ctx, const uint8_t *in, uint32_t inLen, ui | |||
| 227 | typedef int32_t (*CipherFinal)(void *ctx, uint8_t *out, uint32_t *outLen); | 227 | typedef int32_t (*CipherFinal)(void *ctx, uint8_t *out, uint32_t *outLen); |
| 228 | typedef int32_t (*CipherCtrl)(void *ctx, int32_t opt, void *val, uint32_t len); | 228 | typedef int32_t (*CipherCtrl)(void *ctx, int32_t opt, void *val, uint32_t len); |
| 229 | typedef void (*CipherFreeCtx)(void *ctx); | 229 | typedef void (*CipherFreeCtx)(void *ctx); |
| 230 | +typedef void *(*CipherDupCtx)(const void *ctx); | ||
| 230 | 231 | ||
| 231 | typedef int32_t (*SetEncryptKey)(void *ctx, const uint8_t *key, uint32_t len); | 232 | typedef int32_t (*SetEncryptKey)(void *ctx, const uint8_t *key, uint32_t len); |
| 232 | typedef int32_t (*SetDecryptKey)(void *ctx, const uint8_t *key, uint32_t len); | 233 | typedef int32_t (*SetDecryptKey)(void *ctx, const uint8_t *key, uint32_t len); |
| @@ -257,6 +258,7 @@ typedef struct { | |||
| 257 | CipherFinal final; | 258 | CipherFinal final; |
| 258 | CipherCtrl ctrl; | 259 | CipherCtrl ctrl; |
| 259 | CipherFreeCtx freeCtx; | 260 | CipherFreeCtx freeCtx; |
| 261 | + CipherDupCtx dupCtx; | ||
| 260 | } EAL_CipherMethod; | 262 | } EAL_CipherMethod; |
| 261 | 263 | ||
| 262 | typedef struct { | 264 | typedef struct { |
| @@ -268,6 +270,7 @@ typedef struct { | |||
| 268 | CipherFinal final; | 270 | CipherFinal final; |
| 269 | CipherCtrl ctrl; | 271 | CipherCtrl ctrl; |
| 270 | CipherFreeCtx freeCtx; | 272 | CipherFreeCtx freeCtx; |
| 273 | + CipherDupCtx dupCtx; | ||
| 271 | } EAL_CipherUnitaryMethod; | 274 | } EAL_CipherUnitaryMethod; |
| 272 | 275 | ||
| 273 | /* prototype of MAC algorithm operation functions */ | 276 | /* prototype of MAC algorithm operation functions */ |
| @@ -282,6 +285,7 @@ typedef void (*MacDeinit)(void *ctx); | |||
| 282 | typedef void (*MacReinit)(void *ctx); | 285 | typedef void (*MacReinit)(void *ctx); |
| 283 | typedef int32_t (*MacCtrl)(void *data, int32_t cmd, void *val, uint32_t valLen); | 286 | typedef int32_t (*MacCtrl)(void *data, int32_t cmd, void *val, uint32_t valLen); |
| 284 | typedef void (*MacFreeCtx)(void *ctx); | 287 | typedef void (*MacFreeCtx)(void *ctx); |
| 288 | +typedef void* (*MacDupCtx)(const void *ctx); | ||
| 285 | 289 | ||
| 286 | /* set of MAC algorithm operation methods */ | 290 | /* set of MAC algorithm operation methods */ |
| 287 | typedef struct { | 291 | typedef struct { |
| @@ -294,6 +298,7 @@ typedef struct { | |||
| 294 | MacReinit reinit; | 298 | MacReinit reinit; |
| 295 | MacCtrl ctrl; | 299 | MacCtrl ctrl; |
| 296 | MdFreeCtx freeCtx; | 300 | MdFreeCtx freeCtx; |
| 301 | + MacDupCtx dupCtx; | ||
| 297 | } EAL_MacMethod; | 302 | } EAL_MacMethod; |
| 298 | 303 | ||
| 299 | typedef struct { | 304 | typedef struct { |
| @@ -307,6 +312,7 @@ typedef struct { | |||
| 307 | // Re-initialize the key. This method is used where the keys are the same during multiple MAC calculations. | 312 | // Re-initialize the key. This method is used where the keys are the same during multiple MAC calculations. |
| 308 | MacReinit reinit; | 313 | MacReinit reinit; |
| 309 | MacCtrl ctrl; | 314 | MacCtrl ctrl; |
| 315 | + MacDupCtx dupCtx; | ||
| 310 | } EAL_MacUnitaryMethod; | 316 | } EAL_MacUnitaryMethod; |
| 311 | 317 | ||
| 312 | typedef struct { | 318 | typedef struct { |
| @@ -359,6 +365,7 @@ typedef int32_t (*KdfDerive)(void *ctx, uint8_t *key, uint32_t keyLen); | |||
| 359 | typedef int32_t (*KdfDeinit)(void *ctx); | 365 | typedef int32_t (*KdfDeinit)(void *ctx); |
| 360 | typedef int32_t (*KdfCtrl)(void *data, int32_t cmd, void *val, uint32_t valLen); | 366 | typedef int32_t (*KdfCtrl)(void *data, int32_t cmd, void *val, uint32_t valLen); |
| 361 | typedef void (*KdfFreeCtx)(void *ctx); | 367 | typedef void (*KdfFreeCtx)(void *ctx); |
| 368 | +typedef void *(*KdfDupCtx)(const void *ctx); | ||
| 362 | 369 | ||
| 363 | typedef struct { | 370 | typedef struct { |
| 364 | KdfNewCtx newCtx; | 371 | KdfNewCtx newCtx; |
| @@ -367,6 +374,7 @@ typedef struct { | |||
| 367 | KdfDeinit deinit; | 374 | KdfDeinit deinit; |
| 368 | KdfFreeCtx freeCtx; | 375 | KdfFreeCtx freeCtx; |
| 369 | KdfCtrl ctrl; | 376 | KdfCtrl ctrl; |
| 377 | + KdfDupCtx dupCtx; | ||
| 370 | } EAL_KdfMethod; | 378 | } EAL_KdfMethod; |
| 371 | 379 | ||
| 372 | typedef struct { | 380 | typedef struct { |
| @@ -377,6 +385,7 @@ typedef struct { | |||
| 377 | KdfDeinit deinit; | 385 | KdfDeinit deinit; |
| 378 | KdfFreeCtx freeCtx; | 386 | KdfFreeCtx freeCtx; |
| 379 | KdfCtrl ctrl; | 387 | KdfCtrl ctrl; |
| 388 | + KdfDupCtx dupCtx; | ||
| 380 | } EAL_KdfUnitaryMethod; | 389 | } EAL_KdfUnitaryMethod; |
| 381 | 390 | ||
| 382 | typedef struct { | 391 | typedef struct { |
| @@ -82,6 +82,14 @@ int32_t CRYPT_KDFTLS12_Deinit(CRYPT_KDFTLS12_Ctx *ctx); | |||
| 82 | */ | 82 | */ |
| 83 | void CRYPT_KDFTLS12_FreeCtx(CRYPT_KDFTLS12_Ctx *ctx); | 83 | void CRYPT_KDFTLS12_FreeCtx(CRYPT_KDFTLS12_Ctx *ctx); |
| 84 | 84 | ||
| 85 | +/** | ||
| 86 | + * @ingroup KDFTLS12 | ||
| 87 | + * @brief Copy KDFTLS12 context. | ||
| 88 | + * | ||
| 89 | + * @param ctx [IN] KDFTLS12 handle. | ||
| 90 | + * @retval New KDFTLS12 handle. | ||
| 91 | + */ | ||
| 92 | +CRYPT_KDFTLS12_Ctx *CRYPT_KDFTLS12_DupCtx(const CRYPT_KDFTLS12_Ctx *ctx); | ||
| 85 | 93 | ||
| 86 | #ifdef __cplusplus | 94 | #ifdef __cplusplus |
| 87 | } | 95 | } |
| @@ -270,4 +270,52 @@ void CRYPT_KDFTLS12_FreeCtx(CRYPT_KDFTLS12_Ctx *ctx) | |||
| 270 | BSL_SAL_Free(ctx); | 270 | BSL_SAL_Free(ctx); |
| 271 | } | 271 | } |
| 272 | 272 | ||
| 273 | +CRYPT_KDFTLS12_Ctx *CRYPT_KDFTLS12_DupCtx(const CRYPT_KDFTLS12_Ctx *ctx) | ||
| 274 | +{ | ||
| 275 | + if (ctx == NULL) { | ||
| 276 | + return NULL; | ||
| 277 | + } | ||
| 278 | + uint8_t *key = NULL; | ||
| 279 | + uint8_t *seed = NULL; | ||
| 280 | + uint8_t *label = NULL; | ||
| 281 | + CRYPT_KDFTLS12_Ctx *newCtx = BSL_SAL_Dump(ctx, sizeof(CRYPT_KDFTLS12_Ctx)); | ||
| 282 | + if (newCtx == NULL) { | ||
| 283 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 284 | + return NULL; | ||
| 285 | + } | ||
| 286 | + | ||
| 287 | + void *macCtx = NULL; | ||
| 288 | + if (ctx->macCtx != NULL) { | ||
| 289 | + macCtx = ctx->macMeth->dupCtx(ctx->macCtx); | ||
| 290 | + GOTO_EXIT_IF((macCtx == NULL), CRYPT_MEM_ALLOC_FAIL); | ||
| 291 | + } | ||
| 292 | + | ||
| 293 | + if (ctx->key != NULL) { | ||
| 294 | + key = BSL_SAL_Dump(ctx->key, ctx->keyLen); | ||
| 295 | + GOTO_EXIT_IF((key == NULL), CRYPT_MEM_ALLOC_FAIL); | ||
| 296 | + } | ||
| 297 | + if (ctx->seed != NULL) { | ||
| 298 | + seed = BSL_SAL_Dump(ctx->seed, ctx->seedLen); | ||
| 299 | + GOTO_EXIT_IF((seed == NULL), CRYPT_MEM_ALLOC_FAIL); | ||
| 300 | + } | ||
| 301 | + if (ctx->label != NULL) { | ||
| 302 | + label = BSL_SAL_Dump(ctx->label, ctx->labelLen); | ||
| 303 | + GOTO_EXIT_IF((label == NULL), CRYPT_MEM_ALLOC_FAIL); | ||
| 304 | + } | ||
| 305 | + | ||
| 306 | + newCtx->macCtx = macCtx; | ||
| 307 | + newCtx->key = key; | ||
| 308 | + newCtx->seed = seed; | ||
| 309 | + newCtx->label = label; | ||
| 310 | + return newCtx; | ||
| 311 | +EXIT: | ||
| 312 | + if (macCtx != NULL) { | ||
| 313 | + ctx->macMeth->freeCtx(macCtx); | ||
| 314 | + } | ||
| 315 | + BSL_SAL_ClearFree(key, ctx->keyLen); | ||
| 316 | + BSL_SAL_ClearFree(label, ctx->labelLen); | ||
| 317 | + BSL_SAL_ClearFree(seed, ctx->seedLen); | ||
| 318 | + BSL_SAL_Free(newCtx); | ||
| 319 | + return NULL; | ||
| 320 | +} | ||
| 273 | #endif // HITLS_CRYPTO_KDFTLS12 | 321 | #endif // HITLS_CRYPTO_KDFTLS12 |
| @@ -60,6 +60,7 @@ typedef struct { | |||
| 60 | void MODES_Clean(MODES_CipherCommonCtx *ctx); | 60 | void MODES_Clean(MODES_CipherCommonCtx *ctx); |
| 61 | int32_t MODES_SetIv(MODES_CipherCommonCtx *ctx, const uint8_t *val, uint32_t len); | 61 | int32_t MODES_SetIv(MODES_CipherCommonCtx *ctx, const uint8_t *val, uint32_t len); |
| 62 | int32_t MODES_GetIv(MODES_CipherCommonCtx *ctx, uint8_t *val, uint32_t len); | 62 | int32_t MODES_GetIv(MODES_CipherCommonCtx *ctx, uint8_t *val, uint32_t len); |
| 63 | +MODES_CipherCtx *MODES_CipherDupCtx(const MODES_CipherCtx *modeCtx); | ||
| 63 | #ifdef __cplusplus | 64 | #ifdef __cplusplus |
| 64 | } | 65 | } |
| 65 | #endif // __cplusplus | 66 | #endif // __cplusplus |
| @@ -67,6 +67,8 @@ int32_t MODE_WRAP_DeInitCtx(MODES_WRAP_Ctx *modeCtx); | |||
| 67 | 67 | ||
| 68 | void MODES_WRAP_FreeCtx(MODES_WRAP_Ctx *modeCtx); | 68 | void MODES_WRAP_FreeCtx(MODES_WRAP_Ctx *modeCtx); |
| 69 | 69 | ||
| 70 | +MODES_WRAP_Ctx *MODES_WRAP_DupCtx(const MODES_WRAP_Ctx *modeCtx); | ||
| 71 | + | ||
| 70 | #ifdef __cplusplus | 72 | #ifdef __cplusplus |
| 71 | } | 73 | } |
| 72 | #endif // __cplusplus | 74 | #endif // __cplusplus |
| @@ -60,6 +60,7 @@ void MODES_CCM_FreeCtx(MODES_CCM_Ctx *modeCtx); | |||
| 60 | int32_t AES_CCM_Update(MODES_CCM_Ctx *modeCtx, const uint8_t *in, uint32_t inLen, uint8_t *out, uint32_t *outLen); | 60 | int32_t AES_CCM_Update(MODES_CCM_Ctx *modeCtx, const uint8_t *in, uint32_t inLen, uint8_t *out, uint32_t *outLen); |
| 61 | 61 | ||
| 62 | int32_t MODES_CCM_UpdateEx(MODES_CCM_Ctx *modeCtx, const uint8_t *in, uint32_t inLen, uint8_t *out, uint32_t *outLen); | 62 | int32_t MODES_CCM_UpdateEx(MODES_CCM_Ctx *modeCtx, const uint8_t *in, uint32_t inLen, uint8_t *out, uint32_t *outLen); |
| 63 | +MODES_CCM_Ctx *MODES_CCM_DupCtx(const MODES_CCM_Ctx *modeCtx); | ||
| 63 | 64 | ||
| 64 | #ifdef __cplusplus | 65 | #ifdef __cplusplus |
| 65 | } | 66 | } |
| @@ -62,6 +62,7 @@ int32_t SM4_CFB_Update(MODES_CFB_Ctx *modeCtx, const uint8_t *in, uint32_t inLen | |||
| 62 | int32_t MODES_CFB_InitCtxEx(MODES_CFB_Ctx *modeCtx, const uint8_t *key, uint32_t keyLen, const uint8_t *iv, | 62 | int32_t MODES_CFB_InitCtxEx(MODES_CFB_Ctx *modeCtx, const uint8_t *key, uint32_t keyLen, const uint8_t *iv, |
| 63 | uint32_t ivLen, void *param, bool enc); | 63 | uint32_t ivLen, void *param, bool enc); |
| 64 | int32_t MODES_CFB_UpdateEx(MODES_CFB_Ctx *modeCtx, const uint8_t *in, uint32_t inLen, uint8_t *out, uint32_t *outLen); | 64 | int32_t MODES_CFB_UpdateEx(MODES_CFB_Ctx *modeCtx, const uint8_t *in, uint32_t inLen, uint8_t *out, uint32_t *outLen); |
| 65 | +MODES_CFB_Ctx *MODES_CFB_DupCtx(const MODES_CFB_Ctx *modeCtx); | ||
| 65 | 66 | ||
| 66 | #ifdef __cplusplus | 67 | #ifdef __cplusplus |
| 67 | } | 68 | } |
| @@ -59,6 +59,7 @@ int32_t MODES_CHACHA20POLY1305_Final(MODES_CHACHAPOLY_Ctx *modeCtx, uint8_t *out | |||
| 59 | int32_t MODES_CHACHA20POLY1305_DeInitCtx(MODES_CHACHAPOLY_Ctx *modeCtx); | 59 | int32_t MODES_CHACHA20POLY1305_DeInitCtx(MODES_CHACHAPOLY_Ctx *modeCtx); |
| 60 | int32_t MODES_CHACHA20POLY1305_Ctrl(MODES_CHACHAPOLY_Ctx *modeCtx, int32_t cmd, void *val, uint32_t len); | 60 | int32_t MODES_CHACHA20POLY1305_Ctrl(MODES_CHACHAPOLY_Ctx *modeCtx, int32_t cmd, void *val, uint32_t len); |
| 61 | void MODES_CHACHA20POLY1305_FreeCtx(MODES_CHACHAPOLY_Ctx *modeCtx); | 61 | void MODES_CHACHA20POLY1305_FreeCtx(MODES_CHACHAPOLY_Ctx *modeCtx); |
| 62 | +MODES_CHACHAPOLY_Ctx *MODES_CHACHA20POLY1305_DupCtx(const MODES_CHACHAPOLY_Ctx *modeCtx); | ||
| 62 | 63 | ||
| 63 | #ifdef __cplusplus | 64 | #ifdef __cplusplus |
| 64 | } | 65 | } |
| @@ -81,6 +81,8 @@ int32_t MODES_GCM_UpdateEx(MODES_GCM_Ctx *modeCtx, const uint8_t *in, uint32_t i | |||
| 81 | 81 | ||
| 82 | int32_t MODES_GCM_InitHashTable(MODES_CipherGCMCtx *ctx); | 82 | int32_t MODES_GCM_InitHashTable(MODES_CipherGCMCtx *ctx); |
| 83 | int32_t MODES_GCM_SetKey(MODES_CipherGCMCtx *ctx, const uint8_t *key, uint32_t len); | 83 | int32_t MODES_GCM_SetKey(MODES_CipherGCMCtx *ctx, const uint8_t *key, uint32_t len); |
| 84 | +MODES_GCM_Ctx *MODES_GCM_DupCtx(const MODES_GCM_Ctx *modeCtx); | ||
| 85 | + | ||
| 84 | #ifdef __cplusplus | 86 | #ifdef __cplusplus |
| 85 | } | 87 | } |
| 86 | #endif // __cplusplus | 88 | #endif // __cplusplus |
| @@ -69,6 +69,8 @@ int32_t AES_XTS_Update(MODES_XTS_Ctx *modeCtx, const uint8_t *in, uint32_t inLen | |||
| 69 | 69 | ||
| 70 | int32_t AES_XTS_Final(MODES_XTS_Ctx *modeCtx, uint8_t *out, uint32_t *outLen); | 70 | int32_t AES_XTS_Final(MODES_XTS_Ctx *modeCtx, uint8_t *out, uint32_t *outLen); |
| 71 | 71 | ||
| 72 | +MODES_XTS_Ctx *MODES_XTS_DupCtx(const MODES_XTS_Ctx *modeCtx); | ||
| 73 | + | ||
| 72 | #ifdef __cplusplus | 74 | #ifdef __cplusplus |
| 73 | } | 75 | } |
| 74 | #endif // __cplusplus | 76 | #endif // __cplusplus |
| @@ -560,4 +560,26 @@ int32_t MODES_SetDecryptKey(MODES_CipherCommonCtx *ctx, const uint8_t *key, uint | |||
| 560 | return ctx->ciphMeth->setDecryptKey(ctx->ciphCtx, key, len); | 560 | return ctx->ciphMeth->setDecryptKey(ctx->ciphCtx, key, len); |
| 561 | } | 561 | } |
| 562 | 562 | ||
| 563 | +MODES_CipherCtx *MODES_CipherDupCtx(const MODES_CipherCtx *modeCtx) | ||
| 564 | +{ | ||
| 565 | + if (modeCtx == NULL) { | ||
| 566 | + return NULL; | ||
| 567 | + } | ||
| 568 | + MODES_CipherCtx *ctx = BSL_SAL_Dump(modeCtx, sizeof(MODES_CipherCtx)); | ||
| 569 | + if (ctx == NULL) { | ||
| 570 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 571 | + return ctx; | ||
| 572 | + } | ||
| 573 | + | ||
| 574 | + void *ciphCtx = BSL_SAL_Dump(modeCtx->commonCtx.ciphCtx, modeCtx->commonCtx.ciphMeth->ctxSize); | ||
| 575 | + if (ciphCtx == NULL) { | ||
| 576 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 577 | + BSL_SAL_ClearFree(ctx, sizeof(MODES_CipherCtx)); | ||
| 578 | + return NULL; | ||
| 579 | + } | ||
| 580 | + | ||
| 581 | + ctx->commonCtx.ciphCtx = ciphCtx; | ||
| 582 | + return ctx; | ||
| 583 | +} | ||
| 584 | + | ||
| 563 | #endif // HITLS_CRYPTO_MODES | 585 | #endif // HITLS_CRYPTO_MODES |
| @@ -441,4 +441,27 @@ int32_t MODE_WRAP_Ctrl(MODES_WRAP_Ctx *modeCtx, int32_t opt, void *val, uint32_t | |||
| 441 | } | 441 | } |
| 442 | } | 442 | } |
| 443 | 443 | ||
| 444 | +MODES_WRAP_Ctx *MODES_WRAP_DupCtx(const MODES_WRAP_Ctx *modeCtx) | ||
| 445 | +{ | ||
| 446 | + if (modeCtx == NULL) { | ||
| 447 | + return NULL; | ||
| 448 | + } | ||
| 449 | + MODES_WRAP_Ctx *ctx = BSL_SAL_Dump(modeCtx, sizeof(MODES_WRAP_Ctx)); | ||
| 450 | + if (ctx == NULL) { | ||
| 451 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 452 | + return ctx; | ||
| 453 | + } | ||
| 454 | + | ||
| 455 | + void *ciphCtx = BSL_SAL_Dump(modeCtx->wrapCtx.ciphCtx, modeCtx->wrapCtx.ciphMeth->ctxSize); | ||
| 456 | + if (ciphCtx == NULL) { | ||
| 457 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 458 | + BSL_SAL_CleanseData(ctx->wrapCtx.iv, CRYPT_WRAP_BLOCKSIZE); | ||
| 459 | + BSL_SAL_Free(ctx); | ||
| 460 | + return NULL; | ||
| 461 | + } | ||
| 462 | + | ||
| 463 | + ctx->wrapCtx.ciphCtx = ciphCtx; | ||
| 464 | + return ctx; | ||
| 465 | +} | ||
| 466 | + | ||
| 444 | #endif | 467 | #endif |
| @@ -622,4 +622,27 @@ int32_t MODES_CCM_UpdateEx(MODES_CCM_Ctx *modeCtx, const uint8_t *in, uint32_t i | |||
| 622 | } | 622 | } |
| 623 | } | 623 | } |
| 624 | 624 | ||
| 625 | +MODES_CCM_Ctx *MODES_CCM_DupCtx(const MODES_CCM_Ctx *modeCtx) | ||
| 626 | +{ | ||
| 627 | + if (modeCtx == NULL) { | ||
| 628 | + return NULL; | ||
| 629 | + } | ||
| 630 | + MODES_CCM_Ctx *ctx = BSL_SAL_Dump(modeCtx, sizeof(MODES_CCM_Ctx)); | ||
| 631 | + if (ctx == NULL) { | ||
| 632 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 633 | + return ctx; | ||
| 634 | + } | ||
| 635 | + | ||
| 636 | + void *ciphCtx = BSL_SAL_Dump(modeCtx->ccmCtx.ciphCtx, modeCtx->ccmCtx.ciphMeth->ctxSize); | ||
| 637 | + if (ciphCtx == NULL) { | ||
| 638 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 639 | + BSL_SAL_CleanseData(&ctx->ccmCtx, sizeof(MODES_CipherCCMCtx)); | ||
| 640 | + BSL_SAL_Free(ctx); | ||
| 641 | + return NULL; | ||
| 642 | + } | ||
| 643 | + | ||
| 644 | + ctx->ccmCtx.ciphCtx = ciphCtx; | ||
| 645 | + return ctx; | ||
| 646 | +} | ||
| 647 | + | ||
| 625 | #endif | 648 | #endif |
| @@ -554,4 +554,26 @@ int32_t MODES_CFB_UpdateEx(MODES_CFB_Ctx *modeCtx, const uint8_t *in, uint32_t i | |||
| 554 | } | 554 | } |
| 555 | } | 555 | } |
| 556 | 556 | ||
| 557 | +MODES_CFB_Ctx *MODES_CFB_DupCtx(const MODES_CFB_Ctx *modeCtx) | ||
| 558 | +{ | ||
| 559 | + if (modeCtx == NULL) { | ||
| 560 | + return NULL; | ||
| 561 | + } | ||
| 562 | + MODES_CFB_Ctx *ctx = BSL_SAL_Dump(modeCtx, sizeof(MODES_CFB_Ctx)); | ||
| 563 | + if (ctx == NULL) { | ||
| 564 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 565 | + return ctx; | ||
| 566 | + } | ||
| 567 | + | ||
| 568 | + void *ciphCtx = BSL_SAL_Dump(modeCtx->cfbCtx.modeCtx.ciphCtx, modeCtx->cfbCtx.modeCtx.ciphMeth->ctxSize); | ||
| 569 | + if (ciphCtx == NULL) { | ||
| 570 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 571 | + BSL_SAL_ClearFree(ctx, sizeof(MODES_CFB_Ctx)); | ||
| 572 | + return NULL; | ||
| 573 | + } | ||
| 574 | + | ||
| 575 | + ctx->cfbCtx.modeCtx.ciphCtx = ciphCtx; | ||
| 576 | + return ctx; | ||
| 577 | +} | ||
| 578 | + | ||
| 557 | #endif | 579 | #endif |
| @@ -437,4 +437,26 @@ void MODES_CHACHA20POLY1305_FreeCtx(MODES_CHACHAPOLY_Ctx *modeCtx) | |||
| 437 | BSL_SAL_ClearFree(modeCtx, sizeof(MODES_CHACHAPOLY_Ctx)); | 437 | BSL_SAL_ClearFree(modeCtx, sizeof(MODES_CHACHAPOLY_Ctx)); |
| 438 | } | 438 | } |
| 439 | 439 | ||
| 440 | +MODES_CHACHAPOLY_Ctx *MODES_CHACHA20POLY1305_DupCtx(const MODES_CHACHAPOLY_Ctx *modeCtx) | ||
| 441 | +{ | ||
| 442 | + if (modeCtx == NULL) { | ||
| 443 | + return NULL; | ||
| 444 | + } | ||
| 445 | + MODES_CHACHAPOLY_Ctx *ctx = BSL_SAL_Dump(modeCtx, sizeof(MODES_CHACHAPOLY_Ctx)); | ||
| 446 | + if (ctx == NULL) { | ||
| 447 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 448 | + return ctx; | ||
| 449 | + } | ||
| 450 | + | ||
| 451 | + void *ciphCtx = BSL_SAL_Dump(modeCtx->chachaCtx.key, modeCtx->chachaCtx.method->ctxSize); | ||
| 452 | + if (ciphCtx == NULL) { | ||
| 453 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 454 | + BSL_SAL_ClearFree(ctx, sizeof(MODES_CHACHAPOLY_Ctx)); | ||
| 455 | + return NULL; | ||
| 456 | + } | ||
| 457 | + | ||
| 458 | + ctx->chachaCtx.key = ciphCtx; | ||
| 459 | + return ctx; | ||
| 460 | +} | ||
| 461 | + | ||
| 440 | #endif | 462 | #endif |
| @@ -559,4 +559,26 @@ int32_t MODES_GCM_UpdateEx(MODES_GCM_Ctx *modeCtx, const uint8_t *in, uint32_t i | |||
| 559 | } | 559 | } |
| 560 | } | 560 | } |
| 561 | 561 | ||
| 562 | +MODES_GCM_Ctx *MODES_GCM_DupCtx(const MODES_GCM_Ctx *modeCtx) | ||
| 563 | +{ | ||
| 564 | + if (modeCtx == NULL) { | ||
| 565 | + return NULL; | ||
| 566 | + } | ||
| 567 | + MODES_GCM_Ctx *ctx = BSL_SAL_Dump(modeCtx, sizeof(MODES_GCM_Ctx)); | ||
| 568 | + if (ctx == NULL) { | ||
| 569 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 570 | + return ctx; | ||
| 571 | + } | ||
| 572 | + | ||
| 573 | + void *ciphCtx = BSL_SAL_Dump(modeCtx->gcmCtx.ciphCtx, modeCtx->gcmCtx.ciphMeth->ctxSize); | ||
| 574 | + if (ciphCtx == NULL) { | ||
| 575 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 576 | + BSL_SAL_ClearFree(ctx, sizeof(MODES_GCM_Ctx)); | ||
| 577 | + return NULL; | ||
| 578 | + } | ||
| 579 | + | ||
| 580 | + ctx->gcmCtx.ciphCtx = ciphCtx; | ||
| 581 | + return ctx; | ||
| 582 | +} | ||
| 583 | + | ||
| 562 | #endif | 584 | #endif |
| @@ -537,4 +537,29 @@ int32_t MODES_XTS_UpdateEx(MODES_XTS_Ctx *modeCtx, const uint8_t *in, uint32_t i | |||
| 537 | } | 537 | } |
| 538 | } | 538 | } |
| 539 | 539 | ||
| 540 | +MODES_XTS_Ctx *MODES_XTS_DupCtx(const MODES_XTS_Ctx *modeCtx) | ||
| 541 | +{ | ||
| 542 | + if (modeCtx == NULL) { | ||
| 543 | + return NULL; | ||
| 544 | + } | ||
| 545 | + MODES_XTS_Ctx *ctx = BSL_SAL_Dump(modeCtx, sizeof(MODES_XTS_Ctx)); | ||
| 546 | + if (ctx == NULL) { | ||
| 547 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 548 | + return ctx; | ||
| 549 | + } | ||
| 550 | + // In the MODES_XTS_NewCtx function, memory allocated for ciphCtx is ctxSize * 2. | ||
| 551 | + void *ciphCtx = BSL_SAL_Dump(modeCtx->xtsCtx.ciphCtx, modeCtx->xtsCtx.ciphMeth->ctxSize * 2); | ||
| 552 | + if (ciphCtx == NULL) { | ||
| 553 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 554 | + BSL_SAL_CleanseData(ctx->xtsCtx.iv, MODES_MAX_IV_LENGTH); | ||
| 555 | + BSL_SAL_CleanseData(ctx->xtsCtx.tweak, MODES_MAX_IV_LENGTH); | ||
| 556 | + (void)memset_s(ctx->data, EAL_MAX_BLOCK_LENGTH, 0, EAL_MAX_BLOCK_LENGTH); | ||
| 557 | + BSL_SAL_Free(ctx); | ||
| 558 | + return NULL; | ||
| 559 | + } | ||
| 560 | + | ||
| 561 | + ctx->xtsCtx.ciphCtx = ciphCtx; | ||
| 562 | + return ctx; | ||
| 563 | +} | ||
| 564 | + | ||
| 540 | #endif // HITLS_CRYPTO_XTS | 565 | #endif // HITLS_CRYPTO_XTS |
| @@ -82,6 +82,15 @@ int32_t CRYPT_PBKDF2_Deinit(CRYPT_PBKDF2_Ctx *ctx); | |||
| 82 | */ | 82 | */ |
| 83 | void CRYPT_PBKDF2_FreeCtx(CRYPT_PBKDF2_Ctx *ctx); | 83 | void CRYPT_PBKDF2_FreeCtx(CRYPT_PBKDF2_Ctx *ctx); |
| 84 | 84 | ||
| 85 | +/** | ||
| 86 | + * @ingroup PBKDF2 | ||
| 87 | + * @brief Copy PBKDF2 context. | ||
| 88 | + * | ||
| 89 | + * @param ctx [IN] PBKDF2 handle. | ||
| 90 | + * @retval New PBKDF2 handle. | ||
| 91 | + */ | ||
| 92 | +CRYPT_PBKDF2_Ctx *CRYPT_PBKDF2_DupCtx(const CRYPT_PBKDF2_Ctx *ctx); | ||
| 93 | + | ||
| 85 | #ifdef __cplusplus | 94 | #ifdef __cplusplus |
| 86 | } | 95 | } |
| 87 | #endif // __cplusplus | 96 | #endif // __cplusplus |
| @@ -406,4 +406,45 @@ void CRYPT_PBKDF2_FreeCtx(CRYPT_PBKDF2_Ctx *ctx) | |||
| 406 | BSL_SAL_Free(ctx); | 406 | BSL_SAL_Free(ctx); |
| 407 | } | 407 | } |
| 408 | 408 | ||
| 409 | +CRYPT_PBKDF2_Ctx *CRYPT_PBKDF2_DupCtx(const CRYPT_PBKDF2_Ctx *ctx) | ||
| 410 | +{ | ||
| 411 | + if (ctx == NULL) { | ||
| 412 | + return NULL; | ||
| 413 | + } | ||
| 414 | + uint8_t *password = NULL; | ||
| 415 | + uint8_t *salt = NULL; | ||
| 416 | + CRYPT_PBKDF2_Ctx *newCtx = BSL_SAL_Dump(ctx, sizeof(CRYPT_PBKDF2_Ctx)); | ||
| 417 | + if (newCtx == NULL) { | ||
| 418 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 419 | + return NULL; | ||
| 420 | + } | ||
| 421 | + | ||
| 422 | + void *macCtx = NULL; | ||
| 423 | + if (ctx->macCtx != NULL) { | ||
| 424 | + macCtx = ctx->macMeth->dupCtx(ctx->macCtx); | ||
| 425 | + GOTO_EXIT_IF((macCtx == NULL), CRYPT_MEM_ALLOC_FAIL); | ||
| 426 | + } | ||
| 427 | + | ||
| 428 | + if (ctx->password != NULL) { | ||
| 429 | + password = BSL_SAL_Dump(ctx->password, ctx->passLen); | ||
| 430 | + GOTO_EXIT_IF((password == NULL), CRYPT_MEM_ALLOC_FAIL); | ||
| 431 | + } | ||
| 432 | + if (ctx->salt != NULL) { | ||
| 433 | + salt = BSL_SAL_Dump(ctx->salt, ctx->saltLen); | ||
| 434 | + GOTO_EXIT_IF((salt == NULL), CRYPT_MEM_ALLOC_FAIL); | ||
| 435 | + } | ||
| 436 | + newCtx->macCtx = macCtx; | ||
| 437 | + newCtx->password = password; | ||
| 438 | + newCtx->salt = salt; | ||
| 439 | + return newCtx; | ||
| 440 | +EXIT: | ||
| 441 | + if (macCtx != NULL) { | ||
| 442 | + ctx->macMeth->freeCtx(macCtx); | ||
| 443 | + } | ||
| 444 | + BSL_SAL_ClearFree(password, ctx->passLen); | ||
| 445 | + BSL_SAL_Free(salt); | ||
| 446 | + BSL_SAL_Free(newCtx); | ||
| 447 | + return NULL; | ||
| 448 | +} | ||
| 449 | + | ||
| 409 | #endif // HITLS_CRYPTO_PBKDF2 | 450 | #endif // HITLS_CRYPTO_PBKDF2 |
| @@ -100,6 +100,7 @@ const CRYPT_EAL_Func g_defEalCbc[] = { | |||
| 100 | {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_CBC_DeInitCtx}, | 100 | {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_CBC_DeInitCtx}, |
| 101 | {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_CBC_Ctrl}, | 101 | {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_CBC_Ctrl}, |
| 102 | {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_CBC_FreeCtx}, | 102 | {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_CBC_FreeCtx}, |
| 103 | + {CRYPT_EAL_IMPLCIPHER_DUPCTX, (CRYPT_EAL_ImplCipherDupCtx)MODES_CipherDupCtx}, | ||
| 103 | #endif | 104 | #endif |
| 104 | CRYPT_EAL_FUNC_END, | 105 | CRYPT_EAL_FUNC_END, |
| 105 | }; | 106 | }; |
| @@ -113,6 +114,7 @@ const CRYPT_EAL_Func g_defEalCcm[] = { | |||
| 113 | {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_CCM_DeInitCtx}, | 114 | {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_CCM_DeInitCtx}, |
| 114 | {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_CCM_Ctrl}, | 115 | {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_CCM_Ctrl}, |
| 115 | {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_CCM_FreeCtx}, | 116 | {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_CCM_FreeCtx}, |
| 117 | + {CRYPT_EAL_IMPLCIPHER_DUPCTX, (CRYPT_EAL_ImplCipherDupCtx)MODES_CCM_DupCtx}, | ||
| 116 | #endif | 118 | #endif |
| 117 | CRYPT_EAL_FUNC_END, | 119 | CRYPT_EAL_FUNC_END, |
| 118 | }; | 120 | }; |
| @@ -126,6 +128,7 @@ const CRYPT_EAL_Func g_defEalCfb[] = { | |||
| 126 | {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_CFB_DeInitCtx}, | 128 | {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_CFB_DeInitCtx}, |
| 127 | {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_CFB_Ctrl}, | 129 | {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_CFB_Ctrl}, |
| 128 | {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_CFB_FreeCtx}, | 130 | {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_CFB_FreeCtx}, |
| 131 | + {CRYPT_EAL_IMPLCIPHER_DUPCTX, (CRYPT_EAL_ImplCipherDupCtx)MODES_CFB_DupCtx}, | ||
| 129 | #endif | 132 | #endif |
| 130 | CRYPT_EAL_FUNC_END, | 133 | CRYPT_EAL_FUNC_END, |
| 131 | }; | 134 | }; |
| @@ -139,6 +142,7 @@ const CRYPT_EAL_Func g_defEalChaCha[] = { | |||
| 139 | {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_CHACHA20POLY1305_DeInitCtx}, | 142 | {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_CHACHA20POLY1305_DeInitCtx}, |
| 140 | {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_CHACHA20POLY1305_Ctrl}, | 143 | {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_CHACHA20POLY1305_Ctrl}, |
| 141 | {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_CHACHA20POLY1305_FreeCtx}, | 144 | {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_CHACHA20POLY1305_FreeCtx}, |
| 145 | + {CRYPT_EAL_IMPLCIPHER_DUPCTX, (CRYPT_EAL_ImplCipherDupCtx)MODES_CHACHA20POLY1305_DupCtx}, | ||
| 142 | #endif | 146 | #endif |
| 143 | CRYPT_EAL_FUNC_END, | 147 | CRYPT_EAL_FUNC_END, |
| 144 | }; | 148 | }; |
| @@ -152,6 +156,7 @@ const CRYPT_EAL_Func g_defEalCtr[] = { | |||
| 152 | {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_CTR_DeInitCtx}, | 156 | {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_CTR_DeInitCtx}, |
| 153 | {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_CTR_Ctrl}, | 157 | {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_CTR_Ctrl}, |
| 154 | {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_CTR_FreeCtx}, | 158 | {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_CTR_FreeCtx}, |
| 159 | + {CRYPT_EAL_IMPLCIPHER_DUPCTX, (CRYPT_EAL_ImplCipherDupCtx)MODES_CipherDupCtx}, | ||
| 155 | #endif | 160 | #endif |
| 156 | CRYPT_EAL_FUNC_END, | 161 | CRYPT_EAL_FUNC_END, |
| 157 | }; | 162 | }; |
| @@ -165,6 +170,7 @@ const CRYPT_EAL_Func g_defEalEcb[] = { | |||
| 165 | {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_ECB_DeinitCtx}, | 170 | {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_ECB_DeinitCtx}, |
| 166 | {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_ECB_Ctrl}, | 171 | {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_ECB_Ctrl}, |
| 167 | {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_ECB_FreeCtx}, | 172 | {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_ECB_FreeCtx}, |
| 173 | + {CRYPT_EAL_IMPLCIPHER_DUPCTX, (CRYPT_EAL_ImplCipherDupCtx)MODES_CipherDupCtx}, | ||
| 168 | #endif | 174 | #endif |
| 169 | CRYPT_EAL_FUNC_END, | 175 | CRYPT_EAL_FUNC_END, |
| 170 | }; | 176 | }; |
| @@ -178,6 +184,7 @@ const CRYPT_EAL_Func g_defEalGcm[] = { | |||
| 178 | {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_GCM_DeInitCtx}, | 184 | {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_GCM_DeInitCtx}, |
| 179 | {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_GCM_Ctrl}, | 185 | {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_GCM_Ctrl}, |
| 180 | {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_GCM_FreeCtx}, | 186 | {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_GCM_FreeCtx}, |
| 187 | + {CRYPT_EAL_IMPLCIPHER_DUPCTX, (CRYPT_EAL_ImplCipherDupCtx)MODES_GCM_DupCtx}, | ||
| 181 | #endif | 188 | #endif |
| 182 | CRYPT_EAL_FUNC_END, | 189 | CRYPT_EAL_FUNC_END, |
| 183 | }; | 190 | }; |
| @@ -191,6 +198,7 @@ const CRYPT_EAL_Func g_defEalOfb[] = { | |||
| 191 | {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_OFB_DeInitCtx}, | 198 | {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_OFB_DeInitCtx}, |
| 192 | {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_OFB_Ctrl}, | 199 | {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_OFB_Ctrl}, |
| 193 | {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_OFB_FreeCtx}, | 200 | {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_OFB_FreeCtx}, |
| 201 | + {CRYPT_EAL_IMPLCIPHER_DUPCTX, (CRYPT_EAL_ImplCipherDupCtx)MODES_CipherDupCtx}, | ||
| 194 | #endif | 202 | #endif |
| 195 | CRYPT_EAL_FUNC_END, | 203 | CRYPT_EAL_FUNC_END, |
| 196 | }; | 204 | }; |
| @@ -204,12 +212,13 @@ const CRYPT_EAL_Func g_defEalXts[] = { | |||
| 204 | {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_XTS_DeInitCtx}, | 212 | {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_XTS_DeInitCtx}, |
| 205 | {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_XTS_Ctrl}, | 213 | {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_XTS_Ctrl}, |
| 206 | {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_XTS_FreeCtx}, | 214 | {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_XTS_FreeCtx}, |
| 215 | + {CRYPT_EAL_IMPLCIPHER_DUPCTX, (CRYPT_EAL_ImplCipherDupCtx)MODES_XTS_DupCtx}, | ||
| 207 | #endif | 216 | #endif |
| 208 | CRYPT_EAL_FUNC_END, | 217 | CRYPT_EAL_FUNC_END, |
| 209 | }; | 218 | }; |
| 210 | 219 | ||
| 211 | -#ifdef HITLS_CRYPTO_WRAP | ||
| 212 | const CRYPT_EAL_Func g_defEalWrap[] = { | 220 | const CRYPT_EAL_Func g_defEalWrap[] = { |
| 221 | +#ifdef HITLS_CRYPTO_WRAP | ||
| 213 | {CRYPT_EAL_IMPLCIPHER_NEWCTX, (CRYPT_EAL_ImplCipherNewCtx)CRYPT_EAL_DefCipherNewCtx}, | 222 | {CRYPT_EAL_IMPLCIPHER_NEWCTX, (CRYPT_EAL_ImplCipherNewCtx)CRYPT_EAL_DefCipherNewCtx}, |
| 214 | {CRYPT_EAL_IMPLCIPHER_INITCTX, (CRYPT_EAL_ImplCipherInitCtx)MODES_WRAP_InitCtx}, | 223 | {CRYPT_EAL_IMPLCIPHER_INITCTX, (CRYPT_EAL_ImplCipherInitCtx)MODES_WRAP_InitCtx}, |
| 215 | {CRYPT_EAL_IMPLCIPHER_UPDATE, (CRYPT_EAL_ImplCipherUpdate)MODES_WRAP_Update}, | 224 | {CRYPT_EAL_IMPLCIPHER_UPDATE, (CRYPT_EAL_ImplCipherUpdate)MODES_WRAP_Update}, |
| @@ -217,8 +226,9 @@ const CRYPT_EAL_Func g_defEalWrap[] = { | |||
| 217 | {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODE_WRAP_DeInitCtx}, | 226 | {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODE_WRAP_DeInitCtx}, |
| 218 | {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODE_WRAP_Ctrl}, | 227 | {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODE_WRAP_Ctrl}, |
| 219 | {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_WRAP_FreeCtx}, | 228 | {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_WRAP_FreeCtx}, |
| 229 | + {CRYPT_EAL_IMPLCIPHER_DUPCTX, (CRYPT_EAL_ImplCipherDupCtx)MODES_WRAP_DupCtx}, | ||
| 230 | +#endif | ||
| 220 | CRYPT_EAL_FUNC_END, | 231 | CRYPT_EAL_FUNC_END, |
| 221 | }; | 232 | }; |
| 222 | -#endif | ||
| 223 | 233 | ||
| 224 | -#endif /* HITLS_CRYPTO_PROVIDER */ | 234 | +#endif /* HITLS_CRYPTO_PROVIDER */ |
| @@ -72,6 +72,7 @@ const CRYPT_EAL_Func g_defEalKdfScrypt[] = { | |||
| 72 | {CRYPT_EAL_IMPLKDF_DEINITCTX, (CRYPT_EAL_ImplKdfDeInitCtx)CRYPT_SCRYPT_Deinit}, | 72 | {CRYPT_EAL_IMPLKDF_DEINITCTX, (CRYPT_EAL_ImplKdfDeInitCtx)CRYPT_SCRYPT_Deinit}, |
| 73 | {CRYPT_EAL_IMPLKDF_CTRL, (CRYPT_EAL_ImplKdfCtrl)CRYPT_EAL_DefKdfCtrl}, | 73 | {CRYPT_EAL_IMPLKDF_CTRL, (CRYPT_EAL_ImplKdfCtrl)CRYPT_EAL_DefKdfCtrl}, |
| 74 | {CRYPT_EAL_IMPLKDF_FREECTX, (CRYPT_EAL_ImplKdfFreeCtx)CRYPT_SCRYPT_FreeCtx}, | 74 | {CRYPT_EAL_IMPLKDF_FREECTX, (CRYPT_EAL_ImplKdfFreeCtx)CRYPT_SCRYPT_FreeCtx}, |
| 75 | + {CRYPT_EAL_IMPLKDF_DUPCTX, (CRYPT_EAL_ImplKdfDupCtx)CRYPT_SCRYPT_DupCtx}, | ||
| 75 | #endif | 76 | #endif |
| 76 | CRYPT_EAL_FUNC_END, | 77 | CRYPT_EAL_FUNC_END, |
| 77 | }; | 78 | }; |
| @@ -84,6 +85,7 @@ const CRYPT_EAL_Func g_defEalKdfPBKdf2[] = { | |||
| 84 | {CRYPT_EAL_IMPLKDF_DEINITCTX, (CRYPT_EAL_ImplKdfDeInitCtx)CRYPT_PBKDF2_Deinit}, | 85 | {CRYPT_EAL_IMPLKDF_DEINITCTX, (CRYPT_EAL_ImplKdfDeInitCtx)CRYPT_PBKDF2_Deinit}, |
| 85 | {CRYPT_EAL_IMPLKDF_CTRL, (CRYPT_EAL_ImplKdfCtrl)CRYPT_EAL_DefKdfCtrl}, | 86 | {CRYPT_EAL_IMPLKDF_CTRL, (CRYPT_EAL_ImplKdfCtrl)CRYPT_EAL_DefKdfCtrl}, |
| 86 | {CRYPT_EAL_IMPLKDF_FREECTX, (CRYPT_EAL_ImplKdfFreeCtx)CRYPT_PBKDF2_FreeCtx}, | 87 | {CRYPT_EAL_IMPLKDF_FREECTX, (CRYPT_EAL_ImplKdfFreeCtx)CRYPT_PBKDF2_FreeCtx}, |
| 88 | + {CRYPT_EAL_IMPLKDF_DUPCTX, (CRYPT_EAL_ImplKdfDupCtx)CRYPT_PBKDF2_DupCtx}, | ||
| 87 | #endif | 89 | #endif |
| 88 | CRYPT_EAL_FUNC_END, | 90 | CRYPT_EAL_FUNC_END, |
| 89 | }; | 91 | }; |
| @@ -96,6 +98,7 @@ const CRYPT_EAL_Func g_defEalKdfKdfTLS12[] = { | |||
| 96 | {CRYPT_EAL_IMPLKDF_DEINITCTX, (CRYPT_EAL_ImplKdfDeInitCtx)CRYPT_KDFTLS12_Deinit}, | 98 | {CRYPT_EAL_IMPLKDF_DEINITCTX, (CRYPT_EAL_ImplKdfDeInitCtx)CRYPT_KDFTLS12_Deinit}, |
| 97 | {CRYPT_EAL_IMPLKDF_CTRL, (CRYPT_EAL_ImplKdfCtrl)CRYPT_EAL_DefKdfCtrl}, | 99 | {CRYPT_EAL_IMPLKDF_CTRL, (CRYPT_EAL_ImplKdfCtrl)CRYPT_EAL_DefKdfCtrl}, |
| 98 | {CRYPT_EAL_IMPLKDF_FREECTX, (CRYPT_EAL_ImplKdfFreeCtx)CRYPT_KDFTLS12_FreeCtx}, | 100 | {CRYPT_EAL_IMPLKDF_FREECTX, (CRYPT_EAL_ImplKdfFreeCtx)CRYPT_KDFTLS12_FreeCtx}, |
| 101 | + {CRYPT_EAL_IMPLKDF_DUPCTX, (CRYPT_EAL_ImplKdfDupCtx)CRYPT_KDFTLS12_DupCtx}, | ||
| 99 | #endif | 102 | #endif |
| 100 | CRYPT_EAL_FUNC_END, | 103 | CRYPT_EAL_FUNC_END, |
| 101 | }; | 104 | }; |
| @@ -108,6 +111,7 @@ const CRYPT_EAL_Func g_defEalKdfHkdf[] = { | |||
| 108 | {CRYPT_EAL_IMPLKDF_DEINITCTX, (CRYPT_EAL_ImplKdfDeInitCtx)CRYPT_HKDF_Deinit}, | 111 | {CRYPT_EAL_IMPLKDF_DEINITCTX, (CRYPT_EAL_ImplKdfDeInitCtx)CRYPT_HKDF_Deinit}, |
| 109 | {CRYPT_EAL_IMPLKDF_CTRL, (CRYPT_EAL_ImplKdfCtrl)CRYPT_EAL_DefKdfCtrl}, | 112 | {CRYPT_EAL_IMPLKDF_CTRL, (CRYPT_EAL_ImplKdfCtrl)CRYPT_EAL_DefKdfCtrl}, |
| 110 | {CRYPT_EAL_IMPLKDF_FREECTX, (CRYPT_EAL_ImplKdfFreeCtx)CRYPT_HKDF_FreeCtx}, | 113 | {CRYPT_EAL_IMPLKDF_FREECTX, (CRYPT_EAL_ImplKdfFreeCtx)CRYPT_HKDF_FreeCtx}, |
| 114 | + {CRYPT_EAL_IMPLKDF_DUPCTX, (CRYPT_EAL_ImplKdfDupCtx)CRYPT_HKDF_DupCtx}, | ||
| 111 | #endif | 115 | #endif |
| 112 | CRYPT_EAL_FUNC_END, | 116 | CRYPT_EAL_FUNC_END, |
| 113 | }; | 117 | }; |
| @@ -128,6 +128,7 @@ const CRYPT_EAL_Func g_defEalMacHmac[] = { | |||
| 128 | {CRYPT_EAL_IMPLMAC_REINITCTX, (CRYPT_EAL_ImplMacReInitCtx)CRYPT_HMAC_ReinitWrapper}, | 128 | {CRYPT_EAL_IMPLMAC_REINITCTX, (CRYPT_EAL_ImplMacReInitCtx)CRYPT_HMAC_ReinitWrapper}, |
| 129 | {CRYPT_EAL_IMPLMAC_CTRL, (CRYPT_EAL_ImplMacCtrl)CRYPT_HMAC_Ctrl}, | 129 | {CRYPT_EAL_IMPLMAC_CTRL, (CRYPT_EAL_ImplMacCtrl)CRYPT_HMAC_Ctrl}, |
| 130 | {CRYPT_EAL_IMPLMAC_FREECTX, (CRYPT_EAL_ImplMacFreeCtx)CRYPT_HMAC_FreeCtx}, | 130 | {CRYPT_EAL_IMPLMAC_FREECTX, (CRYPT_EAL_ImplMacFreeCtx)CRYPT_HMAC_FreeCtx}, |
| 131 | + {CRYPT_EAL_IMPLMAC_DUPCTX, (CRYPT_EAL_ImplMacDupCtx)CRYPT_HMAC_DupCtx}, | ||
| 131 | #endif | 132 | #endif |
| 132 | CRYPT_EAL_FUNC_END, | 133 | CRYPT_EAL_FUNC_END, |
| 133 | }; | 134 | }; |
| @@ -142,6 +143,7 @@ const CRYPT_EAL_Func g_defEalMacCmac[] = { | |||
| 142 | {CRYPT_EAL_IMPLMAC_REINITCTX, (CRYPT_EAL_ImplMacReInitCtx)CRYPT_CMAC_ReinitWrapper}, | 143 | {CRYPT_EAL_IMPLMAC_REINITCTX, (CRYPT_EAL_ImplMacReInitCtx)CRYPT_CMAC_ReinitWrapper}, |
| 143 | {CRYPT_EAL_IMPLMAC_CTRL, (CRYPT_EAL_ImplMacCtrl)CRYPT_CMAC_Ctrl}, | 144 | {CRYPT_EAL_IMPLMAC_CTRL, (CRYPT_EAL_ImplMacCtrl)CRYPT_CMAC_Ctrl}, |
| 144 | {CRYPT_EAL_IMPLMAC_FREECTX, (CRYPT_EAL_ImplMacFreeCtx)CRYPT_CMAC_FreeCtx}, | 145 | {CRYPT_EAL_IMPLMAC_FREECTX, (CRYPT_EAL_ImplMacFreeCtx)CRYPT_CMAC_FreeCtx}, |
| 146 | + {CRYPT_EAL_IMPLMAC_DUPCTX, (CRYPT_EAL_ImplMacDupCtx)CRYPT_CMAC_DupCtx}, | ||
| 145 | #endif | 147 | #endif |
| 146 | CRYPT_EAL_FUNC_END, | 148 | CRYPT_EAL_FUNC_END, |
| 147 | }; | 149 | }; |
| @@ -156,6 +158,7 @@ const CRYPT_EAL_Func g_defEalMacCbcMac[] = { | |||
| 156 | {CRYPT_EAL_IMPLMAC_REINITCTX, (CRYPT_EAL_ImplMacReInitCtx)CRYPT_CBC_MAC_ReinitWrapper}, | 158 | {CRYPT_EAL_IMPLMAC_REINITCTX, (CRYPT_EAL_ImplMacReInitCtx)CRYPT_CBC_MAC_ReinitWrapper}, |
| 157 | {CRYPT_EAL_IMPLMAC_CTRL, (CRYPT_EAL_ImplMacCtrl)CRYPT_CBC_MAC_Ctrl}, | 159 | {CRYPT_EAL_IMPLMAC_CTRL, (CRYPT_EAL_ImplMacCtrl)CRYPT_CBC_MAC_Ctrl}, |
| 158 | {CRYPT_EAL_IMPLMAC_FREECTX, (CRYPT_EAL_ImplMacFreeCtx)CRYPT_CBC_MAC_FreeCtx}, | 160 | {CRYPT_EAL_IMPLMAC_FREECTX, (CRYPT_EAL_ImplMacFreeCtx)CRYPT_CBC_MAC_FreeCtx}, |
| 161 | + {CRYPT_EAL_IMPLMAC_DUPCTX, (CRYPT_EAL_ImplMacDupCtx)CRYPT_CBC_MAC_DupCtx}, | ||
| 159 | #endif | 162 | #endif |
| 160 | CRYPT_EAL_FUNC_END, | 163 | CRYPT_EAL_FUNC_END, |
| 161 | }; | 164 | }; |
| @@ -170,6 +173,7 @@ const CRYPT_EAL_Func g_defEalMacGmac[] = { | |||
| 170 | {CRYPT_EAL_IMPLMAC_REINITCTX, NULL}, | 173 | {CRYPT_EAL_IMPLMAC_REINITCTX, NULL}, |
| 171 | {CRYPT_EAL_IMPLMAC_CTRL, (CRYPT_EAL_ImplMacCtrl)CRYPT_GMAC_Ctrl}, | 174 | {CRYPT_EAL_IMPLMAC_CTRL, (CRYPT_EAL_ImplMacCtrl)CRYPT_GMAC_Ctrl}, |
| 172 | {CRYPT_EAL_IMPLMAC_FREECTX, (CRYPT_EAL_ImplMacFreeCtx)CRYPT_GMAC_FreeCtx}, | 175 | {CRYPT_EAL_IMPLMAC_FREECTX, (CRYPT_EAL_ImplMacFreeCtx)CRYPT_GMAC_FreeCtx}, |
| 176 | + {CRYPT_EAL_IMPLMAC_DUPCTX, (CRYPT_EAL_ImplMacDupCtx)CRYPT_GMAC_DupCtx}, | ||
| 173 | #endif | 177 | #endif |
| 174 | CRYPT_EAL_FUNC_END, | 178 | CRYPT_EAL_FUNC_END, |
| 175 | }; | 179 | }; |
| @@ -184,6 +188,7 @@ const CRYPT_EAL_Func g_defEalMacSiphash[] = { | |||
| 184 | {CRYPT_EAL_IMPLMAC_REINITCTX, (CRYPT_EAL_ImplMacReInitCtx)CRYPT_SIPHASH_ReinitWrapper}, | 188 | {CRYPT_EAL_IMPLMAC_REINITCTX, (CRYPT_EAL_ImplMacReInitCtx)CRYPT_SIPHASH_ReinitWrapper}, |
| 185 | {CRYPT_EAL_IMPLMAC_CTRL, (CRYPT_EAL_ImplMacCtrl)CRYPT_SIPHASH_Ctrl}, | 189 | {CRYPT_EAL_IMPLMAC_CTRL, (CRYPT_EAL_ImplMacCtrl)CRYPT_SIPHASH_Ctrl}, |
| 186 | {CRYPT_EAL_IMPLMAC_FREECTX, (CRYPT_EAL_ImplMacFreeCtx)CRYPT_SIPHASH_FreeCtx}, | 190 | {CRYPT_EAL_IMPLMAC_FREECTX, (CRYPT_EAL_ImplMacFreeCtx)CRYPT_SIPHASH_FreeCtx}, |
| 191 | + {CRYPT_EAL_IMPLMAC_DUPCTX, (CRYPT_EAL_ImplMacDupCtx)CRYPT_SIPHASH_DupCtx}, | ||
| 187 | #endif | 192 | #endif |
| 188 | CRYPT_EAL_FUNC_END, | 193 | CRYPT_EAL_FUNC_END, |
| 189 | }; | 194 | }; |
| @@ -87,6 +87,15 @@ int32_t CRYPT_SCRYPT_Deinit(CRYPT_SCRYPT_Ctx *ctx); | |||
| 87 | */ | 87 | */ |
| 88 | void CRYPT_SCRYPT_FreeCtx(CRYPT_SCRYPT_Ctx *ctx); | 88 | void CRYPT_SCRYPT_FreeCtx(CRYPT_SCRYPT_Ctx *ctx); |
| 89 | 89 | ||
| 90 | +/** | ||
| 91 | + * @ingroup SCRYPT | ||
| 92 | + * @brief Copy SCRYPT context. | ||
| 93 | + * | ||
| 94 | + * @param ctx [IN] SCRYPT handle. | ||
| 95 | + * @retval New SCRYPT handle. | ||
| 96 | + */ | ||
| 97 | +CRYPT_SCRYPT_Ctx *CRYPT_SCRYPT_DupCtx(const CRYPT_SCRYPT_Ctx *ctx); | ||
| 98 | + | ||
| 90 | #ifdef __cplusplus | 99 | #ifdef __cplusplus |
| 91 | } | 100 | } |
| 92 | #endif // __cplusplus | 101 | #endif // __cplusplus |
| @@ -531,4 +531,37 @@ void CRYPT_SCRYPT_FreeCtx(CRYPT_SCRYPT_Ctx *ctx) | |||
| 531 | BSL_SAL_Free(ctx); | 531 | BSL_SAL_Free(ctx); |
| 532 | } | 532 | } |
| 533 | 533 | ||
| 534 | +CRYPT_SCRYPT_Ctx *CRYPT_SCRYPT_DupCtx(const CRYPT_SCRYPT_Ctx *ctx) | ||
| 535 | +{ | ||
| 536 | + if (ctx == NULL) { | ||
| 537 | + return NULL; | ||
| 538 | + } | ||
| 539 | + uint8_t *password = NULL; | ||
| 540 | + uint8_t *salt = NULL; | ||
| 541 | + CRYPT_SCRYPT_Ctx *newCtx = BSL_SAL_Dump(ctx, sizeof(CRYPT_SCRYPT_Ctx)); | ||
| 542 | + if (newCtx == NULL) { | ||
| 543 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 544 | + return NULL; | ||
| 545 | + } | ||
| 546 | + | ||
| 547 | + if (ctx->password != NULL) { | ||
| 548 | + password = BSL_SAL_Dump(ctx->password, ctx->passLen); | ||
| 549 | + GOTO_EXIT_IF((password == NULL), CRYPT_MEM_ALLOC_FAIL); | ||
| 550 | + } | ||
| 551 | + if (ctx->salt != NULL) { | ||
| 552 | + salt = BSL_SAL_Dump(ctx->salt, ctx->saltLen); | ||
| 553 | + GOTO_EXIT_IF((salt == NULL), CRYPT_MEM_ALLOC_FAIL); | ||
| 554 | + } | ||
| 555 | + | ||
| 556 | + newCtx->password = password; | ||
| 557 | + newCtx->salt = salt; | ||
| 558 | + return newCtx; | ||
| 559 | +EXIT: | ||
| 560 | + BSL_SAL_ClearFree(password, ctx->passLen); | ||
| 561 | + BSL_SAL_Free(salt); | ||
| 562 | + BSL_SAL_Free(newCtx); | ||
| 563 | + return NULL; | ||
| 564 | +} | ||
| 565 | + | ||
| 566 | + | ||
| 534 | #endif /* HITLS_CRYPTO_SCRYPT */ | 567 | #endif /* HITLS_CRYPTO_SCRYPT */ |
| @@ -108,6 +108,13 @@ int32_t CRYPT_SIPHASH_Ctrl(CRYPT_SIPHASH_Ctx *ctx, uint32_t opt, void *val, uint | |||
| 108 | */ | 108 | */ |
| 109 | void CRYPT_SIPHASH_FreeCtx(CRYPT_SIPHASH_Ctx *ctx); | 109 | void CRYPT_SIPHASH_FreeCtx(CRYPT_SIPHASH_Ctx *ctx); |
| 110 | 110 | ||
| 111 | +/** | ||
| 112 | + * @brief siphash dup context | ||
| 113 | + * @param ctx [IN] siphash context | ||
| 114 | + * @retval siphash context | ||
| 115 | + */ | ||
| 116 | +CRYPT_SIPHASH_Ctx *CRYPT_SIPHASH_DupCtx(const CRYPT_SIPHASH_Ctx *ctx); | ||
| 117 | + | ||
| 111 | #ifdef __cplusplus | 118 | #ifdef __cplusplus |
| 112 | } | 119 | } |
| 113 | #endif | 120 | #endif |
| @@ -327,4 +327,20 @@ void CRYPT_SIPHASH_FreeCtx(CRYPT_SIPHASH_Ctx *ctx) | |||
| 327 | BSL_SAL_Free(ctx); | 327 | BSL_SAL_Free(ctx); |
| 328 | } | 328 | } |
| 329 | } | 329 | } |
| 330 | + | ||
| 331 | +CRYPT_SIPHASH_Ctx *CRYPT_SIPHASH_DupCtx(const CRYPT_SIPHASH_Ctx *ctx) | ||
| 332 | +{ | ||
| 333 | + if (ctx == NULL) { | ||
| 334 | + BSL_ERR_PUSH_ERROR(CRYPT_NULL_INPUT); | ||
| 335 | + return NULL; | ||
| 336 | + } | ||
| 337 | + | ||
| 338 | + CRYPT_SIPHASH_Ctx *newCtx = BSL_SAL_Dump(ctx, sizeof(CRYPT_SIPHASH_Ctx)); | ||
| 339 | + if (newCtx == NULL) { | ||
| 340 | + BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL); | ||
| 341 | + return NULL; | ||
| 342 | + } | ||
| 343 | + return newCtx; | ||
| 344 | +} | ||
| 345 | + | ||
| 330 | #endif /* HITLS_CRYPTO_SIPHASH */ | 346 | #endif /* HITLS_CRYPTO_SIPHASH */ |
| @@ -249,6 +249,28 @@ int32_t CRYPT_EAL_CipherGetPadding(CRYPT_EAL_CipherCtx *ctx); | |||
| 249 | */ | 249 | */ |
| 250 | int32_t CRYPT_EAL_CipherGetInfo(CRYPT_CIPHER_AlgId id, int32_t type, uint32_t *infoValue); | 250 | int32_t CRYPT_EAL_CipherGetInfo(CRYPT_CIPHER_AlgId id, int32_t type, uint32_t *infoValue); |
| 251 | 251 | ||
| 252 | +/** | ||
| 253 | + * @ingroup crypt_eal_cipher | ||
| 254 | + * @brief Copy the cipher context. | ||
| 255 | + * | ||
| 256 | + * @param to [IN] target cipher context. | ||
| 257 | + * @param from [IN] original cipher context. | ||
| 258 | + * @retval #CRYPT_SUCCESS, parameters are set successfully. | ||
| 259 | + * @retval #CRYPT_NULL_INPUT, the input parameter is NULL. | ||
| 260 | + * Other error codes see crypt_errno.h | ||
| 261 | + */ | ||
| 262 | +int32_t CRYPT_EAL_CipherCopyCtx(CRYPT_EAL_CipherCtx *to, const CRYPT_EAL_CipherCtx *from); | ||
| 263 | + | ||
| 264 | +/** | ||
| 265 | + * @ingroup crypt_eal_cipher | ||
| 266 | + * @brief Dup the cipher context. | ||
| 267 | + * | ||
| 268 | + * @param from [IN] original cipher context. | ||
| 269 | + * @retval CRYPT_EAL_CipherCtx, cipher context pointer. | ||
| 270 | + * NULL, if the operation fails. | ||
| 271 | + */ | ||
| 272 | +CRYPT_EAL_CipherCtx *CRYPT_EAL_CipherDupCtx(const CRYPT_EAL_CipherCtx *from); | ||
| 273 | + | ||
| 252 | #ifdef __cplusplus | 274 | #ifdef __cplusplus |
| 253 | } | 275 | } |
| 254 | #endif // __cplusplus | 276 | #endif // __cplusplus |
| @@ -113,6 +113,7 @@ typedef int32_t (*CRYPT_EAL_ImplProviderInit)(CRYPT_EAL_ProvMgrCtx *mgrCtx, BSL_ | |||
| 113 | #define CRYPT_EAL_IMPLCIPHER_DEINITCTX 5 | 113 | #define CRYPT_EAL_IMPLCIPHER_DEINITCTX 5 |
| 114 | #define CRYPT_EAL_IMPLCIPHER_CTRL 6 | 114 | #define CRYPT_EAL_IMPLCIPHER_CTRL 6 |
| 115 | #define CRYPT_EAL_IMPLCIPHER_FREECTX 7 | 115 | #define CRYPT_EAL_IMPLCIPHER_FREECTX 7 |
| 116 | +#define CRYPT_EAL_IMPLCIPHER_DUPCTX 8 | ||
| 116 | 117 | ||
| 117 | typedef void *(*CRYPT_EAL_ImplCipherNewCtx)(void *provCtx, int32_t algId); | 118 | typedef void *(*CRYPT_EAL_ImplCipherNewCtx)(void *provCtx, int32_t algId); |
| 118 | typedef int32_t (*CRYPT_EAL_ImplCipherInitCtx)(void *ctx, const uint8_t *key, uint32_t keyLen, | 119 | typedef int32_t (*CRYPT_EAL_ImplCipherInitCtx)(void *ctx, const uint8_t *key, uint32_t keyLen, |
| @@ -123,7 +124,7 @@ typedef int32_t (*CRYPT_EAL_ImplCipherFinal)(void *ctx, uint8_t *out, uint32_t * | |||
| 123 | typedef int32_t (*CRYPT_EAL_ImplCipherDeinitCtx)(void *ctx); | 124 | typedef int32_t (*CRYPT_EAL_ImplCipherDeinitCtx)(void *ctx); |
| 124 | typedef int32_t (*CRYPT_EAL_ImplCipherCtrl)(void *ctx, int32_t cmd, void *val, uint32_t valLen); | 125 | typedef int32_t (*CRYPT_EAL_ImplCipherCtrl)(void *ctx, int32_t cmd, void *val, uint32_t valLen); |
| 125 | typedef void (*CRYPT_EAL_ImplCipherFreeCtx)(void *ctx); | 126 | typedef void (*CRYPT_EAL_ImplCipherFreeCtx)(void *ctx); |
| 126 | - | 127 | +typedef void *(*CRYPT_EAL_ImplCipherDupCtx)(const void *ctx); |
| 127 | 128 | ||
| 128 | // CRYPT_EAL_OPERAID_KEYMGMT | 129 | // CRYPT_EAL_OPERAID_KEYMGMT |
| 129 | #define CRYPT_EAL_IMPLPKEYMGMT_NEWCTX 1 | 130 | #define CRYPT_EAL_IMPLPKEYMGMT_NEWCTX 1 |
| @@ -238,6 +239,8 @@ typedef int32_t (*CRYPT_EAL_ImplMdSqueeze)(void *ctx, uint8_t *out, uint32_t len | |||
| 238 | #define CRYPT_EAL_IMPLMAC_REINITCTX 6 | 239 | #define CRYPT_EAL_IMPLMAC_REINITCTX 6 |
| 239 | #define CRYPT_EAL_IMPLMAC_CTRL 7 | 240 | #define CRYPT_EAL_IMPLMAC_CTRL 7 |
| 240 | #define CRYPT_EAL_IMPLMAC_FREECTX 8 | 241 | #define CRYPT_EAL_IMPLMAC_FREECTX 8 |
| 242 | +#define CRYPT_EAL_IMPLMAC_SETPARAM 9 | ||
| 243 | +#define CRYPT_EAL_IMPLMAC_DUPCTX 10 | ||
| 241 | 244 | ||
| 242 | typedef void *(*CRYPT_EAL_ImplMacNewCtx)(void *provCtx, int32_t algId); | 245 | typedef void *(*CRYPT_EAL_ImplMacNewCtx)(void *provCtx, int32_t algId); |
| 243 | typedef int32_t (*CRYPT_EAL_ImplMacInit)(void *ctx, const uint8_t *key, uint32_t len, BSL_Param *param); | 246 | typedef int32_t (*CRYPT_EAL_ImplMacInit)(void *ctx, const uint8_t *key, uint32_t len, BSL_Param *param); |
| @@ -247,6 +250,7 @@ typedef int32_t (*CRYPT_EAL_ImplMacDeInitCtx)(void *ctx); | |||
| 247 | typedef int32_t (*CRYPT_EAL_ImplMacReInitCtx)(void *ctx); | 250 | typedef int32_t (*CRYPT_EAL_ImplMacReInitCtx)(void *ctx); |
| 248 | typedef int32_t (*CRYPT_EAL_ImplMacCtrl)(void *ctx, int32_t cmd, void *val, uint32_t valLen); | 251 | typedef int32_t (*CRYPT_EAL_ImplMacCtrl)(void *ctx, int32_t cmd, void *val, uint32_t valLen); |
| 249 | typedef void (*CRYPT_EAL_ImplMacFreeCtx)(void *ctx); | 252 | typedef void (*CRYPT_EAL_ImplMacFreeCtx)(void *ctx); |
| 253 | +typedef void *(*CRYPT_EAL_ImplMacDupCtx)(const void *ctx); | ||
| 250 | 254 | ||
| 251 | // CRYPT_EAL_OPERAID_KDF | 255 | // CRYPT_EAL_OPERAID_KDF |
| 252 | #define CRYPT_EAL_IMPLKDF_NEWCTX 1 | 256 | #define CRYPT_EAL_IMPLKDF_NEWCTX 1 |
| @@ -255,6 +259,7 @@ typedef void (*CRYPT_EAL_ImplMacFreeCtx)(void *ctx); | |||
| 255 | #define CRYPT_EAL_IMPLKDF_DEINITCTX 4 | 259 | #define CRYPT_EAL_IMPLKDF_DEINITCTX 4 |
| 256 | #define CRYPT_EAL_IMPLKDF_CTRL 5 // not support | 260 | #define CRYPT_EAL_IMPLKDF_CTRL 5 // not support |
| 257 | #define CRYPT_EAL_IMPLKDF_FREECTX 6 | 261 | #define CRYPT_EAL_IMPLKDF_FREECTX 6 |
| 262 | +#define CRYPT_EAL_IMPLKDF_DUPCTX 7 | ||
| 258 | 263 | ||
| 259 | typedef void *(*CRYPT_EAL_ImplKdfNewCtx)(void *provCtx, int32_t algId); | 264 | typedef void *(*CRYPT_EAL_ImplKdfNewCtx)(void *provCtx, int32_t algId); |
| 260 | typedef int32_t (*CRYPT_EAL_ImplKdfSetParam)(void *ctx, BSL_Param *param); | 265 | typedef int32_t (*CRYPT_EAL_ImplKdfSetParam)(void *ctx, BSL_Param *param); |
| @@ -262,6 +267,7 @@ typedef int32_t (*CRYPT_EAL_ImplKdfDerive)(void *ctx, uint8_t *key, uint32_t key | |||
| 262 | typedef int32_t (*CRYPT_EAL_ImplKdfDeInitCtx)(void *ctx); | 267 | typedef int32_t (*CRYPT_EAL_ImplKdfDeInitCtx)(void *ctx); |
| 263 | typedef int32_t (*CRYPT_EAL_ImplKdfCtrl)(void *ctx, int32_t cmd, void *val, uint32_t valLen); // not support | 268 | typedef int32_t (*CRYPT_EAL_ImplKdfCtrl)(void *ctx, int32_t cmd, void *val, uint32_t valLen); // not support |
| 264 | typedef void (*CRYPT_EAL_ImplKdfFreeCtx)(void *ctx); | 269 | typedef void (*CRYPT_EAL_ImplKdfFreeCtx)(void *ctx); |
| 270 | +typedef void *(*CRYPT_EAL_ImplKdfDupCtx)(const void *ctx); | ||
| 265 | 271 | ||
| 266 | // CRYPT_EAL_OPERAID_RAND | 272 | // CRYPT_EAL_OPERAID_RAND |
| 267 | #define CRYPT_EAL_IMPLRAND_DRBGNEWCTX 1 | 273 | #define CRYPT_EAL_IMPLRAND_DRBGNEWCTX 1 |
| @@ -100,6 +100,27 @@ int32_t CRYPT_EAL_KdfDeInitCtx(CRYPT_EAL_KdfCTX *ctx); | |||
| 100 | */ | 100 | */ |
| 101 | void CRYPT_EAL_KdfFreeCtx(CRYPT_EAL_KdfCTX *ctx); | 101 | void CRYPT_EAL_KdfFreeCtx(CRYPT_EAL_KdfCTX *ctx); |
| 102 | 102 | ||
| 103 | + /** | ||
| 104 | + * @ingroup crypt_eal_kdf | ||
| 105 | + * @brief Copy the context of kdf | ||
| 106 | + * Note: When using HKDF for key derivation in CRYPT_KDF_HKDF_MODE_EXTRACT mode, | ||
| 107 | + * need set the new context's extended length use CRYPT_PARAM_KDF_EXLEN. | ||
| 108 | + * @param from [IN] kdf context | ||
| 109 | + * @param to [OUT] kdf context | ||
| 110 | + * | ||
| 111 | + */ | ||
| 112 | +int32_t CRYPT_EAL_KdfCopyCtx(CRYPT_EAL_KdfCTX *to, const CRYPT_EAL_KdfCTX *from); | ||
| 113 | + | ||
| 114 | +/** | ||
| 115 | + * @ingroup crypt_eal_kdf | ||
| 116 | + * @brief Dup the kdf context. | ||
| 117 | + * | ||
| 118 | + * @param from [IN] original kdf context. | ||
| 119 | + * @retval CRYPT_EAL_KdfCTX, kdf context pointer. | ||
| 120 | + * NULL, if the operation fails. | ||
| 121 | + */ | ||
| 122 | +CRYPT_EAL_KdfCTX *CRYPT_EAL_KdfDupCtx(const CRYPT_EAL_KdfCTX *from); | ||
| 123 | + | ||
| 103 | #ifdef __cplusplus | 124 | #ifdef __cplusplus |
| 104 | } | 125 | } |
| 105 | #endif // __cplusplus | 126 | #endif // __cplusplus |
| @@ -202,6 +202,28 @@ uint32_t CRYPT_EAL_GetMacLen(const CRYPT_EAL_MacCtx *ctx); | |||
| 202 | */ | 202 | */ |
| 203 | int32_t CRYPT_EAL_MacCtrl(CRYPT_EAL_MacCtx *ctx, int32_t type, void *in, uint32_t len); | 203 | int32_t CRYPT_EAL_MacCtrl(CRYPT_EAL_MacCtx *ctx, int32_t type, void *in, uint32_t len); |
| 204 | 204 | ||
| 205 | +/** | ||
| 206 | + * @ingroup crypt_eal_mac | ||
| 207 | + * @brief Copy the MAC context. | ||
| 208 | + * | ||
| 209 | + * @param to [IN] target MAC context. | ||
| 210 | + * @param from [IN] original MAC context. | ||
| 211 | + * @retval #CRYPT_SUCCESS, parameters are set successfully. | ||
| 212 | + * @retval #CRYPT_NULL_INPUT, the input parameter is NULL. | ||
| 213 | + * Other error codes see crypt_errno.h | ||
| 214 | + */ | ||
| 215 | +int32_t CRYPT_EAL_MacCopyCtx(CRYPT_EAL_MacCtx *to, const CRYPT_EAL_MacCtx *from); | ||
| 216 | + | ||
| 217 | +/** | ||
| 218 | + * @ingroup crypt_eal_mac | ||
| 219 | + * @brief Dup the MAC context. | ||
| 220 | + * | ||
| 221 | + * @param from [IN] original MAC context. | ||
| 222 | + * @retval CRYPT_EAL_MacCtx, MAC context pointer. | ||
| 223 | + * NULL, if the operation fails. | ||
| 224 | + */ | ||
| 225 | +CRYPT_EAL_MacCtx *CRYPT_EAL_MacDupCtx(const CRYPT_EAL_MacCtx *from); | ||
| 226 | + | ||
| 205 | #ifdef __cplusplus | 227 | #ifdef __cplusplus |
| 206 | } // end extern "C" | 228 | } // end extern "C" |
| 207 | #endif | 229 | #endif |
| @@ -91,7 +91,7 @@ int32_t CRYPT_EAL_MdCopyCtx(CRYPT_EAL_MdCTX *to, const CRYPT_EAL_MdCTX *from); | |||
| 91 | 91 | ||
| 92 | /** | 92 | /** |
| 93 | * @ingroup crypt_eal_md | 93 | * @ingroup crypt_eal_md |
| 94 | - * @brief Copy the MD context. | 94 | + * @brief Dup the MD context. |
| 95 | * | 95 | * |
| 96 | * Note that need to call the CRYPT_EAL_MdFreeCtx interface to release the memory after the duplication is complete. | 96 | * Note that need to call the CRYPT_EAL_MdFreeCtx interface to release the memory after the duplication is complete. |
| 97 | * | 97 | * |
| @@ -158,7 +158,7 @@ int32_t CRYPT_EAL_PkeyCopyCtx(CRYPT_EAL_PkeyCtx *to, const CRYPT_EAL_PkeyCtx *fr | |||
| 158 | 158 | ||
| 159 | /** | 159 | /** |
| 160 | * @ingroup crypt_eal_pkey | 160 | * @ingroup crypt_eal_pkey |
| 161 | - * @brief Copy the Pkey context. | 161 | + * @brief Dup the Pkey context. |
| 162 | * After the duplication is complete, call the CRYPT_EAL_PkeyFreeCtx interface to release the memory. | 162 | * After the duplication is complete, call the CRYPT_EAL_PkeyFreeCtx interface to release the memory. |
| 163 | * | 163 | * |
| 164 | * @param ctx [IN] Source Pkey context | 164 | * @param ctx [IN] Source Pkey context |
| @@ -304,4 +304,40 @@ CRYPT_EAL_PkeyCtx *TestPkeyNewCtx( | |||
| 304 | return CRYPT_EAL_PkeyNewCtx(id); | 304 | return CRYPT_EAL_PkeyNewCtx(id); |
| 305 | #endif | 305 | #endif |
| 306 | } | 306 | } |
| 307 | -#endif | 307 | +#endif |
| 308 | + | ||
| 309 | +static volatile uint32_t g_malloc_called_idx = 0; | ||
| 310 | +static volatile uint32_t g_malloc_failed_idx = 0; | ||
| 311 | +static volatile bool g_malloc_fail_enabled = true; | ||
| 312 | + | ||
| 313 | +void *STUB_BSL_SAL_Malloc(uint32_t size) | ||
| 314 | +{ | ||
| 315 | + uint32_t current_call_index = g_malloc_called_idx; | ||
| 316 | + g_malloc_called_idx = current_call_index + 1; | ||
| 317 | + | ||
| 318 | + if (g_malloc_fail_enabled && current_call_index == g_malloc_failed_idx) { | ||
| 319 | + return NULL; | ||
| 320 | + } | ||
| 321 | + | ||
| 322 | + return malloc(size); | ||
| 323 | +} | ||
| 324 | + | ||
| 325 | +void STUB_ResetMallocCount(void) | ||
| 326 | +{ | ||
| 327 | + g_malloc_called_idx = 0; | ||
| 328 | +} | ||
| 329 | + | ||
| 330 | +void STUB_SetMallocFailIndex(uint32_t failIdx) | ||
| 331 | +{ | ||
| 332 | + g_malloc_failed_idx = failIdx; | ||
| 333 | +} | ||
| 334 | + | ||
| 335 | +uint32_t STUB_GetMallocCallCount(void) | ||
| 336 | +{ | ||
| 337 | + return g_malloc_called_idx; | ||
| 338 | +} | ||
| 339 | + | ||
| 340 | +void STUB_EnableMallocFail(bool enable) | ||
| 341 | +{ | ||
| 342 | + g_malloc_fail_enabled = enable; | ||
| 343 | +} | ||
| @@ -161,6 +161,55 @@ void PrintLog(FILE *logFile); | |||
| 161 | 161 | ||
| 162 | void PrintDiff(const uint8_t *str1, uint32_t size1, const uint8_t *str2, uint32_t size2); | 162 | void PrintDiff(const uint8_t *str1, uint32_t size1, const uint8_t *str2, uint32_t size2); |
| 163 | 163 | ||
| 164 | +/** | ||
| 165 | + * @brief Stub function for BSL_SAL_Malloc to simulate malloc failures | ||
| 166 | + * | ||
| 167 | + * This function is used in memory leak tests to trigger malloc failures at specific points. | ||
| 168 | + * It tracks the number of malloc calls and returns NULL when the call count matches | ||
| 169 | + * the configured failure index. | ||
| 170 | + * | ||
| 171 | + * @param size Size to allocate | ||
| 172 | + * @return Allocated memory pointer, or NULL if simulating a failure | ||
| 173 | + */ | ||
| 174 | +void *STUB_BSL_SAL_Malloc(uint32_t size); | ||
| 175 | + | ||
| 176 | +/** | ||
| 177 | + * @brief Reset malloc stub counters | ||
| 178 | + * | ||
| 179 | + * Resets the internal counters used by STUB_BSL_SAL_Malloc. Should be called | ||
| 180 | + * before each test case to ensure clean state. | ||
| 181 | + */ | ||
| 182 | +void STUB_ResetMallocCount(void); | ||
| 183 | + | ||
| 184 | +/** | ||
| 185 | + * @brief Set which malloc call should fail | ||
| 186 | + * | ||
| 187 | + * Configures STUB_BSL_SAL_Malloc to fail on a specific call number. | ||
| 188 | + * For example, SetMallocFailIndex(3) will cause the 3rd malloc call to return NULL. | ||
| 189 | + * | ||
| 190 | + * @param failIdx The index (0-based) of the malloc call that should fail | ||
| 191 | + */ | ||
| 192 | +void STUB_SetMallocFailIndex(uint32_t failIdx); | ||
| 193 | + | ||
| 194 | +/** | ||
| 195 | + * @brief Get current malloc call count | ||
| 196 | + * | ||
| 197 | + * Returns the number of malloc calls made since the last reset. | ||
| 198 | + * | ||
| 199 | + * @return Current call count | ||
| 200 | + */ | ||
| 201 | +uint32_t STUB_GetMallocCallCount(void); | ||
| 202 | + | ||
| 203 | +/** | ||
| 204 | + * @brief Enable or disable malloc failure injection | ||
| 205 | + * | ||
| 206 | + * When disabled, STUB_BSL_SAL_Malloc will never return NULL (acts like normal malloc). | ||
| 207 | + * This is useful for the "probe" phase to count total malloc calls. | ||
| 208 | + * | ||
| 209 | + * @param enable true to enable failure injection, false to disable | ||
| 210 | + */ | ||
| 211 | +void STUB_EnableMallocFail(bool enable); | ||
| 212 | + | ||
| 164 | #ifdef __cplusplus | 213 | #ifdef __cplusplus |
| 165 | } | 214 | } |
| 166 | #endif | 215 | #endif |
| @@ -26,6 +26,7 @@ | |||
| 26 | #include "crypt_aes.h" | 26 | #include "crypt_aes.h" |
| 27 | #include "crypt_eal_cipher.h" | 27 | #include "crypt_eal_cipher.h" |
| 28 | #include "eal_cipher_local.h" | 28 | #include "eal_cipher_local.h" |
| 29 | +#include "stub_replace.h" | ||
| 29 | 30 | ||
| 30 | #define DATA_LEN 16 | 31 | #define DATA_LEN 16 |
| 31 | #define DATA_MAX_LEN 1024 | 32 | #define DATA_MAX_LEN 1024 |
| @@ -285,3 +286,327 @@ EXIT: | |||
| 285 | CRYPT_EAL_CipherFreeCtx(ctx); | 286 | CRYPT_EAL_CipherFreeCtx(ctx); |
| 286 | } | 287 | } |
| 287 | /* END_CASE */ | 288 | /* END_CASE */ |
| 289 | + | ||
| 290 | +/* BEGIN_CASE */ | ||
| 291 | +void SDV_CRYPTO_CIPHER_COPY_CTX_API_TC001(int algId, int isProvider) | ||
| 292 | +{ | ||
| 293 | + TestMemInit(); | ||
| 294 | + CRYPT_EAL_CipherCtx *ctxA = TestCipherNewCtx(NULL, algId, "provider=default", isProvider); | ||
| 295 | + ASSERT_TRUE(ctxA != NULL); | ||
| 296 | + | ||
| 297 | + CRYPT_EAL_CipherCtx *ctxB = TestCipherNewCtx(NULL, algId, "provider=default", isProvider); | ||
| 298 | + ASSERT_TRUE(ctxB != NULL); | ||
| 299 | + | ||
| 300 | + CRYPT_EAL_CipherCtx ctxC = { 0 }; | ||
| 301 | + | ||
| 302 | + ASSERT_EQ(CRYPT_EAL_CipherCopyCtx(NULL, ctxA), CRYPT_NULL_INPUT); | ||
| 303 | + ASSERT_EQ(CRYPT_EAL_CipherCopyCtx(ctxB, NULL), CRYPT_NULL_INPUT); | ||
| 304 | + // Copy failed because ctxC lacks a method. | ||
| 305 | + ASSERT_EQ(CRYPT_EAL_CipherCopyCtx(ctxB, &ctxC), CRYPT_NULL_INPUT); | ||
| 306 | + | ||
| 307 | + CRYPT_EAL_CipherCtx *ctxD = CRYPT_EAL_CipherDupCtx(NULL); | ||
| 308 | + ASSERT_TRUE(ctxD == NULL); | ||
| 309 | + ctxD = CRYPT_EAL_CipherDupCtx(&ctxC); | ||
| 310 | + ASSERT_TRUE(ctxD == NULL); | ||
| 311 | + ctxD = CRYPT_EAL_CipherDupCtx(ctxA); | ||
| 312 | + ASSERT_TRUE(ctxD != NULL); | ||
| 313 | + | ||
| 314 | + // A directly created context can also be used as the destination for copying. | ||
| 315 | + ASSERT_EQ(CRYPT_EAL_CipherCopyCtx(&ctxC, ctxA), CRYPT_SUCCESS); | ||
| 316 | + ctxC.method->freeCtx(ctxC.ctx); | ||
| 317 | + BSL_SAL_Free(ctxC.method); | ||
| 318 | +EXIT: | ||
| 319 | + CRYPT_EAL_CipherFreeCtx(ctxA); | ||
| 320 | + CRYPT_EAL_CipherFreeCtx(ctxB); | ||
| 321 | + CRYPT_EAL_CipherFreeCtx(ctxD); | ||
| 322 | +} | ||
| 323 | +/* END_CASE */ | ||
| 324 | + | ||
| 325 | +static int32_t TestCipherUpdate(CRYPT_EAL_CipherCtx *ctx, uint8_t *in, uint32_t inLen, uint8_t *out, uint32_t *outLen) | ||
| 326 | +{ | ||
| 327 | + uint32_t tmpLen = *outLen; | ||
| 328 | + int32_t ret = CRYPT_SUCCESS; | ||
| 329 | + uint32_t totalLen = 0; | ||
| 330 | + if (inLen > 0) { | ||
| 331 | + ret = CRYPT_EAL_CipherUpdate(ctx, in, inLen, out, &tmpLen); | ||
| 332 | + ASSERT_EQ(ret, CRYPT_SUCCESS); | ||
| 333 | + totalLen = tmpLen; | ||
| 334 | + } | ||
| 335 | + | ||
| 336 | + // Some algorithms do not support final. | ||
| 337 | + if (ctx->id != CRYPT_CIPHER_AES128_CCM && ctx->id != CRYPT_CIPHER_AES192_CCM && | ||
| 338 | + ctx->id != CRYPT_CIPHER_AES256_CCM && ctx->id != CRYPT_CIPHER_AES128_GCM && | ||
| 339 | + ctx->id != CRYPT_CIPHER_AES192_GCM && ctx->id != CRYPT_CIPHER_AES256_GCM && | ||
| 340 | + ctx->id != CRYPT_CIPHER_SM4_GCM && | ||
| 341 | + ctx->id != CRYPT_CIPHER_CHACHA20_POLY1305) { | ||
| 342 | + tmpLen = *outLen - totalLen; | ||
| 343 | + ret = CRYPT_EAL_CipherFinal(ctx, out + totalLen, &tmpLen); | ||
| 344 | + ASSERT_EQ(ret, CRYPT_SUCCESS); | ||
| 345 | + totalLen += tmpLen; | ||
| 346 | + } | ||
| 347 | + *outLen = totalLen; | ||
| 348 | +EXIT: | ||
| 349 | + return ret; | ||
| 350 | +} | ||
| 351 | + | ||
| 352 | +static int32_t TestCipherSetParam(CRYPT_EAL_CipherCtx *ctx, Hex *msg, Hex *tag, Hex *aad, int padType) | ||
| 353 | +{ | ||
| 354 | + int32_t algId = ctx->id; | ||
| 355 | + int32_t ret = CRYPT_SUCCESS; | ||
| 356 | + if (tag->len > 0 && algId != CRYPT_CIPHER_CHACHA20_POLY1305) { | ||
| 357 | + uint32_t tagLen = tag->len; | ||
| 358 | + ret = CRYPT_EAL_CipherCtrl(ctx, CRYPT_CTRL_SET_TAGLEN, &tagLen, sizeof(tagLen)); | ||
| 359 | + ASSERT_EQ(ret, CRYPT_SUCCESS); | ||
| 360 | + } | ||
| 361 | + if (algId == CRYPT_CIPHER_AES128_CCM || algId == CRYPT_CIPHER_AES192_CCM || algId == CRYPT_CIPHER_AES256_CCM) { | ||
| 362 | + uint64_t inLen = msg->len; | ||
| 363 | + ret = CRYPT_EAL_CipherCtrl(ctx, CRYPT_CTRL_SET_MSGLEN, &inLen, sizeof(inLen)); | ||
| 364 | + ASSERT_EQ(ret, CRYPT_SUCCESS); | ||
| 365 | + } | ||
| 366 | + if (aad->len > 0) { | ||
| 367 | + ret = CRYPT_EAL_CipherCtrl(ctx, CRYPT_CTRL_SET_AAD, aad->x, aad->len); | ||
| 368 | + ASSERT_EQ(ret, CRYPT_SUCCESS); | ||
| 369 | + } | ||
| 370 | + if (padType > 0) { | ||
| 371 | + ret = CRYPT_EAL_CipherSetPadding(ctx, (int32_t)padType); | ||
| 372 | + ASSERT_TRUE(ret == CRYPT_SUCCESS); | ||
| 373 | + } | ||
| 374 | +EXIT: | ||
| 375 | + return ret; | ||
| 376 | +} | ||
| 377 | + | ||
| 378 | +static void TestForCopyCtx(int32_t algId, int isProvider) | ||
| 379 | +{ | ||
| 380 | + TestMemInit(); | ||
| 381 | + uint8_t key[DATA_MAX_LEN]; | ||
| 382 | + uint8_t iv[DATA_MAX_LEN]; | ||
| 383 | + uint32_t keyLen = 0; | ||
| 384 | + uint32_t ivLen = 0; | ||
| 385 | + CRYPT_EAL_CipherCtx ctxA = {0}; | ||
| 386 | + CRYPT_EAL_CipherCtx *ctxB = NULL; | ||
| 387 | + CRYPT_EAL_CipherCtx *ctxC = NULL; | ||
| 388 | + | ||
| 389 | + ASSERT_EQ(CRYPT_EAL_CipherGetInfo(algId, CRYPT_INFO_KEY_LEN, &keyLen), CRYPT_SUCCESS); | ||
| 390 | + ASSERT_EQ(CRYPT_EAL_CipherGetInfo(algId, CRYPT_INFO_IV_LEN, &ivLen), CRYPT_SUCCESS); | ||
| 391 | + | ||
| 392 | + CRYPT_EAL_CipherCtx *srcCtx = TestCipherNewCtx(NULL, algId, "provider=default", isProvider); | ||
| 393 | + ASSERT_TRUE(srcCtx != NULL); | ||
| 394 | + ASSERT_EQ(CRYPT_EAL_CipherInit(srcCtx, key, keyLen, iv, ivLen, true), CRYPT_SUCCESS); | ||
| 395 | + | ||
| 396 | + /* Set key and IV in srcCtx, then copy it to ctxA and ctxB. */ | ||
| 397 | + ctxB = TestCipherNewCtx(NULL, algId, "provider=default", isProvider); | ||
| 398 | + ASSERT_TRUE(ctxB != NULL); | ||
| 399 | + | ||
| 400 | + ASSERT_EQ(CRYPT_EAL_CipherCopyCtx(&ctxA, srcCtx), CRYPT_SUCCESS); | ||
| 401 | + // Create ctxC from srcCtx. | ||
| 402 | + ctxC = CRYPT_EAL_CipherDupCtx(srcCtx); | ||
| 403 | + ASSERT_TRUE(ctxC != NULL); | ||
| 404 | + | ||
| 405 | + CRYPT_EAL_CipherDeinit(srcCtx); | ||
| 406 | + ASSERT_EQ(CRYPT_EAL_CipherInit(srcCtx, key, keyLen, iv, ivLen, false), CRYPT_SUCCESS); | ||
| 407 | + ASSERT_EQ(CRYPT_EAL_CipherCopyCtx(ctxB, srcCtx), CRYPT_SUCCESS); | ||
| 408 | + | ||
| 409 | + uint32_t encLen = DATA_MAX_LEN; | ||
| 410 | + uint32_t dupEncLen = DATA_MAX_LEN; | ||
| 411 | + uint32_t decLen = DATA_MAX_LEN; | ||
| 412 | + uint8_t inTmp[DATA_MAX_LEN - 16]; | ||
| 413 | + uint8_t encTmp[DATA_MAX_LEN]; | ||
| 414 | + uint8_t dupEncTmp[DATA_MAX_LEN]; | ||
| 415 | + uint8_t decTmp[DATA_MAX_LEN]; | ||
| 416 | + /* Use ctxA for encryption and ctxB for decryption, | ||
| 417 | + Test that the copied contexts function identically to the source context. */ | ||
| 418 | + ASSERT_EQ(TestCipherUpdate(&ctxA, inTmp, sizeof(inTmp), encTmp, &encLen), CRYPT_SUCCESS); | ||
| 419 | + ASSERT_EQ(TestCipherUpdate(ctxB, encTmp, encLen, decTmp, &decLen), CRYPT_SUCCESS); | ||
| 420 | + ASSERT_COMPARE("compare:", inTmp, sizeof(inTmp), decTmp, decLen); | ||
| 421 | + | ||
| 422 | + /* Use ctxC for encryption*/ | ||
| 423 | + ASSERT_EQ(TestCipherUpdate(ctxC, inTmp, sizeof(inTmp), dupEncTmp, &dupEncLen), CRYPT_SUCCESS); | ||
| 424 | + ASSERT_COMPARE("compare:", dupEncTmp, dupEncLen, encTmp, encLen); | ||
| 425 | + | ||
| 426 | +EXIT: | ||
| 427 | + ctxA.method->freeCtx(ctxA.ctx); | ||
| 428 | + BSL_SAL_Free(ctxA.method); | ||
| 429 | + CRYPT_EAL_CipherFreeCtx(ctxB); | ||
| 430 | + CRYPT_EAL_CipherFreeCtx(ctxC); | ||
| 431 | + CRYPT_EAL_CipherFreeCtx(srcCtx); | ||
| 432 | +} | ||
| 433 | + | ||
| 434 | +static const int32_t g_algidList[] = { | ||
| 435 | + CRYPT_CIPHER_AES128_CBC, CRYPT_CIPHER_AES192_CBC, CRYPT_CIPHER_AES256_CBC, | ||
| 436 | + CRYPT_CIPHER_AES128_CTR, CRYPT_CIPHER_AES192_CTR, CRYPT_CIPHER_AES256_CTR, | ||
| 437 | + CRYPT_CIPHER_AES128_ECB, CRYPT_CIPHER_AES192_ECB, CRYPT_CIPHER_AES256_ECB, | ||
| 438 | + CRYPT_CIPHER_AES128_XTS, CRYPT_CIPHER_AES256_XTS, | ||
| 439 | + CRYPT_CIPHER_AES128_CCM, CRYPT_CIPHER_AES192_CCM, CRYPT_CIPHER_AES256_CCM, | ||
| 440 | + CRYPT_CIPHER_AES128_GCM, CRYPT_CIPHER_AES192_GCM, CRYPT_CIPHER_AES256_GCM, | ||
| 441 | + CRYPT_CIPHER_AES128_CFB, CRYPT_CIPHER_AES192_CFB, CRYPT_CIPHER_AES256_CFB, | ||
| 442 | + CRYPT_CIPHER_AES128_OFB, CRYPT_CIPHER_AES192_OFB, CRYPT_CIPHER_AES256_OFB, | ||
| 443 | + | ||
| 444 | + CRYPT_CIPHER_AES128_WRAP_NOPAD, CRYPT_CIPHER_AES192_WRAP_NOPAD, CRYPT_CIPHER_AES256_WRAP_NOPAD, | ||
| 445 | + CRYPT_CIPHER_AES128_WRAP_PAD, CRYPT_CIPHER_AES192_WRAP_PAD, CRYPT_CIPHER_AES256_WRAP_PAD, | ||
| 446 | + | ||
| 447 | + CRYPT_CIPHER_SM4_XTS, CRYPT_CIPHER_SM4_CBC, CRYPT_CIPHER_SM4_ECB, CRYPT_CIPHER_SM4_CTR, | ||
| 448 | + CRYPT_CIPHER_SM4_GCM, CRYPT_CIPHER_SM4_CFB, CRYPT_CIPHER_SM4_OFB, | ||
| 449 | + | ||
| 450 | + CRYPT_CIPHER_CHACHA20_POLY1305 | ||
| 451 | +}; | ||
| 452 | + | ||
| 453 | +/* BEGIN_CASE */ | ||
| 454 | +void SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC001(int isProvider) | ||
| 455 | +{ | ||
| 456 | + for (size_t i = 0; i < sizeof(g_algidList) / g_algidList[0]; i++) { | ||
| 457 | + TestForCopyCtx(g_algidList[i], isProvider); | ||
| 458 | + } | ||
| 459 | +} | ||
| 460 | +/* END_CASE */ | ||
| 461 | + | ||
| 462 | +/* BEGIN_CASE */ | ||
| 463 | +void SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002(int algId, Hex *key, Hex *iv, Hex *in, Hex *out, Hex *tag, Hex *aad, | ||
| 464 | + int isProvider, int padType) | ||
| 465 | +{ | ||
| 466 | + if (IsAesAlgDisabled(algId)) { | ||
| 467 | + SKIP_TEST(); | ||
| 468 | + } | ||
| 469 | + TestMemInit(); | ||
| 470 | + uint8_t encTmp[DATA_MAX_LEN]; | ||
| 471 | + uint8_t decTmp[DATA_MAX_LEN]; | ||
| 472 | + uint32_t encLen = DATA_MAX_LEN; | ||
| 473 | + uint32_t decLen = DATA_MAX_LEN; | ||
| 474 | + uint8_t tagResult[32]; | ||
| 475 | + | ||
| 476 | + CRYPT_EAL_CipherCtx *ctxA = NULL; | ||
| 477 | + CRYPT_EAL_CipherCtx *ctxB = NULL; | ||
| 478 | + CRYPT_EAL_CipherCtx *ctxC = NULL; | ||
| 479 | + CRYPT_EAL_CipherCtx *srcCtx = TestCipherNewCtx(NULL, algId, "provider=default", isProvider); | ||
| 480 | + ASSERT_TRUE(srcCtx != NULL); | ||
| 481 | + ctxA = TestCipherNewCtx(NULL, algId, "provider=default", isProvider); | ||
| 482 | + ASSERT_TRUE(ctxA != NULL); | ||
| 483 | + ctxB = TestCipherNewCtx(NULL, algId, "provider=default", isProvider); | ||
| 484 | + ASSERT_TRUE(ctxB != NULL); | ||
| 485 | + ASSERT_EQ(CRYPT_EAL_CipherInit(srcCtx, key->x, key->len, iv->x, iv->len, true), CRYPT_SUCCESS); | ||
| 486 | + ASSERT_EQ(TestCipherSetParam(srcCtx, in, tag, aad, padType), CRYPT_SUCCESS); | ||
| 487 | + | ||
| 488 | + // Use the copied context to encryption and then decryption. | ||
| 489 | + ASSERT_EQ(CRYPT_EAL_CipherCopyCtx(ctxA, srcCtx), CRYPT_SUCCESS); | ||
| 490 | + ASSERT_EQ(TestCipherUpdate(ctxA, in->x, in->len, encTmp, &encLen), CRYPT_SUCCESS); | ||
| 491 | + ASSERT_COMPARE("compare1:", encTmp, encLen, out->x, out->len); | ||
| 492 | + if (tag->len > 0) { | ||
| 493 | + ASSERT_EQ(CRYPT_EAL_CipherCtrl(ctxA, CRYPT_CTRL_GET_TAG, (uint8_t *)tagResult, tag->len), CRYPT_SUCCESS); | ||
| 494 | + ASSERT_COMPARE("tag1:", tagResult, tag->len, tag->x, tag->len); | ||
| 495 | + } | ||
| 496 | + | ||
| 497 | + CRYPT_EAL_CipherDeinit(ctxA); | ||
| 498 | + ASSERT_EQ(CRYPT_EAL_CipherInit(ctxA, key->x, key->len, iv->x, iv->len, false), CRYPT_SUCCESS); | ||
| 499 | + ASSERT_EQ(TestCipherSetParam(ctxA, in, tag, aad, padType), CRYPT_SUCCESS); | ||
| 500 | + ASSERT_EQ(TestCipherUpdate(ctxA, encTmp, encLen, decTmp, &decLen), CRYPT_SUCCESS); | ||
| 501 | + ASSERT_COMPARE("compare2:", decTmp, decLen, in->x, in->len); | ||
| 502 | + if (tag->len > 0) { | ||
| 503 | + ASSERT_EQ(CRYPT_EAL_CipherCtrl(ctxA, CRYPT_CTRL_GET_TAG, (uint8_t *)tagResult, tag->len), CRYPT_SUCCESS); | ||
| 504 | + ASSERT_COMPARE("tag2:", tagResult, tag->len, tag->x, tag->len); | ||
| 505 | + } | ||
| 506 | + CRYPT_EAL_CipherFreeCtx(ctxA); | ||
| 507 | + ctxA = NULL; | ||
| 508 | + | ||
| 509 | + // Create a new ctxC from srcCtx, use ctxC for encryption, and verify functional correctness. | ||
| 510 | + ctxC = CRYPT_EAL_CipherDupCtx(srcCtx); | ||
| 511 | + ASSERT_TRUE(ctxC != NULL); | ||
| 512 | + ASSERT_EQ(TestCipherUpdate(ctxC, in->x, in->len, encTmp, &encLen), CRYPT_SUCCESS); | ||
| 513 | + ASSERT_COMPARE("compare3:", encTmp, encLen, out->x, out->len); | ||
| 514 | + if (tag->len > 0) { | ||
| 515 | + ASSERT_EQ(CRYPT_EAL_CipherCtrl(ctxC, CRYPT_CTRL_GET_TAG, (uint8_t *)tagResult, tag->len), CRYPT_SUCCESS); | ||
| 516 | + ASSERT_COMPARE("tag3:", tagResult, tag->len, tag->x, tag->len); | ||
| 517 | + } | ||
| 518 | + | ||
| 519 | + uint32_t totalLen = DATA_MAX_LEN; | ||
| 520 | + uint32_t blockLen = (in->len >= 16) ? 16 : in->len; | ||
| 521 | + if ((algId >= CRYPT_CIPHER_AES128_WRAP_NOPAD && algId <= CRYPT_CIPHER_AES256_WRAP_PAD) || | ||
| 522 | + algId == CRYPT_CIPHER_SM4_XTS) { | ||
| 523 | + blockLen = in->len; | ||
| 524 | + } | ||
| 525 | + // After encrypt a portion of data, copy the ctx and encrypt of the remaining data, then compare the results. | ||
| 526 | + ASSERT_EQ(CRYPT_EAL_CipherUpdate(srcCtx, in->x, blockLen, encTmp, &totalLen), CRYPT_SUCCESS); | ||
| 527 | + encLen = DATA_MAX_LEN - totalLen; | ||
| 528 | + ASSERT_EQ(CRYPT_EAL_CipherCopyCtx(ctxB, srcCtx), CRYPT_SUCCESS); | ||
| 529 | + ASSERT_EQ(TestCipherUpdate(ctxB, in->x + blockLen, in->len - blockLen, encTmp + totalLen, &encLen), CRYPT_SUCCESS); | ||
| 530 | + totalLen += encLen; | ||
| 531 | + ASSERT_COMPARE("compare4:", encTmp, totalLen, out->x, out->len); | ||
| 532 | + if (tag->len > 0) { | ||
| 533 | + ASSERT_EQ(CRYPT_EAL_CipherCtrl(ctxB, CRYPT_CTRL_GET_TAG, (uint8_t *)tagResult, tag->len), CRYPT_SUCCESS); | ||
| 534 | + ASSERT_COMPARE("tag4:", tagResult, tag->len, tag->x, tag->len); | ||
| 535 | + } | ||
| 536 | + | ||
| 537 | +EXIT: | ||
| 538 | + CRYPT_EAL_CipherFreeCtx(ctxA); | ||
| 539 | + CRYPT_EAL_CipherFreeCtx(srcCtx); | ||
| 540 | + CRYPT_EAL_CipherFreeCtx(ctxB); | ||
| 541 | + CRYPT_EAL_CipherFreeCtx(ctxC); | ||
| 542 | +} | ||
| 543 | +/* END_CASE */ | ||
| 544 | + | ||
| 545 | +static int32_t TestCipherCopyCtxMemCheck(int32_t algId, int isProvider) | ||
| 546 | +{ | ||
| 547 | + uint8_t key[DATA_MAX_LEN]; | ||
| 548 | + uint8_t iv[DATA_MAX_LEN]; | ||
| 549 | + uint32_t keyLen = 0; | ||
| 550 | + uint32_t ivLen = 0; | ||
| 551 | + CRYPT_EAL_CipherCtx *ctxA = NULL; | ||
| 552 | + CRYPT_EAL_CipherCtx *ctxB = NULL; | ||
| 553 | + | ||
| 554 | + ASSERT_EQ(CRYPT_EAL_CipherGetInfo(algId, CRYPT_INFO_KEY_LEN, &keyLen), CRYPT_SUCCESS); | ||
| 555 | + ASSERT_EQ(CRYPT_EAL_CipherGetInfo(algId, CRYPT_INFO_IV_LEN, &ivLen), CRYPT_SUCCESS); | ||
| 556 | + | ||
| 557 | + CRYPT_EAL_CipherCtx *srcCtx = TestCipherNewCtx(NULL, algId, "provider=default", isProvider); | ||
| 558 | + /* Set key and IV in srcCtx */ | ||
| 559 | + int32_t ret = CRYPT_EAL_CipherInit(srcCtx, key, keyLen, iv, ivLen, true); | ||
| 560 | + if (ret != CRYPT_SUCCESS) { | ||
| 561 | + goto EXIT; | ||
| 562 | + } | ||
| 563 | + | ||
| 564 | + ctxA = TestCipherNewCtx(NULL, algId, "provider=default", isProvider); | ||
| 565 | + ret = CRYPT_EAL_CipherCopyCtx(ctxA, srcCtx); | ||
| 566 | + if (ret != CRYPT_SUCCESS) { | ||
| 567 | + goto EXIT; | ||
| 568 | + } | ||
| 569 | + ctxB = CRYPT_EAL_CipherDupCtx(srcCtx); | ||
| 570 | + if (ctxB == NULL) { | ||
| 571 | + ret = CRYPT_MEM_ALLOC_FAIL; | ||
| 572 | + goto EXIT; | ||
| 573 | + } | ||
| 574 | + | ||
| 575 | +EXIT: | ||
| 576 | + CRYPT_EAL_CipherFreeCtx(ctxA); | ||
| 577 | + CRYPT_EAL_CipherFreeCtx(ctxB); | ||
| 578 | + CRYPT_EAL_CipherFreeCtx(srcCtx); | ||
| 579 | + return ret; | ||
| 580 | +} | ||
| 581 | + | ||
| 582 | +/** | ||
| 583 | + * @test SDV_CRYPTO_CIPHER_COPY_CTX_STUB_TC001 | ||
| 584 | + * title 1. Test the cipher copy context with stub malloc fail | ||
| 585 | + * | ||
| 586 | + */ | ||
| 587 | +/* BEGIN_CASE */ | ||
| 588 | +void SDV_CRYPTO_CIPHER_COPY_CTX_STUB_TC001(int isProvider) | ||
| 589 | +{ | ||
| 590 | + TestMemInit(); | ||
| 591 | + uint32_t totalMallocCount = 0; | ||
| 592 | + STUB_Init(); | ||
| 593 | + FuncStubInfo tmpRpInfo = {0}; | ||
| 594 | + ASSERT_TRUE(STUB_Replace(&tmpRpInfo, BSL_SAL_Malloc, STUB_BSL_SAL_Malloc) == 0); | ||
| 595 | + for (uint32_t i = 0; i < sizeof(g_algidList) / g_algidList[0]; i++) { | ||
| 596 | + STUB_EnableMallocFail(false); | ||
| 597 | + STUB_ResetMallocCount(); | ||
| 598 | + ASSERT_EQ(TestCipherCopyCtxMemCheck(g_algidList[i], isProvider), CRYPT_SUCCESS); | ||
| 599 | + totalMallocCount = STUB_GetMallocCallCount(); | ||
| 600 | + | ||
| 601 | + STUB_EnableMallocFail(true); | ||
| 602 | + for (uint32_t j = 0; j < totalMallocCount; j++) | ||
| 603 | + { | ||
| 604 | + STUB_ResetMallocCount(); | ||
| 605 | + STUB_SetMallocFailIndex(j); | ||
| 606 | + ASSERT_NE(TestCipherCopyCtxMemCheck(g_algidList[i], isProvider), CRYPT_SUCCESS); | ||
| 607 | + } | ||
| 608 | + } | ||
| 609 | +EXIT: | ||
| 610 | + STUB_Reset(&tmpRpInfo); | ||
| 611 | +} | ||
| 612 | +/* END_CASE */ | ||
| @@ -207,3 +207,150 @@ SDV_CRYPTO_EAL_CIPHER_FUNC_TC001:CRYPT_PADDING_PKCS7:CRYPT_CIPHER_SM4_CBC:"2b7e1 | |||
| 207 | 207 | ||
| 208 | SDV_CRYPTO_EAL_CIPHER_FUNC_TC001 #9 | 208 | SDV_CRYPTO_EAL_CIPHER_FUNC_TC001 #9 |
| 209 | SDV_CRYPTO_EAL_CIPHER_FUNC_TC001:CRYPT_PADDING_PKCS7:CRYPT_CIPHER_SM4_ECB:"2b7e151628aed2a6abf7158809cf4f3c":"000102030405060708090A0B0C0D0E0F":32:480:CRYPT_SUCCESS | 209 | SDV_CRYPTO_EAL_CIPHER_FUNC_TC001:CRYPT_PADDING_PKCS7:CRYPT_CIPHER_SM4_ECB:"2b7e151628aed2a6abf7158809cf4f3c":"000102030405060708090A0B0C0D0E0F":32:480:CRYPT_SUCCESS |
| 210 | + | ||
| 211 | +SDV_CRYPTO_CIPHER_COPY_CTX_API_TC001 CRYPT_CIPHER_AES128_CBC | ||
| 212 | +SDV_CRYPTO_CIPHER_COPY_CTX_API_TC001:CRYPT_CIPHER_AES128_CBC:0 | ||
| 213 | + | ||
| 214 | +SDV_CRYPTO_CIPHER_COPY_CTX_API_TC001 CRYPT_CIPHER_AES256_OFB | ||
| 215 | +SDV_CRYPTO_CIPHER_COPY_CTX_API_TC001:CRYPT_CIPHER_AES256_OFB:1 | ||
| 216 | + | ||
| 217 | +SDV_CRYPTO_CIPHER_COPY_CTX_API_TC001 CRYPT_CIPHER_SM4_CTR | ||
| 218 | +SDV_CRYPTO_CIPHER_COPY_CTX_API_TC001:CRYPT_CIPHER_SM4_CTR:0 | ||
| 219 | + | ||
| 220 | +SDV_CRYPTO_CIPHER_COPY_CTX_API_TC001 CRYPT_CIPHER_CHACHA20_POLY1305 | ||
| 221 | +SDV_CRYPTO_CIPHER_COPY_CTX_API_TC001:CRYPT_CIPHER_CHACHA20_POLY1305:0 | ||
| 222 | + | ||
| 223 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC001 | ||
| 224 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC001:0 | ||
| 225 | + | ||
| 226 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC001 Provider | ||
| 227 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC001:1 | ||
| 228 | + | ||
| 229 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES128_CBC | ||
| 230 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES128_CBC:"3348aa51e9a45c2dbe33ccc47f96e8de":"19153c673160df2b1d38c28060e59b96":"9b7cee827a26575afdbb7c7a329f887238052e3601a7917456ba61251c214763d5e1847a6ad5d54127a399ab07ee3599":"d5aed6c9622ec451a15db12819952b6752501cf05cdbf8cda34a457726ded97818e1f127a28d72db5652749f0c6afee5":"":"":0:0 | ||
| 231 | + | ||
| 232 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES256_CBC PADDING_PKCS7 | ||
| 233 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES256_CBC:"0493ff637108af6a5b8e90ac1fdf035a3d4bafd1afb573be7ade9e8682e663e5":"c0cd2bebccbb6c49920bd5482ac756e8":"8b37f9148df4bb25956be6310c73c8dc58ea9714ff49b643107b34c9bff096a94fedd6823526abc27a8e0b16616eee254ab4":"05d5c77729421b08b737e41119fa4438d1f570cc772a4d6c3df7ffeda0384ef84288ce37fc4c4c7d1125a499b051364c9696766e185b4fe717da75c7b1f88312":"":"":0:CRYPT_PADDING_PKCS7 | ||
| 234 | + | ||
| 235 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES128_CTR | ||
| 236 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES128_CTR:"2b7e151628aed2a6abf7158809cf4f3c":"f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff":"6bc1bee22e409f96e93d7e117393172a":"874d6191b620e3261bef6864990db6ce":"":"":0:0 | ||
| 237 | + | ||
| 238 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES128_ECB | ||
| 239 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES128_ECB:"edfdb257cb37cdf182c5455b0c0efebb":"":"1695fe475421cace3557daca01f445ff":"7888beae6e7a426332a7eaa2f808e637":"":"":0:0 | ||
| 240 | + | ||
| 241 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES256_ECB PADDING_PKCS7 | ||
| 242 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES256_ECB:"cc22da787f375711c76302bef0979d8eddf842829c2b99ef3dd04e23e54cc24b":"":"8b37f9148df4bb25956be6310c73c8dc58ea9714ff49b643107b34c9bff096a94fedd6823526abc27a8e0b16616eee254ab4":"ce7ef65514eef925182082cdb5dc275e5da20070dcc54b26ef130a7a81b3e74de709e57fd3fda0631605104b61e5f57ea328d0b66f95a5eecff65bb881764b9c":"":"":0:CRYPT_PADDING_PKCS7 | ||
| 243 | + | ||
| 244 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES256_XTS #2 | ||
| 245 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES256_XTS:"1ea661c58d943a0e4801e42f4b0947149e7f9f8e3e68d0c7505210bd311a0e7cd6e13ffdf2418d8d1911c004cda58da3d619b7e2b9141e58318eea392cf41b08":"adf8d92627464ad2f0428e84a9f87564":"2eedea52cd8215e1acc647e810bbc3642e87287f8d2e57e36c0a24fbc12a202e":"cbaad0e2f6cea3f50b37f934d46a9b130b9d54f07e34f36af793e86f73c6d7db":"":"":0:0 | ||
| 246 | + | ||
| 247 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES256_XTS #2 | ||
| 248 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES256_XTS:"266c336b3b01489f3267f52835fd92f674374b88b4e1ebd2d36a5f457581d9d042c3eef7b0b7e5137b086496b4d9e6ac658d7196a23f23f036172fdb8faee527":"06b209a7a22f486ecbfadb0f3137ba42":"ca7d65ef8d3dfad345b61ccddca1ad81de830b9e86c7b426d76cb7db766852d981c6b21409399d78f42cc0b33a7bbb06":"c73256870cc2f4dd57acc74b5456dbd776912a128bc1f77d72cdebbf270044b7a43ceed29025e1e8be211fa3c3ed002d":"":"":0:0 | ||
| 249 | + | ||
| 250 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES256_CCM | ||
| 251 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES256_CCM:"705334e30f53dd2f92d190d2c1437c8772f940c55aa35e562214ed45bd458ffe":"a544218dadd3c1":"78c46e3249ca28e1ef0531d80fd37c124d9aecb7be6668e3":"3341168eb8c48468c414347fb08f71d2086f7c2d1bd581ce":"1ac68bd42f5ec7fa7e068cc0ecd79c2a":"d3d5424e20fbec43ae495353ed830271515ab104f8860c988d15b6d36c038eab":0:0 | ||
| 252 | + | ||
| 253 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES256_GCM | ||
| 254 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES256_GCM:"65b7171b55b22edd711a076f2eb6a125e873993e8d54564cd62d03c665cd6374":"54d118d32a56138f04212684b1e47c5d6808c128996e1d6ebf739ef9ff138aac1181fcde820a5f68749e1fed791314c73c54169aee5556bf206998d95432719fc9ffe22fbbc4925f32774d31e075393c0907e27c3f40da02c424b402eff596f6300b881b8f561d5ae4535a1fa9d4bafe86dd6751b0da245ae7b74ddcc3f5033c":"0521e41d827d6104ecdab1f8e7fb70cd8abca87500ecd36e65906194327b1b61014fd310f4e1bf7d5bf356a5d731c0d0d47c7e":"2ecf7a3a35abb50d212588c2ef50880212b53c052738767c9ea215709208afae6e94acd68980207bf63382495be1acde784b92":"49563e12797eefbee2fd75a1e844869b":"4a3b04decbec0a549666e87036e78433b896270792e7932810c38eb063139ade6a4befd4dfdb38d53cdb95accbdee7ad5478c3bc55a21226c2b0fa79fe7c30262fa5383de3d3b45e951d7ef955f3a18b9689783898bedb66f0b8":0:0 | ||
| 255 | + | ||
| 256 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES256_CFB | ||
| 257 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES256_CFB:"ae59254c66d8f533e7f5002ced480c33984a421d7816e27be66c34c19bfbc2a8":"821dd21653ece3af675cd25d26017ae3":"3cb4f17e775c2d6d06dd60f15d6c3a103e5131727f9c6cb80d13e00f316eb904":"ae375db9f28148c460f6c6b6665fcc2ff6b50b8eaf82c64bba8c649efd4731bc":"":"":0:0 | ||
| 258 | + | ||
| 259 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES256_OFB | ||
| 260 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES256_OFB:"318aa7c73006ff95840f17f2b9cf01fe7f031105ff01daa66ff95834e47b6f5c":"0e28bd0603b31c26250345a118408ffc":"257f3fc84537158b68c8af111b1e9eb41f8841686ab1e94c6fd13a7f9f24d535309c340a1dd3d4966e439a41b9b97058e9072f613ef9c1ac958b872bea59f8831b578b63eec2d7155657f953f2c2375b":"ba4ebcdc894e6de54f8f1d7ccbb19e13d2ae0ca66c05c10e2f90bad2e9b8db94ee7770c3557927029d49fd2b3f80a01025af0e7a343237fb625dbdee85367ddfbd7f6664b511cdc7e832b2c4d91f1c0e":"":"":0:0 | ||
| 261 | + | ||
| 262 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES192_WRAP_NOPAD | ||
| 263 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES192_WRAP_NOPAD:"000102030405060708090A0B0C0D0E0F1011121314151617":"":"00112233445566778899AABBCCDDEEFF":"96778B25AE6CA435F92B5B97C050AED2468AB8A17AD84E5D":"":"":0:0 | ||
| 264 | + | ||
| 265 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES192_WRAP_PAD | ||
| 266 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES192_WRAP_PAD:"5840df6e29b02af1ab493b705bf16ea1ae8338f4dcc176a8":"":"c37b7e6492584340bed12207808941155068f738":"138bdeaa9b8fa7fc61f97742e72248ee5ae6ae5360d1ae6a5f54f373fa543b6a":"":"":0:0 | ||
| 267 | + | ||
| 268 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_SM4_XTS | ||
| 269 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_SM4_XTS:"2b7e151628aed2a6abf7158809cf4f3c000102030405060708090a0b0c0d0e0f":"f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff":"6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17":"E9538251C71D7B80BBE4483FEF497BD12C5C581BD6242FC51E08964FB4F60FDB0BA42F63499279213D318D2C11F6886E903BE7F93A1B3479":"":"":0:0 | ||
| 270 | + | ||
| 271 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_SM4_CBC | ||
| 272 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_SM4_CBC:"2b7e151628aed2a6abf7158809cf4f3c":"000102030405060708090A0B0C0D0E0F":"6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710":"AC529AF989A62FCE9CDDC5FFB84125CAB168DD69DB3C0EEA1AB16DE6AEA43C592C15567BFF8F707486C202C7BE59101F74A629B350CD7E11BE99998AF5206D6C":"":"":0:0 | ||
| 273 | + | ||
| 274 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_SM4_ECB | ||
| 275 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_SM4_ECB:"2b7e151628aed2a6abf7158809cf4f3c":"":"6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710":"a51411ff04a711443891fce7ab842a29d5b50f46a9a730a0f590ffa776d99855c9a86a4d71447f4e873ada4f388af9b92b25557b50514d155939e6ec940ad90e":"":"":0:0 | ||
| 276 | + | ||
| 277 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_SM4_CTR | ||
| 278 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_SM4_CTR:"2b7e151628aed2a6abf7158809cf4f3c":"f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff":"6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710":"14AE4A72B97A93CE1216CCD998E371C160F7EF8B6344BD6DA1992505E5FC219B0BF057F86C5D75103C0F46519C7FB2E7292805035ADB9A90ECEF145359D7CF0E":"":"":0:0 | ||
| 279 | + | ||
| 280 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_SM4_GCM | ||
| 281 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_SM4_GCM:"0123456789ABCDEFFEDCBA9876543210":"00001234567800000000ABCD":"AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB":"17f399f08c67d5ee19d0dc9969c4bb7d":"":"":0:0 | ||
| 282 | + | ||
| 283 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_SM4_CFB | ||
| 284 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_SM4_CFB:"2b7e151628aed2a6abf7158809cf4f3c":"000102030405060708090A0B0C0D0E0F":"6BC1BEE22E409F96E93D7E117393172A":"bc710d762d070b26361da82b54565e46":"":"":0:0 | ||
| 285 | + | ||
| 286 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_SM4_OFB | ||
| 287 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_SM4_OFB:"2b7e151628aed2a6abf7158809cf4f3c":"000102030405060708090A0B0C0D0E0F":"6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710":"BC710D762D070B26361DA82B54565E4607A0C62834740AD3240D239125E11621D476B21CC9F04951F0741D2EF9E094981584FC142BF13AA626B82F9D7D076CCE":"":"":0:0 | ||
| 288 | + | ||
| 289 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_CHACHA20_POLY1305 | ||
| 290 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_CHACHA20_POLY1305:"808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f":"070000004041424344454647":"4c616469657320616e642047656e746c656d656e206f662074686520636c617373206f66202739393a204966204920636f756c64206f6666657220796f75206f6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73637265656e20776f756c642062652069742e":"d31a8d34648e60db7b86afbc53ef7ec2a4aded51296e08fea9e2b5a736ee62d63dbea45e8ca9671282fafb69da92728b1a71de0a9e060b2905d6a5b67ecd3b3692ddbd7f2d778b8c9803aee328091b58fab324e4fad675945585808b4831d7bc3ff4def08e4b7a9de576d26586cec64b6116":"1ae10b594f09e26a7e902ecbd0600691":"50515253c0c1c2c3c4c5c6c7":0:0 | ||
| 291 | + | ||
| 292 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES128_CBC Provider | ||
| 293 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES128_CBC:"3348aa51e9a45c2dbe33ccc47f96e8de":"19153c673160df2b1d38c28060e59b96":"9b7cee827a26575afdbb7c7a329f887238052e3601a7917456ba61251c214763d5e1847a6ad5d54127a399ab07ee3599":"d5aed6c9622ec451a15db12819952b6752501cf05cdbf8cda34a457726ded97818e1f127a28d72db5652749f0c6afee5":"":"":1:0 | ||
| 294 | + | ||
| 295 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES256_CBC PADDING_PKCS7 Provider | ||
| 296 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES256_CBC:"0493ff637108af6a5b8e90ac1fdf035a3d4bafd1afb573be7ade9e8682e663e5":"c0cd2bebccbb6c49920bd5482ac756e8":"8b37f9148df4bb25956be6310c73c8dc58ea9714ff49b643107b34c9bff096a94fedd6823526abc27a8e0b16616eee254ab4":"05d5c77729421b08b737e41119fa4438d1f570cc772a4d6c3df7ffeda0384ef84288ce37fc4c4c7d1125a499b051364c9696766e185b4fe717da75c7b1f88312":"":"":1:CRYPT_PADDING_PKCS7 | ||
| 297 | + | ||
| 298 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES128_CTR Provider | ||
| 299 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES128_CTR:"2b7e151628aed2a6abf7158809cf4f3c":"f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff":"6bc1bee22e409f96e93d7e117393172a":"874d6191b620e3261bef6864990db6ce":"":"":1:0 | ||
| 300 | + | ||
| 301 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES128_ECB Provider | ||
| 302 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES128_ECB:"edfdb257cb37cdf182c5455b0c0efebb":"":"1695fe475421cace3557daca01f445ff":"7888beae6e7a426332a7eaa2f808e637":"":"":1:0 | ||
| 303 | + | ||
| 304 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES256_ECB PADDING_PKCS7 Provider | ||
| 305 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES256_ECB:"cc22da787f375711c76302bef0979d8eddf842829c2b99ef3dd04e23e54cc24b":"":"8b37f9148df4bb25956be6310c73c8dc58ea9714ff49b643107b34c9bff096a94fedd6823526abc27a8e0b16616eee254ab4":"ce7ef65514eef925182082cdb5dc275e5da20070dcc54b26ef130a7a81b3e74de709e57fd3fda0631605104b61e5f57ea328d0b66f95a5eecff65bb881764b9c":"":"":1:CRYPT_PADDING_PKCS7 | ||
| 306 | + | ||
| 307 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES256_XTS Provider | ||
| 308 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES256_XTS:"1ea661c58d943a0e4801e42f4b0947149e7f9f8e3e68d0c7505210bd311a0e7cd6e13ffdf2418d8d1911c004cda58da3d619b7e2b9141e58318eea392cf41b08":"adf8d92627464ad2f0428e84a9f87564":"2eedea52cd8215e1acc647e810bbc3642e87287f8d2e57e36c0a24fbc12a202e":"cbaad0e2f6cea3f50b37f934d46a9b130b9d54f07e34f36af793e86f73c6d7db":"":"":1:0 | ||
| 309 | + | ||
| 310 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES256_CCM Provider | ||
| 311 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES256_CCM:"705334e30f53dd2f92d190d2c1437c8772f940c55aa35e562214ed45bd458ffe":"a544218dadd3c1":"78c46e3249ca28e1ef0531d80fd37c124d9aecb7be6668e3":"3341168eb8c48468c414347fb08f71d2086f7c2d1bd581ce":"1ac68bd42f5ec7fa7e068cc0ecd79c2a":"d3d5424e20fbec43ae495353ed830271515ab104f8860c988d15b6d36c038eab":1:0 | ||
| 312 | + | ||
| 313 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES256_GCM Provider | ||
| 314 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES256_GCM:"65b7171b55b22edd711a076f2eb6a125e873993e8d54564cd62d03c665cd6374":"54d118d32a56138f04212684b1e47c5d6808c128996e1d6ebf739ef9ff138aac1181fcde820a5f68749e1fed791314c73c54169aee5556bf206998d95432719fc9ffe22fbbc4925f32774d31e075393c0907e27c3f40da02c424b402eff596f6300b881b8f561d5ae4535a1fa9d4bafe86dd6751b0da245ae7b74ddcc3f5033c":"0521e41d827d6104ecdab1f8e7fb70cd8abca87500ecd36e65906194327b1b61014fd310f4e1bf7d5bf356a5d731c0d0d47c7e":"2ecf7a3a35abb50d212588c2ef50880212b53c052738767c9ea215709208afae6e94acd68980207bf63382495be1acde784b92":"49563e12797eefbee2fd75a1e844869b":"4a3b04decbec0a549666e87036e78433b896270792e7932810c38eb063139ade6a4befd4dfdb38d53cdb95accbdee7ad5478c3bc55a21226c2b0fa79fe7c30262fa5383de3d3b45e951d7ef955f3a18b9689783898bedb66f0b8":1:0 | ||
| 315 | + | ||
| 316 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES256_CFB Provider | ||
| 317 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES256_CFB:"ae59254c66d8f533e7f5002ced480c33984a421d7816e27be66c34c19bfbc2a8":"821dd21653ece3af675cd25d26017ae3":"3cb4f17e775c2d6d06dd60f15d6c3a103e5131727f9c6cb80d13e00f316eb904":"ae375db9f28148c460f6c6b6665fcc2ff6b50b8eaf82c64bba8c649efd4731bc":"":"":1:0 | ||
| 318 | + | ||
| 319 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES256_OFB Provider | ||
| 320 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES256_OFB:"318aa7c73006ff95840f17f2b9cf01fe7f031105ff01daa66ff95834e47b6f5c":"0e28bd0603b31c26250345a118408ffc":"257f3fc84537158b68c8af111b1e9eb41f8841686ab1e94c6fd13a7f9f24d535309c340a1dd3d4966e439a41b9b97058e9072f613ef9c1ac958b872bea59f8831b578b63eec2d7155657f953f2c2375b":"ba4ebcdc894e6de54f8f1d7ccbb19e13d2ae0ca66c05c10e2f90bad2e9b8db94ee7770c3557927029d49fd2b3f80a01025af0e7a343237fb625dbdee85367ddfbd7f6664b511cdc7e832b2c4d91f1c0e":"":"":1:0 | ||
| 321 | + | ||
| 322 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES128_WRAP_NOPAD Provider | ||
| 323 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES128_WRAP_NOPAD:"000102030405060708090A0B0C0D0E0F":"":"00112233445566778899AABBCCDDEEFF":"1FA68B0A8112B447AEF34BD8FB5A7B829D3E862371D2CFE5":"":"":1:0 | ||
| 324 | + | ||
| 325 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_AES256_WRAP_NOPAD Provider | ||
| 326 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_AES256_WRAP_NOPAD:"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F":"":"00112233445566778899AABBCCDDEEFF0001020304050607":"A8F9BC1612C68B3FF6E6F4FBE30E71E4769C8B80A32CB8958CD5D17D6B254DA1":"":"":1:0 | ||
| 327 | + | ||
| 328 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_SM4_XTS Provider | ||
| 329 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_SM4_XTS:"2b7e151628aed2a6abf7158809cf4f3c000102030405060708090a0b0c0d0e0f":"f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff":"6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17":"E9538251C71D7B80BBE4483FEF497BD12C5C581BD6242FC51E08964FB4F60FDB0BA42F63499279213D318D2C11F6886E903BE7F93A1B3479":"":"":1:0 | ||
| 330 | + | ||
| 331 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_SM4_CBC Provider | ||
| 332 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_SM4_CBC:"2b7e151628aed2a6abf7158809cf4f3c":"000102030405060708090A0B0C0D0E0F":"6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710":"AC529AF989A62FCE9CDDC5FFB84125CAB168DD69DB3C0EEA1AB16DE6AEA43C592C15567BFF8F707486C202C7BE59101F74A629B350CD7E11BE99998AF5206D6C":"":"":1:0 | ||
| 333 | + | ||
| 334 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_SM4_ECB Provider | ||
| 335 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_SM4_ECB:"2b7e151628aed2a6abf7158809cf4f3c":"":"6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710":"a51411ff04a711443891fce7ab842a29d5b50f46a9a730a0f590ffa776d99855c9a86a4d71447f4e873ada4f388af9b92b25557b50514d155939e6ec940ad90e":"":"":1:0 | ||
| 336 | + | ||
| 337 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_SM4_CTR Provider | ||
| 338 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_SM4_CTR:"2b7e151628aed2a6abf7158809cf4f3c":"f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff":"6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710":"14AE4A72B97A93CE1216CCD998E371C160F7EF8B6344BD6DA1992505E5FC219B0BF057F86C5D75103C0F46519C7FB2E7292805035ADB9A90ECEF145359D7CF0E":"":"":1:0 | ||
| 339 | + | ||
| 340 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_SM4_GCM Provider | ||
| 341 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_SM4_GCM:"0123456789ABCDEFFEDCBA9876543210":"00001234567800000000ABCD":"AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB":"17f399f08c67d5ee19d0dc9969c4bb7d":"":"":1:0 | ||
| 342 | + | ||
| 343 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_SM4_CFB Provider | ||
| 344 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_SM4_CFB:"2b7e151628aed2a6abf7158809cf4f3c":"000102030405060708090A0B0C0D0E0F":"6BC1BEE22E409F96E93D7E117393172A":"bc710d762d070b26361da82b54565e46":"":"":1:0 | ||
| 345 | + | ||
| 346 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_SM4_OFB Provider | ||
| 347 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_SM4_OFB:"2b7e151628aed2a6abf7158809cf4f3c":"000102030405060708090A0B0C0D0E0F":"6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710":"BC710D762D070B26361DA82B54565E4607A0C62834740AD3240D239125E11621D476B21CC9F04951F0741D2EF9E094981584FC142BF13AA626B82F9D7D076CCE":"":"":1:0 | ||
| 348 | + | ||
| 349 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002 CRYPT_CIPHER_CHACHA20_POLY1305 Provider | ||
| 350 | +SDV_CRYPTO_CIPHER_COPY_CTX_FUNC_TC002:CRYPT_CIPHER_CHACHA20_POLY1305:"808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f":"070000004041424344454647":"4c616469657320616e642047656e746c656d656e206f662074686520636c617373206f66202739393a204966204920636f756c64206f6666657220796f75206f6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73637265656e20776f756c642062652069742e":"d31a8d34648e60db7b86afbc53ef7ec2a4aded51296e08fea9e2b5a736ee62d63dbea45e8ca9671282fafb69da92728b1a71de0a9e060b2905d6a5b67ecd3b3692ddbd7f2d778b8c9803aee328091b58fab324e4fad675945585808b4831d7bc3ff4def08e4b7a9de576d26586cec64b6116":"1ae10b594f09e26a7e902ecbd0600691":"50515253c0c1c2c3c4c5c6c7":1:0 | ||
| 351 | + | ||
| 352 | +SDV_CRYPTO_CIPHER_COPY_CTX_STUB_TC001 | ||
| 353 | +SDV_CRYPTO_CIPHER_COPY_CTX_STUB_TC001:0 | ||
| 354 | + | ||
| 355 | +SDV_CRYPTO_CIPHER_COPY_CTX_STUB_TC001 Provider | ||
| 356 | +SDV_CRYPTO_CIPHER_COPY_CTX_STUB_TC001:1 | ||
| @@ -16,8 +16,10 @@ | |||
| 16 | /* BEGIN_HEADER */ | 16 | /* BEGIN_HEADER */ |
| 17 | #include "securec.h" | 17 | #include "securec.h" |
| 18 | #include "crypt_eal_mac.h" | 18 | #include "crypt_eal_mac.h" |
| 19 | +#include "eal_mac_local.h" | ||
| 19 | #include "crypt_errno.h" | 20 | #include "crypt_errno.h" |
| 20 | #include "bsl_sal.h" | 21 | #include "bsl_sal.h" |
| 22 | +#include "stub_replace.h" | ||
| 21 | 23 | ||
| 22 | #define CBC_MAC_MAC_LEN 16 | 24 | #define CBC_MAC_MAC_LEN 16 |
| 23 | #define SM4_KEY_LEN 16 | 25 | #define SM4_KEY_LEN 16 |
| @@ -581,3 +583,185 @@ void SDV_CRYPT_EAL_CBC_MAC_ADDR_NOT_ALIGN_FUNC_TC001(int algId, Hex *key, Hex *d | |||
| 581 | TestMacAddrNotAlign(algId, key, data, mac); | 583 | TestMacAddrNotAlign(algId, key, data, mac); |
| 582 | } | 584 | } |
| 583 | /* END_CASE */ | 585 | /* END_CASE */ |
| 586 | + | ||
| 587 | +/* BEGIN_CASE */ | ||
| 588 | +void SDV_CRYPTO_CBC_MAC_COPY_CTX_API_TC001(int algId, int isProvider) | ||
| 589 | +{ | ||
| 590 | + TestMemInit(); | ||
| 591 | + CRYPT_EAL_MacCtx *ctxB = NULL; | ||
| 592 | + CRYPT_EAL_MacCtx ctxC = { 0 }; | ||
| 593 | + CRYPT_EAL_MacCtx *ctxA = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 594 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 595 | + ASSERT_TRUE(ctxA != NULL); | ||
| 596 | + | ||
| 597 | + ctxB = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 598 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 599 | + ASSERT_TRUE(ctxB != NULL); | ||
| 600 | + | ||
| 601 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(NULL, ctxA), CRYPT_NULL_INPUT); | ||
| 602 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(ctxB, NULL), CRYPT_NULL_INPUT); | ||
| 603 | + // Copy failed because ctxC lacks a method. | ||
| 604 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(ctxB, &ctxC), CRYPT_NULL_INPUT); | ||
| 605 | + | ||
| 606 | + // A directly created context can also be used as the destination for copying. | ||
| 607 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(&ctxC, ctxA), CRYPT_SUCCESS); | ||
| 608 | + ctxC.macMeth->freeCtx(ctxC.ctx); | ||
| 609 | + BSL_SAL_Free(ctxC.macMeth); | ||
| 610 | +EXIT: | ||
| 611 | + CRYPT_EAL_MacFreeCtx(ctxA); | ||
| 612 | + CRYPT_EAL_MacFreeCtx(ctxB); | ||
| 613 | +} | ||
| 614 | +/* END_CASE */ | ||
| 615 | + | ||
| 616 | +/* BEGIN_CASE */ | ||
| 617 | +void SDV_CRYPTO_CBC_MAC_DUP_CTX_API_TC001(int algId, int isProvider) | ||
| 618 | +{ | ||
| 619 | + TestMemInit(); | ||
| 620 | + CRYPT_EAL_MacCtx *ctxB = NULL; | ||
| 621 | + CRYPT_EAL_MacCtx ctxC = { 0 }; | ||
| 622 | + CRYPT_EAL_MacCtx *ctxA = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 623 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 624 | + ASSERT_TRUE(ctxA != NULL); | ||
| 625 | + | ||
| 626 | + ctxB = CRYPT_EAL_MacDupCtx(NULL); | ||
| 627 | + ASSERT_TRUE(ctxB == NULL); | ||
| 628 | + ctxB = CRYPT_EAL_MacDupCtx(&ctxC); | ||
| 629 | + ASSERT_TRUE(ctxB == NULL); | ||
| 630 | + ctxB = CRYPT_EAL_MacDupCtx(ctxA); | ||
| 631 | + ASSERT_TRUE(ctxB != NULL); | ||
| 632 | + | ||
| 633 | +EXIT: | ||
| 634 | + CRYPT_EAL_MacFreeCtx(ctxA); | ||
| 635 | + CRYPT_EAL_MacFreeCtx(ctxB); | ||
| 636 | +} | ||
| 637 | +/* END_CASE */ | ||
| 638 | + | ||
| 639 | +/* BEGIN_CASE */ | ||
| 640 | +void SDV_CRYPT_EAL_CBC_MAC_COPY_CTX_TC001(int algId, int padType, Hex *key, Hex *data, Hex *vecMac, int isProvider) | ||
| 641 | +{ | ||
| 642 | + if (IsHmacAlgDisabled(algId)) { | ||
| 643 | + SKIP_TEST(); | ||
| 644 | + } | ||
| 645 | + TestMemInit(); | ||
| 646 | + uint32_t macLen = vecMac->len; | ||
| 647 | + uint8_t mac[64]; | ||
| 648 | + | ||
| 649 | + CRYPT_EAL_MacCtx *copyCtx1 = NULL; | ||
| 650 | + CRYPT_EAL_MacCtx *copyCtx2 = NULL; | ||
| 651 | + CRYPT_EAL_MacCtx *copyCtx3 = NULL; | ||
| 652 | + CRYPT_EAL_MacCtx *ctx = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 653 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 654 | + ASSERT_TRUE(ctx != NULL); | ||
| 655 | + ASSERT_EQ(CRYPT_EAL_MacInit(ctx, key->x, key->len), CRYPT_SUCCESS); | ||
| 656 | + int32_t pad = (int32_t)padType; | ||
| 657 | + ASSERT_EQ(CRYPT_EAL_MacCtrl(ctx, CRYPT_CTRL_SET_CBC_MAC_PADDING, &pad, sizeof(pad)), CRYPT_SUCCESS); | ||
| 658 | + | ||
| 659 | + copyCtx1 = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 660 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 661 | + ASSERT_TRUE(copyCtx1 != NULL); | ||
| 662 | + copyCtx2 = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 663 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 664 | + ASSERT_TRUE(copyCtx2 != NULL); | ||
| 665 | + | ||
| 666 | + // Test that the copied context functions correctly and is independent of the original context. | ||
| 667 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(copyCtx1, ctx), CRYPT_SUCCESS); | ||
| 668 | + ASSERT_EQ(CRYPT_EAL_MacUpdate(copyCtx1, data->x, data->len), CRYPT_SUCCESS); | ||
| 669 | + ASSERT_EQ(CRYPT_EAL_MacFinal(copyCtx1, mac, &macLen), CRYPT_SUCCESS); | ||
| 670 | + ASSERT_COMPARE("mac1 cmp", mac, macLen, vecMac->x, vecMac->len); | ||
| 671 | + CRYPT_EAL_MacFreeCtx(copyCtx1); | ||
| 672 | + copyCtx1 = NULL; | ||
| 673 | + | ||
| 674 | + // Create a new copyCtx3 from ctx, use copyCtx3 for encryption, and verify functional correctness. | ||
| 675 | + copyCtx3 = CRYPT_EAL_MacDupCtx(ctx); | ||
| 676 | + ASSERT_EQ(CRYPT_EAL_MacUpdate(copyCtx3, data->x, data->len), CRYPT_SUCCESS); | ||
| 677 | + ASSERT_EQ(CRYPT_EAL_MacFinal(copyCtx3, mac, &macLen), CRYPT_SUCCESS); | ||
| 678 | + ASSERT_COMPARE("mac2 cmp", mac, macLen, vecMac->x, vecMac->len); | ||
| 679 | + CRYPT_EAL_MacFreeCtx(copyCtx3); | ||
| 680 | + copyCtx3 = NULL; | ||
| 681 | + | ||
| 682 | + macLen = vecMac->len; | ||
| 683 | + ASSERT_EQ(CRYPT_EAL_MacUpdate(ctx, data->x, data->len), CRYPT_SUCCESS); | ||
| 684 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(copyCtx2, ctx), CRYPT_SUCCESS); | ||
| 685 | + ASSERT_EQ(CRYPT_EAL_MacFinal(ctx, mac, &macLen), CRYPT_SUCCESS); | ||
| 686 | + ASSERT_COMPARE("mac3 cmp", mac, macLen, vecMac->x, vecMac->len); | ||
| 687 | + CRYPT_EAL_MacFreeCtx(ctx); | ||
| 688 | + ctx = NULL; | ||
| 689 | + | ||
| 690 | + macLen = vecMac->len; | ||
| 691 | + ASSERT_EQ(CRYPT_EAL_MacFinal(copyCtx2, mac, &macLen), CRYPT_SUCCESS); | ||
| 692 | + ASSERT_COMPARE("mac4 cmp", mac, macLen, vecMac->x, vecMac->len); | ||
| 693 | + | ||
| 694 | +EXIT: | ||
| 695 | + CRYPT_EAL_MacFreeCtx(copyCtx3); | ||
| 696 | + CRYPT_EAL_MacFreeCtx(copyCtx2); | ||
| 697 | + CRYPT_EAL_MacFreeCtx(copyCtx1); | ||
| 698 | + CRYPT_EAL_MacFreeCtx(ctx); | ||
| 699 | +} | ||
| 700 | +/* END_CASE */ | ||
| 701 | + | ||
| 702 | +static int32_t TestMacCopyCtxMemCheck(int32_t algId, Hex *key, int isProvider) | ||
| 703 | +{ | ||
| 704 | + CRYPT_EAL_MacCtx *ctxA = NULL; | ||
| 705 | + CRYPT_EAL_MacCtx *ctxB = NULL; | ||
| 706 | + CRYPT_EAL_MacCtx *srcCtx = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 707 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 708 | + /* Set key in srcCtx */ | ||
| 709 | + int32_t ret = CRYPT_EAL_MacInit(srcCtx, key->x, key->len); | ||
| 710 | + if (ret != CRYPT_SUCCESS) { | ||
| 711 | + goto EXIT; | ||
| 712 | + } | ||
| 713 | + int32_t pad = CRYPT_PADDING_ZEROS; | ||
| 714 | + ret = CRYPT_EAL_MacCtrl(srcCtx, CRYPT_CTRL_SET_CBC_MAC_PADDING, &pad, sizeof(pad)); | ||
| 715 | + if (ret != CRYPT_SUCCESS) { | ||
| 716 | + goto EXIT; | ||
| 717 | + } | ||
| 718 | + | ||
| 719 | + ctxA = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 720 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 721 | + ret = CRYPT_EAL_MacCopyCtx(ctxA, srcCtx); | ||
| 722 | + if (ret != CRYPT_SUCCESS) { | ||
| 723 | + goto EXIT; | ||
| 724 | + } | ||
| 725 | + ctxB = CRYPT_EAL_MacDupCtx(srcCtx); | ||
| 726 | + if (ctxB == NULL) { | ||
| 727 | + ret = CRYPT_MEM_ALLOC_FAIL; | ||
| 728 | + goto EXIT; | ||
| 729 | + } | ||
| 730 | + | ||
| 731 | +EXIT: | ||
| 732 | + CRYPT_EAL_MacFreeCtx(ctxA); | ||
| 733 | + CRYPT_EAL_MacFreeCtx(ctxB); | ||
| 734 | + CRYPT_EAL_MacFreeCtx(srcCtx); | ||
| 735 | + return ret; | ||
| 736 | +} | ||
| 737 | + | ||
| 738 | +/** | ||
| 739 | + * @test SDV_CRYPTO_CBC_MAC_COPY_CTX_STUB_TC001 | ||
| 740 | + * title 1. Test the mac copy context with stub malloc fail | ||
| 741 | + * | ||
| 742 | + */ | ||
| 743 | +/* BEGIN_CASE */ | ||
| 744 | +void SDV_CRYPTO_CBC_MAC_COPY_CTX_STUB_TC001(int algId, Hex *key, int isProvider) | ||
| 745 | +{ | ||
| 746 | + TestMemInit(); | ||
| 747 | + uint32_t totalMallocCount = 0; | ||
| 748 | + STUB_Init(); | ||
| 749 | + FuncStubInfo tmpRpInfo = {0}; | ||
| 750 | + ASSERT_TRUE(STUB_Replace(&tmpRpInfo, BSL_SAL_Malloc, STUB_BSL_SAL_Malloc) == 0); | ||
| 751 | + | ||
| 752 | + STUB_EnableMallocFail(false); | ||
| 753 | + STUB_ResetMallocCount(); | ||
| 754 | + ASSERT_EQ(TestMacCopyCtxMemCheck((int32_t)algId, key, isProvider), CRYPT_SUCCESS); | ||
| 755 | + totalMallocCount = STUB_GetMallocCallCount(); | ||
| 756 | + | ||
| 757 | + STUB_EnableMallocFail(true); | ||
| 758 | + for (uint32_t j = 0; j < totalMallocCount; j++) { | ||
| 759 | + STUB_ResetMallocCount(); | ||
| 760 | + STUB_SetMallocFailIndex(j); | ||
| 761 | + ASSERT_NE(TestMacCopyCtxMemCheck((int32_t)algId, key, isProvider), CRYPT_SUCCESS); | ||
| 762 | + } | ||
| 763 | + | ||
| 764 | +EXIT: | ||
| 765 | + STUB_Reset(&tmpRpInfo); | ||
| 766 | +} | ||
| 767 | +/* END_CASE */ | ||
| @@ -50,4 +50,28 @@ in/out same address test: CRYPT_MAC_CBC_MAC_SM4 | |||
| 50 | SDV_CRYPT_EAL_CBC_MAC_SAMEADDR_FUNC_TC001:CRYPT_MAC_CBC_MAC_SM4:"00000000000000000000000000000000":"60437d010000000064fafee5787f0000":"dbbe98446572391ff7fc5a2a7c82dacc" | 50 | SDV_CRYPT_EAL_CBC_MAC_SAMEADDR_FUNC_TC001:CRYPT_MAC_CBC_MAC_SM4:"00000000000000000000000000000000":"60437d010000000064fafee5787f0000":"dbbe98446572391ff7fc5a2a7c82dacc" |
| 51 | 51 | ||
| 52 | address misalignment test: CRYPT_MAC_CBC_MAC_SM4 | 52 | address misalignment test: CRYPT_MAC_CBC_MAC_SM4 |
| 53 | -SDV_CRYPT_EAL_CBC_MAC_ADDR_NOT_ALIGN_FUNC_TC001:CRYPT_MAC_CBC_MAC_SM4:"00000000000000000000000000000000":"60437d010000000064fafee5787f0000":"dbbe98446572391ff7fc5a2a7c82dacc" | 53 | +SDV_CRYPT_EAL_CBC_MAC_ADDR_NOT_ALIGN_FUNC_TC001:CRYPT_MAC_CBC_MAC_SM4:"00000000000000000000000000000000":"60437d010000000064fafee5787f0000":"dbbe98446572391ff7fc5a2a7c82dacc" |
| 54 | + | ||
| 55 | +SDV_CRYPTO_CBC_MAC_COPY_CTX_API_TC001 | ||
| 56 | +SDV_CRYPTO_CBC_MAC_COPY_CTX_API_TC001:CRYPT_MAC_CBC_MAC_SM4:0 | ||
| 57 | + | ||
| 58 | +SDV_CRYPTO_CBC_MAC_COPY_CTX_API_TC001 Provider | ||
| 59 | +SDV_CRYPTO_CBC_MAC_COPY_CTX_API_TC001:CRYPT_MAC_CBC_MAC_SM4:1 | ||
| 60 | + | ||
| 61 | +SDV_CRYPTO_CBC_MAC_DUP_CTX_API_TC001 | ||
| 62 | +SDV_CRYPTO_CBC_MAC_DUP_CTX_API_TC001:CRYPT_MAC_CBC_MAC_SM4:0 | ||
| 63 | + | ||
| 64 | +SDV_CRYPTO_CBC_MAC_DUP_CTX_API_TC001 Provider | ||
| 65 | +SDV_CRYPTO_CBC_MAC_DUP_CTX_API_TC001:CRYPT_MAC_CBC_MAC_SM4:1 | ||
| 66 | + | ||
| 67 | +SDV_CRYPT_EAL_CBC_MAC_COPY_CTX_TC001 CRYPT_MAC_CBC_MAC_SM4 | ||
| 68 | +SDV_CRYPT_EAL_CBC_MAC_COPY_CTX_TC001:CRYPT_MAC_CBC_MAC_SM4:CRYPT_PADDING_ZEROS:"0a00000000000000d71d5e0000000000":"ffffffffffffffffffffffffffffffff":"648574aa0f0659bfcc43ede6560c5a23":0 | ||
| 69 | + | ||
| 70 | +SDV_CRYPT_EAL_CBC_MAC_COPY_CTX_TC001 CRYPT_MAC_CBC_MAC_SM4 Provider | ||
| 71 | +SDV_CRYPT_EAL_CBC_MAC_COPY_CTX_TC001:CRYPT_MAC_CBC_MAC_SM4:CRYPT_PADDING_ZEROS:"0a00000000000000d71d5e0000000000":"ffffffffffffffffffffffffffffffff":"648574aa0f0659bfcc43ede6560c5a23":1 | ||
| 72 | + | ||
| 73 | +SDV_CRYPTO_CBC_MAC_COPY_CTX_STUB_TC001 | ||
| 74 | +SDV_CRYPTO_CBC_MAC_COPY_CTX_STUB_TC001:CRYPT_MAC_CBC_MAC_SM4:"0a00000000000000d71d5e0000000000":0 | ||
| 75 | + | ||
| 76 | +SDV_CRYPTO_CBC_MAC_COPY_CTX_STUB_TC001 Provider | ||
| 77 | +SDV_CRYPTO_CBC_MAC_COPY_CTX_STUB_TC001:CRYPT_MAC_CBC_MAC_SM4:"0a00000000000000d71d5e0000000000":1 | ||
| @@ -18,8 +18,11 @@ | |||
| 18 | #include <pthread.h> | 18 | #include <pthread.h> |
| 19 | #include "securec.h" | 19 | #include "securec.h" |
| 20 | #include "crypt_eal_mac.h" | 20 | #include "crypt_eal_mac.h" |
| 21 | +#include "eal_mac_local.h" | ||
| 21 | #include "crypt_errno.h" | 22 | #include "crypt_errno.h" |
| 22 | #include "bsl_sal.h" | 23 | #include "bsl_sal.h" |
| 24 | +#include "stub_replace.h" | ||
| 25 | +/* END_HEADER */ | ||
| 23 | 26 | ||
| 24 | #define AES128_KEY_LEN 16 | 27 | #define AES128_KEY_LEN 16 |
| 25 | #define AES192_KEY_LEN 24 | 28 | #define AES192_KEY_LEN 24 |
| @@ -43,7 +46,6 @@ uint32_t GetKeyLen(int algId) | |||
| 43 | return 0; | 46 | return 0; |
| 44 | } | 47 | } |
| 45 | } | 48 | } |
| 46 | -/* END_HEADER */ | ||
| 47 | 49 | ||
| 48 | /* @ | 50 | /* @ |
| 49 | * @test SDV_CRYPT_EAL_CMAC_API_TC001 | 51 | * @test SDV_CRYPT_EAL_CMAC_API_TC001 |
| @@ -837,3 +839,181 @@ void SDV_CRYPT_EAL_CMAC_ADDR_NOT_ALIGN_FUNC_TC001(int algId, Hex *key, Hex *data | |||
| 837 | TestMacAddrNotAlign(algId, key, data, mac); | 839 | TestMacAddrNotAlign(algId, key, data, mac); |
| 838 | } | 840 | } |
| 839 | /* END_CASE */ | 841 | /* END_CASE */ |
| 842 | + | ||
| 843 | +/* BEGIN_CASE */ | ||
| 844 | +void SDV_CRYPTO_CMAC_COPY_CTX_API_TC001(int algId, int isProvider) | ||
| 845 | +{ | ||
| 846 | + TestMemInit(); | ||
| 847 | + CRYPT_EAL_MacCtx *ctxB = NULL; | ||
| 848 | + CRYPT_EAL_MacCtx ctxC = { 0 }; | ||
| 849 | + CRYPT_EAL_MacCtx *ctxA = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 850 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 851 | + ASSERT_TRUE(ctxA != NULL); | ||
| 852 | + | ||
| 853 | + ctxB = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 854 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 855 | + ASSERT_TRUE(ctxB != NULL); | ||
| 856 | + | ||
| 857 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(NULL, ctxA), CRYPT_NULL_INPUT); | ||
| 858 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(ctxB, NULL), CRYPT_NULL_INPUT); | ||
| 859 | + // Copy failed because ctxC lacks a method. | ||
| 860 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(ctxB, &ctxC), CRYPT_NULL_INPUT); | ||
| 861 | + | ||
| 862 | + // A directly created context can also be used as the destination for copying. | ||
| 863 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(&ctxC, ctxA), CRYPT_SUCCESS); | ||
| 864 | + ctxC.macMeth->freeCtx(ctxC.ctx); | ||
| 865 | + BSL_SAL_Free(ctxC.macMeth); | ||
| 866 | +EXIT: | ||
| 867 | + CRYPT_EAL_MacFreeCtx(ctxA); | ||
| 868 | + CRYPT_EAL_MacFreeCtx(ctxB); | ||
| 869 | +} | ||
| 870 | +/* END_CASE */ | ||
| 871 | + | ||
| 872 | +/* BEGIN_CASE */ | ||
| 873 | +void SDV_CRYPTO_CMAC_DUP_CTX_API_TC001(int algId, int isProvider) | ||
| 874 | +{ | ||
| 875 | + TestMemInit(); | ||
| 876 | + CRYPT_EAL_MacCtx *ctxB = NULL; | ||
| 877 | + CRYPT_EAL_MacCtx ctxC = { 0 }; | ||
| 878 | + CRYPT_EAL_MacCtx *ctxA = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 879 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 880 | + ASSERT_TRUE(ctxA != NULL); | ||
| 881 | + | ||
| 882 | + ctxB = CRYPT_EAL_MacDupCtx(NULL); | ||
| 883 | + ASSERT_TRUE(ctxB == NULL); | ||
| 884 | + ctxB = CRYPT_EAL_MacDupCtx(&ctxC); | ||
| 885 | + ASSERT_TRUE(ctxB == NULL); | ||
| 886 | + ctxB = CRYPT_EAL_MacDupCtx(ctxA); | ||
| 887 | + ASSERT_TRUE(ctxB != NULL); | ||
| 888 | + | ||
| 889 | +EXIT: | ||
| 890 | + CRYPT_EAL_MacFreeCtx(ctxA); | ||
| 891 | + CRYPT_EAL_MacFreeCtx(ctxB); | ||
| 892 | +} | ||
| 893 | +/* END_CASE */ | ||
| 894 | + | ||
| 895 | +/* BEGIN_CASE */ | ||
| 896 | +void SDV_CRYPT_EAL_CMAC_COPY_CTX_TC001(int algId, Hex *key, Hex *data, Hex *vecMac, int isProvider) | ||
| 897 | +{ | ||
| 898 | + if (IsHmacAlgDisabled(algId)) { | ||
| 899 | + SKIP_TEST(); | ||
| 900 | + } | ||
| 901 | + TestMemInit(); | ||
| 902 | + uint32_t macLen = vecMac->len; | ||
| 903 | + uint8_t mac[64]; | ||
| 904 | + | ||
| 905 | + CRYPT_EAL_MacCtx *copyCtx1 = NULL; | ||
| 906 | + CRYPT_EAL_MacCtx *copyCtx2 = NULL; | ||
| 907 | + CRYPT_EAL_MacCtx *copyCtx3 = NULL; | ||
| 908 | + CRYPT_EAL_MacCtx *ctx = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 909 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 910 | + ASSERT_TRUE(ctx != NULL); | ||
| 911 | + ASSERT_EQ(CRYPT_EAL_MacInit(ctx, key->x, key->len), CRYPT_SUCCESS); | ||
| 912 | + | ||
| 913 | + copyCtx1 = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 914 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 915 | + ASSERT_TRUE(copyCtx1 != NULL); | ||
| 916 | + copyCtx2 = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 917 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 918 | + ASSERT_TRUE(copyCtx2 != NULL); | ||
| 919 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(NULL, ctx), CRYPT_NULL_INPUT); | ||
| 920 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(copyCtx1, NULL), CRYPT_NULL_INPUT); | ||
| 921 | + | ||
| 922 | + // Test that the copied context functions correctly and is independent of the original context. | ||
| 923 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(copyCtx1, ctx), CRYPT_SUCCESS); | ||
| 924 | + | ||
| 925 | + ASSERT_EQ(CRYPT_EAL_MacUpdate(copyCtx1, data->x, data->len), CRYPT_SUCCESS); | ||
| 926 | + ASSERT_EQ(CRYPT_EAL_MacFinal(copyCtx1, mac, &macLen), CRYPT_SUCCESS); | ||
| 927 | + ASSERT_COMPARE("mac1 cmp", mac, macLen, vecMac->x, vecMac->len); | ||
| 928 | + CRYPT_EAL_MacFreeCtx(copyCtx1); | ||
| 929 | + copyCtx1 = NULL; | ||
| 930 | + | ||
| 931 | + // Create a new copyCtx3 from ctx, use copyCtx3 for encryption, and verify functional correctness. | ||
| 932 | + copyCtx3 = CRYPT_EAL_MacDupCtx(ctx); | ||
| 933 | + ASSERT_EQ(CRYPT_EAL_MacUpdate(copyCtx3, data->x, data->len), CRYPT_SUCCESS); | ||
| 934 | + ASSERT_EQ(CRYPT_EAL_MacFinal(copyCtx3, mac, &macLen), CRYPT_SUCCESS); | ||
| 935 | + ASSERT_COMPARE("mac2 cmp", mac, macLen, vecMac->x, vecMac->len); | ||
| 936 | + CRYPT_EAL_MacFreeCtx(copyCtx3); | ||
| 937 | + copyCtx3 = NULL; | ||
| 938 | + | ||
| 939 | + macLen = vecMac->len; | ||
| 940 | + ASSERT_EQ(CRYPT_EAL_MacUpdate(ctx, data->x, data->len), CRYPT_SUCCESS); | ||
| 941 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(copyCtx2, ctx), CRYPT_SUCCESS); | ||
| 942 | + ASSERT_EQ(CRYPT_EAL_MacFinal(ctx, mac, &macLen), CRYPT_SUCCESS); | ||
| 943 | + ASSERT_COMPARE("mac3 cmp", mac, macLen, vecMac->x, vecMac->len); | ||
| 944 | + CRYPT_EAL_MacFreeCtx(ctx); | ||
| 945 | + ctx = NULL; | ||
| 946 | + | ||
| 947 | + macLen = vecMac->len; | ||
| 948 | + ASSERT_EQ(CRYPT_EAL_MacFinal(copyCtx2, mac, &macLen), CRYPT_SUCCESS); | ||
| 949 | + ASSERT_COMPARE("mac4 cmp", mac, macLen, vecMac->x, vecMac->len); | ||
| 950 | + | ||
| 951 | +EXIT: | ||
| 952 | + CRYPT_EAL_MacFreeCtx(copyCtx3); | ||
| 953 | + CRYPT_EAL_MacFreeCtx(copyCtx2); | ||
| 954 | + CRYPT_EAL_MacFreeCtx(copyCtx1); | ||
| 955 | + CRYPT_EAL_MacFreeCtx(ctx); | ||
| 956 | +} | ||
| 957 | +/* END_CASE */ | ||
| 958 | + | ||
| 959 | +static int32_t TestMacCopyCtxMemCheck(int32_t algId, Hex *key, int isProvider) | ||
| 960 | +{ | ||
| 961 | + CRYPT_EAL_MacCtx *ctxA = NULL; | ||
| 962 | + CRYPT_EAL_MacCtx *ctxB = NULL; | ||
| 963 | + CRYPT_EAL_MacCtx *srcCtx = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 964 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 965 | + /* Set key in srcCtx */ | ||
| 966 | + int32_t ret = CRYPT_EAL_MacInit(srcCtx, key->x, key->len); | ||
| 967 | + if (ret != CRYPT_SUCCESS) { | ||
| 968 | + goto EXIT; | ||
| 969 | + } | ||
| 970 | + | ||
| 971 | + ctxA = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 972 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 973 | + ret = CRYPT_EAL_MacCopyCtx(ctxA, srcCtx); | ||
| 974 | + if (ret != CRYPT_SUCCESS) { | ||
| 975 | + goto EXIT; | ||
| 976 | + } | ||
| 977 | + ctxB = CRYPT_EAL_MacDupCtx(srcCtx); | ||
| 978 | + if (ctxB == NULL) { | ||
| 979 | + ret = CRYPT_MEM_ALLOC_FAIL; | ||
| 980 | + goto EXIT; | ||
| 981 | + } | ||
| 982 | + | ||
| 983 | +EXIT: | ||
| 984 | + CRYPT_EAL_MacFreeCtx(ctxA); | ||
| 985 | + CRYPT_EAL_MacFreeCtx(ctxB); | ||
| 986 | + CRYPT_EAL_MacFreeCtx(srcCtx); | ||
| 987 | + return ret; | ||
| 988 | +} | ||
| 989 | + | ||
| 990 | +/** | ||
| 991 | + * @test SDV_CRYPTO_CBC_MAC_COPY_CTX_STUB_TC001 | ||
| 992 | + * title 1. Test the mac copy context with stub malloc fail | ||
| 993 | + * | ||
| 994 | + */ | ||
| 995 | +/* BEGIN_CASE */ | ||
| 996 | +void SDV_CRYPTO_CMAC_COPY_CTX_STUB_TC001(int algId, Hex *key, int isProvider) | ||
| 997 | +{ | ||
| 998 | + TestMemInit(); | ||
| 999 | + uint32_t totalMallocCount = 0; | ||
| 1000 | + STUB_Init(); | ||
| 1001 | + FuncStubInfo tmpRpInfo = {0}; | ||
| 1002 | + ASSERT_TRUE(STUB_Replace(&tmpRpInfo, BSL_SAL_Malloc, STUB_BSL_SAL_Malloc) == 0); | ||
| 1003 | + | ||
| 1004 | + STUB_EnableMallocFail(false); | ||
| 1005 | + STUB_ResetMallocCount(); | ||
| 1006 | + ASSERT_EQ(TestMacCopyCtxMemCheck((int32_t)algId, key, isProvider), CRYPT_SUCCESS); | ||
| 1007 | + totalMallocCount = STUB_GetMallocCallCount(); | ||
| 1008 | + | ||
| 1009 | + STUB_EnableMallocFail(true); | ||
| 1010 | + for (uint32_t j = 0; j < totalMallocCount; j++) { | ||
| 1011 | + STUB_ResetMallocCount(); | ||
| 1012 | + STUB_SetMallocFailIndex(j); | ||
| 1013 | + ASSERT_NE(TestMacCopyCtxMemCheck((int32_t)algId, key, isProvider), CRYPT_SUCCESS); | ||
| 1014 | + } | ||
| 1015 | + | ||
| 1016 | +EXIT: | ||
| 1017 | + STUB_Reset(&tmpRpInfo); | ||
| 1018 | +} | ||
| 1019 | +/* END_CASE */ | ||
| @@ -216,3 +216,51 @@ SDV_CRYPT_EAL_CMAC_ADDR_NOT_ALIGN_FUNC_TC001:CRYPT_MAC_CMAC_AES256:"000000000000 | |||
| 216 | 216 | ||
| 217 | address misalignment test: CRYPT_MAC_CMAC_SM4 #self generate test data | 217 | address misalignment test: CRYPT_MAC_CMAC_SM4 #self generate test data |
| 218 | SDV_CRYPT_EAL_CMAC_ADDR_NOT_ALIGN_FUNC_TC001:CRYPT_MAC_CMAC_SM4:"00000000000000000000000000000000":"60437d010000000064fafee5787f0000":"623e0dc299d72edad99ed0ba20c13f53" | 218 | SDV_CRYPT_EAL_CMAC_ADDR_NOT_ALIGN_FUNC_TC001:CRYPT_MAC_CMAC_SM4:"00000000000000000000000000000000":"60437d010000000064fafee5787f0000":"623e0dc299d72edad99ed0ba20c13f53" |
| 219 | + | ||
| 220 | +SDV_CRYPTO_CMAC_COPY_CTX_API_TC001 CRYPT_MAC_CMAC_AES256 | ||
| 221 | +SDV_CRYPTO_CMAC_COPY_CTX_API_TC001:CRYPT_MAC_CMAC_AES256:0 | ||
| 222 | + | ||
| 223 | +SDV_CRYPTO_CMAC_COPY_CTX_API_TC001 CRYPT_MAC_CMAC_SM4 | ||
| 224 | +SDV_CRYPTO_CMAC_COPY_CTX_API_TC001:CRYPT_MAC_CMAC_SM4:0 | ||
| 225 | + | ||
| 226 | +SDV_CRYPTO_CMAC_COPY_CTX_API_TC001 CRYPT_MAC_CMAC_AES128 Provider | ||
| 227 | +SDV_CRYPTO_CMAC_COPY_CTX_API_TC001:CRYPT_MAC_CMAC_AES128:1 | ||
| 228 | + | ||
| 229 | +SDV_CRYPTO_CMAC_DUP_CTX_API_TC001 CRYPT_MAC_CMAC_AES256 | ||
| 230 | +SDV_CRYPTO_CMAC_DUP_CTX_API_TC001:CRYPT_MAC_CMAC_AES256:0 | ||
| 231 | + | ||
| 232 | +SDV_CRYPTO_CMAC_DUP_CTX_API_TC001 CRYPT_MAC_CMAC_SM4 | ||
| 233 | +SDV_CRYPTO_CMAC_DUP_CTX_API_TC001:CRYPT_MAC_CMAC_SM4:0 | ||
| 234 | + | ||
| 235 | +SDV_CRYPTO_CMAC_DUP_CTX_API_TC001 CRYPT_MAC_CMAC_AES128 Provider | ||
| 236 | +SDV_CRYPTO_CMAC_DUP_CTX_API_TC001:CRYPT_MAC_CMAC_AES128:1 | ||
| 237 | + | ||
| 238 | +SDV_CRYPT_EAL_CMAC_COPY_CTX_TC001 CRYPT_MAC_CMAC_AES128 | ||
| 239 | +SDV_CRYPT_EAL_CMAC_COPY_CTX_TC001:CRYPT_MAC_CMAC_AES128:"0a00000000000000d71d5e0000000000":"ffffffffffffffffffffffffffffffff":"253d6426be10b0a1c9a010fd7234225f":0 | ||
| 240 | + | ||
| 241 | +SDV_CRYPT_EAL_CMAC_COPY_CTX_TC001 CRYPT_MAC_CMAC_AES192 | ||
| 242 | +SDV_CRYPT_EAL_CMAC_COPY_CTX_TC001:CRYPT_MAC_CMAC_AES192:"ffffffffffffffff642ad2b2c97f00000a00000000000000":"ffffffffffffffffffffffffffffffffffffffffffffffff":"93b892b8f9920688781d48112fa549bf":0 | ||
| 243 | + | ||
| 244 | +SDV_CRYPT_EAL_CMAC_COPY_CTX_TC001 CRYPT_MAC_CMAC_AES256 | ||
| 245 | +SDV_CRYPT_EAL_CMAC_COPY_CTX_TC001:CRYPT_MAC_CMAC_AES256:"ffffffffffffffff642ad2b2c97f00000a00000000000000d71d5e0000000000":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff":"93946d2fb9c4f5d0b3f29baaaf4427b9":0 | ||
| 246 | + | ||
| 247 | +SDV_CRYPT_EAL_CMAC_COPY_CTX_TC001 CRYPT_MAC_CMAC_SM4 | ||
| 248 | +SDV_CRYPT_EAL_CMAC_COPY_CTX_TC001:CRYPT_MAC_CMAC_SM4:"0a00000000000000d71d5e0000000000":"ffffffffffffffffffffffffffffffff":"ce837ff991368d769a3beff3260f32e6":0 | ||
| 249 | + | ||
| 250 | +SDV_CRYPT_EAL_CMAC_COPY_CTX_TC001 CRYPT_MAC_CMAC_AES256 Provider | ||
| 251 | +SDV_CRYPT_EAL_CMAC_COPY_CTX_TC001:CRYPT_MAC_CMAC_AES256:"ffffffffffffffff642ad2b2c97f00000a00000000000000d71d5e0000000000":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff":"93946d2fb9c4f5d0b3f29baaaf4427b9":1 | ||
| 252 | + | ||
| 253 | +SDV_CRYPT_EAL_CMAC_COPY_CTX_TC001 CRYPT_MAC_CMAC_SM4 Provider | ||
| 254 | +SDV_CRYPT_EAL_CMAC_COPY_CTX_TC001:CRYPT_MAC_CMAC_SM4:"0a00000000000000d71d5e0000000000":"ffffffffffffffffffffffffffffffff":"ce837ff991368d769a3beff3260f32e6":1 | ||
| 255 | + | ||
| 256 | +SDV_CRYPTO_CMAC_COPY_CTX_STUB_TC001 | ||
| 257 | +SDV_CRYPTO_CMAC_COPY_CTX_STUB_TC001:CRYPT_MAC_CMAC_AES256:"ffffffffffffffff642ad2b2c97f00000a00000000000000d71d5e0000000000":0 | ||
| 258 | + | ||
| 259 | +SDV_CRYPTO_CMAC_COPY_CTX_STUB_TC001 | ||
| 260 | +SDV_CRYPTO_CMAC_COPY_CTX_STUB_TC001:CRYPT_MAC_CMAC_SM4:"0a00000000000000d71d5e0000000000":0 | ||
| 261 | + | ||
| 262 | +SDV_CRYPTO_CMAC_COPY_CTX_STUB_TC001 Provider | ||
| 263 | +SDV_CRYPTO_CMAC_COPY_CTX_STUB_TC001:CRYPT_MAC_CMAC_AES128:"0a00000000000000d71d5e0000000000":1 | ||
| 264 | + | ||
| 265 | +SDV_CRYPTO_CMAC_COPY_CTX_STUB_TC001 Provider | ||
| 266 | +SDV_CRYPTO_CMAC_COPY_CTX_STUB_TC001:CRYPT_MAC_CMAC_SM4:"0a00000000000000d71d5e0000000000":1 | ||
| @@ -919,7 +919,7 @@ EXIT: | |||
| 919 | 919 | ||
| 920 | static int32_t test = 0; | 920 | static int32_t test = 0; |
| 921 | static int32_t marked = 0; | 921 | static int32_t marked = 0; |
| 922 | -static void *STUB_BSL_SAL_Malloc(uint32_t size) | 922 | +static void *STUB_BSL_SAL_Malloc_cert(uint32_t size) |
| 923 | { | 923 | { |
| 924 | if (marked <= test) { | 924 | if (marked <= test) { |
| 925 | marked++; | 925 | marked++; |
| @@ -959,7 +959,7 @@ void SDV_BSL_ASN1_PARSE_BUFF_STUB_TC001(char *formatStr, char *typeStr, char *pa | |||
| 959 | marked = 0; | 959 | marked = 0; |
| 960 | STUB_Init(); | 960 | STUB_Init(); |
| 961 | FuncStubInfo tmpRpInfo; | 961 | FuncStubInfo tmpRpInfo; |
| 962 | - STUB_Replace(&tmpRpInfo, BSL_SAL_Malloc, STUB_BSL_SAL_Malloc); | 962 | + STUB_Replace(&tmpRpInfo, BSL_SAL_Malloc, STUB_BSL_SAL_Malloc_cert); |
| 963 | for (int i = maxTriggers; i > 0; i--) { | 963 | for (int i = maxTriggers; i > 0; i--) { |
| 964 | marked = 0; | 964 | marked = 0; |
| 965 | test--; | 965 | test--; |
| @@ -23,6 +23,7 @@ | |||
| 23 | #include "crypt_eal_mac.h" | 23 | #include "crypt_eal_mac.h" |
| 24 | #include "bsl_sal.h" | 24 | #include "bsl_sal.h" |
| 25 | #include "eal_mac_local.h" | 25 | #include "eal_mac_local.h" |
| 26 | +#include "stub_replace.h" | ||
| 26 | 27 | ||
| 27 | /* END_HEADER */ | 28 | /* END_HEADER */ |
| 28 | #define GMAC_DEFAULT_TAGLEN 16 | 29 | #define GMAC_DEFAULT_TAGLEN 16 |
| @@ -266,3 +267,151 @@ EXIT: | |||
| 266 | CRYPT_EAL_MacFreeCtx(ctx); | 267 | CRYPT_EAL_MacFreeCtx(ctx); |
| 267 | } | 268 | } |
| 268 | /* END_CASE */ | 269 | /* END_CASE */ |
| 270 | + | ||
| 271 | +/* BEGIN_CASE */ | ||
| 272 | +void SDV_CRYPTO_GMAC_COPY_CTX_API_TC001(int algId, int isProvider) | ||
| 273 | +{ | ||
| 274 | + TestMemInit(); | ||
| 275 | + CRYPT_EAL_MacCtx *ctxA = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 276 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 277 | + ASSERT_TRUE(ctxA != NULL); | ||
| 278 | + | ||
| 279 | + CRYPT_EAL_MacCtx *ctxB = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 280 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 281 | + ASSERT_TRUE(ctxB != NULL); | ||
| 282 | + | ||
| 283 | + CRYPT_EAL_MacCtx ctxC = { 0 }; | ||
| 284 | + | ||
| 285 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(NULL, ctxA), CRYPT_NULL_INPUT); | ||
| 286 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(ctxB, NULL), CRYPT_NULL_INPUT); | ||
| 287 | + // Copy failed because ctxC lacks a method. | ||
| 288 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(ctxB, &ctxC), CRYPT_NULL_INPUT); | ||
| 289 | + | ||
| 290 | + // A directly created context can also be used as the destination for copying. | ||
| 291 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(&ctxC, ctxA), CRYPT_SUCCESS); | ||
| 292 | + ctxC.macMeth->freeCtx(ctxC.ctx); | ||
| 293 | + BSL_SAL_Free(ctxC.macMeth); | ||
| 294 | +EXIT: | ||
| 295 | + CRYPT_EAL_MacFreeCtx(ctxA); | ||
| 296 | + CRYPT_EAL_MacFreeCtx(ctxB); | ||
| 297 | +} | ||
| 298 | +/* END_CASE */ | ||
| 299 | + | ||
| 300 | +/* BEGIN_CASE */ | ||
| 301 | +void SDV_CRYPT_EAL_GMAC_COPY_CTX_TC001(int algId, Hex *key, Hex *iv, Hex *data, Hex *vecMac, int isProvider) | ||
| 302 | +{ | ||
| 303 | + if (IsHmacAlgDisabled(algId)) { | ||
| 304 | + SKIP_TEST(); | ||
| 305 | + } | ||
| 306 | + TestMemInit(); | ||
| 307 | + uint32_t macLen = vecMac->len; | ||
| 308 | + uint8_t mac[64]; | ||
| 309 | + | ||
| 310 | + CRYPT_EAL_MacCtx *copyCtx1 = NULL; | ||
| 311 | + CRYPT_EAL_MacCtx *copyCtx2 = NULL; | ||
| 312 | + CRYPT_EAL_MacCtx *ctx = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 313 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 314 | + ASSERT_TRUE(ctx != NULL); | ||
| 315 | + ASSERT_EQ(CRYPT_EAL_MacInit(ctx, key->x, key->len), CRYPT_SUCCESS); | ||
| 316 | + ASSERT_TRUE(CRYPT_EAL_MacCtrl(ctx, CRYPT_CTRL_SET_IV, iv->x, iv->len) == CRYPT_SUCCESS); | ||
| 317 | + ASSERT_TRUE(CRYPT_EAL_MacCtrl(ctx, CRYPT_CTRL_SET_TAGLEN, &macLen, sizeof(uint32_t)) == CRYPT_SUCCESS); | ||
| 318 | + | ||
| 319 | + copyCtx1 = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 320 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 321 | + ASSERT_TRUE(copyCtx1 != NULL); | ||
| 322 | + copyCtx2 = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 323 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 324 | + ASSERT_TRUE(copyCtx2 != NULL); | ||
| 325 | + | ||
| 326 | + // Test that the copied context functions correctly and is independent of the original context. | ||
| 327 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(copyCtx1, ctx), CRYPT_SUCCESS); | ||
| 328 | + | ||
| 329 | + ASSERT_EQ(CRYPT_EAL_MacUpdate(copyCtx1, data->x, data->len), CRYPT_SUCCESS); | ||
| 330 | + ASSERT_EQ(CRYPT_EAL_MacFinal(copyCtx1, mac, &macLen), CRYPT_SUCCESS); | ||
| 331 | + ASSERT_COMPARE("mac1 cmp", mac, macLen, vecMac->x, vecMac->len); | ||
| 332 | + CRYPT_EAL_MacFreeCtx(copyCtx1); | ||
| 333 | + copyCtx1 = NULL; | ||
| 334 | + | ||
| 335 | + macLen = vecMac->len; | ||
| 336 | + ASSERT_EQ(CRYPT_EAL_MacUpdate(ctx, data->x, data->len), CRYPT_SUCCESS); | ||
| 337 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(copyCtx2, ctx), CRYPT_SUCCESS); | ||
| 338 | + ASSERT_EQ(CRYPT_EAL_MacFinal(ctx, mac, &macLen), CRYPT_SUCCESS); | ||
| 339 | + ASSERT_COMPARE("mac2 cmp", mac, macLen, vecMac->x, vecMac->len); | ||
| 340 | + CRYPT_EAL_MacFreeCtx(ctx); | ||
| 341 | + ctx = NULL; | ||
| 342 | + | ||
| 343 | + macLen = vecMac->len; | ||
| 344 | + ASSERT_EQ(CRYPT_EAL_MacFinal(copyCtx2, mac, &macLen), CRYPT_SUCCESS); | ||
| 345 | + ASSERT_COMPARE("mac3 cmp", mac, macLen, vecMac->x, vecMac->len); | ||
| 346 | + | ||
| 347 | +EXIT: | ||
| 348 | + CRYPT_EAL_MacFreeCtx(copyCtx2); | ||
| 349 | + CRYPT_EAL_MacFreeCtx(copyCtx1); | ||
| 350 | + CRYPT_EAL_MacFreeCtx(ctx); | ||
| 351 | +} | ||
| 352 | +/* END_CASE */ | ||
| 353 | + | ||
| 354 | +static int32_t TestMacCopyCtxMemCheck(int32_t algId, Hex *key, Hex *iv, Hex *vecMac, int isProvider) | ||
| 355 | +{ | ||
| 356 | + CRYPT_EAL_MacCtx *ctxA = NULL; | ||
| 357 | + CRYPT_EAL_MacCtx *ctxB = NULL; | ||
| 358 | + CRYPT_EAL_MacCtx *srcCtx = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 359 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 360 | + /* Set key in srcCtx */ | ||
| 361 | + int32_t ret = CRYPT_EAL_MacInit(srcCtx, key->x, key->len); | ||
| 362 | + if (ret != CRYPT_SUCCESS) { | ||
| 363 | + goto EXIT; | ||
| 364 | + } | ||
| 365 | + uint32_t macLen = vecMac->len; | ||
| 366 | + ASSERT_TRUE(CRYPT_EAL_MacCtrl(srcCtx, CRYPT_CTRL_SET_IV, iv->x, iv->len) == CRYPT_SUCCESS); | ||
| 367 | + ASSERT_TRUE(CRYPT_EAL_MacCtrl(srcCtx, CRYPT_CTRL_SET_TAGLEN, &macLen, sizeof(uint32_t)) == CRYPT_SUCCESS); | ||
| 368 | + | ||
| 369 | + ctxA = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 370 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 371 | + ret = CRYPT_EAL_MacCopyCtx(ctxA, srcCtx); | ||
| 372 | + if (ret != CRYPT_SUCCESS) { | ||
| 373 | + goto EXIT; | ||
| 374 | + } | ||
| 375 | + ctxB = CRYPT_EAL_MacDupCtx(srcCtx); | ||
| 376 | + if (ctxB == NULL) { | ||
| 377 | + ret = CRYPT_MEM_ALLOC_FAIL; | ||
| 378 | + goto EXIT; | ||
| 379 | + } | ||
| 380 | + | ||
| 381 | +EXIT: | ||
| 382 | + CRYPT_EAL_MacFreeCtx(ctxA); | ||
| 383 | + CRYPT_EAL_MacFreeCtx(ctxB); | ||
| 384 | + CRYPT_EAL_MacFreeCtx(srcCtx); | ||
| 385 | + return ret; | ||
| 386 | +} | ||
| 387 | + | ||
| 388 | +/** | ||
| 389 | + * @test SDV_CRYPTO_CBC_MAC_COPY_CTX_STUB_TC001 | ||
| 390 | + * title 1. Test the mac copy context with stub malloc fail | ||
| 391 | + * | ||
| 392 | + */ | ||
| 393 | +/* BEGIN_CASE */ | ||
| 394 | +void SDV_CRYPTO_GMAC_COPY_CTX_STUB_TC001(int algId, Hex *key, Hex *iv, Hex *vecMac, int isProvider) | ||
| 395 | +{ | ||
| 396 | + TestMemInit(); | ||
| 397 | + uint32_t totalMallocCount = 0; | ||
| 398 | + STUB_Init(); | ||
| 399 | + FuncStubInfo tmpRpInfo = {0}; | ||
| 400 | + ASSERT_TRUE(STUB_Replace(&tmpRpInfo, BSL_SAL_Malloc, STUB_BSL_SAL_Malloc) == 0); | ||
| 401 | + | ||
| 402 | + STUB_EnableMallocFail(false); | ||
| 403 | + STUB_ResetMallocCount(); | ||
| 404 | + ASSERT_EQ(TestMacCopyCtxMemCheck((int32_t)algId, key, iv, vecMac, isProvider), CRYPT_SUCCESS); | ||
| 405 | + totalMallocCount = STUB_GetMallocCallCount(); | ||
| 406 | + | ||
| 407 | + STUB_EnableMallocFail(true); | ||
| 408 | + for (uint32_t j = 0; j < totalMallocCount; j++) { | ||
| 409 | + STUB_ResetMallocCount(); | ||
| 410 | + STUB_SetMallocFailIndex(j); | ||
| 411 | + ASSERT_NE(TestMacCopyCtxMemCheck((int32_t)algId, key, iv, vecMac, isProvider), CRYPT_SUCCESS); | ||
| 412 | + } | ||
| 413 | + | ||
| 414 | +EXIT: | ||
| 415 | + STUB_Reset(&tmpRpInfo); | ||
| 416 | +} | ||
| 417 | +/* END_CASE */ | ||
| @@ -51,3 +51,27 @@ SDV_CRYPT_EAL_GMAC_SAMEADDR_FUNC_TC001:CRYPT_MAC_GMAC_AES256:"d437aceaf416d9f4a3 | |||
| 51 | 51 | ||
| 52 | address misalignment test: CRYPT_MAC_GMAC_AES256 | 52 | address misalignment test: CRYPT_MAC_GMAC_AES256 |
| 53 | SDV_CRYPT_EAL_GMAC_ADDR_NOT_ALIGN_FUNC_TC001:CRYPT_MAC_GMAC_AES256:"d437aceaf416d9f4a357850e3e9c6519d1c10fd46bf869100b1781277668ec0e":"cf92aa3963016d33cc7b04a4e5cf1c7fe2394d64d9cd93e781c51adf78f3c1d49f2a971597aaabab9000fadf82b57fa4c9ad46c213672d744edfe36bb19b83f1a0e2b58fe0dd1deef776bf3a74446436ed1d8ff027a3f2e5acc1c6f6946e0563ec741ae20ddf8507bc1ced071e12268d2350d768cd4dea6b0404c2686066a1f8":"cf768eee6d26c9400cb6ca1136a6167a74883fcd":"3b11637f48eff130d1ac076be0" | 53 | SDV_CRYPT_EAL_GMAC_ADDR_NOT_ALIGN_FUNC_TC001:CRYPT_MAC_GMAC_AES256:"d437aceaf416d9f4a357850e3e9c6519d1c10fd46bf869100b1781277668ec0e":"cf92aa3963016d33cc7b04a4e5cf1c7fe2394d64d9cd93e781c51adf78f3c1d49f2a971597aaabab9000fadf82b57fa4c9ad46c213672d744edfe36bb19b83f1a0e2b58fe0dd1deef776bf3a74446436ed1d8ff027a3f2e5acc1c6f6946e0563ec741ae20ddf8507bc1ced071e12268d2350d768cd4dea6b0404c2686066a1f8":"cf768eee6d26c9400cb6ca1136a6167a74883fcd":"3b11637f48eff130d1ac076be0" |
| 54 | + | ||
| 55 | +SDV_CRYPTO_GMAC_COPY_CTX_API_TC001 CRYPT_MAC_GMAC_AES128 | ||
| 56 | +SDV_CRYPTO_GMAC_COPY_CTX_API_TC001:CRYPT_MAC_GMAC_AES128:0 | ||
| 57 | + | ||
| 58 | +SDV_CRYPTO_GMAC_COPY_CTX_API_TC001 CRYPT_MAC_GMAC_AES192 Provider | ||
| 59 | +SDV_CRYPTO_GMAC_COPY_CTX_API_TC001:CRYPT_MAC_GMAC_AES192:1 | ||
| 60 | + | ||
| 61 | +SDV_CRYPT_EAL_GMAC_COPY_CTX_TC001 CRYPT_MAC_GMAC_AES128 | ||
| 62 | +SDV_CRYPT_EAL_GMAC_COPY_CTX_TC001:CRYPT_MAC_GMAC_AES128:"77be63708971c4e240d1cb79e8d77feb":"e0e00f19fed7ba0136a797f3":"7a43ec1d9c0a5a78a0b16533a6213cab":"209fcc8d3675ed938e9c7166709dd946":0 | ||
| 63 | + | ||
| 64 | +SDV_CRYPT_EAL_GMAC_COPY_CTX_TC001 CRYPT_MAC_GMAC_AES192 | ||
| 65 | +SDV_CRYPT_EAL_GMAC_COPY_CTX_TC001:CRYPT_MAC_GMAC_AES192:"31389612d244c9792a510eca3f9c94f9f48c97ed67ae965a":"df6b54ec8b58114df5b09279":"0863bec42ee93385efbec665adfc46dafcd793f29e859e3b531c15b168f1888dd13e905cd7d5bc03f9f1f6495717df62":"77e5682a49243d5b9016eb1adafa2d":0 | ||
| 66 | + | ||
| 67 | +SDV_CRYPT_EAL_GMAC_COPY_CTX_TC001 CRYPT_MAC_GMAC_AES256 | ||
| 68 | +SDV_CRYPT_EAL_GMAC_COPY_CTX_TC001:CRYPT_MAC_GMAC_AES256:"6c78c9585e007ef9841262fa8b042779b05673723ddc5d469d32555104120f67":"a75e955f306f5dd8b9ec39e9":"8cac27e4cc8f7f9dd8d65f845bf8ffd94928cfaa4a80166e5fffbb3835f8892017fc82a3486f7417defed78d6019be6d7cad01e34791c33f453603c5cc2127d79a5cfceb36f1e9a424e9adcc4f6d770fdef3e8694b8a3747bfeb":"61bd5ec2ab58024a145daa2eee":0 | ||
| 69 | + | ||
| 70 | +SDV_CRYPT_EAL_GMAC_COPY_CTX_TC001 CRYPT_MAC_GMAC_AES192 Provider | ||
| 71 | +SDV_CRYPT_EAL_GMAC_COPY_CTX_TC001:CRYPT_MAC_GMAC_AES192:"31389612d244c9792a510eca3f9c94f9f48c97ed67ae965a":"df6b54ec8b58114df5b09279":"0863bec42ee93385efbec665adfc46dafcd793f29e859e3b531c15b168f1888dd13e905cd7d5bc03f9f1f6495717df62":"77e5682a49243d5b9016eb1adafa2d":1 | ||
| 72 | + | ||
| 73 | +SDV_CRYPTO_GMAC_COPY_CTX_STUB_TC001 CRYPT_MAC_GMAC_AES192 | ||
| 74 | +SDV_CRYPTO_GMAC_COPY_CTX_STUB_TC001:CRYPT_MAC_GMAC_AES192:"31389612d244c9792a510eca3f9c94f9f48c97ed67ae965a":"df6b54ec8b58114df5b09279":"77e5682a49243d5b9016eb1adafa2d":0 | ||
| 75 | + | ||
| 76 | +SDV_CRYPTO_GMAC_COPY_CTX_STUB_TC001 CRYPT_MAC_GMAC_AES256 Provider | ||
| 77 | +SDV_CRYPTO_GMAC_COPY_CTX_STUB_TC001:CRYPT_MAC_GMAC_AES256:"6c78c9585e007ef9841262fa8b042779b05673723ddc5d469d32555104120f67":"a75e955f306f5dd8b9ec39e9":"61bd5ec2ab58024a145daa2eee":1 | ||
| @@ -17,15 +17,16 @@ | |||
| 17 | 17 | ||
| 18 | #include "securec.h" | 18 | #include "securec.h" |
| 19 | #include "crypt_eal_kdf.h" | 19 | #include "crypt_eal_kdf.h" |
| 20 | +#include "eal_kdf_local.h" | ||
| 20 | #include "crypt_errno.h" | 21 | #include "crypt_errno.h" |
| 21 | #include "bsl_sal.h" | 22 | #include "bsl_sal.h" |
| 22 | #include "bsl_params.h" | 23 | #include "bsl_params.h" |
| 23 | #include "crypt_params_key.h" | 24 | #include "crypt_params_key.h" |
| 25 | +#include "stub_replace.h" | ||
| 24 | /* END_HEADER */ | 26 | /* END_HEADER */ |
| 25 | 27 | ||
| 26 | #define DATA_LEN (64) | 28 | #define DATA_LEN (64) |
| 27 | 29 | ||
| 28 | - | ||
| 29 | static uint32_t GetMaxKeyLen(int algId) | 30 | static uint32_t GetMaxKeyLen(int algId) |
| 30 | { | 31 | { |
| 31 | switch (algId) { | 32 | switch (algId) { |
| @@ -213,3 +214,300 @@ EXIT: | |||
| 213 | CRYPT_EAL_KdfFreeCtx(ctx); | 214 | CRYPT_EAL_KdfFreeCtx(ctx); |
| 214 | } | 215 | } |
| 215 | /* END_CASE */ | 216 | /* END_CASE */ |
| 217 | + | ||
| 218 | +/* BEGIN_CASE */ | ||
| 219 | +void SDV_CRYPTO_HKDF_COPY_CTX_API_TC001(int isProvider) | ||
| 220 | +{ | ||
| 221 | + TestMemInit(); | ||
| 222 | + CRYPT_EAL_KdfCTX *ctxA = NULL; | ||
| 223 | + CRYPT_EAL_KdfCTX *ctxB = NULL; | ||
| 224 | + CRYPT_EAL_KdfCTX ctxC = { 0 }; | ||
| 225 | + if (isProvider != 0) { | ||
| 226 | + ctxA = CRYPT_EAL_ProviderKdfNewCtx(NULL, CRYPT_KDF_HKDF, "provider=default"); | ||
| 227 | + ctxB = CRYPT_EAL_ProviderKdfNewCtx(NULL, CRYPT_KDF_HKDF, "provider=default"); | ||
| 228 | + } else { | ||
| 229 | + ctxA = CRYPT_EAL_KdfNewCtx(CRYPT_KDF_HKDF); | ||
| 230 | + ctxB = CRYPT_EAL_KdfNewCtx(CRYPT_KDF_HKDF); | ||
| 231 | + } | ||
| 232 | + ASSERT_TRUE(ctxA != NULL); | ||
| 233 | + ASSERT_TRUE(ctxB != NULL); | ||
| 234 | + | ||
| 235 | + ASSERT_EQ(CRYPT_EAL_KdfCopyCtx(NULL, ctxA), CRYPT_NULL_INPUT); | ||
| 236 | + ASSERT_EQ(CRYPT_EAL_KdfCopyCtx(ctxB, NULL), CRYPT_NULL_INPUT); | ||
| 237 | + // Copy failed because ctxC lacks a method. | ||
| 238 | + ASSERT_EQ(CRYPT_EAL_KdfCopyCtx(ctxB, &ctxC), CRYPT_NULL_INPUT); | ||
| 239 | + | ||
| 240 | + // A directly created context can also be used as the destination for copying. | ||
| 241 | + ASSERT_EQ(CRYPT_EAL_KdfCopyCtx(&ctxC, ctxA), CRYPT_SUCCESS); | ||
| 242 | + ctxC.method->freeCtx(ctxC.data); | ||
| 243 | + BSL_SAL_Free(ctxC.method); | ||
| 244 | +EXIT: | ||
| 245 | + CRYPT_EAL_KdfFreeCtx(ctxA); | ||
| 246 | + CRYPT_EAL_KdfFreeCtx(ctxB); | ||
| 247 | +} | ||
| 248 | +/* END_CASE */ | ||
| 249 | + | ||
| 250 | +/* BEGIN_CASE */ | ||
| 251 | +void SDV_CRYPTO_HKDF_DUP_CTX_API_TC001(int isProvider) | ||
| 252 | +{ | ||
| 253 | + TestMemInit(); | ||
| 254 | + CRYPT_EAL_KdfCTX *ctxA = NULL; | ||
| 255 | + CRYPT_EAL_KdfCTX *ctxB = NULL; | ||
| 256 | + CRYPT_EAL_KdfCTX ctxC = { 0 }; | ||
| 257 | + if (isProvider != 0) { | ||
| 258 | + ctxA = CRYPT_EAL_ProviderKdfNewCtx(NULL, CRYPT_KDF_HKDF, "provider=default"); | ||
| 259 | + } else { | ||
| 260 | + ctxA = CRYPT_EAL_KdfNewCtx(CRYPT_KDF_HKDF); | ||
| 261 | + } | ||
| 262 | + ASSERT_TRUE(ctxA != NULL); | ||
| 263 | + | ||
| 264 | + ctxB = CRYPT_EAL_KdfDupCtx(NULL); | ||
| 265 | + ASSERT_TRUE(ctxB == NULL); | ||
| 266 | + ctxB = CRYPT_EAL_KdfDupCtx(&ctxC); | ||
| 267 | + ASSERT_TRUE(ctxB == NULL); | ||
| 268 | + ctxB = CRYPT_EAL_KdfDupCtx(ctxA); | ||
| 269 | + ASSERT_TRUE(ctxB != NULL); | ||
| 270 | + | ||
| 271 | +EXIT: | ||
| 272 | + CRYPT_EAL_KdfFreeCtx(ctxA); | ||
| 273 | + CRYPT_EAL_KdfFreeCtx(ctxB); | ||
| 274 | +} | ||
| 275 | +/* END_CASE */ | ||
| 276 | + | ||
| 277 | +/* BEGIN_CASE */ | ||
| 278 | +void SDV_CRYPTO_HKDF_COPY_CTX_API_TC002(int algId, Hex *key, Hex *salt, Hex *info, int isProvider) | ||
| 279 | +{ | ||
| 280 | + TestMemInit(); | ||
| 281 | + uint32_t tmpLenA = DATA_LEN; | ||
| 282 | + uint8_t tmpBufA[DATA_LEN] = {0}; | ||
| 283 | + uint32_t tmpLenB = DATA_LEN; | ||
| 284 | + uint8_t tmpBufB[DATA_LEN] = {0}; | ||
| 285 | + uint32_t tmpLenC = DATA_LEN; | ||
| 286 | + uint8_t tmpBufC[DATA_LEN] = {0}; | ||
| 287 | + | ||
| 288 | + CRYPT_EAL_KdfCTX *ctxA = NULL; | ||
| 289 | + CRYPT_EAL_KdfCTX *ctxB = NULL; | ||
| 290 | + CRYPT_EAL_KdfCTX *ctxC = NULL; | ||
| 291 | + if (isProvider != 0) { | ||
| 292 | + ctxA = CRYPT_EAL_ProviderKdfNewCtx(NULL, CRYPT_KDF_HKDF, "provider=default"); | ||
| 293 | + ctxB = CRYPT_EAL_ProviderKdfNewCtx(NULL, CRYPT_KDF_HKDF, "provider=default"); | ||
| 294 | + } else { | ||
| 295 | + ctxA = CRYPT_EAL_KdfNewCtx(CRYPT_KDF_HKDF); | ||
| 296 | + ctxB = CRYPT_EAL_KdfNewCtx(CRYPT_KDF_HKDF); | ||
| 297 | + } | ||
| 298 | + ASSERT_TRUE(ctxA != NULL); | ||
| 299 | + ASSERT_TRUE(ctxB != NULL); | ||
| 300 | + | ||
| 301 | + CRYPT_HKDF_MODE mode = CRYPT_KDF_HKDF_MODE_EXTRACT; | ||
| 302 | + BSL_Param params[7] = {{0}, {0}, {0}, {0}, {0}, BSL_PARAM_END}; | ||
| 303 | + int32_t id = (int32_t)algId; | ||
| 304 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[0], CRYPT_PARAM_KDF_MAC_ID, BSL_PARAM_TYPE_UINT32, | ||
| 305 | + &id, sizeof(id)), CRYPT_SUCCESS); | ||
| 306 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[1], CRYPT_PARAM_KDF_MODE, BSL_PARAM_TYPE_UINT32, | ||
| 307 | + &mode, sizeof(mode)), CRYPT_SUCCESS); | ||
| 308 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[2], CRYPT_PARAM_KDF_KEY, BSL_PARAM_TYPE_OCTETS, | ||
| 309 | + key->x, key->len), CRYPT_SUCCESS); | ||
| 310 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[3], CRYPT_PARAM_KDF_SALT, BSL_PARAM_TYPE_OCTETS, | ||
| 311 | + salt->x, salt->len), CRYPT_SUCCESS); | ||
| 312 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[4], CRYPT_PARAM_KDF_INFO, BSL_PARAM_TYPE_OCTETS, | ||
| 313 | + info->x, info->len), CRYPT_SUCCESS); | ||
| 314 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[5], CRYPT_PARAM_KDF_EXLEN, BSL_PARAM_TYPE_UINT32_PTR, | ||
| 315 | + &tmpLenA, sizeof(tmpLenA)), CRYPT_SUCCESS); | ||
| 316 | + | ||
| 317 | + // Set parameters in ctxA, then copy to ctxB | ||
| 318 | + ASSERT_EQ(CRYPT_EAL_KdfSetParam(ctxA, params), CRYPT_SUCCESS); | ||
| 319 | + ASSERT_EQ(CRYPT_EAL_KdfCopyCtx(ctxB, ctxA), CRYPT_SUCCESS); | ||
| 320 | + ctxC = CRYPT_EAL_KdfDupCtx(ctxA); | ||
| 321 | + ASSERT_TRUE(ctxC != NULL); | ||
| 322 | + | ||
| 323 | + // Key derivation fails in ctxB due to unset tmpBuf length | ||
| 324 | + ASSERT_EQ(CRYPT_EAL_KdfDerive(ctxA, tmpBufA, 0), CRYPT_SUCCESS); | ||
| 325 | + ASSERT_EQ(CRYPT_EAL_KdfDerive(ctxB, tmpBufB, 0), CRYPT_NULL_INPUT); | ||
| 326 | + ASSERT_EQ(CRYPT_EAL_KdfDerive(ctxC, tmpBufC, 0), CRYPT_NULL_INPUT); | ||
| 327 | + | ||
| 328 | + // After setting ctxB's length, redo key derivation and compare results (should match) | ||
| 329 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[0], CRYPT_PARAM_KDF_EXLEN, BSL_PARAM_TYPE_UINT32_PTR, | ||
| 330 | + &tmpLenB, sizeof(tmpLenB)), CRYPT_SUCCESS); | ||
| 331 | + (void)memset_s(¶ms[1], sizeof(BSL_Param), 0, sizeof(BSL_Param)); | ||
| 332 | + ASSERT_EQ(CRYPT_EAL_KdfSetParam(ctxB, params), CRYPT_SUCCESS); | ||
| 333 | + ASSERT_EQ(CRYPT_EAL_KdfDerive(ctxB, tmpBufB, 0), CRYPT_SUCCESS); | ||
| 334 | + ASSERT_COMPARE("result cmp", tmpBufA, tmpLenA, tmpBufB, tmpLenB); | ||
| 335 | + | ||
| 336 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[0], CRYPT_PARAM_KDF_EXLEN, BSL_PARAM_TYPE_UINT32_PTR, | ||
| 337 | + &tmpLenC, sizeof(tmpLenC)), CRYPT_SUCCESS); | ||
| 338 | + ASSERT_EQ(CRYPT_EAL_KdfSetParam(ctxC, params), CRYPT_SUCCESS); | ||
| 339 | + ASSERT_EQ(CRYPT_EAL_KdfDerive(ctxC, tmpBufC, 0), CRYPT_SUCCESS); | ||
| 340 | + ASSERT_COMPARE("result cmp", tmpBufA, tmpLenA, tmpBufC, tmpLenC); | ||
| 341 | + | ||
| 342 | +EXIT: | ||
| 343 | + CRYPT_EAL_KdfFreeCtx(ctxA); | ||
| 344 | + CRYPT_EAL_KdfFreeCtx(ctxB); | ||
| 345 | + CRYPT_EAL_KdfFreeCtx(ctxC); | ||
| 346 | +} | ||
| 347 | +/* END_CASE */ | ||
| 348 | + | ||
| 349 | +/* BEGIN_CASE */ | ||
| 350 | +void SDV_CRYPT_EAL_HKDF_COPY_CTX_FUNC_TC001(int algId, Hex *key, Hex *salt, Hex *info, Hex *result, int isProvider) | ||
| 351 | +{ | ||
| 352 | + if (IsHmacAlgDisabled(algId)) { | ||
| 353 | + SKIP_TEST(); | ||
| 354 | + } | ||
| 355 | + TestMemInit(); | ||
| 356 | + uint32_t outLen = result->len; | ||
| 357 | + uint8_t *out = BSL_SAL_Malloc(outLen * sizeof(uint8_t)); | ||
| 358 | + ASSERT_TRUE(out != NULL); | ||
| 359 | + | ||
| 360 | + CRYPT_EAL_KdfCTX *ctx = NULL; | ||
| 361 | + CRYPT_EAL_KdfCTX *copyCtx = NULL; | ||
| 362 | + CRYPT_EAL_KdfCTX *copyCtx1 = NULL; | ||
| 363 | + CRYPT_EAL_KdfCTX *copyCtx2 = NULL; | ||
| 364 | + CRYPT_EAL_KdfCTX *copyCtx3 = NULL; | ||
| 365 | + if (isProvider != 0) { | ||
| 366 | + ctx = CRYPT_EAL_ProviderKdfNewCtx(NULL, CRYPT_KDF_HKDF, "provider=default"); | ||
| 367 | + copyCtx = CRYPT_EAL_ProviderKdfNewCtx(NULL, CRYPT_KDF_HKDF, "provider=default"); | ||
| 368 | + copyCtx1 = CRYPT_EAL_ProviderKdfNewCtx(NULL, CRYPT_KDF_HKDF, "provider=default"); | ||
| 369 | + copyCtx2 = CRYPT_EAL_ProviderKdfNewCtx(NULL, CRYPT_KDF_HKDF, "provider=default"); | ||
| 370 | + } else { | ||
| 371 | + ctx = CRYPT_EAL_KdfNewCtx(CRYPT_KDF_HKDF); | ||
| 372 | + copyCtx = CRYPT_EAL_KdfNewCtx(CRYPT_KDF_HKDF); | ||
| 373 | + copyCtx1 = CRYPT_EAL_KdfNewCtx(CRYPT_KDF_HKDF); | ||
| 374 | + copyCtx2 = CRYPT_EAL_KdfNewCtx(CRYPT_KDF_HKDF); | ||
| 375 | + } | ||
| 376 | + ASSERT_TRUE(ctx != NULL); | ||
| 377 | + ASSERT_TRUE(copyCtx != NULL); | ||
| 378 | + ASSERT_TRUE(copyCtx1 != NULL); | ||
| 379 | + ASSERT_TRUE(copyCtx2 != NULL); | ||
| 380 | + | ||
| 381 | + ASSERT_EQ(CRYPT_EAL_KdfCopyCtx(copyCtx, ctx), CRYPT_SUCCESS); | ||
| 382 | + CRYPT_HKDF_MODE mode = CRYPT_KDF_HKDF_MODE_FULL; | ||
| 383 | + BSL_Param params[6] = {{0}, {0}, {0}, {0}, {0}, BSL_PARAM_END}; | ||
| 384 | + int32_t id = (int32_t)algId; | ||
| 385 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[0], CRYPT_PARAM_KDF_MAC_ID, BSL_PARAM_TYPE_UINT32, | ||
| 386 | + &id, sizeof(id)), CRYPT_SUCCESS); | ||
| 387 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[1], CRYPT_PARAM_KDF_MODE, BSL_PARAM_TYPE_UINT32, | ||
| 388 | + &mode, sizeof(mode)), CRYPT_SUCCESS); | ||
| 389 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[2], CRYPT_PARAM_KDF_KEY, BSL_PARAM_TYPE_OCTETS, | ||
| 390 | + key->x, key->len), CRYPT_SUCCESS); | ||
| 391 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[3], CRYPT_PARAM_KDF_SALT, BSL_PARAM_TYPE_OCTETS, | ||
| 392 | + salt->x, salt->len), CRYPT_SUCCESS); | ||
| 393 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[4], CRYPT_PARAM_KDF_INFO, BSL_PARAM_TYPE_OCTETS, | ||
| 394 | + info->x, info->len), CRYPT_SUCCESS); | ||
| 395 | + ASSERT_EQ(CRYPT_EAL_KdfSetParam(ctx, params), CRYPT_SUCCESS); | ||
| 396 | + ASSERT_EQ(CRYPT_EAL_KdfSetParam(copyCtx, params), CRYPT_SUCCESS); | ||
| 397 | + | ||
| 398 | + ASSERT_EQ(CRYPT_EAL_KdfCopyCtx(copyCtx1, ctx), CRYPT_SUCCESS); | ||
| 399 | + ASSERT_EQ(CRYPT_EAL_KdfCopyCtx(copyCtx2, ctx), CRYPT_SUCCESS); | ||
| 400 | + | ||
| 401 | + ASSERT_EQ(CRYPT_EAL_KdfDerive(copyCtx, out, outLen), CRYPT_SUCCESS); | ||
| 402 | + ASSERT_COMPARE("result1 cmp", out, outLen, result->x, result->len); | ||
| 403 | + (void)memset_s(out, outLen, 0, outLen); | ||
| 404 | + CRYPT_EAL_KdfFreeCtx(copyCtx); | ||
| 405 | + copyCtx = NULL; | ||
| 406 | + | ||
| 407 | + ASSERT_EQ(CRYPT_EAL_KdfDerive(copyCtx1, out, outLen), CRYPT_SUCCESS); | ||
| 408 | + ASSERT_COMPARE("result2 cmp", out, outLen, result->x, result->len); | ||
| 409 | + (void)memset_s(out, outLen, 0, outLen); | ||
| 410 | + CRYPT_EAL_KdfFreeCtx(copyCtx1); | ||
| 411 | + copyCtx1 = NULL; | ||
| 412 | + | ||
| 413 | + copyCtx3 = CRYPT_EAL_KdfDupCtx(ctx); | ||
| 414 | + ASSERT_TRUE(copyCtx3 != NULL); | ||
| 415 | + ASSERT_EQ(CRYPT_EAL_KdfDerive(copyCtx3, out, outLen), CRYPT_SUCCESS); | ||
| 416 | + ASSERT_COMPARE("result3 cmp", out, outLen, result->x, result->len); | ||
| 417 | + (void)memset_s(out, outLen, 0, outLen); | ||
| 418 | + CRYPT_EAL_KdfFreeCtx(copyCtx3); | ||
| 419 | + copyCtx3 = NULL; | ||
| 420 | + | ||
| 421 | + ASSERT_EQ(CRYPT_EAL_KdfDerive(ctx, out, outLen), CRYPT_SUCCESS); | ||
| 422 | + ASSERT_COMPARE("result4 cmp", out, outLen, result->x, result->len); | ||
| 423 | + (void)memset_s(out, outLen, 0, outLen); | ||
| 424 | + CRYPT_EAL_KdfFreeCtx(ctx); | ||
| 425 | + ctx = NULL; | ||
| 426 | + | ||
| 427 | + ASSERT_EQ(CRYPT_EAL_KdfDerive(copyCtx2, out, outLen), CRYPT_SUCCESS); | ||
| 428 | + ASSERT_COMPARE("result5 cmp", out, outLen, result->x, result->len); | ||
| 429 | +EXIT: | ||
| 430 | + BSL_SAL_Free(out); | ||
| 431 | + CRYPT_EAL_KdfFreeCtx(ctx); | ||
| 432 | + CRYPT_EAL_KdfFreeCtx(copyCtx); | ||
| 433 | + CRYPT_EAL_KdfFreeCtx(copyCtx1); | ||
| 434 | + CRYPT_EAL_KdfFreeCtx(copyCtx2); | ||
| 435 | +} | ||
| 436 | +/* END_CASE */ | ||
| 437 | + | ||
| 438 | +static int32_t TestKdfCopyCtxMemCheck(int32_t algId, Hex *key, Hex *salt, Hex *info, int isProvider) | ||
| 439 | +{ | ||
| 440 | + CRYPT_EAL_KdfCTX *ctxA = NULL; | ||
| 441 | + CRYPT_EAL_KdfCTX *ctxB = NULL; | ||
| 442 | + CRYPT_EAL_KdfCTX *srcCtx = NULL; | ||
| 443 | + if (isProvider != 0) { | ||
| 444 | + srcCtx = CRYPT_EAL_ProviderKdfNewCtx(NULL, CRYPT_KDF_HKDF, "provider=default"); | ||
| 445 | + ctxA = CRYPT_EAL_ProviderKdfNewCtx(NULL, CRYPT_KDF_HKDF, "provider=default"); | ||
| 446 | + } else { | ||
| 447 | + srcCtx = CRYPT_EAL_KdfNewCtx(CRYPT_KDF_HKDF); | ||
| 448 | + ctxA = CRYPT_EAL_KdfNewCtx(CRYPT_KDF_HKDF); | ||
| 449 | + } | ||
| 450 | + CRYPT_HKDF_MODE mode = CRYPT_KDF_HKDF_MODE_FULL; | ||
| 451 | + BSL_Param params[6] = {{0}, {0}, {0}, {0}, {0}, BSL_PARAM_END}; | ||
| 452 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[0], CRYPT_PARAM_KDF_MAC_ID, BSL_PARAM_TYPE_UINT32, | ||
| 453 | + &algId, sizeof(algId)), CRYPT_SUCCESS); | ||
| 454 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[1], CRYPT_PARAM_KDF_MODE, BSL_PARAM_TYPE_UINT32, | ||
| 455 | + &mode, sizeof(mode)), CRYPT_SUCCESS); | ||
| 456 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[2], CRYPT_PARAM_KDF_KEY, BSL_PARAM_TYPE_OCTETS, | ||
| 457 | + key->x, key->len), CRYPT_SUCCESS); | ||
| 458 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[3], CRYPT_PARAM_KDF_SALT, BSL_PARAM_TYPE_OCTETS, | ||
| 459 | + salt->x, salt->len), CRYPT_SUCCESS); | ||
| 460 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[4], CRYPT_PARAM_KDF_INFO, BSL_PARAM_TYPE_OCTETS, | ||
| 461 | + info->x, info->len), CRYPT_SUCCESS); | ||
| 462 | + int32_t ret = CRYPT_EAL_KdfSetParam(srcCtx, params); | ||
| 463 | + if (ret != CRYPT_SUCCESS) { | ||
| 464 | + goto EXIT; | ||
| 465 | + } | ||
| 466 | + | ||
| 467 | + ret = CRYPT_EAL_KdfCopyCtx(ctxA, srcCtx); | ||
| 468 | + if (ret != CRYPT_SUCCESS) { | ||
| 469 | + goto EXIT; | ||
| 470 | + } | ||
| 471 | + ctxB = CRYPT_EAL_KdfDupCtx(srcCtx); | ||
| 472 | + if (ctxB == NULL) { | ||
| 473 | + ret = CRYPT_MEM_ALLOC_FAIL; | ||
| 474 | + goto EXIT; | ||
| 475 | + } | ||
| 476 | +EXIT: | ||
| 477 | + CRYPT_EAL_KdfFreeCtx(ctxA); | ||
| 478 | + CRYPT_EAL_KdfFreeCtx(ctxB); | ||
| 479 | + CRYPT_EAL_KdfFreeCtx(srcCtx); | ||
| 480 | + return ret; | ||
| 481 | +} | ||
| 482 | + | ||
| 483 | +/** | ||
| 484 | + * @test SDV_CRYPTO_HKDF_COPY_CTX_STUB_TC001 | ||
| 485 | + * title 1. Test the kdf copy context with stub malloc fail | ||
| 486 | + * | ||
| 487 | + */ | ||
| 488 | +/* BEGIN_CASE */ | ||
| 489 | +void SDV_CRYPTO_HKDF_COPY_CTX_STUB_TC001(int algId, Hex *key, Hex *salt, Hex *info, int isProvider) | ||
| 490 | +{ | ||
| 491 | + TestMemInit(); | ||
| 492 | + uint32_t totalMallocCount = 0; | ||
| 493 | + STUB_Init(); | ||
| 494 | + FuncStubInfo tmpRpInfo = {0}; | ||
| 495 | + ASSERT_TRUE(STUB_Replace(&tmpRpInfo, BSL_SAL_Malloc, STUB_BSL_SAL_Malloc) == 0); | ||
| 496 | + | ||
| 497 | + STUB_EnableMallocFail(false); | ||
| 498 | + STUB_ResetMallocCount(); | ||
| 499 | + ASSERT_EQ(TestKdfCopyCtxMemCheck((int32_t)algId, key, salt, info, isProvider), CRYPT_SUCCESS); | ||
| 500 | + totalMallocCount = STUB_GetMallocCallCount(); | ||
| 501 | + | ||
| 502 | + STUB_EnableMallocFail(true); | ||
| 503 | + for (uint32_t j = 0; j < totalMallocCount; j++) | ||
| 504 | + { | ||
| 505 | + STUB_ResetMallocCount(); | ||
| 506 | + STUB_SetMallocFailIndex(j); | ||
| 507 | + ASSERT_NE(TestKdfCopyCtxMemCheck((int32_t)algId, key, salt, info, isProvider), CRYPT_SUCCESS); | ||
| 508 | + } | ||
| 509 | + | ||
| 510 | +EXIT: | ||
| 511 | + STUB_Reset(&tmpRpInfo); | ||
| 512 | +} | ||
| 513 | +/* END_CASE */ | ||
| @@ -39,3 +39,45 @@ SDV_CRYPT_EAL_KDF_HKDF_FUN_TC001:CRYPT_MAC_HMAC_MD5:"000000000000000000000000000 | |||
| 39 | 39 | ||
| 40 | SDV_CRYPTO_HKDF_DEFAULT_PROVIDER_FUNC_TC001 default provider | 40 | SDV_CRYPTO_HKDF_DEFAULT_PROVIDER_FUNC_TC001 default provider |
| 41 | SDV_CRYPTO_HKDF_DEFAULT_PROVIDER_FUNC_TC001:CRYPT_MAC_HMAC_SHA1:"0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c":"":"":"2c91117204d745f3500d636a62f64f0ab3bae548aa53d423b0d1f27ebba6f5e5673a081d70cce7acfc48" | 41 | SDV_CRYPTO_HKDF_DEFAULT_PROVIDER_FUNC_TC001:CRYPT_MAC_HMAC_SHA1:"0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c":"":"":"2c91117204d745f3500d636a62f64f0ab3bae548aa53d423b0d1f27ebba6f5e5673a081d70cce7acfc48" |
| 42 | + | ||
| 43 | +SDV_CRYPTO_HKDF_COPY_CTX_API_TC001 | ||
| 44 | +SDV_CRYPTO_HKDF_COPY_CTX_API_TC001:0 | ||
| 45 | + | ||
| 46 | +SDV_CRYPTO_HKDF_COPY_CTX_API_TC001 Provider | ||
| 47 | +SDV_CRYPTO_HKDF_COPY_CTX_API_TC001:1 | ||
| 48 | + | ||
| 49 | +SDV_CRYPTO_HKDF_DUP_CTX_API_TC001 | ||
| 50 | +SDV_CRYPTO_HKDF_DUP_CTX_API_TC001:0 | ||
| 51 | + | ||
| 52 | +SDV_CRYPTO_HKDF_DUP_CTX_API_TC001 Provider | ||
| 53 | +SDV_CRYPTO_HKDF_DUP_CTX_API_TC001:1 | ||
| 54 | + | ||
| 55 | +SDV_CRYPTO_HKDF_COPY_CTX_API_TC002 CRYPT_MAC_HMAC_SHA1 Provider | ||
| 56 | +SDV_CRYPTO_HKDF_COPY_CTX_API_TC002:CRYPT_MAC_HMAC_SHA1:"0b0b0b0b0b0b0b0b0b0b0b":"000102030405060708090a0b0c":"f0f1f2f3f4f5f6f7f8f9":1 | ||
| 57 | + | ||
| 58 | +SDV_CRYPTO_HKDF_COPY_CTX_API_TC002 CRYPT_MAC_HMAC_SHA256 | ||
| 59 | +SDV_CRYPTO_HKDF_COPY_CTX_API_TC002:CRYPT_MAC_HMAC_SHA256:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":"000102030405060708090a0b0c":"f0f1f2f3f4f5f6f7f8f9":0 | ||
| 60 | + | ||
| 61 | +SDV_CRYPT_EAL_HKDF_COPY_CTX_FUNC_TC001 CRYPT_MAC_HMAC_MD5 | ||
| 62 | +SDV_CRYPT_EAL_HKDF_COPY_CTX_FUNC_TC001:CRYPT_MAC_HMAC_MD5:"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000":"dd30769c87c8094d9b44e3c1aa0020c0f6966a72b8fd4340fb5c29d2eddf2b7ebc56e91ef18fc193f39f6c73fae03c283e1def62d5ceeb45f1c08c7e51ecce73":"cb6c6721b590d0f2790236b76fb238b55807b75a12578610792d33162d20dbd5dbc69439e330c80251b5d625b8698f16c241116a1f18b7691232e52b664ddcea":"9274b590e6cd99a07a9c6fdfe2aff0b2f1f3947c40c4384e2afd1b2b71dcb1c2267342fc5f34be683dab27d62a1424b4c44587ada53b1ebce237991ef4c432c0":0 | ||
| 63 | + | ||
| 64 | +SDV_CRYPT_EAL_HKDF_COPY_CTX_FUNC_TC001 CRYPT_MAC_HMAC_SHA1 | ||
| 65 | +SDV_CRYPT_EAL_HKDF_COPY_CTX_FUNC_TC001:CRYPT_MAC_HMAC_SHA1:"0b0b0b0b0b0b0b0b0b0b0b":"000102030405060708090a0b0c":"f0f1f2f3f4f5f6f7f8f9":"085a01ea1b10f36933068b56efa5ad81a4f14b822f5b091568a9cdd4f155fda2c22e422478d305f3f896":0 | ||
| 66 | + | ||
| 67 | +SDV_CRYPT_EAL_HKDF_COPY_CTX_FUNC_TC001 CRYPT_MAC_HMAC_SHA256 | ||
| 68 | +SDV_CRYPT_EAL_HKDF_COPY_CTX_FUNC_TC001:CRYPT_MAC_HMAC_SHA256:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":"000102030405060708090a0b0c":"f0f1f2f3f4f5f6f7f8f9":"3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865":0 | ||
| 69 | + | ||
| 70 | +SDV_CRYPT_EAL_HKDF_COPY_CTX_FUNC_TC001 CRYPT_MAC_HMAC_SHA1 Provider | ||
| 71 | +SDV_CRYPT_EAL_HKDF_COPY_CTX_FUNC_TC001:CRYPT_MAC_HMAC_SHA1:"0b0b0b0b0b0b0b0b0b0b0b":"000102030405060708090a0b0c":"f0f1f2f3f4f5f6f7f8f9":"085a01ea1b10f36933068b56efa5ad81a4f14b822f5b091568a9cdd4f155fda2c22e422478d305f3f896":1 | ||
| 72 | + | ||
| 73 | +SDV_CRYPT_EAL_HKDF_COPY_CTX_FUNC_TC001 CRYPT_MAC_HMAC_SHA256 Provider | ||
| 74 | +SDV_CRYPT_EAL_HKDF_COPY_CTX_FUNC_TC001:CRYPT_MAC_HMAC_SHA256:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":"000102030405060708090a0b0c":"f0f1f2f3f4f5f6f7f8f9":"3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865":1 | ||
| 75 | + | ||
| 76 | +SDV_CRYPTO_HKDF_COPY_CTX_STUB_TC001 CRYPT_MAC_HMAC_MD5 | ||
| 77 | +SDV_CRYPTO_HKDF_COPY_CTX_STUB_TC001:CRYPT_MAC_HMAC_MD5:"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000":"dd30769c87c8094d9b44e3c1aa0020c0f6966a72b8fd4340fb5c29d2eddf2b7ebc56e91ef18fc193f39f6c73fae03c283e1def62d5ceeb45f1c08c7e51ecce73":"cb6c6721b590d0f2790236b76fb238b55807b75a12578610792d33162d20dbd5dbc69439e330c80251b5d625b8698f16c241116a1f18b7691232e52b664ddcea":0 | ||
| 78 | + | ||
| 79 | +SDV_CRYPTO_HKDF_COPY_CTX_STUB_TC001 CRYPT_MAC_HMAC_SHA1 | ||
| 80 | +SDV_CRYPTO_HKDF_COPY_CTX_STUB_TC001:CRYPT_MAC_HMAC_SHA1:"0b0b0b0b0b0b0b0b0b0b0b":"000102030405060708090a0b0c":"f0f1f2f3f4f5f6f7f8f9":0 | ||
| 81 | + | ||
| 82 | +SDV_CRYPTO_HKDF_COPY_CTX_STUB_TC001 CRYPT_MAC_HMAC_SHA256 Provider | ||
| 83 | +SDV_CRYPTO_HKDF_COPY_CTX_STUB_TC001:CRYPT_MAC_HMAC_SHA256:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":"000102030405060708090a0b0c":"f0f1f2f3f4f5f6f7f8f9":1 | ||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <pthread.h> | 16 | #include <pthread.h> |
| 17 | #include "securec.h" | 17 | #include "securec.h" |
| 18 | #include "crypt_eal_mac.h" | 18 | #include "crypt_eal_mac.h" |
| 19 | +#include "eal_mac_local.h" | ||
| 19 | #include "crypt_errno.h" | 20 | #include "crypt_errno.h" |
| 20 | #include "bsl_sal.h" | 21 | #include "bsl_sal.h" |
| 21 | #include "crypt_sha1.h" | 22 | #include "crypt_sha1.h" |
| @@ -23,6 +24,7 @@ | |||
| 23 | #include "crypt_sha3.h" | 24 | #include "crypt_sha3.h" |
| 24 | #include "crypt_sm3.h" | 25 | #include "crypt_sm3.h" |
| 25 | #include "crypt_md5.h" | 26 | #include "crypt_md5.h" |
| 27 | +#include "stub_replace.h" | ||
| 26 | 28 | ||
| 27 | #define TEST_FAIL (-1) | 29 | #define TEST_FAIL (-1) |
| 28 | #define TEST_SUCCESS (0) | 30 | #define TEST_SUCCESS (0) |
| @@ -460,3 +460,177 @@ EXIT: | |||
| 460 | BSL_SAL_FREE(mac); | 460 | BSL_SAL_FREE(mac); |
| 461 | } | 461 | } |
| 462 | /* END_CASE */ | 462 | /* END_CASE */ |
| 463 | + | ||
| 464 | +/* BEGIN_CASE */ | ||
| 465 | +void SDV_CRYPTO_HMAC_COPY_CTX_API_TC001(int algId, int isProvider) | ||
| 466 | +{ | ||
| 467 | + TestMemInit(); | ||
| 468 | + CRYPT_EAL_MacCtx *ctxB = NULL; | ||
| 469 | + CRYPT_EAL_MacCtx ctxC = { 0 }; | ||
| 470 | + CRYPT_EAL_MacCtx *ctxA = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 471 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 472 | + ASSERT_TRUE(ctxA != NULL); | ||
| 473 | + | ||
| 474 | + ctxB = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 475 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 476 | + ASSERT_TRUE(ctxB != NULL); | ||
| 477 | + | ||
| 478 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(NULL, ctxA), CRYPT_NULL_INPUT); | ||
| 479 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(ctxB, NULL), CRYPT_NULL_INPUT); | ||
| 480 | + // Copy failed because ctxC lacks a method. | ||
| 481 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(ctxB, &ctxC), CRYPT_NULL_INPUT); | ||
| 482 | + | ||
| 483 | + // A directly created context can also be used as the destination for copying. | ||
| 484 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(&ctxC, ctxA), CRYPT_SUCCESS); | ||
| 485 | + ctxC.macMeth->freeCtx(ctxC.ctx); | ||
| 486 | + BSL_SAL_Free(ctxC.macMeth); | ||
| 487 | +EXIT: | ||
| 488 | + CRYPT_EAL_MacFreeCtx(ctxA); | ||
| 489 | + CRYPT_EAL_MacFreeCtx(ctxB); | ||
| 490 | +} | ||
| 491 | +/* END_CASE */ | ||
| 492 | + | ||
| 493 | +/* BEGIN_CASE */ | ||
| 494 | +void SDV_CRYPTO_HMAC_DUP_CTX_API_TC001(int algId, int isProvider) | ||
| 495 | +{ | ||
| 496 | + TestMemInit(); | ||
| 497 | + CRYPT_EAL_MacCtx *ctxB = NULL; | ||
| 498 | + CRYPT_EAL_MacCtx ctxC = { 0 }; | ||
| 499 | + CRYPT_EAL_MacCtx *ctxA = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 500 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 501 | + ASSERT_TRUE(ctxA != NULL); | ||
| 502 | + | ||
| 503 | + ctxB = CRYPT_EAL_MacDupCtx(NULL); | ||
| 504 | + ASSERT_TRUE(ctxB == NULL); | ||
| 505 | + ctxB = CRYPT_EAL_MacDupCtx(&ctxC); | ||
| 506 | + ASSERT_TRUE(ctxB == NULL); | ||
| 507 | + ctxB = CRYPT_EAL_MacDupCtx(ctxA); | ||
| 508 | + ASSERT_TRUE(ctxB != NULL); | ||
| 509 | + | ||
| 510 | +EXIT: | ||
| 511 | + CRYPT_EAL_MacFreeCtx(ctxA); | ||
| 512 | + CRYPT_EAL_MacFreeCtx(ctxB); | ||
| 513 | +} | ||
| 514 | +/* END_CASE */ | ||
| 515 | + | ||
| 516 | +/* BEGIN_CASE */ | ||
| 517 | +void SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001(int algId, Hex *key, Hex *data, Hex *vecMac, int isProvider) | ||
| 518 | +{ | ||
| 519 | + if (IsHmacAlgDisabled(algId)) { | ||
| 520 | + SKIP_TEST(); | ||
| 521 | + } | ||
| 522 | + TestMemInit(); | ||
| 523 | + uint32_t macLen = GetMacLen(algId); | ||
| 524 | + uint8_t mac[64]; | ||
| 525 | + | ||
| 526 | + CRYPT_EAL_MacCtx *copyCtx1 = NULL; | ||
| 527 | + CRYPT_EAL_MacCtx *copyCtx2 = NULL; | ||
| 528 | + CRYPT_EAL_MacCtx *copyCtx3 = NULL; | ||
| 529 | + CRYPT_EAL_MacCtx *ctx = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 530 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 531 | + ASSERT_TRUE(ctx != NULL); | ||
| 532 | + ASSERT_EQ(CRYPT_EAL_MacInit(ctx, key->x, key->len), CRYPT_SUCCESS); | ||
| 533 | + | ||
| 534 | + copyCtx1 = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 535 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 536 | + ASSERT_TRUE(copyCtx1 != NULL); | ||
| 537 | + copyCtx2 = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 538 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 539 | + ASSERT_TRUE(copyCtx2 != NULL); | ||
| 540 | + | ||
| 541 | + // Test that the copied context functions correctly and is independent of the original context. | ||
| 542 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(copyCtx1, ctx), CRYPT_SUCCESS); | ||
| 543 | + ASSERT_EQ(CRYPT_EAL_MacUpdate(copyCtx1, data->x, data->len), CRYPT_SUCCESS); | ||
| 544 | + ASSERT_EQ(CRYPT_EAL_MacFinal(copyCtx1, mac, &macLen), CRYPT_SUCCESS); | ||
| 545 | + ASSERT_COMPARE("mac1 cmp", mac, macLen, vecMac->x, vecMac->len); | ||
| 546 | + CRYPT_EAL_MacFreeCtx(copyCtx1); | ||
| 547 | + copyCtx1 = NULL; | ||
| 548 | + | ||
| 549 | + // Create a new copyCtx3 from ctx, use copyCtx3 for encryption, and verify functional correctness. | ||
| 550 | + copyCtx3 = CRYPT_EAL_MacDupCtx(ctx); | ||
| 551 | + ASSERT_EQ(CRYPT_EAL_MacUpdate(copyCtx3, data->x, data->len), CRYPT_SUCCESS); | ||
| 552 | + ASSERT_EQ(CRYPT_EAL_MacFinal(copyCtx3, mac, &macLen), CRYPT_SUCCESS); | ||
| 553 | + ASSERT_COMPARE("mac2 cmp", mac, macLen, vecMac->x, vecMac->len); | ||
| 554 | + CRYPT_EAL_MacFreeCtx(copyCtx3); | ||
| 555 | + copyCtx3 = NULL; | ||
| 556 | + | ||
| 557 | + macLen = GetMacLen(algId); | ||
| 558 | + ASSERT_EQ(CRYPT_EAL_MacUpdate(ctx, data->x, data->len), CRYPT_SUCCESS); | ||
| 559 | + ASSERT_EQ(CRYPT_EAL_MacCopyCtx(copyCtx2, ctx), CRYPT_SUCCESS); | ||
| 560 | + ASSERT_EQ(CRYPT_EAL_MacFinal(ctx, mac, &macLen), CRYPT_SUCCESS); | ||
| 561 | + ASSERT_COMPARE("mac3 cmp", mac, macLen, vecMac->x, vecMac->len); | ||
| 562 | + CRYPT_EAL_MacFreeCtx(ctx); | ||
| 563 | + ctx = NULL; | ||
| 564 | + | ||
| 565 | + macLen = vecMac->len; | ||
| 566 | + ASSERT_EQ(CRYPT_EAL_MacFinal(copyCtx2, mac, &macLen), CRYPT_SUCCESS); | ||
| 567 | + ASSERT_COMPARE("mac4 cmp", mac, macLen, vecMac->x, vecMac->len); | ||
| 568 | + | ||
| 569 | +EXIT: | ||
| 570 | + CRYPT_EAL_MacFreeCtx(copyCtx2); | ||
| 571 | + CRYPT_EAL_MacFreeCtx(copyCtx1); | ||
| 572 | + CRYPT_EAL_MacFreeCtx(ctx); | ||
| 573 | +} | ||
| 574 | +/* END_CASE */ | ||
| 575 | + | ||
| 576 | +static int32_t TestMacCopyCtxMemCheck(int32_t algId, Hex *key, int isProvider) | ||
| 577 | +{ | ||
| 578 | + CRYPT_EAL_MacCtx *ctxA = NULL; | ||
| 579 | + CRYPT_EAL_MacCtx *ctxB = NULL; | ||
| 580 | + CRYPT_EAL_MacCtx *srcCtx = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 581 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 582 | + /* Set key in srcCtx */ | ||
| 583 | + int32_t ret = CRYPT_EAL_MacInit(srcCtx, key->x, key->len); | ||
| 584 | + if (ret != CRYPT_SUCCESS) { | ||
| 585 | + goto EXIT; | ||
| 586 | + } | ||
| 587 | + | ||
| 588 | + ctxA = (isProvider == 0) ? CRYPT_EAL_MacNewCtx(algId) : | ||
| 589 | + CRYPT_EAL_ProviderMacNewCtx(NULL, algId, "provider=default"); | ||
| 590 | + ret = CRYPT_EAL_MacCopyCtx(ctxA, srcCtx); | ||
| 591 | + if (ret != CRYPT_SUCCESS) { | ||
| 592 | + goto EXIT; | ||
| 593 | + } | ||
| 594 | + ctxB = CRYPT_EAL_MacDupCtx(srcCtx); | ||
| 595 | + if (ctxB == NULL) { | ||
| 596 | + ret = CRYPT_MEM_ALLOC_FAIL; | ||
| 597 | + goto EXIT; | ||
| 598 | + } | ||
| 599 | + | ||
| 600 | +EXIT: | ||
| 601 | + CRYPT_EAL_MacFreeCtx(ctxA); | ||
| 602 | + CRYPT_EAL_MacFreeCtx(ctxB); | ||
| 603 | + CRYPT_EAL_MacFreeCtx(srcCtx); | ||
| 604 | + return ret; | ||
| 605 | +} | ||
| 606 | + | ||
| 607 | +/** | ||
| 608 | + * @test SDV_CRYPTO_CBC_MAC_COPY_CTX_STUB_TC001 | ||
| 609 | + * title 1. Test the mac copy context with stub malloc fail | ||
| 610 | + * | ||
| 611 | + */ | ||
| 612 | +/* BEGIN_CASE */ | ||
| 613 | +void SDV_CRYPTO_HMAC_COPY_CTX_STUB_TC001(int algId, Hex *key, int isProvider) | ||
| 614 | +{ | ||
| 615 | + TestMemInit(); | ||
| 616 | + uint32_t totalMallocCount = 0; | ||
| 617 | + STUB_Init(); | ||
| 618 | + FuncStubInfo tmpRpInfo = {0}; | ||
| 619 | + ASSERT_TRUE(STUB_Replace(&tmpRpInfo, BSL_SAL_Malloc, STUB_BSL_SAL_Malloc) == 0); | ||
| 620 | + | ||
| 621 | + STUB_EnableMallocFail(false); | ||
| 622 | + STUB_ResetMallocCount(); | ||
| 623 | + ASSERT_EQ(TestMacCopyCtxMemCheck((int32_t)algId, key, isProvider), CRYPT_SUCCESS); | ||
| 624 | + totalMallocCount = STUB_GetMallocCallCount(); | ||
| 625 | + | ||
| 626 | + STUB_EnableMallocFail(true); | ||
| 627 | + for (uint32_t j = 0; j < totalMallocCount; j++) { | ||
| 628 | + STUB_ResetMallocCount(); | ||
| 629 | + STUB_SetMallocFailIndex(j); | ||
| 630 | + ASSERT_NE(TestMacCopyCtxMemCheck((int32_t)algId, key, isProvider), CRYPT_SUCCESS); | ||
| 631 | + } | ||
| 632 | + | ||
| 633 | +EXIT: | ||
| 634 | + STUB_Reset(&tmpRpInfo); | ||
| 635 | +} | ||
| 636 | +/* END_CASE */ | ||
| @@ -495,3 +495,90 @@ SDV_CRYPT_HMAC_DEFAULT_PROVIDER_FUNC_TC001:CRYPT_MAC_HMAC_SM3:"aaaaaaaaaaaaaaaaa | |||
| 495 | 495 | ||
| 496 | SDV_CRYPT_HMAC_DEFAULT_PROVIDER_FUNC_TC001 CRYPT_MAC_HMAC_SM3 #5 | 496 | SDV_CRYPT_HMAC_DEFAULT_PROVIDER_FUNC_TC001 CRYPT_MAC_HMAC_SM3 #5 |
| 497 | SDV_CRYPT_HMAC_DEFAULT_PROVIDER_FUNC_TC001:CRYPT_MAC_HMAC_SM3:"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f":"53616d706c65206d65737361676520666f72206b65796c656e3c626c6f636b6c656e":"dad342089a24eaa650975de2701754ff513b504f829bac67964915f9efb7c3f1" | 497 | SDV_CRYPT_HMAC_DEFAULT_PROVIDER_FUNC_TC001:CRYPT_MAC_HMAC_SM3:"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f":"53616d706c65206d65737361676520666f72206b65796c656e3c626c6f636b6c656e":"dad342089a24eaa650975de2701754ff513b504f829bac67964915f9efb7c3f1" |
| 498 | + | ||
| 499 | +SDV_CRYPTO_HMAC_COPY_CTX_API_TC001 CRYPT_MAC_HMAC_SHA1 | ||
| 500 | +SDV_CRYPTO_HMAC_COPY_CTX_API_TC001:CRYPT_MAC_HMAC_SHA1:0 | ||
| 501 | + | ||
| 502 | +SDV_CRYPTO_HMAC_COPY_CTX_API_TC001:CRYPT_MAC_HMAC_SHA256 | ||
| 503 | +SDV_CRYPTO_HMAC_COPY_CTX_API_TC001:CRYPT_MAC_HMAC_SHA256:0 | ||
| 504 | + | ||
| 505 | +SDV_CRYPTO_HMAC_COPY_CTX_API_TC001:CRYPT_MAC_HMAC_SHA3_384 | ||
| 506 | +SDV_CRYPTO_HMAC_COPY_CTX_API_TC001:CRYPT_MAC_HMAC_SHA3_384:1 | ||
| 507 | + | ||
| 508 | +SDV_CRYPTO_HMAC_COPY_CTX_API_TC001:CRYPT_MAC_HMAC_SM3 | ||
| 509 | +SDV_CRYPTO_HMAC_COPY_CTX_API_TC001:CRYPT_MAC_HMAC_SM3:1 | ||
| 510 | + | ||
| 511 | +SDV_CRYPTO_HMAC_DUP_CTX_API_TC001 CRYPT_MAC_HMAC_SHA1 | ||
| 512 | +SDV_CRYPTO_HMAC_DUP_CTX_API_TC001:CRYPT_MAC_HMAC_SHA1:0 | ||
| 513 | + | ||
| 514 | +SDV_CRYPTO_HMAC_DUP_CTX_API_TC001:CRYPT_MAC_HMAC_SHA256 | ||
| 515 | +SDV_CRYPTO_HMAC_DUP_CTX_API_TC001:CRYPT_MAC_HMAC_SHA256:0 | ||
| 516 | + | ||
| 517 | +SDV_CRYPTO_HMAC_DUP_CTX_API_TC001:CRYPT_MAC_HMAC_SHA3_384 | ||
| 518 | +SDV_CRYPTO_HMAC_DUP_CTX_API_TC001:CRYPT_MAC_HMAC_SHA3_384:1 | ||
| 519 | + | ||
| 520 | +SDV_CRYPTO_HMAC_DUP_CTX_API_TC001:CRYPT_MAC_HMAC_SM3 | ||
| 521 | +SDV_CRYPTO_HMAC_DUP_CTX_API_TC001:CRYPT_MAC_HMAC_SM3:1 | ||
| 522 | + | ||
| 523 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001 CRYPT_MAC_HMAC_MD5 | ||
| 524 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001:CRYPT_MAC_HMAC_MD5:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":"4869205468657265":"9294727a3638bb1c13f48ef8158bfc9d":0 | ||
| 525 | + | ||
| 526 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001 CRYPT_MAC_HMAC_SHA1 | ||
| 527 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001:CRYPT_MAC_HMAC_SHA1:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":"4869205468657265":"b617318655057264e28bc0b6fb378c8ef146be00":0 | ||
| 528 | + | ||
| 529 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001 CRYPT_MAC_HMAC_SHA224 | ||
| 530 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001:CRYPT_MAC_HMAC_SHA224:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":"4869205468657265":"896fb1128abbdf196832107cd49df33f47b4b1169912ba4f53684b22":0 | ||
| 531 | + | ||
| 532 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001 CRYPT_MAC_HMAC_SHA256 | ||
| 533 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001:CRYPT_MAC_HMAC_SHA256:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":"4869205468657265":"b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7":0 | ||
| 534 | + | ||
| 535 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001 CRYPT_MAC_HMAC_SHA384 | ||
| 536 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001:CRYPT_MAC_HMAC_SHA384:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":"4869205468657265":"afd03944d84895626b0825f4ab46907f15f9dadbe4101ec682aa034c7cebc59cfaea9ea9076ede7f4af152e8b2fa9cb6":0 | ||
| 537 | + | ||
| 538 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001 CRYPT_MAC_HMAC_SHA512 | ||
| 539 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001:CRYPT_MAC_HMAC_SHA512:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":"4869205468657265":"87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b30545e17cdedaa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f1702e696c203a126854":0 | ||
| 540 | + | ||
| 541 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001 CRYPT_MAC_HMAC_SM3 | ||
| 542 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001:CRYPT_MAC_HMAC_SM3:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":"4869205468657265":"51b00d1fb49832bfb01c3ce27848e59f871d9ba938dc563b338ca964755cce70":0 | ||
| 543 | + | ||
| 544 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001 CRYPT_MAC_HMAC_SHA3_224 | ||
| 545 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001:CRYPT_MAC_HMAC_SHA3_224:"000102030405060708090a0b0c0d0e0f101112131415161718191a1b":"53616d706c65206d65737361676520666f72206b65796c656e3c626c6f636b6c656e":"332cfd59347fdb8e576e77260be4aba2d6dc53117b3bfb52c6d18c04":0 | ||
| 546 | + | ||
| 547 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001 CRYPT_MAC_HMAC_SHA3_256 | ||
| 548 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001:CRYPT_MAC_HMAC_SHA3_256:"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f":"53616d706c65206d65737361676520666f72206b65796c656e3c626c6f636b6c656e":"4fe8e202c4f058e8dddc23d8c34e467343e23555e24fc2f025d598f558f67205":0 | ||
| 549 | + | ||
| 550 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001 CRYPT_MAC_HMAC_SHA3_384 | ||
| 551 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001:CRYPT_MAC_HMAC_SHA3_384:"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f":"53616d706c65206d65737361676520666f72206b65796c656e3c626c6f636b6c656e":"d588a3c51f3f2d906e8298c1199aa8ff6296218127f6b38a90b6afe2c5617725bc99987f79b22a557b6520db710b7f42":0 | ||
| 552 | + | ||
| 553 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001 CRYPT_MAC_HMAC_SHA3_512 | ||
| 554 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001:CRYPT_MAC_HMAC_SHA3_512:"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f":"53616d706c65206d65737361676520666f72206b65796c656e3c626c6f636b6c656e":"4efd629d6c71bf86162658f29943b1c308ce27cdfa6db0d9c3ce81763f9cbce5f7ebe9868031db1a8f8eb7b6b95e5c5e3f657a8996c86a2f6527e307f0213196":0 | ||
| 555 | + | ||
| 556 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001 CRYPT_MAC_HMAC_MD5 Provider | ||
| 557 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001:CRYPT_MAC_HMAC_MD5:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":"4869205468657265":"9294727a3638bb1c13f48ef8158bfc9d":1 | ||
| 558 | + | ||
| 559 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001 CRYPT_MAC_HMAC_SHA256 Provider | ||
| 560 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001:CRYPT_MAC_HMAC_SHA256:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":"4869205468657265":"b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7":1 | ||
| 561 | + | ||
| 562 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001 CRYPT_MAC_HMAC_SM3 Provider | ||
| 563 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001:CRYPT_MAC_HMAC_SM3:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":"4869205468657265":"51b00d1fb49832bfb01c3ce27848e59f871d9ba938dc563b338ca964755cce70":1 | ||
| 564 | + | ||
| 565 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001 CRYPT_MAC_HMAC_SHA3_384 Provider | ||
| 566 | +SDV_CRYPT_EAL_HMAC_COPY_CTX_TC001:CRYPT_MAC_HMAC_SHA3_384:"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f":"53616d706c65206d65737361676520666f72206b65796c656e3c626c6f636b6c656e":"d588a3c51f3f2d906e8298c1199aa8ff6296218127f6b38a90b6afe2c5617725bc99987f79b22a557b6520db710b7f42":1 | ||
| 567 | + | ||
| 568 | +SDV_CRYPTO_HMAC_COPY_CTX_STUB_TC001 | ||
| 569 | +SDV_CRYPTO_HMAC_COPY_CTX_STUB_TC001:CRYPT_MAC_HMAC_MD5:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":0 | ||
| 570 | + | ||
| 571 | +SDV_CRYPTO_HMAC_COPY_CTX_STUB_TC001 | ||
| 572 | +SDV_CRYPTO_HMAC_COPY_CTX_STUB_TC001:CRYPT_MAC_HMAC_SHA256:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":0 | ||
| 573 | + | ||
| 574 | +SDV_CRYPTO_HMAC_COPY_CTX_STUB_TC001 | ||
| 575 | +SDV_CRYPTO_HMAC_COPY_CTX_STUB_TC001:CRYPT_MAC_HMAC_SM3:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":0 | ||
| 576 | + | ||
| 577 | +SDV_CRYPTO_HMAC_COPY_CTX_STUB_TC001 | ||
| 578 | +SDV_CRYPTO_HMAC_COPY_CTX_STUB_TC001:CRYPT_MAC_HMAC_SHA3_384:"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f":0 | ||
| 579 | + | ||
| 580 | +SDV_CRYPTO_HMAC_COPY_CTX_STUB_TC001 Provider | ||
| 581 | +SDV_CRYPTO_HMAC_COPY_CTX_STUB_TC001:CRYPT_MAC_HMAC_SHA256:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":1 | ||
| 582 | + | ||
| 583 | +SDV_CRYPTO_HMAC_COPY_CTX_STUB_TC001 Provider | ||
| 584 | +SDV_CRYPTO_HMAC_COPY_CTX_STUB_TC001:CRYPT_MAC_HMAC_SM3:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":1 | ||
| @@ -17,10 +17,12 @@ | |||
| 17 | 17 | ||
| 18 | #include "securec.h" | 18 | #include "securec.h" |
| 19 | #include "crypt_eal_kdf.h" | 19 | #include "crypt_eal_kdf.h" |
| 20 | +#include "eal_kdf_local.h" | ||
| 20 | #include "crypt_errno.h" | 21 | #include "crypt_errno.h" |
| 21 | #include "bsl_sal.h" | 22 | #include "bsl_sal.h" |
| 22 | #include "bsl_params.h" | 23 | #include "bsl_params.h" |
| 23 | #include "crypt_params_key.h" | 24 | #include "crypt_params_key.h" |
| 25 | +#include "stub_replace.h" | ||
| 24 | /* END_HEADER */ | 26 | /* END_HEADER */ |
| 25 | 27 | ||
| 26 | #define DATA_LEN (64) | 28 | #define DATA_LEN (64) |
| @@ -183,3 +185,224 @@ EXIT: | |||
| 183 | CRYPT_EAL_KdfFreeCtx(ctx); | 185 | CRYPT_EAL_KdfFreeCtx(ctx); |
| 184 | } | 186 | } |
| 185 | /* END_CASE */ | 187 | /* END_CASE */ |
| 188 | + | ||
| 189 | +/* BEGIN_CASE */ | ||
| 190 | +void SDV_CRYPTO_KDFTLS12_COPY_CTX_API_TC001(int isProvider) | ||
| 191 | +{ | ||
| 192 | + TestMemInit(); | ||
| 193 | + CRYPT_EAL_KdfCTX *ctxA = NULL; | ||
| 194 | + CRYPT_EAL_KdfCTX *ctxB = NULL; | ||
| 195 | + CRYPT_EAL_KdfCTX ctxC = { 0 }; | ||
| 196 | + if (isProvider != 0) { | ||
| 197 | + ctxA = CRYPT_EAL_ProviderKdfNewCtx(NULL, CRYPT_KDF_KDFTLS12, "provider=default"); | ||
| 198 | + ctxB = CRYPT_EAL_ProviderKdfNewCtx(NULL, CRYPT_KDF_KDFTLS12, "provider=default"); | ||
| 199 | + } else { | ||
| 200 | + ctxA = CRYPT_EAL_KdfNewCtx(CRYPT_KDF_KDFTLS12); | ||
| 201 | + ctxB = CRYPT_EAL_KdfNewCtx(CRYPT_KDF_KDFTLS12); | ||
| 202 | + } | ||
| 203 | + ASSERT_TRUE(ctxA != NULL); | ||
| 204 | + ASSERT_TRUE(ctxB != NULL); | ||
| 205 | + | ||
| 206 | + ASSERT_EQ(CRYPT_EAL_KdfCopyCtx(NULL, ctxA), CRYPT_NULL_INPUT); | ||
| 207 | + ASSERT_EQ(CRYPT_EAL_KdfCopyCtx(ctxB, NULL), CRYPT_NULL_INPUT); | ||
| 208 | + // Copy failed because ctxC lacks a method. | ||
| 209 | + ASSERT_EQ(CRYPT_EAL_KdfCopyCtx(ctxB, &ctxC), CRYPT_NULL_INPUT); | ||
| 210 | + | ||
| 211 | + // A directly created context can also be used as the destination for copying. | ||
| 212 | + ASSERT_EQ(CRYPT_EAL_KdfCopyCtx(&ctxC, ctxA), CRYPT_SUCCESS); | ||
| 213 | + ctxC.method->freeCtx(ctxC.data); | ||
| 214 | + BSL_SAL_Free(ctxC.method); | ||
| 215 | +EXIT: | ||
| 216 | + CRYPT_EAL_KdfFreeCtx(ctxA); | ||
| 217 | + CRYPT_EAL_KdfFreeCtx(ctxB); | ||
| 218 | +} | ||
| 219 | +/* END_CASE */ | ||
| 220 | + | ||
| 221 | +/* BEGIN_CASE */ | ||
| 222 | +void SDV_CRYPTO_KDF_TLS12_DUP_CTX_API_TC001(int isProvider) | ||
| 223 | +{ | ||
| 224 | + TestMemInit(); | ||
| 225 | + CRYPT_EAL_KdfCTX *ctxA = NULL; | ||
| 226 | + CRYPT_EAL_KdfCTX *ctxB = NULL; | ||
| 227 | + CRYPT_EAL_KdfCTX ctxC = { 0 }; | ||
| 228 | + if (isProvider != 0) { | ||
| 229 | + ctxA = CRYPT_EAL_ProviderKdfNewCtx(NULL, CRYPT_KDF_KDFTLS12, "provider=default"); | ||
| 230 | + } else { | ||
| 231 | + ctxA = CRYPT_EAL_KdfNewCtx(CRYPT_KDF_KDFTLS12); | ||
| 232 | + } | ||
| 233 | + ASSERT_TRUE(ctxA != NULL); | ||
| 234 | + | ||
| 235 | + ctxB = CRYPT_EAL_KdfDupCtx(NULL); | ||
| 236 | + ASSERT_TRUE(ctxB == NULL); | ||
| 237 | + ctxB = CRYPT_EAL_KdfDupCtx(&ctxC); | ||
| 238 | + ASSERT_TRUE(ctxB == NULL); | ||
| 239 | + ctxB = CRYPT_EAL_KdfDupCtx(ctxA); | ||
| 240 | + ASSERT_TRUE(ctxB != NULL); | ||
| 241 | +EXIT: | ||
| 242 | + CRYPT_EAL_KdfFreeCtx(ctxA); | ||
| 243 | + CRYPT_EAL_KdfFreeCtx(ctxB); | ||
| 244 | +} | ||
| 245 | +/* END_CASE */ | ||
| 246 | + | ||
| 247 | +/* BEGIN_CASE */ | ||
| 248 | +void SDV_CRYPT_EAL_KDF_TLS12_COPY_CTX_FUNC_TC001(int algId, Hex *key, Hex *label, Hex *seed, Hex *result, | ||
| 249 | + int isProvider) | ||
| 250 | +{ | ||
| 251 | + if (IsHmacAlgDisabled(algId)) { | ||
| 252 | + SKIP_TEST(); | ||
| 253 | + } | ||
| 254 | + TestMemInit(); | ||
| 255 | + uint32_t outLen = result->len; | ||
| 256 | + uint8_t *out = BSL_SAL_Malloc(outLen * sizeof(uint8_t)); | ||
| 257 | + ASSERT_TRUE(out != NULL); | ||
| 258 | + | ||
| 259 | + CRYPT_EAL_KdfCTX *ctx = NULL; | ||
| 260 | + CRYPT_EAL_KdfCTX *copyCtx = NULL; | ||
| 261 | + CRYPT_EAL_KdfCTX *copyCtx1 = NULL; | ||
| 262 | + CRYPT_EAL_KdfCTX *copyCtx2 = NULL; | ||
| 263 | + CRYPT_EAL_KdfCTX *copyCtx3 = NULL; | ||
| 264 | + if (isProvider != 0) { | ||
| 265 | + ctx = CRYPT_EAL_ProviderKdfNewCtx(NULL, CRYPT_KDF_KDFTLS12, "provider=default"); | ||
| 266 | + copyCtx = CRYPT_EAL_ProviderKdfNewCtx(NULL, CRYPT_KDF_KDFTLS12, "provider=default"); | ||
| 267 | + copyCtx1 = CRYPT_EAL_ProviderKdfNewCtx(NULL, CRYPT_KDF_KDFTLS12, "provider=default"); | ||
| 268 | + copyCtx2 = CRYPT_EAL_ProviderKdfNewCtx(NULL, CRYPT_KDF_KDFTLS12, "provider=default"); | ||
| 269 | + } else { | ||
| 270 | + ctx = CRYPT_EAL_KdfNewCtx(CRYPT_KDF_KDFTLS12); | ||
| 271 | + copyCtx = CRYPT_EAL_KdfNewCtx(CRYPT_KDF_KDFTLS12); | ||
| 272 | + copyCtx1 = CRYPT_EAL_KdfNewCtx(CRYPT_KDF_KDFTLS12); | ||
| 273 | + copyCtx2 = CRYPT_EAL_KdfNewCtx(CRYPT_KDF_KDFTLS12); | ||
| 274 | + } | ||
| 275 | + ASSERT_TRUE(ctx != NULL); | ||
| 276 | + ASSERT_TRUE(copyCtx != NULL); | ||
| 277 | + ASSERT_TRUE(copyCtx1 != NULL); | ||
| 278 | + ASSERT_TRUE(copyCtx2 != NULL); | ||
| 279 | + | ||
| 280 | + ASSERT_EQ(CRYPT_EAL_KdfCopyCtx(copyCtx, ctx), CRYPT_SUCCESS); | ||
| 281 | + | ||
| 282 | + BSL_Param params[5] = {{0}, {0}, {0}, {0}, BSL_PARAM_END}; | ||
| 283 | + int32_t id = (int32_t)algId; | ||
| 284 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[0], CRYPT_PARAM_KDF_MAC_ID, BSL_PARAM_TYPE_UINT32, | ||
| 285 | + &id, sizeof(id)), CRYPT_SUCCESS); | ||
| 286 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[1], CRYPT_PARAM_KDF_KEY, BSL_PARAM_TYPE_OCTETS, | ||
| 287 | + key->x, key->len), CRYPT_SUCCESS); | ||
| 288 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[2], CRYPT_PARAM_KDF_LABEL, BSL_PARAM_TYPE_OCTETS, | ||
| 289 | + label->x, label->len), CRYPT_SUCCESS); | ||
| 290 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[3], CRYPT_PARAM_KDF_SEED, BSL_PARAM_TYPE_OCTETS, | ||
| 291 | + seed->x, seed->len), CRYPT_SUCCESS); | ||
| 292 | + ASSERT_EQ(CRYPT_EAL_KdfSetParam(ctx, params), CRYPT_SUCCESS); | ||
| 293 | + ASSERT_EQ(CRYPT_EAL_KdfSetParam(copyCtx, params), CRYPT_SUCCESS); | ||
| 294 | + | ||
| 295 | + ASSERT_EQ(CRYPT_EAL_KdfCopyCtx(copyCtx1, ctx), CRYPT_SUCCESS); | ||
| 296 | + ASSERT_EQ(CRYPT_EAL_KdfCopyCtx(copyCtx2, ctx), CRYPT_SUCCESS); | ||
| 297 | + | ||
| 298 | + ASSERT_EQ(CRYPT_EAL_KdfDerive(copyCtx, out, outLen), CRYPT_SUCCESS); | ||
| 299 | + ASSERT_COMPARE("result1 cmp", out, outLen, result->x, result->len); | ||
| 300 | + (void)memset_s(out, outLen, 0, outLen); | ||
| 301 | + CRYPT_EAL_KdfFreeCtx(copyCtx); | ||
| 302 | + copyCtx = NULL; | ||
| 303 | + | ||
| 304 | + ASSERT_EQ(CRYPT_EAL_KdfDerive(copyCtx1, out, outLen), CRYPT_SUCCESS); | ||
| 305 | + ASSERT_COMPARE("result2 cmp", out, outLen, result->x, result->len); | ||
| 306 | + (void)memset_s(out, outLen, 0, outLen); | ||
| 307 | + CRYPT_EAL_KdfFreeCtx(copyCtx1); | ||
| 308 | + copyCtx1 = NULL; | ||
| 309 | + | ||
| 310 | + copyCtx3 = CRYPT_EAL_KdfDupCtx(ctx); | ||
| 311 | + ASSERT_TRUE(copyCtx3 != NULL); | ||
| 312 | + ASSERT_EQ(CRYPT_EAL_KdfDerive(copyCtx3, out, outLen), CRYPT_SUCCESS); | ||
| 313 | + ASSERT_COMPARE("result3 cmp", out, outLen, result->x, result->len); | ||
| 314 | + (void)memset_s(out, outLen, 0, outLen); | ||
| 315 | + CRYPT_EAL_KdfFreeCtx(copyCtx3); | ||
| 316 | + copyCtx3 = NULL; | ||
| 317 | + | ||
| 318 | + ASSERT_EQ(CRYPT_EAL_KdfDerive(ctx, out, outLen), CRYPT_SUCCESS); | ||
| 319 | + ASSERT_COMPARE("result4 cmp", out, outLen, result->x, result->len); | ||
| 320 | + (void)memset_s(out, outLen, 0, outLen); | ||
| 321 | + CRYPT_EAL_KdfFreeCtx(ctx); | ||
| 322 | + ctx = NULL; | ||
| 323 | + | ||
| 324 | + ASSERT_EQ(CRYPT_EAL_KdfDerive(copyCtx2, out, outLen), CRYPT_SUCCESS); | ||
| 325 | + ASSERT_COMPARE("result5 cmp", out, outLen, result->x, result->len); | ||
| 326 | +EXIT: | ||
| 327 | + BSL_SAL_Free(out); | ||
| 328 | + CRYPT_EAL_KdfFreeCtx(ctx); | ||
| 329 | + CRYPT_EAL_KdfFreeCtx(copyCtx); | ||
| 330 | + CRYPT_EAL_KdfFreeCtx(copyCtx1); | ||
| 331 | + CRYPT_EAL_KdfFreeCtx(copyCtx2); | ||
| 332 | + CRYPT_EAL_KdfFreeCtx(copyCtx3); | ||
| 333 | +} | ||
| 334 | +/* END_CASE */ | ||
| 335 | + | ||
| 336 | +static int32_t TestKdfCopyCtxMemCheck(int32_t algId, Hex *key, Hex *label, Hex *seed, int isProvider) | ||
| 337 | +{ | ||
| 338 | + CRYPT_EAL_KdfCTX *ctxA = NULL; | ||
| 339 | + CRYPT_EAL_KdfCTX *ctxB = NULL; | ||
| 340 | + CRYPT_EAL_KdfCTX *srcCtx = NULL; | ||
| 341 | + if (isProvider != 0) { | ||
| 342 | + srcCtx = CRYPT_EAL_ProviderKdfNewCtx(NULL, CRYPT_KDF_HKDF, "provider=default"); | ||
| 343 | + ctxA = CRYPT_EAL_ProviderKdfNewCtx(NULL, CRYPT_KDF_HKDF, "provider=default"); | ||
| 344 | + } else { | ||
| 345 | + srcCtx = CRYPT_EAL_KdfNewCtx(CRYPT_KDF_HKDF); | ||
| 346 | + ctxA = CRYPT_EAL_KdfNewCtx(CRYPT_KDF_HKDF); | ||
| 347 | + } | ||
| 348 | + BSL_Param params[5] = {{0}, {0}, {0}, {0}, BSL_PARAM_END}; | ||
| 349 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[0], CRYPT_PARAM_KDF_MAC_ID, BSL_PARAM_TYPE_UINT32, | ||
| 350 | + &algId, sizeof(algId)), CRYPT_SUCCESS); | ||
| 351 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[1], CRYPT_PARAM_KDF_KEY, BSL_PARAM_TYPE_OCTETS, | ||
| 352 | + key->x, key->len), CRYPT_SUCCESS); | ||
| 353 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[2], CRYPT_PARAM_KDF_LABEL, BSL_PARAM_TYPE_OCTETS, | ||
| 354 | + label->x, label->len), CRYPT_SUCCESS); | ||
| 355 | + ASSERT_EQ(BSL_PARAM_InitValue(¶ms[3], CRYPT_PARAM_KDF_SEED, BSL_PARAM_TYPE_OCTETS, | ||
| 356 | + seed->x, seed->len), CRYPT_SUCCESS); | ||
| 357 | + int32_t ret = CRYPT_EAL_KdfSetParam(srcCtx, params); | ||
| 358 | + if (ret != CRYPT_SUCCESS) { | ||
| 359 | + goto EXIT; | ||
| 360 | + } | ||
| 361 | + | ||
| 362 | + ret = CRYPT_EAL_KdfCopyCtx(ctxA, srcCtx); | ||
| 363 | + if (ret != CRYPT_SUCCESS) { | ||
| 364 | + goto EXIT; | ||
| 365 | + } | ||
| 366 | + ctxB = CRYPT_EAL_KdfDupCtx(srcCtx); | ||
| 367 | + if (ctxB == NULL) { | ||
| 368 | + ret = CRYPT_MEM_ALLOC_FAIL; | ||
| 369 | + goto EXIT; | ||
| 370 | + } | ||
| 371 | +EXIT: | ||
| 372 | + CRYPT_EAL_KdfFreeCtx(ctxA); | ||
| 373 | + CRYPT_EAL_KdfFreeCtx(ctxB); | ||
| 374 | + CRYPT_EAL_KdfFreeCtx(srcCtx); | ||
| 375 | + return ret; | ||
| 376 | +} | ||
| 377 | + | ||
| 378 | +/** | ||
| 379 | + * @test SDV_CRYPTO_HKDF_COPY_CTX_STUB_TC001 | ||
| 380 | + * title 1. Test the kdf copy context with stub malloc fail | ||
| 381 | + * | ||
| 382 | + */ | ||
| 383 | +/* BEGIN_CASE */ | ||
| 384 | +void SDV_CRYPTO_HKDF_COPY_CTX_STUB_TC001(int algId, Hex *key, Hex *label, Hex *seed, int isProvider) | ||
| 385 | +{ | ||
| 386 | + TestMemInit(); | ||
| 387 | + uint32_t totalMallocCount = 0; | ||
| 388 | + STUB_Init(); | ||
| 389 | + FuncStubInfo tmpRpInfo = {0}; | ||
| 390 | + ASSERT_TRUE(STUB_Replace(&tmpRpInfo, BSL_SAL_Malloc, STUB_BSL_SAL_Malloc) == 0); | ||
| 391 | + | ||
| 392 | + STUB_EnableMallocFail(false); | ||
| 393 | + STUB_ResetMallocCount(); | ||
| 394 | + ASSERT_EQ(TestKdfCopyCtxMemCheck((int32_t)algId, key, label, seed, isProvider), CRYPT_SUCCESS); | ||
| 395 | + totalMallocCount = STUB_GetMallocCallCount(); | ||
| 396 | + | ||
| 397 | + STUB_EnableMallocFail(true); | ||
| 398 | + for (uint32_t j = 0; j < totalMallocCount; j++) | ||
| 399 | + { | ||
| 400 | + STUB_ResetMallocCount(); | ||
| 401 | + STUB_SetMallocFailIndex(j); | ||
| 402 | + ASSERT_NE(TestKdfCopyCtxMemCheck((int32_t)algId, key, label, seed, isProvider), CRYPT_SUCCESS); | ||
| 403 | + } | ||
| 404 | + | ||
| 405 | +EXIT: | ||
| 406 | + STUB_Reset(&tmpRpInfo); | ||
| 407 | +} | ||
| 408 | +/* END_CASE */ | ||
| @@ -27,3 +27,34 @@ SDV_CRYPT_EAL_KDF_TLS12_FUN_TC001:CRYPT_MAC_HMAC_SHA512:"74348710df03212b648663b | |||
| 27 | 27 | ||
| 28 | SDV_CRYPTO_KDFTLS12_DEFAULT_PROVIDER_FUNC_TC001 default provider | 28 | SDV_CRYPTO_KDFTLS12_DEFAULT_PROVIDER_FUNC_TC001 default provider |
| 29 | SDV_CRYPTO_KDFTLS12_DEFAULT_PROVIDER_FUNC_TC001:CRYPT_MAC_HMAC_SHA256:"202c88c00f84a17a20027079604787461176455539e705be730890602c289a5001e34eeb3a043e5d52a65e66125188bf":"6b657920657870616e73696f6eae6c806f8ad4d80784549dff28a4b58fd837681a51d928c3e30ee5ff14f3986862e1fd91":"f23f558a605f28478c58cf72637b89784d959df7e946d3f07bd1b616":"d06139889fffac1e3a71865f504aa5d0d2a2e89506c6f2279b670c3e1b74f531016a2530c51a3a0f7e1d6590d0f0566b2f387f8d11fd4f731cdd572d2eae927f6f2f81410b25e6960be68985add6c38445ad9f8c64bf8068bf9a6679485d966f1ad6f68b43495b10a683755ea2b858d70ccac7ec8b053c6bd41ca299d4e51928" | 29 | SDV_CRYPTO_KDFTLS12_DEFAULT_PROVIDER_FUNC_TC001:CRYPT_MAC_HMAC_SHA256:"202c88c00f84a17a20027079604787461176455539e705be730890602c289a5001e34eeb3a043e5d52a65e66125188bf":"6b657920657870616e73696f6eae6c806f8ad4d80784549dff28a4b58fd837681a51d928c3e30ee5ff14f3986862e1fd91":"f23f558a605f28478c58cf72637b89784d959df7e946d3f07bd1b616":"d06139889fffac1e3a71865f504aa5d0d2a2e89506c6f2279b670c3e1b74f531016a2530c51a3a0f7e1d6590d0f0566b2f387f8d11fd4f731cdd572d2eae927f6f2f81410b25e6960be68985add6c38445ad9f8c64bf8068bf9a6679485d966f1ad6f68b43495b10a683755ea2b858d70ccac7ec8b053c6bd41ca299d4e51928" |
| 30 | + | ||
| 31 | +SDV_CRYPTO_KDFTLS12_COPY_CTX_API_TC001 | ||
| 32 | +SDV_CRYPTO_KDFTLS12_COPY_CTX_API_TC001:0 | ||
| 33 | + | ||
| 34 | +SDV_CRYPTO_KDFTLS12_COPY_CTX_API_TC001 Provider | ||
| 35 | +SDV_CRYPTO_KDFTLS12_COPY_CTX_API_TC001:1 | ||
| 36 | + | ||
| 37 | +SDV_CRYPTO_KDF_TLS12_DUP_CTX_API_TC001 | ||
| 38 | +SDV_CRYPTO_KDF_TLS12_DUP_CTX_API_TC001:0 | ||
| 39 | + | ||
| 40 | +SDV_CRYPTO_KDF_TLS12_DUP_CTX_API_TC001 Provider | ||
| 41 | +SDV_CRYPTO_KDF_TLS12_DUP_CTX_API_TC001:1 | ||
| 42 | + | ||
| 43 | +SDV_CRYPT_EAL_KDF_TLS12_COPY_CTX_FUNC_TC001 CRYPT_MAC_HMAC_SHA256 | ||
| 44 | +SDV_CRYPT_EAL_KDF_TLS12_COPY_CTX_FUNC_TC001:CRYPT_MAC_HMAC_SHA256:"918b60d280f8471784392edbb9dd1fef7a78f823672a78fdb62822707e717a6d1ef54ca58f0b3b84a6fa092eb27089dd":"6b657920657870616e73696f6ed2ec44801e16c23e9d4cfe4c5c238523860dcca2b3f7dea5409fb31fceefa713284806ac208958e6fff30ebf99d908cb00fc5af915a19a5b34cac30340031f65":"":"1910e1496131f7ef05a7a568fffe7a3d3073e4f08500c97fce69d1c42a4ccf7553e52bc1ce84b760214f2632fee46ab0c4fb2bbe1214a560c7b041cbf4be44162d559ed8e8b34ab847f66aa5e948bef5a336d9d5c1e58b9ec4484f2024c4c453d87f1e9542556fe4f4615e2bdc20f74af7cf2311bd2a02bd415868339d50414d":0 | ||
| 45 | + | ||
| 46 | +SDV_CRYPT_EAL_KDF_TLS12_COPY_CTX_FUNC_TC001 CRYPT_MAC_HMAC_SHA384 | ||
| 47 | +SDV_CRYPT_EAL_KDF_TLS12_COPY_CTX_FUNC_TC001:CRYPT_MAC_HMAC_SHA384:"2a1d6063b37a458b07746a7b04ed54c9ddeef5f2e488050dfb4b0f38cc5b178e3c20e6a72307efc859bd2e1c24f790c7":"6b657920657870616e73696f6ec68423e2743b91bf9e2e10":"78bab5c5c884bd70983e0272343279e41738e943b5dce4c7973f3b0468d944de1870025bcc130e7832fd3fbfcd40ad287b13ee28f9":"de9f2ce42403605743e84e71b2fba535bbb2020e5899d98773c140c27abbfef4b4754ff01ea10e38604ec621f48a4af14715ee81b0ba10bdbebb5104bbc2411004a2962b0e7f5c2ebb27590678510c06cf880f9f529b164e75be0b7481881089944744bc33a0b8fd35d7f7a4f1dcc1bea500919e42aabb7f84d821fb1f018a4b":0 | ||
| 48 | + | ||
| 49 | +SDV_CRYPT_EAL_KDF_TLS12_COPY_CTX_FUNC_TC001 CRYPT_MAC_HMAC_SHA512 | ||
| 50 | +SDV_CRYPT_EAL_KDF_TLS12_COPY_CTX_FUNC_TC001:CRYPT_MAC_HMAC_SHA512:"74348710df03212b648663bd0a2b9940190e59bdb592876c747656b26f36ce0843505b999138459cf921503ab1c2bffb":"6b657920657870616e73696f6e8e111a579904a5c79e6db0832c":"cb8190ee88db5fd722d8b3f96379286a19f94a00ac1cf7a2a6376548eba6b6f69ba9e10ab93cedca87521df83e84269628e45f":"edeed5638bda76490ff7a3d39f8bb8bc25c9811dd8b2bcd67ddd9c588bd7f05fb8c3328bc6a3252d5a4fc6b07444f5bbb39f67a6e193adc45e282e2e40d5ffe77342101f7e414b28babb94e727cbafa0bf2fc1895ca1c3045a6b75e4d0612345988b54821072432a5b835699bba58bf7cbeb1496461fd99bd76bc82e738794b2":0 | ||
| 51 | + | ||
| 52 | +SDV_CRYPT_EAL_KDF_TLS12_COPY_CTX_FUNC_TC001 CRYPT_MAC_HMAC_SHA512 Provider | ||
| 53 | +SDV_CRYPT_EAL_KDF_TLS12_COPY_CTX_FUNC_TC001:CRYPT_MAC_HMAC_SHA512:"74348710df03212b648663bd0a2b9940190e59bdb592876c747656b26f36ce0843505b999138459cf921503ab1c2bffb":"6b657920657870616e73696f6e8e111a579904a5c79e6db0832c":"cb8190ee88db5fd722d8b3f96379286a19f94a00ac1cf7a2a6376548eba6b6f69ba9e10ab93cedca87521df83e84269628e45f":"edeed5638bda76490ff7a3d39f8bb8bc25c9811dd8b2bcd67ddd9c588bd7f05fb8c3328bc6a3252d5a4fc6b07444f5bbb39f67a6e193adc45e282e2e40d5ffe77342101f7e414b28babb94e727cbafa0bf2fc1895ca1c3045a6b75e4d0612345988b54821072432a5b835699bba58bf7cbeb1496461fd99bd76bc82e738794b2":1 | ||
| 54 | + | ||
| 55 | + | ||
| 56 | +SDV_CRYPTO_HKDF_COPY_CTX_STUB_TC001 CRYPT_MAC_HMAC_SHA384 | ||
| 57 | +SDV_CRYPTO_HKDF_COPY_CTX_STUB_TC001:CRYPT_MAC_HMAC_SHA384:"2a1d6063b37a458b07746a7b04ed54c9ddeef5f2e488050dfb4b0f38cc5b178e3c20e6a72307efc859bd2e1c24f790c7":"6b657920657870616e73696f6ec68423e2743b91bf9e2e10":"78bab5c5c884bd70983e0272343279e41738e943b5dce4c7973f3b0468d944de1870025bcc130e7832fd3fbfcd40ad287b13ee28f9":0 | ||
| 58 | + | ||
| 59 | +SDV_CRYPTO_HKDF_COPY_CTX_STUB_TC001 CRYPT_MAC_HMAC_SHA256 Provider | ||
| 60 | +SDV_CRYPTO_HKDF_COPY_CTX_STUB_TC001:CRYPT_MAC_HMAC_SHA256:"918b60d280f8471784392edbb9dd1fef7a78f823672a78fdb62822707e717a6d1ef54ca58f0b3b84a6fa092eb27089dd":"6b657920657870616e73696f6ed2ec44801e16c23e9d4cfe4c5c238523860dcca2b3f7dea5409fb31fceefa713284806ac208958e6fff30ebf99d908cb00fc5af915a19a5b34cac30340031f65":"":1 | ||