xref: /optee_os/core/crypto/crypto.c (revision 6648f482e70e0fa021696c7f4fece3eeb714b9f2)
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>
8d0620b01SJens Wiklander #include <crypto/aes-ccm.h>
9d0620b01SJens Wiklander #include <crypto/aes-gcm.h>
10e1770e71SJens Wiklander #include <crypto/crypto.h>
11*6648f482SJens Wiklander #include <crypto/crypto_impl.h>
1233790cc1SJens Wiklander #include <kernel/panic.h>
13d7ac7d0fSJens Wiklander #include <stdlib.h>
14d7ac7d0fSJens Wiklander #include <string.h>
15b887bd8fSJens Wiklander 
16*6648f482SJens Wiklander TEE_Result crypto_hash_alloc_ctx(void **ctx, uint32_t algo)
17b887bd8fSJens Wiklander {
18*6648f482SJens Wiklander 	TEE_Result res = TEE_SUCCESS;
19*6648f482SJens Wiklander 	struct crypto_hash_ctx *c = NULL;
20*6648f482SJens Wiklander 
21*6648f482SJens Wiklander 	switch (algo) {
22*6648f482SJens Wiklander 	case TEE_ALG_MD5:
23*6648f482SJens Wiklander 		res = crypto_md5_alloc_ctx(&c);
24*6648f482SJens Wiklander 		break;
25*6648f482SJens Wiklander 	case TEE_ALG_SHA1:
26*6648f482SJens Wiklander 		res = crypto_sha1_alloc_ctx(&c);
27*6648f482SJens Wiklander 		break;
28*6648f482SJens Wiklander 	case TEE_ALG_SHA224:
29*6648f482SJens Wiklander 		res = crypto_sha224_alloc_ctx(&c);
30*6648f482SJens Wiklander 		break;
31*6648f482SJens Wiklander 	case TEE_ALG_SHA256:
32*6648f482SJens Wiklander 		res = crypto_sha256_alloc_ctx(&c);
33*6648f482SJens Wiklander 		break;
34*6648f482SJens Wiklander 	case TEE_ALG_SHA384:
35*6648f482SJens Wiklander 		res = crypto_sha384_alloc_ctx(&c);
36*6648f482SJens Wiklander 		break;
37*6648f482SJens Wiklander 	case TEE_ALG_SHA512:
38*6648f482SJens Wiklander 		res = crypto_sha512_alloc_ctx(&c);
39*6648f482SJens Wiklander 		break;
40*6648f482SJens Wiklander 	default:
41b887bd8fSJens Wiklander 		return TEE_ERROR_NOT_IMPLEMENTED;
42b887bd8fSJens Wiklander 	}
43b887bd8fSJens Wiklander 
44*6648f482SJens Wiklander 	if (!res)
45*6648f482SJens Wiklander 		*ctx = c;
46*6648f482SJens Wiklander 
47*6648f482SJens Wiklander 	return res;
48*6648f482SJens Wiklander }
49*6648f482SJens Wiklander 
50*6648f482SJens Wiklander static const struct crypto_hash_ops *hash_ops(void *ctx)
51*6648f482SJens Wiklander {
52*6648f482SJens Wiklander 	struct crypto_hash_ctx *c = ctx;
53*6648f482SJens Wiklander 
54*6648f482SJens Wiklander 	assert(c && c->ops);
55*6648f482SJens Wiklander 
56*6648f482SJens Wiklander 	return c->ops;
57*6648f482SJens Wiklander }
58*6648f482SJens Wiklander 
59ce7a47f5SJerome Forissier void crypto_hash_free_ctx(void *ctx, uint32_t algo __unused)
60ecf2e014SJens Wiklander {
61ce7a47f5SJerome Forissier 	if (ctx)
62*6648f482SJens Wiklander 		hash_ops(ctx)->free_ctx(ctx);
63ecf2e014SJens Wiklander }
64ecf2e014SJens Wiklander 
65*6648f482SJens Wiklander void crypto_hash_copy_state(void *dst_ctx, void *src_ctx,
66ecf2e014SJens Wiklander 			    uint32_t algo __unused)
67ecf2e014SJens Wiklander {
68*6648f482SJens Wiklander 	hash_ops(dst_ctx)->copy_state(dst_ctx, src_ctx);
69ecf2e014SJens Wiklander }
70ecf2e014SJens Wiklander 
71*6648f482SJens Wiklander TEE_Result crypto_hash_init(void *ctx, uint32_t algo __unused)
72b887bd8fSJens Wiklander {
73*6648f482SJens Wiklander 	return hash_ops(ctx)->init(ctx);
74b887bd8fSJens Wiklander }
75*6648f482SJens Wiklander 
76*6648f482SJens Wiklander TEE_Result crypto_hash_update(void *ctx, uint32_t algo __unused,
77*6648f482SJens Wiklander 			      const uint8_t *data, size_t len)
78b887bd8fSJens Wiklander {
79*6648f482SJens Wiklander 	return hash_ops(ctx)->update(ctx, data, len);
80b887bd8fSJens Wiklander }
81*6648f482SJens Wiklander 
82*6648f482SJens Wiklander TEE_Result crypto_hash_final(void *ctx, uint32_t algo __unused,
83*6648f482SJens Wiklander 			     uint8_t *digest, size_t len)
84b887bd8fSJens Wiklander {
85*6648f482SJens Wiklander 	return hash_ops(ctx)->final(ctx, digest, len);
86b887bd8fSJens Wiklander }
8782d91db1SJens Wiklander 
8882d91db1SJens Wiklander #if !defined(_CFG_CRYPTO_WITH_CIPHER)
8972a9b1a0SJens Wiklander TEE_Result crypto_cipher_alloc_ctx(void **ctx __unused, uint32_t algo __unused)
9082d91db1SJens Wiklander {
911c5fdd1fSJerome Forissier 	return TEE_ERROR_NOT_IMPLEMENTED;
9282d91db1SJens Wiklander }
9382d91db1SJens Wiklander 
94ce7a47f5SJerome Forissier void crypto_cipher_free_ctx(void *ctx, uint32_t algo __unused)
9572a9b1a0SJens Wiklander {
96ce7a47f5SJerome Forissier 	if (ctx)
9772a9b1a0SJens Wiklander 		assert(0);
9872a9b1a0SJens Wiklander }
9972a9b1a0SJens Wiklander 
10072a9b1a0SJens Wiklander void crypto_cipher_copy_state(void *dst_ctx __unused, void *src_ctx __unused,
10172a9b1a0SJens Wiklander 			      uint32_t algo __unused)
10272a9b1a0SJens Wiklander {
10372a9b1a0SJens Wiklander 	assert(0);
10472a9b1a0SJens Wiklander }
10572a9b1a0SJens Wiklander 
10682d91db1SJens Wiklander TEE_Result crypto_cipher_init(void *ctx __unused, uint32_t algo __unused,
10782d91db1SJens Wiklander 			      TEE_OperationMode mode __unused,
10882d91db1SJens Wiklander 			      const uint8_t *key1 __unused,
10982d91db1SJens Wiklander 			      size_t key1_len __unused,
11082d91db1SJens Wiklander 			      const uint8_t *key2 __unused,
11182d91db1SJens Wiklander 			      size_t key2_len __unused,
11282d91db1SJens Wiklander 			      const uint8_t *iv __unused,
11382d91db1SJens Wiklander 			      size_t iv_len __unused)
11482d91db1SJens Wiklander {
1151c5fdd1fSJerome Forissier 	return TEE_ERROR_NOT_IMPLEMENTED;
11682d91db1SJens Wiklander }
11782d91db1SJens Wiklander 
11882d91db1SJens Wiklander TEE_Result crypto_cipher_update(void *ctx __unused, uint32_t algo __unused,
11982d91db1SJens Wiklander 				TEE_OperationMode mode __unused,
12082d91db1SJens Wiklander 				bool last_block __unused,
12182d91db1SJens Wiklander 				const uint8_t *data __unused,
12282d91db1SJens Wiklander 				size_t len __unused, uint8_t *dst __unused)
12382d91db1SJens Wiklander {
1241c5fdd1fSJerome Forissier 	return TEE_ERROR_NOT_IMPLEMENTED;
12582d91db1SJens Wiklander }
12682d91db1SJens Wiklander 
12782d91db1SJens Wiklander void crypto_cipher_final(void *ctx __unused, uint32_t algo __unused)
12882d91db1SJens Wiklander {
12982d91db1SJens Wiklander }
13082d91db1SJens Wiklander 
13182d91db1SJens Wiklander TEE_Result crypto_cipher_get_block_size(uint32_t algo __unused,
13282d91db1SJens Wiklander 					size_t *size __unused)
13382d91db1SJens Wiklander {
1341c5fdd1fSJerome Forissier 	return TEE_ERROR_NOT_IMPLEMENTED;
13582d91db1SJens Wiklander }
13682d91db1SJens Wiklander #endif /*_CFG_CRYPTO_WITH_CIPHER*/
137e9eaba5cSJens Wiklander 
138e9eaba5cSJens Wiklander #if !defined(_CFG_CRYPTO_WITH_MAC)
13982ef73bcSJens Wiklander TEE_Result crypto_mac_alloc_ctx(void **ctx __unused, uint32_t algo __unused)
140e9eaba5cSJens Wiklander {
141e9eaba5cSJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
142e9eaba5cSJens Wiklander }
143e9eaba5cSJens Wiklander 
144ce7a47f5SJerome Forissier void crypto_mac_free_ctx(void *ctx, uint32_t algo __unused)
14582ef73bcSJens Wiklander {
146ce7a47f5SJerome Forissier 	if (ctx)
14782ef73bcSJens Wiklander 		assert(0);
14882ef73bcSJens Wiklander }
14982ef73bcSJens Wiklander 
15082ef73bcSJens Wiklander void crypto_mac_copy_state(void *dst_ctx __unused, void *src_ctx __unused,
15182ef73bcSJens Wiklander 			   uint32_t algo __unused)
15282ef73bcSJens Wiklander {
15382ef73bcSJens Wiklander 	assert(0);
15482ef73bcSJens Wiklander }
15582ef73bcSJens Wiklander 
156e9eaba5cSJens Wiklander TEE_Result crypto_mac_init(void *ctx __unused, uint32_t algo __unused,
157e9eaba5cSJens Wiklander 			   const uint8_t *key __unused, size_t len __unused)
158e9eaba5cSJens Wiklander {
159e9eaba5cSJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
160e9eaba5cSJens Wiklander }
161e9eaba5cSJens Wiklander 
162e9eaba5cSJens Wiklander TEE_Result crypto_mac_update(void *ctx __unused, uint32_t algo __unused,
163e9eaba5cSJens Wiklander 			     const uint8_t *data __unused, size_t len __unused)
164e9eaba5cSJens Wiklander {
165e9eaba5cSJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
166e9eaba5cSJens Wiklander }
167e9eaba5cSJens Wiklander 
168e9eaba5cSJens Wiklander TEE_Result crypto_mac_final(void *ctx __unused, uint32_t algo __unused,
169e9eaba5cSJens Wiklander 			    uint8_t *digest __unused,
170e9eaba5cSJens Wiklander 			    size_t digest_len __unused)
171e9eaba5cSJens Wiklander {
172e9eaba5cSJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
173e9eaba5cSJens Wiklander }
174e9eaba5cSJens Wiklander #endif /*_CFG_CRYPTO_WITH_MAC*/
175e9eaba5cSJens Wiklander 
176d7ac7d0fSJens Wiklander TEE_Result crypto_authenc_alloc_ctx(void **ctx, uint32_t algo)
1778875ce46SJens Wiklander {
178d0620b01SJens Wiklander 	switch (algo) {
179d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM)
180d0620b01SJens Wiklander 	case TEE_ALG_AES_CCM:
181d7ac7d0fSJens Wiklander 		return crypto_aes_ccm_alloc_ctx(ctx);
182d0620b01SJens Wiklander #endif
183d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM)
184d0620b01SJens Wiklander 	case TEE_ALG_AES_GCM:
185d7ac7d0fSJens Wiklander 		return crypto_aes_gcm_alloc_ctx(ctx);
186d0620b01SJens Wiklander #endif
187d0620b01SJens Wiklander 	default:
1888875ce46SJens Wiklander 		return TEE_ERROR_NOT_IMPLEMENTED;
1898875ce46SJens Wiklander 	}
190d0620b01SJens Wiklander }
1918875ce46SJens Wiklander 
192d7ac7d0fSJens Wiklander void crypto_authenc_free_ctx(void *ctx, uint32_t algo)
193d7ac7d0fSJens Wiklander {
194d7ac7d0fSJens Wiklander 	switch (algo) {
195d7ac7d0fSJens Wiklander #if defined(CFG_CRYPTO_CCM)
196d7ac7d0fSJens Wiklander 	case TEE_ALG_AES_CCM:
197d7ac7d0fSJens Wiklander 		crypto_aes_ccm_free_ctx(ctx);
198d7ac7d0fSJens Wiklander 		break;
199d7ac7d0fSJens Wiklander #endif
200d7ac7d0fSJens Wiklander #if defined(CFG_CRYPTO_GCM)
201d7ac7d0fSJens Wiklander 	case TEE_ALG_AES_GCM:
202d7ac7d0fSJens Wiklander 		crypto_aes_gcm_free_ctx(ctx);
203d7ac7d0fSJens Wiklander 		break;
204d7ac7d0fSJens Wiklander #endif
205d7ac7d0fSJens Wiklander 	default:
206ce7a47f5SJerome Forissier 		if (ctx)
207d7ac7d0fSJens Wiklander 			assert(0);
208d7ac7d0fSJens Wiklander 	}
209d7ac7d0fSJens Wiklander }
210d7ac7d0fSJens Wiklander 
211d7ac7d0fSJens Wiklander void crypto_authenc_copy_state(void *dst_ctx, void *src_ctx, uint32_t algo)
212d7ac7d0fSJens Wiklander {
213d7ac7d0fSJens Wiklander 	switch (algo) {
214d7ac7d0fSJens Wiklander #if defined(CFG_CRYPTO_CCM)
215d7ac7d0fSJens Wiklander 	case TEE_ALG_AES_CCM:
216d7ac7d0fSJens Wiklander 		crypto_aes_ccm_copy_state(dst_ctx, src_ctx);
217d7ac7d0fSJens Wiklander 		break;
218d7ac7d0fSJens Wiklander #endif
219d7ac7d0fSJens Wiklander #if defined(CFG_CRYPTO_GCM)
220d7ac7d0fSJens Wiklander 	case TEE_ALG_AES_GCM:
221d7ac7d0fSJens Wiklander 		crypto_aes_gcm_copy_state(dst_ctx, src_ctx);
222d7ac7d0fSJens Wiklander 		break;
223d7ac7d0fSJens Wiklander #endif
224d7ac7d0fSJens Wiklander 	default:
225d7ac7d0fSJens Wiklander 		assert(0);
226d7ac7d0fSJens Wiklander 	}
227d7ac7d0fSJens Wiklander }
228d7ac7d0fSJens Wiklander 
229d0620b01SJens Wiklander TEE_Result crypto_authenc_init(void *ctx __maybe_unused,
230d0620b01SJens Wiklander 			       uint32_t algo __maybe_unused,
231d0620b01SJens Wiklander 			       TEE_OperationMode mode __maybe_unused,
232d0620b01SJens Wiklander 			       const uint8_t *key __maybe_unused,
233d0620b01SJens Wiklander 			       size_t key_len __maybe_unused,
234d0620b01SJens Wiklander 			       const uint8_t *nonce __maybe_unused,
235d0620b01SJens Wiklander 			       size_t nonce_len __maybe_unused,
236d0620b01SJens Wiklander 			       size_t tag_len __maybe_unused,
237d0620b01SJens Wiklander 			       size_t aad_len __maybe_unused,
238d0620b01SJens Wiklander 			       size_t payload_len __maybe_unused)
239d0620b01SJens Wiklander {
240d0620b01SJens Wiklander 	switch (algo) {
241d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM)
242d0620b01SJens Wiklander 	case TEE_ALG_AES_CCM:
243d0620b01SJens Wiklander 		return crypto_aes_ccm_init(ctx, mode, key, key_len, nonce,
244d0620b01SJens Wiklander 					   nonce_len, tag_len, aad_len,
245d0620b01SJens Wiklander 					   payload_len);
246d0620b01SJens Wiklander #endif
247d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM)
248d0620b01SJens Wiklander 	case TEE_ALG_AES_GCM:
249d0620b01SJens Wiklander 		return crypto_aes_gcm_init(ctx, mode, key, key_len, nonce,
250d0620b01SJens Wiklander 					   nonce_len, tag_len);
251d0620b01SJens Wiklander #endif
252d0620b01SJens Wiklander 	default:
253d0620b01SJens Wiklander 		return TEE_ERROR_NOT_IMPLEMENTED;
254d0620b01SJens Wiklander 	}
255d0620b01SJens Wiklander }
256d0620b01SJens Wiklander 
257d0620b01SJens Wiklander TEE_Result crypto_authenc_update_aad(void *ctx __maybe_unused,
258d0620b01SJens Wiklander 				     uint32_t algo __maybe_unused,
2598875ce46SJens Wiklander 				     TEE_OperationMode mode __unused,
260d0620b01SJens Wiklander 				     const uint8_t *data __maybe_unused,
261d0620b01SJens Wiklander 				     size_t len __maybe_unused)
2628875ce46SJens Wiklander {
263d0620b01SJens Wiklander 	switch (algo) {
264d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM)
265d0620b01SJens Wiklander 	case TEE_ALG_AES_CCM:
266d0620b01SJens Wiklander 		return crypto_aes_ccm_update_aad(ctx, data, len);
267d0620b01SJens Wiklander #endif
268d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM)
269d0620b01SJens Wiklander 	case TEE_ALG_AES_GCM:
270d0620b01SJens Wiklander 		return crypto_aes_gcm_update_aad(ctx, data, len);
271d0620b01SJens Wiklander #endif
272d0620b01SJens Wiklander 	default:
2738875ce46SJens Wiklander 		return TEE_ERROR_NOT_IMPLEMENTED;
2748875ce46SJens Wiklander 	}
275d0620b01SJens Wiklander }
2768875ce46SJens Wiklander 
277d0620b01SJens Wiklander TEE_Result crypto_authenc_update_payload(void *ctx __maybe_unused,
278d0620b01SJens Wiklander 					 uint32_t algo __maybe_unused,
279d0620b01SJens Wiklander 					 TEE_OperationMode mode __maybe_unused,
280d0620b01SJens Wiklander 					 const uint8_t *src_data __maybe_unused,
281d0620b01SJens Wiklander 					 size_t src_len __maybe_unused,
282d0620b01SJens Wiklander 					 uint8_t *dst_data __maybe_unused,
283d0620b01SJens Wiklander 					 size_t *dst_len __maybe_unused)
2848875ce46SJens Wiklander {
285d0620b01SJens Wiklander 	size_t dl = *dst_len;
286d0620b01SJens Wiklander 
287d0620b01SJens Wiklander 	*dst_len = src_len;
288d0620b01SJens Wiklander 	if (dl < src_len)
289d0620b01SJens Wiklander 		return TEE_ERROR_SHORT_BUFFER;
290d0620b01SJens Wiklander 
291d0620b01SJens Wiklander 	switch (algo) {
292d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM)
293d0620b01SJens Wiklander 	case TEE_ALG_AES_CCM:
294d0620b01SJens Wiklander 		return crypto_aes_ccm_update_payload(ctx, mode, src_data,
295d0620b01SJens Wiklander 						     src_len, dst_data);
296d0620b01SJens Wiklander #endif
297d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM)
298d0620b01SJens Wiklander 	case TEE_ALG_AES_GCM:
299d0620b01SJens Wiklander 		return crypto_aes_gcm_update_payload(ctx, mode, src_data,
300d0620b01SJens Wiklander 						     src_len, dst_data);
301d0620b01SJens Wiklander #endif
302d0620b01SJens Wiklander 	default:
3038875ce46SJens Wiklander 		return TEE_ERROR_NOT_IMPLEMENTED;
3048875ce46SJens Wiklander 	}
305d0620b01SJens Wiklander }
3068875ce46SJens Wiklander 
307d0620b01SJens Wiklander TEE_Result crypto_authenc_enc_final(void *ctx __maybe_unused,
308d0620b01SJens Wiklander 				    uint32_t algo __maybe_unused,
309d0620b01SJens Wiklander 				    const uint8_t *src_data __maybe_unused,
310d0620b01SJens Wiklander 				    size_t src_len __maybe_unused,
311d0620b01SJens Wiklander 				    uint8_t *dst_data __maybe_unused,
312d0620b01SJens Wiklander 				    size_t *dst_len __maybe_unused,
313d0620b01SJens Wiklander 				    uint8_t *dst_tag __maybe_unused,
314d0620b01SJens Wiklander 				    size_t *dst_tag_len __maybe_unused)
3158875ce46SJens Wiklander {
316d0620b01SJens Wiklander 	size_t dl = *dst_len;
317d0620b01SJens Wiklander 
318d0620b01SJens Wiklander 	*dst_len = src_len;
319d0620b01SJens Wiklander 	if (dl < src_len)
320d0620b01SJens Wiklander 		return TEE_ERROR_SHORT_BUFFER;
321d0620b01SJens Wiklander 
322d0620b01SJens Wiklander 	switch (algo) {
323d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM)
324d0620b01SJens Wiklander 	case TEE_ALG_AES_CCM:
325d0620b01SJens Wiklander 		return crypto_aes_ccm_enc_final(ctx, src_data, src_len,
326d0620b01SJens Wiklander 						dst_data, dst_tag, dst_tag_len);
327d0620b01SJens Wiklander #endif
328d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM)
329d0620b01SJens Wiklander 	case TEE_ALG_AES_GCM:
330d0620b01SJens Wiklander 		return crypto_aes_gcm_enc_final(ctx, src_data, src_len,
331d0620b01SJens Wiklander 						dst_data, dst_tag, dst_tag_len);
332d0620b01SJens Wiklander #endif
333d0620b01SJens Wiklander 	default:
3348875ce46SJens Wiklander 		return TEE_ERROR_NOT_IMPLEMENTED;
3358875ce46SJens Wiklander 	}
336d0620b01SJens Wiklander }
3378875ce46SJens Wiklander 
338d0620b01SJens Wiklander TEE_Result crypto_authenc_dec_final(void *ctx __maybe_unused,
339d0620b01SJens Wiklander 				    uint32_t algo __maybe_unused,
340d0620b01SJens Wiklander 				    const uint8_t *src_data __maybe_unused,
341d0620b01SJens Wiklander 				    size_t src_len __maybe_unused,
342d0620b01SJens Wiklander 				    uint8_t *dst_data __maybe_unused,
343d0620b01SJens Wiklander 				    size_t *dst_len __maybe_unused,
344d0620b01SJens Wiklander 				    const uint8_t *tag __maybe_unused,
345d0620b01SJens Wiklander 				    size_t tag_len __maybe_unused)
3468875ce46SJens Wiklander {
347d0620b01SJens Wiklander 	size_t dl = *dst_len;
348d0620b01SJens Wiklander 
349d0620b01SJens Wiklander 	*dst_len = src_len;
350d0620b01SJens Wiklander 	if (dl < src_len)
351d0620b01SJens Wiklander 		return TEE_ERROR_SHORT_BUFFER;
352d0620b01SJens Wiklander 
353d0620b01SJens Wiklander 	switch (algo) {
354d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM)
355d0620b01SJens Wiklander 	case TEE_ALG_AES_CCM:
356d0620b01SJens Wiklander 		return crypto_aes_ccm_dec_final(ctx, src_data, src_len,
357d0620b01SJens Wiklander 						dst_data, tag, tag_len);
358d0620b01SJens Wiklander #endif
359d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM)
360d0620b01SJens Wiklander 	case TEE_ALG_AES_GCM:
361d0620b01SJens Wiklander 		return crypto_aes_gcm_dec_final(ctx, src_data, src_len,
362d0620b01SJens Wiklander 						dst_data, tag, tag_len);
363d0620b01SJens Wiklander #endif
364d0620b01SJens Wiklander 	default:
3658875ce46SJens Wiklander 		return TEE_ERROR_NOT_IMPLEMENTED;
3668875ce46SJens Wiklander 	}
3678875ce46SJens Wiklander }
3688875ce46SJens Wiklander 
369d0620b01SJens Wiklander void crypto_authenc_final(void *ctx __maybe_unused,
370d0620b01SJens Wiklander 			  uint32_t algo __maybe_unused)
3718875ce46SJens Wiklander {
372d0620b01SJens Wiklander 	switch (algo) {
373d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM)
374d0620b01SJens Wiklander 	case TEE_ALG_AES_CCM:
375d0620b01SJens Wiklander 		crypto_aes_ccm_final(ctx);
376d0620b01SJens Wiklander 		break;
377d0620b01SJens Wiklander #endif
378d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM)
379d0620b01SJens Wiklander 	case TEE_ALG_AES_GCM:
380d0620b01SJens Wiklander 		crypto_aes_gcm_final(ctx);
381d0620b01SJens Wiklander 		break;
382d0620b01SJens Wiklander #endif
383d0620b01SJens Wiklander 	default:
384d0620b01SJens Wiklander 		break;
3858875ce46SJens Wiklander 	}
386d0620b01SJens Wiklander }
38733790cc1SJens Wiklander 
38833790cc1SJens Wiklander #if !defined(_CFG_CRYPTO_WITH_ACIPHER)
38933790cc1SJens Wiklander struct bignum *crypto_bignum_allocate(size_t size_bits __unused)
39033790cc1SJens Wiklander {
39133790cc1SJens Wiklander 	return NULL;
39233790cc1SJens Wiklander }
39333790cc1SJens Wiklander 
39433790cc1SJens Wiklander TEE_Result crypto_bignum_bin2bn(const uint8_t *from __unused,
39533790cc1SJens Wiklander 				size_t fromsize __unused,
39633790cc1SJens Wiklander 				struct bignum *to __unused)
39733790cc1SJens Wiklander {
39833790cc1SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
39933790cc1SJens Wiklander }
40033790cc1SJens Wiklander 
40133790cc1SJens Wiklander size_t crypto_bignum_num_bytes(struct bignum *a __unused)
40233790cc1SJens Wiklander {
40333790cc1SJens Wiklander 	return 0;
40433790cc1SJens Wiklander }
40533790cc1SJens Wiklander 
40633790cc1SJens Wiklander size_t crypto_bignum_num_bits(struct bignum *a __unused)
40733790cc1SJens Wiklander {
40833790cc1SJens Wiklander 	return 0;
40933790cc1SJens Wiklander }
41033790cc1SJens Wiklander 
41133790cc1SJens Wiklander /*
41233790cc1SJens Wiklander  * crypto_bignum_allocate() and crypto_bignum_bin2bn() failing should be
41333790cc1SJens Wiklander  * enough to guarantee that the functions calling this function aren't
41433790cc1SJens Wiklander  * called, but just in case add a panic() here to avoid unexpected
41533790cc1SJens Wiklander  * behavoir.
41633790cc1SJens Wiklander  */
41733790cc1SJens Wiklander static void bignum_cant_happen(void)
41833790cc1SJens Wiklander {
41933790cc1SJens Wiklander 	volatile bool b = true;
42033790cc1SJens Wiklander 
42133790cc1SJens Wiklander 	/* Avoid warning about function does not return */
42233790cc1SJens Wiklander 	if (b)
42333790cc1SJens Wiklander 		panic();
42433790cc1SJens Wiklander }
42533790cc1SJens Wiklander 
42633790cc1SJens Wiklander void crypto_bignum_bn2bin(const struct bignum *from __unused,
42733790cc1SJens Wiklander 			  uint8_t *to __unused)
42833790cc1SJens Wiklander {
42933790cc1SJens Wiklander 	bignum_cant_happen();
43033790cc1SJens Wiklander }
43133790cc1SJens Wiklander 
43233790cc1SJens Wiklander void crypto_bignum_copy(struct bignum *to __unused,
43333790cc1SJens Wiklander 			const struct bignum *from __unused)
43433790cc1SJens Wiklander {
43533790cc1SJens Wiklander 	bignum_cant_happen();
43633790cc1SJens Wiklander }
43733790cc1SJens Wiklander 
43833790cc1SJens Wiklander void crypto_bignum_free(struct bignum *a)
43933790cc1SJens Wiklander {
44033790cc1SJens Wiklander 	if (a)
44133790cc1SJens Wiklander 		panic();
44233790cc1SJens Wiklander }
44333790cc1SJens Wiklander 
44433790cc1SJens Wiklander void crypto_bignum_clear(struct bignum *a __unused)
44533790cc1SJens Wiklander {
44633790cc1SJens Wiklander 	bignum_cant_happen();
44733790cc1SJens Wiklander }
44833790cc1SJens Wiklander 
44933790cc1SJens Wiklander /* return -1 if a<b, 0 if a==b, +1 if a>b */
45033790cc1SJens Wiklander int32_t crypto_bignum_compare(struct bignum *a __unused,
45133790cc1SJens Wiklander 			      struct bignum *b __unused)
45233790cc1SJens Wiklander {
45333790cc1SJens Wiklander 	bignum_cant_happen();
45433790cc1SJens Wiklander 	return -1;
45533790cc1SJens Wiklander }
45633790cc1SJens Wiklander #endif /*!_CFG_CRYPTO_WITH_ACIPHER*/
457291e5450SJens Wiklander 
458291e5450SJens Wiklander #if !defined(CFG_CRYPTO_RSA) || !defined(_CFG_CRYPTO_WITH_ACIPHER)
459291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_rsa_keypair(struct rsa_keypair *s __unused,
460291e5450SJens Wiklander 					    size_t key_size_bits __unused)
461291e5450SJens Wiklander {
462291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
463291e5450SJens Wiklander }
464291e5450SJens Wiklander 
465291e5450SJens Wiklander TEE_Result
466291e5450SJens Wiklander crypto_acipher_alloc_rsa_public_key(struct rsa_public_key *s __unused,
467291e5450SJens Wiklander 				    size_t key_size_bits __unused)
468291e5450SJens Wiklander {
469291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
470291e5450SJens Wiklander }
471291e5450SJens Wiklander 
472291e5450SJens Wiklander void crypto_acipher_free_rsa_public_key(struct rsa_public_key *s __unused)
473291e5450SJens Wiklander {
474291e5450SJens Wiklander }
475291e5450SJens Wiklander 
476291e5450SJens Wiklander TEE_Result crypto_acipher_gen_rsa_key(struct rsa_keypair *key __unused,
477291e5450SJens Wiklander 				      size_t key_size __unused)
478291e5450SJens Wiklander {
479291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
480291e5450SJens Wiklander }
481291e5450SJens Wiklander 
482291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_decrypt(struct rsa_keypair *key __unused,
483291e5450SJens Wiklander 					   const uint8_t *src __unused,
484291e5450SJens Wiklander 					   size_t src_len __unused,
485291e5450SJens Wiklander 					   uint8_t *dst __unused,
486291e5450SJens Wiklander 					   size_t *dst_len __unused)
487291e5450SJens Wiklander {
488291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
489291e5450SJens Wiklander }
490291e5450SJens Wiklander 
491291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_encrypt(struct rsa_public_key *key __unused,
492291e5450SJens Wiklander 					   const uint8_t *src __unused,
493291e5450SJens Wiklander 					   size_t src_len __unused,
494291e5450SJens Wiklander 					   uint8_t *dst __unused,
495291e5450SJens Wiklander 					   size_t *dst_len __unused)
496291e5450SJens Wiklander {
497291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
498291e5450SJens Wiklander }
499291e5450SJens Wiklander 
500291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_decrypt(uint32_t algo __unused,
501291e5450SJens Wiklander 					struct rsa_keypair *key __unused,
502291e5450SJens Wiklander 					const uint8_t *label __unused,
503291e5450SJens Wiklander 					size_t label_len __unused,
504291e5450SJens Wiklander 					const uint8_t *src __unused,
505291e5450SJens Wiklander 					size_t src_len __unused,
506291e5450SJens Wiklander 					uint8_t *dst __unused,
507291e5450SJens Wiklander 					size_t *dst_len __unused)
508291e5450SJens Wiklander {
509291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
510291e5450SJens Wiklander }
511291e5450SJens Wiklander 
512291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_encrypt(uint32_t algo __unused,
513291e5450SJens Wiklander 					struct rsa_public_key *key __unused,
514291e5450SJens Wiklander 					const uint8_t *label __unused,
515291e5450SJens Wiklander 					size_t label_len __unused,
516291e5450SJens Wiklander 					const uint8_t *src __unused,
517291e5450SJens Wiklander 					size_t src_len __unused,
518291e5450SJens Wiklander 					uint8_t *dst __unused,
519291e5450SJens Wiklander 					size_t *dst_len __unused)
520291e5450SJens Wiklander {
521291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
522291e5450SJens Wiklander }
523291e5450SJens Wiklander 
524291e5450SJens Wiklander TEE_Result crypto_acipher_rsassa_sign(uint32_t algo __unused,
525291e5450SJens Wiklander 				      struct rsa_keypair *key __unused,
526291e5450SJens Wiklander 				      int salt_len __unused,
527291e5450SJens Wiklander 				      const uint8_t *msg __unused,
528291e5450SJens Wiklander 				      size_t msg_len __unused,
529291e5450SJens Wiklander 				      uint8_t *sig __unused,
530291e5450SJens Wiklander 				      size_t *sig_len __unused)
531291e5450SJens Wiklander {
532291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
533291e5450SJens Wiklander }
534291e5450SJens Wiklander 
535291e5450SJens Wiklander TEE_Result crypto_acipher_rsassa_verify(uint32_t algo __unused,
536291e5450SJens Wiklander 					struct rsa_public_key *key __unused,
537291e5450SJens Wiklander 					int salt_len __unused,
538291e5450SJens Wiklander 					const uint8_t *msg __unused,
539291e5450SJens Wiklander 					size_t msg_len __unused,
540291e5450SJens Wiklander 					const uint8_t *sig __unused,
541291e5450SJens Wiklander 					size_t sig_len __unused)
542291e5450SJens Wiklander {
543291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
544291e5450SJens Wiklander }
545291e5450SJens Wiklander #endif /*!CFG_CRYPTO_RSA || !_CFG_CRYPTO_WITH_ACIPHER*/
546291e5450SJens Wiklander 
547291e5450SJens Wiklander #if !defined(CFG_CRYPTO_DSA) || !defined(_CFG_CRYPTO_WITH_ACIPHER)
548291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dsa_keypair(struct dsa_keypair *s __unused,
549291e5450SJens Wiklander 					    size_t key_size_bits __unused)
550291e5450SJens Wiklander {
551291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
552291e5450SJens Wiklander }
553291e5450SJens Wiklander 
554291e5450SJens Wiklander TEE_Result
555291e5450SJens Wiklander crypto_acipher_alloc_dsa_public_key(struct dsa_public_key *s __unused,
556291e5450SJens Wiklander 				    size_t key_size_bits __unused)
557291e5450SJens Wiklander {
558291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
559291e5450SJens Wiklander }
560291e5450SJens Wiklander 
561291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dsa_key(struct dsa_keypair *key __unused,
562291e5450SJens Wiklander 				      size_t key_size __unused)
563291e5450SJens Wiklander {
564291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
565291e5450SJens Wiklander }
566291e5450SJens Wiklander 
567291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_sign(uint32_t algo __unused,
568291e5450SJens Wiklander 				   struct dsa_keypair *key __unused,
569291e5450SJens Wiklander 				   const uint8_t *msg __unused,
570291e5450SJens Wiklander 				   size_t msg_len __unused,
571291e5450SJens Wiklander 				   uint8_t *sig __unused,
572291e5450SJens Wiklander 				   size_t *sig_len __unused)
573291e5450SJens Wiklander {
574291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
575291e5450SJens Wiklander }
576291e5450SJens Wiklander 
577291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_verify(uint32_t algo __unused,
578291e5450SJens Wiklander 				     struct dsa_public_key *key __unused,
579291e5450SJens Wiklander 				     const uint8_t *msg __unused,
580291e5450SJens Wiklander 				     size_t msg_len __unused,
581291e5450SJens Wiklander 				     const uint8_t *sig __unused,
582291e5450SJens Wiklander 				     size_t sig_len __unused)
583291e5450SJens Wiklander {
584291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
585291e5450SJens Wiklander }
586291e5450SJens Wiklander #endif /*!CFG_CRYPTO_DSA || !_CFG_CRYPTO_WITH_ACIPHER*/
587291e5450SJens Wiklander 
588291e5450SJens Wiklander #if !defined(CFG_CRYPTO_DH) || !defined(_CFG_CRYPTO_WITH_ACIPHER)
589291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dh_keypair(struct dh_keypair *s __unused,
590291e5450SJens Wiklander 					   size_t key_size_bits __unused)
591291e5450SJens Wiklander {
592291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
593291e5450SJens Wiklander }
594291e5450SJens Wiklander 
595291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dh_key(struct dh_keypair *key __unused,
596291e5450SJens Wiklander 				     struct bignum *q __unused,
597291e5450SJens Wiklander 				     size_t xbits __unused)
598291e5450SJens Wiklander {
599291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
600291e5450SJens Wiklander }
601291e5450SJens Wiklander 
602291e5450SJens Wiklander TEE_Result
603291e5450SJens Wiklander crypto_acipher_dh_shared_secret(struct dh_keypair *private_key __unused,
604291e5450SJens Wiklander 				struct bignum *public_key __unused,
605291e5450SJens Wiklander 				struct bignum *secret __unused)
606291e5450SJens Wiklander {
607291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
608291e5450SJens Wiklander }
609291e5450SJens Wiklander #endif /*!CFG_CRYPTO_DH || !_CFG_CRYPTO_WITH_ACIPHER*/
610291e5450SJens Wiklander 
611291e5450SJens Wiklander #if !defined(CFG_CRYPTO_ECC) || !defined(_CFG_CRYPTO_WITH_ACIPHER)
612291e5450SJens Wiklander TEE_Result
613291e5450SJens Wiklander crypto_acipher_alloc_ecc_public_key(struct ecc_public_key *s __unused,
614291e5450SJens Wiklander 				    size_t key_size_bits __unused)
615291e5450SJens Wiklander {
616291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
617291e5450SJens Wiklander }
618291e5450SJens Wiklander 
619291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_ecc_keypair(struct ecc_keypair *s __unused,
620291e5450SJens Wiklander 					    size_t key_size_bits __unused)
621291e5450SJens Wiklander {
622291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
623291e5450SJens Wiklander }
624291e5450SJens Wiklander 
625291e5450SJens Wiklander void crypto_acipher_free_ecc_public_key(struct ecc_public_key *s __unused)
626291e5450SJens Wiklander {
627291e5450SJens Wiklander }
628291e5450SJens Wiklander 
629291e5450SJens Wiklander TEE_Result crypto_acipher_gen_ecc_key(struct ecc_keypair *key __unused)
630291e5450SJens Wiklander {
631291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
632291e5450SJens Wiklander }
633291e5450SJens Wiklander 
634291e5450SJens Wiklander TEE_Result crypto_acipher_ecc_sign(uint32_t algo __unused,
635291e5450SJens Wiklander 				   struct ecc_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_ecc_verify(uint32_t algo __unused,
645291e5450SJens Wiklander 				     struct ecc_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 }
653291e5450SJens Wiklander 
654291e5450SJens Wiklander TEE_Result
655291e5450SJens Wiklander crypto_acipher_ecc_shared_secret(struct ecc_keypair *private_key __unused,
656291e5450SJens Wiklander 				 struct ecc_public_key *public_key __unused,
657291e5450SJens Wiklander 				 void *secret __unused,
658291e5450SJens Wiklander 				 unsigned long *secret_len __unused)
659291e5450SJens Wiklander {
660291e5450SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
661291e5450SJens Wiklander }
662291e5450SJens Wiklander #endif /*!CFG_CRYPTO_ECC || !_CFG_CRYPTO_WITH_ACIPHER*/
663