1fb7ef469SJerome Forissier // SPDX-License-Identifier: BSD-2-Clause
2b887bd8fSJens Wiklander /*
3b887bd8fSJens Wiklander * Copyright (c) 2017, Linaro Limited
4e43ab7a8SCedric Neveux * Copyright 2020 NXP
5eee637e7SAlexander Zakharov * Copyright 2021, SumUp Service GmbH
6b887bd8fSJens Wiklander */
7b887bd8fSJens Wiklander
8d7ac7d0fSJens Wiklander #include <assert.h>
9b887bd8fSJens Wiklander #include <compiler.h>
10e1770e71SJens Wiklander #include <crypto/crypto.h>
116648f482SJens Wiklander #include <crypto/crypto_impl.h>
1233790cc1SJens Wiklander #include <kernel/panic.h>
13d7ac7d0fSJens Wiklander #include <stdlib.h>
146d259e05SJens Wiklander #include <utee_defines.h>
15b887bd8fSJens Wiklander
crypto_hash_alloc_ctx(void ** ctx,uint32_t algo)166648f482SJens Wiklander TEE_Result crypto_hash_alloc_ctx(void **ctx, uint32_t algo)
17b887bd8fSJens Wiklander {
187222fc6aSCedric Neveux TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED;
196648f482SJens Wiklander struct crypto_hash_ctx *c = NULL;
206648f482SJens Wiklander
217222fc6aSCedric Neveux /*
22e43ab7a8SCedric Neveux * Use default cryptographic implementation if no matching
237222fc6aSCedric Neveux * drvcrypt device.
247222fc6aSCedric Neveux */
257222fc6aSCedric Neveux res = drvcrypt_hash_alloc_ctx(&c, algo);
267222fc6aSCedric Neveux
277222fc6aSCedric Neveux if (res == TEE_ERROR_NOT_IMPLEMENTED) {
286648f482SJens Wiklander switch (algo) {
296648f482SJens Wiklander case TEE_ALG_MD5:
306648f482SJens Wiklander res = crypto_md5_alloc_ctx(&c);
316648f482SJens Wiklander break;
326648f482SJens Wiklander case TEE_ALG_SHA1:
336648f482SJens Wiklander res = crypto_sha1_alloc_ctx(&c);
346648f482SJens Wiklander break;
356648f482SJens Wiklander case TEE_ALG_SHA224:
366648f482SJens Wiklander res = crypto_sha224_alloc_ctx(&c);
376648f482SJens Wiklander break;
386648f482SJens Wiklander case TEE_ALG_SHA256:
396648f482SJens Wiklander res = crypto_sha256_alloc_ctx(&c);
406648f482SJens Wiklander break;
416648f482SJens Wiklander case TEE_ALG_SHA384:
426648f482SJens Wiklander res = crypto_sha384_alloc_ctx(&c);
436648f482SJens Wiklander break;
446648f482SJens Wiklander case TEE_ALG_SHA512:
456648f482SJens Wiklander res = crypto_sha512_alloc_ctx(&c);
466648f482SJens Wiklander break;
47260b4028SJens Wiklander case TEE_ALG_SHA3_224:
48260b4028SJens Wiklander res = crypto_sha3_224_alloc_ctx(&c);
49260b4028SJens Wiklander break;
50260b4028SJens Wiklander case TEE_ALG_SHA3_256:
51260b4028SJens Wiklander res = crypto_sha3_256_alloc_ctx(&c);
52260b4028SJens Wiklander break;
53260b4028SJens Wiklander case TEE_ALG_SHA3_384:
54260b4028SJens Wiklander res = crypto_sha3_384_alloc_ctx(&c);
55260b4028SJens Wiklander break;
56260b4028SJens Wiklander case TEE_ALG_SHA3_512:
57260b4028SJens Wiklander res = crypto_sha3_512_alloc_ctx(&c);
58260b4028SJens Wiklander break;
59260b4028SJens Wiklander case TEE_ALG_SHAKE128:
60260b4028SJens Wiklander res = crypto_shake128_alloc_ctx(&c);
61260b4028SJens Wiklander break;
62260b4028SJens Wiklander case TEE_ALG_SHAKE256:
63260b4028SJens Wiklander res = crypto_shake256_alloc_ctx(&c);
64260b4028SJens Wiklander break;
6547645577SJerome Forissier case TEE_ALG_SM3:
6647645577SJerome Forissier res = crypto_sm3_alloc_ctx(&c);
6747645577SJerome Forissier break;
686648f482SJens Wiklander default:
697222fc6aSCedric Neveux break;
707222fc6aSCedric Neveux }
71b887bd8fSJens Wiklander }
72b887bd8fSJens Wiklander
736648f482SJens Wiklander if (!res)
746648f482SJens Wiklander *ctx = c;
756648f482SJens Wiklander
766648f482SJens Wiklander return res;
776648f482SJens Wiklander }
786648f482SJens Wiklander
hash_ops(void * ctx)796648f482SJens Wiklander static const struct crypto_hash_ops *hash_ops(void *ctx)
806648f482SJens Wiklander {
816648f482SJens Wiklander struct crypto_hash_ctx *c = ctx;
826648f482SJens Wiklander
836648f482SJens Wiklander assert(c && c->ops);
846648f482SJens Wiklander
856648f482SJens Wiklander return c->ops;
866648f482SJens Wiklander }
876648f482SJens Wiklander
crypto_hash_free_ctx(void * ctx)886b3a371cSJens Wiklander void crypto_hash_free_ctx(void *ctx)
89ecf2e014SJens Wiklander {
90ce7a47f5SJerome Forissier if (ctx)
916648f482SJens Wiklander hash_ops(ctx)->free_ctx(ctx);
92ecf2e014SJens Wiklander }
93ecf2e014SJens Wiklander
crypto_hash_copy_state(void * dst_ctx,void * src_ctx)946b3a371cSJens Wiklander void crypto_hash_copy_state(void *dst_ctx, void *src_ctx)
95ecf2e014SJens Wiklander {
966648f482SJens Wiklander hash_ops(dst_ctx)->copy_state(dst_ctx, src_ctx);
97ecf2e014SJens Wiklander }
98ecf2e014SJens Wiklander
crypto_hash_init(void * ctx)996b3a371cSJens Wiklander TEE_Result crypto_hash_init(void *ctx)
100b887bd8fSJens Wiklander {
1016648f482SJens Wiklander return hash_ops(ctx)->init(ctx);
102b887bd8fSJens Wiklander }
1036648f482SJens Wiklander
crypto_hash_update(void * ctx,const uint8_t * data,size_t len)1046b3a371cSJens Wiklander TEE_Result crypto_hash_update(void *ctx, const uint8_t *data, size_t len)
105b887bd8fSJens Wiklander {
1066648f482SJens Wiklander return hash_ops(ctx)->update(ctx, data, len);
107b887bd8fSJens Wiklander }
1086648f482SJens Wiklander
crypto_hash_final(void * ctx,uint8_t * digest,size_t len)1096b3a371cSJens Wiklander TEE_Result crypto_hash_final(void *ctx, uint8_t *digest, size_t len)
110b887bd8fSJens Wiklander {
1116648f482SJens Wiklander return hash_ops(ctx)->final(ctx, digest, len);
112b887bd8fSJens Wiklander }
11382d91db1SJens Wiklander
crypto_cipher_alloc_ctx(void ** ctx,uint32_t algo)11496098f01SJens Wiklander TEE_Result crypto_cipher_alloc_ctx(void **ctx, uint32_t algo)
11582d91db1SJens Wiklander {
116e43ab7a8SCedric Neveux TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED;
11796098f01SJens Wiklander struct crypto_cipher_ctx *c = NULL;
11896098f01SJens Wiklander
119e43ab7a8SCedric Neveux /*
120e43ab7a8SCedric Neveux * Use default cryptographic implementation if no matching
121e43ab7a8SCedric Neveux * drvcrypt device.
122e43ab7a8SCedric Neveux */
123e43ab7a8SCedric Neveux res = drvcrypt_cipher_alloc_ctx(&c, algo);
124e43ab7a8SCedric Neveux
125e43ab7a8SCedric Neveux if (res == TEE_ERROR_NOT_IMPLEMENTED) {
12696098f01SJens Wiklander switch (algo) {
12796098f01SJens Wiklander case TEE_ALG_AES_ECB_NOPAD:
12896098f01SJens Wiklander res = crypto_aes_ecb_alloc_ctx(&c);
12996098f01SJens Wiklander break;
13096098f01SJens Wiklander case TEE_ALG_AES_CBC_NOPAD:
13196098f01SJens Wiklander res = crypto_aes_cbc_alloc_ctx(&c);
13296098f01SJens Wiklander break;
13396098f01SJens Wiklander case TEE_ALG_AES_CTR:
13496098f01SJens Wiklander res = crypto_aes_ctr_alloc_ctx(&c);
13596098f01SJens Wiklander break;
13696098f01SJens Wiklander case TEE_ALG_AES_CTS:
13796098f01SJens Wiklander res = crypto_aes_cts_alloc_ctx(&c);
13896098f01SJens Wiklander break;
13996098f01SJens Wiklander case TEE_ALG_AES_XTS:
14096098f01SJens Wiklander res = crypto_aes_xts_alloc_ctx(&c);
14196098f01SJens Wiklander break;
14296098f01SJens Wiklander case TEE_ALG_DES_ECB_NOPAD:
14396098f01SJens Wiklander res = crypto_des_ecb_alloc_ctx(&c);
14496098f01SJens Wiklander break;
14596098f01SJens Wiklander case TEE_ALG_DES3_ECB_NOPAD:
14696098f01SJens Wiklander res = crypto_des3_ecb_alloc_ctx(&c);
14796098f01SJens Wiklander break;
14896098f01SJens Wiklander case TEE_ALG_DES_CBC_NOPAD:
14996098f01SJens Wiklander res = crypto_des_cbc_alloc_ctx(&c);
15096098f01SJens Wiklander break;
15196098f01SJens Wiklander case TEE_ALG_DES3_CBC_NOPAD:
15296098f01SJens Wiklander res = crypto_des3_cbc_alloc_ctx(&c);
15396098f01SJens Wiklander break;
154ade6f848SJerome Forissier case TEE_ALG_SM4_ECB_NOPAD:
155ade6f848SJerome Forissier res = crypto_sm4_ecb_alloc_ctx(&c);
156ade6f848SJerome Forissier break;
157ade6f848SJerome Forissier case TEE_ALG_SM4_CBC_NOPAD:
158ade6f848SJerome Forissier res = crypto_sm4_cbc_alloc_ctx(&c);
159ade6f848SJerome Forissier break;
160ade6f848SJerome Forissier case TEE_ALG_SM4_CTR:
161ade6f848SJerome Forissier res = crypto_sm4_ctr_alloc_ctx(&c);
162ade6f848SJerome Forissier break;
163b21f583dSPingan Xie case TEE_ALG_SM4_XTS:
164b21f583dSPingan Xie res = crypto_sm4_xts_alloc_ctx(&c);
165b21f583dSPingan Xie break;
16696098f01SJens Wiklander default:
1671c5fdd1fSJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED;
16882d91db1SJens Wiklander }
169e43ab7a8SCedric Neveux }
17082d91db1SJens Wiklander
17196098f01SJens Wiklander if (!res)
17296098f01SJens Wiklander *ctx = c;
17396098f01SJens Wiklander
17496098f01SJens Wiklander return res;
17596098f01SJens Wiklander }
17696098f01SJens Wiklander
cipher_ops(void * ctx)17796098f01SJens Wiklander static const struct crypto_cipher_ops *cipher_ops(void *ctx)
17896098f01SJens Wiklander {
17996098f01SJens Wiklander struct crypto_cipher_ctx *c = ctx;
18096098f01SJens Wiklander
18196098f01SJens Wiklander assert(c && c->ops);
18296098f01SJens Wiklander
18396098f01SJens Wiklander return c->ops;
18496098f01SJens Wiklander }
18596098f01SJens Wiklander
crypto_cipher_free_ctx(void * ctx)186cbda7091SJens Wiklander void crypto_cipher_free_ctx(void *ctx)
18772a9b1a0SJens Wiklander {
188ce7a47f5SJerome Forissier if (ctx)
18996098f01SJens Wiklander cipher_ops(ctx)->free_ctx(ctx);
19072a9b1a0SJens Wiklander }
19172a9b1a0SJens Wiklander
crypto_cipher_copy_state(void * dst_ctx,void * src_ctx)192cbda7091SJens Wiklander void crypto_cipher_copy_state(void *dst_ctx, void *src_ctx)
19372a9b1a0SJens Wiklander {
19496098f01SJens Wiklander cipher_ops(dst_ctx)->copy_state(dst_ctx, src_ctx);
19572a9b1a0SJens Wiklander }
19672a9b1a0SJens Wiklander
crypto_cipher_init(void * ctx,TEE_OperationMode mode,const uint8_t * key1,size_t key1_len,const uint8_t * key2,size_t key2_len,const uint8_t * iv,size_t iv_len)197cbda7091SJens Wiklander TEE_Result crypto_cipher_init(void *ctx, TEE_OperationMode mode,
198cbda7091SJens Wiklander const uint8_t *key1, size_t key1_len,
199cbda7091SJens Wiklander const uint8_t *key2, size_t key2_len,
200cbda7091SJens Wiklander const uint8_t *iv, size_t iv_len)
20182d91db1SJens Wiklander {
20296098f01SJens Wiklander if (mode != TEE_MODE_DECRYPT && mode != TEE_MODE_ENCRYPT)
20396098f01SJens Wiklander return TEE_ERROR_BAD_PARAMETERS;
20496098f01SJens Wiklander
20596098f01SJens Wiklander return cipher_ops(ctx)->init(ctx, mode, key1, key1_len, key2, key2_len,
20696098f01SJens Wiklander iv, iv_len);
20782d91db1SJens Wiklander }
20882d91db1SJens Wiklander
crypto_cipher_update(void * ctx,TEE_OperationMode mode __unused,bool last_block,const uint8_t * data,size_t len,uint8_t * dst)209cbda7091SJens Wiklander TEE_Result crypto_cipher_update(void *ctx, TEE_OperationMode mode __unused,
21096098f01SJens Wiklander bool last_block, const uint8_t *data,
21196098f01SJens Wiklander size_t len, uint8_t *dst)
21282d91db1SJens Wiklander {
21396098f01SJens Wiklander return cipher_ops(ctx)->update(ctx, last_block, data, len, dst);
21482d91db1SJens Wiklander }
21582d91db1SJens Wiklander
crypto_cipher_final(void * ctx)216cbda7091SJens Wiklander void crypto_cipher_final(void *ctx)
21782d91db1SJens Wiklander {
21896098f01SJens Wiklander cipher_ops(ctx)->final(ctx);
21982d91db1SJens Wiklander }
220e9eaba5cSJens Wiklander
crypto_cipher_get_block_size(uint32_t algo,size_t * size)2216d259e05SJens Wiklander TEE_Result crypto_cipher_get_block_size(uint32_t algo, size_t *size)
2226d259e05SJens Wiklander {
2236d259e05SJens Wiklander uint32_t class = TEE_ALG_GET_CLASS(algo);
2246d259e05SJens Wiklander
2256d259e05SJens Wiklander if (class != TEE_OPERATION_CIPHER && class != TEE_OPERATION_MAC &&
2266d259e05SJens Wiklander class != TEE_OPERATION_AE)
2276d259e05SJens Wiklander return TEE_ERROR_BAD_PARAMETERS;
2286d259e05SJens Wiklander
2296d259e05SJens Wiklander switch (TEE_ALG_GET_MAIN_ALG(algo)) {
2306d259e05SJens Wiklander case TEE_MAIN_ALGO_AES:
2316d259e05SJens Wiklander *size = TEE_AES_BLOCK_SIZE;
2326d259e05SJens Wiklander return TEE_SUCCESS;
2336d259e05SJens Wiklander case TEE_MAIN_ALGO_DES:
2346d259e05SJens Wiklander case TEE_MAIN_ALGO_DES3:
2356d259e05SJens Wiklander *size = TEE_DES_BLOCK_SIZE;
2366d259e05SJens Wiklander return TEE_SUCCESS;
237ade6f848SJerome Forissier case TEE_MAIN_ALGO_SM4:
238ade6f848SJerome Forissier *size = TEE_SM4_BLOCK_SIZE;
239ade6f848SJerome Forissier return TEE_SUCCESS;
2406d259e05SJens Wiklander default:
2416d259e05SJens Wiklander return TEE_ERROR_NOT_SUPPORTED;
2426d259e05SJens Wiklander }
2436d259e05SJens Wiklander }
2446d259e05SJens Wiklander
crypto_mac_alloc_ctx(void ** ctx,uint32_t algo)2455da36a24SJens Wiklander TEE_Result crypto_mac_alloc_ctx(void **ctx, uint32_t algo)
246e9eaba5cSJens Wiklander {
2475da36a24SJens Wiklander TEE_Result res = TEE_SUCCESS;
2485da36a24SJens Wiklander struct crypto_mac_ctx *c = NULL;
2495da36a24SJens Wiklander
250ea9ac29cSCedric Neveux /*
251ea9ac29cSCedric Neveux * Use default cryptographic implementation if no matching
252ea9ac29cSCedric Neveux * drvcrypt device.
253ea9ac29cSCedric Neveux */
254ea9ac29cSCedric Neveux res = drvcrypt_mac_alloc_ctx(&c, algo);
255ea9ac29cSCedric Neveux
256ea9ac29cSCedric Neveux if (res == TEE_ERROR_NOT_IMPLEMENTED) {
2575da36a24SJens Wiklander switch (algo) {
2585da36a24SJens Wiklander case TEE_ALG_HMAC_MD5:
2595da36a24SJens Wiklander res = crypto_hmac_md5_alloc_ctx(&c);
2605da36a24SJens Wiklander break;
2615da36a24SJens Wiklander case TEE_ALG_HMAC_SHA1:
2625da36a24SJens Wiklander res = crypto_hmac_sha1_alloc_ctx(&c);
2635da36a24SJens Wiklander break;
2645da36a24SJens Wiklander case TEE_ALG_HMAC_SHA224:
2655da36a24SJens Wiklander res = crypto_hmac_sha224_alloc_ctx(&c);
2665da36a24SJens Wiklander break;
2675da36a24SJens Wiklander case TEE_ALG_HMAC_SHA256:
2685da36a24SJens Wiklander res = crypto_hmac_sha256_alloc_ctx(&c);
2695da36a24SJens Wiklander break;
2705da36a24SJens Wiklander case TEE_ALG_HMAC_SHA384:
2715da36a24SJens Wiklander res = crypto_hmac_sha384_alloc_ctx(&c);
2725da36a24SJens Wiklander break;
2735da36a24SJens Wiklander case TEE_ALG_HMAC_SHA512:
2745da36a24SJens Wiklander res = crypto_hmac_sha512_alloc_ctx(&c);
2755da36a24SJens Wiklander break;
276260b4028SJens Wiklander case TEE_ALG_HMAC_SHA3_224:
277260b4028SJens Wiklander res = crypto_hmac_sha3_224_alloc_ctx(&c);
278260b4028SJens Wiklander break;
279260b4028SJens Wiklander case TEE_ALG_HMAC_SHA3_256:
280260b4028SJens Wiklander res = crypto_hmac_sha3_256_alloc_ctx(&c);
281260b4028SJens Wiklander break;
282260b4028SJens Wiklander case TEE_ALG_HMAC_SHA3_384:
283260b4028SJens Wiklander res = crypto_hmac_sha3_384_alloc_ctx(&c);
284260b4028SJens Wiklander break;
285260b4028SJens Wiklander case TEE_ALG_HMAC_SHA3_512:
286260b4028SJens Wiklander res = crypto_hmac_sha3_512_alloc_ctx(&c);
287260b4028SJens Wiklander break;
28847645577SJerome Forissier case TEE_ALG_HMAC_SM3:
28947645577SJerome Forissier res = crypto_hmac_sm3_alloc_ctx(&c);
29047645577SJerome Forissier break;
2915da36a24SJens Wiklander case TEE_ALG_AES_CBC_MAC_NOPAD:
2925da36a24SJens Wiklander res = crypto_aes_cbc_mac_nopad_alloc_ctx(&c);
2935da36a24SJens Wiklander break;
2945da36a24SJens Wiklander case TEE_ALG_AES_CBC_MAC_PKCS5:
2955da36a24SJens Wiklander res = crypto_aes_cbc_mac_pkcs5_alloc_ctx(&c);
2965da36a24SJens Wiklander break;
2975da36a24SJens Wiklander case TEE_ALG_DES_CBC_MAC_NOPAD:
2985da36a24SJens Wiklander res = crypto_des_cbc_mac_nopad_alloc_ctx(&c);
2995da36a24SJens Wiklander break;
3005da36a24SJens Wiklander case TEE_ALG_DES_CBC_MAC_PKCS5:
3015da36a24SJens Wiklander res = crypto_des_cbc_mac_pkcs5_alloc_ctx(&c);
3025da36a24SJens Wiklander break;
3035da36a24SJens Wiklander case TEE_ALG_DES3_CBC_MAC_NOPAD:
3045da36a24SJens Wiklander res = crypto_des3_cbc_mac_nopad_alloc_ctx(&c);
3055da36a24SJens Wiklander break;
3065da36a24SJens Wiklander case TEE_ALG_DES3_CBC_MAC_PKCS5:
3075da36a24SJens Wiklander res = crypto_des3_cbc_mac_pkcs5_alloc_ctx(&c);
3085da36a24SJens Wiklander break;
309eee637e7SAlexander Zakharov case TEE_ALG_DES3_CMAC:
310eee637e7SAlexander Zakharov res = crypto_des3_cmac_alloc_ctx(&c);
311eee637e7SAlexander Zakharov break;
3125da36a24SJens Wiklander case TEE_ALG_AES_CMAC:
3135da36a24SJens Wiklander res = crypto_aes_cmac_alloc_ctx(&c);
3145da36a24SJens Wiklander break;
3155da36a24SJens Wiklander default:
3165da36a24SJens Wiklander return TEE_ERROR_NOT_SUPPORTED;
3175da36a24SJens Wiklander }
318ea9ac29cSCedric Neveux }
3195da36a24SJens Wiklander
3205da36a24SJens Wiklander if (!res)
3215da36a24SJens Wiklander *ctx = c;
3225da36a24SJens Wiklander
3235da36a24SJens Wiklander return res;
3245da36a24SJens Wiklander }
3255da36a24SJens Wiklander
mac_ops(void * ctx)3265da36a24SJens Wiklander static const struct crypto_mac_ops *mac_ops(void *ctx)
3275da36a24SJens Wiklander {
3285da36a24SJens Wiklander struct crypto_mac_ctx *c = ctx;
3295da36a24SJens Wiklander
3305da36a24SJens Wiklander assert(c && c->ops);
3315da36a24SJens Wiklander
3325da36a24SJens Wiklander return c->ops;
333e9eaba5cSJens Wiklander }
334e9eaba5cSJens Wiklander
crypto_mac_free_ctx(void * ctx)335c69bc615SJens Wiklander void crypto_mac_free_ctx(void *ctx)
33682ef73bcSJens Wiklander {
337ce7a47f5SJerome Forissier if (ctx)
3385da36a24SJens Wiklander mac_ops(ctx)->free_ctx(ctx);
33982ef73bcSJens Wiklander }
34082ef73bcSJens Wiklander
crypto_mac_copy_state(void * dst_ctx,void * src_ctx)341c69bc615SJens Wiklander void crypto_mac_copy_state(void *dst_ctx, void *src_ctx)
34282ef73bcSJens Wiklander {
3435da36a24SJens Wiklander mac_ops(dst_ctx)->copy_state(dst_ctx, src_ctx);
34482ef73bcSJens Wiklander }
34582ef73bcSJens Wiklander
crypto_mac_init(void * ctx,const uint8_t * key,size_t len)346c69bc615SJens Wiklander TEE_Result crypto_mac_init(void *ctx, const uint8_t *key, size_t len)
347e9eaba5cSJens Wiklander {
3485da36a24SJens Wiklander return mac_ops(ctx)->init(ctx, key, len);
349e9eaba5cSJens Wiklander }
350e9eaba5cSJens Wiklander
crypto_mac_update(void * ctx,const uint8_t * data,size_t len)351c69bc615SJens Wiklander TEE_Result crypto_mac_update(void *ctx, const uint8_t *data, size_t len)
352e9eaba5cSJens Wiklander {
3535da36a24SJens Wiklander if (!len)
3545da36a24SJens Wiklander return TEE_SUCCESS;
3555da36a24SJens Wiklander
3565da36a24SJens Wiklander return mac_ops(ctx)->update(ctx, data, len);
357e9eaba5cSJens Wiklander }
358e9eaba5cSJens Wiklander
crypto_mac_final(void * ctx,uint8_t * digest,size_t digest_len)359c69bc615SJens Wiklander TEE_Result crypto_mac_final(void *ctx, uint8_t *digest, size_t digest_len)
360e9eaba5cSJens Wiklander {
3615da36a24SJens Wiklander return mac_ops(ctx)->final(ctx, digest, digest_len);
362e9eaba5cSJens Wiklander }
363e9eaba5cSJens Wiklander
crypto_authenc_alloc_ctx(void ** ctx,uint32_t algo)364d7ac7d0fSJens Wiklander TEE_Result crypto_authenc_alloc_ctx(void **ctx, uint32_t algo)
3658875ce46SJens Wiklander {
366e3e4ce47SNicolas Toromanoff TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED;
367f1e9b21bSJens Wiklander struct crypto_authenc_ctx *c = NULL;
368f1e9b21bSJens Wiklander
369e3e4ce47SNicolas Toromanoff /*
370e3e4ce47SNicolas Toromanoff * Use default authenc implementation if no matching
371e3e4ce47SNicolas Toromanoff * drvcrypt device.
372e3e4ce47SNicolas Toromanoff */
373e3e4ce47SNicolas Toromanoff res = drvcrypt_authenc_alloc_ctx(&c, algo);
374e3e4ce47SNicolas Toromanoff
375e3e4ce47SNicolas Toromanoff if (res == TEE_ERROR_NOT_IMPLEMENTED) {
376d0620b01SJens Wiklander switch (algo) {
377d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM)
378d0620b01SJens Wiklander case TEE_ALG_AES_CCM:
379f1e9b21bSJens Wiklander res = crypto_aes_ccm_alloc_ctx(&c);
380f1e9b21bSJens Wiklander break;
381d0620b01SJens Wiklander #endif
382d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM)
383d0620b01SJens Wiklander case TEE_ALG_AES_GCM:
384f1e9b21bSJens Wiklander res = crypto_aes_gcm_alloc_ctx(&c);
385f1e9b21bSJens Wiklander break;
386d0620b01SJens Wiklander #endif
387d0620b01SJens Wiklander default:
388e3e4ce47SNicolas Toromanoff break;
389e3e4ce47SNicolas Toromanoff }
3908875ce46SJens Wiklander }
391f1e9b21bSJens Wiklander
392f1e9b21bSJens Wiklander if (!res)
393f1e9b21bSJens Wiklander *ctx = c;
394f1e9b21bSJens Wiklander
395f1e9b21bSJens Wiklander return res;
396d0620b01SJens Wiklander }
3978875ce46SJens Wiklander
ae_ops(void * ctx)398f1e9b21bSJens Wiklander static const struct crypto_authenc_ops *ae_ops(void *ctx)
399d7ac7d0fSJens Wiklander {
400f1e9b21bSJens Wiklander struct crypto_authenc_ctx *c = ctx;
401f1e9b21bSJens Wiklander
402f1e9b21bSJens Wiklander assert(c && c->ops);
403f1e9b21bSJens Wiklander
404f1e9b21bSJens Wiklander return c->ops;
405d7ac7d0fSJens Wiklander }
406d7ac7d0fSJens Wiklander
crypto_authenc_init(void * ctx,TEE_OperationMode mode,const uint8_t * key,size_t key_len,const uint8_t * nonce,size_t nonce_len,size_t tag_len,size_t aad_len,size_t payload_len)40752ee414bSJens Wiklander TEE_Result crypto_authenc_init(void *ctx, TEE_OperationMode mode,
408f1e9b21bSJens Wiklander const uint8_t *key, size_t key_len,
409f1e9b21bSJens Wiklander const uint8_t *nonce, size_t nonce_len,
410f1e9b21bSJens Wiklander size_t tag_len, size_t aad_len,
411f1e9b21bSJens Wiklander size_t payload_len)
412d7ac7d0fSJens Wiklander {
413f1e9b21bSJens Wiklander return ae_ops(ctx)->init(ctx, mode, key, key_len, nonce, nonce_len,
414f1e9b21bSJens Wiklander tag_len, aad_len, payload_len);
415d7ac7d0fSJens Wiklander }
416d7ac7d0fSJens Wiklander
crypto_authenc_update_aad(void * ctx,TEE_OperationMode mode __unused,const uint8_t * data,size_t len)41752ee414bSJens Wiklander TEE_Result crypto_authenc_update_aad(void *ctx, TEE_OperationMode mode __unused,
418f1e9b21bSJens Wiklander const uint8_t *data, size_t len)
4198875ce46SJens Wiklander {
420f1e9b21bSJens Wiklander return ae_ops(ctx)->update_aad(ctx, data, len);
421d0620b01SJens Wiklander }
4228875ce46SJens Wiklander
423d0620b01SJens Wiklander
crypto_authenc_update_payload(void * ctx,TEE_OperationMode mode,const uint8_t * src_data,size_t src_len,uint8_t * dst_data,size_t * dst_len)42452ee414bSJens Wiklander TEE_Result crypto_authenc_update_payload(void *ctx, TEE_OperationMode mode,
425f1e9b21bSJens Wiklander const uint8_t *src_data,
426f1e9b21bSJens Wiklander size_t src_len, uint8_t *dst_data,
427f1e9b21bSJens Wiklander size_t *dst_len)
428f1e9b21bSJens Wiklander {
429f1e9b21bSJens Wiklander if (*dst_len < src_len)
430d0620b01SJens Wiklander return TEE_ERROR_SHORT_BUFFER;
431d0620b01SJens Wiklander *dst_len = src_len;
432d0620b01SJens Wiklander
433f1e9b21bSJens Wiklander return ae_ops(ctx)->update_payload(ctx, mode, src_data, src_len,
434f1e9b21bSJens Wiklander dst_data);
435d0620b01SJens Wiklander }
4368875ce46SJens Wiklander
crypto_authenc_enc_final(void * ctx,const uint8_t * src_data,size_t src_len,uint8_t * dst_data,size_t * dst_len,uint8_t * dst_tag,size_t * dst_tag_len)43752ee414bSJens Wiklander TEE_Result crypto_authenc_enc_final(void *ctx, const uint8_t *src_data,
43852ee414bSJens Wiklander size_t src_len, uint8_t *dst_data,
43952ee414bSJens Wiklander size_t *dst_len, uint8_t *dst_tag,
44052ee414bSJens Wiklander size_t *dst_tag_len)
4418875ce46SJens Wiklander {
442f1e9b21bSJens Wiklander if (*dst_len < src_len)
443f1e9b21bSJens Wiklander return TEE_ERROR_SHORT_BUFFER;
444d0620b01SJens Wiklander *dst_len = src_len;
445d0620b01SJens Wiklander
446f1e9b21bSJens Wiklander return ae_ops(ctx)->enc_final(ctx, src_data, src_len, dst_data,
447f1e9b21bSJens Wiklander dst_tag, dst_tag_len);
4488875ce46SJens Wiklander }
4498875ce46SJens Wiklander
crypto_authenc_dec_final(void * ctx,const uint8_t * src_data,size_t src_len,uint8_t * dst_data,size_t * dst_len,const uint8_t * tag,size_t tag_len)45052ee414bSJens Wiklander TEE_Result crypto_authenc_dec_final(void *ctx, const uint8_t *src_data,
45152ee414bSJens Wiklander size_t src_len, uint8_t *dst_data,
45252ee414bSJens Wiklander size_t *dst_len, const uint8_t *tag,
45352ee414bSJens Wiklander size_t tag_len)
4548875ce46SJens Wiklander {
455f1e9b21bSJens Wiklander if (*dst_len < src_len)
456f1e9b21bSJens Wiklander return TEE_ERROR_SHORT_BUFFER;
457f1e9b21bSJens Wiklander *dst_len = src_len;
458f1e9b21bSJens Wiklander
459f1e9b21bSJens Wiklander return ae_ops(ctx)->dec_final(ctx, src_data, src_len, dst_data, tag,
460f1e9b21bSJens Wiklander tag_len);
4618875ce46SJens Wiklander }
462f1e9b21bSJens Wiklander
crypto_authenc_final(void * ctx)46352ee414bSJens Wiklander void crypto_authenc_final(void *ctx)
464f1e9b21bSJens Wiklander {
465f1e9b21bSJens Wiklander ae_ops(ctx)->final(ctx);
466f1e9b21bSJens Wiklander }
467f1e9b21bSJens Wiklander
crypto_authenc_free_ctx(void * ctx)46852ee414bSJens Wiklander void crypto_authenc_free_ctx(void *ctx)
469f1e9b21bSJens Wiklander {
470f1e9b21bSJens Wiklander if (ctx)
471f1e9b21bSJens Wiklander ae_ops(ctx)->free_ctx(ctx);
472f1e9b21bSJens Wiklander }
473f1e9b21bSJens Wiklander
crypto_authenc_copy_state(void * dst_ctx,void * src_ctx)47452ee414bSJens Wiklander void crypto_authenc_copy_state(void *dst_ctx, void *src_ctx)
475f1e9b21bSJens Wiklander {
476f1e9b21bSJens Wiklander ae_ops(dst_ctx)->copy_state(dst_ctx, src_ctx);
477d0620b01SJens Wiklander }
47833790cc1SJens Wiklander
479da1de557SJens Wiklander #if !defined(CFG_CRYPTO_RSA) && !defined(CFG_CRYPTO_DSA) && \
480da1de557SJens Wiklander !defined(CFG_CRYPTO_DH) && !defined(CFG_CRYPTO_ECC)
crypto_bignum_allocate(size_t size_bits __unused)48133790cc1SJens Wiklander struct bignum *crypto_bignum_allocate(size_t size_bits __unused)
48233790cc1SJens Wiklander {
48333790cc1SJens Wiklander return NULL;
48433790cc1SJens Wiklander }
48533790cc1SJens Wiklander
crypto_bignum_bin2bn(const uint8_t * from __unused,size_t fromsize __unused,struct bignum * to __unused)48633790cc1SJens Wiklander TEE_Result crypto_bignum_bin2bn(const uint8_t *from __unused,
48733790cc1SJens Wiklander size_t fromsize __unused,
48833790cc1SJens Wiklander struct bignum *to __unused)
48933790cc1SJens Wiklander {
49033790cc1SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED;
49133790cc1SJens Wiklander }
49233790cc1SJens Wiklander
crypto_bignum_num_bytes(struct bignum * a __unused)49333790cc1SJens Wiklander size_t crypto_bignum_num_bytes(struct bignum *a __unused)
49433790cc1SJens Wiklander {
49533790cc1SJens Wiklander return 0;
49633790cc1SJens Wiklander }
49733790cc1SJens Wiklander
crypto_bignum_num_bits(struct bignum * a __unused)49833790cc1SJens Wiklander size_t crypto_bignum_num_bits(struct bignum *a __unused)
49933790cc1SJens Wiklander {
50033790cc1SJens Wiklander return 0;
50133790cc1SJens Wiklander }
50233790cc1SJens Wiklander
50333790cc1SJens Wiklander /*
50433790cc1SJens Wiklander * crypto_bignum_allocate() and crypto_bignum_bin2bn() failing should be
50533790cc1SJens Wiklander * enough to guarantee that the functions calling this function aren't
50633790cc1SJens Wiklander * called, but just in case add a panic() here to avoid unexpected
50733790cc1SJens Wiklander * behavoir.
50833790cc1SJens Wiklander */
bignum_cant_happen(void)50933790cc1SJens Wiklander static void bignum_cant_happen(void)
51033790cc1SJens Wiklander {
51133790cc1SJens Wiklander volatile bool b = true;
51233790cc1SJens Wiklander
51333790cc1SJens Wiklander /* Avoid warning about function does not return */
51433790cc1SJens Wiklander if (b)
51533790cc1SJens Wiklander panic();
51633790cc1SJens Wiklander }
51733790cc1SJens Wiklander
crypto_bignum_bn2bin(const struct bignum * from __unused,uint8_t * to __unused)51833790cc1SJens Wiklander void crypto_bignum_bn2bin(const struct bignum *from __unused,
51933790cc1SJens Wiklander uint8_t *to __unused)
52033790cc1SJens Wiklander {
52133790cc1SJens Wiklander bignum_cant_happen();
52233790cc1SJens Wiklander }
52333790cc1SJens Wiklander
crypto_bignum_copy(struct bignum * to __unused,const struct bignum * from __unused)52433790cc1SJens Wiklander void crypto_bignum_copy(struct bignum *to __unused,
52533790cc1SJens Wiklander const struct bignum *from __unused)
52633790cc1SJens Wiklander {
52733790cc1SJens Wiklander bignum_cant_happen();
52833790cc1SJens Wiklander }
52933790cc1SJens Wiklander
crypto_bignum_free(struct bignum ** a)530e2ec831cSJihwan Park void crypto_bignum_free(struct bignum **a)
53133790cc1SJens Wiklander {
532e2ec831cSJihwan Park if (a && *a)
53333790cc1SJens Wiklander panic();
53433790cc1SJens Wiklander }
53533790cc1SJens Wiklander
crypto_bignum_clear(struct bignum * a __unused)53633790cc1SJens Wiklander void crypto_bignum_clear(struct bignum *a __unused)
53733790cc1SJens Wiklander {
53833790cc1SJens Wiklander bignum_cant_happen();
53933790cc1SJens Wiklander }
54033790cc1SJens Wiklander
54133790cc1SJens Wiklander /* return -1 if a<b, 0 if a==b, +1 if a>b */
crypto_bignum_compare(struct bignum * a __unused,struct bignum * b __unused)54233790cc1SJens Wiklander int32_t crypto_bignum_compare(struct bignum *a __unused,
54333790cc1SJens Wiklander struct bignum *b __unused)
54433790cc1SJens Wiklander {
54533790cc1SJens Wiklander bignum_cant_happen();
54633790cc1SJens Wiklander return -1;
54733790cc1SJens Wiklander }
548da1de557SJens Wiklander #endif
549291e5450SJens Wiklander
550da1de557SJens Wiklander #if !defined(CFG_CRYPTO_RSA)
crypto_acipher_alloc_rsa_keypair(struct rsa_keypair * s __unused,size_t key_size_bits __unused)551291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_rsa_keypair(struct rsa_keypair *s __unused,
552291e5450SJens Wiklander size_t key_size_bits __unused)
553291e5450SJens Wiklander {
554291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED;
555291e5450SJens Wiklander }
556291e5450SJens Wiklander
557291e5450SJens Wiklander TEE_Result
crypto_acipher_alloc_rsa_public_key(struct rsa_public_key * s __unused,size_t key_size_bits __unused)558291e5450SJens Wiklander crypto_acipher_alloc_rsa_public_key(struct rsa_public_key *s __unused,
559291e5450SJens Wiklander size_t key_size_bits __unused)
560291e5450SJens Wiklander {
561291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED;
562291e5450SJens Wiklander }
563291e5450SJens Wiklander
crypto_acipher_free_rsa_public_key(struct rsa_public_key * s __unused)564291e5450SJens Wiklander void crypto_acipher_free_rsa_public_key(struct rsa_public_key *s __unused)
565291e5450SJens Wiklander {
566291e5450SJens Wiklander }
567291e5450SJens Wiklander
crypto_acipher_free_rsa_keypair(struct rsa_keypair * s __unused)568a1d5c81fSElias von Däniken void crypto_acipher_free_rsa_keypair(struct rsa_keypair *s __unused)
569a1d5c81fSElias von Däniken {
570a1d5c81fSElias von Däniken }
571a1d5c81fSElias von Däniken
crypto_acipher_gen_rsa_key(struct rsa_keypair * key __unused,size_t key_size __unused)572291e5450SJens Wiklander TEE_Result crypto_acipher_gen_rsa_key(struct rsa_keypair *key __unused,
573291e5450SJens Wiklander size_t key_size __unused)
574291e5450SJens Wiklander {
575291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED;
576291e5450SJens Wiklander }
577291e5450SJens Wiklander
crypto_acipher_rsanopad_decrypt(struct rsa_keypair * key __unused,const uint8_t * src __unused,size_t src_len __unused,uint8_t * dst __unused,size_t * dst_len __unused)578291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_decrypt(struct rsa_keypair *key __unused,
579291e5450SJens Wiklander const uint8_t *src __unused,
580291e5450SJens Wiklander size_t src_len __unused,
581291e5450SJens Wiklander uint8_t *dst __unused,
582291e5450SJens Wiklander size_t *dst_len __unused)
583291e5450SJens Wiklander {
584291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED;
585291e5450SJens Wiklander }
586291e5450SJens Wiklander
crypto_acipher_rsanopad_encrypt(struct rsa_public_key * key __unused,const uint8_t * src __unused,size_t src_len __unused,uint8_t * dst __unused,size_t * dst_len __unused)587291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_encrypt(struct rsa_public_key *key __unused,
588291e5450SJens Wiklander const uint8_t *src __unused,
589291e5450SJens Wiklander size_t src_len __unused,
590291e5450SJens Wiklander uint8_t *dst __unused,
591291e5450SJens Wiklander size_t *dst_len __unused)
592291e5450SJens Wiklander {
593291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED;
594291e5450SJens Wiklander }
595291e5450SJens Wiklander
crypto_acipher_rsaes_decrypt(uint32_t algo __unused,struct rsa_keypair * key __unused,const uint8_t * label __unused,size_t label_len __unused,uint32_t mgf_algo __unused,const uint8_t * src __unused,size_t src_len __unused,uint8_t * dst __unused,size_t * dst_len __unused)596291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_decrypt(uint32_t algo __unused,
597291e5450SJens Wiklander struct rsa_keypair *key __unused,
598291e5450SJens Wiklander const uint8_t *label __unused,
599291e5450SJens Wiklander size_t label_len __unused,
600*86ee543bSSami Tolvanen uint32_t mgf_algo __unused,
601291e5450SJens Wiklander const uint8_t *src __unused,
602291e5450SJens Wiklander size_t src_len __unused,
603291e5450SJens Wiklander uint8_t *dst __unused,
604291e5450SJens Wiklander size_t *dst_len __unused)
605291e5450SJens Wiklander {
606291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED;
607291e5450SJens Wiklander }
608291e5450SJens Wiklander
crypto_acipher_rsaes_encrypt(uint32_t algo __unused,struct rsa_public_key * key __unused,const uint8_t * label __unused,size_t label_len __unused,uint32_t mgf_algo __unused,const uint8_t * src __unused,size_t src_len __unused,uint8_t * dst __unused,size_t * dst_len __unused)609291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_encrypt(uint32_t algo __unused,
610291e5450SJens Wiklander struct rsa_public_key *key __unused,
611291e5450SJens Wiklander const uint8_t *label __unused,
612291e5450SJens Wiklander size_t label_len __unused,
613*86ee543bSSami Tolvanen uint32_t mgf_algo __unused,
614291e5450SJens Wiklander const uint8_t *src __unused,
615291e5450SJens Wiklander size_t src_len __unused,
616291e5450SJens Wiklander uint8_t *dst __unused,
617291e5450SJens Wiklander size_t *dst_len __unused)
618291e5450SJens Wiklander {
619291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED;
620291e5450SJens Wiklander }
621291e5450SJens Wiklander
crypto_acipher_rsassa_sign(uint32_t algo __unused,struct rsa_keypair * key __unused,int salt_len __unused,const uint8_t * msg __unused,size_t msg_len __unused,uint8_t * sig __unused,size_t * sig_len __unused)622291e5450SJens Wiklander TEE_Result crypto_acipher_rsassa_sign(uint32_t algo __unused,
623291e5450SJens Wiklander struct rsa_keypair *key __unused,
624291e5450SJens Wiklander int salt_len __unused,
625291e5450SJens Wiklander const uint8_t *msg __unused,
626291e5450SJens Wiklander size_t msg_len __unused,
627291e5450SJens Wiklander uint8_t *sig __unused,
628291e5450SJens Wiklander size_t *sig_len __unused)
629291e5450SJens Wiklander {
630291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED;
631291e5450SJens Wiklander }
632291e5450SJens Wiklander
crypto_acipher_rsassa_verify(uint32_t algo __unused,struct rsa_public_key * key __unused,int salt_len __unused,const uint8_t * msg __unused,size_t msg_len __unused,const uint8_t * sig __unused,size_t sig_len __unused)633291e5450SJens Wiklander TEE_Result crypto_acipher_rsassa_verify(uint32_t algo __unused,
634291e5450SJens Wiklander struct rsa_public_key *key __unused,
635291e5450SJens Wiklander int salt_len __unused,
636291e5450SJens Wiklander const uint8_t *msg __unused,
637291e5450SJens Wiklander size_t msg_len __unused,
638291e5450SJens Wiklander const uint8_t *sig __unused,
639291e5450SJens Wiklander size_t sig_len __unused)
640291e5450SJens Wiklander {
641291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED;
642291e5450SJens Wiklander }
643da1de557SJens Wiklander #endif /*!CFG_CRYPTO_RSA*/
644291e5450SJens Wiklander
645da1de557SJens Wiklander #if !defined(CFG_CRYPTO_DSA)
crypto_acipher_alloc_dsa_keypair(struct dsa_keypair * s __unused,size_t key_size_bits __unused)646291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dsa_keypair(struct dsa_keypair *s __unused,
647291e5450SJens Wiklander size_t key_size_bits __unused)
648291e5450SJens Wiklander {
649291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED;
650291e5450SJens Wiklander }
651291e5450SJens Wiklander
652291e5450SJens Wiklander TEE_Result
crypto_acipher_alloc_dsa_public_key(struct dsa_public_key * s __unused,size_t key_size_bits __unused)653291e5450SJens Wiklander crypto_acipher_alloc_dsa_public_key(struct dsa_public_key *s __unused,
654291e5450SJens Wiklander size_t key_size_bits __unused)
655291e5450SJens Wiklander {
656291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED;
657291e5450SJens Wiklander }
658291e5450SJens Wiklander
crypto_acipher_gen_dsa_key(struct dsa_keypair * key __unused,size_t key_size __unused)659291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dsa_key(struct dsa_keypair *key __unused,
660291e5450SJens Wiklander size_t key_size __unused)
661291e5450SJens Wiklander {
662291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED;
663291e5450SJens Wiklander }
664291e5450SJens Wiklander
crypto_acipher_dsa_sign(uint32_t algo __unused,struct dsa_keypair * key __unused,const uint8_t * msg __unused,size_t msg_len __unused,uint8_t * sig __unused,size_t * sig_len __unused)665291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_sign(uint32_t algo __unused,
666291e5450SJens Wiklander struct dsa_keypair *key __unused,
667291e5450SJens Wiklander const uint8_t *msg __unused,
668291e5450SJens Wiklander size_t msg_len __unused,
669291e5450SJens Wiklander uint8_t *sig __unused,
670291e5450SJens Wiklander size_t *sig_len __unused)
671291e5450SJens Wiklander {
672291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED;
673291e5450SJens Wiklander }
674291e5450SJens Wiklander
crypto_acipher_dsa_verify(uint32_t algo __unused,struct dsa_public_key * key __unused,const uint8_t * msg __unused,size_t msg_len __unused,const uint8_t * sig __unused,size_t sig_len __unused)675291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_verify(uint32_t algo __unused,
676291e5450SJens Wiklander struct dsa_public_key *key __unused,
677291e5450SJens Wiklander const uint8_t *msg __unused,
678291e5450SJens Wiklander size_t msg_len __unused,
679291e5450SJens Wiklander const uint8_t *sig __unused,
680291e5450SJens Wiklander size_t sig_len __unused)
681291e5450SJens Wiklander {
682291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED;
683291e5450SJens Wiklander }
684da1de557SJens Wiklander #endif /*!CFG_CRYPTO_DSA*/
685291e5450SJens Wiklander
686da1de557SJens Wiklander #if !defined(CFG_CRYPTO_DH)
crypto_acipher_alloc_dh_keypair(struct dh_keypair * s __unused,size_t key_size_bits __unused)687291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dh_keypair(struct dh_keypair *s __unused,
688291e5450SJens Wiklander size_t key_size_bits __unused)
689291e5450SJens Wiklander {
690291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED;
691291e5450SJens Wiklander }
692291e5450SJens Wiklander
crypto_acipher_gen_dh_key(struct dh_keypair * key __unused,struct bignum * q __unused,size_t xbits __unused,size_t key_size __unused)693291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dh_key(struct dh_keypair *key __unused,
694291e5450SJens Wiklander struct bignum *q __unused,
6959f4dcefbSJerome Forissier size_t xbits __unused,
6969f4dcefbSJerome Forissier size_t key_size __unused)
697291e5450SJens Wiklander {
698291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED;
699291e5450SJens Wiklander }
700291e5450SJens Wiklander
701291e5450SJens Wiklander TEE_Result
crypto_acipher_dh_shared_secret(struct dh_keypair * private_key __unused,struct bignum * public_key __unused,struct bignum * secret __unused)702291e5450SJens Wiklander crypto_acipher_dh_shared_secret(struct dh_keypair *private_key __unused,
703291e5450SJens Wiklander struct bignum *public_key __unused,
704291e5450SJens Wiklander struct bignum *secret __unused)
705291e5450SJens Wiklander {
706291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED;
707291e5450SJens Wiklander }
708da1de557SJens Wiklander #endif /*!CFG_CRYPTO_DH*/
709291e5450SJens Wiklander
crypto_acipher_alloc_ecc_public_key(struct ecc_public_key * key,uint32_t key_type,size_t key_size_bits)710df00cf59SCedric Neveux TEE_Result crypto_acipher_alloc_ecc_public_key(struct ecc_public_key *key,
711df00cf59SCedric Neveux uint32_t key_type,
712df00cf59SCedric Neveux size_t key_size_bits)
713291e5450SJens Wiklander {
714df00cf59SCedric Neveux TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED;
715df00cf59SCedric Neveux
716df00cf59SCedric Neveux /*
717df00cf59SCedric Neveux * Use default cryptographic implementation if no matching
718df00cf59SCedric Neveux * drvcrypt device.
719df00cf59SCedric Neveux */
720df00cf59SCedric Neveux res = drvcrypt_asym_alloc_ecc_public_key(key, key_type, key_size_bits);
721df00cf59SCedric Neveux if (res == TEE_ERROR_NOT_IMPLEMENTED)
722df00cf59SCedric Neveux res = crypto_asym_alloc_ecc_public_key(key, key_type,
723df00cf59SCedric Neveux key_size_bits);
724df00cf59SCedric Neveux
725df00cf59SCedric Neveux return res;
726291e5450SJens Wiklander }
727291e5450SJens Wiklander
crypto_acipher_alloc_ecc_keypair(struct ecc_keypair * key,uint32_t key_type,size_t key_size_bits)728df00cf59SCedric Neveux TEE_Result crypto_acipher_alloc_ecc_keypair(struct ecc_keypair *key,
729df00cf59SCedric Neveux uint32_t key_type,
730df00cf59SCedric Neveux size_t key_size_bits)
731291e5450SJens Wiklander {
732df00cf59SCedric Neveux TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED;
733df00cf59SCedric Neveux
734df00cf59SCedric Neveux /*
735df00cf59SCedric Neveux * Use default cryptographic implementation if no matching
736df00cf59SCedric Neveux * drvcrypt device.
737df00cf59SCedric Neveux */
738df00cf59SCedric Neveux res = drvcrypt_asym_alloc_ecc_keypair(key, key_type, key_size_bits);
739df00cf59SCedric Neveux if (res == TEE_ERROR_NOT_IMPLEMENTED)
740df00cf59SCedric Neveux res = crypto_asym_alloc_ecc_keypair(key, key_type,
741df00cf59SCedric Neveux key_size_bits);
742df00cf59SCedric Neveux
743df00cf59SCedric Neveux return res;
744291e5450SJens Wiklander }
745291e5450SJens Wiklander
crypto_acipher_free_ecc_public_key(struct ecc_public_key * key)746df00cf59SCedric Neveux void crypto_acipher_free_ecc_public_key(struct ecc_public_key *key)
747291e5450SJens Wiklander {
748df00cf59SCedric Neveux assert(key->ops && key->ops->free);
749df00cf59SCedric Neveux
750df00cf59SCedric Neveux key->ops->free(key);
751291e5450SJens Wiklander }
752291e5450SJens Wiklander
crypto_acipher_gen_ecc_key(struct ecc_keypair * key,size_t key_size_bits)753df00cf59SCedric Neveux TEE_Result crypto_acipher_gen_ecc_key(struct ecc_keypair *key,
754df00cf59SCedric Neveux size_t key_size_bits)
755291e5450SJens Wiklander {
756df00cf59SCedric Neveux assert(key->ops && key->ops->generate);
757df00cf59SCedric Neveux
758df00cf59SCedric Neveux return key->ops->generate(key, key_size_bits);
759291e5450SJens Wiklander }
760291e5450SJens Wiklander
crypto_acipher_ecc_sign(uint32_t algo,struct ecc_keypair * key,const uint8_t * msg,size_t msg_len,uint8_t * sig,size_t * sig_len)761df00cf59SCedric Neveux TEE_Result crypto_acipher_ecc_sign(uint32_t algo, struct ecc_keypair *key,
762df00cf59SCedric Neveux const uint8_t *msg, size_t msg_len,
763df00cf59SCedric Neveux uint8_t *sig, size_t *sig_len)
764291e5450SJens Wiklander {
765df00cf59SCedric Neveux assert(key->ops);
766df00cf59SCedric Neveux
767df00cf59SCedric Neveux if (!key->ops->sign)
768291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED;
769df00cf59SCedric Neveux
770df00cf59SCedric Neveux return key->ops->sign(algo, key, msg, msg_len, sig, sig_len);
771291e5450SJens Wiklander }
772291e5450SJens Wiklander
crypto_acipher_ecc_verify(uint32_t algo,struct ecc_public_key * key,const uint8_t * msg,size_t msg_len,const uint8_t * sig,size_t sig_len)773df00cf59SCedric Neveux TEE_Result crypto_acipher_ecc_verify(uint32_t algo, struct ecc_public_key *key,
774df00cf59SCedric Neveux const uint8_t *msg, size_t msg_len,
775df00cf59SCedric Neveux const uint8_t *sig, size_t sig_len)
776291e5450SJens Wiklander {
777df00cf59SCedric Neveux assert(key->ops);
778df00cf59SCedric Neveux
779df00cf59SCedric Neveux if (!key->ops->verify)
780291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED;
781df00cf59SCedric Neveux
782df00cf59SCedric Neveux return key->ops->verify(algo, key, msg, msg_len, sig, sig_len);
783291e5450SJens Wiklander }
784291e5450SJens Wiklander
crypto_acipher_ecc_shared_secret(struct ecc_keypair * private_key,struct ecc_public_key * public_key,void * secret,unsigned long * secret_len)785df00cf59SCedric Neveux TEE_Result crypto_acipher_ecc_shared_secret(struct ecc_keypair *private_key,
786df00cf59SCedric Neveux struct ecc_public_key *public_key,
787df00cf59SCedric Neveux void *secret,
788df00cf59SCedric Neveux unsigned long *secret_len)
789291e5450SJens Wiklander {
790df00cf59SCedric Neveux assert(private_key->ops);
791df00cf59SCedric Neveux
792df00cf59SCedric Neveux if (!private_key->ops->shared_secret)
793291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED;
794df00cf59SCedric Neveux
795df00cf59SCedric Neveux return private_key->ops->shared_secret(private_key, public_key, secret,
796df00cf59SCedric Neveux secret_len);
797291e5450SJens Wiklander }
79891fc6bd8SJerome Forissier
crypto_acipher_sm2_pke_decrypt(struct ecc_keypair * key,const uint8_t * src,size_t src_len,uint8_t * dst,size_t * dst_len)799884fd190SCedric Neveux TEE_Result crypto_acipher_sm2_pke_decrypt(struct ecc_keypair *key,
800884fd190SCedric Neveux const uint8_t *src, size_t src_len,
801884fd190SCedric Neveux uint8_t *dst, size_t *dst_len)
80291fc6bd8SJerome Forissier {
803884fd190SCedric Neveux assert(key->ops);
804884fd190SCedric Neveux
805884fd190SCedric Neveux if (!key->ops->decrypt)
80691fc6bd8SJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED;
807884fd190SCedric Neveux
808884fd190SCedric Neveux return key->ops->decrypt(key, src, src_len, dst, dst_len);
80991fc6bd8SJerome Forissier }
81091fc6bd8SJerome Forissier
crypto_acipher_sm2_pke_encrypt(struct ecc_public_key * key,const uint8_t * src,size_t src_len,uint8_t * dst,size_t * dst_len)811884fd190SCedric Neveux TEE_Result crypto_acipher_sm2_pke_encrypt(struct ecc_public_key *key,
812884fd190SCedric Neveux const uint8_t *src, size_t src_len,
813884fd190SCedric Neveux uint8_t *dst, size_t *dst_len)
81491fc6bd8SJerome Forissier {
815884fd190SCedric Neveux assert(key->ops);
816884fd190SCedric Neveux
817884fd190SCedric Neveux if (!key->ops->encrypt)
81891fc6bd8SJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED;
819884fd190SCedric Neveux
820884fd190SCedric Neveux return key->ops->encrypt(key, src, src_len, dst, dst_len);
82191fc6bd8SJerome Forissier }
8220f151943SJerome Forissier
8235b385b3fSJerome Forissier #if !defined(CFG_CRYPTO_SM2_KEP)
crypto_acipher_sm2_kep_derive(struct ecc_keypair * my_key __unused,struct ecc_keypair * my_eph_key __unused,struct ecc_public_key * peer_key __unused,struct ecc_public_key * peer_eph_key __unused,struct sm2_kep_parms * p __unused)8245b385b3fSJerome Forissier TEE_Result crypto_acipher_sm2_kep_derive(struct ecc_keypair *my_key __unused,
8255b385b3fSJerome Forissier struct ecc_keypair *my_eph_key
8265b385b3fSJerome Forissier __unused,
8275b385b3fSJerome Forissier struct ecc_public_key *peer_key
8285b385b3fSJerome Forissier __unused,
8295b385b3fSJerome Forissier struct ecc_public_key *peer_eph_key
8305b385b3fSJerome Forissier __unused,
8315b385b3fSJerome Forissier struct sm2_kep_parms *p __unused)
8325b385b3fSJerome Forissier {
8335b385b3fSJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED;
8345b385b3fSJerome Forissier }
8355b385b3fSJerome Forissier #endif
8365dfe86d0SJorge Ramirez-Ortiz
83790040fa4SSohaib ul Hassan #if !defined(CFG_CRYPTO_X25519)
crypto_acipher_alloc_x25519_keypair(struct montgomery_keypair * key __unused,size_t key_size_bits __unused)83846e25a17Sloubaihui TEE_Result crypto_acipher_alloc_x25519_keypair(struct montgomery_keypair *key
83990040fa4SSohaib ul Hassan __unused,
84090040fa4SSohaib ul Hassan size_t key_size_bits __unused)
84190040fa4SSohaib ul Hassan {
84290040fa4SSohaib ul Hassan return TEE_ERROR_NOT_IMPLEMENTED;
84390040fa4SSohaib ul Hassan }
84490040fa4SSohaib ul Hassan
crypto_acipher_gen_x25519_key(struct montgomery_keypair * key __unused,size_t key_size __unused)84546e25a17Sloubaihui TEE_Result crypto_acipher_gen_x25519_key(struct montgomery_keypair
84646e25a17Sloubaihui *key __unused,
84790040fa4SSohaib ul Hassan size_t key_size __unused)
84890040fa4SSohaib ul Hassan {
84990040fa4SSohaib ul Hassan return TEE_ERROR_NOT_IMPLEMENTED;
85090040fa4SSohaib ul Hassan }
85190040fa4SSohaib ul Hassan
crypto_acipher_x25519_shared_secret(struct montgomery_keypair * private_key __unused,void * public_key __unused,void * secret __unused,unsigned long * secret_len __unused)85246e25a17Sloubaihui TEE_Result crypto_acipher_x25519_shared_secret(struct montgomery_keypair
85390040fa4SSohaib ul Hassan *private_key __unused,
85490040fa4SSohaib ul Hassan void *public_key __unused,
85590040fa4SSohaib ul Hassan void *secret __unused,
85690040fa4SSohaib ul Hassan unsigned long
85790040fa4SSohaib ul Hassan *secret_len __unused)
85890040fa4SSohaib ul Hassan {
85990040fa4SSohaib ul Hassan return TEE_ERROR_NOT_IMPLEMENTED;
86090040fa4SSohaib ul Hassan }
86190040fa4SSohaib ul Hassan #endif
86290040fa4SSohaib ul Hassan
86334ce35b1Sloubaihui #if !defined(CFG_CRYPTO_X448)
crypto_acipher_alloc_x448_keypair(struct montgomery_keypair * key __unused,size_t key_size_bits __unused)86434ce35b1Sloubaihui TEE_Result crypto_acipher_alloc_x448_keypair(struct montgomery_keypair *key
86534ce35b1Sloubaihui __unused,
86634ce35b1Sloubaihui size_t key_size_bits __unused)
86734ce35b1Sloubaihui {
86834ce35b1Sloubaihui return TEE_ERROR_NOT_IMPLEMENTED;
86934ce35b1Sloubaihui }
87034ce35b1Sloubaihui
crypto_acipher_gen_x448_key(struct montgomery_keypair * key __unused,size_t key_size __unused)87134ce35b1Sloubaihui TEE_Result crypto_acipher_gen_x448_key(struct montgomery_keypair *key __unused,
87234ce35b1Sloubaihui size_t key_size __unused)
87334ce35b1Sloubaihui {
87434ce35b1Sloubaihui return TEE_ERROR_NOT_IMPLEMENTED;
87534ce35b1Sloubaihui }
87634ce35b1Sloubaihui
crypto_acipher_x448_shared_secret(struct montgomery_keypair * private_key __unused,void * public_key __unused,void * secret __unused,unsigned long * secret_len __unused)87734ce35b1Sloubaihui TEE_Result crypto_acipher_x448_shared_secret(struct montgomery_keypair
87834ce35b1Sloubaihui *private_key __unused,
87934ce35b1Sloubaihui void *public_key __unused,
88034ce35b1Sloubaihui void *secret __unused,
88134ce35b1Sloubaihui unsigned long
88234ce35b1Sloubaihui *secret_len __unused)
88334ce35b1Sloubaihui {
88434ce35b1Sloubaihui return TEE_ERROR_NOT_IMPLEMENTED;
88534ce35b1Sloubaihui }
88634ce35b1Sloubaihui #endif
88734ce35b1Sloubaihui
888a116848bSValerii Chubar #if !defined(CFG_CRYPTO_ED25519)
crypto_acipher_alloc_ed25519_keypair(struct ed25519_keypair * key __unused,size_t key_size_bits __unused)889a116848bSValerii Chubar TEE_Result crypto_acipher_alloc_ed25519_keypair(struct ed25519_keypair *key
890a116848bSValerii Chubar __unused,
891a116848bSValerii Chubar size_t key_size_bits __unused)
892a116848bSValerii Chubar {
893a116848bSValerii Chubar return TEE_ERROR_NOT_IMPLEMENTED;
894a116848bSValerii Chubar }
895a116848bSValerii Chubar
896c4cab13eSClement Faure TEE_Result
crypto_acipher_alloc_ed25519_public_key(struct ed25519_public_key * key __unused,size_t key_size __unused)897c4cab13eSClement Faure crypto_acipher_alloc_ed25519_public_key(struct ed25519_public_key *key __unused,
898c4cab13eSClement Faure size_t key_size __unused)
899c4cab13eSClement Faure {
900c4cab13eSClement Faure return TEE_ERROR_NOT_IMPLEMENTED;
901c4cab13eSClement Faure }
902c4cab13eSClement Faure
crypto_acipher_gen_ed25519_key(struct ed25519_keypair * key __unused,size_t key_size __unused)903a116848bSValerii Chubar TEE_Result crypto_acipher_gen_ed25519_key(struct ed25519_keypair *key __unused,
904a116848bSValerii Chubar size_t key_size __unused)
905a116848bSValerii Chubar {
906a116848bSValerii Chubar return TEE_ERROR_NOT_IMPLEMENTED;
907a116848bSValerii Chubar }
908a116848bSValerii Chubar
crypto_acipher_ed25519_sign(struct ed25519_keypair * key __unused,const uint8_t * msg __unused,size_t msg_len __unused,uint8_t * sig __unused,size_t * sig_len __unused)909a116848bSValerii Chubar TEE_Result crypto_acipher_ed25519_sign(struct ed25519_keypair *key __unused,
910a116848bSValerii Chubar const uint8_t *msg __unused,
911a116848bSValerii Chubar size_t msg_len __unused,
912a116848bSValerii Chubar uint8_t *sig __unused,
913a116848bSValerii Chubar size_t *sig_len __unused)
914a116848bSValerii Chubar {
915a116848bSValerii Chubar return TEE_ERROR_NOT_IMPLEMENTED;
916a116848bSValerii Chubar }
917a116848bSValerii Chubar
918c4cab13eSClement Faure TEE_Result
crypto_acipher_ed25519_verify(struct ed25519_public_key * key __unused,const uint8_t * msg __unused,size_t msg_len __unused,const uint8_t * sig __unused,size_t sig_len __unused)919c4cab13eSClement Faure crypto_acipher_ed25519_verify(struct ed25519_public_key *key __unused,
920a116848bSValerii Chubar const uint8_t *msg __unused,
921a116848bSValerii Chubar size_t msg_len __unused,
922a116848bSValerii Chubar const uint8_t *sig __unused,
923a116848bSValerii Chubar size_t sig_len __unused)
924a116848bSValerii Chubar {
925a116848bSValerii Chubar return TEE_ERROR_NOT_IMPLEMENTED;
926a116848bSValerii Chubar }
927a116848bSValerii Chubar
crypto_acipher_ed25519ctx_sign(struct ed25519_keypair * key __unused,const uint8_t * msg __unused,size_t msg_len __unused,uint8_t * sig __unused,size_t * sig_len __unused,bool ph_flag __unused,const uint8_t * ctx __unused,size_t ctxlen __unused)928a116848bSValerii Chubar TEE_Result crypto_acipher_ed25519ctx_sign(struct ed25519_keypair *key __unused,
929a116848bSValerii Chubar const uint8_t *msg __unused,
930a116848bSValerii Chubar size_t msg_len __unused,
931a116848bSValerii Chubar uint8_t *sig __unused,
932a116848bSValerii Chubar size_t *sig_len __unused,
933a116848bSValerii Chubar bool ph_flag __unused,
934a116848bSValerii Chubar const uint8_t *ctx __unused,
935a116848bSValerii Chubar size_t ctxlen __unused)
936a116848bSValerii Chubar {
937a116848bSValerii Chubar return TEE_ERROR_NOT_IMPLEMENTED;
938a116848bSValerii Chubar }
939a116848bSValerii Chubar
940c4cab13eSClement Faure TEE_Result
crypto_acipher_ed25519ctx_verify(struct ed25519_public_key * key __unused,const uint8_t * msg __unused,size_t msg_len __unused,const uint8_t * sig __unused,size_t sig_len __unused,bool ph_flag __unused,const uint8_t * ctx __unused,size_t ctxlen __unused)941c4cab13eSClement Faure crypto_acipher_ed25519ctx_verify(struct ed25519_public_key *key __unused,
942a116848bSValerii Chubar const uint8_t *msg __unused,
943a116848bSValerii Chubar size_t msg_len __unused,
944a116848bSValerii Chubar const uint8_t *sig __unused,
945a116848bSValerii Chubar size_t sig_len __unused,
946a116848bSValerii Chubar bool ph_flag __unused,
947a116848bSValerii Chubar const uint8_t *ctx __unused,
948a116848bSValerii Chubar size_t ctxlen __unused)
949a116848bSValerii Chubar {
950a116848bSValerii Chubar return TEE_ERROR_NOT_IMPLEMENTED;
951a116848bSValerii Chubar }
952a116848bSValerii Chubar #endif
953a116848bSValerii Chubar
crypto_storage_obj_del(struct tee_obj * obj __unused)9546301ca1cSJorge Ramirez-Ortiz __weak TEE_Result crypto_storage_obj_del(struct tee_obj *obj __unused)
9555dfe86d0SJorge Ramirez-Ortiz {
9566301ca1cSJorge Ramirez-Ortiz return TEE_ERROR_NOT_IMPLEMENTED;
9575dfe86d0SJorge Ramirez-Ortiz }
958