blob: 47c6debc5b7b778fdc5e5edcd71d13f54377559d [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"
Ronald Crond2fb8542020-12-09 15:18:01 +010032#include "psa_crypto_rsa.h"
Steven Cooremana70d5882020-07-16 20:26:18 +020033#include "mbedtls/ecp.h"
34
Steven Cooreman0d7c64d2020-09-07 16:17:55 +020035#include "test/drivers/signature.h"
Steven Cooremana70d5882020-07-16 20:26:18 +020036
37#include "mbedtls/md.h"
38#include "mbedtls/ecdsa.h"
39
Steven Cooreman55ae2172020-07-17 19:46:15 +020040#include "test/random.h"
41
Steven Cooremana70d5882020-07-16 20:26:18 +020042#include <string.h>
43
Steven Cooreman831c6952020-09-07 12:58:16 +020044test_driver_signature_hooks_t test_driver_signature_sign_hooks = TEST_DRIVER_SIGNATURE_INIT;
45test_driver_signature_hooks_t test_driver_signature_verify_hooks = TEST_DRIVER_SIGNATURE_INIT;
Steven Cooreman55ae2172020-07-17 19:46:15 +020046
Steven Cooremana70d5882020-07-16 20:26:18 +020047psa_status_t test_transparent_signature_sign_hash(
48 const psa_key_attributes_t *attributes,
Ronald Cronb5399a82020-12-10 09:35:33 +010049 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooremana70d5882020-07-16 20:26:18 +020050 psa_algorithm_t alg,
51 const uint8_t *hash, size_t hash_length,
52 uint8_t *signature, size_t signature_size, size_t *signature_length )
53{
Steven Cooreman831c6952020-09-07 12:58:16 +020054 ++test_driver_signature_sign_hooks.hits;
Steven Cooremana70d5882020-07-16 20:26:18 +020055
Steven Cooreman831c6952020-09-07 12:58:16 +020056 if( test_driver_signature_sign_hooks.forced_status != PSA_SUCCESS )
57 return( test_driver_signature_sign_hooks.forced_status );
Steven Cooremana70d5882020-07-16 20:26:18 +020058
Steven Cooreman831c6952020-09-07 12:58:16 +020059 if( test_driver_signature_sign_hooks.forced_output != NULL )
Steven Cooremana70d5882020-07-16 20:26:18 +020060 {
Steven Cooreman831c6952020-09-07 12:58:16 +020061 if( test_driver_signature_sign_hooks.forced_output_length > signature_size )
Steven Cooremana70d5882020-07-16 20:26:18 +020062 return( PSA_ERROR_BUFFER_TOO_SMALL );
Steven Cooreman831c6952020-09-07 12:58:16 +020063 memcpy( signature, test_driver_signature_sign_hooks.forced_output,
64 test_driver_signature_sign_hooks.forced_output_length );
65 *signature_length = test_driver_signature_sign_hooks.forced_output_length;
Steven Cooremana70d5882020-07-16 20:26:18 +020066 return( PSA_SUCCESS );
67 }
68
Ronald Crond2fb8542020-12-09 15:18:01 +010069#if defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_SIGN) || \
70 defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PSS)
71 if( attributes->core.type == PSA_KEY_TYPE_RSA_KEY_PAIR )
72 {
73 return( mbedtls_transparent_test_driver_rsa_sign_hash(
74 attributes,
75 key_buffer, key_buffer_size,
76 alg, hash, hash_length,
77 signature, signature_size, signature_length ) );
78 }
Ronald Cronb5399a82020-12-10 09:35:33 +010079 else
Ronald Crond2fb8542020-12-09 15:18:01 +010080#endif /* defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_SIGN) ||
81 * defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PSS) */
82
Ronald Cronb5399a82020-12-10 09:35:33 +010083#if defined(MBEDTLS_PSA_ACCEL_ALG_ECDSA) || \
84 defined(MBEDTLS_PSA_ACCEL_ALG_DETERMINISTIC_ECDSA)
85 if( PSA_KEY_TYPE_IS_ECC( attributes->core.type ) )
86 {
87 if(
88#if defined(MBEDTLS_PSA_ACCEL_ALG_DETERMINISTIC_ECDSA)
89 PSA_ALG_IS_ECDSA( alg )
90#else
91 PSA_ALG_IS_RANDOMIZED_ECDSA( alg )
92#endif
93 )
94 {
95 return( mbedtls_transparent_test_driver_ecdsa_sign_hash(
96 attributes,
97 key_buffer, key_buffer_size,
98 alg, hash, hash_length,
99 signature, signature_size, signature_length ) );
100 }
101 else
102 {
103 return( PSA_ERROR_INVALID_ARGUMENT );
104 }
105 }
106 else
107#endif /* defined(MBEDTLS_PSA_ACCEL_ALG_ECDSA) ||
108 * defined(MBEDTLS_PSA_ACCEL_ALG_DETERMINISTIC_ECDSA) */
109 {
110 (void)attributes;
111 (void)key_buffer;
112 (void)key_buffer_size;
113 (void)alg;
114 (void)hash;
115 (void)hash_length;
116 (void)signature;
117 (void)signature_size;
118 (void)signature_length;
Steven Cooremana70d5882020-07-16 20:26:18 +0200119 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooremana70d5882020-07-16 20:26:18 +0200120 }
Steven Cooremana70d5882020-07-16 20:26:18 +0200121}
122
123psa_status_t test_opaque_signature_sign_hash(
124 const psa_key_attributes_t *attributes,
125 const uint8_t *key, size_t key_length,
126 psa_algorithm_t alg,
127 const uint8_t *hash, size_t hash_length,
128 uint8_t *signature, size_t signature_size, size_t *signature_length )
129{
130 (void) attributes;
131 (void) key;
132 (void) key_length;
133 (void) alg;
134 (void) hash;
135 (void) hash_length;
136 (void) signature;
137 (void) signature_size;
138 (void) signature_length;
Ronald Cronb5399a82020-12-10 09:35:33 +0100139
Steven Cooremana70d5882020-07-16 20:26:18 +0200140 return( PSA_ERROR_NOT_SUPPORTED );
141}
142
Steven Cooreman55ae2172020-07-17 19:46:15 +0200143psa_status_t test_transparent_signature_verify_hash(
144 const psa_key_attributes_t *attributes,
Ronald Cronb5399a82020-12-10 09:35:33 +0100145 const uint8_t *key_buffer, size_t key_buffer_size,
Steven Cooreman55ae2172020-07-17 19:46:15 +0200146 psa_algorithm_t alg,
147 const uint8_t *hash, size_t hash_length,
148 const uint8_t *signature, size_t signature_length )
149{
Steven Cooreman831c6952020-09-07 12:58:16 +0200150 ++test_driver_signature_verify_hooks.hits;
Steven Cooreman55ae2172020-07-17 19:46:15 +0200151
Steven Cooreman831c6952020-09-07 12:58:16 +0200152 if( test_driver_signature_verify_hooks.forced_status != PSA_SUCCESS )
153 return( test_driver_signature_verify_hooks.forced_status );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200154
Ronald Crond2fb8542020-12-09 15:18:01 +0100155#if defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_SIGN) || \
156 defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PSS)
157 if( PSA_KEY_TYPE_IS_RSA( attributes->core.type ) )
158 {
159 return( mbedtls_transparent_test_driver_rsa_verify_hash(
160 attributes,
161 key_buffer, key_buffer_size,
162 alg, hash, hash_length,
163 signature, signature_length ) );
164 }
Ronald Cronb5399a82020-12-10 09:35:33 +0100165 else
Ronald Crond2fb8542020-12-09 15:18:01 +0100166#endif /* defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_SIGN) ||
167 * defined(MBEDTLS_PSA_ACCEL_ALG_RSA_PSS) */
168
Ronald Cronb5399a82020-12-10 09:35:33 +0100169#if defined(MBEDTLS_PSA_ACCEL_ALG_ECDSA) || \
170 defined(MBEDTLS_PSA_ACCEL_ALG_DETERMINISTIC_ECDSA)
171 if( PSA_KEY_TYPE_IS_ECC( attributes->core.type ) )
Steven Cooreman55ae2172020-07-17 19:46:15 +0200172 {
Ronald Cronb5399a82020-12-10 09:35:33 +0100173 if( PSA_ALG_IS_ECDSA( alg ) )
174 {
175 return( mbedtls_transparent_test_driver_ecdsa_verify_hash(
176 attributes,
177 key_buffer, key_buffer_size,
178 alg, hash, hash_length,
179 signature, signature_length ) );
180 }
181 else
182 {
183 return( PSA_ERROR_INVALID_ARGUMENT );
184 }
Steven Cooreman55ae2172020-07-17 19:46:15 +0200185 }
Steven Cooreman55ae2172020-07-17 19:46:15 +0200186 else
Ronald Cronb5399a82020-12-10 09:35:33 +0100187#endif /* defined(MBEDTLS_PSA_ACCEL_ALG_ECDSA) ||
188 * defined(MBEDTLS_PSA_ACCEL_ALG_DETERMINISTIC_ECDSA) */
Steven Cooreman55ae2172020-07-17 19:46:15 +0200189 {
Ronald Cronb5399a82020-12-10 09:35:33 +0100190 (void)attributes;
191 (void)key_buffer;
192 (void)key_buffer_size;
193 (void)alg;
194 (void)hash;
195 (void)hash_length;
196 (void)signature;
197 (void)signature_length;
198
199 return( PSA_ERROR_NOT_SUPPORTED );
Steven Cooreman55ae2172020-07-17 19:46:15 +0200200 }
Steven Cooreman55ae2172020-07-17 19:46:15 +0200201}
202
203psa_status_t test_opaque_signature_verify_hash(
204 const psa_key_attributes_t *attributes,
205 const uint8_t *key, size_t key_length,
206 psa_algorithm_t alg,
207 const uint8_t *hash, size_t hash_length,
208 const uint8_t *signature, size_t signature_length )
209{
210 (void) attributes;
211 (void) key;
212 (void) key_length;
213 (void) alg;
214 (void) hash;
215 (void) hash_length;
216 (void) signature;
217 (void) signature_length;
218 return( PSA_ERROR_NOT_SUPPORTED );
219}
220
Steven Cooremanf1720ea2020-07-24 18:41:58 +0200221#endif /* MBEDTLS_PSA_CRYPTO_DRIVERS && PSA_CRYPTO_DRIVER_TEST */