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