blob: 53b08485a1b0061c134fd35490a150bb835d94ee [file] [log] [blame]
Antonio de Angelis3a480992018-11-07 11:53:28 +00001/*
Antonio de Angelis04debbd2019-10-14 12:12:52 +01002 * Copyright (c) 2019-2020, Arm Limited. All rights reserved.
Antonio de Angelis3a480992018-11-07 11:53:28 +00003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
Jamie Fox0e54ebc2019-04-09 14:21:04 +01008#include <stddef.h>
9#include <stdint.h>
Antonio de Angelis4743e672019-04-11 11:38:48 +010010
Jamie Fox0e54ebc2019-04-09 14:21:04 +010011#include "tfm_mbedcrypto_include.h"
Antonio de Angelis3a480992018-11-07 11:53:28 +000012
Jamie Fox0e54ebc2019-04-09 14:21:04 +010013#include "tfm_crypto_api.h"
14#include "tfm_crypto_defs.h"
Soby Mathewd8abdfd2020-10-14 10:28:01 +010015#include "tfm_crypto_private.h"
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000016
Antonio de Angelis3a480992018-11-07 11:53:28 +000017/*!
18 * \defgroup public_psa Public functions, PSA
19 *
20 */
21
22/*!@{*/
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000023psa_status_t tfm_crypto_aead_encrypt(psa_invec in_vec[],
24 size_t in_len,
25 psa_outvec out_vec[],
26 size_t out_len)
Antonio de Angelis3a480992018-11-07 11:53:28 +000027{
Kevin Peng96f802e2019-12-26 16:10:25 +080028#ifdef TFM_CRYPTO_AEAD_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +010029 return PSA_ERROR_NOT_SUPPORTED;
30#else
Antonio de Angelis3a480992018-11-07 11:53:28 +000031 psa_status_t status = PSA_SUCCESS;
Antonio de Angelis3a480992018-11-07 11:53:28 +000032
Soby Mathewd8abdfd2020-10-14 10:28:01 +010033 CRYPTO_IN_OUT_LEN_VALIDATE(in_len, 1, 3, out_len, 0, 1);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000034
Antonio de Angelis4743e672019-04-11 11:38:48 +010035 if ((in_vec[0].len != sizeof(struct tfm_crypto_pack_iovec))) {
Soby Mathewc6e89362020-10-19 16:55:16 +010036 return PSA_ERROR_PROGRAMMER_ERROR;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000037 }
Soby Mathewd8abdfd2020-10-14 10:28:01 +010038
Antonio de Angelis4743e672019-04-11 11:38:48 +010039 const struct tfm_crypto_pack_iovec *iov = in_vec[0].base;
40 const struct tfm_crypto_aead_pack_input *aead_pack_input = &iov->aead_in;
Jamie Fox0e54ebc2019-04-09 14:21:04 +010041 psa_key_handle_t key_handle = iov->key_handle;
Antonio de Angelis4743e672019-04-11 11:38:48 +010042 psa_algorithm_t alg = iov->alg;
43 const uint8_t *nonce = aead_pack_input->nonce;
44 size_t nonce_length = aead_pack_input->nonce_length;
45 const uint8_t *plaintext = in_vec[1].base;
46 size_t plaintext_length = in_vec[1].len;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000047 uint8_t *ciphertext = out_vec[0].base;
48 size_t ciphertext_size = out_vec[0].len;
Soby Mathewd8abdfd2020-10-14 10:28:01 +010049 const uint8_t *additional_data = in_vec[2].base;
50 size_t additional_data_length = in_vec[2].len;
Antonio de Angelis4743e672019-04-11 11:38:48 +010051
Soby Mathewd8abdfd2020-10-14 10:28:01 +010052 /* Initialise ciphertext_length to zero. */
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000053 out_vec[0].len = 0;
Jamie Fox82b87ca2018-12-11 16:41:11 +000054
Antonio de Angelis60a6fe62019-06-18 15:27:34 +010055 status = tfm_crypto_check_handle_owner(key_handle, NULL);
56 if (status == PSA_SUCCESS) {
57
58 status = psa_aead_encrypt(key_handle, alg, nonce, nonce_length,
59 additional_data, additional_data_length,
60 plaintext, plaintext_length,
61 ciphertext, ciphertext_size, &out_vec[0].len);
62 }
63
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000064 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +010065#endif /* TFM_CRYPTO_AEAD_MODULE_DISABLED */
Antonio de Angelis3a480992018-11-07 11:53:28 +000066}
67
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000068psa_status_t tfm_crypto_aead_decrypt(psa_invec in_vec[],
69 size_t in_len,
70 psa_outvec out_vec[],
71 size_t out_len)
Antonio de Angelis3a480992018-11-07 11:53:28 +000072{
Kevin Peng96f802e2019-12-26 16:10:25 +080073#ifdef TFM_CRYPTO_AEAD_MODULE_DISABLED
Antonio de Angelis7740b382019-07-16 10:59:25 +010074 return PSA_ERROR_NOT_SUPPORTED;
75#else
Antonio de Angelis3a480992018-11-07 11:53:28 +000076 psa_status_t status = PSA_SUCCESS;
Antonio de Angelis3a480992018-11-07 11:53:28 +000077
Soby Mathewd8abdfd2020-10-14 10:28:01 +010078 CRYPTO_IN_OUT_LEN_VALIDATE(in_len, 1, 3, out_len, 0, 1);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000079
Antonio de Angelis4743e672019-04-11 11:38:48 +010080 if ((in_vec[0].len != sizeof(struct tfm_crypto_pack_iovec))) {
Soby Mathewc6e89362020-10-19 16:55:16 +010081 return PSA_ERROR_PROGRAMMER_ERROR;
Antonio de Angelis4743e672019-04-11 11:38:48 +010082 }
Soby Mathewd8abdfd2020-10-14 10:28:01 +010083
Antonio de Angelis4743e672019-04-11 11:38:48 +010084 const struct tfm_crypto_pack_iovec *iov = in_vec[0].base;
85 const struct tfm_crypto_aead_pack_input *aead_pack_input = &iov->aead_in;
Jamie Fox0e54ebc2019-04-09 14:21:04 +010086 psa_key_handle_t key_handle = iov->key_handle;
Antonio de Angelis4743e672019-04-11 11:38:48 +010087 psa_algorithm_t alg = iov->alg;
88 const uint8_t *nonce = aead_pack_input->nonce;
89 size_t nonce_length = aead_pack_input->nonce_length;
90 const uint8_t *ciphertext = in_vec[1].base;
91 size_t ciphertext_length = in_vec[1].len;
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000092 uint8_t *plaintext = out_vec[0].base;
93 size_t plaintext_size = out_vec[0].len;
Soby Mathewd8abdfd2020-10-14 10:28:01 +010094 const uint8_t *additional_data = in_vec[2].base;
95 size_t additional_data_length = in_vec[2].len;
Antonio de Angelis4743e672019-04-11 11:38:48 +010096
Soby Mathewd8abdfd2020-10-14 10:28:01 +010097 /* Initialise plaintext_length to zero. */
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000098 out_vec[0].len = 0;
Jamie Fox82b87ca2018-12-11 16:41:11 +000099
Antonio de Angelis60a6fe62019-06-18 15:27:34 +0100100 status = tfm_crypto_check_handle_owner(key_handle, NULL);
101 if (status == PSA_SUCCESS) {
102
103 status = psa_aead_decrypt(key_handle, alg, nonce, nonce_length,
104 additional_data, additional_data_length,
105 ciphertext, ciphertext_length,
106 plaintext, plaintext_size, &out_vec[0].len);
107 }
108
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000109 return status;
Antonio de Angelis7740b382019-07-16 10:59:25 +0100110#endif /* TFM_CRYPTO_AEAD_MODULE_DISABLED */
Antonio de Angelis3a480992018-11-07 11:53:28 +0000111}
Antonio de Angelis04debbd2019-10-14 12:12:52 +0100112
113psa_status_t tfm_crypto_aead_encrypt_setup(psa_invec in_vec[],
114 size_t in_len,
115 psa_outvec out_vec[],
116 size_t out_len)
117{
118 /* FixMe: To be implemented */
119 return PSA_ERROR_NOT_SUPPORTED;
120}
121
122psa_status_t tfm_crypto_aead_decrypt_setup(psa_invec in_vec[],
123 size_t in_len,
124 psa_outvec out_vec[],
125 size_t out_len)
126{
127 /* FixMe: To be implemented */
128 return PSA_ERROR_NOT_SUPPORTED;
129}
130
131psa_status_t tfm_crypto_aead_abort(psa_invec in_vec[],
132 size_t in_len,
133 psa_outvec out_vec[],
134 size_t out_len)
135{
136 /* FixMe: To be implemented */
137 return PSA_ERROR_NOT_SUPPORTED;
138}
139
140psa_status_t tfm_crypto_aead_finish(psa_invec in_vec[],
141 size_t in_len,
142 psa_outvec out_vec[],
143 size_t out_len)
144{
145 /* FixMe: To be implemented */
146 return PSA_ERROR_NOT_SUPPORTED;
147}
148
149psa_status_t tfm_crypto_aead_generate_nonce(psa_invec in_vec[],
150 size_t in_len,
151 psa_outvec out_vec[],
152 size_t out_len)
153{
154 /* FixMe: To be implemented */
155 return PSA_ERROR_NOT_SUPPORTED;
156}
157
158psa_status_t tfm_crypto_aead_set_nonce(psa_invec in_vec[],
159 size_t in_len,
160 psa_outvec out_vec[],
161 size_t out_len)
162{
163 /* FixMe: To be implemented */
164 return PSA_ERROR_NOT_SUPPORTED;
165}
166
167psa_status_t tfm_crypto_aead_set_lengths(psa_invec in_vec[],
168 size_t in_len,
169 psa_outvec out_vec[],
170 size_t out_len)
171{
172 /* FixMe: To be implemented */
173 return PSA_ERROR_NOT_SUPPORTED;
174}
175
176psa_status_t tfm_crypto_aead_update(psa_invec in_vec[],
177 size_t in_len,
178 psa_outvec out_vec[],
179 size_t out_len)
180{
181 /* FixMe: To be implemented */
182 return PSA_ERROR_NOT_SUPPORTED;
183}
184
185psa_status_t tfm_crypto_aead_update_ad(psa_invec in_vec[],
186 size_t in_len,
187 psa_outvec out_vec[],
188 size_t out_len)
189{
190 /* FixMe: To be implemented */
191 return PSA_ERROR_NOT_SUPPORTED;
192}
193
194psa_status_t tfm_crypto_aead_verify(psa_invec in_vec[],
195 size_t in_len,
196 psa_outvec out_vec[],
197 size_t out_len)
198{
199 /* FixMe: To be implemented */
200 return PSA_ERROR_NOT_SUPPORTED;
201}
Antonio de Angelis3a480992018-11-07 11:53:28 +0000202/*!@}*/