blob: a656287b67d7ecfd2ebbf41bc15e70d8a077e3a2 [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
22#if !defined(MBEDTLS_CONFIG_FILE)
23#include "mbedtls/config.h"
24#else
25#include MBEDTLS_CONFIG_FILE
26#endif
27
Steven Cooremanf1720ea2020-07-24 18:41:58 +020028#if defined(MBEDTLS_PSA_CRYPTO_DRIVERS) && defined(PSA_CRYPTO_DRIVER_TEST)
Steven Cooremana70d5882020-07-16 20:26:18 +020029#include "psa/crypto.h"
Steven Cooreman15f58d22020-09-04 13:05:23 +020030#include "psa_crypto_core.h"
Ronald Cronb5399a82020-12-10 09:35:33 +010031#include "psa_crypto_ecp.h"
gabor-mezei-armc53f4f62021-04-22 11:32:19 +020032#include "psa_crypto_hash.h"
Ronald Crond2fb8542020-12-09 15:18:01 +010033#include "psa_crypto_rsa.h"
Steven Cooremana70d5882020-07-16 20:26:18 +020034#include "mbedtls/ecp.h"
35
Ronald Crond54303d2021-04-10 15:12:00 +020036#include "test/drivers/hash.h"
Steven Cooreman0d7c64d2020-09-07 16:17:55 +020037#include "test/drivers/signature.h"
Ronald Cron7b7854e2021-03-13 18:19:08 +010038#include "test/drivers/hash.h"
Steven Cooremana70d5882020-07-16 20:26:18 +020039
40#include "mbedtls/md.h"
41#include "mbedtls/ecdsa.h"
42
Steven Cooreman55ae2172020-07-17 19:46:15 +020043#include "test/random.h"
44
Steven Cooremana70d5882020-07-16 20:26:18 +020045#include <string.h>
46
Ronald Cronc4bc12e2021-04-13 12:41:34 +020047mbedtls_test_driver_signature_hooks_t
48 mbedtls_test_driver_signature_sign_hooks = MBEDTLS_TEST_DRIVER_SIGNATURE_INIT;
49mbedtls_test_driver_signature_hooks_t
50 mbedtls_test_driver_signature_verify_hooks = MBEDTLS_TEST_DRIVER_SIGNATURE_INIT;
Steven Cooreman55ae2172020-07-17 19:46:15 +020051
gabor-mezei-armc53f4f62021-04-22 11:32:19 +020052psa_status_t sign_hash(
Steven Cooremana70d5882020-07-16 20:26:18 +020053 const psa_key_attributes_t *attributes,
gabor-mezei-armc53f4f62021-04-22 11:32:19 +020054 const uint8_t *key_buffer,
55 size_t key_buffer_size,
Steven Cooremana70d5882020-07-16 20:26:18 +020056 psa_algorithm_t alg,
gabor-mezei-armc53f4f62021-04-22 11:32:19 +020057 const uint8_t *hash,
58 size_t hash_length,
59 uint8_t *signature,
60 size_t signature_size,
61 size_t *signature_length )
Steven Cooremana70d5882020-07-16 20:26:18 +020062{
Ronald Crond2fb8542020-12-09 15:18:01 +010063 if( attributes->core.type == PSA_KEY_TYPE_RSA_KEY_PAIR )
64 {
Ronald Cron4bcccc62021-04-09 15:32:03 +020065 if( PSA_ALG_IS_RSA_PKCS1V15_SIGN( alg ) ||
66 PSA_ALG_IS_RSA_PSS( alg) )
Ronald Cronb5399a82020-12-10 09:35:33 +010067 {
Ronald Cron2091eed2021-04-09 11:09:54 +020068#if ( defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_SIGN) || \
69 defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PSS) ) && \
70 defined(MBEDTLS_PSA_CRYPTO_CONFIG)
Ronald Cron7b7854e2021-03-13 18:19:08 +010071 return( libtestdriver1_mbedtls_psa_rsa_sign_hash(
Ronald Cronb5399a82020-12-10 09:35:33 +010072 attributes,
73 key_buffer, key_buffer_size,
74 alg, hash, hash_length,
75 signature, signature_size, signature_length ) );
Ronald Cron2091eed2021-04-09 11:09:54 +020076#elif defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || \
77 defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS)
Ronald Cron7b7854e2021-03-13 18:19:08 +010078 return( mbedtls_psa_rsa_sign_hash(
79 attributes,
80 key_buffer, key_buffer_size,
81 alg, hash, hash_length,
82 signature, signature_size, signature_length ) );
Ronald Cron2091eed2021-04-09 11:09:54 +020083#endif
Ronald Cronb5399a82020-12-10 09:35:33 +010084 }
85 else
86 {
87 return( PSA_ERROR_INVALID_ARGUMENT );
88 }
89 }
Ronald Cron4bcccc62021-04-09 15:32:03 +020090 else if( PSA_KEY_TYPE_IS_ECC( attributes->core.type ) )
91 {
92 if( PSA_ALG_IS_ECDSA( alg ) )
93 {
Ronald Cron2091eed2021-04-09 11:09:54 +020094#if ( defined(MBEDTLS_PSA_ACCEL_ALG_ECDSA) || \
95 defined(MBEDTLS_PSA_ACCEL_ALG_DETERMINISTIC_ECDSA) ) && \
96 defined(MBEDTLS_PSA_CRYPTO_CONFIG)
Ronald Cron7b7854e2021-03-13 18:19:08 +010097 return( libtestdriver1_mbedtls_psa_ecdsa_sign_hash(
Ronald Cron4bcccc62021-04-09 15:32:03 +020098 attributes,
99 key_buffer, key_buffer_size,
100 alg, hash, hash_length,
101 signature, signature_size, signature_length ) );
Ronald Cron2091eed2021-04-09 11:09:54 +0200102#elif defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \
103 defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)
104 return( mbedtls_psa_ecdsa_sign_hash(
105 attributes,
106 key_buffer, key_buffer_size,
107 alg, hash, hash_length,
108 signature, signature_size, signature_length ) );
109#endif
Ronald Cron4bcccc62021-04-09 15:32:03 +0200110 }
111 else
112 {
113 return( PSA_ERROR_INVALID_ARGUMENT );
114 }
Steven Cooremana70d5882020-07-16 20:26:18 +0200115 }
Ronald Cron4bcccc62021-04-09 15:32:03 +0200116
117 (void)attributes;
118 (void)key_buffer;
119 (void)key_buffer_size;
120 (void)alg;
121 (void)hash;
122 (void)hash_length;
123 (void)signature;
124 (void)signature_size;
125 (void)signature_length;
126 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooremana70d5882020-07-16 20:26:18 +0200127}
128
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200129psa_status_t verify_hash(
Steven Cooremana70d5882020-07-16 20:26:18 +0200130 const psa_key_attributes_t *attributes,
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200131 const uint8_t *key_buffer,
132 size_t key_buffer_size,
Steven Cooremana70d5882020-07-16 20:26:18 +0200133 psa_algorithm_t alg,
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200134 const uint8_t *hash,
135 size_t hash_length,
136 const uint8_t *signature,
137 size_t signature_length )
Steven Cooremana70d5882020-07-16 20:26:18 +0200138{
Ronald Crond2fb8542020-12-09 15:18:01 +0100139 if( PSA_KEY_TYPE_IS_RSA( attributes->core.type ) )
140 {
Ronald Cron4bcccc62021-04-09 15:32:03 +0200141 if( PSA_ALG_IS_RSA_PKCS1V15_SIGN( alg ) ||
142 PSA_ALG_IS_RSA_PSS( alg) )
Ronald Cronb5399a82020-12-10 09:35:33 +0100143 {
Ronald Cron2091eed2021-04-09 11:09:54 +0200144#if ( defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_SIGN) || \
145 defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PSS) ) && \
146 defined(MBEDTLS_PSA_CRYPTO_CONFIG)
Ronald Cron7b7854e2021-03-13 18:19:08 +0100147 return( libtestdriver1_mbedtls_psa_rsa_verify_hash(
Ronald Cronb5399a82020-12-10 09:35:33 +0100148 attributes,
149 key_buffer, key_buffer_size,
150 alg, hash, hash_length,
151 signature, signature_length ) );
Ronald Cron2091eed2021-04-09 11:09:54 +0200152#elif defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PKCS1V15_SIGN) || \
153 defined(MBEDTLS_PSA_BUILTIN_ALG_RSA_PSS)
Ronald Cron7b7854e2021-03-13 18:19:08 +0100154 return( mbedtls_psa_rsa_verify_hash(
155 attributes,
156 key_buffer, key_buffer_size,
157 alg, hash, hash_length,
158 signature, signature_length ) );
Ronald Cron2091eed2021-04-09 11:09:54 +0200159#endif
Ronald Cronb5399a82020-12-10 09:35:33 +0100160 }
161 else
162 {
163 return( PSA_ERROR_INVALID_ARGUMENT );
164 }
Steven Cooreman55ae2172020-07-17 19:46:15 +0200165 }
Ronald Cron4bcccc62021-04-09 15:32:03 +0200166 else if( PSA_KEY_TYPE_IS_ECC( attributes->core.type ) )
167 {
168 if( PSA_ALG_IS_ECDSA( alg ) )
169 {
Ronald Cron2091eed2021-04-09 11:09:54 +0200170#if ( defined(MBEDTLS_PSA_ACCEL_ALG_ECDSA) || \
171 defined(MBEDTLS_PSA_ACCEL_ALG_DETERMINISTIC_ECDSA) ) && \
172 defined(MBEDTLS_PSA_CRYPTO_CONFIG)
Ronald Cron7b7854e2021-03-13 18:19:08 +0100173 return( libtestdriver1_mbedtls_psa_ecdsa_verify_hash(
Ronald Cron4bcccc62021-04-09 15:32:03 +0200174 attributes,
175 key_buffer, key_buffer_size,
176 alg, hash, hash_length,
177 signature, signature_length ) );
Ronald Cron2091eed2021-04-09 11:09:54 +0200178#elif defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \
179 defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)
180 return( mbedtls_psa_ecdsa_verify_hash(
181 attributes,
182 key_buffer, key_buffer_size,
183 alg, hash, hash_length,
184 signature, signature_length ) );
185#endif
Ronald Cron4bcccc62021-04-09 15:32:03 +0200186 }
187 else
188 {
189 return( PSA_ERROR_INVALID_ARGUMENT );
190 }
Steven Cooreman55ae2172020-07-17 19:46:15 +0200191 }
Ronald Cron4bcccc62021-04-09 15:32:03 +0200192
193 (void)attributes;
194 (void)key_buffer;
195 (void)key_buffer_size;
196 (void)alg;
197 (void)hash;
198 (void)hash_length;
199 (void)signature;
200 (void)signature_length;
Ronald Cron4bcccc62021-04-09 15:32:03 +0200201 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200202}
203
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200204psa_status_t mbedtls_test_transparent_signature_sign_message(
205 const psa_key_attributes_t *attributes,
206 const uint8_t *key_buffer,
207 size_t key_buffer_size,
208 psa_algorithm_t alg,
209 const uint8_t *input,
210 size_t input_length,
211 uint8_t *signature,
212 size_t signature_size,
213 size_t *signature_length )
214{
215 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
216 size_t hash_length;
217 uint8_t hash[PSA_HASH_MAX_SIZE];
218
219 ++mbedtls_test_driver_signature_sign_hooks.hits;
220
221 if( mbedtls_test_driver_signature_sign_hooks.forced_status != PSA_SUCCESS )
222 return( mbedtls_test_driver_signature_sign_hooks.forced_status );
223
224 if( mbedtls_test_driver_signature_sign_hooks.forced_output != NULL )
225 {
226 if( mbedtls_test_driver_signature_sign_hooks.forced_output_length > signature_size )
227 return( PSA_ERROR_BUFFER_TOO_SMALL );
228
229 memcpy( signature, mbedtls_test_driver_signature_sign_hooks.forced_output,
230 mbedtls_test_driver_signature_sign_hooks.forced_output_length );
231 *signature_length = mbedtls_test_driver_signature_sign_hooks.forced_output_length;
232
233 return( PSA_SUCCESS );
234 }
235
Ronald Cron2091eed2021-04-09 11:09:54 +0200236#if defined(MBEDTLS_PSA_CRYPTO_CONFIG)
Ronald Cron7b7854e2021-03-13 18:19:08 +0100237 status = libtestdriver1_mbedtls_psa_hash_compute(
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200238 PSA_ALG_SIGN_GET_HASH( alg ), input, input_length,
239 hash, sizeof( hash ), &hash_length );
Ronald Cron2091eed2021-04-09 11:09:54 +0200240#elif defined(MBEDTLS_PSA_BUILTIN_HASH)
241 status = mbedtls_psa_hash_compute(
242 PSA_ALG_SIGN_GET_HASH( alg ), input, input_length,
243 hash, sizeof( hash ), &hash_length );
244#else
245 (void) input;
246 (void) input_length;
247 status = PSA_ERROR_NOT_SUPPORTED;
248#endif
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200249 if( status != PSA_SUCCESS )
250 return status;
251
Ronald Cron2091eed2021-04-09 11:09:54 +0200252 return( sign_hash( attributes, key_buffer, key_buffer_size,
253 alg, hash, hash_length,
254 signature, signature_size, signature_length ) );
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200255}
256
257psa_status_t mbedtls_test_opaque_signature_sign_message(
258 const psa_key_attributes_t *attributes,
259 const uint8_t *key,
260 size_t key_length,
261 psa_algorithm_t alg,
262 const uint8_t *input,
263 size_t input_length,
264 uint8_t *signature,
265 size_t signature_size,
266 size_t *signature_length )
267{
268 (void) attributes;
269 (void) key;
270 (void) key_length;
271 (void) alg;
272 (void) input;
273 (void) input_length;
274 (void) signature;
275 (void) signature_size;
276 (void) signature_length;
277
278 return( PSA_ERROR_NOT_SUPPORTED );
279}
280
281psa_status_t mbedtls_test_transparent_signature_verify_message(
282 const psa_key_attributes_t *attributes,
283 const uint8_t *key_buffer,
284 size_t key_buffer_size,
285 psa_algorithm_t alg,
286 const uint8_t *input,
287 size_t input_length,
288 const uint8_t *signature,
289 size_t signature_length )
290{
291 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
292 size_t hash_length;
293 uint8_t hash[PSA_HASH_MAX_SIZE];
294
295 ++mbedtls_test_driver_signature_verify_hooks.hits;
296
297 if( mbedtls_test_driver_signature_verify_hooks.forced_status != PSA_SUCCESS )
298 return( mbedtls_test_driver_signature_verify_hooks.forced_status );
299
Ronald Cron2091eed2021-04-09 11:09:54 +0200300#if defined(MBEDTLS_PSA_CRYPTO_CONFIG)
Ronald Cron7b7854e2021-03-13 18:19:08 +0100301 status = libtestdriver1_mbedtls_psa_hash_compute(
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200302 PSA_ALG_SIGN_GET_HASH( alg ), input, input_length,
303 hash, sizeof( hash ), &hash_length );
Ronald Cron2091eed2021-04-09 11:09:54 +0200304#elif defined(MBEDTLS_PSA_BUILTIN_HASH)
305 status = mbedtls_psa_hash_compute(
306 PSA_ALG_SIGN_GET_HASH( alg ), input, input_length,
307 hash, sizeof( hash ), &hash_length );
308#else
309 (void) input;
310 (void) input_length;
311 status = PSA_ERROR_NOT_SUPPORTED;
312#endif
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200313 if( status != PSA_SUCCESS )
314 return status;
315
Ronald Cron2091eed2021-04-09 11:09:54 +0200316 return( verify_hash( attributes, key_buffer, key_buffer_size,
317 alg, hash, hash_length,
318 signature, signature_length ) );
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200319}
320
321psa_status_t mbedtls_test_opaque_signature_verify_message(
322 const psa_key_attributes_t *attributes,
323 const uint8_t *key,
324 size_t key_length,
325 psa_algorithm_t alg,
326 const uint8_t *input,
327 size_t input_length,
328 const uint8_t *signature,
329 size_t signature_length )
330{
331 (void) attributes;
332 (void) key;
333 (void) key_length;
334 (void) alg;
335 (void) input;
336 (void) input_length;
337 (void) signature;
338 (void) signature_length;
339
340 return( PSA_ERROR_NOT_SUPPORTED );
341}
342
343psa_status_t mbedtls_test_transparent_signature_sign_hash(
344 const psa_key_attributes_t *attributes,
345 const uint8_t *key_buffer, size_t key_buffer_size,
346 psa_algorithm_t alg,
347 const uint8_t *hash, size_t hash_length,
348 uint8_t *signature, size_t signature_size, size_t *signature_length )
349{
350 ++mbedtls_test_driver_signature_sign_hooks.hits;
351
352 if( mbedtls_test_driver_signature_sign_hooks.forced_status != PSA_SUCCESS )
353 return( mbedtls_test_driver_signature_sign_hooks.forced_status );
354
355 if( mbedtls_test_driver_signature_sign_hooks.forced_output != NULL )
356 {
357 if( mbedtls_test_driver_signature_sign_hooks.forced_output_length > signature_size )
358 return( PSA_ERROR_BUFFER_TOO_SMALL );
359 memcpy( signature, mbedtls_test_driver_signature_sign_hooks.forced_output,
360 mbedtls_test_driver_signature_sign_hooks.forced_output_length );
361 *signature_length = mbedtls_test_driver_signature_sign_hooks.forced_output_length;
362 return( PSA_SUCCESS );
363 }
364
Ronald Cron7b7854e2021-03-13 18:19:08 +0100365 return( sign_hash( attributes, key_buffer, key_buffer_size,
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200366 alg, hash, hash_length,
Ronald Cron7b7854e2021-03-13 18:19:08 +0100367 signature, signature_size, signature_length ) );
gabor-mezei-armc53f4f62021-04-22 11:32:19 +0200368}
369
370psa_status_t mbedtls_test_opaque_signature_sign_hash(
371 const psa_key_attributes_t *attributes,
372 const uint8_t *key, size_t key_length,
373 psa_algorithm_t alg,
374 const uint8_t *hash, size_t hash_length,
375 uint8_t *signature, size_t signature_size, size_t *signature_length )
376{
377 (void) attributes;
378 (void) key;
379 (void) key_length;
380 (void) alg;
381 (void) hash;
382 (void) hash_length;
383 (void) signature;
384 (void) signature_size;
385 (void) signature_length;
386
387 return( PSA_ERROR_NOT_SUPPORTED );
388}
389
390psa_status_t mbedtls_test_transparent_signature_verify_hash(
391 const psa_key_attributes_t *attributes,
392 const uint8_t *key_buffer, size_t key_buffer_size,
393 psa_algorithm_t alg,
394 const uint8_t *hash, size_t hash_length,
395 const uint8_t *signature, size_t signature_length )
396{
397 ++mbedtls_test_driver_signature_verify_hooks.hits;
398
399 if( mbedtls_test_driver_signature_verify_hooks.forced_status != PSA_SUCCESS )
400 return( mbedtls_test_driver_signature_verify_hooks.forced_status );
401
402 return verify_hash( attributes, key_buffer, key_buffer_size,
403 alg, hash, hash_length,
404 signature, signature_length );
405}
406
Ronald Cronc4bc12e2021-04-13 12:41:34 +0200407psa_status_t mbedtls_test_opaque_signature_verify_hash(
Steven Cooreman55ae2172020-07-17 19:46:15 +0200408 const psa_key_attributes_t *attributes,
409 const uint8_t *key, size_t key_length,
410 psa_algorithm_t alg,
411 const uint8_t *hash, size_t hash_length,
412 const uint8_t *signature, size_t signature_length )
413{
414 (void) attributes;
415 (void) key;
416 (void) key_length;
417 (void) alg;
418 (void) hash;
419 (void) hash_length;
420 (void) signature;
421 (void) signature_length;
422 return( PSA_ERROR_NOT_SUPPORTED );
423}
424
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200425#endif /* MBEDTLS_PSA_CRYPTO_DRIVERS && PSA_CRYPTO_DRIVER_TEST */