xref: /optee_os/core/crypto/crypto.c (revision 260b4028fb46ec798b1a3c580739f93f902f816f)
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>
14d7ac7d0fSJens Wiklander #include <string.h>
156d259e05SJens Wiklander #include <utee_defines.h>
16b887bd8fSJens Wiklander 
176648f482SJens Wiklander TEE_Result crypto_hash_alloc_ctx(void **ctx, uint32_t algo)
18b887bd8fSJens Wiklander {
197222fc6aSCedric Neveux 	TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED;
206648f482SJens Wiklander 	struct crypto_hash_ctx *c = NULL;
216648f482SJens Wiklander 
227222fc6aSCedric Neveux 	/*
23e43ab7a8SCedric Neveux 	 * Use default cryptographic implementation if no matching
247222fc6aSCedric Neveux 	 * drvcrypt device.
257222fc6aSCedric Neveux 	 */
267222fc6aSCedric Neveux 	res = drvcrypt_hash_alloc_ctx(&c, algo);
277222fc6aSCedric Neveux 
287222fc6aSCedric Neveux 	if (res == TEE_ERROR_NOT_IMPLEMENTED) {
296648f482SJens Wiklander 		switch (algo) {
306648f482SJens Wiklander 		case TEE_ALG_MD5:
316648f482SJens Wiklander 			res = crypto_md5_alloc_ctx(&c);
326648f482SJens Wiklander 			break;
336648f482SJens Wiklander 		case TEE_ALG_SHA1:
346648f482SJens Wiklander 			res = crypto_sha1_alloc_ctx(&c);
356648f482SJens Wiklander 			break;
366648f482SJens Wiklander 		case TEE_ALG_SHA224:
376648f482SJens Wiklander 			res = crypto_sha224_alloc_ctx(&c);
386648f482SJens Wiklander 			break;
396648f482SJens Wiklander 		case TEE_ALG_SHA256:
406648f482SJens Wiklander 			res = crypto_sha256_alloc_ctx(&c);
416648f482SJens Wiklander 			break;
426648f482SJens Wiklander 		case TEE_ALG_SHA384:
436648f482SJens Wiklander 			res = crypto_sha384_alloc_ctx(&c);
446648f482SJens Wiklander 			break;
456648f482SJens Wiklander 		case TEE_ALG_SHA512:
466648f482SJens Wiklander 			res = crypto_sha512_alloc_ctx(&c);
476648f482SJens Wiklander 			break;
48*260b4028SJens Wiklander 		case TEE_ALG_SHA3_224:
49*260b4028SJens Wiklander 			res = crypto_sha3_224_alloc_ctx(&c);
50*260b4028SJens Wiklander 			break;
51*260b4028SJens Wiklander 		case TEE_ALG_SHA3_256:
52*260b4028SJens Wiklander 			res = crypto_sha3_256_alloc_ctx(&c);
53*260b4028SJens Wiklander 			break;
54*260b4028SJens Wiklander 		case TEE_ALG_SHA3_384:
55*260b4028SJens Wiklander 			res = crypto_sha3_384_alloc_ctx(&c);
56*260b4028SJens Wiklander 			break;
57*260b4028SJens Wiklander 		case TEE_ALG_SHA3_512:
58*260b4028SJens Wiklander 			res = crypto_sha3_512_alloc_ctx(&c);
59*260b4028SJens Wiklander 			break;
60*260b4028SJens Wiklander 		case TEE_ALG_SHAKE128:
61*260b4028SJens Wiklander 			res = crypto_shake128_alloc_ctx(&c);
62*260b4028SJens Wiklander 			break;
63*260b4028SJens Wiklander 		case TEE_ALG_SHAKE256:
64*260b4028SJens Wiklander 			res = crypto_shake256_alloc_ctx(&c);
65*260b4028SJens Wiklander 			break;
6647645577SJerome Forissier 		case TEE_ALG_SM3:
6747645577SJerome Forissier 			res = crypto_sm3_alloc_ctx(&c);
6847645577SJerome Forissier 			break;
696648f482SJens Wiklander 		default:
707222fc6aSCedric Neveux 			break;
717222fc6aSCedric Neveux 		}
72b887bd8fSJens Wiklander 	}
73b887bd8fSJens Wiklander 
746648f482SJens Wiklander 	if (!res)
756648f482SJens Wiklander 		*ctx = c;
766648f482SJens Wiklander 
776648f482SJens Wiklander 	return res;
786648f482SJens Wiklander }
796648f482SJens Wiklander 
806648f482SJens Wiklander static const struct crypto_hash_ops *hash_ops(void *ctx)
816648f482SJens Wiklander {
826648f482SJens Wiklander 	struct crypto_hash_ctx *c = ctx;
836648f482SJens Wiklander 
846648f482SJens Wiklander 	assert(c && c->ops);
856648f482SJens Wiklander 
866648f482SJens Wiklander 	return c->ops;
876648f482SJens Wiklander }
886648f482SJens Wiklander 
896b3a371cSJens Wiklander void crypto_hash_free_ctx(void *ctx)
90ecf2e014SJens Wiklander {
91ce7a47f5SJerome Forissier 	if (ctx)
926648f482SJens Wiklander 		hash_ops(ctx)->free_ctx(ctx);
93ecf2e014SJens Wiklander }
94ecf2e014SJens Wiklander 
956b3a371cSJens Wiklander void crypto_hash_copy_state(void *dst_ctx, void *src_ctx)
96ecf2e014SJens Wiklander {
976648f482SJens Wiklander 	hash_ops(dst_ctx)->copy_state(dst_ctx, src_ctx);
98ecf2e014SJens Wiklander }
99ecf2e014SJens Wiklander 
1006b3a371cSJens Wiklander TEE_Result crypto_hash_init(void *ctx)
101b887bd8fSJens Wiklander {
1026648f482SJens Wiklander 	return hash_ops(ctx)->init(ctx);
103b887bd8fSJens Wiklander }
1046648f482SJens Wiklander 
1056b3a371cSJens Wiklander TEE_Result crypto_hash_update(void *ctx, const uint8_t *data, size_t len)
106b887bd8fSJens Wiklander {
1076648f482SJens Wiklander 	return hash_ops(ctx)->update(ctx, data, len);
108b887bd8fSJens Wiklander }
1096648f482SJens Wiklander 
1106b3a371cSJens Wiklander TEE_Result crypto_hash_final(void *ctx, uint8_t *digest, size_t len)
111b887bd8fSJens Wiklander {
1126648f482SJens Wiklander 	return hash_ops(ctx)->final(ctx, digest, len);
113b887bd8fSJens Wiklander }
11482d91db1SJens Wiklander 
11596098f01SJens Wiklander TEE_Result crypto_cipher_alloc_ctx(void **ctx, uint32_t algo)
11682d91db1SJens Wiklander {
117e43ab7a8SCedric Neveux 	TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED;
11896098f01SJens Wiklander 	struct crypto_cipher_ctx *c = NULL;
11996098f01SJens Wiklander 
120e43ab7a8SCedric Neveux 	/*
121e43ab7a8SCedric Neveux 	 * Use default cryptographic implementation if no matching
122e43ab7a8SCedric Neveux 	 * drvcrypt device.
123e43ab7a8SCedric Neveux 	 */
124e43ab7a8SCedric Neveux 	res = drvcrypt_cipher_alloc_ctx(&c, algo);
125e43ab7a8SCedric Neveux 
126e43ab7a8SCedric Neveux 	if (res == TEE_ERROR_NOT_IMPLEMENTED) {
12796098f01SJens Wiklander 		switch (algo) {
12896098f01SJens Wiklander 		case TEE_ALG_AES_ECB_NOPAD:
12996098f01SJens Wiklander 			res = crypto_aes_ecb_alloc_ctx(&c);
13096098f01SJens Wiklander 			break;
13196098f01SJens Wiklander 		case TEE_ALG_AES_CBC_NOPAD:
13296098f01SJens Wiklander 			res = crypto_aes_cbc_alloc_ctx(&c);
13396098f01SJens Wiklander 			break;
13496098f01SJens Wiklander 		case TEE_ALG_AES_CTR:
13596098f01SJens Wiklander 			res = crypto_aes_ctr_alloc_ctx(&c);
13696098f01SJens Wiklander 			break;
13796098f01SJens Wiklander 		case TEE_ALG_AES_CTS:
13896098f01SJens Wiklander 			res = crypto_aes_cts_alloc_ctx(&c);
13996098f01SJens Wiklander 			break;
14096098f01SJens Wiklander 		case TEE_ALG_AES_XTS:
14196098f01SJens Wiklander 			res = crypto_aes_xts_alloc_ctx(&c);
14296098f01SJens Wiklander 			break;
14396098f01SJens Wiklander 		case TEE_ALG_DES_ECB_NOPAD:
14496098f01SJens Wiklander 			res = crypto_des_ecb_alloc_ctx(&c);
14596098f01SJens Wiklander 			break;
14696098f01SJens Wiklander 		case TEE_ALG_DES3_ECB_NOPAD:
14796098f01SJens Wiklander 			res = crypto_des3_ecb_alloc_ctx(&c);
14896098f01SJens Wiklander 			break;
14996098f01SJens Wiklander 		case TEE_ALG_DES_CBC_NOPAD:
15096098f01SJens Wiklander 			res = crypto_des_cbc_alloc_ctx(&c);
15196098f01SJens Wiklander 			break;
15296098f01SJens Wiklander 		case TEE_ALG_DES3_CBC_NOPAD:
15396098f01SJens Wiklander 			res = crypto_des3_cbc_alloc_ctx(&c);
15496098f01SJens Wiklander 			break;
155ade6f848SJerome Forissier 		case TEE_ALG_SM4_ECB_NOPAD:
156ade6f848SJerome Forissier 			res = crypto_sm4_ecb_alloc_ctx(&c);
157ade6f848SJerome Forissier 			break;
158ade6f848SJerome Forissier 		case TEE_ALG_SM4_CBC_NOPAD:
159ade6f848SJerome Forissier 			res = crypto_sm4_cbc_alloc_ctx(&c);
160ade6f848SJerome Forissier 			break;
161ade6f848SJerome Forissier 		case TEE_ALG_SM4_CTR:
162ade6f848SJerome Forissier 			res = crypto_sm4_ctr_alloc_ctx(&c);
163ade6f848SJerome Forissier 			break;
164b21f583dSPingan Xie 		case TEE_ALG_SM4_XTS:
165b21f583dSPingan Xie 			res = crypto_sm4_xts_alloc_ctx(&c);
166b21f583dSPingan Xie 			break;
16796098f01SJens Wiklander 		default:
1681c5fdd1fSJerome Forissier 			return TEE_ERROR_NOT_IMPLEMENTED;
16982d91db1SJens Wiklander 		}
170e43ab7a8SCedric Neveux 	}
17182d91db1SJens Wiklander 
17296098f01SJens Wiklander 	if (!res)
17396098f01SJens Wiklander 		*ctx = c;
17496098f01SJens Wiklander 
17596098f01SJens Wiklander 	return res;
17696098f01SJens Wiklander }
17796098f01SJens Wiklander 
17896098f01SJens Wiklander static const struct crypto_cipher_ops *cipher_ops(void *ctx)
17996098f01SJens Wiklander {
18096098f01SJens Wiklander 	struct crypto_cipher_ctx *c = ctx;
18196098f01SJens Wiklander 
18296098f01SJens Wiklander 	assert(c && c->ops);
18396098f01SJens Wiklander 
18496098f01SJens Wiklander 	return c->ops;
18596098f01SJens Wiklander }
18696098f01SJens Wiklander 
187cbda7091SJens Wiklander void crypto_cipher_free_ctx(void *ctx)
18872a9b1a0SJens Wiklander {
189ce7a47f5SJerome Forissier 	if (ctx)
19096098f01SJens Wiklander 		cipher_ops(ctx)->free_ctx(ctx);
19172a9b1a0SJens Wiklander }
19272a9b1a0SJens Wiklander 
193cbda7091SJens Wiklander void crypto_cipher_copy_state(void *dst_ctx, void *src_ctx)
19472a9b1a0SJens Wiklander {
19596098f01SJens Wiklander 	cipher_ops(dst_ctx)->copy_state(dst_ctx, src_ctx);
19672a9b1a0SJens Wiklander }
19772a9b1a0SJens Wiklander 
198cbda7091SJens Wiklander TEE_Result crypto_cipher_init(void *ctx, TEE_OperationMode mode,
199cbda7091SJens Wiklander 			      const uint8_t *key1, size_t key1_len,
200cbda7091SJens Wiklander 			      const uint8_t *key2, size_t key2_len,
201cbda7091SJens Wiklander 			      const uint8_t *iv, size_t iv_len)
20282d91db1SJens Wiklander {
20396098f01SJens Wiklander 	if (mode != TEE_MODE_DECRYPT && mode != TEE_MODE_ENCRYPT)
20496098f01SJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
20596098f01SJens Wiklander 
20696098f01SJens Wiklander 	return cipher_ops(ctx)->init(ctx, mode, key1, key1_len, key2, key2_len,
20796098f01SJens Wiklander 				     iv, iv_len);
20882d91db1SJens Wiklander }
20982d91db1SJens Wiklander 
210cbda7091SJens Wiklander TEE_Result crypto_cipher_update(void *ctx, TEE_OperationMode mode __unused,
21196098f01SJens Wiklander 				bool last_block, const uint8_t *data,
21296098f01SJens Wiklander 				size_t len, uint8_t *dst)
21382d91db1SJens Wiklander {
21496098f01SJens Wiklander 	return cipher_ops(ctx)->update(ctx, last_block, data, len, dst);
21582d91db1SJens Wiklander }
21682d91db1SJens Wiklander 
217cbda7091SJens Wiklander void crypto_cipher_final(void *ctx)
21882d91db1SJens Wiklander {
21996098f01SJens Wiklander 	cipher_ops(ctx)->final(ctx);
22082d91db1SJens Wiklander }
221e9eaba5cSJens Wiklander 
2226d259e05SJens Wiklander TEE_Result crypto_cipher_get_block_size(uint32_t algo, size_t *size)
2236d259e05SJens Wiklander {
2246d259e05SJens Wiklander 	uint32_t class = TEE_ALG_GET_CLASS(algo);
2256d259e05SJens Wiklander 
2266d259e05SJens Wiklander 	if (class != TEE_OPERATION_CIPHER && class != TEE_OPERATION_MAC &&
2276d259e05SJens Wiklander 	    class != TEE_OPERATION_AE)
2286d259e05SJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
2296d259e05SJens Wiklander 
2306d259e05SJens Wiklander 	switch (TEE_ALG_GET_MAIN_ALG(algo)) {
2316d259e05SJens Wiklander 	case TEE_MAIN_ALGO_AES:
2326d259e05SJens Wiklander 		*size = TEE_AES_BLOCK_SIZE;
2336d259e05SJens Wiklander 		return TEE_SUCCESS;
2346d259e05SJens Wiklander 	case TEE_MAIN_ALGO_DES:
2356d259e05SJens Wiklander 	case TEE_MAIN_ALGO_DES3:
2366d259e05SJens Wiklander 		*size = TEE_DES_BLOCK_SIZE;
2376d259e05SJens Wiklander 		return TEE_SUCCESS;
238ade6f848SJerome Forissier 	case TEE_MAIN_ALGO_SM4:
239ade6f848SJerome Forissier 		*size = TEE_SM4_BLOCK_SIZE;
240ade6f848SJerome Forissier 		return TEE_SUCCESS;
2416d259e05SJens Wiklander 	default:
2426d259e05SJens Wiklander 		return TEE_ERROR_NOT_SUPPORTED;
2436d259e05SJens Wiklander 	}
2446d259e05SJens Wiklander }
2456d259e05SJens Wiklander 
2465da36a24SJens Wiklander TEE_Result crypto_mac_alloc_ctx(void **ctx, uint32_t algo)
247e9eaba5cSJens Wiklander {
2485da36a24SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
2495da36a24SJens Wiklander 	struct crypto_mac_ctx *c = NULL;
2505da36a24SJens Wiklander 
251ea9ac29cSCedric Neveux 	/*
252ea9ac29cSCedric Neveux 	 * Use default cryptographic implementation if no matching
253ea9ac29cSCedric Neveux 	 * drvcrypt device.
254ea9ac29cSCedric Neveux 	 */
255ea9ac29cSCedric Neveux 	res = drvcrypt_mac_alloc_ctx(&c, algo);
256ea9ac29cSCedric Neveux 
257ea9ac29cSCedric Neveux 	if (res == TEE_ERROR_NOT_IMPLEMENTED) {
2585da36a24SJens Wiklander 		switch (algo) {
2595da36a24SJens Wiklander 		case TEE_ALG_HMAC_MD5:
2605da36a24SJens Wiklander 			res = crypto_hmac_md5_alloc_ctx(&c);
2615da36a24SJens Wiklander 			break;
2625da36a24SJens Wiklander 		case TEE_ALG_HMAC_SHA1:
2635da36a24SJens Wiklander 			res = crypto_hmac_sha1_alloc_ctx(&c);
2645da36a24SJens Wiklander 			break;
2655da36a24SJens Wiklander 		case TEE_ALG_HMAC_SHA224:
2665da36a24SJens Wiklander 			res = crypto_hmac_sha224_alloc_ctx(&c);
2675da36a24SJens Wiklander 			break;
2685da36a24SJens Wiklander 		case TEE_ALG_HMAC_SHA256:
2695da36a24SJens Wiklander 			res = crypto_hmac_sha256_alloc_ctx(&c);
2705da36a24SJens Wiklander 			break;
2715da36a24SJens Wiklander 		case TEE_ALG_HMAC_SHA384:
2725da36a24SJens Wiklander 			res = crypto_hmac_sha384_alloc_ctx(&c);
2735da36a24SJens Wiklander 			break;
2745da36a24SJens Wiklander 		case TEE_ALG_HMAC_SHA512:
2755da36a24SJens Wiklander 			res = crypto_hmac_sha512_alloc_ctx(&c);
2765da36a24SJens Wiklander 			break;
277*260b4028SJens Wiklander 		case TEE_ALG_HMAC_SHA3_224:
278*260b4028SJens Wiklander 			res = crypto_hmac_sha3_224_alloc_ctx(&c);
279*260b4028SJens Wiklander 			break;
280*260b4028SJens Wiklander 		case TEE_ALG_HMAC_SHA3_256:
281*260b4028SJens Wiklander 			res = crypto_hmac_sha3_256_alloc_ctx(&c);
282*260b4028SJens Wiklander 			break;
283*260b4028SJens Wiklander 		case TEE_ALG_HMAC_SHA3_384:
284*260b4028SJens Wiklander 			res = crypto_hmac_sha3_384_alloc_ctx(&c);
285*260b4028SJens Wiklander 			break;
286*260b4028SJens Wiklander 		case TEE_ALG_HMAC_SHA3_512:
287*260b4028SJens Wiklander 			res = crypto_hmac_sha3_512_alloc_ctx(&c);
288*260b4028SJens Wiklander 			break;
28947645577SJerome Forissier 		case TEE_ALG_HMAC_SM3:
29047645577SJerome Forissier 			res = crypto_hmac_sm3_alloc_ctx(&c);
29147645577SJerome Forissier 			break;
2925da36a24SJens Wiklander 		case TEE_ALG_AES_CBC_MAC_NOPAD:
2935da36a24SJens Wiklander 			res = crypto_aes_cbc_mac_nopad_alloc_ctx(&c);
2945da36a24SJens Wiklander 			break;
2955da36a24SJens Wiklander 		case TEE_ALG_AES_CBC_MAC_PKCS5:
2965da36a24SJens Wiklander 			res = crypto_aes_cbc_mac_pkcs5_alloc_ctx(&c);
2975da36a24SJens Wiklander 			break;
2985da36a24SJens Wiklander 		case TEE_ALG_DES_CBC_MAC_NOPAD:
2995da36a24SJens Wiklander 			res = crypto_des_cbc_mac_nopad_alloc_ctx(&c);
3005da36a24SJens Wiklander 			break;
3015da36a24SJens Wiklander 		case TEE_ALG_DES_CBC_MAC_PKCS5:
3025da36a24SJens Wiklander 			res = crypto_des_cbc_mac_pkcs5_alloc_ctx(&c);
3035da36a24SJens Wiklander 			break;
3045da36a24SJens Wiklander 		case TEE_ALG_DES3_CBC_MAC_NOPAD:
3055da36a24SJens Wiklander 			res = crypto_des3_cbc_mac_nopad_alloc_ctx(&c);
3065da36a24SJens Wiklander 			break;
3075da36a24SJens Wiklander 		case TEE_ALG_DES3_CBC_MAC_PKCS5:
3085da36a24SJens Wiklander 			res = crypto_des3_cbc_mac_pkcs5_alloc_ctx(&c);
3095da36a24SJens Wiklander 			break;
310eee637e7SAlexander Zakharov 		case TEE_ALG_DES3_CMAC:
311eee637e7SAlexander Zakharov 			res = crypto_des3_cmac_alloc_ctx(&c);
312eee637e7SAlexander Zakharov 			break;
3135da36a24SJens Wiklander 		case TEE_ALG_AES_CMAC:
3145da36a24SJens Wiklander 			res = crypto_aes_cmac_alloc_ctx(&c);
3155da36a24SJens Wiklander 			break;
3165da36a24SJens Wiklander 		default:
3175da36a24SJens Wiklander 			return TEE_ERROR_NOT_SUPPORTED;
3185da36a24SJens Wiklander 		}
319ea9ac29cSCedric Neveux 	}
3205da36a24SJens Wiklander 
3215da36a24SJens Wiklander 	if (!res)
3225da36a24SJens Wiklander 		*ctx = c;
3235da36a24SJens Wiklander 
3245da36a24SJens Wiklander 	return res;
3255da36a24SJens Wiklander }
3265da36a24SJens Wiklander 
3275da36a24SJens Wiklander static const struct crypto_mac_ops *mac_ops(void *ctx)
3285da36a24SJens Wiklander {
3295da36a24SJens Wiklander 	struct crypto_mac_ctx *c = ctx;
3305da36a24SJens Wiklander 
3315da36a24SJens Wiklander 	assert(c && c->ops);
3325da36a24SJens Wiklander 
3335da36a24SJens Wiklander 	return c->ops;
334e9eaba5cSJens Wiklander }
335e9eaba5cSJens Wiklander 
336c69bc615SJens Wiklander void crypto_mac_free_ctx(void *ctx)
33782ef73bcSJens Wiklander {
338ce7a47f5SJerome Forissier 	if (ctx)
3395da36a24SJens Wiklander 		mac_ops(ctx)->free_ctx(ctx);
34082ef73bcSJens Wiklander }
34182ef73bcSJens Wiklander 
342c69bc615SJens Wiklander void crypto_mac_copy_state(void *dst_ctx, void *src_ctx)
34382ef73bcSJens Wiklander {
3445da36a24SJens Wiklander 	mac_ops(dst_ctx)->copy_state(dst_ctx, src_ctx);
34582ef73bcSJens Wiklander }
34682ef73bcSJens Wiklander 
347c69bc615SJens Wiklander TEE_Result crypto_mac_init(void *ctx, const uint8_t *key, size_t len)
348e9eaba5cSJens Wiklander {
3495da36a24SJens Wiklander 	return mac_ops(ctx)->init(ctx, key, len);
350e9eaba5cSJens Wiklander }
351e9eaba5cSJens Wiklander 
352c69bc615SJens Wiklander TEE_Result crypto_mac_update(void *ctx, const uint8_t *data, size_t len)
353e9eaba5cSJens Wiklander {
3545da36a24SJens Wiklander 	if (!len)
3555da36a24SJens Wiklander 		return TEE_SUCCESS;
3565da36a24SJens Wiklander 
3575da36a24SJens Wiklander 	return mac_ops(ctx)->update(ctx, data, len);
358e9eaba5cSJens Wiklander }
359e9eaba5cSJens Wiklander 
360c69bc615SJens Wiklander TEE_Result crypto_mac_final(void *ctx, uint8_t *digest, size_t digest_len)
361e9eaba5cSJens Wiklander {
3625da36a24SJens Wiklander 	return mac_ops(ctx)->final(ctx, digest, digest_len);
363e9eaba5cSJens Wiklander }
364e9eaba5cSJens Wiklander 
365d7ac7d0fSJens Wiklander TEE_Result crypto_authenc_alloc_ctx(void **ctx, uint32_t algo)
3668875ce46SJens Wiklander {
367e3e4ce47SNicolas Toromanoff 	TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED;
368f1e9b21bSJens Wiklander 	struct crypto_authenc_ctx *c = NULL;
369f1e9b21bSJens Wiklander 
370e3e4ce47SNicolas Toromanoff 	/*
371e3e4ce47SNicolas Toromanoff 	 * Use default authenc implementation if no matching
372e3e4ce47SNicolas Toromanoff 	 * drvcrypt device.
373e3e4ce47SNicolas Toromanoff 	 */
374e3e4ce47SNicolas Toromanoff 	res = drvcrypt_authenc_alloc_ctx(&c, algo);
375e3e4ce47SNicolas Toromanoff 
376e3e4ce47SNicolas Toromanoff 	if (res == TEE_ERROR_NOT_IMPLEMENTED) {
377d0620b01SJens Wiklander 		switch (algo) {
378d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM)
379d0620b01SJens Wiklander 		case TEE_ALG_AES_CCM:
380f1e9b21bSJens Wiklander 			res = crypto_aes_ccm_alloc_ctx(&c);
381f1e9b21bSJens Wiklander 			break;
382d0620b01SJens Wiklander #endif
383d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM)
384d0620b01SJens Wiklander 		case TEE_ALG_AES_GCM:
385f1e9b21bSJens Wiklander 			res = crypto_aes_gcm_alloc_ctx(&c);
386f1e9b21bSJens Wiklander 			break;
387d0620b01SJens Wiklander #endif
388d0620b01SJens Wiklander 		default:
389e3e4ce47SNicolas Toromanoff 			break;
390e3e4ce47SNicolas Toromanoff 		}
3918875ce46SJens Wiklander 	}
392f1e9b21bSJens Wiklander 
393f1e9b21bSJens Wiklander 	if (!res)
394f1e9b21bSJens Wiklander 		*ctx = c;
395f1e9b21bSJens Wiklander 
396f1e9b21bSJens Wiklander 	return res;
397d0620b01SJens Wiklander }
3988875ce46SJens Wiklander 
399f1e9b21bSJens Wiklander static const struct crypto_authenc_ops *ae_ops(void *ctx)
400d7ac7d0fSJens Wiklander {
401f1e9b21bSJens Wiklander 	struct crypto_authenc_ctx *c = ctx;
402f1e9b21bSJens Wiklander 
403f1e9b21bSJens Wiklander 	assert(c && c->ops);
404f1e9b21bSJens Wiklander 
405f1e9b21bSJens Wiklander 	return c->ops;
406d7ac7d0fSJens Wiklander }
407d7ac7d0fSJens Wiklander 
40852ee414bSJens Wiklander TEE_Result crypto_authenc_init(void *ctx, TEE_OperationMode mode,
409f1e9b21bSJens Wiklander 			       const uint8_t *key, size_t key_len,
410f1e9b21bSJens Wiklander 			       const uint8_t *nonce, size_t nonce_len,
411f1e9b21bSJens Wiklander 			       size_t tag_len, size_t aad_len,
412f1e9b21bSJens Wiklander 			       size_t payload_len)
413d7ac7d0fSJens Wiklander {
414f1e9b21bSJens Wiklander 	return ae_ops(ctx)->init(ctx, mode, key, key_len, nonce, nonce_len,
415f1e9b21bSJens Wiklander 				 tag_len, aad_len, payload_len);
416d7ac7d0fSJens Wiklander }
417d7ac7d0fSJens Wiklander 
41852ee414bSJens Wiklander TEE_Result crypto_authenc_update_aad(void *ctx, TEE_OperationMode mode __unused,
419f1e9b21bSJens Wiklander 				     const uint8_t *data, size_t len)
4208875ce46SJens Wiklander {
421f1e9b21bSJens Wiklander 	return ae_ops(ctx)->update_aad(ctx, data, len);
422d0620b01SJens Wiklander }
4238875ce46SJens Wiklander 
424d0620b01SJens Wiklander 
42552ee414bSJens Wiklander TEE_Result crypto_authenc_update_payload(void *ctx, TEE_OperationMode mode,
426f1e9b21bSJens Wiklander 					 const uint8_t *src_data,
427f1e9b21bSJens Wiklander 					 size_t src_len, uint8_t *dst_data,
428f1e9b21bSJens Wiklander 					 size_t *dst_len)
429f1e9b21bSJens Wiklander {
430f1e9b21bSJens Wiklander 	if (*dst_len < src_len)
431d0620b01SJens Wiklander 		return TEE_ERROR_SHORT_BUFFER;
432d0620b01SJens Wiklander 	*dst_len = src_len;
433d0620b01SJens Wiklander 
434f1e9b21bSJens Wiklander 	return ae_ops(ctx)->update_payload(ctx, mode, src_data, src_len,
435f1e9b21bSJens Wiklander 					   dst_data);
436d0620b01SJens Wiklander }
4378875ce46SJens Wiklander 
43852ee414bSJens Wiklander TEE_Result crypto_authenc_enc_final(void *ctx, const uint8_t *src_data,
43952ee414bSJens Wiklander 				    size_t src_len, uint8_t *dst_data,
44052ee414bSJens Wiklander 				    size_t *dst_len, uint8_t *dst_tag,
44152ee414bSJens Wiklander 				    size_t *dst_tag_len)
4428875ce46SJens Wiklander {
443f1e9b21bSJens Wiklander 	if (*dst_len < src_len)
444f1e9b21bSJens Wiklander 		return TEE_ERROR_SHORT_BUFFER;
445d0620b01SJens Wiklander 	*dst_len = src_len;
446d0620b01SJens Wiklander 
447f1e9b21bSJens Wiklander 	return ae_ops(ctx)->enc_final(ctx, src_data, src_len, dst_data,
448f1e9b21bSJens Wiklander 				      dst_tag, dst_tag_len);
4498875ce46SJens Wiklander }
4508875ce46SJens Wiklander 
45152ee414bSJens Wiklander TEE_Result crypto_authenc_dec_final(void *ctx, const uint8_t *src_data,
45252ee414bSJens Wiklander 				    size_t src_len, uint8_t *dst_data,
45352ee414bSJens Wiklander 				    size_t *dst_len, const uint8_t *tag,
45452ee414bSJens Wiklander 				    size_t tag_len)
4558875ce46SJens Wiklander {
456f1e9b21bSJens Wiklander 	if (*dst_len < src_len)
457f1e9b21bSJens Wiklander 		return TEE_ERROR_SHORT_BUFFER;
458f1e9b21bSJens Wiklander 	*dst_len = src_len;
459f1e9b21bSJens Wiklander 
460f1e9b21bSJens Wiklander 	return ae_ops(ctx)->dec_final(ctx, src_data, src_len, dst_data, tag,
461f1e9b21bSJens Wiklander 				      tag_len);
4628875ce46SJens Wiklander }
463f1e9b21bSJens Wiklander 
46452ee414bSJens Wiklander void crypto_authenc_final(void *ctx)
465f1e9b21bSJens Wiklander {
466f1e9b21bSJens Wiklander 	ae_ops(ctx)->final(ctx);
467f1e9b21bSJens Wiklander }
468f1e9b21bSJens Wiklander 
46952ee414bSJens Wiklander void crypto_authenc_free_ctx(void *ctx)
470f1e9b21bSJens Wiklander {
471f1e9b21bSJens Wiklander 	if (ctx)
472f1e9b21bSJens Wiklander 		ae_ops(ctx)->free_ctx(ctx);
473f1e9b21bSJens Wiklander }
474f1e9b21bSJens Wiklander 
47552ee414bSJens Wiklander void crypto_authenc_copy_state(void *dst_ctx, void *src_ctx)
476f1e9b21bSJens Wiklander {
477f1e9b21bSJens Wiklander 	ae_ops(dst_ctx)->copy_state(dst_ctx, src_ctx);
478d0620b01SJens Wiklander }
47933790cc1SJens Wiklander 
480da1de557SJens Wiklander #if !defined(CFG_CRYPTO_RSA) && !defined(CFG_CRYPTO_DSA) && \
481da1de557SJens Wiklander     !defined(CFG_CRYPTO_DH) && !defined(CFG_CRYPTO_ECC)
48233790cc1SJens Wiklander struct bignum *crypto_bignum_allocate(size_t size_bits __unused)
48333790cc1SJens Wiklander {
48433790cc1SJens Wiklander 	return NULL;
48533790cc1SJens Wiklander }
48633790cc1SJens Wiklander 
48733790cc1SJens Wiklander TEE_Result crypto_bignum_bin2bn(const uint8_t *from __unused,
48833790cc1SJens Wiklander 				size_t fromsize __unused,
48933790cc1SJens Wiklander 				struct bignum *to __unused)
49033790cc1SJens Wiklander {
49133790cc1SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
49233790cc1SJens Wiklander }
49333790cc1SJens Wiklander 
49433790cc1SJens Wiklander size_t crypto_bignum_num_bytes(struct bignum *a __unused)
49533790cc1SJens Wiklander {
49633790cc1SJens Wiklander 	return 0;
49733790cc1SJens Wiklander }
49833790cc1SJens Wiklander 
49933790cc1SJens Wiklander size_t crypto_bignum_num_bits(struct bignum *a __unused)
50033790cc1SJens Wiklander {
50133790cc1SJens Wiklander 	return 0;
50233790cc1SJens Wiklander }
50333790cc1SJens Wiklander 
50433790cc1SJens Wiklander /*
50533790cc1SJens Wiklander  * crypto_bignum_allocate() and crypto_bignum_bin2bn() failing should be
50633790cc1SJens Wiklander  * enough to guarantee that the functions calling this function aren't
50733790cc1SJens Wiklander  * called, but just in case add a panic() here to avoid unexpected
50833790cc1SJens Wiklander  * behavoir.
50933790cc1SJens Wiklander  */
51033790cc1SJens Wiklander static void bignum_cant_happen(void)
51133790cc1SJens Wiklander {
51233790cc1SJens Wiklander 	volatile bool b = true;
51333790cc1SJens Wiklander 
51433790cc1SJens Wiklander 	/* Avoid warning about function does not return */
51533790cc1SJens Wiklander 	if (b)
51633790cc1SJens Wiklander 		panic();
51733790cc1SJens Wiklander }
51833790cc1SJens Wiklander 
51933790cc1SJens Wiklander void crypto_bignum_bn2bin(const struct bignum *from __unused,
52033790cc1SJens Wiklander 			  uint8_t *to __unused)
52133790cc1SJens Wiklander {
52233790cc1SJens Wiklander 	bignum_cant_happen();
52333790cc1SJens Wiklander }
52433790cc1SJens Wiklander 
52533790cc1SJens Wiklander void crypto_bignum_copy(struct bignum *to __unused,
52633790cc1SJens Wiklander 			const struct bignum *from __unused)
52733790cc1SJens Wiklander {
52833790cc1SJens Wiklander 	bignum_cant_happen();
52933790cc1SJens Wiklander }
53033790cc1SJens Wiklander 
53133790cc1SJens Wiklander void crypto_bignum_free(struct bignum *a)
53233790cc1SJens Wiklander {
53333790cc1SJens Wiklander 	if (a)
53433790cc1SJens Wiklander 		panic();
53533790cc1SJens Wiklander }
53633790cc1SJens Wiklander 
53733790cc1SJens Wiklander void crypto_bignum_clear(struct bignum *a __unused)
53833790cc1SJens Wiklander {
53933790cc1SJens Wiklander 	bignum_cant_happen();
54033790cc1SJens Wiklander }
54133790cc1SJens Wiklander 
54233790cc1SJens Wiklander /* return -1 if a<b, 0 if a==b, +1 if a>b */
54333790cc1SJens Wiklander int32_t crypto_bignum_compare(struct bignum *a __unused,
54433790cc1SJens Wiklander 			      struct bignum *b __unused)
54533790cc1SJens Wiklander {
54633790cc1SJens Wiklander 	bignum_cant_happen();
54733790cc1SJens Wiklander 	return -1;
54833790cc1SJens Wiklander }
549da1de557SJens Wiklander #endif
550291e5450SJens Wiklander 
551da1de557SJens Wiklander #if !defined(CFG_CRYPTO_RSA)
552291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_rsa_keypair(struct rsa_keypair *s __unused,
553291e5450SJens Wiklander 					    size_t key_size_bits __unused)
554291e5450SJens Wiklander {
555291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
556291e5450SJens Wiklander }
557291e5450SJens Wiklander 
558291e5450SJens Wiklander TEE_Result
559291e5450SJens Wiklander crypto_acipher_alloc_rsa_public_key(struct rsa_public_key *s __unused,
560291e5450SJens Wiklander 				    size_t key_size_bits __unused)
561291e5450SJens Wiklander {
562291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
563291e5450SJens Wiklander }
564291e5450SJens Wiklander 
565291e5450SJens Wiklander void crypto_acipher_free_rsa_public_key(struct rsa_public_key *s __unused)
566291e5450SJens Wiklander {
567291e5450SJens Wiklander }
568291e5450SJens Wiklander 
569a1d5c81fSElias von Däniken void crypto_acipher_free_rsa_keypair(struct rsa_keypair *s __unused)
570a1d5c81fSElias von Däniken {
571a1d5c81fSElias von Däniken }
572a1d5c81fSElias von Däniken 
573291e5450SJens Wiklander TEE_Result crypto_acipher_gen_rsa_key(struct rsa_keypair *key __unused,
574291e5450SJens Wiklander 				      size_t key_size __unused)
575291e5450SJens Wiklander {
576291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
577291e5450SJens Wiklander }
578291e5450SJens Wiklander 
579291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_decrypt(struct rsa_keypair *key __unused,
580291e5450SJens Wiklander 					   const uint8_t *src __unused,
581291e5450SJens Wiklander 					   size_t src_len __unused,
582291e5450SJens Wiklander 					   uint8_t *dst __unused,
583291e5450SJens Wiklander 					   size_t *dst_len __unused)
584291e5450SJens Wiklander {
585291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
586291e5450SJens Wiklander }
587291e5450SJens Wiklander 
588291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_encrypt(struct rsa_public_key *key __unused,
589291e5450SJens Wiklander 					   const uint8_t *src __unused,
590291e5450SJens Wiklander 					   size_t src_len __unused,
591291e5450SJens Wiklander 					   uint8_t *dst __unused,
592291e5450SJens Wiklander 					   size_t *dst_len __unused)
593291e5450SJens Wiklander {
594291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
595291e5450SJens Wiklander }
596291e5450SJens Wiklander 
597291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_decrypt(uint32_t algo __unused,
598291e5450SJens Wiklander 					struct rsa_keypair *key __unused,
599291e5450SJens Wiklander 					const uint8_t *label __unused,
600291e5450SJens Wiklander 					size_t label_len __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 
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,
613291e5450SJens Wiklander 					const uint8_t *src __unused,
614291e5450SJens Wiklander 					size_t src_len __unused,
615291e5450SJens Wiklander 					uint8_t *dst __unused,
616291e5450SJens Wiklander 					size_t *dst_len __unused)
617291e5450SJens Wiklander {
618291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
619291e5450SJens Wiklander }
620291e5450SJens Wiklander 
621291e5450SJens Wiklander TEE_Result crypto_acipher_rsassa_sign(uint32_t algo __unused,
622291e5450SJens Wiklander 				      struct rsa_keypair *key __unused,
623291e5450SJens Wiklander 				      int salt_len __unused,
624291e5450SJens Wiklander 				      const uint8_t *msg __unused,
625291e5450SJens Wiklander 				      size_t msg_len __unused,
626291e5450SJens Wiklander 				      uint8_t *sig __unused,
627291e5450SJens Wiklander 				      size_t *sig_len __unused)
628291e5450SJens Wiklander {
629291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
630291e5450SJens Wiklander }
631291e5450SJens Wiklander 
632291e5450SJens Wiklander TEE_Result crypto_acipher_rsassa_verify(uint32_t algo __unused,
633291e5450SJens Wiklander 					struct rsa_public_key *key __unused,
634291e5450SJens Wiklander 					int salt_len __unused,
635291e5450SJens Wiklander 					const uint8_t *msg __unused,
636291e5450SJens Wiklander 					size_t msg_len __unused,
637291e5450SJens Wiklander 					const uint8_t *sig __unused,
638291e5450SJens Wiklander 					size_t sig_len __unused)
639291e5450SJens Wiklander {
640291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
641291e5450SJens Wiklander }
642da1de557SJens Wiklander #endif /*!CFG_CRYPTO_RSA*/
643291e5450SJens Wiklander 
644da1de557SJens Wiklander #if !defined(CFG_CRYPTO_DSA)
645291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dsa_keypair(struct dsa_keypair *s __unused,
646291e5450SJens Wiklander 					    size_t key_size_bits __unused)
647291e5450SJens Wiklander {
648291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
649291e5450SJens Wiklander }
650291e5450SJens Wiklander 
651291e5450SJens Wiklander TEE_Result
652291e5450SJens Wiklander crypto_acipher_alloc_dsa_public_key(struct dsa_public_key *s __unused,
653291e5450SJens Wiklander 				    size_t key_size_bits __unused)
654291e5450SJens Wiklander {
655291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
656291e5450SJens Wiklander }
657291e5450SJens Wiklander 
658291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dsa_key(struct dsa_keypair *key __unused,
659291e5450SJens Wiklander 				      size_t key_size __unused)
660291e5450SJens Wiklander {
661291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
662291e5450SJens Wiklander }
663291e5450SJens Wiklander 
664291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_sign(uint32_t algo __unused,
665291e5450SJens Wiklander 				   struct dsa_keypair *key __unused,
666291e5450SJens Wiklander 				   const uint8_t *msg __unused,
667291e5450SJens Wiklander 				   size_t msg_len __unused,
668291e5450SJens Wiklander 				   uint8_t *sig __unused,
669291e5450SJens Wiklander 				   size_t *sig_len __unused)
670291e5450SJens Wiklander {
671291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
672291e5450SJens Wiklander }
673291e5450SJens Wiklander 
674291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_verify(uint32_t algo __unused,
675291e5450SJens Wiklander 				     struct dsa_public_key *key __unused,
676291e5450SJens Wiklander 				     const uint8_t *msg __unused,
677291e5450SJens Wiklander 				     size_t msg_len __unused,
678291e5450SJens Wiklander 				     const uint8_t *sig __unused,
679291e5450SJens Wiklander 				     size_t sig_len __unused)
680291e5450SJens Wiklander {
681291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
682291e5450SJens Wiklander }
683da1de557SJens Wiklander #endif /*!CFG_CRYPTO_DSA*/
684291e5450SJens Wiklander 
685da1de557SJens Wiklander #if !defined(CFG_CRYPTO_DH)
686291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dh_keypair(struct dh_keypair *s __unused,
687291e5450SJens Wiklander 					   size_t key_size_bits __unused)
688291e5450SJens Wiklander {
689291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
690291e5450SJens Wiklander }
691291e5450SJens Wiklander 
692291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dh_key(struct dh_keypair *key __unused,
693291e5450SJens Wiklander 				     struct bignum *q __unused,
6949f4dcefbSJerome Forissier 				     size_t xbits __unused,
6959f4dcefbSJerome Forissier 				     size_t key_size __unused)
696291e5450SJens Wiklander {
697291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
698291e5450SJens Wiklander }
699291e5450SJens Wiklander 
700291e5450SJens Wiklander TEE_Result
701291e5450SJens Wiklander crypto_acipher_dh_shared_secret(struct dh_keypair *private_key __unused,
702291e5450SJens Wiklander 				struct bignum *public_key __unused,
703291e5450SJens Wiklander 				struct bignum *secret __unused)
704291e5450SJens Wiklander {
705291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
706291e5450SJens Wiklander }
707da1de557SJens Wiklander #endif /*!CFG_CRYPTO_DH*/
708291e5450SJens Wiklander 
709df00cf59SCedric Neveux TEE_Result crypto_acipher_alloc_ecc_public_key(struct ecc_public_key *key,
710df00cf59SCedric Neveux 					       uint32_t key_type,
711df00cf59SCedric Neveux 					       size_t key_size_bits)
712291e5450SJens Wiklander {
713df00cf59SCedric Neveux 	TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED;
714df00cf59SCedric Neveux 
715df00cf59SCedric Neveux 	/*
716df00cf59SCedric Neveux 	 * Use default cryptographic implementation if no matching
717df00cf59SCedric Neveux 	 * drvcrypt device.
718df00cf59SCedric Neveux 	 */
719df00cf59SCedric Neveux 	res = drvcrypt_asym_alloc_ecc_public_key(key, key_type, key_size_bits);
720df00cf59SCedric Neveux 	if (res == TEE_ERROR_NOT_IMPLEMENTED)
721df00cf59SCedric Neveux 		res = crypto_asym_alloc_ecc_public_key(key, key_type,
722df00cf59SCedric Neveux 						       key_size_bits);
723df00cf59SCedric Neveux 
724df00cf59SCedric Neveux 	return res;
725291e5450SJens Wiklander }
726291e5450SJens Wiklander 
727df00cf59SCedric Neveux TEE_Result crypto_acipher_alloc_ecc_keypair(struct ecc_keypair *key,
728df00cf59SCedric Neveux 					    uint32_t key_type,
729df00cf59SCedric Neveux 					    size_t key_size_bits)
730291e5450SJens Wiklander {
731df00cf59SCedric Neveux 	TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED;
732df00cf59SCedric Neveux 
733df00cf59SCedric Neveux 	/*
734df00cf59SCedric Neveux 	 * Use default cryptographic implementation if no matching
735df00cf59SCedric Neveux 	 * drvcrypt device.
736df00cf59SCedric Neveux 	 */
737df00cf59SCedric Neveux 	res = drvcrypt_asym_alloc_ecc_keypair(key, key_type, key_size_bits);
738df00cf59SCedric Neveux 	if (res == TEE_ERROR_NOT_IMPLEMENTED)
739df00cf59SCedric Neveux 		res = crypto_asym_alloc_ecc_keypair(key, key_type,
740df00cf59SCedric Neveux 						    key_size_bits);
741df00cf59SCedric Neveux 
742df00cf59SCedric Neveux 	return res;
743291e5450SJens Wiklander }
744291e5450SJens Wiklander 
745df00cf59SCedric Neveux void crypto_acipher_free_ecc_public_key(struct ecc_public_key *key)
746291e5450SJens Wiklander {
747df00cf59SCedric Neveux 	assert(key->ops && key->ops->free);
748df00cf59SCedric Neveux 
749df00cf59SCedric Neveux 	key->ops->free(key);
750291e5450SJens Wiklander }
751291e5450SJens Wiklander 
752df00cf59SCedric Neveux TEE_Result crypto_acipher_gen_ecc_key(struct ecc_keypair *key,
753df00cf59SCedric Neveux 				      size_t key_size_bits)
754291e5450SJens Wiklander {
755df00cf59SCedric Neveux 	assert(key->ops && key->ops->generate);
756df00cf59SCedric Neveux 
757df00cf59SCedric Neveux 	return key->ops->generate(key, key_size_bits);
758291e5450SJens Wiklander }
759291e5450SJens Wiklander 
760df00cf59SCedric Neveux TEE_Result crypto_acipher_ecc_sign(uint32_t algo, struct ecc_keypair *key,
761df00cf59SCedric Neveux 				   const uint8_t *msg, size_t msg_len,
762df00cf59SCedric Neveux 				   uint8_t *sig, size_t *sig_len)
763291e5450SJens Wiklander {
764df00cf59SCedric Neveux 	assert(key->ops);
765df00cf59SCedric Neveux 
766df00cf59SCedric Neveux 	if (!key->ops->sign)
767291e5450SJens Wiklander 		return TEE_ERROR_NOT_IMPLEMENTED;
768df00cf59SCedric Neveux 
769df00cf59SCedric Neveux 	return key->ops->sign(algo, key, msg, msg_len, sig, sig_len);
770291e5450SJens Wiklander }
771291e5450SJens Wiklander 
772df00cf59SCedric Neveux TEE_Result crypto_acipher_ecc_verify(uint32_t algo, struct ecc_public_key *key,
773df00cf59SCedric Neveux 				     const uint8_t *msg, size_t msg_len,
774df00cf59SCedric Neveux 				     const uint8_t *sig, size_t sig_len)
775291e5450SJens Wiklander {
776df00cf59SCedric Neveux 	assert(key->ops);
777df00cf59SCedric Neveux 
778df00cf59SCedric Neveux 	if (!key->ops->verify)
779291e5450SJens Wiklander 		return TEE_ERROR_NOT_IMPLEMENTED;
780df00cf59SCedric Neveux 
781df00cf59SCedric Neveux 	return key->ops->verify(algo, key, msg, msg_len, sig, sig_len);
782291e5450SJens Wiklander }
783291e5450SJens Wiklander 
784df00cf59SCedric Neveux TEE_Result crypto_acipher_ecc_shared_secret(struct ecc_keypair *private_key,
785df00cf59SCedric Neveux 					    struct ecc_public_key *public_key,
786df00cf59SCedric Neveux 					    void *secret,
787df00cf59SCedric Neveux 					    unsigned long *secret_len)
788291e5450SJens Wiklander {
789df00cf59SCedric Neveux 	assert(private_key->ops);
790df00cf59SCedric Neveux 
791df00cf59SCedric Neveux 	if (!private_key->ops->shared_secret)
792291e5450SJens Wiklander 		return TEE_ERROR_NOT_IMPLEMENTED;
793df00cf59SCedric Neveux 
794df00cf59SCedric Neveux 	return private_key->ops->shared_secret(private_key, public_key, secret,
795df00cf59SCedric Neveux 					       secret_len);
796291e5450SJens Wiklander }
79791fc6bd8SJerome Forissier 
798884fd190SCedric Neveux TEE_Result crypto_acipher_sm2_pke_decrypt(struct ecc_keypair *key,
799884fd190SCedric Neveux 					  const uint8_t *src, size_t src_len,
800884fd190SCedric Neveux 					  uint8_t *dst, size_t *dst_len)
80191fc6bd8SJerome Forissier {
802884fd190SCedric Neveux 	assert(key->ops);
803884fd190SCedric Neveux 
804884fd190SCedric Neveux 	if (!key->ops->decrypt)
80591fc6bd8SJerome Forissier 		return TEE_ERROR_NOT_IMPLEMENTED;
806884fd190SCedric Neveux 
807884fd190SCedric Neveux 	return key->ops->decrypt(key, src, src_len, dst, dst_len);
80891fc6bd8SJerome Forissier }
80991fc6bd8SJerome Forissier 
810884fd190SCedric Neveux TEE_Result crypto_acipher_sm2_pke_encrypt(struct ecc_public_key *key,
811884fd190SCedric Neveux 					  const uint8_t *src, size_t src_len,
812884fd190SCedric Neveux 					  uint8_t *dst, size_t *dst_len)
81391fc6bd8SJerome Forissier {
814884fd190SCedric Neveux 	assert(key->ops);
815884fd190SCedric Neveux 
816884fd190SCedric Neveux 	if (!key->ops->encrypt)
81791fc6bd8SJerome Forissier 		return TEE_ERROR_NOT_IMPLEMENTED;
818884fd190SCedric Neveux 
819884fd190SCedric Neveux 	return key->ops->encrypt(key, src, src_len, dst, dst_len);
82091fc6bd8SJerome Forissier }
8210f151943SJerome Forissier 
8225b385b3fSJerome Forissier #if !defined(CFG_CRYPTO_SM2_KEP)
8235b385b3fSJerome Forissier TEE_Result crypto_acipher_sm2_kep_derive(struct ecc_keypair *my_key __unused,
8245b385b3fSJerome Forissier 					 struct ecc_keypair *my_eph_key
8255b385b3fSJerome Forissier 								__unused,
8265b385b3fSJerome Forissier 					 struct ecc_public_key *peer_key
8275b385b3fSJerome Forissier 								__unused,
8285b385b3fSJerome Forissier 					 struct ecc_public_key *peer_eph_key
8295b385b3fSJerome Forissier 								__unused,
8305b385b3fSJerome Forissier 					 struct sm2_kep_parms *p __unused)
8315b385b3fSJerome Forissier {
8325b385b3fSJerome Forissier 	return TEE_ERROR_NOT_IMPLEMENTED;
8335b385b3fSJerome Forissier }
8345b385b3fSJerome Forissier #endif
8355dfe86d0SJorge Ramirez-Ortiz 
83690040fa4SSohaib ul Hassan #if !defined(CFG_CRYPTO_X25519)
83790040fa4SSohaib ul Hassan TEE_Result crypto_acipher_alloc_x25519_keypair(struct x25519_keypair *key
83890040fa4SSohaib ul Hassan 								__unused,
83990040fa4SSohaib ul Hassan 					       size_t key_size_bits __unused)
84090040fa4SSohaib ul Hassan {
84190040fa4SSohaib ul Hassan 	return TEE_ERROR_NOT_IMPLEMENTED;
84290040fa4SSohaib ul Hassan }
84390040fa4SSohaib ul Hassan 
84490040fa4SSohaib ul Hassan TEE_Result crypto_acipher_gen_x25519_key(struct x25519_keypair *key __unused,
84590040fa4SSohaib ul Hassan 					 size_t key_size __unused)
84690040fa4SSohaib ul Hassan {
84790040fa4SSohaib ul Hassan 	return TEE_ERROR_NOT_IMPLEMENTED;
84890040fa4SSohaib ul Hassan }
84990040fa4SSohaib ul Hassan 
85090040fa4SSohaib ul Hassan TEE_Result crypto_acipher_x25519_shared_secret(struct x25519_keypair
85190040fa4SSohaib ul Hassan 					       *private_key __unused,
85290040fa4SSohaib ul Hassan 					       void *public_key __unused,
85390040fa4SSohaib ul Hassan 					       void *secret __unused,
85490040fa4SSohaib ul Hassan 					       unsigned long
85590040fa4SSohaib ul Hassan 					       *secret_len __unused)
85690040fa4SSohaib ul Hassan {
85790040fa4SSohaib ul Hassan 	return TEE_ERROR_NOT_IMPLEMENTED;
85890040fa4SSohaib ul Hassan }
85990040fa4SSohaib ul Hassan #endif
86090040fa4SSohaib ul Hassan 
861a116848bSValerii Chubar #if !defined(CFG_CRYPTO_ED25519)
862a116848bSValerii Chubar TEE_Result crypto_acipher_alloc_ed25519_keypair(struct ed25519_keypair *key
863a116848bSValerii Chubar 								 __unused,
864a116848bSValerii Chubar 						size_t key_size_bits __unused)
865a116848bSValerii Chubar {
866a116848bSValerii Chubar 	return TEE_ERROR_NOT_IMPLEMENTED;
867a116848bSValerii Chubar }
868a116848bSValerii Chubar 
869a116848bSValerii Chubar TEE_Result crypto_acipher_gen_ed25519_key(struct ed25519_keypair *key __unused,
870a116848bSValerii Chubar 					  size_t key_size __unused)
871a116848bSValerii Chubar {
872a116848bSValerii Chubar 	return TEE_ERROR_NOT_IMPLEMENTED;
873a116848bSValerii Chubar }
874a116848bSValerii Chubar 
875a116848bSValerii Chubar TEE_Result crypto_acipher_ed25519_sign(struct ed25519_keypair *key __unused,
876a116848bSValerii Chubar 				       const uint8_t *msg __unused,
877a116848bSValerii Chubar 				       size_t msg_len __unused,
878a116848bSValerii Chubar 				       uint8_t *sig __unused,
879a116848bSValerii Chubar 				       size_t *sig_len __unused)
880a116848bSValerii Chubar {
881a116848bSValerii Chubar 	return TEE_ERROR_NOT_IMPLEMENTED;
882a116848bSValerii Chubar }
883a116848bSValerii Chubar 
884a116848bSValerii Chubar TEE_Result crypto_acipher_ed25519_verify(struct ed25519_keypair *key __unused,
885a116848bSValerii Chubar 					 const uint8_t *msg __unused,
886a116848bSValerii Chubar 					 size_t msg_len __unused,
887a116848bSValerii Chubar 					 const uint8_t *sig __unused,
888a116848bSValerii Chubar 					 size_t sig_len __unused)
889a116848bSValerii Chubar {
890a116848bSValerii Chubar 	return TEE_ERROR_NOT_IMPLEMENTED;
891a116848bSValerii Chubar }
892a116848bSValerii Chubar 
893a116848bSValerii Chubar TEE_Result crypto_acipher_ed25519ctx_sign(struct ed25519_keypair *key __unused,
894a116848bSValerii Chubar 					  const uint8_t *msg __unused,
895a116848bSValerii Chubar 					  size_t msg_len __unused,
896a116848bSValerii Chubar 					  uint8_t *sig __unused,
897a116848bSValerii Chubar 					  size_t *sig_len __unused,
898a116848bSValerii Chubar 					  bool ph_flag __unused,
899a116848bSValerii Chubar 					  const uint8_t *ctx __unused,
900a116848bSValerii Chubar 					  size_t ctxlen __unused)
901a116848bSValerii Chubar {
902a116848bSValerii Chubar 	return TEE_ERROR_NOT_IMPLEMENTED;
903a116848bSValerii Chubar }
904a116848bSValerii Chubar 
905a116848bSValerii Chubar TEE_Result crypto_acipher_ed25519ctx_verify(struct ed25519_keypair *key
906a116848bSValerii Chubar 							 __unused,
907a116848bSValerii Chubar 					    const uint8_t *msg __unused,
908a116848bSValerii Chubar 					    size_t msg_len __unused,
909a116848bSValerii Chubar 					    const uint8_t *sig __unused,
910a116848bSValerii Chubar 					    size_t sig_len __unused,
911a116848bSValerii Chubar 					    bool ph_flag __unused,
912a116848bSValerii Chubar 					    const uint8_t *ctx __unused,
913a116848bSValerii Chubar 					    size_t ctxlen __unused)
914a116848bSValerii Chubar {
915a116848bSValerii Chubar 	return TEE_ERROR_NOT_IMPLEMENTED;
916a116848bSValerii Chubar }
917a116848bSValerii Chubar #endif
918a116848bSValerii Chubar 
9196301ca1cSJorge Ramirez-Ortiz __weak TEE_Result crypto_storage_obj_del(struct tee_obj *obj __unused)
9205dfe86d0SJorge Ramirez-Ortiz {
9216301ca1cSJorge Ramirez-Ortiz 	return TEE_ERROR_NOT_IMPLEMENTED;
9225dfe86d0SJorge Ramirez-Ortiz }
923