1 /*
2  * Copyright (c) 2019-2022, Arm Limited. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #include <stddef.h>
9 #include <stdint.h>
10 
11 #include "config_tfm.h"
12 #include "tfm_mbedcrypto_include.h"
13 
14 #include "tfm_crypto_api.h"
15 #include "tfm_crypto_key.h"
16 #include "tfm_crypto_defs.h"
17 
18 #include "crypto_library.h"
19 
20 /*!
21  * \addtogroup tfm_crypto_api_shim_layer
22  *
23  */
24 
25 /*!@{*/
26 #if CRYPTO_ASYM_SIGN_MODULE_ENABLED
tfm_crypto_asymmetric_sign_interface(psa_invec in_vec[],psa_outvec out_vec[],struct tfm_crypto_key_id_s * encoded_key)27 psa_status_t tfm_crypto_asymmetric_sign_interface(psa_invec in_vec[],
28                                                   psa_outvec out_vec[],
29                                                   struct tfm_crypto_key_id_s *encoded_key)
30 {
31     const struct tfm_crypto_pack_iovec *iov = in_vec[0].base;
32     psa_status_t status = PSA_ERROR_NOT_SUPPORTED;
33 
34     tfm_crypto_library_key_id_t library_key = tfm_crypto_library_key_id_init(
35                                                   encoded_key->owner, encoded_key->key_id);
36     switch (iov->function_id) {
37     case TFM_CRYPTO_ASYMMETRIC_SIGN_MESSAGE_SID:
38     {
39         const uint8_t *input = in_vec[1].base;
40         size_t input_length = in_vec[1].len;
41         uint8_t *signature = out_vec[0].base;
42         size_t signature_size = out_vec[0].len;
43 
44         status = psa_sign_message(library_key, iov->alg, input, input_length,
45                                   signature, signature_size, &(out_vec[0].len));
46         if (status != PSA_SUCCESS) {
47             out_vec[0].len = 0;
48         }
49         return status;
50     }
51     case TFM_CRYPTO_ASYMMETRIC_VERIFY_MESSAGE_SID:
52     {
53         const uint8_t *input = in_vec[1].base;
54         size_t input_length = in_vec[1].len;
55         const uint8_t *signature = in_vec[2].base;
56         size_t signature_length = in_vec[2].len;
57 
58         return psa_verify_message(library_key, iov->alg, input, input_length,
59                                   signature, signature_length);
60     }
61     case TFM_CRYPTO_ASYMMETRIC_SIGN_HASH_SID:
62     {
63         const uint8_t *hash = in_vec[1].base;
64         size_t hash_length = in_vec[1].len;
65         uint8_t *signature = out_vec[0].base;
66         size_t signature_size = out_vec[0].len;
67 
68         status = psa_sign_hash(library_key, iov->alg, hash, hash_length,
69                                signature, signature_size, &(out_vec[0].len));
70         if (status != PSA_SUCCESS) {
71             out_vec[0].len = 0;
72         }
73         return status;
74     }
75     case TFM_CRYPTO_ASYMMETRIC_VERIFY_HASH_SID:
76     {
77         const uint8_t *hash = in_vec[1].base;
78         size_t hash_length = in_vec[1].len;
79         const uint8_t *signature = in_vec[2].base;
80         size_t signature_length = in_vec[2].len;
81 
82         return psa_verify_hash(library_key, iov->alg, hash, hash_length,
83                                signature, signature_length);
84     }
85     default:
86         return PSA_ERROR_NOT_SUPPORTED;
87     }
88 }
89 #else /* CRYPTO_ASYM_SIGN_MODULE_ENABLED */
tfm_crypto_asymmetric_sign_interface(psa_invec in_vec[],psa_outvec out_vec[],struct tfm_crypto_key_id_s * encoded_key)90 psa_status_t tfm_crypto_asymmetric_sign_interface(psa_invec in_vec[],
91                                                   psa_outvec out_vec[],
92                                                   struct tfm_crypto_key_id_s *encoded_key)
93 {
94     (void)in_vec;
95     (void)out_vec;
96     (void)encoded_key;
97 
98     return PSA_ERROR_NOT_SUPPORTED;
99 }
100 #endif /* CRYPTO_ASYM_SIGN_MODULE_ENABLED */
101 
102 #if CRYPTO_ASYM_ENCRYPT_MODULE_ENABLED
tfm_crypto_asymmetric_encrypt_interface(psa_invec in_vec[],psa_outvec out_vec[],struct tfm_crypto_key_id_s * encoded_key)103 psa_status_t tfm_crypto_asymmetric_encrypt_interface(psa_invec in_vec[],
104                                                      psa_outvec out_vec[],
105                                                      struct tfm_crypto_key_id_s *encoded_key)
106 {
107     const struct tfm_crypto_pack_iovec *iov = in_vec[0].base;
108     psa_status_t status = PSA_ERROR_NOT_SUPPORTED;
109 
110     tfm_crypto_library_key_id_t library_key = tfm_crypto_library_key_id_init(
111                                                   encoded_key->owner, encoded_key->key_id);
112     switch (iov->function_id) {
113     case TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID:
114     {
115         const uint8_t *input = in_vec[1].base;
116         size_t input_length = in_vec[1].len;
117         const uint8_t *salt = in_vec[2].base;
118         size_t salt_length = in_vec[2].len;
119         uint8_t *output = out_vec[0].base;
120         size_t output_size = out_vec[0].len;
121 
122         status = psa_asymmetric_encrypt(library_key, iov->alg,
123                                         input, input_length,
124                                         salt, salt_length,
125                                         output, output_size,
126                                         &(out_vec[0].len));
127         if (status != PSA_SUCCESS) {
128             out_vec[0].len = 0;
129         }
130         return status;
131     }
132     case TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID:
133     {
134         const uint8_t *input = in_vec[1].base;
135         size_t input_length = in_vec[1].len;
136         const uint8_t *salt = in_vec[2].base;
137         size_t salt_length = in_vec[2].len;
138         uint8_t *output = out_vec[0].base;
139         size_t output_size = out_vec[0].len;
140 
141         status = psa_asymmetric_decrypt(library_key, iov->alg,
142                                         input, input_length,
143                                         salt, salt_length,
144                                         output, output_size,
145                                         &(out_vec[0].len));
146         if (status != PSA_SUCCESS) {
147             out_vec[0].len = 0;
148         }
149         return status;
150     }
151     default:
152         return PSA_ERROR_NOT_SUPPORTED;
153     }
154 }
155 #else /* CRYPTO_ASYM_ENCRYPT_MODULE_ENABLED */
tfm_crypto_asymmetric_encrypt_interface(psa_invec in_vec[],psa_outvec out_vec[],struct tfm_crypto_key_id_s * encoded_key)156 psa_status_t tfm_crypto_asymmetric_encrypt_interface(psa_invec in_vec[],
157                                                      psa_outvec out_vec[],
158                                                      struct tfm_crypto_key_id_s *encoded_key)
159 {
160     (void)in_vec;
161     (void)out_vec;
162     (void)encoded_key;
163 
164     return PSA_ERROR_NOT_SUPPORTED;
165 }
166 #endif /* CRYPTO_ASYM_ENCRYPT_MODULE_ENABLED */
167 /*!@}*/
168