blob: c88d365881c96faa27cbeea0ba872953facc3306 [file] [log] [blame]
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +02001/* BEGIN_HEADER */
2#include <polarssl/pk.h>
3
4static int rnd_std_rand( void *rng_state, unsigned char *output, size_t len );
5
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +02006#define RSA_KEY_SIZE 512
7#define RSA_KEY_LEN 64
8
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +02009static int pk_genkey( pk_context *pk )
10{
Paul Bakkera5320902013-12-19 17:29:52 +010011 ((void) pk);
12
13#if defined(POLARSSL_RSA_C) && defined(POLARSSL_GENPRIME)
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +020014 if( pk_get_type( pk ) == POLARSSL_PK_RSA )
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +020015 return rsa_gen_key( pk_rsa( *pk ), rnd_std_rand, NULL, RSA_KEY_SIZE, 3 );
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +020016#endif
17#if defined(POLARSSL_ECP_C)
18 if( pk_get_type( pk ) == POLARSSL_PK_ECKEY ||
19 pk_get_type( pk ) == POLARSSL_PK_ECKEY_DH ||
20 pk_get_type( pk ) == POLARSSL_PK_ECDSA )
21 {
22 int ret;
23 if( ( ret = ecp_use_known_dp( &pk_ec( *pk )->grp,
24 POLARSSL_ECP_DP_SECP192R1 ) ) != 0 )
25 return( ret );
26
27 return ecp_gen_keypair( &pk_ec( *pk )->grp, &pk_ec( *pk )->d,
28 &pk_ec( *pk )->Q, rnd_std_rand, NULL );
29 }
30#endif
31 return( -1 );
32}
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +020033
34#if defined(POLARSSL_RSA_C)
35int rsa_decrypt_func( void *ctx, int mode, size_t *olen,
36 const unsigned char *input, unsigned char *output,
37 size_t output_max_len )
38{
39 return( rsa_pkcs1_decrypt( (rsa_context *) ctx, NULL, NULL, mode, olen,
40 input, output, output_max_len ) );
41}
42int rsa_sign_func( void *ctx,
43 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
44 int mode, md_type_t md_alg, unsigned int hashlen,
45 const unsigned char *hash, unsigned char *sig )
46{
47 return( rsa_pkcs1_sign( (rsa_context *) ctx, f_rng, p_rng, mode,
48 md_alg, hashlen, hash, sig ) );
49}
50size_t rsa_key_len_func( void *ctx )
51{
52 return( ((const rsa_context *) ctx)->len );
53}
54#endif /* POLARSSL_RSA_C */
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +020055/* END_HEADER */
56
57/* BEGIN_DEPENDENCIES
58 * depends_on:POLARSSL_PK_C
59 * END_DEPENDENCIES
60 */
61
62/* BEGIN_CASE */
63void pk_utils( int type, int size, int len, char *name )
64{
65 pk_context pk;
66
67 pk_init( &pk );
68
69 TEST_ASSERT( pk_init_ctx( &pk, pk_info_from_type( type ) ) == 0 );
70 TEST_ASSERT( pk_genkey( &pk ) == 0 );
71
72 TEST_ASSERT( (int) pk_get_type( &pk ) == type );
73 TEST_ASSERT( pk_can_do( &pk, type ) );
74 TEST_ASSERT( pk_get_size( &pk ) == (unsigned) size );
75 TEST_ASSERT( pk_get_len( &pk ) == (unsigned) len );
76 TEST_ASSERT( strcmp( pk_get_name( &pk), name ) == 0 );
77
Paul Bakkerbd51b262014-07-10 15:26:12 +020078exit:
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +020079 pk_free( &pk );
80}
81/* END_CASE */
82
Manuel Pégourié-Gonnard70bdadf2014-11-06 16:51:20 +010083/* BEGIN_CASE depends_on:POLARSSL_PK_PARSE_C */
84void pk_check_pair( char *pub_file, char *prv_file, int ret )
85{
Manuel Pégourié-Gonnarda1efcb02014-11-08 17:08:08 +010086 pk_context pub, prv, alt;
Manuel Pégourié-Gonnard70bdadf2014-11-06 16:51:20 +010087
88 pk_init( &pub );
89 pk_init( &prv );
Manuel Pégourié-Gonnarda1efcb02014-11-08 17:08:08 +010090 pk_init( &alt );
Manuel Pégourié-Gonnard70bdadf2014-11-06 16:51:20 +010091
92 TEST_ASSERT( pk_parse_public_keyfile( &pub, pub_file ) == 0 );
93 TEST_ASSERT( pk_parse_keyfile( &prv, prv_file, NULL ) == 0 );
94
95 TEST_ASSERT( pk_check_pair( &pub, &prv ) == ret );
96
Manuel Pégourié-Gonnarda1efcb02014-11-08 17:08:08 +010097 if( pk_get_type( &prv ) == POLARSSL_PK_RSA )
98 {
99 TEST_ASSERT( pk_init_ctx_rsa_alt( &alt, pk_rsa( prv ),
100 rsa_decrypt_func, rsa_sign_func, rsa_key_len_func ) == 0 );
101 TEST_ASSERT( pk_check_pair( &pub, &alt ) == ret );
102 }
103
Manuel Pégourié-Gonnard70bdadf2014-11-06 16:51:20 +0100104 pk_free( &pub );
105 pk_free( &prv );
Manuel Pégourié-Gonnarda1efcb02014-11-08 17:08:08 +0100106 pk_free( &alt );
Manuel Pégourié-Gonnard70bdadf2014-11-06 16:51:20 +0100107}
108/* END_CASE */
109
Manuel Pégourié-Gonnarddfab4c12014-01-22 15:45:04 +0100110/* BEGIN_CASE depends_on:POLARSSL_RSA_C */
Paul Bakker42099c32014-01-27 11:45:49 +0100111void pk_rsa_verify_test_vec( char *message_hex_string, int digest,
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200112 int mod, int radix_N, char *input_N, int radix_E,
113 char *input_E, char *result_hex_str, int result )
114{
115 unsigned char message_str[1000];
116 unsigned char hash_result[1000];
117 unsigned char result_str[1000];
Paul Bakker42099c32014-01-27 11:45:49 +0100118 rsa_context *rsa;
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200119 pk_context pk;
120 int msg_len;
121
122 pk_init( &pk );
123
124 memset( message_str, 0x00, 1000 );
125 memset( hash_result, 0x00, 1000 );
126 memset( result_str, 0x00, 1000 );
127
128 TEST_ASSERT( pk_init_ctx( &pk, pk_info_from_type( POLARSSL_PK_RSA ) ) == 0 );
Paul Bakker42099c32014-01-27 11:45:49 +0100129 rsa = pk_rsa( pk );
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200130
Paul Bakker42099c32014-01-27 11:45:49 +0100131 rsa->len = mod / 8;
132 TEST_ASSERT( mpi_read_string( &rsa->N, radix_N, input_N ) == 0 );
133 TEST_ASSERT( mpi_read_string( &rsa->E, radix_E, input_E ) == 0 );
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200134
135 msg_len = unhexify( message_str, message_hex_string );
136 unhexify( result_str, result_hex_str );
137
138 if( md_info_from_type( digest ) != NULL )
139 TEST_ASSERT( md( md_info_from_type( digest ), message_str, msg_len, hash_result ) == 0 );
140
141 TEST_ASSERT( pk_verify( &pk, digest, hash_result, 0,
142 result_str, pk_get_len( &pk ) ) == result );
143
Paul Bakkerbd51b262014-07-10 15:26:12 +0200144exit:
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200145 pk_free( &pk );
146}
147/* END_CASE */
148
Manuel Pégourié-Gonnard20422e92014-06-05 13:41:44 +0200149/* BEGIN_CASE depends_on:POLARSSL_RSA_C */
150void pk_rsa_verify_ext_test_vec( char *message_hex_string, int digest,
151 int mod, int radix_N, char *input_N, int radix_E,
152 char *input_E, char *result_hex_str,
153 int pk_type, int mgf1_hash_id, int salt_len,
154 int result )
155{
156 unsigned char message_str[1000];
157 unsigned char hash_result[1000];
158 unsigned char result_str[1000];
159 rsa_context *rsa;
160 pk_context pk;
161 pk_rsassa_pss_options pss_opts;
162 void *options;
163 int msg_len;
164 size_t hash_len;
165
166 pk_init( &pk );
167
168 memset( message_str, 0x00, 1000 );
169 memset( hash_result, 0x00, 1000 );
170 memset( result_str, 0x00, 1000 );
171
172 TEST_ASSERT( pk_init_ctx( &pk, pk_info_from_type( POLARSSL_PK_RSA ) ) == 0 );
173 rsa = pk_rsa( pk );
174
175 rsa->len = mod / 8;
176 TEST_ASSERT( mpi_read_string( &rsa->N, radix_N, input_N ) == 0 );
177 TEST_ASSERT( mpi_read_string( &rsa->E, radix_E, input_E ) == 0 );
178
179 msg_len = unhexify( message_str, message_hex_string );
180 unhexify( result_str, result_hex_str );
181
182 if( digest != POLARSSL_MD_NONE )
183 {
184 TEST_ASSERT( md( md_info_from_type( digest ),
185 message_str, msg_len, hash_result ) == 0 );
186 hash_len = 0;
187 }
188 else
189 {
190 memcpy( hash_result, message_str, msg_len );
191 hash_len = msg_len;
192 }
193
194 if( mgf1_hash_id < 0 )
195 {
196 options = NULL;
197 }
198 else
199 {
200 options = &pss_opts;
201
202 pss_opts.mgf1_hash_id = mgf1_hash_id;
203 pss_opts.expected_salt_len = salt_len;
204 }
205
206 TEST_ASSERT( pk_verify_ext( pk_type, options, &pk,
207 digest, hash_result, hash_len,
208 result_str, pk_get_len( &pk ) ) == result );
209
Paul Bakkerbd51b262014-07-10 15:26:12 +0200210exit:
Manuel Pégourié-Gonnard20422e92014-06-05 13:41:44 +0200211 pk_free( &pk );
212}
213/* END_CASE */
214
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200215/* BEGIN_CASE depends_on:POLARSSL_ECDSA_C */
216void pk_ec_test_vec( int type, int id, char *key_str,
217 char *hash_str, char * sig_str, int ret )
218{
219 pk_context pk;
220 ecp_keypair *eckey;
221 unsigned char hash[100], sig[500], key[500];
222 size_t hash_len, sig_len, key_len;
223
224 pk_init( &pk );
225
226 memset( hash, 0, sizeof( hash ) ); hash_len = unhexify(hash, hash_str);
227 memset( sig, 0, sizeof( sig ) ); sig_len = unhexify(sig, sig_str);
228 memset( key, 0, sizeof( key ) ); key_len = unhexify(key, key_str);
229
230 TEST_ASSERT( pk_init_ctx( &pk, pk_info_from_type( type ) ) == 0 );
231
232 TEST_ASSERT( pk_can_do( &pk, POLARSSL_PK_ECDSA ) );
233 eckey = pk_ec( pk );
234
235 TEST_ASSERT( ecp_use_known_dp( &eckey->grp, id ) == 0 );
236 TEST_ASSERT( ecp_point_read_binary( &eckey->grp, &eckey->Q,
237 key, key_len ) == 0 );
238
239 TEST_ASSERT( pk_verify( &pk, POLARSSL_MD_NONE,
240 hash, hash_len, sig, sig_len ) == ret );
241
Paul Bakkerbd51b262014-07-10 15:26:12 +0200242exit:
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200243 pk_free( &pk );
244}
245/* END_CASE */
246
247/* BEGIN_CASE */
248void pk_sign_verify( int type, int sign_ret, int verify_ret )
249{
250 pk_context pk;
251 unsigned char hash[50], sig[5000];
252 size_t sig_len;
253
254 pk_init( &pk );
255
256 memset( hash, 0x2a, sizeof hash );
257 memset( sig, 0, sizeof sig );
258
259 TEST_ASSERT( pk_init_ctx( &pk, pk_info_from_type( type ) ) == 0 );
260 TEST_ASSERT( pk_genkey( &pk ) == 0 );
261
262 TEST_ASSERT( pk_sign( &pk, POLARSSL_MD_NONE, hash, sizeof hash,
263 sig, &sig_len, rnd_std_rand, NULL ) == sign_ret );
264
265 TEST_ASSERT( pk_verify( &pk, POLARSSL_MD_NONE,
266 hash, sizeof hash, sig, sig_len ) == verify_ret );
267
Paul Bakkerbd51b262014-07-10 15:26:12 +0200268exit:
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200269 pk_free( &pk );
270}
271/* END_CASE */
Manuel Pégourié-Gonnard67d45832013-10-17 12:34:16 +0200272
273/* BEGIN_CASE depends_on:POLARSSL_RSA_C */
274void pk_rsa_encrypt_test_vec( char *message_hex, int mod,
275 int radix_N, char *input_N,
276 int radix_E, char *input_E,
277 char *result_hex, int ret )
278{
279 unsigned char message[1000];
280 unsigned char output[1000];
281 unsigned char result[1000];
282 size_t msg_len, olen, res_len;
283 rnd_pseudo_info rnd_info;
284 rsa_context *rsa;
285 pk_context pk;
286
287 memset( &rnd_info, 0, sizeof( rnd_pseudo_info ) );
288 memset( message, 0, sizeof( message ) );
289 memset( output, 0, sizeof( output ) );
290 memset( result, 0, sizeof( result ) );
291
292 msg_len = unhexify( message, message_hex );
293 res_len = unhexify( result, result_hex );
294
295 pk_init( &pk );
296 TEST_ASSERT( pk_init_ctx( &pk, pk_info_from_type( POLARSSL_PK_RSA ) ) == 0 );
297 rsa = pk_rsa( pk );
298
299 rsa->len = mod / 8;
300 TEST_ASSERT( mpi_read_string( &rsa->N, radix_N, input_N ) == 0 );
301 TEST_ASSERT( mpi_read_string( &rsa->E, radix_E, input_E ) == 0 );
302
303 TEST_ASSERT( pk_encrypt( &pk, message, msg_len,
304 output, &olen, sizeof( output ),
305 rnd_pseudo_rand, &rnd_info ) == ret );
306 TEST_ASSERT( olen == res_len );
307 TEST_ASSERT( memcmp( output, result, olen ) == 0 );
308
Paul Bakkerbd51b262014-07-10 15:26:12 +0200309exit:
Manuel Pégourié-Gonnard67d45832013-10-17 12:34:16 +0200310 pk_free( &pk );
311}
312/* END_CASE */
313
314/* BEGIN_CASE depends_on:POLARSSL_RSA_C */
315void pk_rsa_decrypt_test_vec( char *cipher_hex, int mod,
316 int radix_P, char *input_P,
317 int radix_Q, char *input_Q,
318 int radix_N, char *input_N,
319 int radix_E, char *input_E,
320 char *clear_hex, int ret )
321{
322 unsigned char clear[1000];
323 unsigned char output[1000];
324 unsigned char cipher[1000];
325 size_t clear_len, olen, cipher_len;
326 rnd_pseudo_info rnd_info;
327 mpi P1, Q1, H, G;
328 rsa_context *rsa;
329 pk_context pk;
330
331 pk_init( &pk );
332 mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
333
334 memset( &rnd_info, 0, sizeof( rnd_pseudo_info ) );
335 memset( clear, 0, sizeof( clear ) );
336 memset( cipher, 0, sizeof( cipher ) );
337
338 clear_len = unhexify( clear, clear_hex );
339 cipher_len = unhexify( cipher, cipher_hex );
340
341 /* init pk-rsa context */
342 TEST_ASSERT( pk_init_ctx( &pk, pk_info_from_type( POLARSSL_PK_RSA ) ) == 0 );
343 rsa = pk_rsa( pk );
344
345 /* load public key */
346 rsa->len = mod / 8;
347 TEST_ASSERT( mpi_read_string( &rsa->N, radix_N, input_N ) == 0 );
348 TEST_ASSERT( mpi_read_string( &rsa->E, radix_E, input_E ) == 0 );
349
350 /* load private key */
351 TEST_ASSERT( mpi_read_string( &rsa->P, radix_P, input_P ) == 0 );
352 TEST_ASSERT( mpi_read_string( &rsa->Q, radix_Q, input_Q ) == 0 );
353 TEST_ASSERT( mpi_sub_int( &P1, &rsa->P, 1 ) == 0 );
354 TEST_ASSERT( mpi_sub_int( &Q1, &rsa->Q, 1 ) == 0 );
355 TEST_ASSERT( mpi_mul_mpi( &H, &P1, &Q1 ) == 0 );
356 TEST_ASSERT( mpi_gcd( &G, &rsa->E, &H ) == 0 );
357 TEST_ASSERT( mpi_inv_mod( &rsa->D , &rsa->E, &H ) == 0 );
358 TEST_ASSERT( mpi_mod_mpi( &rsa->DP, &rsa->D, &P1 ) == 0 );
359 TEST_ASSERT( mpi_mod_mpi( &rsa->DQ, &rsa->D, &Q1 ) == 0 );
360 TEST_ASSERT( mpi_inv_mod( &rsa->QP, &rsa->Q, &rsa->P ) == 0 );
361
362 /* decryption test */
363 memset( output, 0, sizeof( output ) );
364 olen = 0;
365 TEST_ASSERT( pk_decrypt( &pk, cipher, cipher_len,
366 output, &olen, sizeof( output ),
367 rnd_pseudo_rand, &rnd_info ) == ret );
368 if( ret == 0 )
369 {
370 TEST_ASSERT( olen == clear_len );
371 TEST_ASSERT( memcmp( output, clear, olen ) == 0 );
372 }
373
Paul Bakkerbd51b262014-07-10 15:26:12 +0200374exit:
Manuel Pégourié-Gonnard67d45832013-10-17 12:34:16 +0200375 mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
376 pk_free( &pk );
377}
378/* END_CASE */
Manuel Pégourié-Gonnard75c78822013-10-17 12:46:39 +0200379
380/* BEGIN_CASE */
381void pk_ec_nocrypt( int type )
382{
383 pk_context pk;
384 unsigned char output[100];
385 unsigned char input[100];
386 rnd_pseudo_info rnd_info;
387 size_t olen = 0;
388 int ret = POLARSSL_ERR_PK_TYPE_MISMATCH;
389
390 pk_init( &pk );
391
392 memset( &rnd_info, 0, sizeof( rnd_pseudo_info ) );
393 memset( output, 0, sizeof( output ) );
394 memset( input, 0, sizeof( input ) );
395
396 TEST_ASSERT( pk_init_ctx( &pk, pk_info_from_type( type ) ) == 0 );
397
398 TEST_ASSERT( pk_encrypt( &pk, input, sizeof( input ),
399 output, &olen, sizeof( output ),
400 rnd_pseudo_rand, &rnd_info ) == ret );
401
402 TEST_ASSERT( pk_decrypt( &pk, input, sizeof( input ),
403 output, &olen, sizeof( output ),
404 rnd_pseudo_rand, &rnd_info ) == ret );
405
Paul Bakkerbd51b262014-07-10 15:26:12 +0200406exit:
Manuel Pégourié-Gonnard75c78822013-10-17 12:46:39 +0200407 pk_free( &pk );
408}
409/* END_CASE */
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +0200410
411/* BEGIN_CASE depends_on:POLARSSL_RSA_C */
412void pk_rsa_alt( )
413{
414 /*
415 * An rsa_alt context can only do private operations (decrypt, sign).
416 * Test it against the public operations (encrypt, verify) of a
417 * corresponding rsa context.
418 */
419 rsa_context raw;
420 pk_context rsa, alt;
421 pk_debug_item dbg_items[10];
422 unsigned char hash[50], sig[1000];
423 unsigned char msg[50], ciph[1000], test[1000];
424 size_t sig_len, ciph_len, test_len;
425 int ret = POLARSSL_ERR_PK_TYPE_MISMATCH;
426
427 rsa_init( &raw, RSA_PKCS_V15, POLARSSL_MD_NONE );
428 pk_init( &rsa ); pk_init( &alt );
429
430 memset( hash, 0x2a, sizeof hash );
431 memset( sig, 0, sizeof sig );
432 memset( msg, 0x2a, sizeof msg );
433 memset( ciph, 0, sizeof ciph );
434 memset( test, 0, sizeof test );
435
436 /* Initiliaze PK RSA context with random key */
437 TEST_ASSERT( pk_init_ctx( &rsa,
438 pk_info_from_type( POLARSSL_PK_RSA ) ) == 0 );
439 TEST_ASSERT( pk_genkey( &rsa ) == 0 );
440
441 /* Extract key to the raw rsa context */
442 TEST_ASSERT( rsa_copy( &raw, pk_rsa( rsa ) ) == 0 );
443
444 /* Initialize PK RSA_ALT context */
445 TEST_ASSERT( pk_init_ctx_rsa_alt( &alt, (void *) &raw,
446 rsa_decrypt_func, rsa_sign_func, rsa_key_len_func ) == 0 );
447
448 /* Test administrative functions */
449 TEST_ASSERT( pk_can_do( &alt, POLARSSL_PK_RSA ) );
450 TEST_ASSERT( pk_get_size( &alt ) == RSA_KEY_SIZE );
451 TEST_ASSERT( pk_get_len( &alt ) == RSA_KEY_LEN );
452 TEST_ASSERT( pk_get_type( &alt ) == POLARSSL_PK_RSA_ALT );
453 TEST_ASSERT( strcmp( pk_get_name( &alt ), "RSA-alt" ) == 0 );
454
455 /* Test signature */
456 TEST_ASSERT( pk_sign( &alt, POLARSSL_MD_NONE, hash, sizeof hash,
457 sig, &sig_len, rnd_std_rand, NULL ) == 0 );
458 TEST_ASSERT( sig_len == RSA_KEY_LEN );
459 TEST_ASSERT( pk_verify( &rsa, POLARSSL_MD_NONE,
460 hash, sizeof hash, sig, sig_len ) == 0 );
461
462 /* Test decrypt */
463 TEST_ASSERT( pk_encrypt( &rsa, msg, sizeof msg,
464 ciph, &ciph_len, sizeof ciph,
465 rnd_std_rand, NULL ) == 0 );
466 TEST_ASSERT( pk_decrypt( &alt, ciph, ciph_len,
467 test, &test_len, sizeof test,
468 rnd_std_rand, NULL ) == 0 );
469 TEST_ASSERT( test_len == sizeof msg );
470 TEST_ASSERT( memcmp( test, msg, test_len ) == 0 );
471
472 /* Test forbidden operations */
473 TEST_ASSERT( pk_encrypt( &alt, msg, sizeof msg,
474 ciph, &ciph_len, sizeof ciph,
475 rnd_std_rand, NULL ) == ret );
476 TEST_ASSERT( pk_verify( &alt, POLARSSL_MD_NONE,
477 hash, sizeof hash, sig, sig_len ) == ret );
478 TEST_ASSERT( pk_debug( &alt, dbg_items ) == ret );
479
Paul Bakkerbd51b262014-07-10 15:26:12 +0200480exit:
Manuel Pégourié-Gonnard01488752014-04-03 22:09:18 +0200481 rsa_free( &raw );
482 pk_free( &rsa ); pk_free( &alt );
483}
484/* END_CASE */