blob: 80a7788814730cf188f9e697f8bc159cacb0bf08 [file] [log] [blame]
Gilles Peskinee59236f2018-01-27 23:32:46 +01001/* BEGIN_HEADER */
2#include "psa/crypto.h"
3/* END_HEADER */
4
5/* BEGIN_DEPENDENCIES
6 * depends_on:MBEDTLS_PSA_CRYPTO_C
7 * END_DEPENDENCIES
8 */
9
10/* BEGIN_CASE */
11void init_deinit()
12{
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010013 psa_status_t status;
Gilles Peskinee59236f2018-01-27 23:32:46 +010014 int i;
15 for( i = 0; i <= 1; i++ )
16 {
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010017 status = psa_crypto_init( );
18 TEST_ASSERT( status == PSA_SUCCESS );
19 status = psa_crypto_init( );
20 TEST_ASSERT( status == PSA_SUCCESS );
Gilles Peskinee59236f2018-01-27 23:32:46 +010021 mbedtls_psa_crypto_free( );
22 }
23}
24/* END_CASE */
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010025
26/* BEGIN_CASE */
27void import( char *hex, int type, int expected_status )
28{
29 int slot = 1;
30 psa_status_t status;
31 unsigned char *data = NULL;
32 size_t data_size;
33
34 data_size = strlen( hex ) / 2;
35 data = mbedtls_calloc( 1, data_size );
36 TEST_ASSERT( data != NULL );
37 data_size = unhexify( data, hex );
38 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
39
40 status = psa_import_key( slot, type, data, data_size );
41 TEST_ASSERT( status == (psa_status_t) expected_status );
42 if( status == PSA_SUCCESS )
43 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
44
45exit:
46 mbedtls_free( data );
47 mbedtls_psa_crypto_free( );
48}
49/* END_CASE */
50
51/* BEGIN_CASE */
52void import_export( char *hex, int type_arg,
53 int expected_bits,
54 int export_size_delta,
55 int expected_export_status,
56 int canonical_input )
57{
58 int slot = 1;
59 int slot2 = slot + 1;
60 psa_key_type_t type = type_arg;
61 psa_status_t status;
62 unsigned char *data = NULL;
63 unsigned char *exported = NULL;
64 unsigned char *reexported = NULL;
65 size_t data_size;
66 size_t export_size;
67 size_t exported_length;
68 size_t reexported_length;
69 psa_key_type_t got_type;
70 size_t got_bits;
71
72 data_size = strlen( hex ) / 2;
73 data = mbedtls_calloc( 1, data_size );
74 TEST_ASSERT( data != NULL );
75 data_size = unhexify( data, hex );
76 export_size = (ssize_t) data_size + export_size_delta;
77 exported = mbedtls_calloc( 1, export_size );
78 TEST_ASSERT( exported != NULL );
79 if( ! canonical_input )
80 {
81 reexported = mbedtls_calloc( 1, export_size );
82 TEST_ASSERT( reexported != NULL );
83 }
84 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
85
86 /* Import the key */
87 TEST_ASSERT( psa_import_key( slot, type,
88 data, data_size ) == PSA_SUCCESS );
89
90 /* Test the key information */
91 TEST_ASSERT( psa_get_key_information( slot,
92 &got_type, &got_bits ) ==
93 PSA_SUCCESS );
94 TEST_ASSERT( got_type == type );
95 TEST_ASSERT( got_bits == (size_t) expected_bits );
96
97 /* Export the key */
98 status = psa_export_key( slot,
99 exported, export_size,
100 &exported_length );
101 TEST_ASSERT( status == (psa_status_t) expected_export_status );
102 if( status != PSA_SUCCESS )
103 goto destroy;
104
105 if( canonical_input )
106 {
107 TEST_ASSERT( exported_length == data_size );
108 TEST_ASSERT( memcmp( exported, data, data_size ) == 0 );
109 }
110 else
111 {
112 TEST_ASSERT( psa_import_key( slot2, type,
113 exported, export_size ) ==
114 PSA_SUCCESS );
115 TEST_ASSERT( psa_export_key( slot2,
116 reexported, export_size,
117 &reexported_length ) ==
118 PSA_SUCCESS );
119 TEST_ASSERT( reexported_length == exported_length );
120 TEST_ASSERT( memcmp( reexported, exported,
121 exported_length ) == 0 );
122 }
123
124destroy:
125 /* Destroy the key */
126 TEST_ASSERT( psa_destroy_key( slot ) == PSA_SUCCESS );
127 TEST_ASSERT( psa_get_key_information(
128 slot, NULL, NULL ) == PSA_ERROR_EMPTY_SLOT );
129
130exit:
131 mbedtls_free( data );
132 mbedtls_psa_crypto_free( );
133}
134/* END_CASE */
Gilles Peskine20035e32018-02-03 22:44:14 +0100135
136/* BEGIN_CASE */
Gilles Peskine0189e752018-02-03 23:57:22 +0100137void signature_size( int type_arg, int bits, int alg_arg, int expected_size_arg )
138{
139 psa_key_type_t type = type_arg;
140 psa_algorithm_t alg = alg_arg;
141 size_t actual_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE(type, bits, alg);
142 TEST_ASSERT( actual_size == (size_t) expected_size_arg );
143exit:
144 ;
145}
146/* END_CASE */
147
148/* BEGIN_CASE */
Gilles Peskine20035e32018-02-03 22:44:14 +0100149void sign_deterministic( int key_type_arg, char *key_hex,
150 int alg_arg, char *input_hex, char *output_hex )
151{
152 int slot = 1;
153 psa_key_type_t key_type = key_type_arg;
154 psa_algorithm_t alg = alg_arg;
155 unsigned char *key_data = NULL;
156 size_t key_size;
Gilles Peskine0189e752018-02-03 23:57:22 +0100157 size_t key_bits;
Gilles Peskine20035e32018-02-03 22:44:14 +0100158 unsigned char *input_data = NULL;
159 size_t input_size;
160 unsigned char *output_data = NULL;
161 size_t output_size;
Gilles Peskine20035e32018-02-03 22:44:14 +0100162 size_t signature_length;
Gilles Peskine0189e752018-02-03 23:57:22 +0100163 unsigned char *signature = NULL;
164 size_t signature_size;
Gilles Peskine20035e32018-02-03 22:44:14 +0100165
166 key_data = mbedtls_calloc( 1, strlen( key_hex ) / 2 );
167 TEST_ASSERT( key_data != NULL );
168 key_size = unhexify( key_data, key_hex );
169 input_data = mbedtls_calloc( 1, strlen( input_hex ) / 2 );
170 TEST_ASSERT( input_data != NULL );
171 input_size = unhexify( input_data, input_hex );
172 output_data = mbedtls_calloc( 1, strlen( output_hex ) / 2 );
173 TEST_ASSERT( output_data != NULL );
174 output_size = unhexify( output_data, output_hex );
175
176 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
177
178 TEST_ASSERT( psa_import_key( slot, key_type,
179 key_data, key_size ) == PSA_SUCCESS );
Gilles Peskine0189e752018-02-03 23:57:22 +0100180 TEST_ASSERT( psa_get_key_information( slot,
181 NULL,
182 &key_bits ) == PSA_SUCCESS );
183
184 signature_size = PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE( key_type, alg, key_bits );
185 TEST_ASSERT( signature_size != 0 );
186 signature = mbedtls_calloc( 1, signature_size );
187 TEST_ASSERT( signature != NULL );
Gilles Peskine20035e32018-02-03 22:44:14 +0100188
189 TEST_ASSERT( psa_asymmetric_sign( slot, alg,
190 input_data, input_size,
191 NULL, 0,
Gilles Peskine0189e752018-02-03 23:57:22 +0100192 signature, signature_size,
Gilles Peskine20035e32018-02-03 22:44:14 +0100193 &signature_length ) == PSA_SUCCESS );
194 TEST_ASSERT( signature_length == output_size );
195 TEST_ASSERT( memcmp( signature, output_data, output_size ) == 0 );
196
197exit:
198 psa_destroy_key( slot );
199 mbedtls_free( key_data );
200 mbedtls_free( input_data );
201 mbedtls_free( output_data );
Gilles Peskine0189e752018-02-03 23:57:22 +0100202 mbedtls_free( signature );
Gilles Peskine20035e32018-02-03 22:44:14 +0100203 mbedtls_psa_crypto_free( );
204}
205/* END_CASE */
206
207/* BEGIN_CASE */
208void sign_fail( int key_type_arg, char *key_hex,
209 int alg_arg, char *input_hex,
210 int signature_size, int expected_status_arg )
211{
212 int slot = 1;
213 psa_key_type_t key_type = key_type_arg;
214 psa_algorithm_t alg = alg_arg;
215 unsigned char *key_data = NULL;
216 size_t key_size;
217 unsigned char *input_data = NULL;
218 size_t input_size;
219 psa_status_t actual_status;
220 psa_status_t expected_status = expected_status_arg;
221 unsigned char *signature;
222 size_t signature_length;
223
224 key_data = mbedtls_calloc( 1, strlen( key_hex ) / 2 );
225 TEST_ASSERT( key_data != NULL );
226 key_size = unhexify( key_data, key_hex );
227 input_data = mbedtls_calloc( 1, strlen( input_hex ) / 2 );
228 TEST_ASSERT( input_data != NULL );
229 input_size = unhexify( input_data, input_hex );
230 signature = mbedtls_calloc( 1, signature_size );
231 TEST_ASSERT( signature != NULL );
232
233 TEST_ASSERT( psa_crypto_init( ) == PSA_SUCCESS );
234
235 TEST_ASSERT( psa_import_key( slot, key_type,
236 key_data, key_size ) == PSA_SUCCESS );
237
238 actual_status = psa_asymmetric_sign( slot, alg,
239 input_data, input_size,
240 NULL, 0,
241 signature, signature_size,
242 &signature_length );
243 TEST_ASSERT( actual_status == expected_status );
244
245exit:
246 psa_destroy_key( slot );
247 mbedtls_free( key_data );
248 mbedtls_free( input_data );
249 mbedtls_free( signature );
250 mbedtls_psa_crypto_free( );
251}
252/* END_CASE */