xref: /optee_os/core/crypto/crypto.c (revision b21f583d20f2bb9d7ec88860c2bace542b29de79)
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;
4847645577SJerome Forissier 		case TEE_ALG_SM3:
4947645577SJerome Forissier 			res = crypto_sm3_alloc_ctx(&c);
5047645577SJerome Forissier 			break;
516648f482SJens Wiklander 		default:
527222fc6aSCedric Neveux 			break;
537222fc6aSCedric Neveux 		}
54b887bd8fSJens Wiklander 	}
55b887bd8fSJens Wiklander 
566648f482SJens Wiklander 	if (!res)
576648f482SJens Wiklander 		*ctx = c;
586648f482SJens Wiklander 
596648f482SJens Wiklander 	return res;
606648f482SJens Wiklander }
616648f482SJens Wiklander 
626648f482SJens Wiklander static const struct crypto_hash_ops *hash_ops(void *ctx)
636648f482SJens Wiklander {
646648f482SJens Wiklander 	struct crypto_hash_ctx *c = ctx;
656648f482SJens Wiklander 
666648f482SJens Wiklander 	assert(c && c->ops);
676648f482SJens Wiklander 
686648f482SJens Wiklander 	return c->ops;
696648f482SJens Wiklander }
706648f482SJens Wiklander 
716b3a371cSJens Wiklander void crypto_hash_free_ctx(void *ctx)
72ecf2e014SJens Wiklander {
73ce7a47f5SJerome Forissier 	if (ctx)
746648f482SJens Wiklander 		hash_ops(ctx)->free_ctx(ctx);
75ecf2e014SJens Wiklander }
76ecf2e014SJens Wiklander 
776b3a371cSJens Wiklander void crypto_hash_copy_state(void *dst_ctx, void *src_ctx)
78ecf2e014SJens Wiklander {
796648f482SJens Wiklander 	hash_ops(dst_ctx)->copy_state(dst_ctx, src_ctx);
80ecf2e014SJens Wiklander }
81ecf2e014SJens Wiklander 
826b3a371cSJens Wiklander TEE_Result crypto_hash_init(void *ctx)
83b887bd8fSJens Wiklander {
846648f482SJens Wiklander 	return hash_ops(ctx)->init(ctx);
85b887bd8fSJens Wiklander }
866648f482SJens Wiklander 
876b3a371cSJens Wiklander TEE_Result crypto_hash_update(void *ctx, const uint8_t *data, size_t len)
88b887bd8fSJens Wiklander {
896648f482SJens Wiklander 	return hash_ops(ctx)->update(ctx, data, len);
90b887bd8fSJens Wiklander }
916648f482SJens Wiklander 
926b3a371cSJens Wiklander TEE_Result crypto_hash_final(void *ctx, uint8_t *digest, size_t len)
93b887bd8fSJens Wiklander {
946648f482SJens Wiklander 	return hash_ops(ctx)->final(ctx, digest, len);
95b887bd8fSJens Wiklander }
9682d91db1SJens Wiklander 
9796098f01SJens Wiklander TEE_Result crypto_cipher_alloc_ctx(void **ctx, uint32_t algo)
9882d91db1SJens Wiklander {
99e43ab7a8SCedric Neveux 	TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED;
10096098f01SJens Wiklander 	struct crypto_cipher_ctx *c = NULL;
10196098f01SJens Wiklander 
102e43ab7a8SCedric Neveux 	/*
103e43ab7a8SCedric Neveux 	 * Use default cryptographic implementation if no matching
104e43ab7a8SCedric Neveux 	 * drvcrypt device.
105e43ab7a8SCedric Neveux 	 */
106e43ab7a8SCedric Neveux 	res = drvcrypt_cipher_alloc_ctx(&c, algo);
107e43ab7a8SCedric Neveux 
108e43ab7a8SCedric Neveux 	if (res == TEE_ERROR_NOT_IMPLEMENTED) {
10996098f01SJens Wiklander 		switch (algo) {
11096098f01SJens Wiklander 		case TEE_ALG_AES_ECB_NOPAD:
11196098f01SJens Wiklander 			res = crypto_aes_ecb_alloc_ctx(&c);
11296098f01SJens Wiklander 			break;
11396098f01SJens Wiklander 		case TEE_ALG_AES_CBC_NOPAD:
11496098f01SJens Wiklander 			res = crypto_aes_cbc_alloc_ctx(&c);
11596098f01SJens Wiklander 			break;
11696098f01SJens Wiklander 		case TEE_ALG_AES_CTR:
11796098f01SJens Wiklander 			res = crypto_aes_ctr_alloc_ctx(&c);
11896098f01SJens Wiklander 			break;
11996098f01SJens Wiklander 		case TEE_ALG_AES_CTS:
12096098f01SJens Wiklander 			res = crypto_aes_cts_alloc_ctx(&c);
12196098f01SJens Wiklander 			break;
12296098f01SJens Wiklander 		case TEE_ALG_AES_XTS:
12396098f01SJens Wiklander 			res = crypto_aes_xts_alloc_ctx(&c);
12496098f01SJens Wiklander 			break;
12596098f01SJens Wiklander 		case TEE_ALG_DES_ECB_NOPAD:
12696098f01SJens Wiklander 			res = crypto_des_ecb_alloc_ctx(&c);
12796098f01SJens Wiklander 			break;
12896098f01SJens Wiklander 		case TEE_ALG_DES3_ECB_NOPAD:
12996098f01SJens Wiklander 			res = crypto_des3_ecb_alloc_ctx(&c);
13096098f01SJens Wiklander 			break;
13196098f01SJens Wiklander 		case TEE_ALG_DES_CBC_NOPAD:
13296098f01SJens Wiklander 			res = crypto_des_cbc_alloc_ctx(&c);
13396098f01SJens Wiklander 			break;
13496098f01SJens Wiklander 		case TEE_ALG_DES3_CBC_NOPAD:
13596098f01SJens Wiklander 			res = crypto_des3_cbc_alloc_ctx(&c);
13696098f01SJens Wiklander 			break;
137ade6f848SJerome Forissier 		case TEE_ALG_SM4_ECB_NOPAD:
138ade6f848SJerome Forissier 			res = crypto_sm4_ecb_alloc_ctx(&c);
139ade6f848SJerome Forissier 			break;
140ade6f848SJerome Forissier 		case TEE_ALG_SM4_CBC_NOPAD:
141ade6f848SJerome Forissier 			res = crypto_sm4_cbc_alloc_ctx(&c);
142ade6f848SJerome Forissier 			break;
143ade6f848SJerome Forissier 		case TEE_ALG_SM4_CTR:
144ade6f848SJerome Forissier 			res = crypto_sm4_ctr_alloc_ctx(&c);
145ade6f848SJerome Forissier 			break;
146*b21f583dSPingan Xie 		case TEE_ALG_SM4_XTS:
147*b21f583dSPingan Xie 			res = crypto_sm4_xts_alloc_ctx(&c);
148*b21f583dSPingan Xie 			break;
14996098f01SJens Wiklander 		default:
1501c5fdd1fSJerome Forissier 			return TEE_ERROR_NOT_IMPLEMENTED;
15182d91db1SJens Wiklander 		}
152e43ab7a8SCedric Neveux 	}
15382d91db1SJens Wiklander 
15496098f01SJens Wiklander 	if (!res)
15596098f01SJens Wiklander 		*ctx = c;
15696098f01SJens Wiklander 
15796098f01SJens Wiklander 	return res;
15896098f01SJens Wiklander }
15996098f01SJens Wiklander 
16096098f01SJens Wiklander static const struct crypto_cipher_ops *cipher_ops(void *ctx)
16196098f01SJens Wiklander {
16296098f01SJens Wiklander 	struct crypto_cipher_ctx *c = ctx;
16396098f01SJens Wiklander 
16496098f01SJens Wiklander 	assert(c && c->ops);
16596098f01SJens Wiklander 
16696098f01SJens Wiklander 	return c->ops;
16796098f01SJens Wiklander }
16896098f01SJens Wiklander 
169cbda7091SJens Wiklander void crypto_cipher_free_ctx(void *ctx)
17072a9b1a0SJens Wiklander {
171ce7a47f5SJerome Forissier 	if (ctx)
17296098f01SJens Wiklander 		cipher_ops(ctx)->free_ctx(ctx);
17372a9b1a0SJens Wiklander }
17472a9b1a0SJens Wiklander 
175cbda7091SJens Wiklander void crypto_cipher_copy_state(void *dst_ctx, void *src_ctx)
17672a9b1a0SJens Wiklander {
17796098f01SJens Wiklander 	cipher_ops(dst_ctx)->copy_state(dst_ctx, src_ctx);
17872a9b1a0SJens Wiklander }
17972a9b1a0SJens Wiklander 
180cbda7091SJens Wiklander TEE_Result crypto_cipher_init(void *ctx, TEE_OperationMode mode,
181cbda7091SJens Wiklander 			      const uint8_t *key1, size_t key1_len,
182cbda7091SJens Wiklander 			      const uint8_t *key2, size_t key2_len,
183cbda7091SJens Wiklander 			      const uint8_t *iv, size_t iv_len)
18482d91db1SJens Wiklander {
18596098f01SJens Wiklander 	if (mode != TEE_MODE_DECRYPT && mode != TEE_MODE_ENCRYPT)
18696098f01SJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
18796098f01SJens Wiklander 
18896098f01SJens Wiklander 	return cipher_ops(ctx)->init(ctx, mode, key1, key1_len, key2, key2_len,
18996098f01SJens Wiklander 				     iv, iv_len);
19082d91db1SJens Wiklander }
19182d91db1SJens Wiklander 
192cbda7091SJens Wiklander TEE_Result crypto_cipher_update(void *ctx, TEE_OperationMode mode __unused,
19396098f01SJens Wiklander 				bool last_block, const uint8_t *data,
19496098f01SJens Wiklander 				size_t len, uint8_t *dst)
19582d91db1SJens Wiklander {
19696098f01SJens Wiklander 	return cipher_ops(ctx)->update(ctx, last_block, data, len, dst);
19782d91db1SJens Wiklander }
19882d91db1SJens Wiklander 
199cbda7091SJens Wiklander void crypto_cipher_final(void *ctx)
20082d91db1SJens Wiklander {
20196098f01SJens Wiklander 	cipher_ops(ctx)->final(ctx);
20282d91db1SJens Wiklander }
203e9eaba5cSJens Wiklander 
2046d259e05SJens Wiklander TEE_Result crypto_cipher_get_block_size(uint32_t algo, size_t *size)
2056d259e05SJens Wiklander {
2066d259e05SJens Wiklander 	uint32_t class = TEE_ALG_GET_CLASS(algo);
2076d259e05SJens Wiklander 
2086d259e05SJens Wiklander 	if (class != TEE_OPERATION_CIPHER && class != TEE_OPERATION_MAC &&
2096d259e05SJens Wiklander 	    class != TEE_OPERATION_AE)
2106d259e05SJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
2116d259e05SJens Wiklander 
2126d259e05SJens Wiklander 	switch (TEE_ALG_GET_MAIN_ALG(algo)) {
2136d259e05SJens Wiklander 	case TEE_MAIN_ALGO_AES:
2146d259e05SJens Wiklander 		*size = TEE_AES_BLOCK_SIZE;
2156d259e05SJens Wiklander 		return TEE_SUCCESS;
2166d259e05SJens Wiklander 	case TEE_MAIN_ALGO_DES:
2176d259e05SJens Wiklander 	case TEE_MAIN_ALGO_DES3:
2186d259e05SJens Wiklander 		*size = TEE_DES_BLOCK_SIZE;
2196d259e05SJens Wiklander 		return TEE_SUCCESS;
220ade6f848SJerome Forissier 	case TEE_MAIN_ALGO_SM4:
221ade6f848SJerome Forissier 		*size = TEE_SM4_BLOCK_SIZE;
222ade6f848SJerome Forissier 		return TEE_SUCCESS;
2236d259e05SJens Wiklander 	default:
2246d259e05SJens Wiklander 		return TEE_ERROR_NOT_SUPPORTED;
2256d259e05SJens Wiklander 	}
2266d259e05SJens Wiklander }
2276d259e05SJens Wiklander 
2285da36a24SJens Wiklander TEE_Result crypto_mac_alloc_ctx(void **ctx, uint32_t algo)
229e9eaba5cSJens Wiklander {
2305da36a24SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
2315da36a24SJens Wiklander 	struct crypto_mac_ctx *c = NULL;
2325da36a24SJens Wiklander 
233ea9ac29cSCedric Neveux 	/*
234ea9ac29cSCedric Neveux 	 * Use default cryptographic implementation if no matching
235ea9ac29cSCedric Neveux 	 * drvcrypt device.
236ea9ac29cSCedric Neveux 	 */
237ea9ac29cSCedric Neveux 	res = drvcrypt_mac_alloc_ctx(&c, algo);
238ea9ac29cSCedric Neveux 
239ea9ac29cSCedric Neveux 	if (res == TEE_ERROR_NOT_IMPLEMENTED) {
2405da36a24SJens Wiklander 		switch (algo) {
2415da36a24SJens Wiklander 		case TEE_ALG_HMAC_MD5:
2425da36a24SJens Wiklander 			res = crypto_hmac_md5_alloc_ctx(&c);
2435da36a24SJens Wiklander 			break;
2445da36a24SJens Wiklander 		case TEE_ALG_HMAC_SHA1:
2455da36a24SJens Wiklander 			res = crypto_hmac_sha1_alloc_ctx(&c);
2465da36a24SJens Wiklander 			break;
2475da36a24SJens Wiklander 		case TEE_ALG_HMAC_SHA224:
2485da36a24SJens Wiklander 			res = crypto_hmac_sha224_alloc_ctx(&c);
2495da36a24SJens Wiklander 			break;
2505da36a24SJens Wiklander 		case TEE_ALG_HMAC_SHA256:
2515da36a24SJens Wiklander 			res = crypto_hmac_sha256_alloc_ctx(&c);
2525da36a24SJens Wiklander 			break;
2535da36a24SJens Wiklander 		case TEE_ALG_HMAC_SHA384:
2545da36a24SJens Wiklander 			res = crypto_hmac_sha384_alloc_ctx(&c);
2555da36a24SJens Wiklander 			break;
2565da36a24SJens Wiklander 		case TEE_ALG_HMAC_SHA512:
2575da36a24SJens Wiklander 			res = crypto_hmac_sha512_alloc_ctx(&c);
2585da36a24SJens Wiklander 			break;
25947645577SJerome Forissier 		case TEE_ALG_HMAC_SM3:
26047645577SJerome Forissier 			res = crypto_hmac_sm3_alloc_ctx(&c);
26147645577SJerome Forissier 			break;
2625da36a24SJens Wiklander 		case TEE_ALG_AES_CBC_MAC_NOPAD:
2635da36a24SJens Wiklander 			res = crypto_aes_cbc_mac_nopad_alloc_ctx(&c);
2645da36a24SJens Wiklander 			break;
2655da36a24SJens Wiklander 		case TEE_ALG_AES_CBC_MAC_PKCS5:
2665da36a24SJens Wiklander 			res = crypto_aes_cbc_mac_pkcs5_alloc_ctx(&c);
2675da36a24SJens Wiklander 			break;
2685da36a24SJens Wiklander 		case TEE_ALG_DES_CBC_MAC_NOPAD:
2695da36a24SJens Wiklander 			res = crypto_des_cbc_mac_nopad_alloc_ctx(&c);
2705da36a24SJens Wiklander 			break;
2715da36a24SJens Wiklander 		case TEE_ALG_DES_CBC_MAC_PKCS5:
2725da36a24SJens Wiklander 			res = crypto_des_cbc_mac_pkcs5_alloc_ctx(&c);
2735da36a24SJens Wiklander 			break;
2745da36a24SJens Wiklander 		case TEE_ALG_DES3_CBC_MAC_NOPAD:
2755da36a24SJens Wiklander 			res = crypto_des3_cbc_mac_nopad_alloc_ctx(&c);
2765da36a24SJens Wiklander 			break;
2775da36a24SJens Wiklander 		case TEE_ALG_DES3_CBC_MAC_PKCS5:
2785da36a24SJens Wiklander 			res = crypto_des3_cbc_mac_pkcs5_alloc_ctx(&c);
2795da36a24SJens Wiklander 			break;
280eee637e7SAlexander Zakharov 		case TEE_ALG_DES3_CMAC:
281eee637e7SAlexander Zakharov 			res = crypto_des3_cmac_alloc_ctx(&c);
282eee637e7SAlexander Zakharov 			break;
2835da36a24SJens Wiklander 		case TEE_ALG_AES_CMAC:
2845da36a24SJens Wiklander 			res = crypto_aes_cmac_alloc_ctx(&c);
2855da36a24SJens Wiklander 			break;
2865da36a24SJens Wiklander 		default:
2875da36a24SJens Wiklander 			return TEE_ERROR_NOT_SUPPORTED;
2885da36a24SJens Wiklander 		}
289ea9ac29cSCedric Neveux 	}
2905da36a24SJens Wiklander 
2915da36a24SJens Wiklander 	if (!res)
2925da36a24SJens Wiklander 		*ctx = c;
2935da36a24SJens Wiklander 
2945da36a24SJens Wiklander 	return res;
2955da36a24SJens Wiklander }
2965da36a24SJens Wiklander 
2975da36a24SJens Wiklander static const struct crypto_mac_ops *mac_ops(void *ctx)
2985da36a24SJens Wiklander {
2995da36a24SJens Wiklander 	struct crypto_mac_ctx *c = ctx;
3005da36a24SJens Wiklander 
3015da36a24SJens Wiklander 	assert(c && c->ops);
3025da36a24SJens Wiklander 
3035da36a24SJens Wiklander 	return c->ops;
304e9eaba5cSJens Wiklander }
305e9eaba5cSJens Wiklander 
306c69bc615SJens Wiklander void crypto_mac_free_ctx(void *ctx)
30782ef73bcSJens Wiklander {
308ce7a47f5SJerome Forissier 	if (ctx)
3095da36a24SJens Wiklander 		mac_ops(ctx)->free_ctx(ctx);
31082ef73bcSJens Wiklander }
31182ef73bcSJens Wiklander 
312c69bc615SJens Wiklander void crypto_mac_copy_state(void *dst_ctx, void *src_ctx)
31382ef73bcSJens Wiklander {
3145da36a24SJens Wiklander 	mac_ops(dst_ctx)->copy_state(dst_ctx, src_ctx);
31582ef73bcSJens Wiklander }
31682ef73bcSJens Wiklander 
317c69bc615SJens Wiklander TEE_Result crypto_mac_init(void *ctx, const uint8_t *key, size_t len)
318e9eaba5cSJens Wiklander {
3195da36a24SJens Wiklander 	return mac_ops(ctx)->init(ctx, key, len);
320e9eaba5cSJens Wiklander }
321e9eaba5cSJens Wiklander 
322c69bc615SJens Wiklander TEE_Result crypto_mac_update(void *ctx, const uint8_t *data, size_t len)
323e9eaba5cSJens Wiklander {
3245da36a24SJens Wiklander 	if (!len)
3255da36a24SJens Wiklander 		return TEE_SUCCESS;
3265da36a24SJens Wiklander 
3275da36a24SJens Wiklander 	return mac_ops(ctx)->update(ctx, data, len);
328e9eaba5cSJens Wiklander }
329e9eaba5cSJens Wiklander 
330c69bc615SJens Wiklander TEE_Result crypto_mac_final(void *ctx, uint8_t *digest, size_t digest_len)
331e9eaba5cSJens Wiklander {
3325da36a24SJens Wiklander 	return mac_ops(ctx)->final(ctx, digest, digest_len);
333e9eaba5cSJens Wiklander }
334e9eaba5cSJens Wiklander 
335d7ac7d0fSJens Wiklander TEE_Result crypto_authenc_alloc_ctx(void **ctx, uint32_t algo)
3368875ce46SJens Wiklander {
337e3e4ce47SNicolas Toromanoff 	TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED;
338f1e9b21bSJens Wiklander 	struct crypto_authenc_ctx *c = NULL;
339f1e9b21bSJens Wiklander 
340e3e4ce47SNicolas Toromanoff 	/*
341e3e4ce47SNicolas Toromanoff 	 * Use default authenc implementation if no matching
342e3e4ce47SNicolas Toromanoff 	 * drvcrypt device.
343e3e4ce47SNicolas Toromanoff 	 */
344e3e4ce47SNicolas Toromanoff 	res = drvcrypt_authenc_alloc_ctx(&c, algo);
345e3e4ce47SNicolas Toromanoff 
346e3e4ce47SNicolas Toromanoff 	if (res == TEE_ERROR_NOT_IMPLEMENTED) {
347d0620b01SJens Wiklander 		switch (algo) {
348d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM)
349d0620b01SJens Wiklander 		case TEE_ALG_AES_CCM:
350f1e9b21bSJens Wiklander 			res = crypto_aes_ccm_alloc_ctx(&c);
351f1e9b21bSJens Wiklander 			break;
352d0620b01SJens Wiklander #endif
353d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM)
354d0620b01SJens Wiklander 		case TEE_ALG_AES_GCM:
355f1e9b21bSJens Wiklander 			res = crypto_aes_gcm_alloc_ctx(&c);
356f1e9b21bSJens Wiklander 			break;
357d0620b01SJens Wiklander #endif
358d0620b01SJens Wiklander 		default:
359e3e4ce47SNicolas Toromanoff 			break;
360e3e4ce47SNicolas Toromanoff 		}
3618875ce46SJens Wiklander 	}
362f1e9b21bSJens Wiklander 
363f1e9b21bSJens Wiklander 	if (!res)
364f1e9b21bSJens Wiklander 		*ctx = c;
365f1e9b21bSJens Wiklander 
366f1e9b21bSJens Wiklander 	return res;
367d0620b01SJens Wiklander }
3688875ce46SJens Wiklander 
369f1e9b21bSJens Wiklander static const struct crypto_authenc_ops *ae_ops(void *ctx)
370d7ac7d0fSJens Wiklander {
371f1e9b21bSJens Wiklander 	struct crypto_authenc_ctx *c = ctx;
372f1e9b21bSJens Wiklander 
373f1e9b21bSJens Wiklander 	assert(c && c->ops);
374f1e9b21bSJens Wiklander 
375f1e9b21bSJens Wiklander 	return c->ops;
376d7ac7d0fSJens Wiklander }
377d7ac7d0fSJens Wiklander 
37852ee414bSJens Wiklander TEE_Result crypto_authenc_init(void *ctx, TEE_OperationMode mode,
379f1e9b21bSJens Wiklander 			       const uint8_t *key, size_t key_len,
380f1e9b21bSJens Wiklander 			       const uint8_t *nonce, size_t nonce_len,
381f1e9b21bSJens Wiklander 			       size_t tag_len, size_t aad_len,
382f1e9b21bSJens Wiklander 			       size_t payload_len)
383d7ac7d0fSJens Wiklander {
384f1e9b21bSJens Wiklander 	return ae_ops(ctx)->init(ctx, mode, key, key_len, nonce, nonce_len,
385f1e9b21bSJens Wiklander 				 tag_len, aad_len, payload_len);
386d7ac7d0fSJens Wiklander }
387d7ac7d0fSJens Wiklander 
38852ee414bSJens Wiklander TEE_Result crypto_authenc_update_aad(void *ctx, TEE_OperationMode mode __unused,
389f1e9b21bSJens Wiklander 				     const uint8_t *data, size_t len)
3908875ce46SJens Wiklander {
391f1e9b21bSJens Wiklander 	return ae_ops(ctx)->update_aad(ctx, data, len);
392d0620b01SJens Wiklander }
3938875ce46SJens Wiklander 
394d0620b01SJens Wiklander 
39552ee414bSJens Wiklander TEE_Result crypto_authenc_update_payload(void *ctx, TEE_OperationMode mode,
396f1e9b21bSJens Wiklander 					 const uint8_t *src_data,
397f1e9b21bSJens Wiklander 					 size_t src_len, uint8_t *dst_data,
398f1e9b21bSJens Wiklander 					 size_t *dst_len)
399f1e9b21bSJens Wiklander {
400f1e9b21bSJens Wiklander 	if (*dst_len < src_len)
401d0620b01SJens Wiklander 		return TEE_ERROR_SHORT_BUFFER;
402d0620b01SJens Wiklander 	*dst_len = src_len;
403d0620b01SJens Wiklander 
404f1e9b21bSJens Wiklander 	return ae_ops(ctx)->update_payload(ctx, mode, src_data, src_len,
405f1e9b21bSJens Wiklander 					   dst_data);
406d0620b01SJens Wiklander }
4078875ce46SJens Wiklander 
40852ee414bSJens Wiklander TEE_Result crypto_authenc_enc_final(void *ctx, const uint8_t *src_data,
40952ee414bSJens Wiklander 				    size_t src_len, uint8_t *dst_data,
41052ee414bSJens Wiklander 				    size_t *dst_len, uint8_t *dst_tag,
41152ee414bSJens Wiklander 				    size_t *dst_tag_len)
4128875ce46SJens Wiklander {
413f1e9b21bSJens Wiklander 	if (*dst_len < src_len)
414f1e9b21bSJens Wiklander 		return TEE_ERROR_SHORT_BUFFER;
415d0620b01SJens Wiklander 	*dst_len = src_len;
416d0620b01SJens Wiklander 
417f1e9b21bSJens Wiklander 	return ae_ops(ctx)->enc_final(ctx, src_data, src_len, dst_data,
418f1e9b21bSJens Wiklander 				      dst_tag, dst_tag_len);
4198875ce46SJens Wiklander }
4208875ce46SJens Wiklander 
42152ee414bSJens Wiklander TEE_Result crypto_authenc_dec_final(void *ctx, const uint8_t *src_data,
42252ee414bSJens Wiklander 				    size_t src_len, uint8_t *dst_data,
42352ee414bSJens Wiklander 				    size_t *dst_len, const uint8_t *tag,
42452ee414bSJens Wiklander 				    size_t tag_len)
4258875ce46SJens Wiklander {
426f1e9b21bSJens Wiklander 	if (*dst_len < src_len)
427f1e9b21bSJens Wiklander 		return TEE_ERROR_SHORT_BUFFER;
428f1e9b21bSJens Wiklander 	*dst_len = src_len;
429f1e9b21bSJens Wiklander 
430f1e9b21bSJens Wiklander 	return ae_ops(ctx)->dec_final(ctx, src_data, src_len, dst_data, tag,
431f1e9b21bSJens Wiklander 				      tag_len);
4328875ce46SJens Wiklander }
433f1e9b21bSJens Wiklander 
43452ee414bSJens Wiklander void crypto_authenc_final(void *ctx)
435f1e9b21bSJens Wiklander {
436f1e9b21bSJens Wiklander 	ae_ops(ctx)->final(ctx);
437f1e9b21bSJens Wiklander }
438f1e9b21bSJens Wiklander 
43952ee414bSJens Wiklander void crypto_authenc_free_ctx(void *ctx)
440f1e9b21bSJens Wiklander {
441f1e9b21bSJens Wiklander 	if (ctx)
442f1e9b21bSJens Wiklander 		ae_ops(ctx)->free_ctx(ctx);
443f1e9b21bSJens Wiklander }
444f1e9b21bSJens Wiklander 
44552ee414bSJens Wiklander void crypto_authenc_copy_state(void *dst_ctx, void *src_ctx)
446f1e9b21bSJens Wiklander {
447f1e9b21bSJens Wiklander 	ae_ops(dst_ctx)->copy_state(dst_ctx, src_ctx);
448d0620b01SJens Wiklander }
44933790cc1SJens Wiklander 
450da1de557SJens Wiklander #if !defined(CFG_CRYPTO_RSA) && !defined(CFG_CRYPTO_DSA) && \
451da1de557SJens Wiklander     !defined(CFG_CRYPTO_DH) && !defined(CFG_CRYPTO_ECC)
45233790cc1SJens Wiklander struct bignum *crypto_bignum_allocate(size_t size_bits __unused)
45333790cc1SJens Wiklander {
45433790cc1SJens Wiklander 	return NULL;
45533790cc1SJens Wiklander }
45633790cc1SJens Wiklander 
45733790cc1SJens Wiklander TEE_Result crypto_bignum_bin2bn(const uint8_t *from __unused,
45833790cc1SJens Wiklander 				size_t fromsize __unused,
45933790cc1SJens Wiklander 				struct bignum *to __unused)
46033790cc1SJens Wiklander {
46133790cc1SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
46233790cc1SJens Wiklander }
46333790cc1SJens Wiklander 
46433790cc1SJens Wiklander size_t crypto_bignum_num_bytes(struct bignum *a __unused)
46533790cc1SJens Wiklander {
46633790cc1SJens Wiklander 	return 0;
46733790cc1SJens Wiklander }
46833790cc1SJens Wiklander 
46933790cc1SJens Wiklander size_t crypto_bignum_num_bits(struct bignum *a __unused)
47033790cc1SJens Wiklander {
47133790cc1SJens Wiklander 	return 0;
47233790cc1SJens Wiklander }
47333790cc1SJens Wiklander 
47433790cc1SJens Wiklander /*
47533790cc1SJens Wiklander  * crypto_bignum_allocate() and crypto_bignum_bin2bn() failing should be
47633790cc1SJens Wiklander  * enough to guarantee that the functions calling this function aren't
47733790cc1SJens Wiklander  * called, but just in case add a panic() here to avoid unexpected
47833790cc1SJens Wiklander  * behavoir.
47933790cc1SJens Wiklander  */
48033790cc1SJens Wiklander static void bignum_cant_happen(void)
48133790cc1SJens Wiklander {
48233790cc1SJens Wiklander 	volatile bool b = true;
48333790cc1SJens Wiklander 
48433790cc1SJens Wiklander 	/* Avoid warning about function does not return */
48533790cc1SJens Wiklander 	if (b)
48633790cc1SJens Wiklander 		panic();
48733790cc1SJens Wiklander }
48833790cc1SJens Wiklander 
48933790cc1SJens Wiklander void crypto_bignum_bn2bin(const struct bignum *from __unused,
49033790cc1SJens Wiklander 			  uint8_t *to __unused)
49133790cc1SJens Wiklander {
49233790cc1SJens Wiklander 	bignum_cant_happen();
49333790cc1SJens Wiklander }
49433790cc1SJens Wiklander 
49533790cc1SJens Wiklander void crypto_bignum_copy(struct bignum *to __unused,
49633790cc1SJens Wiklander 			const struct bignum *from __unused)
49733790cc1SJens Wiklander {
49833790cc1SJens Wiklander 	bignum_cant_happen();
49933790cc1SJens Wiklander }
50033790cc1SJens Wiklander 
50133790cc1SJens Wiklander void crypto_bignum_free(struct bignum *a)
50233790cc1SJens Wiklander {
50333790cc1SJens Wiklander 	if (a)
50433790cc1SJens Wiklander 		panic();
50533790cc1SJens Wiklander }
50633790cc1SJens Wiklander 
50733790cc1SJens Wiklander void crypto_bignum_clear(struct bignum *a __unused)
50833790cc1SJens Wiklander {
50933790cc1SJens Wiklander 	bignum_cant_happen();
51033790cc1SJens Wiklander }
51133790cc1SJens Wiklander 
51233790cc1SJens Wiklander /* return -1 if a<b, 0 if a==b, +1 if a>b */
51333790cc1SJens Wiklander int32_t crypto_bignum_compare(struct bignum *a __unused,
51433790cc1SJens Wiklander 			      struct bignum *b __unused)
51533790cc1SJens Wiklander {
51633790cc1SJens Wiklander 	bignum_cant_happen();
51733790cc1SJens Wiklander 	return -1;
51833790cc1SJens Wiklander }
519da1de557SJens Wiklander #endif
520291e5450SJens Wiklander 
521da1de557SJens Wiklander #if !defined(CFG_CRYPTO_RSA)
522291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_rsa_keypair(struct rsa_keypair *s __unused,
523291e5450SJens Wiklander 					    size_t key_size_bits __unused)
524291e5450SJens Wiklander {
525291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
526291e5450SJens Wiklander }
527291e5450SJens Wiklander 
528291e5450SJens Wiklander TEE_Result
529291e5450SJens Wiklander crypto_acipher_alloc_rsa_public_key(struct rsa_public_key *s __unused,
530291e5450SJens Wiklander 				    size_t key_size_bits __unused)
531291e5450SJens Wiklander {
532291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
533291e5450SJens Wiklander }
534291e5450SJens Wiklander 
535291e5450SJens Wiklander void crypto_acipher_free_rsa_public_key(struct rsa_public_key *s __unused)
536291e5450SJens Wiklander {
537291e5450SJens Wiklander }
538291e5450SJens Wiklander 
539a1d5c81fSElias von Däniken void crypto_acipher_free_rsa_keypair(struct rsa_keypair *s __unused)
540a1d5c81fSElias von Däniken {
541a1d5c81fSElias von Däniken }
542a1d5c81fSElias von Däniken 
543291e5450SJens Wiklander TEE_Result crypto_acipher_gen_rsa_key(struct rsa_keypair *key __unused,
544291e5450SJens Wiklander 				      size_t key_size __unused)
545291e5450SJens Wiklander {
546291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
547291e5450SJens Wiklander }
548291e5450SJens Wiklander 
549291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_decrypt(struct rsa_keypair *key __unused,
550291e5450SJens Wiklander 					   const uint8_t *src __unused,
551291e5450SJens Wiklander 					   size_t src_len __unused,
552291e5450SJens Wiklander 					   uint8_t *dst __unused,
553291e5450SJens Wiklander 					   size_t *dst_len __unused)
554291e5450SJens Wiklander {
555291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
556291e5450SJens Wiklander }
557291e5450SJens Wiklander 
558291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_encrypt(struct rsa_public_key *key __unused,
559291e5450SJens Wiklander 					   const uint8_t *src __unused,
560291e5450SJens Wiklander 					   size_t src_len __unused,
561291e5450SJens Wiklander 					   uint8_t *dst __unused,
562291e5450SJens Wiklander 					   size_t *dst_len __unused)
563291e5450SJens Wiklander {
564291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
565291e5450SJens Wiklander }
566291e5450SJens Wiklander 
567291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_decrypt(uint32_t algo __unused,
568291e5450SJens Wiklander 					struct rsa_keypair *key __unused,
569291e5450SJens Wiklander 					const uint8_t *label __unused,
570291e5450SJens Wiklander 					size_t label_len __unused,
571291e5450SJens Wiklander 					const uint8_t *src __unused,
572291e5450SJens Wiklander 					size_t src_len __unused,
573291e5450SJens Wiklander 					uint8_t *dst __unused,
574291e5450SJens Wiklander 					size_t *dst_len __unused)
575291e5450SJens Wiklander {
576291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
577291e5450SJens Wiklander }
578291e5450SJens Wiklander 
579291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_encrypt(uint32_t algo __unused,
580291e5450SJens Wiklander 					struct rsa_public_key *key __unused,
581291e5450SJens Wiklander 					const uint8_t *label __unused,
582291e5450SJens Wiklander 					size_t label_len __unused,
583291e5450SJens Wiklander 					const uint8_t *src __unused,
584291e5450SJens Wiklander 					size_t src_len __unused,
585291e5450SJens Wiklander 					uint8_t *dst __unused,
586291e5450SJens Wiklander 					size_t *dst_len __unused)
587291e5450SJens Wiklander {
588291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
589291e5450SJens Wiklander }
590291e5450SJens Wiklander 
591291e5450SJens Wiklander TEE_Result crypto_acipher_rsassa_sign(uint32_t algo __unused,
592291e5450SJens Wiklander 				      struct rsa_keypair *key __unused,
593291e5450SJens Wiklander 				      int salt_len __unused,
594291e5450SJens Wiklander 				      const uint8_t *msg __unused,
595291e5450SJens Wiklander 				      size_t msg_len __unused,
596291e5450SJens Wiklander 				      uint8_t *sig __unused,
597291e5450SJens Wiklander 				      size_t *sig_len __unused)
598291e5450SJens Wiklander {
599291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
600291e5450SJens Wiklander }
601291e5450SJens Wiklander 
602291e5450SJens Wiklander TEE_Result crypto_acipher_rsassa_verify(uint32_t algo __unused,
603291e5450SJens Wiklander 					struct rsa_public_key *key __unused,
604291e5450SJens Wiklander 					int salt_len __unused,
605291e5450SJens Wiklander 					const uint8_t *msg __unused,
606291e5450SJens Wiklander 					size_t msg_len __unused,
607291e5450SJens Wiklander 					const uint8_t *sig __unused,
608291e5450SJens Wiklander 					size_t sig_len __unused)
609291e5450SJens Wiklander {
610291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
611291e5450SJens Wiklander }
612da1de557SJens Wiklander #endif /*!CFG_CRYPTO_RSA*/
613291e5450SJens Wiklander 
614da1de557SJens Wiklander #if !defined(CFG_CRYPTO_DSA)
615291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dsa_keypair(struct dsa_keypair *s __unused,
616291e5450SJens Wiklander 					    size_t key_size_bits __unused)
617291e5450SJens Wiklander {
618291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
619291e5450SJens Wiklander }
620291e5450SJens Wiklander 
621291e5450SJens Wiklander TEE_Result
622291e5450SJens Wiklander crypto_acipher_alloc_dsa_public_key(struct dsa_public_key *s __unused,
623291e5450SJens Wiklander 				    size_t key_size_bits __unused)
624291e5450SJens Wiklander {
625291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
626291e5450SJens Wiklander }
627291e5450SJens Wiklander 
628291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dsa_key(struct dsa_keypair *key __unused,
629291e5450SJens Wiklander 				      size_t key_size __unused)
630291e5450SJens Wiklander {
631291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
632291e5450SJens Wiklander }
633291e5450SJens Wiklander 
634291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_sign(uint32_t algo __unused,
635291e5450SJens Wiklander 				   struct dsa_keypair *key __unused,
636291e5450SJens Wiklander 				   const uint8_t *msg __unused,
637291e5450SJens Wiklander 				   size_t msg_len __unused,
638291e5450SJens Wiklander 				   uint8_t *sig __unused,
639291e5450SJens Wiklander 				   size_t *sig_len __unused)
640291e5450SJens Wiklander {
641291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
642291e5450SJens Wiklander }
643291e5450SJens Wiklander 
644291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_verify(uint32_t algo __unused,
645291e5450SJens Wiklander 				     struct dsa_public_key *key __unused,
646291e5450SJens Wiklander 				     const uint8_t *msg __unused,
647291e5450SJens Wiklander 				     size_t msg_len __unused,
648291e5450SJens Wiklander 				     const uint8_t *sig __unused,
649291e5450SJens Wiklander 				     size_t sig_len __unused)
650291e5450SJens Wiklander {
651291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
652291e5450SJens Wiklander }
653da1de557SJens Wiklander #endif /*!CFG_CRYPTO_DSA*/
654291e5450SJens Wiklander 
655da1de557SJens Wiklander #if !defined(CFG_CRYPTO_DH)
656291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dh_keypair(struct dh_keypair *s __unused,
657291e5450SJens Wiklander 					   size_t key_size_bits __unused)
658291e5450SJens Wiklander {
659291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
660291e5450SJens Wiklander }
661291e5450SJens Wiklander 
662291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dh_key(struct dh_keypair *key __unused,
663291e5450SJens Wiklander 				     struct bignum *q __unused,
6649f4dcefbSJerome Forissier 				     size_t xbits __unused,
6659f4dcefbSJerome Forissier 				     size_t key_size __unused)
666291e5450SJens Wiklander {
667291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
668291e5450SJens Wiklander }
669291e5450SJens Wiklander 
670291e5450SJens Wiklander TEE_Result
671291e5450SJens Wiklander crypto_acipher_dh_shared_secret(struct dh_keypair *private_key __unused,
672291e5450SJens Wiklander 				struct bignum *public_key __unused,
673291e5450SJens Wiklander 				struct bignum *secret __unused)
674291e5450SJens Wiklander {
675291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
676291e5450SJens Wiklander }
677da1de557SJens Wiklander #endif /*!CFG_CRYPTO_DH*/
678291e5450SJens Wiklander 
679df00cf59SCedric Neveux TEE_Result crypto_acipher_alloc_ecc_public_key(struct ecc_public_key *key,
680df00cf59SCedric Neveux 					       uint32_t key_type,
681df00cf59SCedric Neveux 					       size_t key_size_bits)
682291e5450SJens Wiklander {
683df00cf59SCedric Neveux 	TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED;
684df00cf59SCedric Neveux 
685df00cf59SCedric Neveux 	/*
686df00cf59SCedric Neveux 	 * Use default cryptographic implementation if no matching
687df00cf59SCedric Neveux 	 * drvcrypt device.
688df00cf59SCedric Neveux 	 */
689df00cf59SCedric Neveux 	res = drvcrypt_asym_alloc_ecc_public_key(key, key_type, key_size_bits);
690df00cf59SCedric Neveux 	if (res == TEE_ERROR_NOT_IMPLEMENTED)
691df00cf59SCedric Neveux 		res = crypto_asym_alloc_ecc_public_key(key, key_type,
692df00cf59SCedric Neveux 						       key_size_bits);
693df00cf59SCedric Neveux 
694df00cf59SCedric Neveux 	return res;
695291e5450SJens Wiklander }
696291e5450SJens Wiklander 
697df00cf59SCedric Neveux TEE_Result crypto_acipher_alloc_ecc_keypair(struct ecc_keypair *key,
698df00cf59SCedric Neveux 					    uint32_t key_type,
699df00cf59SCedric Neveux 					    size_t key_size_bits)
700291e5450SJens Wiklander {
701df00cf59SCedric Neveux 	TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED;
702df00cf59SCedric Neveux 
703df00cf59SCedric Neveux 	/*
704df00cf59SCedric Neveux 	 * Use default cryptographic implementation if no matching
705df00cf59SCedric Neveux 	 * drvcrypt device.
706df00cf59SCedric Neveux 	 */
707df00cf59SCedric Neveux 	res = drvcrypt_asym_alloc_ecc_keypair(key, key_type, key_size_bits);
708df00cf59SCedric Neveux 	if (res == TEE_ERROR_NOT_IMPLEMENTED)
709df00cf59SCedric Neveux 		res = crypto_asym_alloc_ecc_keypair(key, key_type,
710df00cf59SCedric Neveux 						    key_size_bits);
711df00cf59SCedric Neveux 
712df00cf59SCedric Neveux 	return res;
713291e5450SJens Wiklander }
714291e5450SJens Wiklander 
715df00cf59SCedric Neveux void crypto_acipher_free_ecc_public_key(struct ecc_public_key *key)
716291e5450SJens Wiklander {
717df00cf59SCedric Neveux 	assert(key->ops && key->ops->free);
718df00cf59SCedric Neveux 
719df00cf59SCedric Neveux 	key->ops->free(key);
720291e5450SJens Wiklander }
721291e5450SJens Wiklander 
722df00cf59SCedric Neveux TEE_Result crypto_acipher_gen_ecc_key(struct ecc_keypair *key,
723df00cf59SCedric Neveux 				      size_t key_size_bits)
724291e5450SJens Wiklander {
725df00cf59SCedric Neveux 	assert(key->ops && key->ops->generate);
726df00cf59SCedric Neveux 
727df00cf59SCedric Neveux 	return key->ops->generate(key, key_size_bits);
728291e5450SJens Wiklander }
729291e5450SJens Wiklander 
730df00cf59SCedric Neveux TEE_Result crypto_acipher_ecc_sign(uint32_t algo, struct ecc_keypair *key,
731df00cf59SCedric Neveux 				   const uint8_t *msg, size_t msg_len,
732df00cf59SCedric Neveux 				   uint8_t *sig, size_t *sig_len)
733291e5450SJens Wiklander {
734df00cf59SCedric Neveux 	assert(key->ops);
735df00cf59SCedric Neveux 
736df00cf59SCedric Neveux 	if (!key->ops->sign)
737291e5450SJens Wiklander 		return TEE_ERROR_NOT_IMPLEMENTED;
738df00cf59SCedric Neveux 
739df00cf59SCedric Neveux 	return key->ops->sign(algo, key, msg, msg_len, sig, sig_len);
740291e5450SJens Wiklander }
741291e5450SJens Wiklander 
742df00cf59SCedric Neveux TEE_Result crypto_acipher_ecc_verify(uint32_t algo, struct ecc_public_key *key,
743df00cf59SCedric Neveux 				     const uint8_t *msg, size_t msg_len,
744df00cf59SCedric Neveux 				     const uint8_t *sig, size_t sig_len)
745291e5450SJens Wiklander {
746df00cf59SCedric Neveux 	assert(key->ops);
747df00cf59SCedric Neveux 
748df00cf59SCedric Neveux 	if (!key->ops->verify)
749291e5450SJens Wiklander 		return TEE_ERROR_NOT_IMPLEMENTED;
750df00cf59SCedric Neveux 
751df00cf59SCedric Neveux 	return key->ops->verify(algo, key, msg, msg_len, sig, sig_len);
752291e5450SJens Wiklander }
753291e5450SJens Wiklander 
754df00cf59SCedric Neveux TEE_Result crypto_acipher_ecc_shared_secret(struct ecc_keypair *private_key,
755df00cf59SCedric Neveux 					    struct ecc_public_key *public_key,
756df00cf59SCedric Neveux 					    void *secret,
757df00cf59SCedric Neveux 					    unsigned long *secret_len)
758291e5450SJens Wiklander {
759df00cf59SCedric Neveux 	assert(private_key->ops);
760df00cf59SCedric Neveux 
761df00cf59SCedric Neveux 	if (!private_key->ops->shared_secret)
762291e5450SJens Wiklander 		return TEE_ERROR_NOT_IMPLEMENTED;
763df00cf59SCedric Neveux 
764df00cf59SCedric Neveux 	return private_key->ops->shared_secret(private_key, public_key, secret,
765df00cf59SCedric Neveux 					       secret_len);
766291e5450SJens Wiklander }
76791fc6bd8SJerome Forissier 
768884fd190SCedric Neveux TEE_Result crypto_acipher_sm2_pke_decrypt(struct ecc_keypair *key,
769884fd190SCedric Neveux 					  const uint8_t *src, size_t src_len,
770884fd190SCedric Neveux 					  uint8_t *dst, size_t *dst_len)
77191fc6bd8SJerome Forissier {
772884fd190SCedric Neveux 	assert(key->ops);
773884fd190SCedric Neveux 
774884fd190SCedric Neveux 	if (!key->ops->decrypt)
77591fc6bd8SJerome Forissier 		return TEE_ERROR_NOT_IMPLEMENTED;
776884fd190SCedric Neveux 
777884fd190SCedric Neveux 	return key->ops->decrypt(key, src, src_len, dst, dst_len);
77891fc6bd8SJerome Forissier }
77991fc6bd8SJerome Forissier 
780884fd190SCedric Neveux TEE_Result crypto_acipher_sm2_pke_encrypt(struct ecc_public_key *key,
781884fd190SCedric Neveux 					  const uint8_t *src, size_t src_len,
782884fd190SCedric Neveux 					  uint8_t *dst, size_t *dst_len)
78391fc6bd8SJerome Forissier {
784884fd190SCedric Neveux 	assert(key->ops);
785884fd190SCedric Neveux 
786884fd190SCedric Neveux 	if (!key->ops->encrypt)
78791fc6bd8SJerome Forissier 		return TEE_ERROR_NOT_IMPLEMENTED;
788884fd190SCedric Neveux 
789884fd190SCedric Neveux 	return key->ops->encrypt(key, src, src_len, dst, dst_len);
79091fc6bd8SJerome Forissier }
7910f151943SJerome Forissier 
7925b385b3fSJerome Forissier #if !defined(CFG_CRYPTO_SM2_KEP)
7935b385b3fSJerome Forissier TEE_Result crypto_acipher_sm2_kep_derive(struct ecc_keypair *my_key __unused,
7945b385b3fSJerome Forissier 					 struct ecc_keypair *my_eph_key
7955b385b3fSJerome Forissier 								__unused,
7965b385b3fSJerome Forissier 					 struct ecc_public_key *peer_key
7975b385b3fSJerome Forissier 								__unused,
7985b385b3fSJerome Forissier 					 struct ecc_public_key *peer_eph_key
7995b385b3fSJerome Forissier 								__unused,
8005b385b3fSJerome Forissier 					 struct sm2_kep_parms *p __unused)
8015b385b3fSJerome Forissier {
8025b385b3fSJerome Forissier 	return TEE_ERROR_NOT_IMPLEMENTED;
8035b385b3fSJerome Forissier }
8045b385b3fSJerome Forissier #endif
8055dfe86d0SJorge Ramirez-Ortiz 
80690040fa4SSohaib ul Hassan #if !defined(CFG_CRYPTO_X25519)
80790040fa4SSohaib ul Hassan TEE_Result crypto_acipher_alloc_x25519_keypair(struct x25519_keypair *key
80890040fa4SSohaib ul Hassan 								__unused,
80990040fa4SSohaib ul Hassan 					       size_t key_size_bits __unused)
81090040fa4SSohaib ul Hassan {
81190040fa4SSohaib ul Hassan 	return TEE_ERROR_NOT_IMPLEMENTED;
81290040fa4SSohaib ul Hassan }
81390040fa4SSohaib ul Hassan 
81490040fa4SSohaib ul Hassan TEE_Result crypto_acipher_gen_x25519_key(struct x25519_keypair *key __unused,
81590040fa4SSohaib ul Hassan 					 size_t key_size __unused)
81690040fa4SSohaib ul Hassan {
81790040fa4SSohaib ul Hassan 	return TEE_ERROR_NOT_IMPLEMENTED;
81890040fa4SSohaib ul Hassan }
81990040fa4SSohaib ul Hassan 
82090040fa4SSohaib ul Hassan TEE_Result crypto_acipher_x25519_shared_secret(struct x25519_keypair
82190040fa4SSohaib ul Hassan 					       *private_key __unused,
82290040fa4SSohaib ul Hassan 					       void *public_key __unused,
82390040fa4SSohaib ul Hassan 					       void *secret __unused,
82490040fa4SSohaib ul Hassan 					       unsigned long
82590040fa4SSohaib ul Hassan 					       *secret_len __unused)
82690040fa4SSohaib ul Hassan {
82790040fa4SSohaib ul Hassan 	return TEE_ERROR_NOT_IMPLEMENTED;
82890040fa4SSohaib ul Hassan }
82990040fa4SSohaib ul Hassan #endif
83090040fa4SSohaib ul Hassan 
831a116848bSValerii Chubar #if !defined(CFG_CRYPTO_ED25519)
832a116848bSValerii Chubar TEE_Result crypto_acipher_alloc_ed25519_keypair(struct ed25519_keypair *key
833a116848bSValerii Chubar 								 __unused,
834a116848bSValerii Chubar 						size_t key_size_bits __unused)
835a116848bSValerii Chubar {
836a116848bSValerii Chubar 	return TEE_ERROR_NOT_IMPLEMENTED;
837a116848bSValerii Chubar }
838a116848bSValerii Chubar 
839a116848bSValerii Chubar TEE_Result crypto_acipher_gen_ed25519_key(struct ed25519_keypair *key __unused,
840a116848bSValerii Chubar 					  size_t key_size __unused)
841a116848bSValerii Chubar {
842a116848bSValerii Chubar 	return TEE_ERROR_NOT_IMPLEMENTED;
843a116848bSValerii Chubar }
844a116848bSValerii Chubar 
845a116848bSValerii Chubar TEE_Result crypto_acipher_ed25519_sign(struct ed25519_keypair *key __unused,
846a116848bSValerii Chubar 				       const uint8_t *msg __unused,
847a116848bSValerii Chubar 				       size_t msg_len __unused,
848a116848bSValerii Chubar 				       uint8_t *sig __unused,
849a116848bSValerii Chubar 				       size_t *sig_len __unused)
850a116848bSValerii Chubar {
851a116848bSValerii Chubar 	return TEE_ERROR_NOT_IMPLEMENTED;
852a116848bSValerii Chubar }
853a116848bSValerii Chubar 
854a116848bSValerii Chubar TEE_Result crypto_acipher_ed25519_verify(struct ed25519_keypair *key __unused,
855a116848bSValerii Chubar 					 const uint8_t *msg __unused,
856a116848bSValerii Chubar 					 size_t msg_len __unused,
857a116848bSValerii Chubar 					 const uint8_t *sig __unused,
858a116848bSValerii Chubar 					 size_t sig_len __unused)
859a116848bSValerii Chubar {
860a116848bSValerii Chubar 	return TEE_ERROR_NOT_IMPLEMENTED;
861a116848bSValerii Chubar }
862a116848bSValerii Chubar 
863a116848bSValerii Chubar TEE_Result crypto_acipher_ed25519ctx_sign(struct ed25519_keypair *key __unused,
864a116848bSValerii Chubar 					  const uint8_t *msg __unused,
865a116848bSValerii Chubar 					  size_t msg_len __unused,
866a116848bSValerii Chubar 					  uint8_t *sig __unused,
867a116848bSValerii Chubar 					  size_t *sig_len __unused,
868a116848bSValerii Chubar 					  bool ph_flag __unused,
869a116848bSValerii Chubar 					  const uint8_t *ctx __unused,
870a116848bSValerii Chubar 					  size_t ctxlen __unused)
871a116848bSValerii Chubar {
872a116848bSValerii Chubar 	return TEE_ERROR_NOT_IMPLEMENTED;
873a116848bSValerii Chubar }
874a116848bSValerii Chubar 
875a116848bSValerii Chubar TEE_Result crypto_acipher_ed25519ctx_verify(struct ed25519_keypair *key
876a116848bSValerii Chubar 							 __unused,
877a116848bSValerii Chubar 					    const uint8_t *msg __unused,
878a116848bSValerii Chubar 					    size_t msg_len __unused,
879a116848bSValerii Chubar 					    const uint8_t *sig __unused,
880a116848bSValerii Chubar 					    size_t sig_len __unused,
881a116848bSValerii Chubar 					    bool ph_flag __unused,
882a116848bSValerii Chubar 					    const uint8_t *ctx __unused,
883a116848bSValerii Chubar 					    size_t ctxlen __unused)
884a116848bSValerii Chubar {
885a116848bSValerii Chubar 	return TEE_ERROR_NOT_IMPLEMENTED;
886a116848bSValerii Chubar }
887a116848bSValerii Chubar #endif
888a116848bSValerii Chubar 
8896301ca1cSJorge Ramirez-Ortiz __weak TEE_Result crypto_storage_obj_del(struct tee_obj *obj __unused)
8905dfe86d0SJorge Ramirez-Ortiz {
8916301ca1cSJorge Ramirez-Ortiz 	return TEE_ERROR_NOT_IMPLEMENTED;
8925dfe86d0SJorge Ramirez-Ortiz }
893