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