blob: 55a8663210d258e0709839961860b47c59d0efc6 [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
6static int pk_genkey( pk_context *pk )
7{
Paul Bakkera5320902013-12-19 17:29:52 +01008 ((void) pk);
9
10#if defined(POLARSSL_RSA_C) && defined(POLARSSL_GENPRIME)
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +020011 if( pk_get_type( pk ) == POLARSSL_PK_RSA )
12 return rsa_gen_key( pk_rsa( *pk ), rnd_std_rand, NULL, 512, 3 );
13#endif
14#if defined(POLARSSL_ECP_C)
15 if( pk_get_type( pk ) == POLARSSL_PK_ECKEY ||
16 pk_get_type( pk ) == POLARSSL_PK_ECKEY_DH ||
17 pk_get_type( pk ) == POLARSSL_PK_ECDSA )
18 {
19 int ret;
20 if( ( ret = ecp_use_known_dp( &pk_ec( *pk )->grp,
21 POLARSSL_ECP_DP_SECP192R1 ) ) != 0 )
22 return( ret );
23
24 return ecp_gen_keypair( &pk_ec( *pk )->grp, &pk_ec( *pk )->d,
25 &pk_ec( *pk )->Q, rnd_std_rand, NULL );
26 }
27#endif
28 return( -1 );
29}
30/* END_HEADER */
31
32/* BEGIN_DEPENDENCIES
33 * depends_on:POLARSSL_PK_C
34 * END_DEPENDENCIES
35 */
36
37/* BEGIN_CASE */
38void pk_utils( int type, int size, int len, char *name )
39{
40 pk_context pk;
41
42 pk_init( &pk );
43
44 TEST_ASSERT( pk_init_ctx( &pk, pk_info_from_type( type ) ) == 0 );
45 TEST_ASSERT( pk_genkey( &pk ) == 0 );
46
47 TEST_ASSERT( (int) pk_get_type( &pk ) == type );
48 TEST_ASSERT( pk_can_do( &pk, type ) );
49 TEST_ASSERT( pk_get_size( &pk ) == (unsigned) size );
50 TEST_ASSERT( pk_get_len( &pk ) == (unsigned) len );
51 TEST_ASSERT( strcmp( pk_get_name( &pk), name ) == 0 );
52
53 pk_free( &pk );
54}
55/* END_CASE */
56
Manuel Pégourié-Gonnardb4fae572014-01-20 11:22:25 +010057/* BEGIN_CASE */
58void pk_set_rsa_padding( int type, int padding, int hash_id, int ret )
59{
60 pk_context pk;
61 unsigned char hash[50], sig[5000];
62 size_t sig_len;
63
64 pk_init( &pk );
65
66 memset( hash, 0x2a, sizeof hash );
67 memset( sig, 0, sizeof sig );
68
69 TEST_ASSERT( pk_init_ctx( &pk, pk_info_from_type( type ) ) == 0 );
70 TEST_ASSERT( pk_rsa_set_padding( &pk, padding, hash_id ) == ret );
71
72 pk_free( &pk );
73}
74/* END_CASE */
75
Manuel Pégourié-Gonnard748190d2013-10-17 13:13:07 +020076/* BEGIN_CASE depends_on:POLARSSL_RSA_C */
Manuel Pégourié-Gonnardb4fae572014-01-20 11:22:25 +010077void pk_rsa_verify_test_vec( char *message_hex_string, int digest, int scheme,
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +020078 int mod, int radix_N, char *input_N, int radix_E,
79 char *input_E, char *result_hex_str, int result )
80{
81 unsigned char message_str[1000];
82 unsigned char hash_result[1000];
83 unsigned char result_str[1000];
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +020084 pk_context pk;
85 int msg_len;
86
87 pk_init( &pk );
88
89 memset( message_str, 0x00, 1000 );
90 memset( hash_result, 0x00, 1000 );
91 memset( result_str, 0x00, 1000 );
92
93 TEST_ASSERT( pk_init_ctx( &pk, pk_info_from_type( POLARSSL_PK_RSA ) ) == 0 );
Manuel Pégourié-Gonnardb4fae572014-01-20 11:22:25 +010094 TEST_ASSERT( pk_rsa_set_padding( &pk, scheme, digest ) == 0 );
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +020095
Manuel Pégourié-Gonnardb4fae572014-01-20 11:22:25 +010096 /* Set RSA key manually */
97 {
98 rsa_context *rsa = pk_rsa( pk );
99
100 rsa->len = mod / 8;
101 TEST_ASSERT( mpi_read_string( &rsa->N, radix_N, input_N ) == 0 );
102 TEST_ASSERT( mpi_read_string( &rsa->E, radix_E, input_E ) == 0 );
103 }
Manuel Pégourié-Gonnardb0a467f2013-09-21 12:31:05 +0200104
105 msg_len = unhexify( message_str, message_hex_string );
106 unhexify( result_str, result_hex_str );
107
108 if( md_info_from_type( digest ) != NULL )
109 TEST_ASSERT( md( md_info_from_type( digest ), message_str, msg_len, hash_result ) == 0 );
110
111 TEST_ASSERT( pk_verify( &pk, digest, hash_result, 0,
112 result_str, pk_get_len( &pk ) ) == result );
113
114 pk_free( &pk );
115}
116/* END_CASE */
117
118/* BEGIN_CASE depends_on:POLARSSL_ECDSA_C */
119void pk_ec_test_vec( int type, int id, char *key_str,
120 char *hash_str, char * sig_str, int ret )
121{
122 pk_context pk;
123 ecp_keypair *eckey;
124 unsigned char hash[100], sig[500], key[500];
125 size_t hash_len, sig_len, key_len;
126
127 pk_init( &pk );
128
129 memset( hash, 0, sizeof( hash ) ); hash_len = unhexify(hash, hash_str);
130 memset( sig, 0, sizeof( sig ) ); sig_len = unhexify(sig, sig_str);
131 memset( key, 0, sizeof( key ) ); key_len = unhexify(key, key_str);
132
133 TEST_ASSERT( pk_init_ctx( &pk, pk_info_from_type( type ) ) == 0 );
134
135 TEST_ASSERT( pk_can_do( &pk, POLARSSL_PK_ECDSA ) );
136 eckey = pk_ec( pk );
137
138 TEST_ASSERT( ecp_use_known_dp( &eckey->grp, id ) == 0 );
139 TEST_ASSERT( ecp_point_read_binary( &eckey->grp, &eckey->Q,
140 key, key_len ) == 0 );
141
142 TEST_ASSERT( pk_verify( &pk, POLARSSL_MD_NONE,
143 hash, hash_len, sig, sig_len ) == ret );
144
145 pk_free( &pk );
146}
147/* END_CASE */
148
149/* BEGIN_CASE */
150void pk_sign_verify( int type, int sign_ret, int verify_ret )
151{
152 pk_context pk;
153 unsigned char hash[50], sig[5000];
154 size_t sig_len;
155
156 pk_init( &pk );
157
158 memset( hash, 0x2a, sizeof hash );
159 memset( sig, 0, sizeof sig );
160
161 TEST_ASSERT( pk_init_ctx( &pk, pk_info_from_type( type ) ) == 0 );
162 TEST_ASSERT( pk_genkey( &pk ) == 0 );
163
164 TEST_ASSERT( pk_sign( &pk, POLARSSL_MD_NONE, hash, sizeof hash,
165 sig, &sig_len, rnd_std_rand, NULL ) == sign_ret );
166
167 TEST_ASSERT( pk_verify( &pk, POLARSSL_MD_NONE,
168 hash, sizeof hash, sig, sig_len ) == verify_ret );
169
170 pk_free( &pk );
171}
172/* END_CASE */
Manuel Pégourié-Gonnard67d45832013-10-17 12:34:16 +0200173
174/* BEGIN_CASE depends_on:POLARSSL_RSA_C */
175void pk_rsa_encrypt_test_vec( char *message_hex, int mod,
176 int radix_N, char *input_N,
177 int radix_E, char *input_E,
178 char *result_hex, int ret )
179{
180 unsigned char message[1000];
181 unsigned char output[1000];
182 unsigned char result[1000];
183 size_t msg_len, olen, res_len;
184 rnd_pseudo_info rnd_info;
185 rsa_context *rsa;
186 pk_context pk;
187
188 memset( &rnd_info, 0, sizeof( rnd_pseudo_info ) );
189 memset( message, 0, sizeof( message ) );
190 memset( output, 0, sizeof( output ) );
191 memset( result, 0, sizeof( result ) );
192
193 msg_len = unhexify( message, message_hex );
194 res_len = unhexify( result, result_hex );
195
196 pk_init( &pk );
197 TEST_ASSERT( pk_init_ctx( &pk, pk_info_from_type( POLARSSL_PK_RSA ) ) == 0 );
198 rsa = pk_rsa( pk );
199
200 rsa->len = mod / 8;
201 TEST_ASSERT( mpi_read_string( &rsa->N, radix_N, input_N ) == 0 );
202 TEST_ASSERT( mpi_read_string( &rsa->E, radix_E, input_E ) == 0 );
203
204 TEST_ASSERT( pk_encrypt( &pk, message, msg_len,
205 output, &olen, sizeof( output ),
206 rnd_pseudo_rand, &rnd_info ) == ret );
207 TEST_ASSERT( olen == res_len );
208 TEST_ASSERT( memcmp( output, result, olen ) == 0 );
209
210 pk_free( &pk );
211}
212/* END_CASE */
213
214/* BEGIN_CASE depends_on:POLARSSL_RSA_C */
215void pk_rsa_decrypt_test_vec( char *cipher_hex, int mod,
216 int radix_P, char *input_P,
217 int radix_Q, char *input_Q,
218 int radix_N, char *input_N,
219 int radix_E, char *input_E,
220 char *clear_hex, int ret )
221{
222 unsigned char clear[1000];
223 unsigned char output[1000];
224 unsigned char cipher[1000];
225 size_t clear_len, olen, cipher_len;
226 rnd_pseudo_info rnd_info;
227 mpi P1, Q1, H, G;
228 rsa_context *rsa;
229 pk_context pk;
230
231 pk_init( &pk );
232 mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
233
234 memset( &rnd_info, 0, sizeof( rnd_pseudo_info ) );
235 memset( clear, 0, sizeof( clear ) );
236 memset( cipher, 0, sizeof( cipher ) );
237
238 clear_len = unhexify( clear, clear_hex );
239 cipher_len = unhexify( cipher, cipher_hex );
240
241 /* init pk-rsa context */
242 TEST_ASSERT( pk_init_ctx( &pk, pk_info_from_type( POLARSSL_PK_RSA ) ) == 0 );
243 rsa = pk_rsa( pk );
244
245 /* load public key */
246 rsa->len = mod / 8;
247 TEST_ASSERT( mpi_read_string( &rsa->N, radix_N, input_N ) == 0 );
248 TEST_ASSERT( mpi_read_string( &rsa->E, radix_E, input_E ) == 0 );
249
250 /* load private key */
251 TEST_ASSERT( mpi_read_string( &rsa->P, radix_P, input_P ) == 0 );
252 TEST_ASSERT( mpi_read_string( &rsa->Q, radix_Q, input_Q ) == 0 );
253 TEST_ASSERT( mpi_sub_int( &P1, &rsa->P, 1 ) == 0 );
254 TEST_ASSERT( mpi_sub_int( &Q1, &rsa->Q, 1 ) == 0 );
255 TEST_ASSERT( mpi_mul_mpi( &H, &P1, &Q1 ) == 0 );
256 TEST_ASSERT( mpi_gcd( &G, &rsa->E, &H ) == 0 );
257 TEST_ASSERT( mpi_inv_mod( &rsa->D , &rsa->E, &H ) == 0 );
258 TEST_ASSERT( mpi_mod_mpi( &rsa->DP, &rsa->D, &P1 ) == 0 );
259 TEST_ASSERT( mpi_mod_mpi( &rsa->DQ, &rsa->D, &Q1 ) == 0 );
260 TEST_ASSERT( mpi_inv_mod( &rsa->QP, &rsa->Q, &rsa->P ) == 0 );
261
262 /* decryption test */
263 memset( output, 0, sizeof( output ) );
264 olen = 0;
265 TEST_ASSERT( pk_decrypt( &pk, cipher, cipher_len,
266 output, &olen, sizeof( output ),
267 rnd_pseudo_rand, &rnd_info ) == ret );
268 if( ret == 0 )
269 {
270 TEST_ASSERT( olen == clear_len );
271 TEST_ASSERT( memcmp( output, clear, olen ) == 0 );
272 }
273
274 mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
275 pk_free( &pk );
276}
277/* END_CASE */
Manuel Pégourié-Gonnard75c78822013-10-17 12:46:39 +0200278
279/* BEGIN_CASE */
280void pk_ec_nocrypt( int type )
281{
282 pk_context pk;
283 unsigned char output[100];
284 unsigned char input[100];
285 rnd_pseudo_info rnd_info;
286 size_t olen = 0;
287 int ret = POLARSSL_ERR_PK_TYPE_MISMATCH;
288
289 pk_init( &pk );
290
291 memset( &rnd_info, 0, sizeof( rnd_pseudo_info ) );
292 memset( output, 0, sizeof( output ) );
293 memset( input, 0, sizeof( input ) );
294
295 TEST_ASSERT( pk_init_ctx( &pk, pk_info_from_type( type ) ) == 0 );
296
297 TEST_ASSERT( pk_encrypt( &pk, input, sizeof( input ),
298 output, &olen, sizeof( output ),
299 rnd_pseudo_rand, &rnd_info ) == ret );
300
301 TEST_ASSERT( pk_decrypt( &pk, input, sizeof( input ),
302 output, &olen, sizeof( output ),
303 rnd_pseudo_rand, &rnd_info ) == ret );
304
305 pk_free( &pk );
306}
307/* END_CASE */