1 /*
2 * Test driver for cipher functions.
3 * Currently only supports multi-part operations using AES-CTR.
4 */
5 /* Copyright The Mbed TLS Contributors
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
21 #include <test/helpers.h>
22
23 #if defined(MBEDTLS_PSA_CRYPTO_DRIVERS) && defined(PSA_CRYPTO_DRIVER_TEST)
24 #include "psa/crypto.h"
25 #include "psa_crypto_cipher.h"
26 #include "psa_crypto_core.h"
27 #include "mbedtls/cipher.h"
28
29 #include "test/drivers/cipher.h"
30
31 #include "test/random.h"
32
33 #if defined(MBEDTLS_TEST_LIBTESTDRIVER1)
34 #include "libtestdriver1/library/psa_crypto_cipher.h"
35 #endif
36
37 #include <string.h>
38
39 mbedtls_test_driver_cipher_hooks_t mbedtls_test_driver_cipher_hooks =
40 MBEDTLS_TEST_DRIVER_CIPHER_INIT;
41
mbedtls_test_transparent_cipher_encrypt(const psa_key_attributes_t * attributes,const uint8_t * key_buffer,size_t key_buffer_size,psa_algorithm_t alg,const uint8_t * iv,size_t iv_length,const uint8_t * input,size_t input_length,uint8_t * output,size_t output_size,size_t * output_length)42 psa_status_t mbedtls_test_transparent_cipher_encrypt(
43 const psa_key_attributes_t *attributes,
44 const uint8_t *key_buffer,
45 size_t key_buffer_size,
46 psa_algorithm_t alg,
47 const uint8_t *iv,
48 size_t iv_length,
49 const uint8_t *input,
50 size_t input_length,
51 uint8_t *output,
52 size_t output_size,
53 size_t *output_length)
54 {
55 mbedtls_test_driver_cipher_hooks.hits++;
56
57 if (mbedtls_test_driver_cipher_hooks.forced_output != NULL) {
58 if (output_size < mbedtls_test_driver_cipher_hooks.forced_output_length) {
59 return PSA_ERROR_BUFFER_TOO_SMALL;
60 }
61
62 memcpy(output,
63 mbedtls_test_driver_cipher_hooks.forced_output,
64 mbedtls_test_driver_cipher_hooks.forced_output_length);
65 *output_length = mbedtls_test_driver_cipher_hooks.forced_output_length;
66
67 return mbedtls_test_driver_cipher_hooks.forced_status;
68 }
69
70 if (mbedtls_test_driver_cipher_hooks.forced_status != PSA_SUCCESS) {
71 return mbedtls_test_driver_cipher_hooks.forced_status;
72 }
73
74 #if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \
75 defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_CIPHER)
76 return libtestdriver1_mbedtls_psa_cipher_encrypt(
77 (const libtestdriver1_psa_key_attributes_t *) attributes,
78 key_buffer, key_buffer_size,
79 alg, iv, iv_length, input, input_length,
80 output, output_size, output_length);
81 #elif defined(MBEDTLS_PSA_BUILTIN_CIPHER)
82 return mbedtls_psa_cipher_encrypt(
83 attributes, key_buffer, key_buffer_size,
84 alg, iv, iv_length, input, input_length,
85 output, output_size, output_length);
86 #endif
87
88 return PSA_ERROR_NOT_SUPPORTED;
89 }
90
mbedtls_test_transparent_cipher_decrypt(const psa_key_attributes_t * attributes,const uint8_t * key_buffer,size_t key_buffer_size,psa_algorithm_t alg,const uint8_t * input,size_t input_length,uint8_t * output,size_t output_size,size_t * output_length)91 psa_status_t mbedtls_test_transparent_cipher_decrypt(
92 const psa_key_attributes_t *attributes,
93 const uint8_t *key_buffer,
94 size_t key_buffer_size,
95 psa_algorithm_t alg,
96 const uint8_t *input,
97 size_t input_length,
98 uint8_t *output,
99 size_t output_size,
100 size_t *output_length)
101 {
102 mbedtls_test_driver_cipher_hooks.hits++;
103
104 if (mbedtls_test_driver_cipher_hooks.forced_output != NULL) {
105 if (output_size < mbedtls_test_driver_cipher_hooks.forced_output_length) {
106 return PSA_ERROR_BUFFER_TOO_SMALL;
107 }
108
109 memcpy(output,
110 mbedtls_test_driver_cipher_hooks.forced_output,
111 mbedtls_test_driver_cipher_hooks.forced_output_length);
112 *output_length = mbedtls_test_driver_cipher_hooks.forced_output_length;
113
114 return mbedtls_test_driver_cipher_hooks.forced_status;
115 }
116
117 if (mbedtls_test_driver_cipher_hooks.forced_status != PSA_SUCCESS) {
118 return mbedtls_test_driver_cipher_hooks.forced_status;
119 }
120
121 #if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \
122 defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_CIPHER)
123 return libtestdriver1_mbedtls_psa_cipher_decrypt(
124 (const libtestdriver1_psa_key_attributes_t *) attributes,
125 key_buffer, key_buffer_size,
126 alg, input, input_length,
127 output, output_size, output_length);
128 #elif defined(MBEDTLS_PSA_BUILTIN_CIPHER)
129 return mbedtls_psa_cipher_decrypt(
130 attributes, key_buffer, key_buffer_size,
131 alg, input, input_length,
132 output, output_size, output_length);
133 #endif
134
135 return PSA_ERROR_NOT_SUPPORTED;
136 }
137
mbedtls_test_transparent_cipher_encrypt_setup(mbedtls_transparent_test_driver_cipher_operation_t * operation,const psa_key_attributes_t * attributes,const uint8_t * key,size_t key_length,psa_algorithm_t alg)138 psa_status_t mbedtls_test_transparent_cipher_encrypt_setup(
139 mbedtls_transparent_test_driver_cipher_operation_t *operation,
140 const psa_key_attributes_t *attributes,
141 const uint8_t *key, size_t key_length,
142 psa_algorithm_t alg)
143 {
144 mbedtls_test_driver_cipher_hooks.hits++;
145
146 /* Wiping the entire struct here, instead of member-by-member. This is
147 * useful for the test suite, since it gives a chance of catching memory
148 * corruption errors should the core not have allocated (enough) memory for
149 * our context struct. */
150 memset(operation, 0, sizeof(*operation));
151
152 if (mbedtls_test_driver_cipher_hooks.forced_status != PSA_SUCCESS) {
153 return mbedtls_test_driver_cipher_hooks.forced_status;
154 }
155
156 #if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \
157 defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_CIPHER)
158 return libtestdriver1_mbedtls_psa_cipher_encrypt_setup(
159 operation,
160 (const libtestdriver1_psa_key_attributes_t *) attributes,
161 key, key_length, alg);
162 #elif defined(MBEDTLS_PSA_BUILTIN_CIPHER)
163 return mbedtls_psa_cipher_encrypt_setup(
164 operation, attributes, key, key_length, alg);
165 #endif
166
167 return PSA_ERROR_NOT_SUPPORTED;
168 }
169
mbedtls_test_transparent_cipher_decrypt_setup(mbedtls_transparent_test_driver_cipher_operation_t * operation,const psa_key_attributes_t * attributes,const uint8_t * key,size_t key_length,psa_algorithm_t alg)170 psa_status_t mbedtls_test_transparent_cipher_decrypt_setup(
171 mbedtls_transparent_test_driver_cipher_operation_t *operation,
172 const psa_key_attributes_t *attributes,
173 const uint8_t *key, size_t key_length,
174 psa_algorithm_t alg)
175 {
176 mbedtls_test_driver_cipher_hooks.hits++;
177
178 if (mbedtls_test_driver_cipher_hooks.forced_status != PSA_SUCCESS) {
179 return mbedtls_test_driver_cipher_hooks.forced_status;
180 }
181
182 #if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \
183 defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_CIPHER)
184 return libtestdriver1_mbedtls_psa_cipher_decrypt_setup(
185 operation,
186 (const libtestdriver1_psa_key_attributes_t *) attributes,
187 key, key_length, alg);
188 #elif defined(MBEDTLS_PSA_BUILTIN_CIPHER)
189 return mbedtls_psa_cipher_decrypt_setup(
190 operation, attributes, key, key_length, alg);
191 #endif
192
193 return PSA_ERROR_NOT_SUPPORTED;
194 }
195
mbedtls_test_transparent_cipher_abort(mbedtls_transparent_test_driver_cipher_operation_t * operation)196 psa_status_t mbedtls_test_transparent_cipher_abort(
197 mbedtls_transparent_test_driver_cipher_operation_t *operation)
198 {
199 mbedtls_test_driver_cipher_hooks.hits++;
200
201 #if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \
202 defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_CIPHER)
203 libtestdriver1_mbedtls_psa_cipher_abort(operation);
204 #elif defined(MBEDTLS_PSA_BUILTIN_CIPHER)
205 mbedtls_psa_cipher_abort(operation);
206 #endif
207
208 /* Wiping the entire struct here, instead of member-by-member. This is
209 * useful for the test suite, since it gives a chance of catching memory
210 * corruption errors should the core not have allocated (enough) memory for
211 * our context struct. */
212 memset(operation, 0, sizeof(*operation));
213
214 return mbedtls_test_driver_cipher_hooks.forced_status;
215 }
216
mbedtls_test_transparent_cipher_set_iv(mbedtls_transparent_test_driver_cipher_operation_t * operation,const uint8_t * iv,size_t iv_length)217 psa_status_t mbedtls_test_transparent_cipher_set_iv(
218 mbedtls_transparent_test_driver_cipher_operation_t *operation,
219 const uint8_t *iv,
220 size_t iv_length)
221 {
222 mbedtls_test_driver_cipher_hooks.hits++;
223
224 if (mbedtls_test_driver_cipher_hooks.forced_status != PSA_SUCCESS) {
225 return mbedtls_test_driver_cipher_hooks.forced_status;
226 }
227
228 #if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \
229 defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_CIPHER)
230 return libtestdriver1_mbedtls_psa_cipher_set_iv(
231 operation, iv, iv_length);
232 #elif defined(MBEDTLS_PSA_BUILTIN_CIPHER)
233 return mbedtls_psa_cipher_set_iv(operation, iv, iv_length);
234 #endif
235
236 return PSA_ERROR_NOT_SUPPORTED;
237 }
238
mbedtls_test_transparent_cipher_update(mbedtls_transparent_test_driver_cipher_operation_t * operation,const uint8_t * input,size_t input_length,uint8_t * output,size_t output_size,size_t * output_length)239 psa_status_t mbedtls_test_transparent_cipher_update(
240 mbedtls_transparent_test_driver_cipher_operation_t *operation,
241 const uint8_t *input,
242 size_t input_length,
243 uint8_t *output,
244 size_t output_size,
245 size_t *output_length)
246 {
247 mbedtls_test_driver_cipher_hooks.hits++;
248
249 if (mbedtls_test_driver_cipher_hooks.forced_output != NULL) {
250 if (output_size < mbedtls_test_driver_cipher_hooks.forced_output_length) {
251 return PSA_ERROR_BUFFER_TOO_SMALL;
252 }
253
254 memcpy(output,
255 mbedtls_test_driver_cipher_hooks.forced_output,
256 mbedtls_test_driver_cipher_hooks.forced_output_length);
257 *output_length = mbedtls_test_driver_cipher_hooks.forced_output_length;
258
259 return mbedtls_test_driver_cipher_hooks.forced_status;
260 }
261
262 if (mbedtls_test_driver_cipher_hooks.forced_status != PSA_SUCCESS) {
263 return mbedtls_test_driver_cipher_hooks.forced_status;
264 }
265
266 #if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \
267 defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_CIPHER)
268 return libtestdriver1_mbedtls_psa_cipher_update(
269 operation, input, input_length,
270 output, output_size, output_length);
271 #elif defined(MBEDTLS_PSA_BUILTIN_CIPHER)
272 return mbedtls_psa_cipher_update(
273 operation, input, input_length,
274 output, output_size, output_length);
275 #endif
276
277 return PSA_ERROR_NOT_SUPPORTED;
278 }
279
mbedtls_test_transparent_cipher_finish(mbedtls_transparent_test_driver_cipher_operation_t * operation,uint8_t * output,size_t output_size,size_t * output_length)280 psa_status_t mbedtls_test_transparent_cipher_finish(
281 mbedtls_transparent_test_driver_cipher_operation_t *operation,
282 uint8_t *output,
283 size_t output_size,
284 size_t *output_length)
285 {
286 mbedtls_test_driver_cipher_hooks.hits++;
287
288 if (mbedtls_test_driver_cipher_hooks.forced_output != NULL) {
289 if (output_size < mbedtls_test_driver_cipher_hooks.forced_output_length) {
290 return PSA_ERROR_BUFFER_TOO_SMALL;
291 }
292
293 memcpy(output,
294 mbedtls_test_driver_cipher_hooks.forced_output,
295 mbedtls_test_driver_cipher_hooks.forced_output_length);
296 *output_length = mbedtls_test_driver_cipher_hooks.forced_output_length;
297
298 return mbedtls_test_driver_cipher_hooks.forced_status;
299 }
300
301 if (mbedtls_test_driver_cipher_hooks.forced_status != PSA_SUCCESS) {
302 return mbedtls_test_driver_cipher_hooks.forced_status;
303 }
304
305 #if defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \
306 defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_CIPHER)
307 return libtestdriver1_mbedtls_psa_cipher_finish(
308 operation, output, output_size, output_length);
309 #elif defined(MBEDTLS_PSA_BUILTIN_CIPHER)
310 return mbedtls_psa_cipher_finish(
311 operation, output, output_size, output_length);
312 #endif
313
314 return PSA_ERROR_NOT_SUPPORTED;
315 }
316
317 /*
318 * opaque versions, to do
319 */
mbedtls_test_opaque_cipher_encrypt(const psa_key_attributes_t * attributes,const uint8_t * key,size_t key_length,psa_algorithm_t alg,const uint8_t * iv,size_t iv_length,const uint8_t * input,size_t input_length,uint8_t * output,size_t output_size,size_t * output_length)320 psa_status_t mbedtls_test_opaque_cipher_encrypt(
321 const psa_key_attributes_t *attributes,
322 const uint8_t *key, size_t key_length,
323 psa_algorithm_t alg,
324 const uint8_t *iv, size_t iv_length,
325 const uint8_t *input, size_t input_length,
326 uint8_t *output, size_t output_size, size_t *output_length)
327 {
328 (void) attributes;
329 (void) key;
330 (void) key_length;
331 (void) alg;
332 (void) iv;
333 (void) iv_length;
334 (void) input;
335 (void) input_length;
336 (void) output;
337 (void) output_size;
338 (void) output_length;
339 return PSA_ERROR_NOT_SUPPORTED;
340 }
341
mbedtls_test_opaque_cipher_decrypt(const psa_key_attributes_t * attributes,const uint8_t * key,size_t key_length,psa_algorithm_t alg,const uint8_t * input,size_t input_length,uint8_t * output,size_t output_size,size_t * output_length)342 psa_status_t mbedtls_test_opaque_cipher_decrypt(
343 const psa_key_attributes_t *attributes,
344 const uint8_t *key, size_t key_length,
345 psa_algorithm_t alg,
346 const uint8_t *input, size_t input_length,
347 uint8_t *output, size_t output_size, size_t *output_length)
348 {
349 (void) attributes;
350 (void) key;
351 (void) key_length;
352 (void) alg;
353 (void) input;
354 (void) input_length;
355 (void) output;
356 (void) output_size;
357 (void) output_length;
358 return PSA_ERROR_NOT_SUPPORTED;
359 }
360
mbedtls_test_opaque_cipher_encrypt_setup(mbedtls_opaque_test_driver_cipher_operation_t * operation,const psa_key_attributes_t * attributes,const uint8_t * key,size_t key_length,psa_algorithm_t alg)361 psa_status_t mbedtls_test_opaque_cipher_encrypt_setup(
362 mbedtls_opaque_test_driver_cipher_operation_t *operation,
363 const psa_key_attributes_t *attributes,
364 const uint8_t *key, size_t key_length,
365 psa_algorithm_t alg)
366 {
367 (void) operation;
368 (void) attributes;
369 (void) key;
370 (void) key_length;
371 (void) alg;
372 return PSA_ERROR_NOT_SUPPORTED;
373 }
374
mbedtls_test_opaque_cipher_decrypt_setup(mbedtls_opaque_test_driver_cipher_operation_t * operation,const psa_key_attributes_t * attributes,const uint8_t * key,size_t key_length,psa_algorithm_t alg)375 psa_status_t mbedtls_test_opaque_cipher_decrypt_setup(
376 mbedtls_opaque_test_driver_cipher_operation_t *operation,
377 const psa_key_attributes_t *attributes,
378 const uint8_t *key, size_t key_length,
379 psa_algorithm_t alg)
380 {
381 (void) operation;
382 (void) attributes;
383 (void) key;
384 (void) key_length;
385 (void) alg;
386 return PSA_ERROR_NOT_SUPPORTED;
387 }
388
mbedtls_test_opaque_cipher_abort(mbedtls_opaque_test_driver_cipher_operation_t * operation)389 psa_status_t mbedtls_test_opaque_cipher_abort(
390 mbedtls_opaque_test_driver_cipher_operation_t *operation)
391 {
392 (void) operation;
393 return PSA_ERROR_NOT_SUPPORTED;
394 }
395
mbedtls_test_opaque_cipher_set_iv(mbedtls_opaque_test_driver_cipher_operation_t * operation,const uint8_t * iv,size_t iv_length)396 psa_status_t mbedtls_test_opaque_cipher_set_iv(
397 mbedtls_opaque_test_driver_cipher_operation_t *operation,
398 const uint8_t *iv,
399 size_t iv_length)
400 {
401 (void) operation;
402 (void) iv;
403 (void) iv_length;
404 return PSA_ERROR_NOT_SUPPORTED;
405 }
406
mbedtls_test_opaque_cipher_update(mbedtls_opaque_test_driver_cipher_operation_t * operation,const uint8_t * input,size_t input_length,uint8_t * output,size_t output_size,size_t * output_length)407 psa_status_t mbedtls_test_opaque_cipher_update(
408 mbedtls_opaque_test_driver_cipher_operation_t *operation,
409 const uint8_t *input,
410 size_t input_length,
411 uint8_t *output,
412 size_t output_size,
413 size_t *output_length)
414 {
415 (void) operation;
416 (void) input;
417 (void) input_length;
418 (void) output;
419 (void) output_size;
420 (void) output_length;
421 return PSA_ERROR_NOT_SUPPORTED;
422 }
423
mbedtls_test_opaque_cipher_finish(mbedtls_opaque_test_driver_cipher_operation_t * operation,uint8_t * output,size_t output_size,size_t * output_length)424 psa_status_t mbedtls_test_opaque_cipher_finish(
425 mbedtls_opaque_test_driver_cipher_operation_t *operation,
426 uint8_t *output,
427 size_t output_size,
428 size_t *output_length)
429 {
430 (void) operation;
431 (void) output;
432 (void) output_size;
433 (void) output_length;
434 return PSA_ERROR_NOT_SUPPORTED;
435 }
436 #endif /* MBEDTLS_PSA_CRYPTO_DRIVERS && PSA_CRYPTO_DRIVER_TEST */
437