xref: /optee_os/core/include/crypto/crypto_impl.h (revision 86ee543b2786068e4d192111ab5e582d065c2a8d)
16648f482SJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */
26648f482SJens Wiklander /*
36648f482SJens Wiklander  * Copyright (c) 2019, Linaro Limited
4eee637e7SAlexander Zakharov  * Copyright (c) 2021, SumUp Services GmbH
56648f482SJens Wiklander  */
66648f482SJens Wiklander 
76648f482SJens Wiklander #ifndef __CRYPTO_CRYPTO_IMPL_H
86648f482SJens Wiklander #define __CRYPTO_CRYPTO_IMPL_H
96648f482SJens Wiklander 
10df00cf59SCedric Neveux #include <crypto/crypto.h>
116648f482SJens Wiklander #include <tee_api_types.h>
126648f482SJens Wiklander 
136648f482SJens Wiklander /*
146648f482SJens Wiklander  * The crypto context used by the crypto_hash_*() functions is defined by
156648f482SJens Wiklander  * struct crypto_hash_ctx.
166648f482SJens Wiklander  */
176648f482SJens Wiklander struct crypto_hash_ctx {
186648f482SJens Wiklander 	const struct crypto_hash_ops *ops;
196648f482SJens Wiklander };
206648f482SJens Wiklander 
216648f482SJens Wiklander struct crypto_hash_ops {
226648f482SJens Wiklander 	TEE_Result (*init)(struct crypto_hash_ctx *ctx);
236648f482SJens Wiklander 	TEE_Result (*update)(struct crypto_hash_ctx *ctx, const uint8_t *data,
246648f482SJens Wiklander 			     size_t len);
256648f482SJens Wiklander 	TEE_Result (*final)(struct crypto_hash_ctx *ctx, uint8_t *digest,
266648f482SJens Wiklander 			    size_t len);
276648f482SJens Wiklander 	void (*free_ctx)(struct crypto_hash_ctx *ctx);
286648f482SJens Wiklander 	void (*copy_state)(struct crypto_hash_ctx *dst_ctx,
296648f482SJens Wiklander 			   struct crypto_hash_ctx *src_ctx);
306648f482SJens Wiklander };
316648f482SJens Wiklander 
326648f482SJens Wiklander #define CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(name, type) \
336648f482SJens Wiklander 	static inline TEE_Result \
346648f482SJens Wiklander 	crypto_##name##_alloc_ctx(struct crypto_##type##_ctx **ctx __unused) \
356648f482SJens Wiklander 	{ return TEE_ERROR_NOT_IMPLEMENTED; }
366648f482SJens Wiklander 
376648f482SJens Wiklander #if defined(CFG_CRYPTO_MD5)
386648f482SJens Wiklander TEE_Result crypto_md5_alloc_ctx(struct crypto_hash_ctx **ctx);
396648f482SJens Wiklander #else
406648f482SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(md5, hash)
416648f482SJens Wiklander #endif
426648f482SJens Wiklander 
436648f482SJens Wiklander #if defined(CFG_CRYPTO_SHA1)
446648f482SJens Wiklander TEE_Result crypto_sha1_alloc_ctx(struct crypto_hash_ctx **ctx);
456648f482SJens Wiklander #else
466648f482SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(sha1, hash)
476648f482SJens Wiklander #endif
486648f482SJens Wiklander 
496648f482SJens Wiklander #if defined(CFG_CRYPTO_SHA224)
506648f482SJens Wiklander TEE_Result crypto_sha224_alloc_ctx(struct crypto_hash_ctx **ctx);
516648f482SJens Wiklander #else
526648f482SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(sha224, hash)
536648f482SJens Wiklander #endif
546648f482SJens Wiklander 
556648f482SJens Wiklander #if defined(CFG_CRYPTO_SHA256)
566648f482SJens Wiklander TEE_Result crypto_sha256_alloc_ctx(struct crypto_hash_ctx **ctx);
576648f482SJens Wiklander #else
586648f482SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(sha256, hash)
596648f482SJens Wiklander #endif
606648f482SJens Wiklander 
616648f482SJens Wiklander #if defined(CFG_CRYPTO_SHA384)
626648f482SJens Wiklander TEE_Result crypto_sha384_alloc_ctx(struct crypto_hash_ctx **ctx);
636648f482SJens Wiklander #else
646648f482SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(sha384, hash)
656648f482SJens Wiklander #endif
666648f482SJens Wiklander 
676648f482SJens Wiklander #if defined(CFG_CRYPTO_SHA512)
686648f482SJens Wiklander TEE_Result crypto_sha512_alloc_ctx(struct crypto_hash_ctx **ctx);
696648f482SJens Wiklander #else
706648f482SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(sha512, hash)
716648f482SJens Wiklander #endif
726648f482SJens Wiklander 
7347645577SJerome Forissier #if defined(CFG_CRYPTO_SM3)
7447645577SJerome Forissier TEE_Result crypto_sm3_alloc_ctx(struct crypto_hash_ctx **ctx);
7547645577SJerome Forissier #else
7647645577SJerome Forissier CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(sm3, hash)
7747645577SJerome Forissier #endif
7847645577SJerome Forissier 
79260b4028SJens Wiklander #if defined(CFG_CRYPTO_SHA3_224)
80260b4028SJens Wiklander TEE_Result crypto_sha3_224_alloc_ctx(struct crypto_hash_ctx **ctx);
81260b4028SJens Wiklander #else
82260b4028SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(sha3_224, hash)
83260b4028SJens Wiklander #endif
84260b4028SJens Wiklander 
85260b4028SJens Wiklander #if defined(CFG_CRYPTO_SHA3_256)
86260b4028SJens Wiklander TEE_Result crypto_sha3_256_alloc_ctx(struct crypto_hash_ctx **ctx);
87260b4028SJens Wiklander #else
88260b4028SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(sha3_256, hash)
89260b4028SJens Wiklander #endif
90260b4028SJens Wiklander 
91260b4028SJens Wiklander #if defined(CFG_CRYPTO_SHA3_384)
92260b4028SJens Wiklander TEE_Result crypto_sha3_384_alloc_ctx(struct crypto_hash_ctx **ctx);
93260b4028SJens Wiklander #else
94260b4028SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(sha3_384, hash)
95260b4028SJens Wiklander #endif
96260b4028SJens Wiklander 
97260b4028SJens Wiklander #if defined(CFG_CRYPTO_SHA3_512)
98260b4028SJens Wiklander TEE_Result crypto_sha3_512_alloc_ctx(struct crypto_hash_ctx **ctx);
99260b4028SJens Wiklander #else
100260b4028SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(sha3_512, hash)
101260b4028SJens Wiklander #endif
102260b4028SJens Wiklander 
103260b4028SJens Wiklander #if defined(CFG_CRYPTO_SHAKE128)
104260b4028SJens Wiklander TEE_Result crypto_shake128_alloc_ctx(struct crypto_hash_ctx **ctx);
105260b4028SJens Wiklander #else
106260b4028SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(shake128, hash)
107260b4028SJens Wiklander #endif
108260b4028SJens Wiklander 
109260b4028SJens Wiklander #if defined(CFG_CRYPTO_SHAKE256)
110260b4028SJens Wiklander TEE_Result crypto_shake256_alloc_ctx(struct crypto_hash_ctx **ctx);
111260b4028SJens Wiklander #else
112260b4028SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(shake256, hash)
113260b4028SJens Wiklander #endif
114260b4028SJens Wiklander 
1155da36a24SJens Wiklander /*
1165da36a24SJens Wiklander  * The crypto context used by the crypto_mac_*() functions is defined by
1175da36a24SJens Wiklander  * struct crypto_mac_ctx.
1185da36a24SJens Wiklander  */
1195da36a24SJens Wiklander struct crypto_mac_ctx {
1205da36a24SJens Wiklander 	const struct crypto_mac_ops *ops;
1215da36a24SJens Wiklander };
1225da36a24SJens Wiklander 
1235da36a24SJens Wiklander struct crypto_mac_ops {
1245da36a24SJens Wiklander 	TEE_Result (*init)(struct crypto_mac_ctx *ctx, const uint8_t *key,
1255da36a24SJens Wiklander 			   size_t len);
1265da36a24SJens Wiklander 	TEE_Result (*update)(struct crypto_mac_ctx *ctx, const uint8_t *data,
1275da36a24SJens Wiklander 			     size_t len);
1285da36a24SJens Wiklander 	TEE_Result (*final)(struct crypto_mac_ctx *ctx, uint8_t *digest,
1295da36a24SJens Wiklander 			    size_t len);
1305da36a24SJens Wiklander 	void (*free_ctx)(struct crypto_mac_ctx *ctx);
1315da36a24SJens Wiklander 	void (*copy_state)(struct crypto_mac_ctx *dst_ctx,
1325da36a24SJens Wiklander 			   struct crypto_mac_ctx *src_ctx);
1335da36a24SJens Wiklander };
1345da36a24SJens Wiklander 
1357dfcefdaSJens Wiklander #if defined(CFG_CRYPTO_HMAC) && defined(CFG_CRYPTO_MD5)
1365da36a24SJens Wiklander TEE_Result crypto_hmac_md5_alloc_ctx(struct crypto_mac_ctx **ctx);
1375da36a24SJens Wiklander #else
1385da36a24SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(hmac_md5, mac)
1397dfcefdaSJens Wiklander #endif
1407dfcefdaSJens Wiklander 
1417dfcefdaSJens Wiklander #if defined(CFG_CRYPTO_HMAC) && defined(CFG_CRYPTO_SHA1)
1427dfcefdaSJens Wiklander TEE_Result crypto_hmac_sha1_alloc_ctx(struct crypto_mac_ctx **ctx);
1437dfcefdaSJens Wiklander #else
1445da36a24SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(hmac_sha1, mac)
1457dfcefdaSJens Wiklander #endif
1467dfcefdaSJens Wiklander 
1477dfcefdaSJens Wiklander #if defined(CFG_CRYPTO_HMAC) && defined(CFG_CRYPTO_SHA224)
1487dfcefdaSJens Wiklander TEE_Result crypto_hmac_sha224_alloc_ctx(struct crypto_mac_ctx **ctx);
1497dfcefdaSJens Wiklander #else
1505da36a24SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(hmac_sha224, mac)
1517dfcefdaSJens Wiklander #endif
1527dfcefdaSJens Wiklander 
1537dfcefdaSJens Wiklander #if defined(CFG_CRYPTO_HMAC) && defined(CFG_CRYPTO_SHA256)
1547dfcefdaSJens Wiklander TEE_Result crypto_hmac_sha256_alloc_ctx(struct crypto_mac_ctx **ctx);
1557dfcefdaSJens Wiklander #else
1565da36a24SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(hmac_sha256, mac)
1577dfcefdaSJens Wiklander #endif
1587dfcefdaSJens Wiklander 
1597dfcefdaSJens Wiklander #if defined(CFG_CRYPTO_HMAC) && defined(CFG_CRYPTO_SHA384)
1607dfcefdaSJens Wiklander TEE_Result crypto_hmac_sha384_alloc_ctx(struct crypto_mac_ctx **ctx);
1617dfcefdaSJens Wiklander #else
1625da36a24SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(hmac_sha384, mac)
1637dfcefdaSJens Wiklander #endif
1647dfcefdaSJens Wiklander 
1657dfcefdaSJens Wiklander #if defined(CFG_CRYPTO_HMAC) && defined(CFG_CRYPTO_SHA512)
1667dfcefdaSJens Wiklander TEE_Result crypto_hmac_sha512_alloc_ctx(struct crypto_mac_ctx **ctx);
1677dfcefdaSJens Wiklander #else
1685da36a24SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(hmac_sha512, mac)
1697dfcefdaSJens Wiklander #endif
1707dfcefdaSJens Wiklander 
1717dfcefdaSJens Wiklander #if defined(CFG_CRYPTO_HMAC) && defined(CFG_CRYPTO_SHA3_224)
1727dfcefdaSJens Wiklander TEE_Result crypto_hmac_sha3_224_alloc_ctx(struct crypto_mac_ctx **ctx);
1737dfcefdaSJens Wiklander #else
174260b4028SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(hmac_sha3_224, mac)
1757dfcefdaSJens Wiklander #endif
1767dfcefdaSJens Wiklander 
1777dfcefdaSJens Wiklander #if defined(CFG_CRYPTO_HMAC) && defined(CFG_CRYPTO_SHA3_256)
1787dfcefdaSJens Wiklander TEE_Result crypto_hmac_sha3_256_alloc_ctx(struct crypto_mac_ctx **ctx);
1797dfcefdaSJens Wiklander #else
180260b4028SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(hmac_sha3_256, mac)
1817dfcefdaSJens Wiklander #endif
1827dfcefdaSJens Wiklander 
1837dfcefdaSJens Wiklander #if defined(CFG_CRYPTO_HMAC) && defined(CFG_CRYPTO_SHA3_384)
1847dfcefdaSJens Wiklander TEE_Result crypto_hmac_sha3_384_alloc_ctx(struct crypto_mac_ctx **ctx);
1857dfcefdaSJens Wiklander #else
186260b4028SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(hmac_sha3_384, mac)
1877dfcefdaSJens Wiklander #endif
1887dfcefdaSJens Wiklander 
1897dfcefdaSJens Wiklander #if defined(CFG_CRYPTO_HMAC) && defined(CFG_CRYPTO_SHA3_512)
1907dfcefdaSJens Wiklander TEE_Result crypto_hmac_sha3_512_alloc_ctx(struct crypto_mac_ctx **ctx);
1917dfcefdaSJens Wiklander #else
192260b4028SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(hmac_sha3_512, mac)
1935da36a24SJens Wiklander #endif
1945da36a24SJens Wiklander 
19547645577SJerome Forissier #if defined(CFG_CRYPTO_SM3) && defined(CFG_CRYPTO_HMAC)
19647645577SJerome Forissier TEE_Result crypto_hmac_sm3_alloc_ctx(struct crypto_mac_ctx **ctx);
19747645577SJerome Forissier #else
19847645577SJerome Forissier CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(hmac_sm3, mac)
19947645577SJerome Forissier #endif
20047645577SJerome Forissier 
2015da36a24SJens Wiklander #if defined(CFG_CRYPTO_CBC_MAC)
2025da36a24SJens Wiklander TEE_Result crypto_aes_cbc_mac_nopad_alloc_ctx(struct crypto_mac_ctx **ctx);
2035da36a24SJens Wiklander TEE_Result crypto_aes_cbc_mac_pkcs5_alloc_ctx(struct crypto_mac_ctx **ctx);
2045da36a24SJens Wiklander TEE_Result crypto_des_cbc_mac_nopad_alloc_ctx(struct crypto_mac_ctx **ctx);
2055da36a24SJens Wiklander TEE_Result crypto_des_cbc_mac_pkcs5_alloc_ctx(struct crypto_mac_ctx **ctx);
2065da36a24SJens Wiklander TEE_Result crypto_des3_cbc_mac_nopad_alloc_ctx(struct crypto_mac_ctx **ctx);
2075da36a24SJens Wiklander TEE_Result crypto_des3_cbc_mac_pkcs5_alloc_ctx(struct crypto_mac_ctx **ctx);
2085da36a24SJens Wiklander #else
2095da36a24SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(aes_cbc_mac_nopad, mac)
2105da36a24SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(aes_cbc_mac_pkcs5, mac)
2115da36a24SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(des_cbc_mac_nopad, mac)
2125da36a24SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(des_cbc_mac_pkcs5, mac)
2135da36a24SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(des3_cbc_mac_nopad, mac)
2145da36a24SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(des3_cbc_mac_pkcs5, mac)
2155da36a24SJens Wiklander #endif
2165da36a24SJens Wiklander 
2175da36a24SJens Wiklander #if defined(CFG_CRYPTO_CMAC)
2185da36a24SJens Wiklander TEE_Result crypto_aes_cmac_alloc_ctx(struct crypto_mac_ctx **ctx);
219eee637e7SAlexander Zakharov TEE_Result crypto_des3_cmac_alloc_ctx(struct crypto_mac_ctx **ctx);
2205da36a24SJens Wiklander #else
2215da36a24SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(aes_cmac, mac)
222eee637e7SAlexander Zakharov CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(des3_cmac, mac)
2235da36a24SJens Wiklander #endif
22496098f01SJens Wiklander 
22596098f01SJens Wiklander /*
22696098f01SJens Wiklander  * The crypto context used by the crypto_cipher_*() functions is defined by
22796098f01SJens Wiklander  * struct crypto_cipher_ctx.
22896098f01SJens Wiklander  */
22996098f01SJens Wiklander struct crypto_cipher_ctx {
23096098f01SJens Wiklander 	const struct crypto_cipher_ops *ops;
23196098f01SJens Wiklander };
23296098f01SJens Wiklander 
23396098f01SJens Wiklander struct crypto_cipher_ops {
23496098f01SJens Wiklander 	TEE_Result (*init)(struct crypto_cipher_ctx *ctx,
23596098f01SJens Wiklander 			   TEE_OperationMode mode,
23696098f01SJens Wiklander 			   const uint8_t *key1, size_t key1_len,
23796098f01SJens Wiklander 			   const uint8_t *key2, size_t key2_len,
23896098f01SJens Wiklander 			   const uint8_t *iv, size_t iv_len);
23996098f01SJens Wiklander 	TEE_Result (*update)(struct crypto_cipher_ctx *ctx, bool last_block,
24096098f01SJens Wiklander 			     const uint8_t *data, size_t len, uint8_t *dst);
24196098f01SJens Wiklander 	void (*final)(struct crypto_cipher_ctx *ctx);
24296098f01SJens Wiklander 
24396098f01SJens Wiklander 	void (*free_ctx)(struct crypto_cipher_ctx *ctx);
24496098f01SJens Wiklander 	void (*copy_state)(struct crypto_cipher_ctx *dst_ctx,
24596098f01SJens Wiklander 			   struct crypto_cipher_ctx *src_ctx);
24696098f01SJens Wiklander };
24796098f01SJens Wiklander 
24896098f01SJens Wiklander #if defined(CFG_CRYPTO_AES) && defined(CFG_CRYPTO_ECB)
24996098f01SJens Wiklander TEE_Result crypto_aes_ecb_alloc_ctx(struct crypto_cipher_ctx **ctx);
25096098f01SJens Wiklander #else
25196098f01SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(aes_ecb, cipher)
25296098f01SJens Wiklander #endif
25396098f01SJens Wiklander 
25496098f01SJens Wiklander #if defined(CFG_CRYPTO_AES) && defined(CFG_CRYPTO_CBC)
25596098f01SJens Wiklander TEE_Result crypto_aes_cbc_alloc_ctx(struct crypto_cipher_ctx **ctx);
25696098f01SJens Wiklander #else
25796098f01SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(aes_cbc, cipher)
25896098f01SJens Wiklander #endif
25996098f01SJens Wiklander 
26096098f01SJens Wiklander #if defined(CFG_CRYPTO_AES) && defined(CFG_CRYPTO_CTR)
26196098f01SJens Wiklander TEE_Result crypto_aes_ctr_alloc_ctx(struct crypto_cipher_ctx **ctx);
26296098f01SJens Wiklander #else
26396098f01SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(aes_ctr, cipher)
26496098f01SJens Wiklander #endif
26596098f01SJens Wiklander 
26696098f01SJens Wiklander #if defined(CFG_CRYPTO_AES) && defined(CFG_CRYPTO_CTS)
26796098f01SJens Wiklander TEE_Result crypto_aes_cts_alloc_ctx(struct crypto_cipher_ctx **ctx);
26896098f01SJens Wiklander #else
26996098f01SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(aes_cts, cipher)
27096098f01SJens Wiklander #endif
27196098f01SJens Wiklander 
27296098f01SJens Wiklander #if defined(CFG_CRYPTO_AES) && defined(CFG_CRYPTO_XTS)
27396098f01SJens Wiklander TEE_Result crypto_aes_xts_alloc_ctx(struct crypto_cipher_ctx **ctx);
27496098f01SJens Wiklander #else
27596098f01SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(aes_xts, cipher)
27696098f01SJens Wiklander #endif
27796098f01SJens Wiklander 
27896098f01SJens Wiklander #if defined(CFG_CRYPTO_DES) && defined(CFG_CRYPTO_ECB)
27996098f01SJens Wiklander TEE_Result crypto_des_ecb_alloc_ctx(struct crypto_cipher_ctx **ctx);
28096098f01SJens Wiklander TEE_Result crypto_des3_ecb_alloc_ctx(struct crypto_cipher_ctx **ctx);
28196098f01SJens Wiklander #else
28296098f01SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(des_ecb, cipher)
28396098f01SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(des3_ecb, cipher)
28496098f01SJens Wiklander #endif
28596098f01SJens Wiklander 
28696098f01SJens Wiklander #if defined(CFG_CRYPTO_DES) && defined(CFG_CRYPTO_CBC)
28796098f01SJens Wiklander TEE_Result crypto_des_cbc_alloc_ctx(struct crypto_cipher_ctx **ctx);
28896098f01SJens Wiklander TEE_Result crypto_des3_cbc_alloc_ctx(struct crypto_cipher_ctx **ctx);
28996098f01SJens Wiklander #else
29096098f01SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(des_cbc, cipher)
29196098f01SJens Wiklander CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(des3_cbc, cipher)
29296098f01SJens Wiklander #endif
293f1e9b21bSJens Wiklander 
294ade6f848SJerome Forissier #if defined(CFG_CRYPTO_SM4) && defined(CFG_CRYPTO_ECB)
295ade6f848SJerome Forissier TEE_Result crypto_sm4_ecb_alloc_ctx(struct crypto_cipher_ctx **ctx);
296ade6f848SJerome Forissier #else
297ade6f848SJerome Forissier CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(sm4_ecb, cipher)
298ade6f848SJerome Forissier #endif
299ade6f848SJerome Forissier 
300ade6f848SJerome Forissier #if defined(CFG_CRYPTO_SM4) && defined(CFG_CRYPTO_CBC)
301ade6f848SJerome Forissier TEE_Result crypto_sm4_cbc_alloc_ctx(struct crypto_cipher_ctx **ctx);
302ade6f848SJerome Forissier #else
303ade6f848SJerome Forissier CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(sm4_cbc, cipher)
304ade6f848SJerome Forissier #endif
305ade6f848SJerome Forissier 
306ade6f848SJerome Forissier #if defined(CFG_CRYPTO_SM4) && defined(CFG_CRYPTO_CTR)
307ade6f848SJerome Forissier TEE_Result crypto_sm4_ctr_alloc_ctx(struct crypto_cipher_ctx **ctx);
308ade6f848SJerome Forissier #else
309ade6f848SJerome Forissier CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(sm4_ctr, cipher)
310ade6f848SJerome Forissier #endif
311ade6f848SJerome Forissier 
312b21f583dSPingan Xie #if defined(CFG_CRYPTO_SM4) && defined(CFG_CRYPTO_XTS)
313b21f583dSPingan Xie TEE_Result crypto_sm4_xts_alloc_ctx(struct crypto_cipher_ctx **ctx);
314b21f583dSPingan Xie #else
315b21f583dSPingan Xie CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(sm4_xts, cipher)
316b21f583dSPingan Xie #endif
317b21f583dSPingan Xie 
318f1e9b21bSJens Wiklander /*
319f1e9b21bSJens Wiklander  * The crypto context used by the crypto_authen_*() functions below is
320f1e9b21bSJens Wiklander  * defined by struct crypto_authenc_ctx.
321f1e9b21bSJens Wiklander  */
322f1e9b21bSJens Wiklander struct crypto_authenc_ctx {
323f1e9b21bSJens Wiklander 	const struct crypto_authenc_ops *ops;
324f1e9b21bSJens Wiklander };
325f1e9b21bSJens Wiklander 
326f1e9b21bSJens Wiklander struct crypto_authenc_ops {
327f1e9b21bSJens Wiklander 	TEE_Result (*init)(struct crypto_authenc_ctx *ctx,
328f1e9b21bSJens Wiklander 			   TEE_OperationMode mode,
329f1e9b21bSJens Wiklander 			   const uint8_t *key, size_t key_len,
330f1e9b21bSJens Wiklander 			   const uint8_t *nonce, size_t nonce_len,
331f1e9b21bSJens Wiklander 			   size_t tag_len, size_t aad_len,
332f1e9b21bSJens Wiklander 			   size_t payload_len);
333f1e9b21bSJens Wiklander 	TEE_Result (*update_aad)(struct crypto_authenc_ctx *ctx,
334f1e9b21bSJens Wiklander 				 const uint8_t *data, size_t len);
335f1e9b21bSJens Wiklander 	TEE_Result (*update_payload)(struct crypto_authenc_ctx *ctx,
336f1e9b21bSJens Wiklander 				     TEE_OperationMode mode,
337f1e9b21bSJens Wiklander 				     const uint8_t *src_data, size_t len,
338f1e9b21bSJens Wiklander 				     uint8_t *dst_data);
339f1e9b21bSJens Wiklander 	TEE_Result (*enc_final)(struct crypto_authenc_ctx *ctx,
340f1e9b21bSJens Wiklander 				const uint8_t *src_data, size_t len,
341f1e9b21bSJens Wiklander 				uint8_t *dst_data, uint8_t *dst_tag,
342f1e9b21bSJens Wiklander 				size_t *dst_tag_len);
343f1e9b21bSJens Wiklander 	TEE_Result (*dec_final)(struct crypto_authenc_ctx *ctx,
344f1e9b21bSJens Wiklander 				const uint8_t *src_data, size_t len,
345f1e9b21bSJens Wiklander 				uint8_t *dst_data, const uint8_t *tag,
346f1e9b21bSJens Wiklander 				size_t tag_len);
347f1e9b21bSJens Wiklander 	void (*final)(struct crypto_authenc_ctx *ctx);
348f1e9b21bSJens Wiklander 	void (*free_ctx)(struct crypto_authenc_ctx *ctx);
349f1e9b21bSJens Wiklander 	void (*copy_state)(struct crypto_authenc_ctx *dst_ctx,
350f1e9b21bSJens Wiklander 			   struct crypto_authenc_ctx *src_ctx);
351f1e9b21bSJens Wiklander };
352f1e9b21bSJens Wiklander 
353f1e9b21bSJens Wiklander TEE_Result crypto_aes_ccm_alloc_ctx(struct crypto_authenc_ctx **ctx);
354f1e9b21bSJens Wiklander TEE_Result crypto_aes_gcm_alloc_ctx(struct crypto_authenc_ctx **ctx);
3557222fc6aSCedric Neveux 
3567222fc6aSCedric Neveux #ifdef CFG_CRYPTO_DRV_HASH
3577222fc6aSCedric Neveux TEE_Result drvcrypt_hash_alloc_ctx(struct crypto_hash_ctx **ctx, uint32_t algo);
3587222fc6aSCedric Neveux #else
3597222fc6aSCedric Neveux static inline TEE_Result
drvcrypt_hash_alloc_ctx(struct crypto_hash_ctx ** ctx __unused,uint32_t algo __unused)3607222fc6aSCedric Neveux drvcrypt_hash_alloc_ctx(struct crypto_hash_ctx **ctx __unused,
3617222fc6aSCedric Neveux 			uint32_t algo __unused)
3627222fc6aSCedric Neveux {
3637222fc6aSCedric Neveux 	return TEE_ERROR_NOT_IMPLEMENTED;
3647222fc6aSCedric Neveux }
365e43ab7a8SCedric Neveux #endif /* CFG_CRYPTO_DRV_HASH */
366e43ab7a8SCedric Neveux 
367e43ab7a8SCedric Neveux #ifdef CFG_CRYPTO_DRV_CIPHER
368e43ab7a8SCedric Neveux TEE_Result drvcrypt_cipher_alloc_ctx(struct crypto_cipher_ctx **ctx,
369e43ab7a8SCedric Neveux 				     uint32_t algo);
370e43ab7a8SCedric Neveux #else
371e43ab7a8SCedric Neveux static inline TEE_Result
drvcrypt_cipher_alloc_ctx(struct crypto_cipher_ctx ** ctx __unused,uint32_t algo __unused)372e43ab7a8SCedric Neveux drvcrypt_cipher_alloc_ctx(struct crypto_cipher_ctx **ctx __unused,
373e43ab7a8SCedric Neveux 			  uint32_t algo __unused)
374e43ab7a8SCedric Neveux {
375e43ab7a8SCedric Neveux 	return TEE_ERROR_NOT_IMPLEMENTED;
376e43ab7a8SCedric Neveux }
377e43ab7a8SCedric Neveux #endif /* CFG_CRYPTO_DRV_CIPHER */
378ea9ac29cSCedric Neveux 
379ea9ac29cSCedric Neveux #ifdef CFG_CRYPTO_DRV_MAC
380ea9ac29cSCedric Neveux /* Cryptographic MAC driver context allocation */
381ea9ac29cSCedric Neveux TEE_Result drvcrypt_mac_alloc_ctx(struct crypto_mac_ctx **ctx, uint32_t algo);
382ea9ac29cSCedric Neveux #else
383ea9ac29cSCedric Neveux static inline TEE_Result
drvcrypt_mac_alloc_ctx(struct crypto_mac_ctx ** ctx __unused,uint32_t algo __unused)384ea9ac29cSCedric Neveux drvcrypt_mac_alloc_ctx(struct crypto_mac_ctx **ctx __unused,
385ea9ac29cSCedric Neveux 		       uint32_t algo __unused)
386ea9ac29cSCedric Neveux {
387ea9ac29cSCedric Neveux 	return TEE_ERROR_NOT_IMPLEMENTED;
388ea9ac29cSCedric Neveux }
389ea9ac29cSCedric Neveux #endif /* CFG_CRYPTO_DRV_MAC */
390df00cf59SCedric Neveux 
391e3e4ce47SNicolas Toromanoff #ifdef CFG_CRYPTO_DRV_AUTHENC
392e3e4ce47SNicolas Toromanoff /* Cryptographic Authenticated Encryption driver context allocation */
393e3e4ce47SNicolas Toromanoff TEE_Result drvcrypt_authenc_alloc_ctx(struct crypto_authenc_ctx **ctx,
394e3e4ce47SNicolas Toromanoff 				      uint32_t algo);
395e3e4ce47SNicolas Toromanoff #else
396e3e4ce47SNicolas Toromanoff static inline TEE_Result
drvcrypt_authenc_alloc_ctx(struct crypto_authenc_ctx ** ctx __unused,uint32_t algo __unused)397e3e4ce47SNicolas Toromanoff drvcrypt_authenc_alloc_ctx(struct crypto_authenc_ctx **ctx __unused,
398e3e4ce47SNicolas Toromanoff 			   uint32_t algo __unused)
399e3e4ce47SNicolas Toromanoff {
400e3e4ce47SNicolas Toromanoff 	return TEE_ERROR_NOT_IMPLEMENTED;
401e3e4ce47SNicolas Toromanoff }
402e3e4ce47SNicolas Toromanoff #endif /* CFG_CRYPTO_DRV_AUTHENC */
403df00cf59SCedric Neveux /*
404df00cf59SCedric Neveux  * The ECC public key operations used by the crypto_acipher_ecc_*() and
405df00cf59SCedric Neveux  * crypto_acipher_free_ecc_*() functions.
406df00cf59SCedric Neveux  * Reference set in ecc_public_key when key allocated.
407884fd190SCedric Neveux  *
408884fd190SCedric Neveux  * @free    is mandatory
409884fd190SCedric Neveux  * @verify  is optional
410884fd190SCedric Neveux  * @encrypt is optional
411df00cf59SCedric Neveux  */
412df00cf59SCedric Neveux struct crypto_ecc_public_ops {
413df00cf59SCedric Neveux 	void (*free)(struct ecc_public_key *key);
414df00cf59SCedric Neveux 	TEE_Result (*verify)(uint32_t algo, struct ecc_public_key *key,
415df00cf59SCedric Neveux 			     const uint8_t *msg, size_t msg_len,
416df00cf59SCedric Neveux 			     const uint8_t *sig, size_t sig_len);
417884fd190SCedric Neveux 	TEE_Result (*encrypt)(struct ecc_public_key *key, const uint8_t *src,
418884fd190SCedric Neveux 			      size_t src_len, uint8_t *dst, size_t *dst_len);
419df00cf59SCedric Neveux };
420df00cf59SCedric Neveux 
421df00cf59SCedric Neveux /*
422df00cf59SCedric Neveux  * The ECC keypair operations used by the crypto_acipher_ecc_*() and
423df00cf59SCedric Neveux  * crypto_acipher_gen_ecc_*() functions.
424df00cf59SCedric Neveux  * Reference set in ecc_keypair when key allocated.
425884fd190SCedric Neveux  *
426884fd190SCedric Neveux  * @generate      is mandatory
427884fd190SCedric Neveux  * @sign          is optional
428884fd190SCedric Neveux  * @shared_secret is optional
429884fd190SCedric Neveux  * @decrypt       is optional
430df00cf59SCedric Neveux  */
431df00cf59SCedric Neveux struct crypto_ecc_keypair_ops {
432df00cf59SCedric Neveux 	TEE_Result (*generate)(struct ecc_keypair *key, size_t key_size_bits);
433df00cf59SCedric Neveux 	TEE_Result (*sign)(uint32_t algo, struct ecc_keypair *key,
434df00cf59SCedric Neveux 			   const uint8_t *msg, size_t msg_len, uint8_t *sig,
435df00cf59SCedric Neveux 			   size_t *sig_len);
436df00cf59SCedric Neveux 	TEE_Result (*shared_secret)(struct ecc_keypair *private_key,
437df00cf59SCedric Neveux 				    struct ecc_public_key *public_key,
438df00cf59SCedric Neveux 				    void *secret, unsigned long *secret_len);
439884fd190SCedric Neveux 	TEE_Result (*decrypt)(struct ecc_keypair *key, const uint8_t *src,
440884fd190SCedric Neveux 			      size_t src_len, uint8_t *dst, size_t *dst_len);
441df00cf59SCedric Neveux };
442df00cf59SCedric Neveux 
443df00cf59SCedric Neveux #ifdef CFG_CRYPTO_ECC
4445516c6cdSJorge Ramirez-Ortiz const struct crypto_ecc_keypair_ops *
4455516c6cdSJorge Ramirez-Ortiz crypto_asym_get_ecc_keypair_ops(uint32_t key_type);
4465516c6cdSJorge Ramirez-Ortiz 
4475516c6cdSJorge Ramirez-Ortiz const struct crypto_ecc_public_ops *
4485516c6cdSJorge Ramirez-Ortiz crypto_asym_get_ecc_public_ops(uint32_t key_type);
4495516c6cdSJorge Ramirez-Ortiz 
450df00cf59SCedric Neveux TEE_Result crypto_asym_alloc_ecc_public_key(struct ecc_public_key *key,
451df00cf59SCedric Neveux 					    uint32_t key_type,
452df00cf59SCedric Neveux 					    size_t key_size_bits);
453df00cf59SCedric Neveux TEE_Result crypto_asym_alloc_ecc_keypair(struct ecc_keypair *key,
454df00cf59SCedric Neveux 					 uint32_t key_type,
455df00cf59SCedric Neveux 					 size_t key_size_bits);
456df00cf59SCedric Neveux #else
457df00cf59SCedric Neveux static inline TEE_Result
crypto_asym_alloc_ecc_public_key(struct ecc_public_key * key __unused,uint32_t key_type __unused,size_t key_size_bits __unused)458df00cf59SCedric Neveux crypto_asym_alloc_ecc_public_key(struct ecc_public_key *key __unused,
459df00cf59SCedric Neveux 				 uint32_t key_type __unused,
460df00cf59SCedric Neveux 				 size_t key_size_bits __unused)
461df00cf59SCedric Neveux {
462df00cf59SCedric Neveux 	return TEE_ERROR_NOT_IMPLEMENTED;
463df00cf59SCedric Neveux }
464df00cf59SCedric Neveux 
4655516c6cdSJorge Ramirez-Ortiz static inline const struct crypto_ecc_keypair_ops *
crypto_asym_get_ecc_keypair_ops(uint32_t key_type __unused)46689853006SEtienne Carriere crypto_asym_get_ecc_keypair_ops(uint32_t key_type __unused)
4675516c6cdSJorge Ramirez-Ortiz {
4685516c6cdSJorge Ramirez-Ortiz 	return NULL;
4695516c6cdSJorge Ramirez-Ortiz }
4705516c6cdSJorge Ramirez-Ortiz 
4715516c6cdSJorge Ramirez-Ortiz static inline const struct crypto_ecc_public_ops *
crypto_asym_get_ecc_public_ops(uint32_t key_type __unused)4725516c6cdSJorge Ramirez-Ortiz crypto_asym_get_ecc_public_ops(uint32_t key_type __unused)
4735516c6cdSJorge Ramirez-Ortiz {
4745516c6cdSJorge Ramirez-Ortiz 	return NULL;
4755516c6cdSJorge Ramirez-Ortiz }
4765516c6cdSJorge Ramirez-Ortiz 
477df00cf59SCedric Neveux static inline TEE_Result
crypto_asym_alloc_ecc_keypair(struct ecc_keypair * key __unused,uint32_t key_type __unused,size_t key_size_bits __unused)478df00cf59SCedric Neveux crypto_asym_alloc_ecc_keypair(struct ecc_keypair *key __unused,
479df00cf59SCedric Neveux 			      uint32_t key_type __unused,
480df00cf59SCedric Neveux 			      size_t key_size_bits __unused)
481df00cf59SCedric Neveux {
482df00cf59SCedric Neveux 	return TEE_ERROR_NOT_IMPLEMENTED;
483df00cf59SCedric Neveux }
484df00cf59SCedric Neveux #endif /* CFG_CRYPTO_ECC */
485df00cf59SCedric Neveux 
486df00cf59SCedric Neveux #ifdef CFG_CRYPTO_DRV_ECC
487df00cf59SCedric Neveux TEE_Result drvcrypt_asym_alloc_ecc_public_key(struct ecc_public_key *key,
488df00cf59SCedric Neveux 					      uint32_t key_type,
489df00cf59SCedric Neveux 					      size_t key_size_bits);
490df00cf59SCedric Neveux TEE_Result drvcrypt_asym_alloc_ecc_keypair(struct ecc_keypair *key,
491df00cf59SCedric Neveux 					   uint32_t key_type,
492df00cf59SCedric Neveux 					   size_t key_size_bits);
493df00cf59SCedric Neveux #else
494df00cf59SCedric Neveux static inline TEE_Result
drvcrypt_asym_alloc_ecc_public_key(struct ecc_public_key * key __unused,uint32_t key_type __unused,size_t key_size_bits __unused)495df00cf59SCedric Neveux drvcrypt_asym_alloc_ecc_public_key(struct ecc_public_key *key __unused,
496df00cf59SCedric Neveux 				   uint32_t key_type __unused,
497df00cf59SCedric Neveux 				   size_t key_size_bits __unused)
498df00cf59SCedric Neveux {
499df00cf59SCedric Neveux 	return TEE_ERROR_NOT_IMPLEMENTED;
500df00cf59SCedric Neveux }
501df00cf59SCedric Neveux 
502df00cf59SCedric Neveux static inline TEE_Result
drvcrypt_asym_alloc_ecc_keypair(struct ecc_keypair * key __unused,uint32_t key_type __unused,size_t key_size_bits __unused)503df00cf59SCedric Neveux drvcrypt_asym_alloc_ecc_keypair(struct ecc_keypair *key __unused,
504df00cf59SCedric Neveux 				uint32_t key_type __unused,
505df00cf59SCedric Neveux 				size_t key_size_bits __unused)
506df00cf59SCedric Neveux {
507df00cf59SCedric Neveux 	return TEE_ERROR_NOT_IMPLEMENTED;
508df00cf59SCedric Neveux }
509df00cf59SCedric Neveux #endif /* CFG_CRYPTO_DRV_ECC */
510ecfcabc5SJorge Ramirez-Ortiz 
511ecfcabc5SJorge Ramirez-Ortiz TEE_Result sw_crypto_acipher_alloc_rsa_keypair(struct rsa_keypair *s,
512ecfcabc5SJorge Ramirez-Ortiz 					       size_t key_size_bits);
513ecfcabc5SJorge Ramirez-Ortiz 
514ecfcabc5SJorge Ramirez-Ortiz TEE_Result sw_crypto_acipher_alloc_rsa_public_key(struct rsa_public_key *s,
515ecfcabc5SJorge Ramirez-Ortiz 						  size_t key_size_bits);
516ecfcabc5SJorge Ramirez-Ortiz 
517ecfcabc5SJorge Ramirez-Ortiz void sw_crypto_acipher_free_rsa_public_key(struct rsa_public_key *s);
518ecfcabc5SJorge Ramirez-Ortiz 
519ecfcabc5SJorge Ramirez-Ortiz void sw_crypto_acipher_free_rsa_keypair(struct rsa_keypair *s);
520ecfcabc5SJorge Ramirez-Ortiz 
521ecfcabc5SJorge Ramirez-Ortiz TEE_Result sw_crypto_acipher_gen_rsa_key(struct rsa_keypair *key,
522ecfcabc5SJorge Ramirez-Ortiz 					 size_t key_size);
523ecfcabc5SJorge Ramirez-Ortiz 
524ecfcabc5SJorge Ramirez-Ortiz TEE_Result sw_crypto_acipher_rsanopad_decrypt(struct rsa_keypair *key,
525ecfcabc5SJorge Ramirez-Ortiz 					      const uint8_t *src,
526ecfcabc5SJorge Ramirez-Ortiz 					      size_t src_len, uint8_t *dst,
527ecfcabc5SJorge Ramirez-Ortiz 					      size_t *dst_len);
528ecfcabc5SJorge Ramirez-Ortiz TEE_Result sw_crypto_acipher_rsanopad_encrypt(struct rsa_public_key *key,
529ecfcabc5SJorge Ramirez-Ortiz 					      const uint8_t *src,
530ecfcabc5SJorge Ramirez-Ortiz 					      size_t src_len, uint8_t *dst,
531ecfcabc5SJorge Ramirez-Ortiz 					      size_t *dst_len);
532ecfcabc5SJorge Ramirez-Ortiz TEE_Result sw_crypto_acipher_rsaes_decrypt(uint32_t algo,
533ecfcabc5SJorge Ramirez-Ortiz 					   struct rsa_keypair *key,
534ecfcabc5SJorge Ramirez-Ortiz 					   const uint8_t *label,
535*86ee543bSSami Tolvanen 					   size_t label_len,
536*86ee543bSSami Tolvanen 					   uint32_t mgf_algo,
537*86ee543bSSami Tolvanen 					   const uint8_t *src,
538ecfcabc5SJorge Ramirez-Ortiz 					   size_t src_len, uint8_t *dst,
539ecfcabc5SJorge Ramirez-Ortiz 					   size_t *dst_len);
540ecfcabc5SJorge Ramirez-Ortiz 
541ecfcabc5SJorge Ramirez-Ortiz TEE_Result sw_crypto_acipher_rsaes_encrypt(uint32_t algo,
542ecfcabc5SJorge Ramirez-Ortiz 					   struct rsa_public_key *key,
543ecfcabc5SJorge Ramirez-Ortiz 					   const uint8_t *label,
544*86ee543bSSami Tolvanen 					   size_t label_len,
545*86ee543bSSami Tolvanen 					   uint32_t mgf_algo,
546*86ee543bSSami Tolvanen 					   const uint8_t *src,
547ecfcabc5SJorge Ramirez-Ortiz 					   size_t src_len, uint8_t *dst,
548ecfcabc5SJorge Ramirez-Ortiz 					   size_t *dst_len);
549ecfcabc5SJorge Ramirez-Ortiz 
550ecfcabc5SJorge Ramirez-Ortiz TEE_Result sw_crypto_acipher_rsassa_sign(uint32_t algo, struct rsa_keypair *key,
551ecfcabc5SJorge Ramirez-Ortiz 					 int salt_len, const uint8_t *msg,
552ecfcabc5SJorge Ramirez-Ortiz 					 size_t msg_len, uint8_t *sig,
553ecfcabc5SJorge Ramirez-Ortiz 					 size_t *sig_len);
554ecfcabc5SJorge Ramirez-Ortiz 
555ecfcabc5SJorge Ramirez-Ortiz TEE_Result sw_crypto_acipher_rsassa_verify(uint32_t algo,
556ecfcabc5SJorge Ramirez-Ortiz 					   struct rsa_public_key *key,
557ecfcabc5SJorge Ramirez-Ortiz 					   int salt_len, const uint8_t *msg,
558ecfcabc5SJorge Ramirez-Ortiz 					   size_t msg_len, const uint8_t *sig,
559ecfcabc5SJorge Ramirez-Ortiz 					   size_t sig_len);
5606648f482SJens Wiklander #endif /*__CRYPTO_CRYPTO_IMPL_H*/
561