TF-M Reference Manual  1.2.0
TrustedFirmware-M
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
crypto_aead.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2019-2020, 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 "tfm_mbedcrypto_include.h"
12 
13 #include "tfm_crypto_api.h"
14 #include "tfm_crypto_defs.h"
15 #include "tfm_crypto_private.h"
16 
24  size_t in_len,
25  psa_outvec out_vec[],
26  size_t out_len)
27 {
28 #ifdef TFM_CRYPTO_AEAD_MODULE_DISABLED
30 #else
31  psa_status_t status = PSA_SUCCESS;
32 
33  CRYPTO_IN_OUT_LEN_VALIDATE(in_len, 1, 3, out_len, 0, 1);
34 
35  if ((in_vec[0].len != sizeof(struct tfm_crypto_pack_iovec))) {
37  }
38 
39  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;
41  psa_key_handle_t key_handle = iov->key_handle;
42  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;
47  uint8_t *ciphertext = out_vec[0].base;
48  size_t ciphertext_size = out_vec[0].len;
49  const uint8_t *additional_data = in_vec[2].base;
50  size_t additional_data_length = in_vec[2].len;
51 
52  /* Initialise ciphertext_length to zero. */
53  out_vec[0].len = 0;
54 
55  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 
64  return status;
65 #endif /* TFM_CRYPTO_AEAD_MODULE_DISABLED */
66 }
67 
69  size_t in_len,
70  psa_outvec out_vec[],
71  size_t out_len)
72 {
73 #ifdef TFM_CRYPTO_AEAD_MODULE_DISABLED
75 #else
76  psa_status_t status = PSA_SUCCESS;
77 
78  CRYPTO_IN_OUT_LEN_VALIDATE(in_len, 1, 3, out_len, 0, 1);
79 
80  if ((in_vec[0].len != sizeof(struct tfm_crypto_pack_iovec))) {
82  }
83 
84  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;
86  psa_key_handle_t key_handle = iov->key_handle;
87  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;
92  uint8_t *plaintext = out_vec[0].base;
93  size_t plaintext_size = out_vec[0].len;
94  const uint8_t *additional_data = in_vec[2].base;
95  size_t additional_data_length = in_vec[2].len;
96 
97  /* Initialise plaintext_length to zero. */
98  out_vec[0].len = 0;
99 
100  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 
109  return status;
110 #endif /* TFM_CRYPTO_AEAD_MODULE_DISABLED */
111 }
112 
114  size_t in_len,
115  psa_outvec out_vec[],
116  size_t out_len)
117 {
118  /* FixMe: To be implemented */
120 }
121 
123  size_t in_len,
124  psa_outvec out_vec[],
125  size_t out_len)
126 {
127  /* FixMe: To be implemented */
129 }
130 
132  size_t in_len,
133  psa_outvec out_vec[],
134  size_t out_len)
135 {
136  /* FixMe: To be implemented */
138 }
139 
141  size_t in_len,
142  psa_outvec out_vec[],
143  size_t out_len)
144 {
145  /* FixMe: To be implemented */
147 }
148 
150  size_t in_len,
151  psa_outvec out_vec[],
152  size_t out_len)
153 {
154  /* FixMe: To be implemented */
156 }
157 
159  size_t in_len,
160  psa_outvec out_vec[],
161  size_t out_len)
162 {
163  /* FixMe: To be implemented */
165 }
166 
168  size_t in_len,
169  psa_outvec out_vec[],
170  size_t out_len)
171 {
172  /* FixMe: To be implemented */
174 }
175 
177  size_t in_len,
178  psa_outvec out_vec[],
179  size_t out_len)
180 {
181  /* FixMe: To be implemented */
183 }
184 
186  size_t in_len,
187  psa_outvec out_vec[],
188  size_t out_len)
189 {
190  /* FixMe: To be implemented */
192 }
193 
195  size_t in_len,
196  psa_outvec out_vec[],
197  size_t out_len)
198 {
199  /* FixMe: To be implemented */
201 }
psa_status_t tfm_crypto_aead_encrypt(psa_invec in_vec[], size_t in_len, psa_outvec out_vec[], size_t out_len)
Definition: crypto_aead.c:23
psa_key_handle_t key_handle
psa_status_t tfm_crypto_check_handle_owner(psa_key_handle_t handle, uint32_t *index)
Checks that the requested handle belongs to the requesting partition.
Definition: crypto_key.c:86
Structure used to pack non-pointer types in a call.
psa_status_t tfm_crypto_aead_set_lengths(psa_invec in_vec[], size_t in_len, psa_outvec out_vec[], size_t out_len)
Definition: crypto_aead.c:167
void * base
Definition: client.h:75
psa_status_t tfm_crypto_aead_encrypt_setup(psa_invec in_vec[], size_t in_len, psa_outvec out_vec[], size_t out_len)
Definition: crypto_aead.c:113
psa_status_t tfm_crypto_aead_verify(psa_invec in_vec[], size_t in_len, psa_outvec out_vec[], size_t out_len)
Definition: crypto_aead.c:194
#define PSA_SUCCESS
Definition: crypto_values.h:35
#define psa_aead_encrypt
Definition: crypto_spe.h:49
size_t len
Definition: client.h:68
psa_algorithm_t alg
psa_status_t tfm_crypto_aead_decrypt(psa_invec in_vec[], size_t in_len, psa_outvec out_vec[], size_t out_len)
Definition: crypto_aead.c:68
psa_status_t tfm_crypto_aead_update_ad(psa_invec in_vec[], size_t in_len, psa_outvec out_vec[], size_t out_len)
Definition: crypto_aead.c:185
psa_status_t tfm_crypto_aead_generate_nonce(psa_invec in_vec[], size_t in_len, psa_outvec out_vec[], size_t out_len)
Definition: crypto_aead.c:149
psa_status_t tfm_crypto_aead_set_nonce(psa_invec in_vec[], size_t in_len, psa_outvec out_vec[], size_t out_len)
Definition: crypto_aead.c:158
psa_status_t tfm_crypto_aead_finish(psa_invec in_vec[], size_t in_len, psa_outvec out_vec[], size_t out_len)
Definition: crypto_aead.c:140
uint32_t psa_algorithm_t
Encoding of a cryptographic algorithm.
Definition: crypto_types.h:90
struct tfm_crypto_aead_pack_input aead_in
#define CRYPTO_IN_OUT_LEN_VALIDATE(in_len, in_min, in_max, out_len, out_min, out_max)
psa_status_t tfm_crypto_aead_decrypt_setup(psa_invec in_vec[], size_t in_len, psa_outvec out_vec[], size_t out_len)
Definition: crypto_aead.c:122
#define PSA_ERROR_PROGRAMMER_ERROR
Definition: error.h:32
_unsigned_integral_type_ psa_key_handle_t
Key handle.
Definition: crypto.h:35
#define PSA_ERROR_NOT_SUPPORTED
Definition: crypto_values.h:52
size_t len
Definition: client.h:76
psa_status_t tfm_crypto_aead_update(psa_invec in_vec[], size_t in_len, psa_outvec out_vec[], size_t out_len)
Definition: crypto_aead.c:176
const void * base
Definition: client.h:67
psa_status_t tfm_crypto_aead_abort(psa_invec in_vec[], size_t in_len, psa_outvec out_vec[], size_t out_len)
Definition: crypto_aead.c:131
int32_t psa_status_t
Function return status.
Definition: crypto_types.h:43
#define psa_aead_decrypt
Definition: crypto_spe.h:51