blob: 9db50615194c7e35225946afe096e5a8845d1b12 [file] [log] [blame]
Steven Cooreman37941cb2020-07-28 18:49:51 +02001/*
2 * Test driver for cipher functions.
3 * Currently only supports multi-part operations using AES-CTR.
4 */
5/* Copyright (C) 2020, ARM Limited, All Rights Reserved
6 * SPDX-License-Identifier: Apache-2.0
7 *
8 * Licensed under the Apache License, Version 2.0 (the "License"); you may
9 * not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
16 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 *
20 * This file is part of mbed TLS (https://tls.mbed.org)
21 */
22
23#if !defined(MBEDTLS_CONFIG_FILE)
24#include "mbedtls/config.h"
25#else
26#include MBEDTLS_CONFIG_FILE
27#endif
28
29#if defined(MBEDTLS_PSA_CRYPTO_DRIVERS) && defined(PSA_CRYPTO_DRIVER_TEST)
30#include "psa/crypto.h"
31#include "mbedtls/cipher.h"
32
33#include "drivers/cipher.h"
34
35#include "test/random.h"
36
37#include <string.h>
38
39/* If non-null, on success, copy this to the output. */
40void *test_driver_cipher_forced_output = NULL;
41size_t test_driver_cipher_forced_output_length = 0;
42
Steven Cooremand3feccd2020-09-01 15:56:14 +020043/* Test driver, if not explicitly setup, returns 'PSA_ERROR_NOT_SUPPORTED' by default,
44 * causing regular test suites to pass since the core will go into fallback mode. */
Steven Cooreman37941cb2020-07-28 18:49:51 +020045psa_status_t test_transparent_cipher_status = PSA_ERROR_NOT_SUPPORTED;
46unsigned long test_transparent_cipher_hit = 0;
47
48psa_status_t test_transparent_cipher_encrypt(
49 const psa_key_attributes_t *attributes,
50 const uint8_t *key, size_t key_length,
51 psa_algorithm_t alg,
52 const uint8_t *input, size_t input_length,
53 uint8_t *output, size_t output_size, size_t *output_length)
54{
55 (void) attributes;
56 (void) key;
57 (void) key_length;
58 (void) alg;
59 (void) input;
60 (void) input_length;
61 test_transparent_cipher_hit++;
62
63 if( test_transparent_cipher_status != PSA_SUCCESS )
64 return test_transparent_cipher_status;
65 if( output_size < test_driver_cipher_forced_output_length )
66 return PSA_ERROR_BUFFER_TOO_SMALL;
67
68 memcpy(output, test_driver_cipher_forced_output, test_driver_cipher_forced_output_length);
69 *output_length = test_driver_cipher_forced_output_length;
70
71 return test_transparent_cipher_status;
72}
73
74psa_status_t test_transparent_cipher_decrypt(
75 const psa_key_attributes_t *attributes,
76 const uint8_t *key, size_t key_length,
77 psa_algorithm_t alg,
78 const uint8_t *input, size_t input_length,
79 uint8_t *output, size_t output_size, size_t *output_length)
80{
81 (void) attributes;
82 (void) key;
83 (void) key_length;
84 (void) alg;
85 (void) input;
86 (void) input_length;
87 test_transparent_cipher_hit++;
88
89 if( test_transparent_cipher_status != PSA_SUCCESS )
90 return test_transparent_cipher_status;
91 if( output_size < test_driver_cipher_forced_output_length )
92 return PSA_ERROR_BUFFER_TOO_SMALL;
93
94 memcpy(output, test_driver_cipher_forced_output, test_driver_cipher_forced_output_length);
95 *output_length = test_driver_cipher_forced_output_length;
96
97 return test_transparent_cipher_status;
98}
99
100psa_status_t test_transparent_cipher_encrypt_setup(
101 test_transparent_cipher_operation_t *operation,
102 const psa_key_attributes_t *attributes,
103 const uint8_t *key, size_t key_length,
104 psa_algorithm_t alg)
105{
106 (void) attributes;
107 (void) key;
108 (void) key_length;
109 (void) alg;
110
111 /* write our struct, this will trigger memory corruption failures
112 * in test when we go outside of bounds. */
113 memset(operation, 0, sizeof(test_transparent_cipher_operation_t));
114
115 test_transparent_cipher_hit++;
116 return test_transparent_cipher_status;
117}
118
119psa_status_t test_transparent_cipher_decrypt_setup(
120 test_transparent_cipher_operation_t *operation,
121 const psa_key_attributes_t *attributes,
122 const uint8_t *key, size_t key_length,
123 psa_algorithm_t alg)
124{
125 (void) attributes;
126 (void) key;
127 (void) key_length;
128 (void) alg;
129
130 /* write our struct, this will trigger memory corruption failures
131 * in test when we go outside of bounds. */
132 memset(operation, 0, sizeof(test_transparent_cipher_operation_t));
133
134 test_transparent_cipher_hit++;
135 return test_transparent_cipher_status;
136}
137
138psa_status_t test_transparent_cipher_abort(
139 test_transparent_cipher_operation_t *operation)
140{
141 /* write our struct, this will trigger memory corruption failures
142 * in test when we go outside of bounds. */
143 memset(operation, 0, sizeof(test_transparent_cipher_operation_t));
144
145 test_transparent_cipher_hit++;
146 return test_transparent_cipher_status;
147}
148
149psa_status_t test_transparent_cipher_generate_iv(
150 test_transparent_cipher_operation_t *operation,
151 uint8_t *iv,
152 size_t iv_size,
153 size_t *iv_length)
154{
155 (void) operation;
156 (void) iv;
157 (void) iv_size;
158 (void) iv_length;
159
160 test_transparent_cipher_hit++;
161 return test_transparent_cipher_status;
162}
163
164psa_status_t test_transparent_cipher_set_iv(
165 test_transparent_cipher_operation_t *operation,
166 const uint8_t *iv,
167 size_t iv_length)
168{
169 (void) operation;
170 (void) iv;
171 (void) iv_length;
172
173 test_transparent_cipher_hit++;
174 return test_transparent_cipher_status;
175}
176
177psa_status_t test_transparent_cipher_update(
178 test_transparent_cipher_operation_t *operation,
179 const uint8_t *input,
180 size_t input_length,
181 uint8_t *output,
182 size_t output_size,
183 size_t *output_length)
184{
185 (void) operation;
186 (void) input;
187 (void) input_length;
188 test_transparent_cipher_hit++;
189
190 if( test_transparent_cipher_status != PSA_SUCCESS )
191 return test_transparent_cipher_status;
192 if( output_size < test_driver_cipher_forced_output_length )
193 return PSA_ERROR_BUFFER_TOO_SMALL;
194
195 memcpy(output, test_driver_cipher_forced_output, test_driver_cipher_forced_output_length);
196 *output_length = test_driver_cipher_forced_output_length;
197
198 return test_transparent_cipher_status;
199}
200
201psa_status_t test_transparent_cipher_finish(
202 test_transparent_cipher_operation_t *operation,
203 uint8_t *output,
204 size_t output_size,
205 size_t *output_length)
206{
207 (void) operation;
208 test_transparent_cipher_hit++;
209
210 if( test_transparent_cipher_status != PSA_SUCCESS )
211 return test_transparent_cipher_status;
212 if( output_size < test_driver_cipher_forced_output_length )
213 return PSA_ERROR_BUFFER_TOO_SMALL;
214
215 memcpy(output, test_driver_cipher_forced_output, test_driver_cipher_forced_output_length);
216 *output_length = test_driver_cipher_forced_output_length;
217
218 return test_transparent_cipher_status;
219}
220
221/*
222 * opaque versions, to do
223 */
224psa_status_t test_opaque_cipher_encrypt(
225 const psa_key_attributes_t *attributes,
226 const uint8_t *key, size_t key_length,
227 psa_algorithm_t alg,
228 const uint8_t *input, size_t input_length,
229 uint8_t *output, size_t output_size, size_t *output_length)
230{
231 (void) attributes;
232 (void) key;
233 (void) key_length;
234 (void) alg;
235 (void) input;
236 (void) input_length;
237 (void) output;
238 (void) output_size;
239 (void) output_length;
240 return PSA_ERROR_NOT_SUPPORTED;
241}
242
243psa_status_t test_opaque_cipher_decrypt(
244 const psa_key_attributes_t *attributes,
245 const uint8_t *key, size_t key_length,
246 psa_algorithm_t alg,
247 const uint8_t *input, size_t input_length,
248 uint8_t *output, size_t output_size, size_t *output_length)
249{
250 (void) attributes;
251 (void) key;
252 (void) key_length;
253 (void) alg;
254 (void) input;
255 (void) input_length;
256 (void) output;
257 (void) output_size;
258 (void) output_length;
259 return PSA_ERROR_NOT_SUPPORTED;
260}
261
262psa_status_t test_opaque_cipher_encrypt_setup(
263 test_opaque_cipher_operation_t *operation,
264 const psa_key_attributes_t *attributes,
265 const uint8_t *key, size_t key_length,
266 psa_algorithm_t alg)
267{
268 (void) operation;
269 (void) attributes;
270 (void) key;
271 (void) key_length;
272 (void) alg;
273 return PSA_ERROR_NOT_SUPPORTED;
274}
275
276psa_status_t test_opaque_cipher_decrypt_setup(
277 test_opaque_cipher_operation_t *operation,
278 const psa_key_attributes_t *attributes,
279 const uint8_t *key, size_t key_length,
280 psa_algorithm_t alg)
281{
282 (void) operation;
283 (void) attributes;
284 (void) key;
285 (void) key_length;
286 (void) alg;
287 return PSA_ERROR_NOT_SUPPORTED;
288}
289
290psa_status_t test_opaque_cipher_abort(
291 test_opaque_cipher_operation_t *operation)
292{
293 (void) operation;
294 return PSA_ERROR_NOT_SUPPORTED;
295}
296
297psa_status_t test_opaque_cipher_generate_iv(
298 test_opaque_cipher_operation_t *operation,
299 uint8_t *iv,
300 size_t iv_size,
301 size_t *iv_length)
302{
303 (void) operation;
304 (void) iv;
305 (void) iv_size;
306 (void) iv_length;
307 return PSA_ERROR_NOT_SUPPORTED;
308}
309
310psa_status_t test_opaque_cipher_set_iv(
311 test_opaque_cipher_operation_t *operation,
312 const uint8_t *iv,
313 size_t iv_length)
314{
315 (void) operation;
316 (void) iv;
317 (void) iv_length;
318 return PSA_ERROR_NOT_SUPPORTED;
319}
320
321psa_status_t test_opaque_cipher_update(
322 test_opaque_cipher_operation_t *operation,
323 const uint8_t *input,
324 size_t input_length,
325 uint8_t *output,
326 size_t output_size,
327 size_t *output_length)
328{
329 (void) operation;
330 (void) input;
331 (void) input_length;
332 (void) output;
333 (void) output_size;
334 (void) output_length;
335 return PSA_ERROR_NOT_SUPPORTED;
336}
337
338psa_status_t test_opaque_cipher_finish(
339 test_opaque_cipher_operation_t *operation,
340 uint8_t *output,
341 size_t output_size,
342 size_t *output_length)
343{
344 (void) operation;
345 (void) output;
346 (void) output_size;
347 (void) output_length;
348 return PSA_ERROR_NOT_SUPPORTED;
349}
350#endif /* MBEDTLS_PSA_CRYPTO_DRIVERS && PSA_CRYPTO_DRIVER_TEST */