xref: /optee_os/core/crypto/crypto.c (revision da1de5576fa9f0f89110485a749c1dcab6499f74)
1fb7ef469SJerome Forissier // SPDX-License-Identifier: BSD-2-Clause
2b887bd8fSJens Wiklander /*
3b887bd8fSJens Wiklander  * Copyright (c) 2017, Linaro Limited
4b887bd8fSJens Wiklander  */
5b887bd8fSJens Wiklander 
6d7ac7d0fSJens Wiklander #include <assert.h>
7b887bd8fSJens Wiklander #include <compiler.h>
8e1770e71SJens Wiklander #include <crypto/crypto.h>
96648f482SJens Wiklander #include <crypto/crypto_impl.h>
1033790cc1SJens Wiklander #include <kernel/panic.h>
11d7ac7d0fSJens Wiklander #include <stdlib.h>
12d7ac7d0fSJens Wiklander #include <string.h>
136d259e05SJens Wiklander #include <utee_defines.h>
14b887bd8fSJens Wiklander 
156648f482SJens Wiklander TEE_Result crypto_hash_alloc_ctx(void **ctx, uint32_t algo)
16b887bd8fSJens Wiklander {
176648f482SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
186648f482SJens Wiklander 	struct crypto_hash_ctx *c = NULL;
196648f482SJens Wiklander 
206648f482SJens Wiklander 	switch (algo) {
216648f482SJens Wiklander 	case TEE_ALG_MD5:
226648f482SJens Wiklander 		res = crypto_md5_alloc_ctx(&c);
236648f482SJens Wiklander 		break;
246648f482SJens Wiklander 	case TEE_ALG_SHA1:
256648f482SJens Wiklander 		res = crypto_sha1_alloc_ctx(&c);
266648f482SJens Wiklander 		break;
276648f482SJens Wiklander 	case TEE_ALG_SHA224:
286648f482SJens Wiklander 		res = crypto_sha224_alloc_ctx(&c);
296648f482SJens Wiklander 		break;
306648f482SJens Wiklander 	case TEE_ALG_SHA256:
316648f482SJens Wiklander 		res = crypto_sha256_alloc_ctx(&c);
326648f482SJens Wiklander 		break;
336648f482SJens Wiklander 	case TEE_ALG_SHA384:
346648f482SJens Wiklander 		res = crypto_sha384_alloc_ctx(&c);
356648f482SJens Wiklander 		break;
366648f482SJens Wiklander 	case TEE_ALG_SHA512:
376648f482SJens Wiklander 		res = crypto_sha512_alloc_ctx(&c);
386648f482SJens Wiklander 		break;
396648f482SJens Wiklander 	default:
40b887bd8fSJens Wiklander 		return TEE_ERROR_NOT_IMPLEMENTED;
41b887bd8fSJens Wiklander 	}
42b887bd8fSJens Wiklander 
436648f482SJens Wiklander 	if (!res)
446648f482SJens Wiklander 		*ctx = c;
456648f482SJens Wiklander 
466648f482SJens Wiklander 	return res;
476648f482SJens Wiklander }
486648f482SJens Wiklander 
496648f482SJens Wiklander static const struct crypto_hash_ops *hash_ops(void *ctx)
506648f482SJens Wiklander {
516648f482SJens Wiklander 	struct crypto_hash_ctx *c = ctx;
526648f482SJens Wiklander 
536648f482SJens Wiklander 	assert(c && c->ops);
546648f482SJens Wiklander 
556648f482SJens Wiklander 	return c->ops;
566648f482SJens Wiklander }
576648f482SJens Wiklander 
58ce7a47f5SJerome Forissier void crypto_hash_free_ctx(void *ctx, uint32_t algo __unused)
59ecf2e014SJens Wiklander {
60ce7a47f5SJerome Forissier 	if (ctx)
616648f482SJens Wiklander 		hash_ops(ctx)->free_ctx(ctx);
62ecf2e014SJens Wiklander }
63ecf2e014SJens Wiklander 
646648f482SJens Wiklander void crypto_hash_copy_state(void *dst_ctx, void *src_ctx,
65ecf2e014SJens Wiklander 			    uint32_t algo __unused)
66ecf2e014SJens Wiklander {
676648f482SJens Wiklander 	hash_ops(dst_ctx)->copy_state(dst_ctx, src_ctx);
68ecf2e014SJens Wiklander }
69ecf2e014SJens Wiklander 
706648f482SJens Wiklander TEE_Result crypto_hash_init(void *ctx, uint32_t algo __unused)
71b887bd8fSJens Wiklander {
726648f482SJens Wiklander 	return hash_ops(ctx)->init(ctx);
73b887bd8fSJens Wiklander }
746648f482SJens Wiklander 
756648f482SJens Wiklander TEE_Result crypto_hash_update(void *ctx, uint32_t algo __unused,
766648f482SJens Wiklander 			      const uint8_t *data, size_t len)
77b887bd8fSJens Wiklander {
786648f482SJens Wiklander 	return hash_ops(ctx)->update(ctx, data, len);
79b887bd8fSJens Wiklander }
806648f482SJens Wiklander 
816648f482SJens Wiklander TEE_Result crypto_hash_final(void *ctx, uint32_t algo __unused,
826648f482SJens Wiklander 			     uint8_t *digest, size_t len)
83b887bd8fSJens Wiklander {
846648f482SJens Wiklander 	return hash_ops(ctx)->final(ctx, digest, len);
85b887bd8fSJens Wiklander }
8682d91db1SJens Wiklander 
8796098f01SJens Wiklander TEE_Result crypto_cipher_alloc_ctx(void **ctx, uint32_t algo)
8882d91db1SJens Wiklander {
8996098f01SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
9096098f01SJens Wiklander 	struct crypto_cipher_ctx *c = NULL;
9196098f01SJens Wiklander 
9296098f01SJens Wiklander 	switch (algo) {
9396098f01SJens Wiklander 	case TEE_ALG_AES_ECB_NOPAD:
9496098f01SJens Wiklander 		res = crypto_aes_ecb_alloc_ctx(&c);
9596098f01SJens Wiklander 		break;
9696098f01SJens Wiklander 	case TEE_ALG_AES_CBC_NOPAD:
9796098f01SJens Wiklander 		res = crypto_aes_cbc_alloc_ctx(&c);
9896098f01SJens Wiklander 		break;
9996098f01SJens Wiklander 	case TEE_ALG_AES_CTR:
10096098f01SJens Wiklander 		res = crypto_aes_ctr_alloc_ctx(&c);
10196098f01SJens Wiklander 		break;
10296098f01SJens Wiklander 	case TEE_ALG_AES_CTS:
10396098f01SJens Wiklander 		res = crypto_aes_cts_alloc_ctx(&c);
10496098f01SJens Wiklander 		break;
10596098f01SJens Wiklander 	case TEE_ALG_AES_XTS:
10696098f01SJens Wiklander 		res = crypto_aes_xts_alloc_ctx(&c);
10796098f01SJens Wiklander 		break;
10896098f01SJens Wiklander 	case TEE_ALG_DES_ECB_NOPAD:
10996098f01SJens Wiklander 		res = crypto_des_ecb_alloc_ctx(&c);
11096098f01SJens Wiklander 		break;
11196098f01SJens Wiklander 	case TEE_ALG_DES3_ECB_NOPAD:
11296098f01SJens Wiklander 		res = crypto_des3_ecb_alloc_ctx(&c);
11396098f01SJens Wiklander 		break;
11496098f01SJens Wiklander 	case TEE_ALG_DES_CBC_NOPAD:
11596098f01SJens Wiklander 		res = crypto_des_cbc_alloc_ctx(&c);
11696098f01SJens Wiklander 		break;
11796098f01SJens Wiklander 	case TEE_ALG_DES3_CBC_NOPAD:
11896098f01SJens Wiklander 		res = crypto_des3_cbc_alloc_ctx(&c);
11996098f01SJens Wiklander 		break;
12096098f01SJens Wiklander 	default:
1211c5fdd1fSJerome Forissier 		return TEE_ERROR_NOT_IMPLEMENTED;
12282d91db1SJens Wiklander 	}
12382d91db1SJens Wiklander 
12496098f01SJens Wiklander 	if (!res)
12596098f01SJens Wiklander 		*ctx = c;
12696098f01SJens Wiklander 
12796098f01SJens Wiklander 	return res;
12896098f01SJens Wiklander }
12996098f01SJens Wiklander 
13096098f01SJens Wiklander static const struct crypto_cipher_ops *cipher_ops(void *ctx)
13196098f01SJens Wiklander {
13296098f01SJens Wiklander 	struct crypto_cipher_ctx *c = ctx;
13396098f01SJens Wiklander 
13496098f01SJens Wiklander 	assert(c && c->ops);
13596098f01SJens Wiklander 
13696098f01SJens Wiklander 	return c->ops;
13796098f01SJens Wiklander }
13896098f01SJens Wiklander 
139ce7a47f5SJerome Forissier void crypto_cipher_free_ctx(void *ctx, uint32_t algo __unused)
14072a9b1a0SJens Wiklander {
141ce7a47f5SJerome Forissier 	if (ctx)
14296098f01SJens Wiklander 		cipher_ops(ctx)->free_ctx(ctx);
14372a9b1a0SJens Wiklander }
14472a9b1a0SJens Wiklander 
14596098f01SJens Wiklander void crypto_cipher_copy_state(void *dst_ctx, void *src_ctx,
14672a9b1a0SJens Wiklander 			      uint32_t algo __unused)
14772a9b1a0SJens Wiklander {
14896098f01SJens Wiklander 	cipher_ops(dst_ctx)->copy_state(dst_ctx, src_ctx);
14972a9b1a0SJens Wiklander }
15072a9b1a0SJens Wiklander 
15182d91db1SJens Wiklander TEE_Result crypto_cipher_init(void *ctx __unused, uint32_t algo __unused,
15296098f01SJens Wiklander 			      TEE_OperationMode mode, const uint8_t *key1,
15396098f01SJens Wiklander 			      size_t key1_len, const uint8_t *key2,
15496098f01SJens Wiklander 			      size_t key2_len, const uint8_t *iv, size_t iv_len)
15582d91db1SJens Wiklander {
15696098f01SJens Wiklander 	if (mode != TEE_MODE_DECRYPT && mode != TEE_MODE_ENCRYPT)
15796098f01SJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
15896098f01SJens Wiklander 
15996098f01SJens Wiklander 	return cipher_ops(ctx)->init(ctx, mode, key1, key1_len, key2, key2_len,
16096098f01SJens Wiklander 				     iv, iv_len);
16182d91db1SJens Wiklander }
16282d91db1SJens Wiklander 
16396098f01SJens Wiklander TEE_Result crypto_cipher_update(void *ctx, uint32_t algo __unused,
16482d91db1SJens Wiklander 				TEE_OperationMode mode __unused,
16596098f01SJens Wiklander 				bool last_block, const uint8_t *data,
16696098f01SJens Wiklander 				size_t len, uint8_t *dst)
16782d91db1SJens Wiklander {
16896098f01SJens Wiklander 	return cipher_ops(ctx)->update(ctx, last_block, data, len, dst);
16982d91db1SJens Wiklander }
17082d91db1SJens Wiklander 
17196098f01SJens Wiklander void crypto_cipher_final(void *ctx, uint32_t algo __unused)
17282d91db1SJens Wiklander {
17396098f01SJens Wiklander 	cipher_ops(ctx)->final(ctx);
17482d91db1SJens Wiklander }
175e9eaba5cSJens Wiklander 
1766d259e05SJens Wiklander TEE_Result crypto_cipher_get_block_size(uint32_t algo, size_t *size)
1776d259e05SJens Wiklander {
1786d259e05SJens Wiklander 	uint32_t class = TEE_ALG_GET_CLASS(algo);
1796d259e05SJens Wiklander 
1806d259e05SJens Wiklander 	if (class != TEE_OPERATION_CIPHER && class != TEE_OPERATION_MAC &&
1816d259e05SJens Wiklander 	    class != TEE_OPERATION_AE)
1826d259e05SJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
1836d259e05SJens Wiklander 
1846d259e05SJens Wiklander 	switch (TEE_ALG_GET_MAIN_ALG(algo)) {
1856d259e05SJens Wiklander 	case TEE_MAIN_ALGO_AES:
1866d259e05SJens Wiklander 		*size = TEE_AES_BLOCK_SIZE;
1876d259e05SJens Wiklander 		return TEE_SUCCESS;
1886d259e05SJens Wiklander 	case TEE_MAIN_ALGO_DES:
1896d259e05SJens Wiklander 	case TEE_MAIN_ALGO_DES3:
1906d259e05SJens Wiklander 		*size = TEE_DES_BLOCK_SIZE;
1916d259e05SJens Wiklander 		return TEE_SUCCESS;
1926d259e05SJens Wiklander 	default:
1936d259e05SJens Wiklander 		return TEE_ERROR_NOT_SUPPORTED;
1946d259e05SJens Wiklander 	}
1956d259e05SJens Wiklander }
1966d259e05SJens Wiklander 
1975da36a24SJens Wiklander TEE_Result crypto_mac_alloc_ctx(void **ctx, uint32_t algo)
198e9eaba5cSJens Wiklander {
1995da36a24SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
2005da36a24SJens Wiklander 	struct crypto_mac_ctx *c = NULL;
2015da36a24SJens Wiklander 
2025da36a24SJens Wiklander 	switch (algo) {
2035da36a24SJens Wiklander 	case TEE_ALG_HMAC_MD5:
2045da36a24SJens Wiklander 		res = crypto_hmac_md5_alloc_ctx(&c);
2055da36a24SJens Wiklander 		break;
2065da36a24SJens Wiklander 	case TEE_ALG_HMAC_SHA1:
2075da36a24SJens Wiklander 		res = crypto_hmac_sha1_alloc_ctx(&c);
2085da36a24SJens Wiklander 		break;
2095da36a24SJens Wiklander 	case TEE_ALG_HMAC_SHA224:
2105da36a24SJens Wiklander 		res = crypto_hmac_sha224_alloc_ctx(&c);
2115da36a24SJens Wiklander 		break;
2125da36a24SJens Wiklander 	case TEE_ALG_HMAC_SHA256:
2135da36a24SJens Wiklander 		res = crypto_hmac_sha256_alloc_ctx(&c);
2145da36a24SJens Wiklander 		break;
2155da36a24SJens Wiklander 	case TEE_ALG_HMAC_SHA384:
2165da36a24SJens Wiklander 		res = crypto_hmac_sha384_alloc_ctx(&c);
2175da36a24SJens Wiklander 		break;
2185da36a24SJens Wiklander 	case TEE_ALG_HMAC_SHA512:
2195da36a24SJens Wiklander 		res = crypto_hmac_sha512_alloc_ctx(&c);
2205da36a24SJens Wiklander 		break;
2215da36a24SJens Wiklander 	case TEE_ALG_AES_CBC_MAC_NOPAD:
2225da36a24SJens Wiklander 		res = crypto_aes_cbc_mac_nopad_alloc_ctx(&c);
2235da36a24SJens Wiklander 		break;
2245da36a24SJens Wiklander 	case TEE_ALG_AES_CBC_MAC_PKCS5:
2255da36a24SJens Wiklander 		res = crypto_aes_cbc_mac_pkcs5_alloc_ctx(&c);
2265da36a24SJens Wiklander 		break;
2275da36a24SJens Wiklander 	case TEE_ALG_DES_CBC_MAC_NOPAD:
2285da36a24SJens Wiklander 		res = crypto_des_cbc_mac_nopad_alloc_ctx(&c);
2295da36a24SJens Wiklander 		break;
2305da36a24SJens Wiklander 	case TEE_ALG_DES_CBC_MAC_PKCS5:
2315da36a24SJens Wiklander 		res = crypto_des_cbc_mac_pkcs5_alloc_ctx(&c);
2325da36a24SJens Wiklander 		break;
2335da36a24SJens Wiklander 	case TEE_ALG_DES3_CBC_MAC_NOPAD:
2345da36a24SJens Wiklander 		res = crypto_des3_cbc_mac_nopad_alloc_ctx(&c);
2355da36a24SJens Wiklander 		break;
2365da36a24SJens Wiklander 	case TEE_ALG_DES3_CBC_MAC_PKCS5:
2375da36a24SJens Wiklander 		res = crypto_des3_cbc_mac_pkcs5_alloc_ctx(&c);
2385da36a24SJens Wiklander 		break;
2395da36a24SJens Wiklander 	case TEE_ALG_AES_CMAC:
2405da36a24SJens Wiklander 		res = crypto_aes_cmac_alloc_ctx(&c);
2415da36a24SJens Wiklander 		break;
2425da36a24SJens Wiklander 	default:
2435da36a24SJens Wiklander 		return TEE_ERROR_NOT_SUPPORTED;
2445da36a24SJens Wiklander 	}
2455da36a24SJens Wiklander 
2465da36a24SJens Wiklander 	if (!res)
2475da36a24SJens Wiklander 		*ctx = c;
2485da36a24SJens Wiklander 
2495da36a24SJens Wiklander 	return res;
2505da36a24SJens Wiklander }
2515da36a24SJens Wiklander 
2525da36a24SJens Wiklander static const struct crypto_mac_ops *mac_ops(void *ctx)
2535da36a24SJens Wiklander {
2545da36a24SJens Wiklander 	struct crypto_mac_ctx *c = ctx;
2555da36a24SJens Wiklander 
2565da36a24SJens Wiklander 	assert(c && c->ops);
2575da36a24SJens Wiklander 
2585da36a24SJens Wiklander 	return c->ops;
259e9eaba5cSJens Wiklander }
260e9eaba5cSJens Wiklander 
261ce7a47f5SJerome Forissier void crypto_mac_free_ctx(void *ctx, uint32_t algo __unused)
26282ef73bcSJens Wiklander {
263ce7a47f5SJerome Forissier 	if (ctx)
2645da36a24SJens Wiklander 		mac_ops(ctx)->free_ctx(ctx);
26582ef73bcSJens Wiklander }
26682ef73bcSJens Wiklander 
2675da36a24SJens Wiklander void crypto_mac_copy_state(void *dst_ctx, void *src_ctx, uint32_t algo __unused)
26882ef73bcSJens Wiklander {
2695da36a24SJens Wiklander 	mac_ops(dst_ctx)->copy_state(dst_ctx, src_ctx);
27082ef73bcSJens Wiklander }
27182ef73bcSJens Wiklander 
2725da36a24SJens Wiklander TEE_Result crypto_mac_init(void *ctx, uint32_t algo __unused,
2735da36a24SJens Wiklander 			   const uint8_t *key, size_t len)
274e9eaba5cSJens Wiklander {
2755da36a24SJens Wiklander 	return mac_ops(ctx)->init(ctx, key, len);
276e9eaba5cSJens Wiklander }
277e9eaba5cSJens Wiklander 
2785da36a24SJens Wiklander TEE_Result crypto_mac_update(void *ctx, uint32_t algo __unused,
2795da36a24SJens Wiklander 			     const uint8_t *data, size_t len)
280e9eaba5cSJens Wiklander {
2815da36a24SJens Wiklander 	if (!len)
2825da36a24SJens Wiklander 		return TEE_SUCCESS;
2835da36a24SJens Wiklander 
2845da36a24SJens Wiklander 	return mac_ops(ctx)->update(ctx, data, len);
285e9eaba5cSJens Wiklander }
286e9eaba5cSJens Wiklander 
2875da36a24SJens Wiklander TEE_Result crypto_mac_final(void *ctx, uint32_t algo __unused,
2885da36a24SJens Wiklander 			    uint8_t *digest, size_t digest_len)
289e9eaba5cSJens Wiklander {
2905da36a24SJens Wiklander 	return mac_ops(ctx)->final(ctx, digest, digest_len);
291e9eaba5cSJens Wiklander }
292e9eaba5cSJens Wiklander 
293d7ac7d0fSJens Wiklander TEE_Result crypto_authenc_alloc_ctx(void **ctx, uint32_t algo)
2948875ce46SJens Wiklander {
295f1e9b21bSJens Wiklander 	TEE_Result res = TEE_SUCCESS;
296f1e9b21bSJens Wiklander 	struct crypto_authenc_ctx *c = NULL;
297f1e9b21bSJens Wiklander 
298d0620b01SJens Wiklander 	switch (algo) {
299d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM)
300d0620b01SJens Wiklander 	case TEE_ALG_AES_CCM:
301f1e9b21bSJens Wiklander 		res = crypto_aes_ccm_alloc_ctx(&c);
302f1e9b21bSJens Wiklander 		break;
303d0620b01SJens Wiklander #endif
304d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM)
305d0620b01SJens Wiklander 	case TEE_ALG_AES_GCM:
306f1e9b21bSJens Wiklander 		res = crypto_aes_gcm_alloc_ctx(&c);
307f1e9b21bSJens Wiklander 		break;
308d0620b01SJens Wiklander #endif
309d0620b01SJens Wiklander 	default:
3108875ce46SJens Wiklander 		return TEE_ERROR_NOT_IMPLEMENTED;
3118875ce46SJens Wiklander 	}
312f1e9b21bSJens Wiklander 
313f1e9b21bSJens Wiklander 	if (!res)
314f1e9b21bSJens Wiklander 		*ctx = c;
315f1e9b21bSJens Wiklander 
316f1e9b21bSJens Wiklander 	return res;
317d0620b01SJens Wiklander }
3188875ce46SJens Wiklander 
319f1e9b21bSJens Wiklander static const struct crypto_authenc_ops *ae_ops(void *ctx)
320d7ac7d0fSJens Wiklander {
321f1e9b21bSJens Wiklander 	struct crypto_authenc_ctx *c = ctx;
322f1e9b21bSJens Wiklander 
323f1e9b21bSJens Wiklander 	assert(c && c->ops);
324f1e9b21bSJens Wiklander 
325f1e9b21bSJens Wiklander 	return c->ops;
326d7ac7d0fSJens Wiklander }
327d7ac7d0fSJens Wiklander 
328f1e9b21bSJens Wiklander TEE_Result crypto_authenc_init(void *ctx, uint32_t algo __unused,
329f1e9b21bSJens Wiklander 			       TEE_OperationMode mode,
330f1e9b21bSJens Wiklander 			       const uint8_t *key, size_t key_len,
331f1e9b21bSJens Wiklander 			       const uint8_t *nonce, size_t nonce_len,
332f1e9b21bSJens Wiklander 			       size_t tag_len, size_t aad_len,
333f1e9b21bSJens Wiklander 			       size_t payload_len)
334d7ac7d0fSJens Wiklander {
335f1e9b21bSJens Wiklander 	return ae_ops(ctx)->init(ctx, mode, key, key_len, nonce, nonce_len,
336f1e9b21bSJens Wiklander 				 tag_len, aad_len, payload_len);
337d7ac7d0fSJens Wiklander }
338d7ac7d0fSJens Wiklander 
339f1e9b21bSJens Wiklander TEE_Result crypto_authenc_update_aad(void *ctx, uint32_t algo __unused,
3408875ce46SJens Wiklander 				     TEE_OperationMode mode __unused,
341f1e9b21bSJens Wiklander 				     const uint8_t *data, size_t len)
3428875ce46SJens Wiklander {
343f1e9b21bSJens Wiklander 	return ae_ops(ctx)->update_aad(ctx, data, len);
344d0620b01SJens Wiklander }
3458875ce46SJens Wiklander 
346d0620b01SJens Wiklander 
347f1e9b21bSJens Wiklander TEE_Result crypto_authenc_update_payload(void *ctx, uint32_t algo __unused,
348f1e9b21bSJens Wiklander 					 TEE_OperationMode mode,
349f1e9b21bSJens Wiklander 					 const uint8_t *src_data,
350f1e9b21bSJens Wiklander 					 size_t src_len, uint8_t *dst_data,
351f1e9b21bSJens Wiklander 					 size_t *dst_len)
352f1e9b21bSJens Wiklander {
353f1e9b21bSJens Wiklander 	if (*dst_len < src_len)
354d0620b01SJens Wiklander 		return TEE_ERROR_SHORT_BUFFER;
355d0620b01SJens Wiklander 	*dst_len = src_len;
356d0620b01SJens Wiklander 
357f1e9b21bSJens Wiklander 	return ae_ops(ctx)->update_payload(ctx, mode, src_data, src_len,
358f1e9b21bSJens Wiklander 					   dst_data);
359d0620b01SJens Wiklander }
3608875ce46SJens Wiklander 
361f1e9b21bSJens Wiklander TEE_Result crypto_authenc_enc_final(void *ctx, uint32_t algo __unused,
362f1e9b21bSJens Wiklander 				    const uint8_t *src_data, size_t src_len,
363f1e9b21bSJens Wiklander 				    uint8_t *dst_data, size_t *dst_len,
364f1e9b21bSJens Wiklander 				    uint8_t *dst_tag, size_t *dst_tag_len)
3658875ce46SJens Wiklander {
366f1e9b21bSJens Wiklander 	if (*dst_len < src_len)
367f1e9b21bSJens Wiklander 		return TEE_ERROR_SHORT_BUFFER;
368d0620b01SJens Wiklander 	*dst_len = src_len;
369d0620b01SJens Wiklander 
370f1e9b21bSJens Wiklander 	return ae_ops(ctx)->enc_final(ctx, src_data, src_len, dst_data,
371f1e9b21bSJens Wiklander 				      dst_tag, dst_tag_len);
3728875ce46SJens Wiklander }
3738875ce46SJens Wiklander 
374f1e9b21bSJens Wiklander TEE_Result crypto_authenc_dec_final(void *ctx, uint32_t algo __unused,
375f1e9b21bSJens Wiklander 				    const uint8_t *src_data, size_t src_len,
376f1e9b21bSJens Wiklander 				    uint8_t *dst_data, size_t *dst_len,
377f1e9b21bSJens Wiklander 				    const uint8_t *tag, size_t tag_len)
3788875ce46SJens Wiklander {
379f1e9b21bSJens Wiklander 	if (*dst_len < src_len)
380f1e9b21bSJens Wiklander 		return TEE_ERROR_SHORT_BUFFER;
381f1e9b21bSJens Wiklander 	*dst_len = src_len;
382f1e9b21bSJens Wiklander 
383f1e9b21bSJens Wiklander 	return ae_ops(ctx)->dec_final(ctx, src_data, src_len, dst_data, tag,
384f1e9b21bSJens Wiklander 				      tag_len);
3858875ce46SJens Wiklander }
386f1e9b21bSJens Wiklander 
387f1e9b21bSJens Wiklander void crypto_authenc_final(void *ctx, uint32_t algo __unused)
388f1e9b21bSJens Wiklander {
389f1e9b21bSJens Wiklander 	ae_ops(ctx)->final(ctx);
390f1e9b21bSJens Wiklander }
391f1e9b21bSJens Wiklander 
392f1e9b21bSJens Wiklander void crypto_authenc_free_ctx(void *ctx, uint32_t algo __unused)
393f1e9b21bSJens Wiklander {
394f1e9b21bSJens Wiklander 	if (ctx)
395f1e9b21bSJens Wiklander 		ae_ops(ctx)->free_ctx(ctx);
396f1e9b21bSJens Wiklander }
397f1e9b21bSJens Wiklander 
398f1e9b21bSJens Wiklander void crypto_authenc_copy_state(void *dst_ctx, void *src_ctx,
399f1e9b21bSJens Wiklander 			       uint32_t algo __unused)
400f1e9b21bSJens Wiklander {
401f1e9b21bSJens Wiklander 	ae_ops(dst_ctx)->copy_state(dst_ctx, src_ctx);
402d0620b01SJens Wiklander }
40333790cc1SJens Wiklander 
404*da1de557SJens Wiklander #if !defined(CFG_CRYPTO_RSA) && !defined(CFG_CRYPTO_DSA) && \
405*da1de557SJens Wiklander     !defined(CFG_CRYPTO_DH) && !defined(CFG_CRYPTO_ECC)
40633790cc1SJens Wiklander struct bignum *crypto_bignum_allocate(size_t size_bits __unused)
40733790cc1SJens Wiklander {
40833790cc1SJens Wiklander 	return NULL;
40933790cc1SJens Wiklander }
41033790cc1SJens Wiklander 
41133790cc1SJens Wiklander TEE_Result crypto_bignum_bin2bn(const uint8_t *from __unused,
41233790cc1SJens Wiklander 				size_t fromsize __unused,
41333790cc1SJens Wiklander 				struct bignum *to __unused)
41433790cc1SJens Wiklander {
41533790cc1SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
41633790cc1SJens Wiklander }
41733790cc1SJens Wiklander 
41833790cc1SJens Wiklander size_t crypto_bignum_num_bytes(struct bignum *a __unused)
41933790cc1SJens Wiklander {
42033790cc1SJens Wiklander 	return 0;
42133790cc1SJens Wiklander }
42233790cc1SJens Wiklander 
42333790cc1SJens Wiklander size_t crypto_bignum_num_bits(struct bignum *a __unused)
42433790cc1SJens Wiklander {
42533790cc1SJens Wiklander 	return 0;
42633790cc1SJens Wiklander }
42733790cc1SJens Wiklander 
42833790cc1SJens Wiklander /*
42933790cc1SJens Wiklander  * crypto_bignum_allocate() and crypto_bignum_bin2bn() failing should be
43033790cc1SJens Wiklander  * enough to guarantee that the functions calling this function aren't
43133790cc1SJens Wiklander  * called, but just in case add a panic() here to avoid unexpected
43233790cc1SJens Wiklander  * behavoir.
43333790cc1SJens Wiklander  */
43433790cc1SJens Wiklander static void bignum_cant_happen(void)
43533790cc1SJens Wiklander {
43633790cc1SJens Wiklander 	volatile bool b = true;
43733790cc1SJens Wiklander 
43833790cc1SJens Wiklander 	/* Avoid warning about function does not return */
43933790cc1SJens Wiklander 	if (b)
44033790cc1SJens Wiklander 		panic();
44133790cc1SJens Wiklander }
44233790cc1SJens Wiklander 
44333790cc1SJens Wiklander void crypto_bignum_bn2bin(const struct bignum *from __unused,
44433790cc1SJens Wiklander 			  uint8_t *to __unused)
44533790cc1SJens Wiklander {
44633790cc1SJens Wiklander 	bignum_cant_happen();
44733790cc1SJens Wiklander }
44833790cc1SJens Wiklander 
44933790cc1SJens Wiklander void crypto_bignum_copy(struct bignum *to __unused,
45033790cc1SJens Wiklander 			const struct bignum *from __unused)
45133790cc1SJens Wiklander {
45233790cc1SJens Wiklander 	bignum_cant_happen();
45333790cc1SJens Wiklander }
45433790cc1SJens Wiklander 
45533790cc1SJens Wiklander void crypto_bignum_free(struct bignum *a)
45633790cc1SJens Wiklander {
45733790cc1SJens Wiklander 	if (a)
45833790cc1SJens Wiklander 		panic();
45933790cc1SJens Wiklander }
46033790cc1SJens Wiklander 
46133790cc1SJens Wiklander void crypto_bignum_clear(struct bignum *a __unused)
46233790cc1SJens Wiklander {
46333790cc1SJens Wiklander 	bignum_cant_happen();
46433790cc1SJens Wiklander }
46533790cc1SJens Wiklander 
46633790cc1SJens Wiklander /* return -1 if a<b, 0 if a==b, +1 if a>b */
46733790cc1SJens Wiklander int32_t crypto_bignum_compare(struct bignum *a __unused,
46833790cc1SJens Wiklander 			      struct bignum *b __unused)
46933790cc1SJens Wiklander {
47033790cc1SJens Wiklander 	bignum_cant_happen();
47133790cc1SJens Wiklander 	return -1;
47233790cc1SJens Wiklander }
473*da1de557SJens Wiklander #endif
474291e5450SJens Wiklander 
475*da1de557SJens Wiklander #if !defined(CFG_CRYPTO_RSA)
476291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_rsa_keypair(struct rsa_keypair *s __unused,
477291e5450SJens Wiklander 					    size_t key_size_bits __unused)
478291e5450SJens Wiklander {
479291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
480291e5450SJens Wiklander }
481291e5450SJens Wiklander 
482291e5450SJens Wiklander TEE_Result
483291e5450SJens Wiklander crypto_acipher_alloc_rsa_public_key(struct rsa_public_key *s __unused,
484291e5450SJens Wiklander 				    size_t key_size_bits __unused)
485291e5450SJens Wiklander {
486291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
487291e5450SJens Wiklander }
488291e5450SJens Wiklander 
489291e5450SJens Wiklander void crypto_acipher_free_rsa_public_key(struct rsa_public_key *s __unused)
490291e5450SJens Wiklander {
491291e5450SJens Wiklander }
492291e5450SJens Wiklander 
493291e5450SJens Wiklander TEE_Result crypto_acipher_gen_rsa_key(struct rsa_keypair *key __unused,
494291e5450SJens Wiklander 				      size_t key_size __unused)
495291e5450SJens Wiklander {
496291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
497291e5450SJens Wiklander }
498291e5450SJens Wiklander 
499291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_decrypt(struct rsa_keypair *key __unused,
500291e5450SJens Wiklander 					   const uint8_t *src __unused,
501291e5450SJens Wiklander 					   size_t src_len __unused,
502291e5450SJens Wiklander 					   uint8_t *dst __unused,
503291e5450SJens Wiklander 					   size_t *dst_len __unused)
504291e5450SJens Wiklander {
505291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
506291e5450SJens Wiklander }
507291e5450SJens Wiklander 
508291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_encrypt(struct rsa_public_key *key __unused,
509291e5450SJens Wiklander 					   const uint8_t *src __unused,
510291e5450SJens Wiklander 					   size_t src_len __unused,
511291e5450SJens Wiklander 					   uint8_t *dst __unused,
512291e5450SJens Wiklander 					   size_t *dst_len __unused)
513291e5450SJens Wiklander {
514291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
515291e5450SJens Wiklander }
516291e5450SJens Wiklander 
517291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_decrypt(uint32_t algo __unused,
518291e5450SJens Wiklander 					struct rsa_keypair *key __unused,
519291e5450SJens Wiklander 					const uint8_t *label __unused,
520291e5450SJens Wiklander 					size_t label_len __unused,
521291e5450SJens Wiklander 					const uint8_t *src __unused,
522291e5450SJens Wiklander 					size_t src_len __unused,
523291e5450SJens Wiklander 					uint8_t *dst __unused,
524291e5450SJens Wiklander 					size_t *dst_len __unused)
525291e5450SJens Wiklander {
526291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
527291e5450SJens Wiklander }
528291e5450SJens Wiklander 
529291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_encrypt(uint32_t algo __unused,
530291e5450SJens Wiklander 					struct rsa_public_key *key __unused,
531291e5450SJens Wiklander 					const uint8_t *label __unused,
532291e5450SJens Wiklander 					size_t label_len __unused,
533291e5450SJens Wiklander 					const uint8_t *src __unused,
534291e5450SJens Wiklander 					size_t src_len __unused,
535291e5450SJens Wiklander 					uint8_t *dst __unused,
536291e5450SJens Wiklander 					size_t *dst_len __unused)
537291e5450SJens Wiklander {
538291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
539291e5450SJens Wiklander }
540291e5450SJens Wiklander 
541291e5450SJens Wiklander TEE_Result crypto_acipher_rsassa_sign(uint32_t algo __unused,
542291e5450SJens Wiklander 				      struct rsa_keypair *key __unused,
543291e5450SJens Wiklander 				      int salt_len __unused,
544291e5450SJens Wiklander 				      const uint8_t *msg __unused,
545291e5450SJens Wiklander 				      size_t msg_len __unused,
546291e5450SJens Wiklander 				      uint8_t *sig __unused,
547291e5450SJens Wiklander 				      size_t *sig_len __unused)
548291e5450SJens Wiklander {
549291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
550291e5450SJens Wiklander }
551291e5450SJens Wiklander 
552291e5450SJens Wiklander TEE_Result crypto_acipher_rsassa_verify(uint32_t algo __unused,
553291e5450SJens Wiklander 					struct rsa_public_key *key __unused,
554291e5450SJens Wiklander 					int salt_len __unused,
555291e5450SJens Wiklander 					const uint8_t *msg __unused,
556291e5450SJens Wiklander 					size_t msg_len __unused,
557291e5450SJens Wiklander 					const uint8_t *sig __unused,
558291e5450SJens Wiklander 					size_t sig_len __unused)
559291e5450SJens Wiklander {
560291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
561291e5450SJens Wiklander }
562*da1de557SJens Wiklander #endif /*!CFG_CRYPTO_RSA*/
563291e5450SJens Wiklander 
564*da1de557SJens Wiklander #if !defined(CFG_CRYPTO_DSA)
565291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dsa_keypair(struct dsa_keypair *s __unused,
566291e5450SJens Wiklander 					    size_t key_size_bits __unused)
567291e5450SJens Wiklander {
568291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
569291e5450SJens Wiklander }
570291e5450SJens Wiklander 
571291e5450SJens Wiklander TEE_Result
572291e5450SJens Wiklander crypto_acipher_alloc_dsa_public_key(struct dsa_public_key *s __unused,
573291e5450SJens Wiklander 				    size_t key_size_bits __unused)
574291e5450SJens Wiklander {
575291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
576291e5450SJens Wiklander }
577291e5450SJens Wiklander 
578291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dsa_key(struct dsa_keypair *key __unused,
579291e5450SJens Wiklander 				      size_t key_size __unused)
580291e5450SJens Wiklander {
581291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
582291e5450SJens Wiklander }
583291e5450SJens Wiklander 
584291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_sign(uint32_t algo __unused,
585291e5450SJens Wiklander 				   struct dsa_keypair *key __unused,
586291e5450SJens Wiklander 				   const uint8_t *msg __unused,
587291e5450SJens Wiklander 				   size_t msg_len __unused,
588291e5450SJens Wiklander 				   uint8_t *sig __unused,
589291e5450SJens Wiklander 				   size_t *sig_len __unused)
590291e5450SJens Wiklander {
591291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
592291e5450SJens Wiklander }
593291e5450SJens Wiklander 
594291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_verify(uint32_t algo __unused,
595291e5450SJens Wiklander 				     struct dsa_public_key *key __unused,
596291e5450SJens Wiklander 				     const uint8_t *msg __unused,
597291e5450SJens Wiklander 				     size_t msg_len __unused,
598291e5450SJens Wiklander 				     const uint8_t *sig __unused,
599291e5450SJens Wiklander 				     size_t sig_len __unused)
600291e5450SJens Wiklander {
601291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
602291e5450SJens Wiklander }
603*da1de557SJens Wiklander #endif /*!CFG_CRYPTO_DSA*/
604291e5450SJens Wiklander 
605*da1de557SJens Wiklander #if !defined(CFG_CRYPTO_DH)
606291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dh_keypair(struct dh_keypair *s __unused,
607291e5450SJens Wiklander 					   size_t key_size_bits __unused)
608291e5450SJens Wiklander {
609291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
610291e5450SJens Wiklander }
611291e5450SJens Wiklander 
612291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dh_key(struct dh_keypair *key __unused,
613291e5450SJens Wiklander 				     struct bignum *q __unused,
614291e5450SJens Wiklander 				     size_t xbits __unused)
615291e5450SJens Wiklander {
616291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
617291e5450SJens Wiklander }
618291e5450SJens Wiklander 
619291e5450SJens Wiklander TEE_Result
620291e5450SJens Wiklander crypto_acipher_dh_shared_secret(struct dh_keypair *private_key __unused,
621291e5450SJens Wiklander 				struct bignum *public_key __unused,
622291e5450SJens Wiklander 				struct bignum *secret __unused)
623291e5450SJens Wiklander {
624291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
625291e5450SJens Wiklander }
626*da1de557SJens Wiklander #endif /*!CFG_CRYPTO_DH*/
627291e5450SJens Wiklander 
628*da1de557SJens Wiklander #if !defined(CFG_CRYPTO_ECC)
629291e5450SJens Wiklander TEE_Result
630291e5450SJens Wiklander crypto_acipher_alloc_ecc_public_key(struct ecc_public_key *s __unused,
631291e5450SJens Wiklander 				    size_t key_size_bits __unused)
632291e5450SJens Wiklander {
633291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
634291e5450SJens Wiklander }
635291e5450SJens Wiklander 
636291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_ecc_keypair(struct ecc_keypair *s __unused,
637291e5450SJens Wiklander 					    size_t key_size_bits __unused)
638291e5450SJens Wiklander {
639291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
640291e5450SJens Wiklander }
641291e5450SJens Wiklander 
642291e5450SJens Wiklander void crypto_acipher_free_ecc_public_key(struct ecc_public_key *s __unused)
643291e5450SJens Wiklander {
644291e5450SJens Wiklander }
645291e5450SJens Wiklander 
646291e5450SJens Wiklander TEE_Result crypto_acipher_gen_ecc_key(struct ecc_keypair *key __unused)
647291e5450SJens Wiklander {
648291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
649291e5450SJens Wiklander }
650291e5450SJens Wiklander 
651291e5450SJens Wiklander TEE_Result crypto_acipher_ecc_sign(uint32_t algo __unused,
652291e5450SJens Wiklander 				   struct ecc_keypair *key __unused,
653291e5450SJens Wiklander 				   const uint8_t *msg __unused,
654291e5450SJens Wiklander 				   size_t msg_len __unused,
655291e5450SJens Wiklander 				   uint8_t *sig __unused,
656291e5450SJens Wiklander 				   size_t *sig_len __unused)
657291e5450SJens Wiklander {
658291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
659291e5450SJens Wiklander }
660291e5450SJens Wiklander 
661291e5450SJens Wiklander TEE_Result crypto_acipher_ecc_verify(uint32_t algo __unused,
662291e5450SJens Wiklander 				     struct ecc_public_key *key __unused,
663291e5450SJens Wiklander 				     const uint8_t *msg __unused,
664291e5450SJens Wiklander 				     size_t msg_len __unused,
665291e5450SJens Wiklander 				     const uint8_t *sig __unused,
666291e5450SJens Wiklander 				     size_t sig_len __unused)
667291e5450SJens Wiklander {
668291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
669291e5450SJens Wiklander }
670291e5450SJens Wiklander 
671291e5450SJens Wiklander TEE_Result
672291e5450SJens Wiklander crypto_acipher_ecc_shared_secret(struct ecc_keypair *private_key __unused,
673291e5450SJens Wiklander 				 struct ecc_public_key *public_key __unused,
674291e5450SJens Wiklander 				 void *secret __unused,
675291e5450SJens Wiklander 				 unsigned long *secret_len __unused)
676291e5450SJens Wiklander {
677291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
678291e5450SJens Wiklander }
679*da1de557SJens Wiklander #endif /*!CFG_CRYPTO_ECC*/
680