xref: /optee_os/core/drivers/crypto/se050/glue/user.c (revision 03889d5413d7cb1877b0a8a5dd924ae3522dc48d)
1*03889d54SJorge Ramirez-Ortiz // SPDX-License-Identifier: BSD-2-Clause
2*03889d54SJorge Ramirez-Ortiz /*
3*03889d54SJorge Ramirez-Ortiz  * Copyright (C) Foundries Ltd. 2020 - All Rights Reserved
4*03889d54SJorge Ramirez-Ortiz  * Author: Jorge Ramirez <jorge@foundries.io>
5*03889d54SJorge Ramirez-Ortiz  */
6*03889d54SJorge Ramirez-Ortiz #include <compiler.h>
7*03889d54SJorge Ramirez-Ortiz #include <config.h>
8*03889d54SJorge Ramirez-Ortiz #include <crypto/crypto.h>
9*03889d54SJorge Ramirez-Ortiz #include <fsl_sss_user_apis.h>
10*03889d54SJorge Ramirez-Ortiz #include <glue.h>
11*03889d54SJorge Ramirez-Ortiz #include <stdlib.h>
12*03889d54SJorge Ramirez-Ortiz 
glue_mac_context_init(void ** mac,const uint8_t * key,size_t len)13*03889d54SJorge Ramirez-Ortiz sss_status_t glue_mac_context_init(void **mac, const uint8_t *key, size_t len)
14*03889d54SJorge Ramirez-Ortiz {
15*03889d54SJorge Ramirez-Ortiz 	if (crypto_mac_alloc_ctx(mac, TEE_ALG_AES_CMAC))
16*03889d54SJorge Ramirez-Ortiz 		return kStatus_SSS_Fail;
17*03889d54SJorge Ramirez-Ortiz 
18*03889d54SJorge Ramirez-Ortiz 	if (crypto_mac_init(*mac, key, len))
19*03889d54SJorge Ramirez-Ortiz 		return kStatus_SSS_Fail;
20*03889d54SJorge Ramirez-Ortiz 
21*03889d54SJorge Ramirez-Ortiz 	return kStatus_SSS_Success;
22*03889d54SJorge Ramirez-Ortiz }
23*03889d54SJorge Ramirez-Ortiz 
glue_mac_context_free(void * mac)24*03889d54SJorge Ramirez-Ortiz void glue_mac_context_free(void *mac)
25*03889d54SJorge Ramirez-Ortiz {
26*03889d54SJorge Ramirez-Ortiz 	crypto_mac_free_ctx(mac);
27*03889d54SJorge Ramirez-Ortiz }
28*03889d54SJorge Ramirez-Ortiz 
glue_mac_update(void * mac,const uint8_t * msg,size_t len)29*03889d54SJorge Ramirez-Ortiz sss_status_t glue_mac_update(void *mac, const uint8_t *msg, size_t len)
30*03889d54SJorge Ramirez-Ortiz {
31*03889d54SJorge Ramirez-Ortiz 	if (crypto_mac_update(mac, msg, len))
32*03889d54SJorge Ramirez-Ortiz 		return kStatus_SSS_Fail;
33*03889d54SJorge Ramirez-Ortiz 
34*03889d54SJorge Ramirez-Ortiz 	return kStatus_SSS_Success;
35*03889d54SJorge Ramirez-Ortiz }
36*03889d54SJorge Ramirez-Ortiz 
glue_mac_final(void * mac,uint8_t * buf,size_t len)37*03889d54SJorge Ramirez-Ortiz sss_status_t glue_mac_final(void *mac, uint8_t *buf, size_t len)
38*03889d54SJorge Ramirez-Ortiz {
39*03889d54SJorge Ramirez-Ortiz 	if (crypto_mac_final(mac, buf, len))
40*03889d54SJorge Ramirez-Ortiz 		return kStatus_SSS_Fail;
41*03889d54SJorge Ramirez-Ortiz 
42*03889d54SJorge Ramirez-Ortiz 	return kStatus_SSS_Success;
43*03889d54SJorge Ramirez-Ortiz }
44*03889d54SJorge Ramirez-Ortiz 
glue_mac_one_go(void * mac,const uint8_t * msg,size_t msg_len,uint8_t * buf,size_t mac_len)45*03889d54SJorge Ramirez-Ortiz sss_status_t glue_mac_one_go(void *mac, const uint8_t *msg, size_t msg_len,
46*03889d54SJorge Ramirez-Ortiz 			     uint8_t *buf, size_t mac_len)
47*03889d54SJorge Ramirez-Ortiz {
48*03889d54SJorge Ramirez-Ortiz 	if (crypto_mac_update(mac, msg, msg_len))
49*03889d54SJorge Ramirez-Ortiz 		return kStatus_SSS_Fail;
50*03889d54SJorge Ramirez-Ortiz 
51*03889d54SJorge Ramirez-Ortiz 	if (crypto_mac_final(mac, buf, mac_len))
52*03889d54SJorge Ramirez-Ortiz 		return kStatus_SSS_Fail;
53*03889d54SJorge Ramirez-Ortiz 
54*03889d54SJorge Ramirez-Ortiz 	return kStatus_SSS_Success;
55*03889d54SJorge Ramirez-Ortiz }
56*03889d54SJorge Ramirez-Ortiz 
glue_symmetric_context_init(void ** cipher)57*03889d54SJorge Ramirez-Ortiz sss_status_t glue_symmetric_context_init(void **cipher)
58*03889d54SJorge Ramirez-Ortiz {
59*03889d54SJorge Ramirez-Ortiz 	if (crypto_cipher_alloc_ctx(cipher, TEE_ALG_AES_CBC_NOPAD))
60*03889d54SJorge Ramirez-Ortiz 		return kStatus_SSS_Fail;
61*03889d54SJorge Ramirez-Ortiz 
62*03889d54SJorge Ramirez-Ortiz 	return kStatus_SSS_Success;
63*03889d54SJorge Ramirez-Ortiz }
64*03889d54SJorge Ramirez-Ortiz 
glue_cipher_one_go(void * cipher,TEE_OperationMode mode,uint8_t * iv,size_t iv_len,uint8_t * key,size_t key_len,const uint8_t * src,uint8_t * dst,size_t len)65*03889d54SJorge Ramirez-Ortiz sss_status_t glue_cipher_one_go(void *cipher, TEE_OperationMode mode,
66*03889d54SJorge Ramirez-Ortiz 				uint8_t *iv, size_t iv_len,
67*03889d54SJorge Ramirez-Ortiz 				uint8_t *key, size_t key_len,
68*03889d54SJorge Ramirez-Ortiz 				const uint8_t *src, uint8_t *dst, size_t len)
69*03889d54SJorge Ramirez-Ortiz {
70*03889d54SJorge Ramirez-Ortiz 	if (crypto_cipher_init(cipher, mode, key, key_len, NULL, 0, iv, iv_len))
71*03889d54SJorge Ramirez-Ortiz 		return kStatus_SSS_Fail;
72*03889d54SJorge Ramirez-Ortiz 
73*03889d54SJorge Ramirez-Ortiz 	if (crypto_cipher_update(cipher, 0, true, src, len, dst))
74*03889d54SJorge Ramirez-Ortiz 		return kStatus_SSS_Fail;
75*03889d54SJorge Ramirez-Ortiz 
76*03889d54SJorge Ramirez-Ortiz 	crypto_cipher_final(cipher);
77*03889d54SJorge Ramirez-Ortiz 
78*03889d54SJorge Ramirez-Ortiz 	return kStatus_SSS_Success;
79*03889d54SJorge Ramirez-Ortiz }
80*03889d54SJorge Ramirez-Ortiz 
glue_context_free(void * cipher)81*03889d54SJorge Ramirez-Ortiz void glue_context_free(void *cipher)
82*03889d54SJorge Ramirez-Ortiz {
83*03889d54SJorge Ramirez-Ortiz 	crypto_cipher_free_ctx(cipher);
84*03889d54SJorge Ramirez-Ortiz }
85*03889d54SJorge Ramirez-Ortiz 
glue_rng_get_random(uint8_t * data,size_t len)86*03889d54SJorge Ramirez-Ortiz sss_status_t glue_rng_get_random(uint8_t *data, size_t len)
87*03889d54SJorge Ramirez-Ortiz {
88*03889d54SJorge Ramirez-Ortiz 	if (IS_ENABLED(CFG_NXP_SE05X_RNG_DRV))
89*03889d54SJorge Ramirez-Ortiz 		return kStatus_SSS_InvalidArgument;
90*03889d54SJorge Ramirez-Ortiz 
91*03889d54SJorge Ramirez-Ortiz 	if (crypto_rng_read(data, len))
92*03889d54SJorge Ramirez-Ortiz 		return kStatus_SSS_Fail;
93*03889d54SJorge Ramirez-Ortiz 
94*03889d54SJorge Ramirez-Ortiz 	return kStatus_SSS_Success;
95*03889d54SJorge Ramirez-Ortiz }
96