blob: cc005764b7ab39fce59490f3372c736f9962df88 [file] [log] [blame]
Steven Cooremana70d5882020-07-16 20:26:18 +02001/*
Steven Cooreman56250fd2020-09-04 13:07:15 +02002 * Test driver for signature functions.
3 * Currently supports signing and verifying precalculated hashes, using
4 * only deterministic ECDSA on curves secp256r1, secp384r1 and secp521r1.
Steven Cooremana70d5882020-07-16 20:26:18 +02005 */
Steven Cooreman2c7b2f82020-09-02 13:43:46 +02006/* Copyright The Mbed TLS Contributors
Steven Cooremana70d5882020-07-16 20:26:18 +02007 * SPDX-License-Identifier: Apache-2.0
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License"); you may
10 * not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 * http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
Steven Cooremana70d5882020-07-16 20:26:18 +020020 */
21
Mateusz Starzyk2c09c9b2021-05-14 22:20:10 +020022#include <test/helpers.h>
23
Steven Cooremanf1720ea2020-07-24 18:41:58 +020024#if defined(MBEDTLS_PSA_CRYPTO_DRIVERS) && defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana70d5882020-07-16 20:26:18 +020025#include "psa/crypto.h"
Steven Cooreman15f58d22020-09-04 13:05:23 +020026#include "psa_crypto_core.h"
Ronald Cronb5399a82020-12-10 09:35:33 +010027#include "psa_crypto_ecp.h"
gabor-mezei-arm50eac352021-04-22 11:32:19 +020028#include "psa_crypto_hash.h"
Ronald Crond2fb8542020-12-09 15:18:01 +010029#include "psa_crypto_rsa.h"
Steven Cooremana70d5882020-07-16 20:26:18 +020030#include "mbedtls/ecp.h"
31
Ronald Cron5601cd22021-04-10 15:12:00 +020032#include "test/drivers/hash.h"
Steven Cooreman0d7c64d2020-09-07 16:17:55 +020033#include "test/drivers/signature.h"
Ronald Cron40170d92021-03-13 18:19:08 +010034#include "test/drivers/hash.h"
Steven Cooremana70d5882020-07-16 20:26:18 +020035
36#include "mbedtls/md.h"
37#include "mbedtls/ecdsa.h"
38
Steven Cooreman55ae2172020-07-17 19:46:15 +020039#include "test/random.h"
40
Steven Cooremana70d5882020-07-16 20:26:18 +020041#include <string.h>
42
Ronald Cron7f13fa22021-04-13 12:41:34 +020043mbedtls_test_driver_signature_hooks_t
44 mbedtls_test_driver_signature_sign_hooks = MBEDTLS_TEST_DRIVER_SIGNATURE_INIT;
45mbedtls_test_driver_signature_hooks_t
46 mbedtls_test_driver_signature_verify_hooks = MBEDTLS_TEST_DRIVER_SIGNATURE_INIT;
Steven Cooreman55ae2172020-07-17 19:46:15 +020047
gabor-mezei-arm50eac352021-04-22 11:32:19 +020048psa_status_t sign_hash(
Steven Cooremana70d5882020-07-16 20:26:18 +020049 const psa_key_attributes_t *attributes,
gabor-mezei-arm50eac352021-04-22 11:32:19 +020050 const uint8_t *key_buffer,
51 size_t key_buffer_size,
Steven Cooremana70d5882020-07-16 20:26:18 +020052 psa_algorithm_t alg,
gabor-mezei-arm50eac352021-04-22 11:32:19 +020053 const uint8_t *hash,
54 size_t hash_length,
55 uint8_t *signature,
56 size_t signature_size,
57 size_t *signature_length )
Steven Cooremana70d5882020-07-16 20:26:18 +020058{
Ronald Crond2fb8542020-12-09 15:18:01 +010059 if( attributes->core.type == PSA_KEY_TYPE_RSA_KEY_PAIR )
60 {
Ronald Cron81ca97e2021-04-09 15:32:03 +020061 if( PSA_ALG_IS_RSA_PKCS1V15_SIGN( alg ) ||
62 PSA_ALG_IS_RSA_PSS( alg) )
Ronald Cronb5399a82020-12-10 09:35:33 +010063 {
Ronald Cron73c9d9e2021-04-09 11:09:54 +020064#if ( defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_SIGN) || \
65 defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PSS) ) && \
66 defined(MBEDTLS_PSA_CRYPTO_CONFIG)
Ronald Cron40170d92021-03-13 18:19:08 +010067 return( libtestdriver1_mbedtls_psa_rsa_sign_hash(
Ronald Cronb5399a82020-12-10 09:35:33 +010068 attributes,
69 key_buffer, key_buffer_size,
70 alg, hash, hash_length,
71 signature, signature_size, signature_length ) );
Ronald Cron73c9d9e2021-04-09 11:09:54 +020072#elif defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || \
73 defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS)
Ronald Cron40170d92021-03-13 18:19:08 +010074 return( mbedtls_psa_rsa_sign_hash(
75 attributes,
76 key_buffer, key_buffer_size,
77 alg, hash, hash_length,
78 signature, signature_size, signature_length ) );
Ronald Cron73c9d9e2021-04-09 11:09:54 +020079#endif
Ronald Cronb5399a82020-12-10 09:35:33 +010080 }
81 else
82 {
83 return( PSA_ERROR_INVALID_ARGUMENT );
84 }
85 }
Ronald Cron81ca97e2021-04-09 15:32:03 +020086 else if( PSA_KEY_TYPE_IS_ECC( attributes->core.type ) )
87 {
88 if( PSA_ALG_IS_ECDSA( alg ) )
89 {
Ronald Cron73c9d9e2021-04-09 11:09:54 +020090#if ( defined(MBEDTLS_PSA_ACCEL_ALG_ECDSA) || \
91 defined(MBEDTLS_PSA_ACCEL_ALG_DETERMINISTIC_ECDSA) ) && \
92 defined(MBEDTLS_PSA_CRYPTO_CONFIG)
Ronald Cron40170d92021-03-13 18:19:08 +010093 return( libtestdriver1_mbedtls_psa_ecdsa_sign_hash(
Ronald Cron81ca97e2021-04-09 15:32:03 +020094 attributes,
95 key_buffer, key_buffer_size,
96 alg, hash, hash_length,
97 signature, signature_size, signature_length ) );
Ronald Cron73c9d9e2021-04-09 11:09:54 +020098#elif defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \
99 defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)
100 return( mbedtls_psa_ecdsa_sign_hash(
101 attributes,
102 key_buffer, key_buffer_size,
103 alg, hash, hash_length,
104 signature, signature_size, signature_length ) );
105#endif
Ronald Cron81ca97e2021-04-09 15:32:03 +0200106 }
107 else
108 {
109 return( PSA_ERROR_INVALID_ARGUMENT );
110 }
Steven Cooremana70d5882020-07-16 20:26:18 +0200111 }
Ronald Cron81ca97e2021-04-09 15:32:03 +0200112
113 (void)attributes;
114 (void)key_buffer;
115 (void)key_buffer_size;
116 (void)alg;
117 (void)hash;
118 (void)hash_length;
119 (void)signature;
120 (void)signature_size;
121 (void)signature_length;
122 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooremana70d5882020-07-16 20:26:18 +0200123}
124
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200125psa_status_t verify_hash(
Steven Cooremana70d5882020-07-16 20:26:18 +0200126 const psa_key_attributes_t *attributes,
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200127 const uint8_t *key_buffer,
128 size_t key_buffer_size,
Steven Cooremana70d5882020-07-16 20:26:18 +0200129 psa_algorithm_t alg,
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200130 const uint8_t *hash,
131 size_t hash_length,
132 const uint8_t *signature,
133 size_t signature_length )
Steven Cooremana70d5882020-07-16 20:26:18 +0200134{
Ronald Crond2fb8542020-12-09 15:18:01 +0100135 if( PSA_KEY_TYPE_IS_RSA( attributes->core.type ) )
136 {
Ronald Cron81ca97e2021-04-09 15:32:03 +0200137 if( PSA_ALG_IS_RSA_PKCS1V15_SIGN( alg ) ||
138 PSA_ALG_IS_RSA_PSS( alg) )
Ronald Cronb5399a82020-12-10 09:35:33 +0100139 {
Ronald Cron73c9d9e2021-04-09 11:09:54 +0200140#if ( defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_SIGN) || \
141 defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PSS) ) && \
142 defined(MBEDTLS_PSA_CRYPTO_CONFIG)
Ronald Cron40170d92021-03-13 18:19:08 +0100143 return( libtestdriver1_mbedtls_psa_rsa_verify_hash(
Ronald Cronb5399a82020-12-10 09:35:33 +0100144 attributes,
145 key_buffer, key_buffer_size,
146 alg, hash, hash_length,
147 signature, signature_length ) );
Ronald Cron73c9d9e2021-04-09 11:09:54 +0200148#elif defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || \
149 defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS)
Ronald Cron40170d92021-03-13 18:19:08 +0100150 return( mbedtls_psa_rsa_verify_hash(
151 attributes,
152 key_buffer, key_buffer_size,
153 alg, hash, hash_length,
154 signature, signature_length ) );
Ronald Cron73c9d9e2021-04-09 11:09:54 +0200155#endif
Ronald Cronb5399a82020-12-10 09:35:33 +0100156 }
157 else
158 {
159 return( PSA_ERROR_INVALID_ARGUMENT );
160 }
Steven Cooreman55ae2172020-07-17 19:46:15 +0200161 }
Ronald Cron81ca97e2021-04-09 15:32:03 +0200162 else if( PSA_KEY_TYPE_IS_ECC( attributes->core.type ) )
163 {
164 if( PSA_ALG_IS_ECDSA( alg ) )
165 {
Ronald Cron73c9d9e2021-04-09 11:09:54 +0200166#if ( defined(MBEDTLS_PSA_ACCEL_ALG_ECDSA) || \
167 defined(MBEDTLS_PSA_ACCEL_ALG_DETERMINISTIC_ECDSA) ) && \
168 defined(MBEDTLS_PSA_CRYPTO_CONFIG)
Ronald Cron40170d92021-03-13 18:19:08 +0100169 return( libtestdriver1_mbedtls_psa_ecdsa_verify_hash(
Ronald Cron81ca97e2021-04-09 15:32:03 +0200170 attributes,
171 key_buffer, key_buffer_size,
172 alg, hash, hash_length,
173 signature, signature_length ) );
Ronald Cron73c9d9e2021-04-09 11:09:54 +0200174#elif defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \
175 defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)
176 return( mbedtls_psa_ecdsa_verify_hash(
177 attributes,
178 key_buffer, key_buffer_size,
179 alg, hash, hash_length,
180 signature, signature_length ) );
181#endif
Ronald Cron81ca97e2021-04-09 15:32:03 +0200182 }
183 else
184 {
185 return( PSA_ERROR_INVALID_ARGUMENT );
186 }
Steven Cooreman55ae2172020-07-17 19:46:15 +0200187 }
Ronald Cron81ca97e2021-04-09 15:32:03 +0200188
189 (void)attributes;
190 (void)key_buffer;
191 (void)key_buffer_size;
192 (void)alg;
193 (void)hash;
194 (void)hash_length;
195 (void)signature;
196 (void)signature_length;
Ronald Cron81ca97e2021-04-09 15:32:03 +0200197 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200198}
199
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200200psa_status_t mbedtls_test_transparent_signature_sign_message(
201 const psa_key_attributes_t *attributes,
202 const uint8_t *key_buffer,
203 size_t key_buffer_size,
204 psa_algorithm_t alg,
205 const uint8_t *input,
206 size_t input_length,
207 uint8_t *signature,
208 size_t signature_size,
209 size_t *signature_length )
210{
211 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
212 size_t hash_length;
213 uint8_t hash[PSA_HASH_MAX_SIZE];
214
215 ++mbedtls_test_driver_signature_sign_hooks.hits;
216
217 if( mbedtls_test_driver_signature_sign_hooks.forced_status != PSA_SUCCESS )
218 return( mbedtls_test_driver_signature_sign_hooks.forced_status );
219
220 if( mbedtls_test_driver_signature_sign_hooks.forced_output != NULL )
221 {
222 if( mbedtls_test_driver_signature_sign_hooks.forced_output_length > signature_size )
223 return( PSA_ERROR_BUFFER_TOO_SMALL );
224
225 memcpy( signature, mbedtls_test_driver_signature_sign_hooks.forced_output,
226 mbedtls_test_driver_signature_sign_hooks.forced_output_length );
227 *signature_length = mbedtls_test_driver_signature_sign_hooks.forced_output_length;
228
229 return( PSA_SUCCESS );
230 }
231
Ronald Cron73c9d9e2021-04-09 11:09:54 +0200232#if defined(MBEDTLS_PSA_CRYPTO_CONFIG)
Ronald Cron40170d92021-03-13 18:19:08 +0100233 status = libtestdriver1_mbedtls_psa_hash_compute(
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200234 PSA_ALG_SIGN_GET_HASH( alg ), input, input_length,
235 hash, sizeof( hash ), &hash_length );
Ronald Cron73c9d9e2021-04-09 11:09:54 +0200236#elif defined(MBEDTLS_PSA_BUILTIN_HASH)
237 status = mbedtls_psa_hash_compute(
238 PSA_ALG_SIGN_GET_HASH( alg ), input, input_length,
239 hash, sizeof( hash ), &hash_length );
240#else
241 (void) input;
242 (void) input_length;
243 status = PSA_ERROR_NOT_SUPPORTED;
244#endif
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200245 if( status != PSA_SUCCESS )
246 return status;
247
Ronald Cron73c9d9e2021-04-09 11:09:54 +0200248 return( sign_hash( attributes, key_buffer, key_buffer_size,
249 alg, hash, hash_length,
250 signature, signature_size, signature_length ) );
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200251}
252
253psa_status_t mbedtls_test_opaque_signature_sign_message(
254 const psa_key_attributes_t *attributes,
255 const uint8_t *key,
256 size_t key_length,
257 psa_algorithm_t alg,
258 const uint8_t *input,
259 size_t input_length,
260 uint8_t *signature,
261 size_t signature_size,
262 size_t *signature_length )
263{
264 (void) attributes;
265 (void) key;
266 (void) key_length;
267 (void) alg;
268 (void) input;
269 (void) input_length;
270 (void) signature;
271 (void) signature_size;
272 (void) signature_length;
273
274 return( PSA_ERROR_NOT_SUPPORTED );
275}
276
277psa_status_t mbedtls_test_transparent_signature_verify_message(
278 const psa_key_attributes_t *attributes,
279 const uint8_t *key_buffer,
280 size_t key_buffer_size,
281 psa_algorithm_t alg,
282 const uint8_t *input,
283 size_t input_length,
284 const uint8_t *signature,
285 size_t signature_length )
286{
287 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
288 size_t hash_length;
289 uint8_t hash[PSA_HASH_MAX_SIZE];
290
291 ++mbedtls_test_driver_signature_verify_hooks.hits;
292
293 if( mbedtls_test_driver_signature_verify_hooks.forced_status != PSA_SUCCESS )
294 return( mbedtls_test_driver_signature_verify_hooks.forced_status );
295
Ronald Cron73c9d9e2021-04-09 11:09:54 +0200296#if defined(MBEDTLS_PSA_CRYPTO_CONFIG)
Ronald Cron40170d92021-03-13 18:19:08 +0100297 status = libtestdriver1_mbedtls_psa_hash_compute(
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200298 PSA_ALG_SIGN_GET_HASH( alg ), input, input_length,
299 hash, sizeof( hash ), &hash_length );
Ronald Cron73c9d9e2021-04-09 11:09:54 +0200300#elif defined(MBEDTLS_PSA_BUILTIN_HASH)
301 status = mbedtls_psa_hash_compute(
302 PSA_ALG_SIGN_GET_HASH( alg ), input, input_length,
303 hash, sizeof( hash ), &hash_length );
304#else
305 (void) input;
306 (void) input_length;
307 status = PSA_ERROR_NOT_SUPPORTED;
308#endif
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200309 if( status != PSA_SUCCESS )
310 return status;
311
Ronald Cron73c9d9e2021-04-09 11:09:54 +0200312 return( verify_hash( attributes, key_buffer, key_buffer_size,
313 alg, hash, hash_length,
314 signature, signature_length ) );
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200315}
316
317psa_status_t mbedtls_test_opaque_signature_verify_message(
318 const psa_key_attributes_t *attributes,
319 const uint8_t *key,
320 size_t key_length,
321 psa_algorithm_t alg,
322 const uint8_t *input,
323 size_t input_length,
324 const uint8_t *signature,
325 size_t signature_length )
326{
327 (void) attributes;
328 (void) key;
329 (void) key_length;
330 (void) alg;
331 (void) input;
332 (void) input_length;
333 (void) signature;
334 (void) signature_length;
335
336 return( PSA_ERROR_NOT_SUPPORTED );
337}
338
339psa_status_t mbedtls_test_transparent_signature_sign_hash(
340 const psa_key_attributes_t *attributes,
341 const uint8_t *key_buffer, size_t key_buffer_size,
342 psa_algorithm_t alg,
343 const uint8_t *hash, size_t hash_length,
344 uint8_t *signature, size_t signature_size, size_t *signature_length )
345{
346 ++mbedtls_test_driver_signature_sign_hooks.hits;
347
348 if( mbedtls_test_driver_signature_sign_hooks.forced_status != PSA_SUCCESS )
349 return( mbedtls_test_driver_signature_sign_hooks.forced_status );
350
351 if( mbedtls_test_driver_signature_sign_hooks.forced_output != NULL )
352 {
353 if( mbedtls_test_driver_signature_sign_hooks.forced_output_length > signature_size )
354 return( PSA_ERROR_BUFFER_TOO_SMALL );
355 memcpy( signature, mbedtls_test_driver_signature_sign_hooks.forced_output,
356 mbedtls_test_driver_signature_sign_hooks.forced_output_length );
357 *signature_length = mbedtls_test_driver_signature_sign_hooks.forced_output_length;
358 return( PSA_SUCCESS );
359 }
360
Ronald Cron40170d92021-03-13 18:19:08 +0100361 return( sign_hash( attributes, key_buffer, key_buffer_size,
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200362 alg, hash, hash_length,
Ronald Cron40170d92021-03-13 18:19:08 +0100363 signature, signature_size, signature_length ) );
gabor-mezei-arm50eac352021-04-22 11:32:19 +0200364}
365
366psa_status_t mbedtls_test_opaque_signature_sign_hash(
367 const psa_key_attributes_t *attributes,
368 const uint8_t *key, size_t key_length,
369 psa_algorithm_t alg,
370 const uint8_t *hash, size_t hash_length,
371 uint8_t *signature, size_t signature_size, size_t *signature_length )
372{
373 (void) attributes;
374 (void) key;
375 (void) key_length;
376 (void) alg;
377 (void) hash;
378 (void) hash_length;
379 (void) signature;
380 (void) signature_size;
381 (void) signature_length;
382
383 return( PSA_ERROR_NOT_SUPPORTED );
384}
385
386psa_status_t mbedtls_test_transparent_signature_verify_hash(
387 const psa_key_attributes_t *attributes,
388 const uint8_t *key_buffer, size_t key_buffer_size,
389 psa_algorithm_t alg,
390 const uint8_t *hash, size_t hash_length,
391 const uint8_t *signature, size_t signature_length )
392{
393 ++mbedtls_test_driver_signature_verify_hooks.hits;
394
395 if( mbedtls_test_driver_signature_verify_hooks.forced_status != PSA_SUCCESS )
396 return( mbedtls_test_driver_signature_verify_hooks.forced_status );
397
398 return verify_hash( attributes, key_buffer, key_buffer_size,
399 alg, hash, hash_length,
400 signature, signature_length );
401}
402
Ronald Cron7f13fa22021-04-13 12:41:34 +0200403psa_status_t mbedtls_test_opaque_signature_verify_hash(
Steven Cooreman55ae2172020-07-17 19:46:15 +0200404 const psa_key_attributes_t *attributes,
405 const uint8_t *key, size_t key_length,
406 psa_algorithm_t alg,
407 const uint8_t *hash, size_t hash_length,
408 const uint8_t *signature, size_t signature_length )
409{
410 (void) attributes;
411 (void) key;
412 (void) key_length;
413 (void) alg;
414 (void) hash;
415 (void) hash_length;
416 (void) signature;
417 (void) signature_length;
418 return( PSA_ERROR_NOT_SUPPORTED );
419}
420
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200421#endif /* MBEDTLS_PSA_CRYPTO_DRIVERS && PSA_CRYPTO_DRIVER_TEST */