PolarSSL v1.2.5
test_suite_rsa.c
Go to the documentation of this file.
1 #include "fct.h"
2 
3 #include <polarssl/rsa.h>
4 #include <polarssl/md2.h>
5 #include <polarssl/md4.h>
6 #include <polarssl/md5.h>
7 #include <polarssl/sha1.h>
8 #include <polarssl/sha2.h>
9 #include <polarssl/sha4.h>
10 #include <polarssl/entropy.h>
11 #include <polarssl/ctr_drbg.h>
12 
13 #include <polarssl/config.h>
14 
15 #ifdef _MSC_VER
16 #include <basetsd.h>
17 typedef UINT32 uint32_t;
18 #else
19 #include <inttypes.h>
20 #endif
21 
22 /*
23  * 32-bit integer manipulation macros (big endian)
24  */
25 #ifndef GET_UINT32_BE
26 #define GET_UINT32_BE(n,b,i) \
27 { \
28  (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
29  | ( (uint32_t) (b)[(i) + 1] << 16 ) \
30  | ( (uint32_t) (b)[(i) + 2] << 8 ) \
31  | ( (uint32_t) (b)[(i) + 3] ); \
32 }
33 #endif
34 
35 #ifndef PUT_UINT32_BE
36 #define PUT_UINT32_BE(n,b,i) \
37 { \
38  (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
39  (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
40  (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
41  (b)[(i) + 3] = (unsigned char) ( (n) ); \
42 }
43 #endif
44 
45 int unhexify(unsigned char *obuf, const char *ibuf)
46 {
47  unsigned char c, c2;
48  int len = strlen(ibuf) / 2;
49  assert(!(strlen(ibuf) %1)); // must be even number of bytes
50 
51  while (*ibuf != 0)
52  {
53  c = *ibuf++;
54  if( c >= '0' && c <= '9' )
55  c -= '0';
56  else if( c >= 'a' && c <= 'f' )
57  c -= 'a' - 10;
58  else if( c >= 'A' && c <= 'F' )
59  c -= 'A' - 10;
60  else
61  assert( 0 );
62 
63  c2 = *ibuf++;
64  if( c2 >= '0' && c2 <= '9' )
65  c2 -= '0';
66  else if( c2 >= 'a' && c2 <= 'f' )
67  c2 -= 'a' - 10;
68  else if( c2 >= 'A' && c2 <= 'F' )
69  c2 -= 'A' - 10;
70  else
71  assert( 0 );
72 
73  *obuf++ = ( c << 4 ) | c2;
74  }
75 
76  return len;
77 }
78 
79 void hexify(unsigned char *obuf, const unsigned char *ibuf, int len)
80 {
81  unsigned char l, h;
82 
83  while (len != 0)
84  {
85  h = (*ibuf) / 16;
86  l = (*ibuf) % 16;
87 
88  if( h < 10 )
89  *obuf++ = '0' + h;
90  else
91  *obuf++ = 'a' + h - 10;
92 
93  if( l < 10 )
94  *obuf++ = '0' + l;
95  else
96  *obuf++ = 'a' + l - 10;
97 
98  ++ibuf;
99  len--;
100  }
101 }
102 
112 static int rnd_std_rand( void *rng_state, unsigned char *output, size_t len )
113 {
114  size_t i;
115 
116  if( rng_state != NULL )
117  rng_state = NULL;
118 
119  for( i = 0; i < len; ++i )
120  output[i] = rand();
121 
122  return( 0 );
123 }
124 
130 static int rnd_zero_rand( void *rng_state, unsigned char *output, size_t len )
131 {
132  if( rng_state != NULL )
133  rng_state = NULL;
134 
135  memset( output, 0, len );
136 
137  return( 0 );
138 }
139 
140 typedef struct
141 {
142  unsigned char *buf;
143  size_t length;
144 } rnd_buf_info;
145 
157 static int rnd_buffer_rand( void *rng_state, unsigned char *output, size_t len )
158 {
159  rnd_buf_info *info = (rnd_buf_info *) rng_state;
160  size_t use_len;
161 
162  if( rng_state == NULL )
163  return( rnd_std_rand( NULL, output, len ) );
164 
165  use_len = len;
166  if( len > info->length )
167  use_len = info->length;
168 
169  if( use_len )
170  {
171  memcpy( output, info->buf, use_len );
172  info->buf += use_len;
173  info->length -= use_len;
174  }
175 
176  if( len - use_len > 0 )
177  return( rnd_std_rand( NULL, output + use_len, len - use_len ) );
178 
179  return( 0 );
180 }
181 
189 typedef struct
190 {
191  uint32_t key[16];
192  uint32_t v0, v1;
194 
203 static int rnd_pseudo_rand( void *rng_state, unsigned char *output, size_t len )
204 {
205  rnd_pseudo_info *info = (rnd_pseudo_info *) rng_state;
206  uint32_t i, *k, sum, delta=0x9E3779B9;
207  unsigned char result[4];
208 
209  if( rng_state == NULL )
210  return( rnd_std_rand( NULL, output, len ) );
211 
212  k = info->key;
213 
214  while( len > 0 )
215  {
216  size_t use_len = ( len > 4 ) ? 4 : len;
217  sum = 0;
218 
219  for( i = 0; i < 32; i++ )
220  {
221  info->v0 += (((info->v1 << 4) ^ (info->v1 >> 5)) + info->v1) ^ (sum + k[sum & 3]);
222  sum += delta;
223  info->v1 += (((info->v0 << 4) ^ (info->v0 >> 5)) + info->v0) ^ (sum + k[(sum>>11) & 3]);
224  }
225 
226  PUT_UINT32_BE( info->v0, result, 0 );
227  memcpy( output, result, use_len );
228  len -= use_len;
229  }
230 
231  return( 0 );
232 }
233 
234 
236 {
237 #ifdef POLARSSL_RSA_C
238 #ifdef POLARSSL_BIGNUM_C
239 #ifdef POLARSSL_GENPRIME
240 
241 
242  FCT_SUITE_BGN(test_suite_rsa)
243  {
244 #ifdef POLARSSL_SHA1_C
245 
246  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_1)
247  {
248  unsigned char message_str[1000];
249  unsigned char hash_result[1000];
250  unsigned char result_str[1000];
251  rsa_context ctx;
252  int msg_len;
253 
254  rsa_init( &ctx, RSA_PKCS_V15, 0 );
255  memset( message_str, 0x00, 1000 );
256  memset( hash_result, 0x00, 1000 );
257  memset( result_str, 0x00, 1000 );
258 
259  ctx.len = 1024 / 8;
260  fct_chk( mpi_read_string( &ctx.N, 16, "e28a13548525e5f36dccb24ecb7cc332cc689dfd64012604c9c7816d72a16c3f5fcdc0e86e7c03280b1c69b586ce0cd8aec722cc73a5d3b730310bf7dfebdc77ce5d94bbc369dc18a2f7b07bd505ab0f82224aef09fdc1e5063234255e0b3c40a52e9e8ae60898eb88a766bdd788fe9493d8fd86bcdd2884d5c06216c65469e5" ) == 0 );
261  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
262 
263  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
264 
265  msg_len = unhexify( message_str, "d6248c3e96b1a7e5fea978870fcc4c9786b4e5156e16b7faef4557d667f730b8bc4c784ef00c624df5309513c3a5de8ca94c2152e0459618666d3148092562ebc256ffca45b27fd2d63c68bd5e0a0aefbe496e9e63838a361b1db6fc272464f191490bf9c029643c49d2d9cd08833b8a70b4b3431f56fb1eb55ccd39e77a9c92" );
266  unhexify( result_str, "3203b7647fb7e345aa457681e5131777f1adc371f2fba8534928c4e52ef6206a856425d6269352ecbf64db2f6ad82397768cafdd8cd272e512d617ad67992226da6bc291c31404c17fd4b7e2beb20eff284a44f4d7af47fd6629e2c95809fa7f2241a04f70ac70d3271bb13258af1ed5c5988c95df7fa26603515791075feccd" );
267 
268  switch( SIG_RSA_SHA1 )
269  {
270  #ifdef POLARSSL_MD2_C
271  case SIG_RSA_MD2:
272  md2( message_str, msg_len, hash_result );
273  break;
274  #endif
275  #ifdef POLARSSL_MD4_C
276  case SIG_RSA_MD4:
277  md4( message_str, msg_len, hash_result );
278  break;
279  #endif
280  #ifdef POLARSSL_MD5_C
281  case SIG_RSA_MD5:
282  md5( message_str, msg_len, hash_result );
283  break;
284  #endif
285  #ifdef POLARSSL_SHA1_C
286  case SIG_RSA_SHA1:
287  sha1( message_str, msg_len, hash_result );
288  break;
289  #endif
290  #ifdef POLARSSL_SHA2_C
291  case SIG_RSA_SHA224:
292  sha2( message_str, msg_len, hash_result, 1 );
293  break;
294  case SIG_RSA_SHA256:
295  sha2( message_str, msg_len, hash_result, 0 );
296  break;
297  #endif
298  #ifdef POLARSSL_SHA4_C
299  case SIG_RSA_SHA384:
300  sha4( message_str, msg_len, hash_result, 1 );
301  break;
302  case SIG_RSA_SHA512:
303  sha4( message_str, msg_len, hash_result, 0 );
304  break;
305  #endif
306  }
307 
308  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA1, 0, hash_result, result_str ) == POLARSSL_ERR_RSA_VERIFY_FAILED );
309 
310  rsa_free( &ctx );
311  }
312  FCT_TEST_END();
313 #endif /* POLARSSL_SHA1_C */
314 
315 #ifdef POLARSSL_SHA1_C
316 
317  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_2)
318  {
319  unsigned char message_str[1000];
320  unsigned char hash_result[1000];
321  unsigned char result_str[1000];
322  rsa_context ctx;
323  int msg_len;
324 
325  rsa_init( &ctx, RSA_PKCS_V15, 0 );
326  memset( message_str, 0x00, 1000 );
327  memset( hash_result, 0x00, 1000 );
328  memset( result_str, 0x00, 1000 );
329 
330  ctx.len = 1024 / 8;
331  fct_chk( mpi_read_string( &ctx.N, 16, "e28a13548525e5f36dccb24ecb7cc332cc689dfd64012604c9c7816d72a16c3f5fcdc0e86e7c03280b1c69b586ce0cd8aec722cc73a5d3b730310bf7dfebdc77ce5d94bbc369dc18a2f7b07bd505ab0f82224aef09fdc1e5063234255e0b3c40a52e9e8ae60898eb88a766bdd788fe9493d8fd86bcdd2884d5c06216c65469e5" ) == 0 );
332  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
333 
334  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
335 
336  msg_len = unhexify( message_str, "206ef4bf396c6087f8229ef196fd35f37ccb8de5efcdb238f20d556668f114257a11fbe038464a67830378e62ae9791453953dac1dbd7921837ba98e84e856eb80ed9487e656d0b20c28c8ba5e35db1abbed83ed1c7720a97701f709e3547a4bfcabca9c89c57ad15c3996577a0ae36d7c7b699035242f37954646c1cd5c08ac" );
337  unhexify( result_str, "5abc01f5de25b70867ff0c24e222c61f53c88daf42586fddcd56f3c4588f074be3c328056c063388688b6385a8167957c6e5355a510e005b8a851d69c96b36ec6036644078210e5d7d326f96365ee0648882921492bc7b753eb9c26cdbab37555f210df2ca6fec1b25b463d38b81c0dcea202022b04af5da58aa03d77be949b7" );
338 
339  switch( SIG_RSA_SHA1 )
340  {
341  #ifdef POLARSSL_MD2_C
342  case SIG_RSA_MD2:
343  md2( message_str, msg_len, hash_result );
344  break;
345  #endif
346  #ifdef POLARSSL_MD4_C
347  case SIG_RSA_MD4:
348  md4( message_str, msg_len, hash_result );
349  break;
350  #endif
351  #ifdef POLARSSL_MD5_C
352  case SIG_RSA_MD5:
353  md5( message_str, msg_len, hash_result );
354  break;
355  #endif
356  #ifdef POLARSSL_SHA1_C
357  case SIG_RSA_SHA1:
358  sha1( message_str, msg_len, hash_result );
359  break;
360  #endif
361  #ifdef POLARSSL_SHA2_C
362  case SIG_RSA_SHA224:
363  sha2( message_str, msg_len, hash_result, 1 );
364  break;
365  case SIG_RSA_SHA256:
366  sha2( message_str, msg_len, hash_result, 0 );
367  break;
368  #endif
369  #ifdef POLARSSL_SHA4_C
370  case SIG_RSA_SHA384:
371  sha4( message_str, msg_len, hash_result, 1 );
372  break;
373  case SIG_RSA_SHA512:
374  sha4( message_str, msg_len, hash_result, 0 );
375  break;
376  #endif
377  }
378 
379  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA1, 0, hash_result, result_str ) == 0 );
380 
381  rsa_free( &ctx );
382  }
383  FCT_TEST_END();
384 #endif /* POLARSSL_SHA1_C */
385 
386 #ifdef POLARSSL_SHA1_C
387 
388  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_3)
389  {
390  unsigned char message_str[1000];
391  unsigned char hash_result[1000];
392  unsigned char result_str[1000];
393  rsa_context ctx;
394  int msg_len;
395 
396  rsa_init( &ctx, RSA_PKCS_V15, 0 );
397  memset( message_str, 0x00, 1000 );
398  memset( hash_result, 0x00, 1000 );
399  memset( result_str, 0x00, 1000 );
400 
401  ctx.len = 1024 / 8;
402  fct_chk( mpi_read_string( &ctx.N, 16, "e28a13548525e5f36dccb24ecb7cc332cc689dfd64012604c9c7816d72a16c3f5fcdc0e86e7c03280b1c69b586ce0cd8aec722cc73a5d3b730310bf7dfebdc77ce5d94bbc369dc18a2f7b07bd505ab0f82224aef09fdc1e5063234255e0b3c40a52e9e8ae60898eb88a766bdd788fe9493d8fd86bcdd2884d5c06216c65469e5" ) == 0 );
403  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
404 
405  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
406 
407  msg_len = unhexify( message_str, "206ef4bf396c6087f8229ef196fd35f37ccb8de5efcdb238f20d556668f114257a11fbe038464a67830378e62ae9791453953dac1dbd7921837ba98e84e856eb80ed9487e656d0b20c28c8ba5e35db1abbed83ed1c7720a97701f709e3547a4bfcabca9c89c57ad15c3996577a0ae36d7c7b699035242f37954646c1cd5c08ac" );
408  unhexify( result_str, "5abc01f5de25b70867ff0c24e222c61f53c88daf42586fddcd56f3c4588f074be3c328056c063388688b6385a8167957c6e5355a510e005b8a851d69c96b36ec6036644078210e5d7d326f96365ee0648882921492bc7b753eb9c26cdbab37555f210df2ca6fec1b25b463d38b81c0dcea202022b04af5da58aa03d77be949b7" );
409 
410  switch( SIG_RSA_SHA1 )
411  {
412  #ifdef POLARSSL_MD2_C
413  case SIG_RSA_MD2:
414  md2( message_str, msg_len, hash_result );
415  break;
416  #endif
417  #ifdef POLARSSL_MD4_C
418  case SIG_RSA_MD4:
419  md4( message_str, msg_len, hash_result );
420  break;
421  #endif
422  #ifdef POLARSSL_MD5_C
423  case SIG_RSA_MD5:
424  md5( message_str, msg_len, hash_result );
425  break;
426  #endif
427  #ifdef POLARSSL_SHA1_C
428  case SIG_RSA_SHA1:
429  sha1( message_str, msg_len, hash_result );
430  break;
431  #endif
432  #ifdef POLARSSL_SHA2_C
433  case SIG_RSA_SHA224:
434  sha2( message_str, msg_len, hash_result, 1 );
435  break;
436  case SIG_RSA_SHA256:
437  sha2( message_str, msg_len, hash_result, 0 );
438  break;
439  #endif
440  #ifdef POLARSSL_SHA4_C
441  case SIG_RSA_SHA384:
442  sha4( message_str, msg_len, hash_result, 1 );
443  break;
444  case SIG_RSA_SHA512:
445  sha4( message_str, msg_len, hash_result, 0 );
446  break;
447  #endif
448  }
449 
450  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA1, 0, hash_result, result_str ) == 0 );
451 
452  rsa_free( &ctx );
453  }
454  FCT_TEST_END();
455 #endif /* POLARSSL_SHA1_C */
456 
457 #ifdef POLARSSL_SHA2_C
458 
459  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_4)
460  {
461  unsigned char message_str[1000];
462  unsigned char hash_result[1000];
463  unsigned char result_str[1000];
464  rsa_context ctx;
465  int msg_len;
466 
467  rsa_init( &ctx, RSA_PKCS_V15, 0 );
468  memset( message_str, 0x00, 1000 );
469  memset( hash_result, 0x00, 1000 );
470  memset( result_str, 0x00, 1000 );
471 
472  ctx.len = 1024 / 8;
473  fct_chk( mpi_read_string( &ctx.N, 16, "e28a13548525e5f36dccb24ecb7cc332cc689dfd64012604c9c7816d72a16c3f5fcdc0e86e7c03280b1c69b586ce0cd8aec722cc73a5d3b730310bf7dfebdc77ce5d94bbc369dc18a2f7b07bd505ab0f82224aef09fdc1e5063234255e0b3c40a52e9e8ae60898eb88a766bdd788fe9493d8fd86bcdd2884d5c06216c65469e5" ) == 0 );
474  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
475 
476  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
477 
478  msg_len = unhexify( message_str, "867ac26e11a13b7ac34a42a1e177648692861226effb55bb597fbde10f299bf7fffd6fc8ddb2a46a73b97b67387a461b23e1d65dc119366286979add615b926b9272832fc0c058b946fc752dcffceca12233f4c63f7897cbaa08aa7e07cf02b5e7e3e5ece252bf2fe61d163bce84c0e0368454a98e9fdebf6edbd70b290d549b" );
479  unhexify( result_str, "3bb7b1c5f3391de4549e2e96fd33afa4d647dd90e321d9d576f3808e32213e948b697ef4fd2dd12923de6ec3ffd625078a57f86af38dc07052bb50547c616ed51fa1352b3ab66788408168d21263ef2d3388d567d2ce8cf674f45491ab2b0319d47be1266bda39e343b2a38ea2d6aaaee6c4465aee1d7bb33e93a1c40a8e3ae4" );
480 
481  switch( SIG_RSA_SHA224 )
482  {
483  #ifdef POLARSSL_MD2_C
484  case SIG_RSA_MD2:
485  md2( message_str, msg_len, hash_result );
486  break;
487  #endif
488  #ifdef POLARSSL_MD4_C
489  case SIG_RSA_MD4:
490  md4( message_str, msg_len, hash_result );
491  break;
492  #endif
493  #ifdef POLARSSL_MD5_C
494  case SIG_RSA_MD5:
495  md5( message_str, msg_len, hash_result );
496  break;
497  #endif
498  #ifdef POLARSSL_SHA1_C
499  case SIG_RSA_SHA1:
500  sha1( message_str, msg_len, hash_result );
501  break;
502  #endif
503  #ifdef POLARSSL_SHA2_C
504  case SIG_RSA_SHA224:
505  sha2( message_str, msg_len, hash_result, 1 );
506  break;
507  case SIG_RSA_SHA256:
508  sha2( message_str, msg_len, hash_result, 0 );
509  break;
510  #endif
511  #ifdef POLARSSL_SHA4_C
512  case SIG_RSA_SHA384:
513  sha4( message_str, msg_len, hash_result, 1 );
514  break;
515  case SIG_RSA_SHA512:
516  sha4( message_str, msg_len, hash_result, 0 );
517  break;
518  #endif
519  }
520 
521  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA224, 0, hash_result, result_str ) == 0 );
522 
523  rsa_free( &ctx );
524  }
525  FCT_TEST_END();
526 #endif /* POLARSSL_SHA2_C */
527 
528 #ifdef POLARSSL_SHA2_C
529 
530  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_5)
531  {
532  unsigned char message_str[1000];
533  unsigned char hash_result[1000];
534  unsigned char result_str[1000];
535  rsa_context ctx;
536  int msg_len;
537 
538  rsa_init( &ctx, RSA_PKCS_V15, 0 );
539  memset( message_str, 0x00, 1000 );
540  memset( hash_result, 0x00, 1000 );
541  memset( result_str, 0x00, 1000 );
542 
543  ctx.len = 1024 / 8;
544  fct_chk( mpi_read_string( &ctx.N, 16, "e28a13548525e5f36dccb24ecb7cc332cc689dfd64012604c9c7816d72a16c3f5fcdc0e86e7c03280b1c69b586ce0cd8aec722cc73a5d3b730310bf7dfebdc77ce5d94bbc369dc18a2f7b07bd505ab0f82224aef09fdc1e5063234255e0b3c40a52e9e8ae60898eb88a766bdd788fe9493d8fd86bcdd2884d5c06216c65469e5" ) == 0 );
545  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
546 
547  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
548 
549  msg_len = unhexify( message_str, "cd810e97dc21095ea7a0238027a7bafd343e01444785ea9184a44a79f80438c41fc0b57aa95693407da38fe5ff0ec1398e03361e51a3dbe134b99cca2df0cef1c444ca54d2b7db2789455b6bb41918c24001fd82fc20ee089de3f34f053699c1c5f7954ce0aaabb9d26fce39d032894152229d98cf64ecafc7089530073c61d9" );
550  unhexify( result_str, "7b5fba70ec5b521638f182bcab39cec30b76e7bc017bdbd1059658a9a1db0969ab482dce32f3e9865952f0a0de0978272c951e3c015328ea3758f47029a379ab4200550fba58f11d51264878406fc717d5f7b72b3582946f16a7e5314a220881fc820f7d29949710273421533d8ac0a449dc6d0fd1a21c22444edd1c0d5b44d3" );
551 
552  switch( SIG_RSA_SHA256 )
553  {
554  #ifdef POLARSSL_MD2_C
555  case SIG_RSA_MD2:
556  md2( message_str, msg_len, hash_result );
557  break;
558  #endif
559  #ifdef POLARSSL_MD4_C
560  case SIG_RSA_MD4:
561  md4( message_str, msg_len, hash_result );
562  break;
563  #endif
564  #ifdef POLARSSL_MD5_C
565  case SIG_RSA_MD5:
566  md5( message_str, msg_len, hash_result );
567  break;
568  #endif
569  #ifdef POLARSSL_SHA1_C
570  case SIG_RSA_SHA1:
571  sha1( message_str, msg_len, hash_result );
572  break;
573  #endif
574  #ifdef POLARSSL_SHA2_C
575  case SIG_RSA_SHA224:
576  sha2( message_str, msg_len, hash_result, 1 );
577  break;
578  case SIG_RSA_SHA256:
579  sha2( message_str, msg_len, hash_result, 0 );
580  break;
581  #endif
582  #ifdef POLARSSL_SHA4_C
583  case SIG_RSA_SHA384:
584  sha4( message_str, msg_len, hash_result, 1 );
585  break;
586  case SIG_RSA_SHA512:
587  sha4( message_str, msg_len, hash_result, 0 );
588  break;
589  #endif
590  }
591 
592  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA256, 0, hash_result, result_str ) == 0 );
593 
594  rsa_free( &ctx );
595  }
596  FCT_TEST_END();
597 #endif /* POLARSSL_SHA2_C */
598 
599 #ifdef POLARSSL_SHA4_C
600 
601  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_6)
602  {
603  unsigned char message_str[1000];
604  unsigned char hash_result[1000];
605  unsigned char result_str[1000];
606  rsa_context ctx;
607  int msg_len;
608 
609  rsa_init( &ctx, RSA_PKCS_V15, 0 );
610  memset( message_str, 0x00, 1000 );
611  memset( hash_result, 0x00, 1000 );
612  memset( result_str, 0x00, 1000 );
613 
614  ctx.len = 1024 / 8;
615  fct_chk( mpi_read_string( &ctx.N, 16, "e28a13548525e5f36dccb24ecb7cc332cc689dfd64012604c9c7816d72a16c3f5fcdc0e86e7c03280b1c69b586ce0cd8aec722cc73a5d3b730310bf7dfebdc77ce5d94bbc369dc18a2f7b07bd505ab0f82224aef09fdc1e5063234255e0b3c40a52e9e8ae60898eb88a766bdd788fe9493d8fd86bcdd2884d5c06216c65469e5" ) == 0 );
616  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
617 
618  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
619 
620  msg_len = unhexify( message_str, "44637d3b8de525fd589237bc81229c8966d3af24540850c24036330db8007e6d19a19486018b2b02074da590aaba9d2c8848c0a2d1b6de4dfaf24025b6393df9228008f83f13cc76a67cfbed77a6e3429342824a0b6a9b8dd884094acc6a54bbc8c8829930c52fe39ce5e0dcd02d9553ef899d26eb6cae0940b63584e2daeb3b" );
621  unhexify( result_str, "38fc4f6f0430bb3ea9f470a4c0f5cebdabac4dbeb3b9c99d4168e7b00f5eb294ec0ece1908eded1f3e14f1e69d10f9feb425bda0c998af945ef864298a60a675f0bb5c540a7be3f534d5faddff974eea8bffe182a44e2ee1f4f653e71967a11869ee1a850edb03cb44a340378cb7a1bc9616d3649b78002b390a05a7e54edec6" );
622 
623  switch( SIG_RSA_SHA384 )
624  {
625  #ifdef POLARSSL_MD2_C
626  case SIG_RSA_MD2:
627  md2( message_str, msg_len, hash_result );
628  break;
629  #endif
630  #ifdef POLARSSL_MD4_C
631  case SIG_RSA_MD4:
632  md4( message_str, msg_len, hash_result );
633  break;
634  #endif
635  #ifdef POLARSSL_MD5_C
636  case SIG_RSA_MD5:
637  md5( message_str, msg_len, hash_result );
638  break;
639  #endif
640  #ifdef POLARSSL_SHA1_C
641  case SIG_RSA_SHA1:
642  sha1( message_str, msg_len, hash_result );
643  break;
644  #endif
645  #ifdef POLARSSL_SHA2_C
646  case SIG_RSA_SHA224:
647  sha2( message_str, msg_len, hash_result, 1 );
648  break;
649  case SIG_RSA_SHA256:
650  sha2( message_str, msg_len, hash_result, 0 );
651  break;
652  #endif
653  #ifdef POLARSSL_SHA4_C
654  case SIG_RSA_SHA384:
655  sha4( message_str, msg_len, hash_result, 1 );
656  break;
657  case SIG_RSA_SHA512:
658  sha4( message_str, msg_len, hash_result, 0 );
659  break;
660  #endif
661  }
662 
663  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA384, 0, hash_result, result_str ) == 0 );
664 
665  rsa_free( &ctx );
666  }
667  FCT_TEST_END();
668 #endif /* POLARSSL_SHA4_C */
669 
670 #ifdef POLARSSL_SHA4_C
671 
672  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_7)
673  {
674  unsigned char message_str[1000];
675  unsigned char hash_result[1000];
676  unsigned char result_str[1000];
677  rsa_context ctx;
678  int msg_len;
679 
680  rsa_init( &ctx, RSA_PKCS_V15, 0 );
681  memset( message_str, 0x00, 1000 );
682  memset( hash_result, 0x00, 1000 );
683  memset( result_str, 0x00, 1000 );
684 
685  ctx.len = 1024 / 8;
686  fct_chk( mpi_read_string( &ctx.N, 16, "e28a13548525e5f36dccb24ecb7cc332cc689dfd64012604c9c7816d72a16c3f5fcdc0e86e7c03280b1c69b586ce0cd8aec722cc73a5d3b730310bf7dfebdc77ce5d94bbc369dc18a2f7b07bd505ab0f82224aef09fdc1e5063234255e0b3c40a52e9e8ae60898eb88a766bdd788fe9493d8fd86bcdd2884d5c06216c65469e5" ) == 0 );
687  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
688 
689  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
690 
691  msg_len = unhexify( message_str, "d03f12276f6ba7545b8fce719471bd253791878809694e8754f3b389f26c9253a758ed28b4c62535a8d5702d7a778731d5759ff2b3b39b192db680e791632918b6093c0e8ca25c2bf756a07fde4144a37f769fe4054455a45cb8cefe4462e7a9a45ce71f2189b4fef01b47aee8585d44dc9d6fa627a3e5f08801871731f234cd" );
692  unhexify( result_str, "d93a878c1ce86571590b0e43794b3edb23552797c4b8c9e3da4fe1cc4ac0566acd3b10541fe9a7a79f5ea4892d3069ca6903efb5c40c47eb8a9c781eb4249281d40c3d96aae16da1bb4daaece6a26eca5f41c062b4124a64fc9d340cba5ab0d1f5affff6515a87f0933774fd4322d2fa497cd6f708a429ca56dcb1fd3db623d0" );
693 
694  switch( SIG_RSA_SHA384 )
695  {
696  #ifdef POLARSSL_MD2_C
697  case SIG_RSA_MD2:
698  md2( message_str, msg_len, hash_result );
699  break;
700  #endif
701  #ifdef POLARSSL_MD4_C
702  case SIG_RSA_MD4:
703  md4( message_str, msg_len, hash_result );
704  break;
705  #endif
706  #ifdef POLARSSL_MD5_C
707  case SIG_RSA_MD5:
708  md5( message_str, msg_len, hash_result );
709  break;
710  #endif
711  #ifdef POLARSSL_SHA1_C
712  case SIG_RSA_SHA1:
713  sha1( message_str, msg_len, hash_result );
714  break;
715  #endif
716  #ifdef POLARSSL_SHA2_C
717  case SIG_RSA_SHA224:
718  sha2( message_str, msg_len, hash_result, 1 );
719  break;
720  case SIG_RSA_SHA256:
721  sha2( message_str, msg_len, hash_result, 0 );
722  break;
723  #endif
724  #ifdef POLARSSL_SHA4_C
725  case SIG_RSA_SHA384:
726  sha4( message_str, msg_len, hash_result, 1 );
727  break;
728  case SIG_RSA_SHA512:
729  sha4( message_str, msg_len, hash_result, 0 );
730  break;
731  #endif
732  }
733 
734  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA384, 0, hash_result, result_str ) == POLARSSL_ERR_RSA_INVALID_PADDING );
735 
736  rsa_free( &ctx );
737  }
738  FCT_TEST_END();
739 #endif /* POLARSSL_SHA4_C */
740 
741 #ifdef POLARSSL_SHA4_C
742 
743  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_8)
744  {
745  unsigned char message_str[1000];
746  unsigned char hash_result[1000];
747  unsigned char result_str[1000];
748  rsa_context ctx;
749  int msg_len;
750 
751  rsa_init( &ctx, RSA_PKCS_V15, 0 );
752  memset( message_str, 0x00, 1000 );
753  memset( hash_result, 0x00, 1000 );
754  memset( result_str, 0x00, 1000 );
755 
756  ctx.len = 1024 / 8;
757  fct_chk( mpi_read_string( &ctx.N, 16, "e28a13548525e5f36dccb24ecb7cc332cc689dfd64012604c9c7816d72a16c3f5fcdc0e86e7c03280b1c69b586ce0cd8aec722cc73a5d3b730310bf7dfebdc77ce5d94bbc369dc18a2f7b07bd505ab0f82224aef09fdc1e5063234255e0b3c40a52e9e8ae60898eb88a766bdd788fe9493d8fd86bcdd2884d5c06216c65469e5" ) == 0 );
758  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
759 
760  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
761 
762  msg_len = unhexify( message_str, "b2f2e6e09fd19b0a8c06447554d6a236c69e2b334017488881d8c02ab81d74cae0c64efd50a374998eeec162651975e637cb2ba594250c750a4943253f1db0613e4ce1d50f8e3e968a2a83bd6cb97455ab2ccc77071076b3e211ffb251bd4c1a738b88b2021c61c727c074ce933c054acbcbf4f0c362ec09af38de191686aebe" );
763  unhexify( result_str, "a853e67f928281d11506c9d39e5ea9b2d742782c663c37d0a7c9e9fe15379cde1e75d94adbfb1ca08691f320af4ff2b0a29a4d2ea10a20cb95d85f3dabac3d56cca9039c851d0181408c00b385fc82cafa4cfa7380d0c2c024fb83fec59d5ee591d63806dcb18b21ea440c3d3f12c1e7795eb15b7ce4c4b288d646cf1d34bdf1" );
764 
765  switch( SIG_RSA_SHA512 )
766  {
767  #ifdef POLARSSL_MD2_C
768  case SIG_RSA_MD2:
769  md2( message_str, msg_len, hash_result );
770  break;
771  #endif
772  #ifdef POLARSSL_MD4_C
773  case SIG_RSA_MD4:
774  md4( message_str, msg_len, hash_result );
775  break;
776  #endif
777  #ifdef POLARSSL_MD5_C
778  case SIG_RSA_MD5:
779  md5( message_str, msg_len, hash_result );
780  break;
781  #endif
782  #ifdef POLARSSL_SHA1_C
783  case SIG_RSA_SHA1:
784  sha1( message_str, msg_len, hash_result );
785  break;
786  #endif
787  #ifdef POLARSSL_SHA2_C
788  case SIG_RSA_SHA224:
789  sha2( message_str, msg_len, hash_result, 1 );
790  break;
791  case SIG_RSA_SHA256:
792  sha2( message_str, msg_len, hash_result, 0 );
793  break;
794  #endif
795  #ifdef POLARSSL_SHA4_C
796  case SIG_RSA_SHA384:
797  sha4( message_str, msg_len, hash_result, 1 );
798  break;
799  case SIG_RSA_SHA512:
800  sha4( message_str, msg_len, hash_result, 0 );
801  break;
802  #endif
803  }
804 
805  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA512, 0, hash_result, result_str ) == 0 );
806 
807  rsa_free( &ctx );
808  }
809  FCT_TEST_END();
810 #endif /* POLARSSL_SHA4_C */
811 
812 #ifdef POLARSSL_SHA1_C
813 
814  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_9)
815  {
816  unsigned char message_str[1000];
817  unsigned char hash_result[1000];
818  unsigned char result_str[1000];
819  rsa_context ctx;
820  int msg_len;
821 
822  rsa_init( &ctx, RSA_PKCS_V15, 0 );
823  memset( message_str, 0x00, 1000 );
824  memset( hash_result, 0x00, 1000 );
825  memset( result_str, 0x00, 1000 );
826 
827  ctx.len = 1024 / 8;
828  fct_chk( mpi_read_string( &ctx.N, 16, "e28a13548525e5f36dccb24ecb7cc332cc689dfd64012604c9c7816d72a16c3f5fcdc0e86e7c03280b1c69b586ce0cd8aec722cc73a5d3b730310bf7dfebdc77ce5d94bbc369dc18a2f7b07bd505ab0f82224aef09fdc1e5063234255e0b3c40a52e9e8ae60898eb88a766bdd788fe9493d8fd86bcdd2884d5c06216c65469e5" ) == 0 );
829  fct_chk( mpi_read_string( &ctx.E, 16, "10001" ) == 0 );
830 
831  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
832 
833  msg_len = unhexify( message_str, "647586ba587b09aa555d1b8da4cdf5c6e777e08859379ca45789019f2041e708d97c4408d4d6943b11dd7ebe05c6b48a9b5f1b0079452cc484579acfa66a34c0cf3f0e7339b2dbd5f1339ef7937a8261547705a846885c43d8ef139a9c83f5604ea52b231176a821fb48c45ed45226f31ba7e8a94a69f6c65c39b7278bf3f08f" );
834  unhexify( result_str, "e27a90b644c3a11f234132d6727ada397774cd7fdf5eb0160a665ffccedabb8ae9e357966939a71c973e75e5ff771fb01a6483fcaf82f16dee65e6826121e2ae9c69d2c92387b33a641f397676776cde501e7314a9a4e76c0f4538edeea163e8de7bd21c93c298df748c6f5c26b7d03bfa3671f2a7488fe311309e8218a71171" );
835 
836  switch( SIG_RSA_SHA1 )
837  {
838  #ifdef POLARSSL_MD2_C
839  case SIG_RSA_MD2:
840  md2( message_str, msg_len, hash_result );
841  break;
842  #endif
843  #ifdef POLARSSL_MD4_C
844  case SIG_RSA_MD4:
845  md4( message_str, msg_len, hash_result );
846  break;
847  #endif
848  #ifdef POLARSSL_MD5_C
849  case SIG_RSA_MD5:
850  md5( message_str, msg_len, hash_result );
851  break;
852  #endif
853  #ifdef POLARSSL_SHA1_C
854  case SIG_RSA_SHA1:
855  sha1( message_str, msg_len, hash_result );
856  break;
857  #endif
858  #ifdef POLARSSL_SHA2_C
859  case SIG_RSA_SHA224:
860  sha2( message_str, msg_len, hash_result, 1 );
861  break;
862  case SIG_RSA_SHA256:
863  sha2( message_str, msg_len, hash_result, 0 );
864  break;
865  #endif
866  #ifdef POLARSSL_SHA4_C
867  case SIG_RSA_SHA384:
868  sha4( message_str, msg_len, hash_result, 1 );
869  break;
870  case SIG_RSA_SHA512:
871  sha4( message_str, msg_len, hash_result, 0 );
872  break;
873  #endif
874  }
875 
876  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA1, 0, hash_result, result_str ) == 0 );
877 
878  rsa_free( &ctx );
879  }
880  FCT_TEST_END();
881 #endif /* POLARSSL_SHA1_C */
882 
883 #ifdef POLARSSL_SHA1_C
884 
885  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_10)
886  {
887  unsigned char message_str[1000];
888  unsigned char hash_result[1000];
889  unsigned char result_str[1000];
890  rsa_context ctx;
891  int msg_len;
892 
893  rsa_init( &ctx, RSA_PKCS_V15, 0 );
894  memset( message_str, 0x00, 1000 );
895  memset( hash_result, 0x00, 1000 );
896  memset( result_str, 0x00, 1000 );
897 
898  ctx.len = 1024 / 8;
899  fct_chk( mpi_read_string( &ctx.N, 16, "e28a13548525e5f36dccb24ecb7cc332cc689dfd64012604c9c7816d72a16c3f5fcdc0e86e7c03280b1c69b586ce0cd8aec722cc73a5d3b730310bf7dfebdc77ce5d94bbc369dc18a2f7b07bd505ab0f82224aef09fdc1e5063234255e0b3c40a52e9e8ae60898eb88a766bdd788fe9493d8fd86bcdd2884d5c06216c65469e5" ) == 0 );
900  fct_chk( mpi_read_string( &ctx.E, 16, "10001" ) == 0 );
901 
902  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
903 
904  msg_len = unhexify( message_str, "55013a489e09b6553262aab59fb041b49437b86d52876f8e5d5e405b77ca0ff6ce8ea2dd75c7b3b411cf4445d56233c5b0ff0e58c49128d81b4fedd295e172d225c451e13defb34b87b7aea6d6f0d20f5c55feb71d2a789fa31f3d9ff47896adc16bec5ce0c9dda3fde190e08ca2451c01ff3091449887695f96dac97ad6a30e" );
905  unhexify( result_str, "dd82b7be791c454fbbf6f1de47cbe585a687e4e8bbae0b6e2a77f8ca4efd06d71498f9a74b931bd59c377e71daf708a624c51303f377006c676487bad57f7067b09b7bb94a6189119ab8cf7321c321b2dc7df565bfbec833a28b86625fb5fd6a035d4ed79ff0f9aee9fa78935eec65069439ee449d7f5249cdae6fdd6d8c2a63" );
906 
907  switch( SIG_RSA_SHA1 )
908  {
909  #ifdef POLARSSL_MD2_C
910  case SIG_RSA_MD2:
911  md2( message_str, msg_len, hash_result );
912  break;
913  #endif
914  #ifdef POLARSSL_MD4_C
915  case SIG_RSA_MD4:
916  md4( message_str, msg_len, hash_result );
917  break;
918  #endif
919  #ifdef POLARSSL_MD5_C
920  case SIG_RSA_MD5:
921  md5( message_str, msg_len, hash_result );
922  break;
923  #endif
924  #ifdef POLARSSL_SHA1_C
925  case SIG_RSA_SHA1:
926  sha1( message_str, msg_len, hash_result );
927  break;
928  #endif
929  #ifdef POLARSSL_SHA2_C
930  case SIG_RSA_SHA224:
931  sha2( message_str, msg_len, hash_result, 1 );
932  break;
933  case SIG_RSA_SHA256:
934  sha2( message_str, msg_len, hash_result, 0 );
935  break;
936  #endif
937  #ifdef POLARSSL_SHA4_C
938  case SIG_RSA_SHA384:
939  sha4( message_str, msg_len, hash_result, 1 );
940  break;
941  case SIG_RSA_SHA512:
942  sha4( message_str, msg_len, hash_result, 0 );
943  break;
944  #endif
945  }
946 
947  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA1, 0, hash_result, result_str ) == POLARSSL_ERR_RSA_INVALID_PADDING );
948 
949  rsa_free( &ctx );
950  }
951  FCT_TEST_END();
952 #endif /* POLARSSL_SHA1_C */
953 
954 #ifdef POLARSSL_SHA2_C
955 
956  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_11)
957  {
958  unsigned char message_str[1000];
959  unsigned char hash_result[1000];
960  unsigned char result_str[1000];
961  rsa_context ctx;
962  int msg_len;
963 
964  rsa_init( &ctx, RSA_PKCS_V15, 0 );
965  memset( message_str, 0x00, 1000 );
966  memset( hash_result, 0x00, 1000 );
967  memset( result_str, 0x00, 1000 );
968 
969  ctx.len = 1024 / 8;
970  fct_chk( mpi_read_string( &ctx.N, 16, "e28a13548525e5f36dccb24ecb7cc332cc689dfd64012604c9c7816d72a16c3f5fcdc0e86e7c03280b1c69b586ce0cd8aec722cc73a5d3b730310bf7dfebdc77ce5d94bbc369dc18a2f7b07bd505ab0f82224aef09fdc1e5063234255e0b3c40a52e9e8ae60898eb88a766bdd788fe9493d8fd86bcdd2884d5c06216c65469e5" ) == 0 );
971  fct_chk( mpi_read_string( &ctx.E, 16, "10001" ) == 0 );
972 
973  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
974 
975  msg_len = unhexify( message_str, "f4a990b8d434a5914340c0ca3ca4e4a70856c55e13e938c1f854e91cdef54c6107d6d682a62e6c1ff12b1c6178ee0b26b5d8ae5ee4043db4151465727f313e9e174d7c6961abe9cb86a21367a89e41b47267ac5ef3a6eceaaca5b19ae756b3904b97ec35aeb404dc2a2d0da373ba709a678d2728e7d72daae68d335cbf6c957d" );
976  unhexify( result_str, "d8ef7bdc0f111b1249d5ad6515b6fe37f2ff327f493832f1385c10e975c07b0266497716fcb84f5039cd60f5a050614fde27f354a6c45e8a7d74f9821e2f301500ac1953feafeb9d98cf88d2c928413f337813135c66abfc3dc7a4d80655d925bf96f21872ca2b3a2684b976ca768fe37feae20a69eeec3cc8f1de0db34b3462" );
977 
978  switch( SIG_RSA_SHA224 )
979  {
980  #ifdef POLARSSL_MD2_C
981  case SIG_RSA_MD2:
982  md2( message_str, msg_len, hash_result );
983  break;
984  #endif
985  #ifdef POLARSSL_MD4_C
986  case SIG_RSA_MD4:
987  md4( message_str, msg_len, hash_result );
988  break;
989  #endif
990  #ifdef POLARSSL_MD5_C
991  case SIG_RSA_MD5:
992  md5( message_str, msg_len, hash_result );
993  break;
994  #endif
995  #ifdef POLARSSL_SHA1_C
996  case SIG_RSA_SHA1:
997  sha1( message_str, msg_len, hash_result );
998  break;
999  #endif
1000  #ifdef POLARSSL_SHA2_C
1001  case SIG_RSA_SHA224:
1002  sha2( message_str, msg_len, hash_result, 1 );
1003  break;
1004  case SIG_RSA_SHA256:
1005  sha2( message_str, msg_len, hash_result, 0 );
1006  break;
1007  #endif
1008  #ifdef POLARSSL_SHA4_C
1009  case SIG_RSA_SHA384:
1010  sha4( message_str, msg_len, hash_result, 1 );
1011  break;
1012  case SIG_RSA_SHA512:
1013  sha4( message_str, msg_len, hash_result, 0 );
1014  break;
1015  #endif
1016  }
1017 
1018  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA224, 0, hash_result, result_str ) == 0 );
1019 
1020  rsa_free( &ctx );
1021  }
1022  FCT_TEST_END();
1023 #endif /* POLARSSL_SHA2_C */
1024 
1025 #ifdef POLARSSL_SHA2_C
1026 
1027  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_12)
1028  {
1029  unsigned char message_str[1000];
1030  unsigned char hash_result[1000];
1031  unsigned char result_str[1000];
1032  rsa_context ctx;
1033  int msg_len;
1034 
1035  rsa_init( &ctx, RSA_PKCS_V15, 0 );
1036  memset( message_str, 0x00, 1000 );
1037  memset( hash_result, 0x00, 1000 );
1038  memset( result_str, 0x00, 1000 );
1039 
1040  ctx.len = 1024 / 8;
1041  fct_chk( mpi_read_string( &ctx.N, 16, "e28a13548525e5f36dccb24ecb7cc332cc689dfd64012604c9c7816d72a16c3f5fcdc0e86e7c03280b1c69b586ce0cd8aec722cc73a5d3b730310bf7dfebdc77ce5d94bbc369dc18a2f7b07bd505ab0f82224aef09fdc1e5063234255e0b3c40a52e9e8ae60898eb88a766bdd788fe9493d8fd86bcdd2884d5c06216c65469e5" ) == 0 );
1042  fct_chk( mpi_read_string( &ctx.E, 16, "10001" ) == 0 );
1043 
1044  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
1045 
1046  msg_len = unhexify( message_str, "c81f04c79982971fa176d64e8f7f8812f86a94c49e84672ff10996a2d6dfc444a884c7a87c4606a1aab22558894ee59b798b457827f5ee0b0cadcd94371902cc4ddaf97acefed641997717bcb3cc74cd440f0a31e20fb95812cecb740c36d6d1bf07e3641514cfa678aff2a39562ff4d60e02b17583a92bf0c56d66bde9e09f8" );
1047  unhexify( result_str, "52111f4798da3c11b3c74394358348ab0fc797bde99080f238d33a69b04b08ac2bd767b33872473943e23af27ca32fd568a43a8c7d6cc55b4fbb380212fdfcb60487e20694d4287e233efdf7b04737c0037a592d03077801828b051998c42b9f9e2420063331d5b2349918a64d8b65b21a2011ee7318fcef48aced95b8ddf501" );
1048 
1049  switch( SIG_RSA_SHA256 )
1050  {
1051  #ifdef POLARSSL_MD2_C
1052  case SIG_RSA_MD2:
1053  md2( message_str, msg_len, hash_result );
1054  break;
1055  #endif
1056  #ifdef POLARSSL_MD4_C
1057  case SIG_RSA_MD4:
1058  md4( message_str, msg_len, hash_result );
1059  break;
1060  #endif
1061  #ifdef POLARSSL_MD5_C
1062  case SIG_RSA_MD5:
1063  md5( message_str, msg_len, hash_result );
1064  break;
1065  #endif
1066  #ifdef POLARSSL_SHA1_C
1067  case SIG_RSA_SHA1:
1068  sha1( message_str, msg_len, hash_result );
1069  break;
1070  #endif
1071  #ifdef POLARSSL_SHA2_C
1072  case SIG_RSA_SHA224:
1073  sha2( message_str, msg_len, hash_result, 1 );
1074  break;
1075  case SIG_RSA_SHA256:
1076  sha2( message_str, msg_len, hash_result, 0 );
1077  break;
1078  #endif
1079  #ifdef POLARSSL_SHA4_C
1080  case SIG_RSA_SHA384:
1081  sha4( message_str, msg_len, hash_result, 1 );
1082  break;
1083  case SIG_RSA_SHA512:
1084  sha4( message_str, msg_len, hash_result, 0 );
1085  break;
1086  #endif
1087  }
1088 
1089  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA256, 0, hash_result, result_str ) == 0 );
1090 
1091  rsa_free( &ctx );
1092  }
1093  FCT_TEST_END();
1094 #endif /* POLARSSL_SHA2_C */
1095 
1096 #ifdef POLARSSL_SHA4_C
1097 
1098  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_13)
1099  {
1100  unsigned char message_str[1000];
1101  unsigned char hash_result[1000];
1102  unsigned char result_str[1000];
1103  rsa_context ctx;
1104  int msg_len;
1105 
1106  rsa_init( &ctx, RSA_PKCS_V15, 0 );
1107  memset( message_str, 0x00, 1000 );
1108  memset( hash_result, 0x00, 1000 );
1109  memset( result_str, 0x00, 1000 );
1110 
1111  ctx.len = 1024 / 8;
1112  fct_chk( mpi_read_string( &ctx.N, 16, "e28a13548525e5f36dccb24ecb7cc332cc689dfd64012604c9c7816d72a16c3f5fcdc0e86e7c03280b1c69b586ce0cd8aec722cc73a5d3b730310bf7dfebdc77ce5d94bbc369dc18a2f7b07bd505ab0f82224aef09fdc1e5063234255e0b3c40a52e9e8ae60898eb88a766bdd788fe9493d8fd86bcdd2884d5c06216c65469e5" ) == 0 );
1113  fct_chk( mpi_read_string( &ctx.E, 16, "10001" ) == 0 );
1114 
1115  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
1116 
1117  msg_len = unhexify( message_str, "a97824871770b79da979a111f6decfb1dd11bd946cfa800b008f0ad5aea5aa92e205d27a46c31d4fe6cb909091bd21f082fb75074000ee46c2f3e530d77b34c7c5d6f8453025950d3e0afae1f9752655f5bbea8432e9f1014357ff11b08076179a101e4f9d3f25bffb5e656bf6afe6c97d7aa4740b5d9224cde4dede035a7768" );
1118  unhexify( result_str, "d5dcd27c74e040ea86f106b63d3275fa7b7e98d2dd701f38ec15fc7301b72df127f6d3bd5571253a0b9e0e719d7d522893896941a1aeccc697912282b5308d829b91905b5dd7b7e1b8fe27e2bd4003b09dfe7fe295f8a43c076c0cb52f2aac067e87de7ffe3a275d21a870c3dfc9b1d06d7f018667de9eb187bdf53d282e5d8b" );
1119 
1120  switch( SIG_RSA_SHA384 )
1121  {
1122  #ifdef POLARSSL_MD2_C
1123  case SIG_RSA_MD2:
1124  md2( message_str, msg_len, hash_result );
1125  break;
1126  #endif
1127  #ifdef POLARSSL_MD4_C
1128  case SIG_RSA_MD4:
1129  md4( message_str, msg_len, hash_result );
1130  break;
1131  #endif
1132  #ifdef POLARSSL_MD5_C
1133  case SIG_RSA_MD5:
1134  md5( message_str, msg_len, hash_result );
1135  break;
1136  #endif
1137  #ifdef POLARSSL_SHA1_C
1138  case SIG_RSA_SHA1:
1139  sha1( message_str, msg_len, hash_result );
1140  break;
1141  #endif
1142  #ifdef POLARSSL_SHA2_C
1143  case SIG_RSA_SHA224:
1144  sha2( message_str, msg_len, hash_result, 1 );
1145  break;
1146  case SIG_RSA_SHA256:
1147  sha2( message_str, msg_len, hash_result, 0 );
1148  break;
1149  #endif
1150  #ifdef POLARSSL_SHA4_C
1151  case SIG_RSA_SHA384:
1152  sha4( message_str, msg_len, hash_result, 1 );
1153  break;
1154  case SIG_RSA_SHA512:
1155  sha4( message_str, msg_len, hash_result, 0 );
1156  break;
1157  #endif
1158  }
1159 
1160  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA384, 0, hash_result, result_str ) == 0 );
1161 
1162  rsa_free( &ctx );
1163  }
1164  FCT_TEST_END();
1165 #endif /* POLARSSL_SHA4_C */
1166 
1167 #ifdef POLARSSL_SHA4_C
1168 
1169  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_14)
1170  {
1171  unsigned char message_str[1000];
1172  unsigned char hash_result[1000];
1173  unsigned char result_str[1000];
1174  rsa_context ctx;
1175  int msg_len;
1176 
1177  rsa_init( &ctx, RSA_PKCS_V15, 0 );
1178  memset( message_str, 0x00, 1000 );
1179  memset( hash_result, 0x00, 1000 );
1180  memset( result_str, 0x00, 1000 );
1181 
1182  ctx.len = 1024 / 8;
1183  fct_chk( mpi_read_string( &ctx.N, 16, "e28a13548525e5f36dccb24ecb7cc332cc689dfd64012604c9c7816d72a16c3f5fcdc0e86e7c03280b1c69b586ce0cd8aec722cc73a5d3b730310bf7dfebdc77ce5d94bbc369dc18a2f7b07bd505ab0f82224aef09fdc1e5063234255e0b3c40a52e9e8ae60898eb88a766bdd788fe9493d8fd86bcdd2884d5c06216c65469e5" ) == 0 );
1184  fct_chk( mpi_read_string( &ctx.E, 16, "10001" ) == 0 );
1185 
1186  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
1187 
1188  msg_len = unhexify( message_str, "4ce61930c79dc017c2dea0c5085d73a3b0e4a6f341e9a5061a6658af11e5edf95bdad915ac3619969e39bee15788a8de667f92f4efc84f35082d52d562aa74e12cc7f22d3425b58f5056d74afcf162cd44e65b9ee510ff91af094c3d2d42c3b088536d62a98f1c689edcf3ea3fc228d711c109d76ae83d82d6a34dcfbad563cf" );
1189  unhexify( result_str, "27280b92eab5cbf0d787ff6fa6b0151d6610adfd25116113f2f186f3f8d39736d91ae510ec2bd96f2de135aefda79178138696dcc6d302e4a79ddabbe16e39ab96075776afce863e84a2e6013cb457e4047e22d43f67bf64ae5e1d844a7c12ac696efbb3cda7c0e0aca71f8a7ada9a0547bfaefe1ba2e04058c672c803720dd9" );
1190 
1191  switch( SIG_RSA_SHA512 )
1192  {
1193  #ifdef POLARSSL_MD2_C
1194  case SIG_RSA_MD2:
1195  md2( message_str, msg_len, hash_result );
1196  break;
1197  #endif
1198  #ifdef POLARSSL_MD4_C
1199  case SIG_RSA_MD4:
1200  md4( message_str, msg_len, hash_result );
1201  break;
1202  #endif
1203  #ifdef POLARSSL_MD5_C
1204  case SIG_RSA_MD5:
1205  md5( message_str, msg_len, hash_result );
1206  break;
1207  #endif
1208  #ifdef POLARSSL_SHA1_C
1209  case SIG_RSA_SHA1:
1210  sha1( message_str, msg_len, hash_result );
1211  break;
1212  #endif
1213  #ifdef POLARSSL_SHA2_C
1214  case SIG_RSA_SHA224:
1215  sha2( message_str, msg_len, hash_result, 1 );
1216  break;
1217  case SIG_RSA_SHA256:
1218  sha2( message_str, msg_len, hash_result, 0 );
1219  break;
1220  #endif
1221  #ifdef POLARSSL_SHA4_C
1222  case SIG_RSA_SHA384:
1223  sha4( message_str, msg_len, hash_result, 1 );
1224  break;
1225  case SIG_RSA_SHA512:
1226  sha4( message_str, msg_len, hash_result, 0 );
1227  break;
1228  #endif
1229  }
1230 
1231  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA512, 0, hash_result, result_str ) == 0 );
1232 
1233  rsa_free( &ctx );
1234  }
1235  FCT_TEST_END();
1236 #endif /* POLARSSL_SHA4_C */
1237 
1238 #ifdef POLARSSL_SHA1_C
1239 
1240  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_15)
1241  {
1242  unsigned char message_str[1000];
1243  unsigned char hash_result[1000];
1244  unsigned char result_str[1000];
1245  rsa_context ctx;
1246  int msg_len;
1247 
1248  rsa_init( &ctx, RSA_PKCS_V15, 0 );
1249  memset( message_str, 0x00, 1000 );
1250  memset( hash_result, 0x00, 1000 );
1251  memset( result_str, 0x00, 1000 );
1252 
1253  ctx.len = 1536 / 8;
1254  fct_chk( mpi_read_string( &ctx.N, 16, "a59d9b7269b102b7be684ec5e28db79992e6d3231e77c90b78960c2638b35ef6dbdac1ac59e7249d96d426e7f99397eabc6b8903fe1942da580322b98bafacd81bb911c29666f83886a2a2864f3552044300e60cedd5a8c321c43e280413dc41673c39a11b98a885486f8187a70f270185c4c12bc48a1968305269776c070ef69d4913589a887c4d0f5e7dd58bd806d0d49a14a1762c38665cef4646ff13a0cd29c3a60460703c3d051d5b28c660bffb5f8bd43d495ffa64175f72b8abe5fddd" ) == 0 );
1255  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
1256 
1257  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
1258 
1259  msg_len = unhexify( message_str, "224ecd3b630581da948216366c741015a9723c5ea43de67e28454d0a846f54a6df167a25cc500cf21f729aaefed6a71a3bdba438e12e20ad0c48396afe38568b70a3187f26098d6ac649a7c7ea68ed52748e7125225102216236a28f67753b077cfd8d9198b86b0b331027cb59b24b85fd92896e8f2ff5a1d11872c2e6af6ae2" );
1260  unhexify( result_str, "1f7938b20a9cd8bb8ca26bad9e79ea92373174203f3ab212a06de34a9a3e14e102d19a8878c28a2fc8083a97c06b19c1ae62678289d5d071a904aed1d364655d9e2d16480a6fd18f4c8edf204844a34d573b1b988b82d495caefd9298c1635083e196a11f4a7df6a7e3cc4db7b9642e7682d22ec7038c3bad791e1365fe8836976092460e6df749dc032baf1e026684f55936beb9369845c53c3d217941c1f8d8f54a32333a4c049c3f2d527125778032f5d390040d1d4cce83dc353ce250152" );
1261 
1262  switch( SIG_RSA_SHA1 )
1263  {
1264  #ifdef POLARSSL_MD2_C
1265  case SIG_RSA_MD2:
1266  md2( message_str, msg_len, hash_result );
1267  break;
1268  #endif
1269  #ifdef POLARSSL_MD4_C
1270  case SIG_RSA_MD4:
1271  md4( message_str, msg_len, hash_result );
1272  break;
1273  #endif
1274  #ifdef POLARSSL_MD5_C
1275  case SIG_RSA_MD5:
1276  md5( message_str, msg_len, hash_result );
1277  break;
1278  #endif
1279  #ifdef POLARSSL_SHA1_C
1280  case SIG_RSA_SHA1:
1281  sha1( message_str, msg_len, hash_result );
1282  break;
1283  #endif
1284  #ifdef POLARSSL_SHA2_C
1285  case SIG_RSA_SHA224:
1286  sha2( message_str, msg_len, hash_result, 1 );
1287  break;
1288  case SIG_RSA_SHA256:
1289  sha2( message_str, msg_len, hash_result, 0 );
1290  break;
1291  #endif
1292  #ifdef POLARSSL_SHA4_C
1293  case SIG_RSA_SHA384:
1294  sha4( message_str, msg_len, hash_result, 1 );
1295  break;
1296  case SIG_RSA_SHA512:
1297  sha4( message_str, msg_len, hash_result, 0 );
1298  break;
1299  #endif
1300  }
1301 
1302  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA1, 0, hash_result, result_str ) == 0 );
1303 
1304  rsa_free( &ctx );
1305  }
1306  FCT_TEST_END();
1307 #endif /* POLARSSL_SHA1_C */
1308 
1309 #ifdef POLARSSL_SHA2_C
1310 
1311  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_16)
1312  {
1313  unsigned char message_str[1000];
1314  unsigned char hash_result[1000];
1315  unsigned char result_str[1000];
1316  rsa_context ctx;
1317  int msg_len;
1318 
1319  rsa_init( &ctx, RSA_PKCS_V15, 0 );
1320  memset( message_str, 0x00, 1000 );
1321  memset( hash_result, 0x00, 1000 );
1322  memset( result_str, 0x00, 1000 );
1323 
1324  ctx.len = 1536 / 8;
1325  fct_chk( mpi_read_string( &ctx.N, 16, "a59d9b7269b102b7be684ec5e28db79992e6d3231e77c90b78960c2638b35ef6dbdac1ac59e7249d96d426e7f99397eabc6b8903fe1942da580322b98bafacd81bb911c29666f83886a2a2864f3552044300e60cedd5a8c321c43e280413dc41673c39a11b98a885486f8187a70f270185c4c12bc48a1968305269776c070ef69d4913589a887c4d0f5e7dd58bd806d0d49a14a1762c38665cef4646ff13a0cd29c3a60460703c3d051d5b28c660bffb5f8bd43d495ffa64175f72b8abe5fddd" ) == 0 );
1326  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
1327 
1328  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
1329 
1330  msg_len = unhexify( message_str, "6ecc722d233dad1aca45e6bc3e1a0b99fb1f89c0ec63bc657e6aaacbf931f267106cff42b712819f341b1ede798964a0b1a5032c198b391111e88d0d7303c02e23fa0137e74e604579a285b2dbc0a23aebdda65c371eb403125bd366e822e72dceffe0d55dfa3155c16283020dc9abb0d150da1aef251484aa49e49e00974dac" );
1331  unhexify( result_str, "339dce3a1937669d9fb14c4f652378861fd5adc4da88eaf833b16020b55a24ddc83b7ae3395a9a49b426bb9a4170cb765b02652faa9594b457aeefdae4f802e93d8e65c687ddc723701465a5ef19249ed5d2617b5121c58557b34eb99a663bbcf4453a6e1db5d88723de449fcf58ca8ef514daf08cfdc71be155bb3d0724df0c0a6fd5aa7737433cc376640b9b8b4c7ddd09776bae0245729cddb56e36f28edad6aecaed0821ec8d843a96348e722bf0a84cf060a793a2179f054138f907d0c3" );
1332 
1333  switch( SIG_RSA_SHA224 )
1334  {
1335  #ifdef POLARSSL_MD2_C
1336  case SIG_RSA_MD2:
1337  md2( message_str, msg_len, hash_result );
1338  break;
1339  #endif
1340  #ifdef POLARSSL_MD4_C
1341  case SIG_RSA_MD4:
1342  md4( message_str, msg_len, hash_result );
1343  break;
1344  #endif
1345  #ifdef POLARSSL_MD5_C
1346  case SIG_RSA_MD5:
1347  md5( message_str, msg_len, hash_result );
1348  break;
1349  #endif
1350  #ifdef POLARSSL_SHA1_C
1351  case SIG_RSA_SHA1:
1352  sha1( message_str, msg_len, hash_result );
1353  break;
1354  #endif
1355  #ifdef POLARSSL_SHA2_C
1356  case SIG_RSA_SHA224:
1357  sha2( message_str, msg_len, hash_result, 1 );
1358  break;
1359  case SIG_RSA_SHA256:
1360  sha2( message_str, msg_len, hash_result, 0 );
1361  break;
1362  #endif
1363  #ifdef POLARSSL_SHA4_C
1364  case SIG_RSA_SHA384:
1365  sha4( message_str, msg_len, hash_result, 1 );
1366  break;
1367  case SIG_RSA_SHA512:
1368  sha4( message_str, msg_len, hash_result, 0 );
1369  break;
1370  #endif
1371  }
1372 
1373  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA224, 0, hash_result, result_str ) == 0 );
1374 
1375  rsa_free( &ctx );
1376  }
1377  FCT_TEST_END();
1378 #endif /* POLARSSL_SHA2_C */
1379 
1380 #ifdef POLARSSL_SHA2_C
1381 
1382  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_17)
1383  {
1384  unsigned char message_str[1000];
1385  unsigned char hash_result[1000];
1386  unsigned char result_str[1000];
1387  rsa_context ctx;
1388  int msg_len;
1389 
1390  rsa_init( &ctx, RSA_PKCS_V15, 0 );
1391  memset( message_str, 0x00, 1000 );
1392  memset( hash_result, 0x00, 1000 );
1393  memset( result_str, 0x00, 1000 );
1394 
1395  ctx.len = 1536 / 8;
1396  fct_chk( mpi_read_string( &ctx.N, 16, "a59d9b7269b102b7be684ec5e28db79992e6d3231e77c90b78960c2638b35ef6dbdac1ac59e7249d96d426e7f99397eabc6b8903fe1942da580322b98bafacd81bb911c29666f83886a2a2864f3552044300e60cedd5a8c321c43e280413dc41673c39a11b98a885486f8187a70f270185c4c12bc48a1968305269776c070ef69d4913589a887c4d0f5e7dd58bd806d0d49a14a1762c38665cef4646ff13a0cd29c3a60460703c3d051d5b28c660bffb5f8bd43d495ffa64175f72b8abe5fddd" ) == 0 );
1397  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
1398 
1399  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
1400 
1401  msg_len = unhexify( message_str, "72f0b1ae27e1f5e5bfa15ded204c2c54b47b2420750a3eb5471f9ff98b67c8b5f1a30d3f8d6448562e12ce4deb33a26cfeeae993d6be9e20679d8713c5216870f11276e5f22b0ead2821a7b4dee106fc1e19b13fc9fba5d6e73e4bd93b65a9881a43d5e97ebfb0b357d5d06b21ddbecdbb10626d7748bb9e6e07d49316bbf3c4" );
1402  unhexify( result_str, "8117a6897e14c183737661cf5741350a84ae00495cd9ee8fb033582e559f79701ab424706660515ee5821a69a6850647ec641676a625d1a3899932aaa52161fbc0c0a825db82fde0585b3c9b9c16de43e26da6a30fe5a601dae68bded1e29ec34557b5f6962efb10b9450d6f096655f68e8499cfa16a0adeb9075e7b91851fef84243132d08273d35d01ad89c17e1e6e4deaf1cb233050b275fa9d2cae57e9e1a0e23139267040aa39b6abd8f10fa1cec38ce2183573ddc11626fc262e1a0ced" );
1403 
1404  switch( SIG_RSA_SHA256 )
1405  {
1406  #ifdef POLARSSL_MD2_C
1407  case SIG_RSA_MD2:
1408  md2( message_str, msg_len, hash_result );
1409  break;
1410  #endif
1411  #ifdef POLARSSL_MD4_C
1412  case SIG_RSA_MD4:
1413  md4( message_str, msg_len, hash_result );
1414  break;
1415  #endif
1416  #ifdef POLARSSL_MD5_C
1417  case SIG_RSA_MD5:
1418  md5( message_str, msg_len, hash_result );
1419  break;
1420  #endif
1421  #ifdef POLARSSL_SHA1_C
1422  case SIG_RSA_SHA1:
1423  sha1( message_str, msg_len, hash_result );
1424  break;
1425  #endif
1426  #ifdef POLARSSL_SHA2_C
1427  case SIG_RSA_SHA224:
1428  sha2( message_str, msg_len, hash_result, 1 );
1429  break;
1430  case SIG_RSA_SHA256:
1431  sha2( message_str, msg_len, hash_result, 0 );
1432  break;
1433  #endif
1434  #ifdef POLARSSL_SHA4_C
1435  case SIG_RSA_SHA384:
1436  sha4( message_str, msg_len, hash_result, 1 );
1437  break;
1438  case SIG_RSA_SHA512:
1439  sha4( message_str, msg_len, hash_result, 0 );
1440  break;
1441  #endif
1442  }
1443 
1444  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA256, 0, hash_result, result_str ) == 0 );
1445 
1446  rsa_free( &ctx );
1447  }
1448  FCT_TEST_END();
1449 #endif /* POLARSSL_SHA2_C */
1450 
1451 #ifdef POLARSSL_SHA4_C
1452 
1453  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_18)
1454  {
1455  unsigned char message_str[1000];
1456  unsigned char hash_result[1000];
1457  unsigned char result_str[1000];
1458  rsa_context ctx;
1459  int msg_len;
1460 
1461  rsa_init( &ctx, RSA_PKCS_V15, 0 );
1462  memset( message_str, 0x00, 1000 );
1463  memset( hash_result, 0x00, 1000 );
1464  memset( result_str, 0x00, 1000 );
1465 
1466  ctx.len = 1536 / 8;
1467  fct_chk( mpi_read_string( &ctx.N, 16, "a59d9b7269b102b7be684ec5e28db79992e6d3231e77c90b78960c2638b35ef6dbdac1ac59e7249d96d426e7f99397eabc6b8903fe1942da580322b98bafacd81bb911c29666f83886a2a2864f3552044300e60cedd5a8c321c43e280413dc41673c39a11b98a885486f8187a70f270185c4c12bc48a1968305269776c070ef69d4913589a887c4d0f5e7dd58bd806d0d49a14a1762c38665cef4646ff13a0cd29c3a60460703c3d051d5b28c660bffb5f8bd43d495ffa64175f72b8abe5fddd" ) == 0 );
1468  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
1469 
1470  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
1471 
1472  msg_len = unhexify( message_str, "f80c94a2b53736978adf041886ad97ab2aeb9e91c08bd4eeef6b2f2b8dd75a99b4506657188bbd7597bd5759121630627c8bf9cc30d90dd488c7a81cabab5350a62fa30abf5523f305b98f2c2c1743ec980cf26ab8219bfd9505b981ab1abbfef733b384519d5259fc5c14577cb6b88fa7f6f332ff6a65b23faecc24342c78e9" );
1473  unhexify( result_str, "6b49553ed964ae196a41ea281f4d2a250ce7d1e7434e45cf6a82f7bed17554f39c3f0241e0364702fcb87475eb0c0839ffd2180890fa05b4bbf31bbfa4bf5119dea0c9f88e1e9617fcdadabc6fa1945136cc66e039b905d78ed365c5806d38aec88b3edfb86c05ff446dbfd51d7cd75cbf8d3b85154c783765386f51637532221f52429db5612dcc034968bb8feab7dc6f5ed1f2feb557f6dd49c980296117be2c4195ec7b6101ea767df9d16a56fc9709b49308a54dab63dbc4d609f959ce17" );
1474 
1475  switch( SIG_RSA_SHA384 )
1476  {
1477  #ifdef POLARSSL_MD2_C
1478  case SIG_RSA_MD2:
1479  md2( message_str, msg_len, hash_result );
1480  break;
1481  #endif
1482  #ifdef POLARSSL_MD4_C
1483  case SIG_RSA_MD4:
1484  md4( message_str, msg_len, hash_result );
1485  break;
1486  #endif
1487  #ifdef POLARSSL_MD5_C
1488  case SIG_RSA_MD5:
1489  md5( message_str, msg_len, hash_result );
1490  break;
1491  #endif
1492  #ifdef POLARSSL_SHA1_C
1493  case SIG_RSA_SHA1:
1494  sha1( message_str, msg_len, hash_result );
1495  break;
1496  #endif
1497  #ifdef POLARSSL_SHA2_C
1498  case SIG_RSA_SHA224:
1499  sha2( message_str, msg_len, hash_result, 1 );
1500  break;
1501  case SIG_RSA_SHA256:
1502  sha2( message_str, msg_len, hash_result, 0 );
1503  break;
1504  #endif
1505  #ifdef POLARSSL_SHA4_C
1506  case SIG_RSA_SHA384:
1507  sha4( message_str, msg_len, hash_result, 1 );
1508  break;
1509  case SIG_RSA_SHA512:
1510  sha4( message_str, msg_len, hash_result, 0 );
1511  break;
1512  #endif
1513  }
1514 
1515  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA384, 0, hash_result, result_str ) == 0 );
1516 
1517  rsa_free( &ctx );
1518  }
1519  FCT_TEST_END();
1520 #endif /* POLARSSL_SHA4_C */
1521 
1522 #ifdef POLARSSL_SHA4_C
1523 
1524  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_19)
1525  {
1526  unsigned char message_str[1000];
1527  unsigned char hash_result[1000];
1528  unsigned char result_str[1000];
1529  rsa_context ctx;
1530  int msg_len;
1531 
1532  rsa_init( &ctx, RSA_PKCS_V15, 0 );
1533  memset( message_str, 0x00, 1000 );
1534  memset( hash_result, 0x00, 1000 );
1535  memset( result_str, 0x00, 1000 );
1536 
1537  ctx.len = 1536 / 8;
1538  fct_chk( mpi_read_string( &ctx.N, 16, "a59d9b7269b102b7be684ec5e28db79992e6d3231e77c90b78960c2638b35ef6dbdac1ac59e7249d96d426e7f99397eabc6b8903fe1942da580322b98bafacd81bb911c29666f83886a2a2864f3552044300e60cedd5a8c321c43e280413dc41673c39a11b98a885486f8187a70f270185c4c12bc48a1968305269776c070ef69d4913589a887c4d0f5e7dd58bd806d0d49a14a1762c38665cef4646ff13a0cd29c3a60460703c3d051d5b28c660bffb5f8bd43d495ffa64175f72b8abe5fddd" ) == 0 );
1539  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
1540 
1541  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
1542 
1543  msg_len = unhexify( message_str, "4eb97094bb42aaa58b040bd06a8f324396b9eca9e39359b7039c4a010434ee131a53aebd9f7a55ae58ea7444fa1505a3ec524e054fd408513cddc1ee4c2f7fd95ec4a6f594be1ba39fa1aa933dc0a5dafff5ce44509577ebb3a3e8084c44010aa27321e5a3f646ade99175633b795c0f570b360eeebeefaef15788f80b5cbecd" );
1544  unhexify( result_str, "2b8b794a8621d492eec18a4efd239e0e077c89340a34b0fdbf467f2bf3112c7f33d00ee736f2988af8569c1a74891efbefa839e295fffdf4d908c1ede61a861a4d24b154a09d1b3f923fd2bb7906994cf82a97da285bf48e61f90cc3596f9350ab9b66a216ffca323195bb213f5a77fe8c697475595a1857dbee58128cbf1be7cb220229ce52766fefd88cc129ad5cbbdcd31fb4eede6c4fdd3193a9aaaa54362bcea4082981d9b7c40483814828f3297d95ad933c76f31c47e37a93ffaf0d4a" );
1545 
1546  switch( SIG_RSA_SHA512 )
1547  {
1548  #ifdef POLARSSL_MD2_C
1549  case SIG_RSA_MD2:
1550  md2( message_str, msg_len, hash_result );
1551  break;
1552  #endif
1553  #ifdef POLARSSL_MD4_C
1554  case SIG_RSA_MD4:
1555  md4( message_str, msg_len, hash_result );
1556  break;
1557  #endif
1558  #ifdef POLARSSL_MD5_C
1559  case SIG_RSA_MD5:
1560  md5( message_str, msg_len, hash_result );
1561  break;
1562  #endif
1563  #ifdef POLARSSL_SHA1_C
1564  case SIG_RSA_SHA1:
1565  sha1( message_str, msg_len, hash_result );
1566  break;
1567  #endif
1568  #ifdef POLARSSL_SHA2_C
1569  case SIG_RSA_SHA224:
1570  sha2( message_str, msg_len, hash_result, 1 );
1571  break;
1572  case SIG_RSA_SHA256:
1573  sha2( message_str, msg_len, hash_result, 0 );
1574  break;
1575  #endif
1576  #ifdef POLARSSL_SHA4_C
1577  case SIG_RSA_SHA384:
1578  sha4( message_str, msg_len, hash_result, 1 );
1579  break;
1580  case SIG_RSA_SHA512:
1581  sha4( message_str, msg_len, hash_result, 0 );
1582  break;
1583  #endif
1584  }
1585 
1586  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA512, 0, hash_result, result_str ) == 0 );
1587 
1588  rsa_free( &ctx );
1589  }
1590  FCT_TEST_END();
1591 #endif /* POLARSSL_SHA4_C */
1592 
1593 #ifdef POLARSSL_SHA1_C
1594 
1595  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_20)
1596  {
1597  unsigned char message_str[1000];
1598  unsigned char hash_result[1000];
1599  unsigned char result_str[1000];
1600  rsa_context ctx;
1601  int msg_len;
1602 
1603  rsa_init( &ctx, RSA_PKCS_V15, 0 );
1604  memset( message_str, 0x00, 1000 );
1605  memset( hash_result, 0x00, 1000 );
1606  memset( result_str, 0x00, 1000 );
1607 
1608  ctx.len = 1536 / 8;
1609  fct_chk( mpi_read_string( &ctx.N, 16, "a59d9b7269b102b7be684ec5e28db79992e6d3231e77c90b78960c2638b35ef6dbdac1ac59e7249d96d426e7f99397eabc6b8903fe1942da580322b98bafacd81bb911c29666f83886a2a2864f3552044300e60cedd5a8c321c43e280413dc41673c39a11b98a885486f8187a70f270185c4c12bc48a1968305269776c070ef69d4913589a887c4d0f5e7dd58bd806d0d49a14a1762c38665cef4646ff13a0cd29c3a60460703c3d051d5b28c660bffb5f8bd43d495ffa64175f72b8abe5fddd" ) == 0 );
1610  fct_chk( mpi_read_string( &ctx.E, 16, "10001" ) == 0 );
1611 
1612  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
1613 
1614  msg_len = unhexify( message_str, "a3edb0f52c6166d7b76e71634761f402337c3e9667549d00cd7877e6055396b35c54c4dffc4c987060178fc10b7e5e827a5c870057002ba6efd31fc4e63a429029be0d6b256b6b653775cb026322743f48e319d053c4aeac34077acb8e0c6c2ef375b2210f8788bd23d24eb0b614de41875b1c8ec56acf18825eaf826691be96" );
1615  unhexify( result_str, "180630d2f4dc91ddb1159978e278cda7ac4b178e82477f9770c4d2e1c5017d2f222348658044c1be4cda24ce3c9ba3d423536a39bf60324c1b30eabdad700b0982e58072f7e18216e7e4c07e17674ec3eabcfbafce317d2f539f129902d80031ca201a8b325629a96ca4a70b51294c2fddd1d0aca1537d7d8b780e1e62d34be2f98104d876a4990396c8628e6498d9651f468bdf1139664eabe9166efbe909bf87d7305d5f60f1acc3599ed339fcf4e009fbad4059af1a50264cb0a4ec1d23f3" );
1616 
1617  switch( SIG_RSA_SHA1 )
1618  {
1619  #ifdef POLARSSL_MD2_C
1620  case SIG_RSA_MD2:
1621  md2( message_str, msg_len, hash_result );
1622  break;
1623  #endif
1624  #ifdef POLARSSL_MD4_C
1625  case SIG_RSA_MD4:
1626  md4( message_str, msg_len, hash_result );
1627  break;
1628  #endif
1629  #ifdef POLARSSL_MD5_C
1630  case SIG_RSA_MD5:
1631  md5( message_str, msg_len, hash_result );
1632  break;
1633  #endif
1634  #ifdef POLARSSL_SHA1_C
1635  case SIG_RSA_SHA1:
1636  sha1( message_str, msg_len, hash_result );
1637  break;
1638  #endif
1639  #ifdef POLARSSL_SHA2_C
1640  case SIG_RSA_SHA224:
1641  sha2( message_str, msg_len, hash_result, 1 );
1642  break;
1643  case SIG_RSA_SHA256:
1644  sha2( message_str, msg_len, hash_result, 0 );
1645  break;
1646  #endif
1647  #ifdef POLARSSL_SHA4_C
1648  case SIG_RSA_SHA384:
1649  sha4( message_str, msg_len, hash_result, 1 );
1650  break;
1651  case SIG_RSA_SHA512:
1652  sha4( message_str, msg_len, hash_result, 0 );
1653  break;
1654  #endif
1655  }
1656 
1657  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA1, 0, hash_result, result_str ) == 0 );
1658 
1659  rsa_free( &ctx );
1660  }
1661  FCT_TEST_END();
1662 #endif /* POLARSSL_SHA1_C */
1663 
1664 #ifdef POLARSSL_SHA1_C
1665 
1666  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_21)
1667  {
1668  unsigned char message_str[1000];
1669  unsigned char hash_result[1000];
1670  unsigned char result_str[1000];
1671  rsa_context ctx;
1672  int msg_len;
1673 
1674  rsa_init( &ctx, RSA_PKCS_V15, 0 );
1675  memset( message_str, 0x00, 1000 );
1676  memset( hash_result, 0x00, 1000 );
1677  memset( result_str, 0x00, 1000 );
1678 
1679  ctx.len = 1536 / 8;
1680  fct_chk( mpi_read_string( &ctx.N, 16, "a59d9b7269b102b7be684ec5e28db79992e6d3231e77c90b78960c2638b35ef6dbdac1ac59e7249d96d426e7f99397eabc6b8903fe1942da580322b98bafacd81bb911c29666f83886a2a2864f3552044300e60cedd5a8c321c43e280413dc41673c39a11b98a885486f8187a70f270185c4c12bc48a1968305269776c070ef69d4913589a887c4d0f5e7dd58bd806d0d49a14a1762c38665cef4646ff13a0cd29c3a60460703c3d051d5b28c660bffb5f8bd43d495ffa64175f72b8abe5fddd" ) == 0 );
1681  fct_chk( mpi_read_string( &ctx.E, 16, "10001" ) == 0 );
1682 
1683  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
1684 
1685  msg_len = unhexify( message_str, "ac58fd024208d7f045d81a56cd55aad40ab86b0d216ab55136c7027aca23ea13480a52c0dacce0d98139b25965aa4ff76a41dd92037195d24bc0750d52cb3467b48b7b3e71d852c5f82bd9ee85a8388ead5cd8bc38c3d4792e8daa9734a137d31963e245ad3217fad235f7dfd5584de0fe91c4526568588e08b60bdf1badd99f" );
1686  unhexify( result_str, "a142b0d9456f8f4772675265a08613a66c416bd1ae712975c69d9ca5fb8c1be9c24359a04fd15460bf6136a8a11f13e3ce2de2171524f10cb715f0d71e3db15281ab99eadbe86cf8c5c518162c638ef27a4f7bfb4a1a3873f3c384a5b1c3b4966c837b9d8d192ac34e03943b7ae191355aa1ff3b9cd041bb2668f1f81cf0d015b3d3608cd9ac79398212c0f132f1bd45d47768b999fcf3c05fe2069593ceecedc851a7fc465abcfef0fabba9b9460153f6ba8723a5c6e766c83a446aef3ee327" );
1687 
1688  switch( SIG_RSA_SHA1 )
1689  {
1690  #ifdef POLARSSL_MD2_C
1691  case SIG_RSA_MD2:
1692  md2( message_str, msg_len, hash_result );
1693  break;
1694  #endif
1695  #ifdef POLARSSL_MD4_C
1696  case SIG_RSA_MD4:
1697  md4( message_str, msg_len, hash_result );
1698  break;
1699  #endif
1700  #ifdef POLARSSL_MD5_C
1701  case SIG_RSA_MD5:
1702  md5( message_str, msg_len, hash_result );
1703  break;
1704  #endif
1705  #ifdef POLARSSL_SHA1_C
1706  case SIG_RSA_SHA1:
1707  sha1( message_str, msg_len, hash_result );
1708  break;
1709  #endif
1710  #ifdef POLARSSL_SHA2_C
1711  case SIG_RSA_SHA224:
1712  sha2( message_str, msg_len, hash_result, 1 );
1713  break;
1714  case SIG_RSA_SHA256:
1715  sha2( message_str, msg_len, hash_result, 0 );
1716  break;
1717  #endif
1718  #ifdef POLARSSL_SHA4_C
1719  case SIG_RSA_SHA384:
1720  sha4( message_str, msg_len, hash_result, 1 );
1721  break;
1722  case SIG_RSA_SHA512:
1723  sha4( message_str, msg_len, hash_result, 0 );
1724  break;
1725  #endif
1726  }
1727 
1728  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA1, 0, hash_result, result_str ) == POLARSSL_ERR_RSA_INVALID_PADDING );
1729 
1730  rsa_free( &ctx );
1731  }
1732  FCT_TEST_END();
1733 #endif /* POLARSSL_SHA1_C */
1734 
1735 #ifdef POLARSSL_SHA2_C
1736 
1737  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_22)
1738  {
1739  unsigned char message_str[1000];
1740  unsigned char hash_result[1000];
1741  unsigned char result_str[1000];
1742  rsa_context ctx;
1743  int msg_len;
1744 
1745  rsa_init( &ctx, RSA_PKCS_V15, 0 );
1746  memset( message_str, 0x00, 1000 );
1747  memset( hash_result, 0x00, 1000 );
1748  memset( result_str, 0x00, 1000 );
1749 
1750  ctx.len = 1536 / 8;
1751  fct_chk( mpi_read_string( &ctx.N, 16, "a59d9b7269b102b7be684ec5e28db79992e6d3231e77c90b78960c2638b35ef6dbdac1ac59e7249d96d426e7f99397eabc6b8903fe1942da580322b98bafacd81bb911c29666f83886a2a2864f3552044300e60cedd5a8c321c43e280413dc41673c39a11b98a885486f8187a70f270185c4c12bc48a1968305269776c070ef69d4913589a887c4d0f5e7dd58bd806d0d49a14a1762c38665cef4646ff13a0cd29c3a60460703c3d051d5b28c660bffb5f8bd43d495ffa64175f72b8abe5fddd" ) == 0 );
1752  fct_chk( mpi_read_string( &ctx.E, 16, "10001" ) == 0 );
1753 
1754  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
1755 
1756  msg_len = unhexify( message_str, "027f767928a5821e2723d6f36c43e6b498b6f0b381852571794a096bd49f1c36a4d7bacec7ec402c24b970163169173bb930ec7fdc39bc9457dfc4ca051f5f28a64de1bbe007c22e8368ff9b117dbda17efd2fb73434bbbf5a4158df56813b8c904bb2e779de504dcd974a291568210d6f85810291606a1c0cd88d51ceadf98a" );
1757  unhexify( result_str, "0676e64daaa18f4af46e9dfbe234db389b8a527b0fe1db97eb7f404e3155226cba70d318800f83160fa1aa19916e5c09f079331079f18cb8ab1a4b884cb28501824974f683ed2b9babae9f8c15bea30802805c6b2152119764811bbf5f3994d2e97fa2fe8c5ab15a23c14d7ae56be00eaa8bc26678481ff5ba59b0acfb0e43341bff9fc638e5625480a73dbc5d8d13bd2b9e64037c6b79df0c60869980c6a22ec46f80fb859cb4ee5d2032ac1fe538cfd85c70a7f33b4af50a93395917c2cfb6" );
1758 
1759  switch( SIG_RSA_SHA224 )
1760  {
1761  #ifdef POLARSSL_MD2_C
1762  case SIG_RSA_MD2:
1763  md2( message_str, msg_len, hash_result );
1764  break;
1765  #endif
1766  #ifdef POLARSSL_MD4_C
1767  case SIG_RSA_MD4:
1768  md4( message_str, msg_len, hash_result );
1769  break;
1770  #endif
1771  #ifdef POLARSSL_MD5_C
1772  case SIG_RSA_MD5:
1773  md5( message_str, msg_len, hash_result );
1774  break;
1775  #endif
1776  #ifdef POLARSSL_SHA1_C
1777  case SIG_RSA_SHA1:
1778  sha1( message_str, msg_len, hash_result );
1779  break;
1780  #endif
1781  #ifdef POLARSSL_SHA2_C
1782  case SIG_RSA_SHA224:
1783  sha2( message_str, msg_len, hash_result, 1 );
1784  break;
1785  case SIG_RSA_SHA256:
1786  sha2( message_str, msg_len, hash_result, 0 );
1787  break;
1788  #endif
1789  #ifdef POLARSSL_SHA4_C
1790  case SIG_RSA_SHA384:
1791  sha4( message_str, msg_len, hash_result, 1 );
1792  break;
1793  case SIG_RSA_SHA512:
1794  sha4( message_str, msg_len, hash_result, 0 );
1795  break;
1796  #endif
1797  }
1798 
1799  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA224, 0, hash_result, result_str ) == POLARSSL_ERR_RSA_INVALID_PADDING );
1800 
1801  rsa_free( &ctx );
1802  }
1803  FCT_TEST_END();
1804 #endif /* POLARSSL_SHA2_C */
1805 
1806 #ifdef POLARSSL_SHA2_C
1807 
1808  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_23)
1809  {
1810  unsigned char message_str[1000];
1811  unsigned char hash_result[1000];
1812  unsigned char result_str[1000];
1813  rsa_context ctx;
1814  int msg_len;
1815 
1816  rsa_init( &ctx, RSA_PKCS_V15, 0 );
1817  memset( message_str, 0x00, 1000 );
1818  memset( hash_result, 0x00, 1000 );
1819  memset( result_str, 0x00, 1000 );
1820 
1821  ctx.len = 1536 / 8;
1822  fct_chk( mpi_read_string( &ctx.N, 16, "a59d9b7269b102b7be684ec5e28db79992e6d3231e77c90b78960c2638b35ef6dbdac1ac59e7249d96d426e7f99397eabc6b8903fe1942da580322b98bafacd81bb911c29666f83886a2a2864f3552044300e60cedd5a8c321c43e280413dc41673c39a11b98a885486f8187a70f270185c4c12bc48a1968305269776c070ef69d4913589a887c4d0f5e7dd58bd806d0d49a14a1762c38665cef4646ff13a0cd29c3a60460703c3d051d5b28c660bffb5f8bd43d495ffa64175f72b8abe5fddd" ) == 0 );
1823  fct_chk( mpi_read_string( &ctx.E, 16, "10001" ) == 0 );
1824 
1825  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
1826 
1827  msg_len = unhexify( message_str, "06dcd9d4c056b6a45b9ed2ae5f6c1cfa43aae06fe01ee098264aa7a80e901abbcf9a505e55f9a352ef0c078d48249b8298e57ea21bf0e423c3bf69002acfa541ca05007c704bc79cee7a80e1107c7b28d2b2aa6dd093b28efe9642519952a4a95ee49235f9924a0ac0aee5b2a1bce47459d70cd6e75074614199dca44561407c" );
1828  unhexify( result_str, "5e08f399258e6de075b67a0a6a822ceb21b1eb7a0342eca6a4295739f644547dee3456243cf32bd6ea6f357c88632508457130f3dae04f7806efaed43d1d501e16c961dfbd6c71a42b480e95c7027f8275063d05a9aac3eef0520867b9896ebe8ec358f7d121beb4e61ddfdc3dcd835dfe265f2ba68d300ef566ed1284f9f3d7b1af363ed47bfa2e5f0492925444df7e5fcb1e79e690c746117650b543a5e82c39553552f0f44e617b5cf773c533050f4129e893ac22af69b1eb9afb4b5ba5f5" );
1829 
1830  switch( SIG_RSA_SHA224 )
1831  {
1832  #ifdef POLARSSL_MD2_C
1833  case SIG_RSA_MD2:
1834  md2( message_str, msg_len, hash_result );
1835  break;
1836  #endif
1837  #ifdef POLARSSL_MD4_C
1838  case SIG_RSA_MD4:
1839  md4( message_str, msg_len, hash_result );
1840  break;
1841  #endif
1842  #ifdef POLARSSL_MD5_C
1843  case SIG_RSA_MD5:
1844  md5( message_str, msg_len, hash_result );
1845  break;
1846  #endif
1847  #ifdef POLARSSL_SHA1_C
1848  case SIG_RSA_SHA1:
1849  sha1( message_str, msg_len, hash_result );
1850  break;
1851  #endif
1852  #ifdef POLARSSL_SHA2_C
1853  case SIG_RSA_SHA224:
1854  sha2( message_str, msg_len, hash_result, 1 );
1855  break;
1856  case SIG_RSA_SHA256:
1857  sha2( message_str, msg_len, hash_result, 0 );
1858  break;
1859  #endif
1860  #ifdef POLARSSL_SHA4_C
1861  case SIG_RSA_SHA384:
1862  sha4( message_str, msg_len, hash_result, 1 );
1863  break;
1864  case SIG_RSA_SHA512:
1865  sha4( message_str, msg_len, hash_result, 0 );
1866  break;
1867  #endif
1868  }
1869 
1870  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA224, 0, hash_result, result_str ) == 0 );
1871 
1872  rsa_free( &ctx );
1873  }
1874  FCT_TEST_END();
1875 #endif /* POLARSSL_SHA2_C */
1876 
1877 #ifdef POLARSSL_SHA2_C
1878 
1879  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_24)
1880  {
1881  unsigned char message_str[1000];
1882  unsigned char hash_result[1000];
1883  unsigned char result_str[1000];
1884  rsa_context ctx;
1885  int msg_len;
1886 
1887  rsa_init( &ctx, RSA_PKCS_V15, 0 );
1888  memset( message_str, 0x00, 1000 );
1889  memset( hash_result, 0x00, 1000 );
1890  memset( result_str, 0x00, 1000 );
1891 
1892  ctx.len = 1536 / 8;
1893  fct_chk( mpi_read_string( &ctx.N, 16, "a59d9b7269b102b7be684ec5e28db79992e6d3231e77c90b78960c2638b35ef6dbdac1ac59e7249d96d426e7f99397eabc6b8903fe1942da580322b98bafacd81bb911c29666f83886a2a2864f3552044300e60cedd5a8c321c43e280413dc41673c39a11b98a885486f8187a70f270185c4c12bc48a1968305269776c070ef69d4913589a887c4d0f5e7dd58bd806d0d49a14a1762c38665cef4646ff13a0cd29c3a60460703c3d051d5b28c660bffb5f8bd43d495ffa64175f72b8abe5fddd" ) == 0 );
1894  fct_chk( mpi_read_string( &ctx.E, 16, "10001" ) == 0 );
1895 
1896  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
1897 
1898  msg_len = unhexify( message_str, "1240028c6d7ab3992ada0e5ca55ee4f3d62f8de575302d5861d73685423c2e6a6d6fb3be090fbc2a701821b6d8fd5e8233f794b6549cd0bb52b390ac31478307bffa91a9bd9c1bf93ffc846356fef008ebee4bb3ee148e0fb1893d188e4934d0d088a433d14a596c5f2e3e49648a22edc6bdbcc58dc1edbd440046b3a169ca2b" );
1899  unhexify( result_str, "a003ae9cf0704d58763b214f20446ecc4099c566f25384e28d0dd6540c58705fc8d0bfe1ceaa06096ed1e230146edb82056e39e6727abec09f25e44079b6ce1ca2c6a540dec7aa34444d7d435f41e5fca9b0bba62759ae2780638e5160e031bb60409c2e85674ac7a776b444b37b9d7f4dbaa557e88b8562a584f2dbe90729b241aede95dfcc7e05b10deef06255cb89f0e7ccff23354818756a1f8bb9f00fd18f6cd22ca1b4bfc38027562bb37562c77c7883b5d735170d75521195fd3f2bd3" );
1900 
1901  switch( SIG_RSA_SHA256 )
1902  {
1903  #ifdef POLARSSL_MD2_C
1904  case SIG_RSA_MD2:
1905  md2( message_str, msg_len, hash_result );
1906  break;
1907  #endif
1908  #ifdef POLARSSL_MD4_C
1909  case SIG_RSA_MD4:
1910  md4( message_str, msg_len, hash_result );
1911  break;
1912  #endif
1913  #ifdef POLARSSL_MD5_C
1914  case SIG_RSA_MD5:
1915  md5( message_str, msg_len, hash_result );
1916  break;
1917  #endif
1918  #ifdef POLARSSL_SHA1_C
1919  case SIG_RSA_SHA1:
1920  sha1( message_str, msg_len, hash_result );
1921  break;
1922  #endif
1923  #ifdef POLARSSL_SHA2_C
1924  case SIG_RSA_SHA224:
1925  sha2( message_str, msg_len, hash_result, 1 );
1926  break;
1927  case SIG_RSA_SHA256:
1928  sha2( message_str, msg_len, hash_result, 0 );
1929  break;
1930  #endif
1931  #ifdef POLARSSL_SHA4_C
1932  case SIG_RSA_SHA384:
1933  sha4( message_str, msg_len, hash_result, 1 );
1934  break;
1935  case SIG_RSA_SHA512:
1936  sha4( message_str, msg_len, hash_result, 0 );
1937  break;
1938  #endif
1939  }
1940 
1941  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA256, 0, hash_result, result_str ) == 0 );
1942 
1943  rsa_free( &ctx );
1944  }
1945  FCT_TEST_END();
1946 #endif /* POLARSSL_SHA2_C */
1947 
1948 #ifdef POLARSSL_SHA4_C
1949 
1950  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_25)
1951  {
1952  unsigned char message_str[1000];
1953  unsigned char hash_result[1000];
1954  unsigned char result_str[1000];
1955  rsa_context ctx;
1956  int msg_len;
1957 
1958  rsa_init( &ctx, RSA_PKCS_V15, 0 );
1959  memset( message_str, 0x00, 1000 );
1960  memset( hash_result, 0x00, 1000 );
1961  memset( result_str, 0x00, 1000 );
1962 
1963  ctx.len = 1536 / 8;
1964  fct_chk( mpi_read_string( &ctx.N, 16, "a59d9b7269b102b7be684ec5e28db79992e6d3231e77c90b78960c2638b35ef6dbdac1ac59e7249d96d426e7f99397eabc6b8903fe1942da580322b98bafacd81bb911c29666f83886a2a2864f3552044300e60cedd5a8c321c43e280413dc41673c39a11b98a885486f8187a70f270185c4c12bc48a1968305269776c070ef69d4913589a887c4d0f5e7dd58bd806d0d49a14a1762c38665cef4646ff13a0cd29c3a60460703c3d051d5b28c660bffb5f8bd43d495ffa64175f72b8abe5fddd" ) == 0 );
1965  fct_chk( mpi_read_string( &ctx.E, 16, "10001" ) == 0 );
1966 
1967  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
1968 
1969  msg_len = unhexify( message_str, "67922a8b9cbc95cf7c555ff2d73cfc62ee04c3f0df9bfc8f64293a58bd3bebd2eb212d711f94e35c729d0873d6b244914d21bd0e59b23089b38740e43f480e8f407d090ac93b08a57403968b55e78cfe31eee6e4ecbacf834168fe89b6b8454fce6e675e80f82b33e850ae3f3d24fd320335e37981fd000576941b4f08d4ba99" );
1970  unhexify( result_str, "2c6b301852cc55a993a933e2c080eb9dabfe19e9dc3571066caeabed1492d3501cd838de1c01784932df7a5ad5bbfb48c78f53a45f76e9812d046f23bd968495ef7e981e5add4acfc538fe33a5205de74bb37d3d9b6b87b2d174e85a73f216fd67d5738fc469dff7ea6b852e8dd08bc8df036597372d4d51185e6f47a45fbe1b9bdb06a4018783425ec95294de41f27235ad3b3263a890b8b62b17410a9bb08673393ff205a866ee2057e99c6517c6bbc84f8d87717b83d6f64de7ee215e1e8d" );
1971 
1972  switch( SIG_RSA_SHA384 )
1973  {
1974  #ifdef POLARSSL_MD2_C
1975  case SIG_RSA_MD2:
1976  md2( message_str, msg_len, hash_result );
1977  break;
1978  #endif
1979  #ifdef POLARSSL_MD4_C
1980  case SIG_RSA_MD4:
1981  md4( message_str, msg_len, hash_result );
1982  break;
1983  #endif
1984  #ifdef POLARSSL_MD5_C
1985  case SIG_RSA_MD5:
1986  md5( message_str, msg_len, hash_result );
1987  break;
1988  #endif
1989  #ifdef POLARSSL_SHA1_C
1990  case SIG_RSA_SHA1:
1991  sha1( message_str, msg_len, hash_result );
1992  break;
1993  #endif
1994  #ifdef POLARSSL_SHA2_C
1995  case SIG_RSA_SHA224:
1996  sha2( message_str, msg_len, hash_result, 1 );
1997  break;
1998  case SIG_RSA_SHA256:
1999  sha2( message_str, msg_len, hash_result, 0 );
2000  break;
2001  #endif
2002  #ifdef POLARSSL_SHA4_C
2003  case SIG_RSA_SHA384:
2004  sha4( message_str, msg_len, hash_result, 1 );
2005  break;
2006  case SIG_RSA_SHA512:
2007  sha4( message_str, msg_len, hash_result, 0 );
2008  break;
2009  #endif
2010  }
2011 
2012  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA384, 0, hash_result, result_str ) == 0 );
2013 
2014  rsa_free( &ctx );
2015  }
2016  FCT_TEST_END();
2017 #endif /* POLARSSL_SHA4_C */
2018 
2019 #ifdef POLARSSL_SHA4_C
2020 
2021  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_26)
2022  {
2023  unsigned char message_str[1000];
2024  unsigned char hash_result[1000];
2025  unsigned char result_str[1000];
2026  rsa_context ctx;
2027  int msg_len;
2028 
2029  rsa_init( &ctx, RSA_PKCS_V15, 0 );
2030  memset( message_str, 0x00, 1000 );
2031  memset( hash_result, 0x00, 1000 );
2032  memset( result_str, 0x00, 1000 );
2033 
2034  ctx.len = 1536 / 8;
2035  fct_chk( mpi_read_string( &ctx.N, 16, "a59d9b7269b102b7be684ec5e28db79992e6d3231e77c90b78960c2638b35ef6dbdac1ac59e7249d96d426e7f99397eabc6b8903fe1942da580322b98bafacd81bb911c29666f83886a2a2864f3552044300e60cedd5a8c321c43e280413dc41673c39a11b98a885486f8187a70f270185c4c12bc48a1968305269776c070ef69d4913589a887c4d0f5e7dd58bd806d0d49a14a1762c38665cef4646ff13a0cd29c3a60460703c3d051d5b28c660bffb5f8bd43d495ffa64175f72b8abe5fddd" ) == 0 );
2036  fct_chk( mpi_read_string( &ctx.E, 16, "10001" ) == 0 );
2037 
2038  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
2039 
2040  msg_len = unhexify( message_str, "1428b4a449698a994ef84c46a517c3aa6359c48e4264ef65f1f69d77ae26133e17edfc103de416fffb4f2bfe865b434544a418f6e2faca00a165d443f0663ff64080154614f7194057d8b5f1f33934cc9fc2314cf86d4fdad4892bf0d3058f7f37ebe98ef52bfb240b9ad369153afe081bbcf9d7ae43e8ba336b8ac57e8a6da0" );
2041  unhexify( result_str, "8e10a1ae470e6e57a8d234185f78fdb600cc636c41565a9f3694a84ae102f6251984f54d11a7785fdcfdfaf80a821e05d57ef6b8edc03d9076755779322fd53eb98c805da77dc9316744e393c2fecd291a7e6043b1ca89fd8248f661e1d53110211b91edb41b31e848cde1115d8afd9963ebcc36aff5a27085949f0781bc69167c140ecfe71c44aacaf4123e557eaf2b528c6d0ea875b4ceefa942fe338af8df10562c438af04cd7521da912b3e3899cef0d75722161be6abed5e4e9009dbf40" );
2042 
2043  switch( SIG_RSA_SHA512 )
2044  {
2045  #ifdef POLARSSL_MD2_C
2046  case SIG_RSA_MD2:
2047  md2( message_str, msg_len, hash_result );
2048  break;
2049  #endif
2050  #ifdef POLARSSL_MD4_C
2051  case SIG_RSA_MD4:
2052  md4( message_str, msg_len, hash_result );
2053  break;
2054  #endif
2055  #ifdef POLARSSL_MD5_C
2056  case SIG_RSA_MD5:
2057  md5( message_str, msg_len, hash_result );
2058  break;
2059  #endif
2060  #ifdef POLARSSL_SHA1_C
2061  case SIG_RSA_SHA1:
2062  sha1( message_str, msg_len, hash_result );
2063  break;
2064  #endif
2065  #ifdef POLARSSL_SHA2_C
2066  case SIG_RSA_SHA224:
2067  sha2( message_str, msg_len, hash_result, 1 );
2068  break;
2069  case SIG_RSA_SHA256:
2070  sha2( message_str, msg_len, hash_result, 0 );
2071  break;
2072  #endif
2073  #ifdef POLARSSL_SHA4_C
2074  case SIG_RSA_SHA384:
2075  sha4( message_str, msg_len, hash_result, 1 );
2076  break;
2077  case SIG_RSA_SHA512:
2078  sha4( message_str, msg_len, hash_result, 0 );
2079  break;
2080  #endif
2081  }
2082 
2083  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA512, 0, hash_result, result_str ) == 0 );
2084 
2085  rsa_free( &ctx );
2086  }
2087  FCT_TEST_END();
2088 #endif /* POLARSSL_SHA4_C */
2089 
2090 #ifdef POLARSSL_SHA1_C
2091 
2092  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_27)
2093  {
2094  unsigned char message_str[1000];
2095  unsigned char hash_result[1000];
2096  unsigned char result_str[1000];
2097  rsa_context ctx;
2098  int msg_len;
2099 
2100  rsa_init( &ctx, RSA_PKCS_V15, 0 );
2101  memset( message_str, 0x00, 1000 );
2102  memset( hash_result, 0x00, 1000 );
2103  memset( result_str, 0x00, 1000 );
2104 
2105  ctx.len = 1536 / 8;
2106  fct_chk( mpi_read_string( &ctx.N, 16, "a59d9b7269b102b7be684ec5e28db79992e6d3231e77c90b78960c2638b35ef6dbdac1ac59e7249d96d426e7f99397eabc6b8903fe1942da580322b98bafacd81bb911c29666f83886a2a2864f3552044300e60cedd5a8c321c43e280413dc41673c39a11b98a885486f8187a70f270185c4c12bc48a1968305269776c070ef69d4913589a887c4d0f5e7dd58bd806d0d49a14a1762c38665cef4646ff13a0cd29c3a60460703c3d051d5b28c660bffb5f8bd43d495ffa64175f72b8abe5fddd" ) == 0 );
2107  fct_chk( mpi_read_string( &ctx.E, 16, "11" ) == 0 );
2108 
2109  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
2110 
2111  msg_len = unhexify( message_str, "4871adc05f6b3ecf296680b0dd8d86715b0d5264c064008037dc410512520b5f193c8f4d21eb6c42e10d220c0275c9b3751f03a4096e2f0e3db9df8d52068c06a51589d23ca1361e9fe27691e95663301ec1407fbf73aee99cc92362eaf6994b95038396d815052a0aef6489bbb7bcb0fffdf13f0af9e7d9fd14f6ce00ab98f7" );
2112  unhexify( result_str, "180caf03781b391aacebe5b3f5e1d3b01c68a00df4ecfb6c4bf14217aed7cfca0adac099ec1d6e1f0b43b09b86788533fee6691d773807af0df6cc3bbdde3cf34bf5b848fa59c8bc10227cc3eba3452a85e0520fccdb2d8d32dd99672d302756a2d7f7f2693db3a48be17bd34d9d891f4ba44449c5bad1de91b788f524500a7703cccbaa77b9fe8791f5c8aa7b8f055336f28fcfc01733712e33cfb3d33fe71ddb9ced2a31931ec38007f5ad4a0d19acc428124b0e5ee6e0746fb33c1a4d90c8" );
2113 
2114  switch( SIG_RSA_SHA1 )
2115  {
2116  #ifdef POLARSSL_MD2_C
2117  case SIG_RSA_MD2:
2118  md2( message_str, msg_len, hash_result );
2119  break;
2120  #endif
2121  #ifdef POLARSSL_MD4_C
2122  case SIG_RSA_MD4:
2123  md4( message_str, msg_len, hash_result );
2124  break;
2125  #endif
2126  #ifdef POLARSSL_MD5_C
2127  case SIG_RSA_MD5:
2128  md5( message_str, msg_len, hash_result );
2129  break;
2130  #endif
2131  #ifdef POLARSSL_SHA1_C
2132  case SIG_RSA_SHA1:
2133  sha1( message_str, msg_len, hash_result );
2134  break;
2135  #endif
2136  #ifdef POLARSSL_SHA2_C
2137  case SIG_RSA_SHA224:
2138  sha2( message_str, msg_len, hash_result, 1 );
2139  break;
2140  case SIG_RSA_SHA256:
2141  sha2( message_str, msg_len, hash_result, 0 );
2142  break;
2143  #endif
2144  #ifdef POLARSSL_SHA4_C
2145  case SIG_RSA_SHA384:
2146  sha4( message_str, msg_len, hash_result, 1 );
2147  break;
2148  case SIG_RSA_SHA512:
2149  sha4( message_str, msg_len, hash_result, 0 );
2150  break;
2151  #endif
2152  }
2153 
2154  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA1, 0, hash_result, result_str ) == 0 );
2155 
2156  rsa_free( &ctx );
2157  }
2158  FCT_TEST_END();
2159 #endif /* POLARSSL_SHA1_C */
2160 
2161 #ifdef POLARSSL_SHA2_C
2162 
2163  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_28)
2164  {
2165  unsigned char message_str[1000];
2166  unsigned char hash_result[1000];
2167  unsigned char result_str[1000];
2168  rsa_context ctx;
2169  int msg_len;
2170 
2171  rsa_init( &ctx, RSA_PKCS_V15, 0 );
2172  memset( message_str, 0x00, 1000 );
2173  memset( hash_result, 0x00, 1000 );
2174  memset( result_str, 0x00, 1000 );
2175 
2176  ctx.len = 1536 / 8;
2177  fct_chk( mpi_read_string( &ctx.N, 16, "a59d9b7269b102b7be684ec5e28db79992e6d3231e77c90b78960c2638b35ef6dbdac1ac59e7249d96d426e7f99397eabc6b8903fe1942da580322b98bafacd81bb911c29666f83886a2a2864f3552044300e60cedd5a8c321c43e280413dc41673c39a11b98a885486f8187a70f270185c4c12bc48a1968305269776c070ef69d4913589a887c4d0f5e7dd58bd806d0d49a14a1762c38665cef4646ff13a0cd29c3a60460703c3d051d5b28c660bffb5f8bd43d495ffa64175f72b8abe5fddd" ) == 0 );
2178  fct_chk( mpi_read_string( &ctx.E, 16, "11" ) == 0 );
2179 
2180  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
2181 
2182  msg_len = unhexify( message_str, "3bba64de38438a71b95ab9c94539d5870c1fb08d7a9937600c00e9d063438edc97e625d0cd4b1eb00c31c9d94c7a0fe6d03160d1b6cbec5acdad16ada6ef253fee603df9faca8f98a477cc5456f3dfbf6414dbf19f3832e227ce291780188881e82e96a2e84744f12a34a9808a2daedc6fd00b345c6772bec26a095719451e6a" );
2183  unhexify( result_str, "8c846e75e32ce5f9964bdd8f6dcf1d2996a646b233bcf1bd6394e13e856691b89bedd18290a0f9f7c90dca307271b3108e795340490513b25e6789e93722c65ec064b4c43457295a31d1f07dd605e133fd6eaafc58cda132df2939f5f693e0205af34550afaa137f3e482885e50dfb48333a15c0821e7a19642acdddc6fea3c7487c691246a2b083dac439889d5ae741b7e08c47937530b4b069f1a260cd07fe4a0ddd530ab11534fb805e9b562118ee0e97932966008aadfc83f3b8a10de8ee" );
2184 
2185  switch( SIG_RSA_SHA224 )
2186  {
2187  #ifdef POLARSSL_MD2_C
2188  case SIG_RSA_MD2:
2189  md2( message_str, msg_len, hash_result );
2190  break;
2191  #endif
2192  #ifdef POLARSSL_MD4_C
2193  case SIG_RSA_MD4:
2194  md4( message_str, msg_len, hash_result );
2195  break;
2196  #endif
2197  #ifdef POLARSSL_MD5_C
2198  case SIG_RSA_MD5:
2199  md5( message_str, msg_len, hash_result );
2200  break;
2201  #endif
2202  #ifdef POLARSSL_SHA1_C
2203  case SIG_RSA_SHA1:
2204  sha1( message_str, msg_len, hash_result );
2205  break;
2206  #endif
2207  #ifdef POLARSSL_SHA2_C
2208  case SIG_RSA_SHA224:
2209  sha2( message_str, msg_len, hash_result, 1 );
2210  break;
2211  case SIG_RSA_SHA256:
2212  sha2( message_str, msg_len, hash_result, 0 );
2213  break;
2214  #endif
2215  #ifdef POLARSSL_SHA4_C
2216  case SIG_RSA_SHA384:
2217  sha4( message_str, msg_len, hash_result, 1 );
2218  break;
2219  case SIG_RSA_SHA512:
2220  sha4( message_str, msg_len, hash_result, 0 );
2221  break;
2222  #endif
2223  }
2224 
2225  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA224, 0, hash_result, result_str ) == 0 );
2226 
2227  rsa_free( &ctx );
2228  }
2229  FCT_TEST_END();
2230 #endif /* POLARSSL_SHA2_C */
2231 
2232 #ifdef POLARSSL_SHA2_C
2233 
2234  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_29)
2235  {
2236  unsigned char message_str[1000];
2237  unsigned char hash_result[1000];
2238  unsigned char result_str[1000];
2239  rsa_context ctx;
2240  int msg_len;
2241 
2242  rsa_init( &ctx, RSA_PKCS_V15, 0 );
2243  memset( message_str, 0x00, 1000 );
2244  memset( hash_result, 0x00, 1000 );
2245  memset( result_str, 0x00, 1000 );
2246 
2247  ctx.len = 1536 / 8;
2248  fct_chk( mpi_read_string( &ctx.N, 16, "a59d9b7269b102b7be684ec5e28db79992e6d3231e77c90b78960c2638b35ef6dbdac1ac59e7249d96d426e7f99397eabc6b8903fe1942da580322b98bafacd81bb911c29666f83886a2a2864f3552044300e60cedd5a8c321c43e280413dc41673c39a11b98a885486f8187a70f270185c4c12bc48a1968305269776c070ef69d4913589a887c4d0f5e7dd58bd806d0d49a14a1762c38665cef4646ff13a0cd29c3a60460703c3d051d5b28c660bffb5f8bd43d495ffa64175f72b8abe5fddd" ) == 0 );
2249  fct_chk( mpi_read_string( &ctx.E, 16, "11" ) == 0 );
2250 
2251  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
2252 
2253  msg_len = unhexify( message_str, "f7857ce04bf4292ea1755f9e587822372f4dcdf10bddfc0ff498a8af60ae94a0b482e873085c1cd52a5d181ce6b99a1f8520d74b947d65f3e7e358e8ddc4ac4ae465e39d408eee1f09865159733f83f553cd93cfde1c114fb3e32cf51cd418359016b3867df467b645d752808671a4609f3c49a67023c9ca617e6cffa544a10a" );
2254  unhexify( result_str, "9677300bbee003be3c445634f8ed5beb152b63f46f84cf5a8e721e0fafe8f3f7e99a6d50741f23f449d3026da3e8a7ac36be99ab44831803486ae552f7aa01f075287829b231d2d0840908e09081ae177ed888fe46a9d937a0871eb5d52ec541c8411c4cbf7efea6ca213b12cea513b0739eedca7c9473e10a7796936f4eaa0c5d3a9013ca5536781ac68eb2ca5779144de23da2e9875114aca885b3219dfc292d73940c5992ea3c4882889e7543430652860e441a01a45d9f4005a012421493" );
2255 
2256  switch( SIG_RSA_SHA256 )
2257  {
2258  #ifdef POLARSSL_MD2_C
2259  case SIG_RSA_MD2:
2260  md2( message_str, msg_len, hash_result );
2261  break;
2262  #endif
2263  #ifdef POLARSSL_MD4_C
2264  case SIG_RSA_MD4:
2265  md4( message_str, msg_len, hash_result );
2266  break;
2267  #endif
2268  #ifdef POLARSSL_MD5_C
2269  case SIG_RSA_MD5:
2270  md5( message_str, msg_len, hash_result );
2271  break;
2272  #endif
2273  #ifdef POLARSSL_SHA1_C
2274  case SIG_RSA_SHA1:
2275  sha1( message_str, msg_len, hash_result );
2276  break;
2277  #endif
2278  #ifdef POLARSSL_SHA2_C
2279  case SIG_RSA_SHA224:
2280  sha2( message_str, msg_len, hash_result, 1 );
2281  break;
2282  case SIG_RSA_SHA256:
2283  sha2( message_str, msg_len, hash_result, 0 );
2284  break;
2285  #endif
2286  #ifdef POLARSSL_SHA4_C
2287  case SIG_RSA_SHA384:
2288  sha4( message_str, msg_len, hash_result, 1 );
2289  break;
2290  case SIG_RSA_SHA512:
2291  sha4( message_str, msg_len, hash_result, 0 );
2292  break;
2293  #endif
2294  }
2295 
2296  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA256, 0, hash_result, result_str ) == 0 );
2297 
2298  rsa_free( &ctx );
2299  }
2300  FCT_TEST_END();
2301 #endif /* POLARSSL_SHA2_C */
2302 
2303 #ifdef POLARSSL_SHA2_C
2304 
2305  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_30)
2306  {
2307  unsigned char message_str[1000];
2308  unsigned char hash_result[1000];
2309  unsigned char result_str[1000];
2310  rsa_context ctx;
2311  int msg_len;
2312 
2313  rsa_init( &ctx, RSA_PKCS_V15, 0 );
2314  memset( message_str, 0x00, 1000 );
2315  memset( hash_result, 0x00, 1000 );
2316  memset( result_str, 0x00, 1000 );
2317 
2318  ctx.len = 1536 / 8;
2319  fct_chk( mpi_read_string( &ctx.N, 16, "a59d9b7269b102b7be684ec5e28db79992e6d3231e77c90b78960c2638b35ef6dbdac1ac59e7249d96d426e7f99397eabc6b8903fe1942da580322b98bafacd81bb911c29666f83886a2a2864f3552044300e60cedd5a8c321c43e280413dc41673c39a11b98a885486f8187a70f270185c4c12bc48a1968305269776c070ef69d4913589a887c4d0f5e7dd58bd806d0d49a14a1762c38665cef4646ff13a0cd29c3a60460703c3d051d5b28c660bffb5f8bd43d495ffa64175f72b8abe5fddd" ) == 0 );
2320  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
2321 
2322  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
2323 
2324  msg_len = unhexify( message_str, "ca312774f2756ac2019f213a01a63c9a0b4a49ccafecf25e97a4c632668e3c77e664f4d7635241f25205e50c37061b02c546db8346fa597c3da8cfd44a827c5a4ff4ecfcd1797b39a1b215d9bbb93fdb6eb35bafbda427a5068888a6e19f86224b0897490491207e35ce39085668b10b4fb851b7dd9465c03869790ef38a61b5" );
2325  unhexify( result_str, "a202c33eb831b9d8e818b6c3bcdb42818e1d9c22a06ddd73a17a21e49d18cda44df349a066477cae068e1a5d2b518b0885e889ef796ca9e6f42a69ac755b8a6405fbaef93fe0130d98de35d689addfee3eecd26658903f774bda481c3f40ee0e9569a3c3e2da7ad576c7de82159d933e36fa29cfef99367005e34ab5082d80f48276d37dabc88dbb023bd01585329d2ccf417f78ec508aaa29751007d31f1669296b981d44c8fa99130c5df7a071725b496859314aaf9baf0ebc780355914249" );
2326 
2327  switch( SIG_RSA_SHA256 )
2328  {
2329  #ifdef POLARSSL_MD2_C
2330  case SIG_RSA_MD2:
2331  md2( message_str, msg_len, hash_result );
2332  break;
2333  #endif
2334  #ifdef POLARSSL_MD4_C
2335  case SIG_RSA_MD4:
2336  md4( message_str, msg_len, hash_result );
2337  break;
2338  #endif
2339  #ifdef POLARSSL_MD5_C
2340  case SIG_RSA_MD5:
2341  md5( message_str, msg_len, hash_result );
2342  break;
2343  #endif
2344  #ifdef POLARSSL_SHA1_C
2345  case SIG_RSA_SHA1:
2346  sha1( message_str, msg_len, hash_result );
2347  break;
2348  #endif
2349  #ifdef POLARSSL_SHA2_C
2350  case SIG_RSA_SHA224:
2351  sha2( message_str, msg_len, hash_result, 1 );
2352  break;
2353  case SIG_RSA_SHA256:
2354  sha2( message_str, msg_len, hash_result, 0 );
2355  break;
2356  #endif
2357  #ifdef POLARSSL_SHA4_C
2358  case SIG_RSA_SHA384:
2359  sha4( message_str, msg_len, hash_result, 1 );
2360  break;
2361  case SIG_RSA_SHA512:
2362  sha4( message_str, msg_len, hash_result, 0 );
2363  break;
2364  #endif
2365  }
2366 
2367  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA256, 0, hash_result, result_str ) == POLARSSL_ERR_RSA_INVALID_PADDING );
2368 
2369  rsa_free( &ctx );
2370  }
2371  FCT_TEST_END();
2372 #endif /* POLARSSL_SHA2_C */
2373 
2374 #ifdef POLARSSL_SHA4_C
2375 
2376  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_31)
2377  {
2378  unsigned char message_str[1000];
2379  unsigned char hash_result[1000];
2380  unsigned char result_str[1000];
2381  rsa_context ctx;
2382  int msg_len;
2383 
2384  rsa_init( &ctx, RSA_PKCS_V15, 0 );
2385  memset( message_str, 0x00, 1000 );
2386  memset( hash_result, 0x00, 1000 );
2387  memset( result_str, 0x00, 1000 );
2388 
2389  ctx.len = 1536 / 8;
2390  fct_chk( mpi_read_string( &ctx.N, 16, "a59d9b7269b102b7be684ec5e28db79992e6d3231e77c90b78960c2638b35ef6dbdac1ac59e7249d96d426e7f99397eabc6b8903fe1942da580322b98bafacd81bb911c29666f83886a2a2864f3552044300e60cedd5a8c321c43e280413dc41673c39a11b98a885486f8187a70f270185c4c12bc48a1968305269776c070ef69d4913589a887c4d0f5e7dd58bd806d0d49a14a1762c38665cef4646ff13a0cd29c3a60460703c3d051d5b28c660bffb5f8bd43d495ffa64175f72b8abe5fddd" ) == 0 );
2391  fct_chk( mpi_read_string( &ctx.E, 16, "10001" ) == 0 );
2392 
2393  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
2394 
2395  msg_len = unhexify( message_str, "2abe079077290ceb6c80ac5c61062ce8da814b1fb99a1a9fb2860ed900e6541856ec64bf19c0d9d1cc2280b7cc50af3e3d2ad8e044945d44761ca60891dd72bd6aa26a33274ffcf7ae7d661b5e651135fcff21aaf06b4a2db18fe5827e0243884f2841760b9f1c65fbda870f7f0cfbd6ff484f0825e688614928f2d12d1e7080" );
2396  unhexify( result_str, "402631f3cddfb02cc4d9cb58ef1ab6726bd787a50e12e98567c9702bfdf47af85904aec5a2f6c5df9a10f08f90f93728eb090ae2ac21ded9f38faecd8195f3eb3d4107521b1cee956e7a214245b038adae912fa35ec97cb3bdc41352e8aaff80173561284cb740f999a3cd6653a6c3d5a3f911a416f41e2155083982c99eb5998a0a74d77f1ae999d901ee24a7f2c424179a3f92b07dc0b3498c1884e60677bee0175e810b426c4ad008d2743cd19b00b33177bf8be3fed7f7406e1bce0c2ea3" );
2397 
2398  switch( SIG_RSA_SHA384 )
2399  {
2400  #ifdef POLARSSL_MD2_C
2401  case SIG_RSA_MD2:
2402  md2( message_str, msg_len, hash_result );
2403  break;
2404  #endif
2405  #ifdef POLARSSL_MD4_C
2406  case SIG_RSA_MD4:
2407  md4( message_str, msg_len, hash_result );
2408  break;
2409  #endif
2410  #ifdef POLARSSL_MD5_C
2411  case SIG_RSA_MD5:
2412  md5( message_str, msg_len, hash_result );
2413  break;
2414  #endif
2415  #ifdef POLARSSL_SHA1_C
2416  case SIG_RSA_SHA1:
2417  sha1( message_str, msg_len, hash_result );
2418  break;
2419  #endif
2420  #ifdef POLARSSL_SHA2_C
2421  case SIG_RSA_SHA224:
2422  sha2( message_str, msg_len, hash_result, 1 );
2423  break;
2424  case SIG_RSA_SHA256:
2425  sha2( message_str, msg_len, hash_result, 0 );
2426  break;
2427  #endif
2428  #ifdef POLARSSL_SHA4_C
2429  case SIG_RSA_SHA384:
2430  sha4( message_str, msg_len, hash_result, 1 );
2431  break;
2432  case SIG_RSA_SHA512:
2433  sha4( message_str, msg_len, hash_result, 0 );
2434  break;
2435  #endif
2436  }
2437 
2438  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA384, 0, hash_result, result_str ) == POLARSSL_ERR_RSA_INVALID_PADDING );
2439 
2440  rsa_free( &ctx );
2441  }
2442  FCT_TEST_END();
2443 #endif /* POLARSSL_SHA4_C */
2444 
2445 #ifdef POLARSSL_SHA4_C
2446 
2447  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_32)
2448  {
2449  unsigned char message_str[1000];
2450  unsigned char hash_result[1000];
2451  unsigned char result_str[1000];
2452  rsa_context ctx;
2453  int msg_len;
2454 
2455  rsa_init( &ctx, RSA_PKCS_V15, 0 );
2456  memset( message_str, 0x00, 1000 );
2457  memset( hash_result, 0x00, 1000 );
2458  memset( result_str, 0x00, 1000 );
2459 
2460  ctx.len = 1536 / 8;
2461  fct_chk( mpi_read_string( &ctx.N, 16, "a59d9b7269b102b7be684ec5e28db79992e6d3231e77c90b78960c2638b35ef6dbdac1ac59e7249d96d426e7f99397eabc6b8903fe1942da580322b98bafacd81bb911c29666f83886a2a2864f3552044300e60cedd5a8c321c43e280413dc41673c39a11b98a885486f8187a70f270185c4c12bc48a1968305269776c070ef69d4913589a887c4d0f5e7dd58bd806d0d49a14a1762c38665cef4646ff13a0cd29c3a60460703c3d051d5b28c660bffb5f8bd43d495ffa64175f72b8abe5fddd" ) == 0 );
2462  fct_chk( mpi_read_string( &ctx.E, 16, "11" ) == 0 );
2463 
2464  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
2465 
2466  msg_len = unhexify( message_str, "da9505809dc92cfd8e01a1857dde52df6677c40d98f4577c1659ca7d3e9f01f9a809065f51b54fe2f9723fe2c9d1eea7397f2d5531d1c51c6ea100b028596bf9f24dd90be14eab58f07b4f24a35b073aeb29ecde4a6f320237d7adbdc43d94f87e08866b95bbcac83dc7db3553a42400441f088e2bf6259539a2da8b5a74065f" );
2467  unhexify( result_str, "57edd0560df9840a25c28ff6d254e432395a5cd2d92248b3b44d7eab0fc65b3c4e545a916a8e90ce89745119db9ec9799aa8890f5250fb589cfc12dac1b6e406a39bc3b3663892da5354ba453cbd5e4c89bdce82d0ffe97052a03a5c3308819c1139ebc780c13cf6dc1477faf734abcb1db3fafaed6f22885c9c0222ff5deacb8cc6d027f2e959c3075011b382e88c4b27b83b4f2e6fda022e331c3602d19f5ac7bccfe95ea1e93d736dbd918ae5b1f468cd0b5b536a2f918d5e27a0757e75b7" );
2468 
2469  switch( SIG_RSA_SHA384 )
2470  {
2471  #ifdef POLARSSL_MD2_C
2472  case SIG_RSA_MD2:
2473  md2( message_str, msg_len, hash_result );
2474  break;
2475  #endif
2476  #ifdef POLARSSL_MD4_C
2477  case SIG_RSA_MD4:
2478  md4( message_str, msg_len, hash_result );
2479  break;
2480  #endif
2481  #ifdef POLARSSL_MD5_C
2482  case SIG_RSA_MD5:
2483  md5( message_str, msg_len, hash_result );
2484  break;
2485  #endif
2486  #ifdef POLARSSL_SHA1_C
2487  case SIG_RSA_SHA1:
2488  sha1( message_str, msg_len, hash_result );
2489  break;
2490  #endif
2491  #ifdef POLARSSL_SHA2_C
2492  case SIG_RSA_SHA224:
2493  sha2( message_str, msg_len, hash_result, 1 );
2494  break;
2495  case SIG_RSA_SHA256:
2496  sha2( message_str, msg_len, hash_result, 0 );
2497  break;
2498  #endif
2499  #ifdef POLARSSL_SHA4_C
2500  case SIG_RSA_SHA384:
2501  sha4( message_str, msg_len, hash_result, 1 );
2502  break;
2503  case SIG_RSA_SHA512:
2504  sha4( message_str, msg_len, hash_result, 0 );
2505  break;
2506  #endif
2507  }
2508 
2509  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA384, 0, hash_result, result_str ) == 0 );
2510 
2511  rsa_free( &ctx );
2512  }
2513  FCT_TEST_END();
2514 #endif /* POLARSSL_SHA4_C */
2515 
2516 #ifdef POLARSSL_SHA4_C
2517 
2518  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_33)
2519  {
2520  unsigned char message_str[1000];
2521  unsigned char hash_result[1000];
2522  unsigned char result_str[1000];
2523  rsa_context ctx;
2524  int msg_len;
2525 
2526  rsa_init( &ctx, RSA_PKCS_V15, 0 );
2527  memset( message_str, 0x00, 1000 );
2528  memset( hash_result, 0x00, 1000 );
2529  memset( result_str, 0x00, 1000 );
2530 
2531  ctx.len = 1536 / 8;
2532  fct_chk( mpi_read_string( &ctx.N, 16, "a59d9b7269b102b7be684ec5e28db79992e6d3231e77c90b78960c2638b35ef6dbdac1ac59e7249d96d426e7f99397eabc6b8903fe1942da580322b98bafacd81bb911c29666f83886a2a2864f3552044300e60cedd5a8c321c43e280413dc41673c39a11b98a885486f8187a70f270185c4c12bc48a1968305269776c070ef69d4913589a887c4d0f5e7dd58bd806d0d49a14a1762c38665cef4646ff13a0cd29c3a60460703c3d051d5b28c660bffb5f8bd43d495ffa64175f72b8abe5fddd" ) == 0 );
2533  fct_chk( mpi_read_string( &ctx.E, 16, "11" ) == 0 );
2534 
2535  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
2536 
2537  msg_len = unhexify( message_str, "d0cd038c65b3acca45822eaf91ea5176e82043268876dec0b62e2abd619023b7023abc67c6b823cfef5447b8772f985ff7910d6cc87e6c23688ac6de1fee40bbe2da1a92770de92adaa427ace02fee571a0a0176fceb0c8f3eb72dde839ab201395625f5c0db8641ce19d7711212dec61733262c6ce4476c025e67a3d5bc01f3" );
2538  unhexify( result_str, "2f30629c1117d013bb36e6099dee931dcaf0a1032b07ec23e2b262898a8945e569c9573d81e22bb0a5f8a28b0d7b8ff01367dd7f089c68ed1daa11cf53a96ee91b38e6b839b6e90bea34d14b78f5d2c7629b68c5b4f2ecfff66b483b2233cb14f95df533c867a2b610aebcdbb7ea3109aaf2f5762ab3edc2571deccc7da0c9a5b443ca2b924c0f18de7bbb736a08fed3916795018a436a3ae62c85d554a53a6d48623908e06e7d275f4251d3b3bd530bd11e155dcf2b5c2adf030cdf931ae749" );
2539 
2540  switch( SIG_RSA_SHA512 )
2541  {
2542  #ifdef POLARSSL_MD2_C
2543  case SIG_RSA_MD2:
2544  md2( message_str, msg_len, hash_result );
2545  break;
2546  #endif
2547  #ifdef POLARSSL_MD4_C
2548  case SIG_RSA_MD4:
2549  md4( message_str, msg_len, hash_result );
2550  break;
2551  #endif
2552  #ifdef POLARSSL_MD5_C
2553  case SIG_RSA_MD5:
2554  md5( message_str, msg_len, hash_result );
2555  break;
2556  #endif
2557  #ifdef POLARSSL_SHA1_C
2558  case SIG_RSA_SHA1:
2559  sha1( message_str, msg_len, hash_result );
2560  break;
2561  #endif
2562  #ifdef POLARSSL_SHA2_C
2563  case SIG_RSA_SHA224:
2564  sha2( message_str, msg_len, hash_result, 1 );
2565  break;
2566  case SIG_RSA_SHA256:
2567  sha2( message_str, msg_len, hash_result, 0 );
2568  break;
2569  #endif
2570  #ifdef POLARSSL_SHA4_C
2571  case SIG_RSA_SHA384:
2572  sha4( message_str, msg_len, hash_result, 1 );
2573  break;
2574  case SIG_RSA_SHA512:
2575  sha4( message_str, msg_len, hash_result, 0 );
2576  break;
2577  #endif
2578  }
2579 
2580  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA512, 0, hash_result, result_str ) == POLARSSL_ERR_RSA_INVALID_PADDING );
2581 
2582  rsa_free( &ctx );
2583  }
2584  FCT_TEST_END();
2585 #endif /* POLARSSL_SHA4_C */
2586 
2587 #ifdef POLARSSL_SHA4_C
2588 
2589  FCT_TEST_BGN(rsa_pkcs1_verify_v15_cavs_34)
2590  {
2591  unsigned char message_str[1000];
2592  unsigned char hash_result[1000];
2593  unsigned char result_str[1000];
2594  rsa_context ctx;
2595  int msg_len;
2596 
2597  rsa_init( &ctx, RSA_PKCS_V15, 0 );
2598  memset( message_str, 0x00, 1000 );
2599  memset( hash_result, 0x00, 1000 );
2600  memset( result_str, 0x00, 1000 );
2601 
2602  ctx.len = 1536 / 8;
2603  fct_chk( mpi_read_string( &ctx.N, 16, "a59d9b7269b102b7be684ec5e28db79992e6d3231e77c90b78960c2638b35ef6dbdac1ac59e7249d96d426e7f99397eabc6b8903fe1942da580322b98bafacd81bb911c29666f83886a2a2864f3552044300e60cedd5a8c321c43e280413dc41673c39a11b98a885486f8187a70f270185c4c12bc48a1968305269776c070ef69d4913589a887c4d0f5e7dd58bd806d0d49a14a1762c38665cef4646ff13a0cd29c3a60460703c3d051d5b28c660bffb5f8bd43d495ffa64175f72b8abe5fddd" ) == 0 );
2604  fct_chk( mpi_read_string( &ctx.E, 16, "11" ) == 0 );
2605 
2606  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
2607 
2608  msg_len = unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
2609  unhexify( result_str, "0b4d96f411c727a262d6d0ade34195b78603551061917d060f89add47b09dfe8715f4f9147d327dc25e91fe457e5d1a2f22cd8fe6fe8e29d2060658307c87a40640650fef3d4b289a6c3febc5a100b29a8b56623afb29fd3c13ea372bf3c638c1db25f8bd8c74c821beec7b5affcace1d05d056a6c2d3035926c7a268df4751a54bc20a6b8cfd729a7cba309ae817daccbef9950a482cf23950a8ca1d3a13ddb7d8d0f87ad5587d4d9ebe19fe93457597a7bdd056c2fd4cea7d31e4a0e595a7b" );
2610 
2611  switch( SIG_RSA_SHA512 )
2612  {
2613  #ifdef POLARSSL_MD2_C
2614  case SIG_RSA_MD2:
2615  md2( message_str, msg_len, hash_result );
2616  break;
2617  #endif
2618  #ifdef POLARSSL_MD4_C
2619  case SIG_RSA_MD4:
2620  md4( message_str, msg_len, hash_result );
2621  break;
2622  #endif
2623  #ifdef POLARSSL_MD5_C
2624  case SIG_RSA_MD5:
2625  md5( message_str, msg_len, hash_result );
2626  break;
2627  #endif
2628  #ifdef POLARSSL_SHA1_C
2629  case SIG_RSA_SHA1:
2630  sha1( message_str, msg_len, hash_result );
2631  break;
2632  #endif
2633  #ifdef POLARSSL_SHA2_C
2634  case SIG_RSA_SHA224:
2635  sha2( message_str, msg_len, hash_result, 1 );
2636  break;
2637  case SIG_RSA_SHA256:
2638  sha2( message_str, msg_len, hash_result, 0 );
2639  break;
2640  #endif
2641  #ifdef POLARSSL_SHA4_C
2642  case SIG_RSA_SHA384:
2643  sha4( message_str, msg_len, hash_result, 1 );
2644  break;
2645  case SIG_RSA_SHA512:
2646  sha4( message_str, msg_len, hash_result, 0 );
2647  break;
2648  #endif
2649  }
2650 
2651  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA512, 0, hash_result, result_str ) == 0 );
2652 
2653  rsa_free( &ctx );
2654  }
2655  FCT_TEST_END();
2656 #endif /* POLARSSL_SHA4_C */
2657 
2658 #ifdef POLARSSL_SHA4_C
2659 
2660  FCT_TEST_BGN(rsa_pkcs1_sign_1_sha512_1536_bits_rsa)
2661  {
2662  unsigned char message_str[1000];
2663  unsigned char hash_result[1000];
2664  unsigned char output[1000];
2665  unsigned char output_str[1000];
2666  rsa_context ctx;
2667  mpi P1, Q1, H, G;
2668  int msg_len;
2669 
2670  mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
2671  rsa_init( &ctx, RSA_PKCS_V15, 0 );
2672 
2673  memset( message_str, 0x00, 1000 );
2674  memset( hash_result, 0x00, 1000 );
2675  memset( output, 0x00, 1000 );
2676  memset( output_str, 0x00, 1000 );
2677 
2678  ctx.len = 1536 / 8;
2679  fct_chk( mpi_read_string( &ctx.P, 16, "c8c67df894c882045ede26a9008ab09ea0672077d7bc71d412511cd93981ddde8f91b967da404056c39f105f7f239abdaff92923859920f6299e82b95bd5b8c959948f4a035cbd693ad83014294d349813d1ad57911a6355d0731fe3a034e9db" ) == 0 );
2680  fct_chk( mpi_read_string( &ctx.Q, 16, "f15147d0e7c04a1e3f37adde802cdc610999bf7ab0088434aaeda0c0ab3910b14d2ce56cb66bffd97552195fae8b061077e03920814d8b9cfb5a3958b3a82c2a7fc97e55db5978b47a922156eb8a3e55c06a54a45d1670abdfb995489c4d0051" ) == 0 );
2681  fct_chk( mpi_read_string( &ctx.N, 16, "bd429bb7c3b00bbea19ba664c0f8172d1a73c3cfa05e2ed656d570c1590918bb7e372ed25e2cd71395ba0a9b1a30f3ee012ffb0546cab8e3581fe3e23f44ab57a8aee9717e71a936a580fa8572d450fb00339a6f6704b717df0c149a465bab768c61500cd93b61113ff3e4389167f7b2c8e3c0da2d4765286bee555b0bcb4998f59b14fad03180a17c8b4f69bcd1234f4ae85950137665ac2ba80b55cc9b1aafb454b83771aa755acd2a00e93ddb65e696dbed8bdca69fb5e0c5c2097b9cfe4b" ) == 0 );
2682  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
2683 
2684  fct_chk( mpi_sub_int( &P1, &ctx.P, 1 ) == 0 );
2685  fct_chk( mpi_sub_int( &Q1, &ctx.Q, 1 ) == 0 );
2686  fct_chk( mpi_mul_mpi( &H, &P1, &Q1 ) == 0 );
2687  fct_chk( mpi_gcd( &G, &ctx.E, &H ) == 0 );
2688  fct_chk( mpi_inv_mod( &ctx.D , &ctx.E, &H ) == 0 );
2689  fct_chk( mpi_mod_mpi( &ctx.DP, &ctx.D, &P1 ) == 0 );
2690  fct_chk( mpi_mod_mpi( &ctx.DQ, &ctx.D, &Q1 ) == 0 );
2691  fct_chk( mpi_inv_mod( &ctx.QP, &ctx.Q, &ctx.P ) == 0 );
2692 
2693  fct_chk( rsa_check_privkey( &ctx ) == 0 );
2694 
2695  msg_len = unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
2696 
2697  switch( SIG_RSA_SHA512 )
2698  {
2699  #ifdef POLARSSL_MD2_C
2700  case SIG_RSA_MD2:
2701  md2( message_str, msg_len, hash_result );
2702  break;
2703  #endif
2704  #ifdef POLARSSL_MD4_C
2705  case SIG_RSA_MD4:
2706  md4( message_str, msg_len, hash_result );
2707  break;
2708  #endif
2709  #ifdef POLARSSL_MD5_C
2710  case SIG_RSA_MD5:
2711  md5( message_str, msg_len, hash_result );
2712  break;
2713  #endif
2714  #ifdef POLARSSL_SHA1_C
2715  case SIG_RSA_SHA1:
2716  sha1( message_str, msg_len, hash_result );
2717  break;
2718  #endif
2719  #ifdef POLARSSL_SHA2_C
2720  case SIG_RSA_SHA224:
2721  sha2( message_str, msg_len, hash_result, 1 );
2722  break;
2723  case SIG_RSA_SHA256:
2724  sha2( message_str, msg_len, hash_result, 0 );
2725  break;
2726  #endif
2727  #ifdef POLARSSL_SHA4_C
2728  case SIG_RSA_SHA384:
2729  sha4( message_str, msg_len, hash_result, 1 );
2730  break;
2731  case SIG_RSA_SHA512:
2732  sha4( message_str, msg_len, hash_result, 0 );
2733  break;
2734  #endif
2735  }
2736 
2737  fct_chk( rsa_pkcs1_sign( &ctx, NULL, NULL, RSA_PRIVATE, SIG_RSA_SHA512, 0, hash_result, output ) == 0 );
2738  if( 0 == 0 )
2739  {
2740  hexify( output_str, output, ctx.len );
2741 
2742  fct_chk( strcasecmp( (char *) output_str, "93b6fa99485c116ca6efdd4202ea1cf49f4c6345fae692584413743ce5b65510e8e4690aee9a19ea1ff10d57f22aa3548d839f28a8525a34354e9e58e0f3947e056ce2554e21bf287e220b98db3b551258cd42b495e5d1a3bbc83c9d1a02f2a300ef6d866ea75108e44ebb3e16b47df2f6de28feb2be3874dbbf21599451082d86e9f2f462575a8185c69aa1f1fcb6a363c5d71aeba2103449eaf3845285291148d5f78d1646b8dc95cbcc4082f987d948b0e7d4e80b60595f8a7517584e1643" ) == 0 );
2743  }
2744 
2745  mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
2746  rsa_free( &ctx );
2747  }
2748  FCT_TEST_END();
2749 #endif /* POLARSSL_SHA4_C */
2750 
2751 #ifdef POLARSSL_SHA4_C
2752 
2753  FCT_TEST_BGN(rsa_pkcs1_sign_1_verify)
2754  {
2755  unsigned char message_str[1000];
2756  unsigned char hash_result[1000];
2757  unsigned char result_str[1000];
2758  rsa_context ctx;
2759  int msg_len;
2760 
2761  rsa_init( &ctx, RSA_PKCS_V15, 0 );
2762  memset( message_str, 0x00, 1000 );
2763  memset( hash_result, 0x00, 1000 );
2764  memset( result_str, 0x00, 1000 );
2765 
2766  ctx.len = 1536 / 8;
2767  fct_chk( mpi_read_string( &ctx.N, 16, "bd429bb7c3b00bbea19ba664c0f8172d1a73c3cfa05e2ed656d570c1590918bb7e372ed25e2cd71395ba0a9b1a30f3ee012ffb0546cab8e3581fe3e23f44ab57a8aee9717e71a936a580fa8572d450fb00339a6f6704b717df0c149a465bab768c61500cd93b61113ff3e4389167f7b2c8e3c0da2d4765286bee555b0bcb4998f59b14fad03180a17c8b4f69bcd1234f4ae85950137665ac2ba80b55cc9b1aafb454b83771aa755acd2a00e93ddb65e696dbed8bdca69fb5e0c5c2097b9cfe4b" ) == 0 );
2768  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
2769 
2770  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
2771 
2772  msg_len = unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
2773  unhexify( result_str, "93b6fa99485c116ca6efdd4202ea1cf49f4c6345fae692584413743ce5b65510e8e4690aee9a19ea1ff10d57f22aa3548d839f28a8525a34354e9e58e0f3947e056ce2554e21bf287e220b98db3b551258cd42b495e5d1a3bbc83c9d1a02f2a300ef6d866ea75108e44ebb3e16b47df2f6de28feb2be3874dbbf21599451082d86e9f2f462575a8185c69aa1f1fcb6a363c5d71aeba2103449eaf3845285291148d5f78d1646b8dc95cbcc4082f987d948b0e7d4e80b60595f8a7517584e1643" );
2774 
2775  switch( SIG_RSA_SHA512 )
2776  {
2777  #ifdef POLARSSL_MD2_C
2778  case SIG_RSA_MD2:
2779  md2( message_str, msg_len, hash_result );
2780  break;
2781  #endif
2782  #ifdef POLARSSL_MD4_C
2783  case SIG_RSA_MD4:
2784  md4( message_str, msg_len, hash_result );
2785  break;
2786  #endif
2787  #ifdef POLARSSL_MD5_C
2788  case SIG_RSA_MD5:
2789  md5( message_str, msg_len, hash_result );
2790  break;
2791  #endif
2792  #ifdef POLARSSL_SHA1_C
2793  case SIG_RSA_SHA1:
2794  sha1( message_str, msg_len, hash_result );
2795  break;
2796  #endif
2797  #ifdef POLARSSL_SHA2_C
2798  case SIG_RSA_SHA224:
2799  sha2( message_str, msg_len, hash_result, 1 );
2800  break;
2801  case SIG_RSA_SHA256:
2802  sha2( message_str, msg_len, hash_result, 0 );
2803  break;
2804  #endif
2805  #ifdef POLARSSL_SHA4_C
2806  case SIG_RSA_SHA384:
2807  sha4( message_str, msg_len, hash_result, 1 );
2808  break;
2809  case SIG_RSA_SHA512:
2810  sha4( message_str, msg_len, hash_result, 0 );
2811  break;
2812  #endif
2813  }
2814 
2815  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA512, 0, hash_result, result_str ) == 0 );
2816 
2817  rsa_free( &ctx );
2818  }
2819  FCT_TEST_END();
2820 #endif /* POLARSSL_SHA4_C */
2821 
2822 #ifdef POLARSSL_SHA2_C
2823 
2824  FCT_TEST_BGN(rsa_pkcs1_sign_2_sha256_2048_bits_rsa)
2825  {
2826  unsigned char message_str[1000];
2827  unsigned char hash_result[1000];
2828  unsigned char output[1000];
2829  unsigned char output_str[1000];
2830  rsa_context ctx;
2831  mpi P1, Q1, H, G;
2832  int msg_len;
2833 
2834  mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
2835  rsa_init( &ctx, RSA_PKCS_V15, 0 );
2836 
2837  memset( message_str, 0x00, 1000 );
2838  memset( hash_result, 0x00, 1000 );
2839  memset( output, 0x00, 1000 );
2840  memset( output_str, 0x00, 1000 );
2841 
2842  ctx.len = 2048 / 8;
2843  fct_chk( mpi_read_string( &ctx.P, 16, "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) == 0 );
2844  fct_chk( mpi_read_string( &ctx.Q, 16, "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) == 0 );
2845  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
2846  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
2847 
2848  fct_chk( mpi_sub_int( &P1, &ctx.P, 1 ) == 0 );
2849  fct_chk( mpi_sub_int( &Q1, &ctx.Q, 1 ) == 0 );
2850  fct_chk( mpi_mul_mpi( &H, &P1, &Q1 ) == 0 );
2851  fct_chk( mpi_gcd( &G, &ctx.E, &H ) == 0 );
2852  fct_chk( mpi_inv_mod( &ctx.D , &ctx.E, &H ) == 0 );
2853  fct_chk( mpi_mod_mpi( &ctx.DP, &ctx.D, &P1 ) == 0 );
2854  fct_chk( mpi_mod_mpi( &ctx.DQ, &ctx.D, &Q1 ) == 0 );
2855  fct_chk( mpi_inv_mod( &ctx.QP, &ctx.Q, &ctx.P ) == 0 );
2856 
2857  fct_chk( rsa_check_privkey( &ctx ) == 0 );
2858 
2859  msg_len = unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
2860 
2861  switch( SIG_RSA_SHA256 )
2862  {
2863  #ifdef POLARSSL_MD2_C
2864  case SIG_RSA_MD2:
2865  md2( message_str, msg_len, hash_result );
2866  break;
2867  #endif
2868  #ifdef POLARSSL_MD4_C
2869  case SIG_RSA_MD4:
2870  md4( message_str, msg_len, hash_result );
2871  break;
2872  #endif
2873  #ifdef POLARSSL_MD5_C
2874  case SIG_RSA_MD5:
2875  md5( message_str, msg_len, hash_result );
2876  break;
2877  #endif
2878  #ifdef POLARSSL_SHA1_C
2879  case SIG_RSA_SHA1:
2880  sha1( message_str, msg_len, hash_result );
2881  break;
2882  #endif
2883  #ifdef POLARSSL_SHA2_C
2884  case SIG_RSA_SHA224:
2885  sha2( message_str, msg_len, hash_result, 1 );
2886  break;
2887  case SIG_RSA_SHA256:
2888  sha2( message_str, msg_len, hash_result, 0 );
2889  break;
2890  #endif
2891  #ifdef POLARSSL_SHA4_C
2892  case SIG_RSA_SHA384:
2893  sha4( message_str, msg_len, hash_result, 1 );
2894  break;
2895  case SIG_RSA_SHA512:
2896  sha4( message_str, msg_len, hash_result, 0 );
2897  break;
2898  #endif
2899  }
2900 
2901  fct_chk( rsa_pkcs1_sign( &ctx, NULL, NULL, RSA_PRIVATE, SIG_RSA_SHA256, 0, hash_result, output ) == 0 );
2902  if( 0 == 0 )
2903  {
2904  hexify( output_str, output, ctx.len );
2905 
2906  fct_chk( strcasecmp( (char *) output_str, "5aee2b9dbc02a6a2d87ff64a64165dc0b9ce70c79bab2d287939e2601c3223e0493988d5468731ae4edc7d5f5d449335c204fdb0e192c1915c9d694d3a61c3be14df79c4b34d6ac73707829024d263c94f9107fa93f3783de3965522336e18d1e01a142b5103451bb97839eaf2f44703a63050a36b78aef4072ea1a8daaaf1a2918fc03ee957a9c09efdc7287bcb4d6aec4723290294b249b3e3dc63157b560ad9c867323a73ebeb360cc9e482111643b0d86c4e33dcf170155590f0eba7d170789e84de336b7fe2f6cf485ddca94607a4ff379fc49d375c730249dd1a210e7dccd762d1c23c7532e769c6aa88e38e8654ff90f7b34df4c07ba90e89099ec1ed" ) == 0 );
2907  }
2908 
2909  mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
2910  rsa_free( &ctx );
2911  }
2912  FCT_TEST_END();
2913 #endif /* POLARSSL_SHA2_C */
2914 
2915 #ifdef POLARSSL_SHA2_C
2916 
2917  FCT_TEST_BGN(rsa_pkcs1_sign_2_verify)
2918  {
2919  unsigned char message_str[1000];
2920  unsigned char hash_result[1000];
2921  unsigned char result_str[1000];
2922  rsa_context ctx;
2923  int msg_len;
2924 
2925  rsa_init( &ctx, RSA_PKCS_V15, 0 );
2926  memset( message_str, 0x00, 1000 );
2927  memset( hash_result, 0x00, 1000 );
2928  memset( result_str, 0x00, 1000 );
2929 
2930  ctx.len = 2048 / 8;
2931  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
2932  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
2933 
2934  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
2935 
2936  msg_len = unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
2937  unhexify( result_str, "5aee2b9dbc02a6a2d87ff64a64165dc0b9ce70c79bab2d287939e2601c3223e0493988d5468731ae4edc7d5f5d449335c204fdb0e192c1915c9d694d3a61c3be14df79c4b34d6ac73707829024d263c94f9107fa93f3783de3965522336e18d1e01a142b5103451bb97839eaf2f44703a63050a36b78aef4072ea1a8daaaf1a2918fc03ee957a9c09efdc7287bcb4d6aec4723290294b249b3e3dc63157b560ad9c867323a73ebeb360cc9e482111643b0d86c4e33dcf170155590f0eba7d170789e84de336b7fe2f6cf485ddca94607a4ff379fc49d375c730249dd1a210e7dccd762d1c23c7532e769c6aa88e38e8654ff90f7b34df4c07ba90e89099ec1ed" );
2938 
2939  switch( SIG_RSA_SHA256 )
2940  {
2941  #ifdef POLARSSL_MD2_C
2942  case SIG_RSA_MD2:
2943  md2( message_str, msg_len, hash_result );
2944  break;
2945  #endif
2946  #ifdef POLARSSL_MD4_C
2947  case SIG_RSA_MD4:
2948  md4( message_str, msg_len, hash_result );
2949  break;
2950  #endif
2951  #ifdef POLARSSL_MD5_C
2952  case SIG_RSA_MD5:
2953  md5( message_str, msg_len, hash_result );
2954  break;
2955  #endif
2956  #ifdef POLARSSL_SHA1_C
2957  case SIG_RSA_SHA1:
2958  sha1( message_str, msg_len, hash_result );
2959  break;
2960  #endif
2961  #ifdef POLARSSL_SHA2_C
2962  case SIG_RSA_SHA224:
2963  sha2( message_str, msg_len, hash_result, 1 );
2964  break;
2965  case SIG_RSA_SHA256:
2966  sha2( message_str, msg_len, hash_result, 0 );
2967  break;
2968  #endif
2969  #ifdef POLARSSL_SHA4_C
2970  case SIG_RSA_SHA384:
2971  sha4( message_str, msg_len, hash_result, 1 );
2972  break;
2973  case SIG_RSA_SHA512:
2974  sha4( message_str, msg_len, hash_result, 0 );
2975  break;
2976  #endif
2977  }
2978 
2979  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA256, 0, hash_result, result_str ) == 0 );
2980 
2981  rsa_free( &ctx );
2982  }
2983  FCT_TEST_END();
2984 #endif /* POLARSSL_SHA2_C */
2985 
2986 #ifdef POLARSSL_SHA2_C
2987 
2988  FCT_TEST_BGN(rsa_pkcs1_sign_2_verify_fail)
2989  {
2990  unsigned char message_str[1000];
2991  unsigned char hash_result[1000];
2992  unsigned char result_str[1000];
2993  rsa_context ctx;
2994  int msg_len;
2995 
2996  rsa_init( &ctx, RSA_PKCS_V15, 0 );
2997  memset( message_str, 0x00, 1000 );
2998  memset( hash_result, 0x00, 1000 );
2999  memset( result_str, 0x00, 1000 );
3000 
3001  ctx.len = 2048 / 8;
3002  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
3003  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
3004 
3005  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
3006 
3007  msg_len = unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
3008  unhexify( result_str, "5aee2b9dbc02a6a2d87ff64a64165dc0b9ce70c79bab2d287939e2601c3223e0493988d5468731ae4edc7d5f5d449335c204fdb0e192c1915c9d694d3a61c3be14df79c4b34d6ac73707829024d263c94f9107fa93f3783de3965522336e18d1e01a142b5103451bb97839eaf2f44703a63050a36b78aef4072ea1a8daaaf1a2918fc03ee957a9c09efdc6287bcb4d6aec4723290294b249b3e3dc63157b560ad9c867323a73ebeb360cc9e482111643b0d86c4e33dcf170155590f0eba7d170789e84de336b7fe2f6cf485ddca94607a4ff379fc49d375c730249dd1a210e7dccd763d1c23c7532e769c6aa88e38e8654ff90f7b34df4c07ba90e89099ec1ed" );
3009 
3010  switch( SIG_RSA_SHA256 )
3011  {
3012  #ifdef POLARSSL_MD2_C
3013  case SIG_RSA_MD2:
3014  md2( message_str, msg_len, hash_result );
3015  break;
3016  #endif
3017  #ifdef POLARSSL_MD4_C
3018  case SIG_RSA_MD4:
3019  md4( message_str, msg_len, hash_result );
3020  break;
3021  #endif
3022  #ifdef POLARSSL_MD5_C
3023  case SIG_RSA_MD5:
3024  md5( message_str, msg_len, hash_result );
3025  break;
3026  #endif
3027  #ifdef POLARSSL_SHA1_C
3028  case SIG_RSA_SHA1:
3029  sha1( message_str, msg_len, hash_result );
3030  break;
3031  #endif
3032  #ifdef POLARSSL_SHA2_C
3033  case SIG_RSA_SHA224:
3034  sha2( message_str, msg_len, hash_result, 1 );
3035  break;
3036  case SIG_RSA_SHA256:
3037  sha2( message_str, msg_len, hash_result, 0 );
3038  break;
3039  #endif
3040  #ifdef POLARSSL_SHA4_C
3041  case SIG_RSA_SHA384:
3042  sha4( message_str, msg_len, hash_result, 1 );
3043  break;
3044  case SIG_RSA_SHA512:
3045  sha4( message_str, msg_len, hash_result, 0 );
3046  break;
3047  #endif
3048  }
3049 
3050  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA256, 0, hash_result, result_str ) == POLARSSL_ERR_RSA_INVALID_PADDING );
3051 
3052  rsa_free( &ctx );
3053  }
3054  FCT_TEST_END();
3055 #endif /* POLARSSL_SHA2_C */
3056 
3057 #ifdef POLARSSL_SHA2_C
3058 
3059  FCT_TEST_BGN(rsa_pkcs1_sign_3_sha224_2048_bits_rsa)
3060  {
3061  unsigned char message_str[1000];
3062  unsigned char hash_result[1000];
3063  unsigned char output[1000];
3064  unsigned char output_str[1000];
3065  rsa_context ctx;
3066  mpi P1, Q1, H, G;
3067  int msg_len;
3068 
3069  mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
3070  rsa_init( &ctx, RSA_PKCS_V15, 0 );
3071 
3072  memset( message_str, 0x00, 1000 );
3073  memset( hash_result, 0x00, 1000 );
3074  memset( output, 0x00, 1000 );
3075  memset( output_str, 0x00, 1000 );
3076 
3077  ctx.len = 2048 / 8;
3078  fct_chk( mpi_read_string( &ctx.P, 16, "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) == 0 );
3079  fct_chk( mpi_read_string( &ctx.Q, 16, "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) == 0 );
3080  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
3081  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
3082 
3083  fct_chk( mpi_sub_int( &P1, &ctx.P, 1 ) == 0 );
3084  fct_chk( mpi_sub_int( &Q1, &ctx.Q, 1 ) == 0 );
3085  fct_chk( mpi_mul_mpi( &H, &P1, &Q1 ) == 0 );
3086  fct_chk( mpi_gcd( &G, &ctx.E, &H ) == 0 );
3087  fct_chk( mpi_inv_mod( &ctx.D , &ctx.E, &H ) == 0 );
3088  fct_chk( mpi_mod_mpi( &ctx.DP, &ctx.D, &P1 ) == 0 );
3089  fct_chk( mpi_mod_mpi( &ctx.DQ, &ctx.D, &Q1 ) == 0 );
3090  fct_chk( mpi_inv_mod( &ctx.QP, &ctx.Q, &ctx.P ) == 0 );
3091 
3092  fct_chk( rsa_check_privkey( &ctx ) == 0 );
3093 
3094  msg_len = unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
3095 
3096  switch( SIG_RSA_SHA224 )
3097  {
3098  #ifdef POLARSSL_MD2_C
3099  case SIG_RSA_MD2:
3100  md2( message_str, msg_len, hash_result );
3101  break;
3102  #endif
3103  #ifdef POLARSSL_MD4_C
3104  case SIG_RSA_MD4:
3105  md4( message_str, msg_len, hash_result );
3106  break;
3107  #endif
3108  #ifdef POLARSSL_MD5_C
3109  case SIG_RSA_MD5:
3110  md5( message_str, msg_len, hash_result );
3111  break;
3112  #endif
3113  #ifdef POLARSSL_SHA1_C
3114  case SIG_RSA_SHA1:
3115  sha1( message_str, msg_len, hash_result );
3116  break;
3117  #endif
3118  #ifdef POLARSSL_SHA2_C
3119  case SIG_RSA_SHA224:
3120  sha2( message_str, msg_len, hash_result, 1 );
3121  break;
3122  case SIG_RSA_SHA256:
3123  sha2( message_str, msg_len, hash_result, 0 );
3124  break;
3125  #endif
3126  #ifdef POLARSSL_SHA4_C
3127  case SIG_RSA_SHA384:
3128  sha4( message_str, msg_len, hash_result, 1 );
3129  break;
3130  case SIG_RSA_SHA512:
3131  sha4( message_str, msg_len, hash_result, 0 );
3132  break;
3133  #endif
3134  }
3135 
3136  fct_chk( rsa_pkcs1_sign( &ctx, NULL, NULL, RSA_PRIVATE, SIG_RSA_SHA224, 0, hash_result, output ) == 0 );
3137  if( 0 == 0 )
3138  {
3139  hexify( output_str, output, ctx.len );
3140 
3141  fct_chk( strcasecmp( (char *) output_str, "9d768b8b31421f9d9ced890aafaf8b3468656419049ed268f6e1992066f45dc3e4cd349e8c5ed5a06e4ef5badaba064ba94907dfedf3d708becaf44ae9b27c3866d329311ba93e8ddc7fc284fba05d1bb84fb1e060a5b76b7fa515cfcd2c8144474623672703cac1e15ff4fdf8ef19d365c51ba86e60f4cbbcd07f956060625751bfbecc47945646459cadaddd900603a8149a93b31a6d432e1da1a67eb765f5b2f0bd1adb9af12d731c7b02931b42dbbfd8c7cecde76b817e96f664147a2c5091c6ce4dc562c5f57159d6f9dc9ba2daa212db56677839621bd4805dde62955fb2d0cc2c448109d10ecc6206ea81f0a02e1646471358f3ec146cd3c75f2d390b" ) == 0 );
3142  }
3143 
3144  mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
3145  rsa_free( &ctx );
3146  }
3147  FCT_TEST_END();
3148 #endif /* POLARSSL_SHA2_C */
3149 
3150 #ifdef POLARSSL_SHA2_C
3151 
3152  FCT_TEST_BGN(rsa_pkcs1_sign_3_verify)
3153  {
3154  unsigned char message_str[1000];
3155  unsigned char hash_result[1000];
3156  unsigned char result_str[1000];
3157  rsa_context ctx;
3158  int msg_len;
3159 
3160  rsa_init( &ctx, RSA_PKCS_V15, 0 );
3161  memset( message_str, 0x00, 1000 );
3162  memset( hash_result, 0x00, 1000 );
3163  memset( result_str, 0x00, 1000 );
3164 
3165  ctx.len = 2048 / 8;
3166  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
3167  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
3168 
3169  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
3170 
3171  msg_len = unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
3172  unhexify( result_str, "9d768b8b31421f9d9ced890aafaf8b3468656419049ed268f6e1992066f45dc3e4cd349e8c5ed5a06e4ef5badaba064ba94907dfedf3d708becaf44ae9b27c3866d329311ba93e8ddc7fc284fba05d1bb84fb1e060a5b76b7fa515cfcd2c8144474623672703cac1e15ff4fdf8ef19d365c51ba86e60f4cbbcd07f956060625751bfbecc47945646459cadaddd900603a8149a93b31a6d432e1da1a67eb765f5b2f0bd1adb9af12d731c7b02931b42dbbfd8c7cecde76b817e96f664147a2c5091c6ce4dc562c5f57159d6f9dc9ba2daa212db56677839621bd4805dde62955fb2d0cc2c448109d10ecc6206ea81f0a02e1646471358f3ec146cd3c75f2d390b" );
3173 
3174  switch( SIG_RSA_SHA224 )
3175  {
3176  #ifdef POLARSSL_MD2_C
3177  case SIG_RSA_MD2:
3178  md2( message_str, msg_len, hash_result );
3179  break;
3180  #endif
3181  #ifdef POLARSSL_MD4_C
3182  case SIG_RSA_MD4:
3183  md4( message_str, msg_len, hash_result );
3184  break;
3185  #endif
3186  #ifdef POLARSSL_MD5_C
3187  case SIG_RSA_MD5:
3188  md5( message_str, msg_len, hash_result );
3189  break;
3190  #endif
3191  #ifdef POLARSSL_SHA1_C
3192  case SIG_RSA_SHA1:
3193  sha1( message_str, msg_len, hash_result );
3194  break;
3195  #endif
3196  #ifdef POLARSSL_SHA2_C
3197  case SIG_RSA_SHA224:
3198  sha2( message_str, msg_len, hash_result, 1 );
3199  break;
3200  case SIG_RSA_SHA256:
3201  sha2( message_str, msg_len, hash_result, 0 );
3202  break;
3203  #endif
3204  #ifdef POLARSSL_SHA4_C
3205  case SIG_RSA_SHA384:
3206  sha4( message_str, msg_len, hash_result, 1 );
3207  break;
3208  case SIG_RSA_SHA512:
3209  sha4( message_str, msg_len, hash_result, 0 );
3210  break;
3211  #endif
3212  }
3213 
3214  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA224, 0, hash_result, result_str ) == 0 );
3215 
3216  rsa_free( &ctx );
3217  }
3218  FCT_TEST_END();
3219 #endif /* POLARSSL_SHA2_C */
3220 
3221 #ifdef POLARSSL_SHA4_C
3222 
3223  FCT_TEST_BGN(rsa_pkcs1_sign_4_sha384_2048_bits_rsa)
3224  {
3225  unsigned char message_str[1000];
3226  unsigned char hash_result[1000];
3227  unsigned char output[1000];
3228  unsigned char output_str[1000];
3229  rsa_context ctx;
3230  mpi P1, Q1, H, G;
3231  int msg_len;
3232 
3233  mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
3234  rsa_init( &ctx, RSA_PKCS_V15, 0 );
3235 
3236  memset( message_str, 0x00, 1000 );
3237  memset( hash_result, 0x00, 1000 );
3238  memset( output, 0x00, 1000 );
3239  memset( output_str, 0x00, 1000 );
3240 
3241  ctx.len = 2048 / 8;
3242  fct_chk( mpi_read_string( &ctx.P, 16, "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) == 0 );
3243  fct_chk( mpi_read_string( &ctx.Q, 16, "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) == 0 );
3244  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
3245  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
3246 
3247  fct_chk( mpi_sub_int( &P1, &ctx.P, 1 ) == 0 );
3248  fct_chk( mpi_sub_int( &Q1, &ctx.Q, 1 ) == 0 );
3249  fct_chk( mpi_mul_mpi( &H, &P1, &Q1 ) == 0 );
3250  fct_chk( mpi_gcd( &G, &ctx.E, &H ) == 0 );
3251  fct_chk( mpi_inv_mod( &ctx.D , &ctx.E, &H ) == 0 );
3252  fct_chk( mpi_mod_mpi( &ctx.DP, &ctx.D, &P1 ) == 0 );
3253  fct_chk( mpi_mod_mpi( &ctx.DQ, &ctx.D, &Q1 ) == 0 );
3254  fct_chk( mpi_inv_mod( &ctx.QP, &ctx.Q, &ctx.P ) == 0 );
3255 
3256  fct_chk( rsa_check_privkey( &ctx ) == 0 );
3257 
3258  msg_len = unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
3259 
3260  switch( SIG_RSA_SHA384 )
3261  {
3262  #ifdef POLARSSL_MD2_C
3263  case SIG_RSA_MD2:
3264  md2( message_str, msg_len, hash_result );
3265  break;
3266  #endif
3267  #ifdef POLARSSL_MD4_C
3268  case SIG_RSA_MD4:
3269  md4( message_str, msg_len, hash_result );
3270  break;
3271  #endif
3272  #ifdef POLARSSL_MD5_C
3273  case SIG_RSA_MD5:
3274  md5( message_str, msg_len, hash_result );
3275  break;
3276  #endif
3277  #ifdef POLARSSL_SHA1_C
3278  case SIG_RSA_SHA1:
3279  sha1( message_str, msg_len, hash_result );
3280  break;
3281  #endif
3282  #ifdef POLARSSL_SHA2_C
3283  case SIG_RSA_SHA224:
3284  sha2( message_str, msg_len, hash_result, 1 );
3285  break;
3286  case SIG_RSA_SHA256:
3287  sha2( message_str, msg_len, hash_result, 0 );
3288  break;
3289  #endif
3290  #ifdef POLARSSL_SHA4_C
3291  case SIG_RSA_SHA384:
3292  sha4( message_str, msg_len, hash_result, 1 );
3293  break;
3294  case SIG_RSA_SHA512:
3295  sha4( message_str, msg_len, hash_result, 0 );
3296  break;
3297  #endif
3298  }
3299 
3300  fct_chk( rsa_pkcs1_sign( &ctx, NULL, NULL, RSA_PRIVATE, SIG_RSA_SHA384, 0, hash_result, output ) == 0 );
3301  if( 0 == 0 )
3302  {
3303  hexify( output_str, output, ctx.len );
3304 
3305  fct_chk( strcasecmp( (char *) output_str, "40dcc96822e5612eb33f1dca247a35109ba3845c7a3d556a60e656624bf1c103d94686ca7379e9e329ccd1b19b52bfd48b608df9f59a96a82d3feb0101096dbcb80e46da543b4c982ac6bb1717f24f9fe3f76b7154492b47525be1ddcaf4631d33481531be8f3e685837b40bdf4a02827d79f6a32374147174680f51c8e0d8eed9d5c445a563a7bce9ef4236e7cfdc12b2223ef457c3e8ccc6dd65cc23e977a1f03f5ef584feb9af00efc71a701f9d413b0290af17692cb821a1e863d5778e174b1130659f30583f434f09cb1212471a41dd65c102de64a194b6ae3e43cd75928049db78042c58e980aff3ea2774e42845bcf217410a118cf5deeaa64224dbc8" ) == 0 );
3306  }
3307 
3308  mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
3309  rsa_free( &ctx );
3310  }
3311  FCT_TEST_END();
3312 #endif /* POLARSSL_SHA4_C */
3313 
3314 #ifdef POLARSSL_SHA4_C
3315 
3316  FCT_TEST_BGN(rsa_pkcs1_sign_4_verify)
3317  {
3318  unsigned char message_str[1000];
3319  unsigned char hash_result[1000];
3320  unsigned char result_str[1000];
3321  rsa_context ctx;
3322  int msg_len;
3323 
3324  rsa_init( &ctx, RSA_PKCS_V15, 0 );
3325  memset( message_str, 0x00, 1000 );
3326  memset( hash_result, 0x00, 1000 );
3327  memset( result_str, 0x00, 1000 );
3328 
3329  ctx.len = 2048 / 8;
3330  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
3331  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
3332 
3333  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
3334 
3335  msg_len = unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
3336  unhexify( result_str, "40dcc96822e5612eb33f1dca247a35109ba3845c7a3d556a60e656624bf1c103d94686ca7379e9e329ccd1b19b52bfd48b608df9f59a96a82d3feb0101096dbcb80e46da543b4c982ac6bb1717f24f9fe3f76b7154492b47525be1ddcaf4631d33481531be8f3e685837b40bdf4a02827d79f6a32374147174680f51c8e0d8eed9d5c445a563a7bce9ef4236e7cfdc12b2223ef457c3e8ccc6dd65cc23e977a1f03f5ef584feb9af00efc71a701f9d413b0290af17692cb821a1e863d5778e174b1130659f30583f434f09cb1212471a41dd65c102de64a194b6ae3e43cd75928049db78042c58e980aff3ea2774e42845bcf217410a118cf5deeaa64224dbc8" );
3337 
3338  switch( SIG_RSA_SHA384 )
3339  {
3340  #ifdef POLARSSL_MD2_C
3341  case SIG_RSA_MD2:
3342  md2( message_str, msg_len, hash_result );
3343  break;
3344  #endif
3345  #ifdef POLARSSL_MD4_C
3346  case SIG_RSA_MD4:
3347  md4( message_str, msg_len, hash_result );
3348  break;
3349  #endif
3350  #ifdef POLARSSL_MD5_C
3351  case SIG_RSA_MD5:
3352  md5( message_str, msg_len, hash_result );
3353  break;
3354  #endif
3355  #ifdef POLARSSL_SHA1_C
3356  case SIG_RSA_SHA1:
3357  sha1( message_str, msg_len, hash_result );
3358  break;
3359  #endif
3360  #ifdef POLARSSL_SHA2_C
3361  case SIG_RSA_SHA224:
3362  sha2( message_str, msg_len, hash_result, 1 );
3363  break;
3364  case SIG_RSA_SHA256:
3365  sha2( message_str, msg_len, hash_result, 0 );
3366  break;
3367  #endif
3368  #ifdef POLARSSL_SHA4_C
3369  case SIG_RSA_SHA384:
3370  sha4( message_str, msg_len, hash_result, 1 );
3371  break;
3372  case SIG_RSA_SHA512:
3373  sha4( message_str, msg_len, hash_result, 0 );
3374  break;
3375  #endif
3376  }
3377 
3378  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_SHA384, 0, hash_result, result_str ) == 0 );
3379 
3380  rsa_free( &ctx );
3381  }
3382  FCT_TEST_END();
3383 #endif /* POLARSSL_SHA4_C */
3384 
3385 #ifdef POLARSSL_MD2_C
3386 
3387  FCT_TEST_BGN(rsa_pkcs1_sign_5_md2_2048_bits_rsa)
3388  {
3389  unsigned char message_str[1000];
3390  unsigned char hash_result[1000];
3391  unsigned char output[1000];
3392  unsigned char output_str[1000];
3393  rsa_context ctx;
3394  mpi P1, Q1, H, G;
3395  int msg_len;
3396 
3397  mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
3398  rsa_init( &ctx, RSA_PKCS_V15, 0 );
3399 
3400  memset( message_str, 0x00, 1000 );
3401  memset( hash_result, 0x00, 1000 );
3402  memset( output, 0x00, 1000 );
3403  memset( output_str, 0x00, 1000 );
3404 
3405  ctx.len = 2048 / 8;
3406  fct_chk( mpi_read_string( &ctx.P, 16, "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) == 0 );
3407  fct_chk( mpi_read_string( &ctx.Q, 16, "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) == 0 );
3408  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
3409  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
3410 
3411  fct_chk( mpi_sub_int( &P1, &ctx.P, 1 ) == 0 );
3412  fct_chk( mpi_sub_int( &Q1, &ctx.Q, 1 ) == 0 );
3413  fct_chk( mpi_mul_mpi( &H, &P1, &Q1 ) == 0 );
3414  fct_chk( mpi_gcd( &G, &ctx.E, &H ) == 0 );
3415  fct_chk( mpi_inv_mod( &ctx.D , &ctx.E, &H ) == 0 );
3416  fct_chk( mpi_mod_mpi( &ctx.DP, &ctx.D, &P1 ) == 0 );
3417  fct_chk( mpi_mod_mpi( &ctx.DQ, &ctx.D, &Q1 ) == 0 );
3418  fct_chk( mpi_inv_mod( &ctx.QP, &ctx.Q, &ctx.P ) == 0 );
3419 
3420  fct_chk( rsa_check_privkey( &ctx ) == 0 );
3421 
3422  msg_len = unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
3423 
3424  switch( SIG_RSA_MD2 )
3425  {
3426  #ifdef POLARSSL_MD2_C
3427  case SIG_RSA_MD2:
3428  md2( message_str, msg_len, hash_result );
3429  break;
3430  #endif
3431  #ifdef POLARSSL_MD4_C
3432  case SIG_RSA_MD4:
3433  md4( message_str, msg_len, hash_result );
3434  break;
3435  #endif
3436  #ifdef POLARSSL_MD5_C
3437  case SIG_RSA_MD5:
3438  md5( message_str, msg_len, hash_result );
3439  break;
3440  #endif
3441  #ifdef POLARSSL_SHA1_C
3442  case SIG_RSA_SHA1:
3443  sha1( message_str, msg_len, hash_result );
3444  break;
3445  #endif
3446  #ifdef POLARSSL_SHA2_C
3447  case SIG_RSA_SHA224:
3448  sha2( message_str, msg_len, hash_result, 1 );
3449  break;
3450  case SIG_RSA_SHA256:
3451  sha2( message_str, msg_len, hash_result, 0 );
3452  break;
3453  #endif
3454  #ifdef POLARSSL_SHA4_C
3455  case SIG_RSA_SHA384:
3456  sha4( message_str, msg_len, hash_result, 1 );
3457  break;
3458  case SIG_RSA_SHA512:
3459  sha4( message_str, msg_len, hash_result, 0 );
3460  break;
3461  #endif
3462  }
3463 
3464  fct_chk( rsa_pkcs1_sign( &ctx, NULL, NULL, RSA_PRIVATE, SIG_RSA_MD2, 0, hash_result, output ) == 0 );
3465  if( 0 == 0 )
3466  {
3467  hexify( output_str, output, ctx.len );
3468 
3469  fct_chk( strcasecmp( (char *) output_str, "6cbb0e4019d64dd5cd2d48fa43446e5cba1a7edbb79d91b199be75c7d3e7ae0820c44d3a120cd2910f73cbb315e15963a60ea7da3452015d9d6beb5ac998fddbd1fa3e5908abc9151f3ffb70365aaee6fb0cd440d3f5591868fc136fae38ac7bcdb3bde3c6a0362dd8b814f7edadd4a51b2edf2227a40d1e34c29f608add7746731425858eb93661c633b7a90942fca3cd594ab4ec170052d44105643518020782e76235def34d014135bad8daed590200482325c3416c3d66417e80d9f9c6322a54683638247b577445ecd0be2765ce96c4ee45213204026dfba24d5ee89e1ea75538ba39f7149a5ac0fc12d7c53cbc12481d4a8e2d410ec633d800ad4b4304" ) == 0 );
3470  }
3471 
3472  mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
3473  rsa_free( &ctx );
3474  }
3475  FCT_TEST_END();
3476 #endif /* POLARSSL_MD2_C */
3477 
3478 #ifdef POLARSSL_MD2_C
3479 
3480  FCT_TEST_BGN(rsa_pkcs1_sign_5_verify)
3481  {
3482  unsigned char message_str[1000];
3483  unsigned char hash_result[1000];
3484  unsigned char result_str[1000];
3485  rsa_context ctx;
3486  int msg_len;
3487 
3488  rsa_init( &ctx, RSA_PKCS_V15, 0 );
3489  memset( message_str, 0x00, 1000 );
3490  memset( hash_result, 0x00, 1000 );
3491  memset( result_str, 0x00, 1000 );
3492 
3493  ctx.len = 2048 / 8;
3494  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
3495  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
3496 
3497  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
3498 
3499  msg_len = unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
3500  unhexify( result_str, "6cbb0e4019d64dd5cd2d48fa43446e5cba1a7edbb79d91b199be75c7d3e7ae0820c44d3a120cd2910f73cbb315e15963a60ea7da3452015d9d6beb5ac998fddbd1fa3e5908abc9151f3ffb70365aaee6fb0cd440d3f5591868fc136fae38ac7bcdb3bde3c6a0362dd8b814f7edadd4a51b2edf2227a40d1e34c29f608add7746731425858eb93661c633b7a90942fca3cd594ab4ec170052d44105643518020782e76235def34d014135bad8daed590200482325c3416c3d66417e80d9f9c6322a54683638247b577445ecd0be2765ce96c4ee45213204026dfba24d5ee89e1ea75538ba39f7149a5ac0fc12d7c53cbc12481d4a8e2d410ec633d800ad4b4304" );
3501 
3502  switch( SIG_RSA_MD2 )
3503  {
3504  #ifdef POLARSSL_MD2_C
3505  case SIG_RSA_MD2:
3506  md2( message_str, msg_len, hash_result );
3507  break;
3508  #endif
3509  #ifdef POLARSSL_MD4_C
3510  case SIG_RSA_MD4:
3511  md4( message_str, msg_len, hash_result );
3512  break;
3513  #endif
3514  #ifdef POLARSSL_MD5_C
3515  case SIG_RSA_MD5:
3516  md5( message_str, msg_len, hash_result );
3517  break;
3518  #endif
3519  #ifdef POLARSSL_SHA1_C
3520  case SIG_RSA_SHA1:
3521  sha1( message_str, msg_len, hash_result );
3522  break;
3523  #endif
3524  #ifdef POLARSSL_SHA2_C
3525  case SIG_RSA_SHA224:
3526  sha2( message_str, msg_len, hash_result, 1 );
3527  break;
3528  case SIG_RSA_SHA256:
3529  sha2( message_str, msg_len, hash_result, 0 );
3530  break;
3531  #endif
3532  #ifdef POLARSSL_SHA4_C
3533  case SIG_RSA_SHA384:
3534  sha4( message_str, msg_len, hash_result, 1 );
3535  break;
3536  case SIG_RSA_SHA512:
3537  sha4( message_str, msg_len, hash_result, 0 );
3538  break;
3539  #endif
3540  }
3541 
3542  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_MD2, 0, hash_result, result_str ) == 0 );
3543 
3544  rsa_free( &ctx );
3545  }
3546  FCT_TEST_END();
3547 #endif /* POLARSSL_MD2_C */
3548 
3549 #ifdef POLARSSL_MD4_C
3550 
3551  FCT_TEST_BGN(rsa_pkcs1_sign_6_md4_2048_bits_rsa)
3552  {
3553  unsigned char message_str[1000];
3554  unsigned char hash_result[1000];
3555  unsigned char output[1000];
3556  unsigned char output_str[1000];
3557  rsa_context ctx;
3558  mpi P1, Q1, H, G;
3559  int msg_len;
3560 
3561  mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
3562  rsa_init( &ctx, RSA_PKCS_V15, 0 );
3563 
3564  memset( message_str, 0x00, 1000 );
3565  memset( hash_result, 0x00, 1000 );
3566  memset( output, 0x00, 1000 );
3567  memset( output_str, 0x00, 1000 );
3568 
3569  ctx.len = 2048 / 8;
3570  fct_chk( mpi_read_string( &ctx.P, 16, "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) == 0 );
3571  fct_chk( mpi_read_string( &ctx.Q, 16, "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) == 0 );
3572  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
3573  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
3574 
3575  fct_chk( mpi_sub_int( &P1, &ctx.P, 1 ) == 0 );
3576  fct_chk( mpi_sub_int( &Q1, &ctx.Q, 1 ) == 0 );
3577  fct_chk( mpi_mul_mpi( &H, &P1, &Q1 ) == 0 );
3578  fct_chk( mpi_gcd( &G, &ctx.E, &H ) == 0 );
3579  fct_chk( mpi_inv_mod( &ctx.D , &ctx.E, &H ) == 0 );
3580  fct_chk( mpi_mod_mpi( &ctx.DP, &ctx.D, &P1 ) == 0 );
3581  fct_chk( mpi_mod_mpi( &ctx.DQ, &ctx.D, &Q1 ) == 0 );
3582  fct_chk( mpi_inv_mod( &ctx.QP, &ctx.Q, &ctx.P ) == 0 );
3583 
3584  fct_chk( rsa_check_privkey( &ctx ) == 0 );
3585 
3586  msg_len = unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
3587 
3588  switch( SIG_RSA_MD4 )
3589  {
3590  #ifdef POLARSSL_MD2_C
3591  case SIG_RSA_MD2:
3592  md2( message_str, msg_len, hash_result );
3593  break;
3594  #endif
3595  #ifdef POLARSSL_MD4_C
3596  case SIG_RSA_MD4:
3597  md4( message_str, msg_len, hash_result );
3598  break;
3599  #endif
3600  #ifdef POLARSSL_MD5_C
3601  case SIG_RSA_MD5:
3602  md5( message_str, msg_len, hash_result );
3603  break;
3604  #endif
3605  #ifdef POLARSSL_SHA1_C
3606  case SIG_RSA_SHA1:
3607  sha1( message_str, msg_len, hash_result );
3608  break;
3609  #endif
3610  #ifdef POLARSSL_SHA2_C
3611  case SIG_RSA_SHA224:
3612  sha2( message_str, msg_len, hash_result, 1 );
3613  break;
3614  case SIG_RSA_SHA256:
3615  sha2( message_str, msg_len, hash_result, 0 );
3616  break;
3617  #endif
3618  #ifdef POLARSSL_SHA4_C
3619  case SIG_RSA_SHA384:
3620  sha4( message_str, msg_len, hash_result, 1 );
3621  break;
3622  case SIG_RSA_SHA512:
3623  sha4( message_str, msg_len, hash_result, 0 );
3624  break;
3625  #endif
3626  }
3627 
3628  fct_chk( rsa_pkcs1_sign( &ctx, NULL, NULL, RSA_PRIVATE, SIG_RSA_MD4, 0, hash_result, output ) == 0 );
3629  if( 0 == 0 )
3630  {
3631  hexify( output_str, output, ctx.len );
3632 
3633  fct_chk( strcasecmp( (char *) output_str, "b0e60dc4dfaf0f636a3a4414eae2d7bce7c3ce505a46e38f3f654d8769b31b7891ba18f89672fce204bbac6e3764355e65447c087994731cd44f086710e79e8c3ebc6e2cb61edc5d3e05848ab733d95efe2d0252a691e810c17fa57fd2dd296374c9ba17fea704685677f45d668a386c8ca433fbbb56d3bbfb43a489ed9518b1c9ab13ce497a1cec91467453bfe533145a31a095c2de541255141768ccc6fdff3fc790b5050f1122c93c3044a9346947e1b23e8125bf7edbf38c64a4286dfc1b829e983db3117959a2559a8ef97687ab673e231be213d88edc632637b58cdb2d69c51fbf6bf894cff319216718b1e696f75cd4366f53dc2e28b2a00017984207" ) == 0 );
3634  }
3635 
3636  mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
3637  rsa_free( &ctx );
3638  }
3639  FCT_TEST_END();
3640 #endif /* POLARSSL_MD4_C */
3641 
3642 #ifdef POLARSSL_MD4_C
3643 
3644  FCT_TEST_BGN(rsa_pkcs1_sign_6_verify)
3645  {
3646  unsigned char message_str[1000];
3647  unsigned char hash_result[1000];
3648  unsigned char result_str[1000];
3649  rsa_context ctx;
3650  int msg_len;
3651 
3652  rsa_init( &ctx, RSA_PKCS_V15, 0 );
3653  memset( message_str, 0x00, 1000 );
3654  memset( hash_result, 0x00, 1000 );
3655  memset( result_str, 0x00, 1000 );
3656 
3657  ctx.len = 2048 / 8;
3658  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
3659  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
3660 
3661  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
3662 
3663  msg_len = unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
3664  unhexify( result_str, "b0e60dc4dfaf0f636a3a4414eae2d7bce7c3ce505a46e38f3f654d8769b31b7891ba18f89672fce204bbac6e3764355e65447c087994731cd44f086710e79e8c3ebc6e2cb61edc5d3e05848ab733d95efe2d0252a691e810c17fa57fd2dd296374c9ba17fea704685677f45d668a386c8ca433fbbb56d3bbfb43a489ed9518b1c9ab13ce497a1cec91467453bfe533145a31a095c2de541255141768ccc6fdff3fc790b5050f1122c93c3044a9346947e1b23e8125bf7edbf38c64a4286dfc1b829e983db3117959a2559a8ef97687ab673e231be213d88edc632637b58cdb2d69c51fbf6bf894cff319216718b1e696f75cd4366f53dc2e28b2a00017984207" );
3665 
3666  switch( SIG_RSA_MD4 )
3667  {
3668  #ifdef POLARSSL_MD2_C
3669  case SIG_RSA_MD2:
3670  md2( message_str, msg_len, hash_result );
3671  break;
3672  #endif
3673  #ifdef POLARSSL_MD4_C
3674  case SIG_RSA_MD4:
3675  md4( message_str, msg_len, hash_result );
3676  break;
3677  #endif
3678  #ifdef POLARSSL_MD5_C
3679  case SIG_RSA_MD5:
3680  md5( message_str, msg_len, hash_result );
3681  break;
3682  #endif
3683  #ifdef POLARSSL_SHA1_C
3684  case SIG_RSA_SHA1:
3685  sha1( message_str, msg_len, hash_result );
3686  break;
3687  #endif
3688  #ifdef POLARSSL_SHA2_C
3689  case SIG_RSA_SHA224:
3690  sha2( message_str, msg_len, hash_result, 1 );
3691  break;
3692  case SIG_RSA_SHA256:
3693  sha2( message_str, msg_len, hash_result, 0 );
3694  break;
3695  #endif
3696  #ifdef POLARSSL_SHA4_C
3697  case SIG_RSA_SHA384:
3698  sha4( message_str, msg_len, hash_result, 1 );
3699  break;
3700  case SIG_RSA_SHA512:
3701  sha4( message_str, msg_len, hash_result, 0 );
3702  break;
3703  #endif
3704  }
3705 
3706  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_MD4, 0, hash_result, result_str ) == 0 );
3707 
3708  rsa_free( &ctx );
3709  }
3710  FCT_TEST_END();
3711 #endif /* POLARSSL_MD4_C */
3712 
3713 #ifdef POLARSSL_MD5_C
3714 
3715  FCT_TEST_BGN(rsa_pkcs1_sign_7_md5_2048_bits_rsa)
3716  {
3717  unsigned char message_str[1000];
3718  unsigned char hash_result[1000];
3719  unsigned char output[1000];
3720  unsigned char output_str[1000];
3721  rsa_context ctx;
3722  mpi P1, Q1, H, G;
3723  int msg_len;
3724 
3725  mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
3726  rsa_init( &ctx, RSA_PKCS_V15, 0 );
3727 
3728  memset( message_str, 0x00, 1000 );
3729  memset( hash_result, 0x00, 1000 );
3730  memset( output, 0x00, 1000 );
3731  memset( output_str, 0x00, 1000 );
3732 
3733  ctx.len = 2048 / 8;
3734  fct_chk( mpi_read_string( &ctx.P, 16, "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) == 0 );
3735  fct_chk( mpi_read_string( &ctx.Q, 16, "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) == 0 );
3736  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
3737  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
3738 
3739  fct_chk( mpi_sub_int( &P1, &ctx.P, 1 ) == 0 );
3740  fct_chk( mpi_sub_int( &Q1, &ctx.Q, 1 ) == 0 );
3741  fct_chk( mpi_mul_mpi( &H, &P1, &Q1 ) == 0 );
3742  fct_chk( mpi_gcd( &G, &ctx.E, &H ) == 0 );
3743  fct_chk( mpi_inv_mod( &ctx.D , &ctx.E, &H ) == 0 );
3744  fct_chk( mpi_mod_mpi( &ctx.DP, &ctx.D, &P1 ) == 0 );
3745  fct_chk( mpi_mod_mpi( &ctx.DQ, &ctx.D, &Q1 ) == 0 );
3746  fct_chk( mpi_inv_mod( &ctx.QP, &ctx.Q, &ctx.P ) == 0 );
3747 
3748  fct_chk( rsa_check_privkey( &ctx ) == 0 );
3749 
3750  msg_len = unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
3751 
3752  switch( SIG_RSA_MD5 )
3753  {
3754  #ifdef POLARSSL_MD2_C
3755  case SIG_RSA_MD2:
3756  md2( message_str, msg_len, hash_result );
3757  break;
3758  #endif
3759  #ifdef POLARSSL_MD4_C
3760  case SIG_RSA_MD4:
3761  md4( message_str, msg_len, hash_result );
3762  break;
3763  #endif
3764  #ifdef POLARSSL_MD5_C
3765  case SIG_RSA_MD5:
3766  md5( message_str, msg_len, hash_result );
3767  break;
3768  #endif
3769  #ifdef POLARSSL_SHA1_C
3770  case SIG_RSA_SHA1:
3771  sha1( message_str, msg_len, hash_result );
3772  break;
3773  #endif
3774  #ifdef POLARSSL_SHA2_C
3775  case SIG_RSA_SHA224:
3776  sha2( message_str, msg_len, hash_result, 1 );
3777  break;
3778  case SIG_RSA_SHA256:
3779  sha2( message_str, msg_len, hash_result, 0 );
3780  break;
3781  #endif
3782  #ifdef POLARSSL_SHA4_C
3783  case SIG_RSA_SHA384:
3784  sha4( message_str, msg_len, hash_result, 1 );
3785  break;
3786  case SIG_RSA_SHA512:
3787  sha4( message_str, msg_len, hash_result, 0 );
3788  break;
3789  #endif
3790  }
3791 
3792  fct_chk( rsa_pkcs1_sign( &ctx, NULL, NULL, RSA_PRIVATE, SIG_RSA_MD5, 0, hash_result, output ) == 0 );
3793  if( 0 == 0 )
3794  {
3795  hexify( output_str, output, ctx.len );
3796 
3797  fct_chk( strcasecmp( (char *) output_str, "3bcf673c3b27f6e2ece4bb97c7a37161e6c6ee7419ef366efc3cfee0f15f415ff6d9d4390937386c6fec1771acba73f24ec6b0469ea8b88083f0b4e1b6069d7bf286e67cf94182a548663137e82a6e09c35de2c27779da0503f1f5bedfebadf2a875f17763a0564df4a6d945a5a3e46bc90fb692af3a55106aafc6b577587456ff8d49cfd5c299d7a2b776dbe4c1ae777b0f64aa3bab27689af32d6cc76157c7dc6900a3469e18a7d9b6bfe4951d1105a08864575e4f4ec05b3e053f9b7a2d5653ae085e50a63380d6bdd6f58ab378d7e0a2be708c559849891317089ab04c82d8bc589ea088b90b11dea5cf85856ff7e609cc1adb1d403beead4c126ff29021" ) == 0 );
3798  }
3799 
3800  mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
3801  rsa_free( &ctx );
3802  }
3803  FCT_TEST_END();
3804 #endif /* POLARSSL_MD5_C */
3805 
3806 #ifdef POLARSSL_MD5_C
3807 
3808  FCT_TEST_BGN(rsa_pkcs1_sign_7_verify)
3809  {
3810  unsigned char message_str[1000];
3811  unsigned char hash_result[1000];
3812  unsigned char result_str[1000];
3813  rsa_context ctx;
3814  int msg_len;
3815 
3816  rsa_init( &ctx, RSA_PKCS_V15, 0 );
3817  memset( message_str, 0x00, 1000 );
3818  memset( hash_result, 0x00, 1000 );
3819  memset( result_str, 0x00, 1000 );
3820 
3821  ctx.len = 2048 / 8;
3822  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
3823  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
3824 
3825  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
3826 
3827  msg_len = unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
3828  unhexify( result_str, "3bcf673c3b27f6e2ece4bb97c7a37161e6c6ee7419ef366efc3cfee0f15f415ff6d9d4390937386c6fec1771acba73f24ec6b0469ea8b88083f0b4e1b6069d7bf286e67cf94182a548663137e82a6e09c35de2c27779da0503f1f5bedfebadf2a875f17763a0564df4a6d945a5a3e46bc90fb692af3a55106aafc6b577587456ff8d49cfd5c299d7a2b776dbe4c1ae777b0f64aa3bab27689af32d6cc76157c7dc6900a3469e18a7d9b6bfe4951d1105a08864575e4f4ec05b3e053f9b7a2d5653ae085e50a63380d6bdd6f58ab378d7e0a2be708c559849891317089ab04c82d8bc589ea088b90b11dea5cf85856ff7e609cc1adb1d403beead4c126ff29021" );
3829 
3830  switch( SIG_RSA_MD5 )
3831  {
3832  #ifdef POLARSSL_MD2_C
3833  case SIG_RSA_MD2:
3834  md2( message_str, msg_len, hash_result );
3835  break;
3836  #endif
3837  #ifdef POLARSSL_MD4_C
3838  case SIG_RSA_MD4:
3839  md4( message_str, msg_len, hash_result );
3840  break;
3841  #endif
3842  #ifdef POLARSSL_MD5_C
3843  case SIG_RSA_MD5:
3844  md5( message_str, msg_len, hash_result );
3845  break;
3846  #endif
3847  #ifdef POLARSSL_SHA1_C
3848  case SIG_RSA_SHA1:
3849  sha1( message_str, msg_len, hash_result );
3850  break;
3851  #endif
3852  #ifdef POLARSSL_SHA2_C
3853  case SIG_RSA_SHA224:
3854  sha2( message_str, msg_len, hash_result, 1 );
3855  break;
3856  case SIG_RSA_SHA256:
3857  sha2( message_str, msg_len, hash_result, 0 );
3858  break;
3859  #endif
3860  #ifdef POLARSSL_SHA4_C
3861  case SIG_RSA_SHA384:
3862  sha4( message_str, msg_len, hash_result, 1 );
3863  break;
3864  case SIG_RSA_SHA512:
3865  sha4( message_str, msg_len, hash_result, 0 );
3866  break;
3867  #endif
3868  }
3869 
3870  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_MD5, 0, hash_result, result_str ) == 0 );
3871 
3872  rsa_free( &ctx );
3873  }
3874  FCT_TEST_END();
3875 #endif /* POLARSSL_MD5_C */
3876 
3877 
3878  FCT_TEST_BGN(rsa_pkcs1_sign_8_raw_2048_bits_rsa)
3879  {
3880  unsigned char message_str[1000];
3881  unsigned char hash_result[1000];
3882  unsigned char output[1000];
3883  unsigned char output_str[1000];
3884  rsa_context ctx;
3885  mpi P1, Q1, H, G;
3886  int hash_len;
3887 
3888  mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
3889  rsa_init( &ctx, RSA_PKCS_V15, 0 );
3890 
3891  memset( message_str, 0x00, 1000 );
3892  memset( hash_result, 0x00, 1000 );
3893  memset( output, 0x00, 1000 );
3894  memset( output_str, 0x00, 1000 );
3895 
3896  ctx.len = 2048 / 8;
3897  fct_chk( mpi_read_string( &ctx.P, 16, "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) == 0 );
3898  fct_chk( mpi_read_string( &ctx.Q, 16, "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) == 0 );
3899  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
3900  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
3901 
3902  fct_chk( mpi_sub_int( &P1, &ctx.P, 1 ) == 0 );
3903  fct_chk( mpi_sub_int( &Q1, &ctx.Q, 1 ) == 0 );
3904  fct_chk( mpi_mul_mpi( &H, &P1, &Q1 ) == 0 );
3905  fct_chk( mpi_gcd( &G, &ctx.E, &H ) == 0 );
3906  fct_chk( mpi_inv_mod( &ctx.D , &ctx.E, &H ) == 0 );
3907  fct_chk( mpi_mod_mpi( &ctx.DP, &ctx.D, &P1 ) == 0 );
3908  fct_chk( mpi_mod_mpi( &ctx.DQ, &ctx.D, &Q1 ) == 0 );
3909  fct_chk( mpi_inv_mod( &ctx.QP, &ctx.Q, &ctx.P ) == 0 );
3910 
3911  fct_chk( rsa_check_privkey( &ctx ) == 0 );
3912 
3913  unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
3914  hash_len = unhexify( hash_result, "1234567890deadbeef" );
3915 
3916  fct_chk( rsa_pkcs1_sign( &ctx, NULL, NULL, RSA_PRIVATE, SIG_RSA_RAW, hash_len, hash_result, output ) == 0 );
3917 
3918  hexify( output_str, output, ctx.len );
3919 
3920  fct_chk( strcasecmp( (char *) output_str, "605baf947c0de49e4f6a0dfb94a43ae318d5df8ed20ba4ba5a37a73fb009c5c9e5cce8b70a25b1c7580f389f0d7092485cdfa02208b70d33482edf07a7eafebdc54862ca0e0396a5a7d09991b9753eb1ffb6091971bb5789c6b121abbcd0a3cbaa39969fa7c28146fce96c6d03272e3793e5be8f5abfa9afcbebb986d7b3050604a2af4d3a40fa6c003781a539a60259d1e84f13322da9e538a49c369b83e7286bf7d30b64bbb773506705da5d5d5483a563a1ffacc902fb75c9a751b1e83cdc7a6db0470056883f48b5a5446b43b1d180ea12ba11a6a8d93b3b32a30156b6084b7fb142998a2a0d28014b84098ece7d9d5e4d55cc342ca26f5a0167a679dec8" ) == 0 );
3921 
3922  mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
3923  rsa_free( &ctx );
3924  }
3925  FCT_TEST_END();
3926 
3927 
3928  FCT_TEST_BGN(rsa_pkcs1_sign_8_verify)
3929  {
3930  unsigned char message_str[1000];
3931  unsigned char hash_result[1000];
3932  unsigned char result_str[1000];
3933  rsa_context ctx;
3934  size_t hash_len;
3935 
3936  rsa_init( &ctx, RSA_PKCS_V15, 0 );
3937  memset( message_str, 0x00, 1000 );
3938  memset( hash_result, 0x00, 1000 );
3939  memset( result_str, 0x00, 1000 );
3940 
3941  ctx.len = 2048 / 8;
3942  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
3943  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
3944 
3945  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
3946 
3947  unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
3948  hash_len = unhexify( hash_result, "1234567890deadbeef" );
3949  unhexify( result_str, "605baf947c0de49e4f6a0dfb94a43ae318d5df8ed20ba4ba5a37a73fb009c5c9e5cce8b70a25b1c7580f389f0d7092485cdfa02208b70d33482edf07a7eafebdc54862ca0e0396a5a7d09991b9753eb1ffb6091971bb5789c6b121abbcd0a3cbaa39969fa7c28146fce96c6d03272e3793e5be8f5abfa9afcbebb986d7b3050604a2af4d3a40fa6c003781a539a60259d1e84f13322da9e538a49c369b83e7286bf7d30b64bbb773506705da5d5d5483a563a1ffacc902fb75c9a751b1e83cdc7a6db0470056883f48b5a5446b43b1d180ea12ba11a6a8d93b3b32a30156b6084b7fb142998a2a0d28014b84098ece7d9d5e4d55cc342ca26f5a0167a679dec8" );
3950 
3951  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_RAW, hash_len, hash_result, result_str ) == 0 );
3952 
3953  rsa_free( &ctx );
3954  }
3955  FCT_TEST_END();
3956 
3957 
3958  FCT_TEST_BGN(rsa_pkcs1_sign_8_verify_wrong_raw_hash)
3959  {
3960  unsigned char message_str[1000];
3961  unsigned char hash_result[1000];
3962  unsigned char result_str[1000];
3963  rsa_context ctx;
3964  size_t hash_len;
3965 
3966  rsa_init( &ctx, RSA_PKCS_V15, 0 );
3967  memset( message_str, 0x00, 1000 );
3968  memset( hash_result, 0x00, 1000 );
3969  memset( result_str, 0x00, 1000 );
3970 
3971  ctx.len = 2048 / 8;
3972  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
3973  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
3974 
3975  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
3976 
3977  unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
3978  hash_len = unhexify( hash_result, "1234567890deadcafe" );
3979  unhexify( result_str, "605baf947c0de49e4f6a0dfb94a43ae318d5df8ed20ba4ba5a37a73fb009c5c9e5cce8b70a25b1c7580f389f0d7092485cdfa02208b70d33482edf07a7eafebdc54862ca0e0396a5a7d09991b9753eb1ffb6091971bb5789c6b121abbcd0a3cbaa39969fa7c28146fce96c6d03272e3793e5be8f5abfa9afcbebb986d7b3050604a2af4d3a40fa6c003781a539a60259d1e84f13322da9e538a49c369b83e7286bf7d30b64bbb773506705da5d5d5483a563a1ffacc902fb75c9a751b1e83cdc7a6db0470056883f48b5a5446b43b1d180ea12ba11a6a8d93b3b32a30156b6084b7fb142998a2a0d28014b84098ece7d9d5e4d55cc342ca26f5a0167a679dec8" );
3980 
3981  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_RAW, hash_len, hash_result, result_str ) == POLARSSL_ERR_RSA_VERIFY_FAILED );
3982 
3983  rsa_free( &ctx );
3984  }
3985  FCT_TEST_END();
3986 
3987 
3988  FCT_TEST_BGN(rsa_pkcs1_sign_9_invalid_digest_type)
3989  {
3990  unsigned char message_str[1000];
3991  unsigned char hash_result[1000];
3992  unsigned char output[1000];
3993  unsigned char output_str[1000];
3994  rsa_context ctx;
3995  mpi P1, Q1, H, G;
3996  int msg_len;
3997 
3998  mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
3999  rsa_init( &ctx, RSA_PKCS_V15, 0 );
4000 
4001  memset( message_str, 0x00, 1000 );
4002  memset( hash_result, 0x00, 1000 );
4003  memset( output, 0x00, 1000 );
4004  memset( output_str, 0x00, 1000 );
4005 
4006  ctx.len = 2048 / 8;
4007  fct_chk( mpi_read_string( &ctx.P, 16, "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) == 0 );
4008  fct_chk( mpi_read_string( &ctx.Q, 16, "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) == 0 );
4009  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
4010  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
4011 
4012  fct_chk( mpi_sub_int( &P1, &ctx.P, 1 ) == 0 );
4013  fct_chk( mpi_sub_int( &Q1, &ctx.Q, 1 ) == 0 );
4014  fct_chk( mpi_mul_mpi( &H, &P1, &Q1 ) == 0 );
4015  fct_chk( mpi_gcd( &G, &ctx.E, &H ) == 0 );
4016  fct_chk( mpi_inv_mod( &ctx.D , &ctx.E, &H ) == 0 );
4017  fct_chk( mpi_mod_mpi( &ctx.DP, &ctx.D, &P1 ) == 0 );
4018  fct_chk( mpi_mod_mpi( &ctx.DQ, &ctx.D, &Q1 ) == 0 );
4019  fct_chk( mpi_inv_mod( &ctx.QP, &ctx.Q, &ctx.P ) == 0 );
4020 
4021  fct_chk( rsa_check_privkey( &ctx ) == 0 );
4022 
4023  msg_len = unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
4024 
4025  switch( 1 )
4026  {
4027  #ifdef POLARSSL_MD2_C
4028  case SIG_RSA_MD2:
4029  md2( message_str, msg_len, hash_result );
4030  break;
4031  #endif
4032  #ifdef POLARSSL_MD4_C
4033  case SIG_RSA_MD4:
4034  md4( message_str, msg_len, hash_result );
4035  break;
4036  #endif
4037  #ifdef POLARSSL_MD5_C
4038  case SIG_RSA_MD5:
4039  md5( message_str, msg_len, hash_result );
4040  break;
4041  #endif
4042  #ifdef POLARSSL_SHA1_C
4043  case SIG_RSA_SHA1:
4044  sha1( message_str, msg_len, hash_result );
4045  break;
4046  #endif
4047  #ifdef POLARSSL_SHA2_C
4048  case SIG_RSA_SHA224:
4049  sha2( message_str, msg_len, hash_result, 1 );
4050  break;
4051  case SIG_RSA_SHA256:
4052  sha2( message_str, msg_len, hash_result, 0 );
4053  break;
4054  #endif
4055  #ifdef POLARSSL_SHA4_C
4056  case SIG_RSA_SHA384:
4057  sha4( message_str, msg_len, hash_result, 1 );
4058  break;
4059  case SIG_RSA_SHA512:
4060  sha4( message_str, msg_len, hash_result, 0 );
4061  break;
4062  #endif
4063  }
4064 
4065  fct_chk( rsa_pkcs1_sign( &ctx, NULL, NULL, RSA_PRIVATE, 1, 0, hash_result, output ) == POLARSSL_ERR_RSA_BAD_INPUT_DATA );
4067  {
4068  hexify( output_str, output, ctx.len );
4069 
4070  fct_chk( strcasecmp( (char *) output_str, "3bcf673c3b27f6e2ece4bb97c7a37161e6c6ee7419ef366efc3cfee0f15f415ff6d9d4390937386c6fec1771acba73f24ec6b0469ea8b88083f0b4e1b6069d7bf286e67cf94182a548663137e82a6e09c35de2c27779da0503f1f5bedfebadf2a875f17763a0564df4a6d945a5a3e46bc90fb692af3a55106aafc6b577587456ff8d49cfd5c299d7a2b776dbe4c1ae777b0f64aa3bab27689af32d6cc76157c7dc6900a3469e18a7d9b6bfe4951d1105a08864575e4f4ec05b3e053f9b7a2d5653ae085e50a63380d6bdd6f58ab378d7e0a2be708c559849891317089ab04c82d8bc589ea088b90b11dea5cf85856ff7e609cc1adb1d403beead4c126ff29021" ) == 0 );
4071  }
4072 
4073  mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
4074  rsa_free( &ctx );
4075  }
4076  FCT_TEST_END();
4077 
4078 
4079  FCT_TEST_BGN(rsa_pkcs1_sign_9_verify_invalid_digest_type)
4080  {
4081  unsigned char message_str[1000];
4082  unsigned char hash_result[1000];
4083  unsigned char result_str[1000];
4084  rsa_context ctx;
4085  int msg_len;
4086 
4087  rsa_init( &ctx, RSA_PKCS_V15, 0 );
4088  memset( message_str, 0x00, 1000 );
4089  memset( hash_result, 0x00, 1000 );
4090  memset( result_str, 0x00, 1000 );
4091 
4092  ctx.len = 2048 / 8;
4093  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
4094  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
4095 
4096  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
4097 
4098  msg_len = unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
4099  unhexify( result_str, "3bcf673c3b27f6e2ece4bb97c7a37161e6c6ee7419ef366efc3cfee0f15f415ff6d9d4390937386c6fec1771acba73f24ec6b0469ea8b88083f0b4e1b6069d7bf286e67cf94182a548663137e82a6e09c35de2c27779da0503f1f5bedfebadf2a875f17763a0564df4a6d945a5a3e46bc90fb692af3a55106aafc6b577587456ff8d49cfd5c299d7a2b776dbe4c1ae777b0f64aa3bab27689af32d6cc76157c7dc6900a3469e18a7d9b6bfe4951d1105a08864575e4f4ec05b3e053f9b7a2d5653ae085e50a63380d6bdd6f58ab378d7e0a2be708c559849891317089ab04c82d8bc589ea088b90b11dea5cf85856ff7e609cc1adb1d403beead4c126ff29021" );
4100 
4101  switch( 1 )
4102  {
4103  #ifdef POLARSSL_MD2_C
4104  case SIG_RSA_MD2:
4105  md2( message_str, msg_len, hash_result );
4106  break;
4107  #endif
4108  #ifdef POLARSSL_MD4_C
4109  case SIG_RSA_MD4:
4110  md4( message_str, msg_len, hash_result );
4111  break;
4112  #endif
4113  #ifdef POLARSSL_MD5_C
4114  case SIG_RSA_MD5:
4115  md5( message_str, msg_len, hash_result );
4116  break;
4117  #endif
4118  #ifdef POLARSSL_SHA1_C
4119  case SIG_RSA_SHA1:
4120  sha1( message_str, msg_len, hash_result );
4121  break;
4122  #endif
4123  #ifdef POLARSSL_SHA2_C
4124  case SIG_RSA_SHA224:
4125  sha2( message_str, msg_len, hash_result, 1 );
4126  break;
4127  case SIG_RSA_SHA256:
4128  sha2( message_str, msg_len, hash_result, 0 );
4129  break;
4130  #endif
4131  #ifdef POLARSSL_SHA4_C
4132  case SIG_RSA_SHA384:
4133  sha4( message_str, msg_len, hash_result, 1 );
4134  break;
4135  case SIG_RSA_SHA512:
4136  sha4( message_str, msg_len, hash_result, 0 );
4137  break;
4138  #endif
4139  }
4140 
4141  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, 1, 0, hash_result, result_str ) == POLARSSL_ERR_RSA_INVALID_PADDING );
4142 
4143  rsa_free( &ctx );
4144  }
4145  FCT_TEST_END();
4146 
4147 
4148  FCT_TEST_BGN(rsa_pkcs1_sign_8_invalid_padding_type)
4149  {
4150  unsigned char message_str[1000];
4151  unsigned char hash_result[1000];
4152  unsigned char output[1000];
4153  unsigned char output_str[1000];
4154  rsa_context ctx;
4155  mpi P1, Q1, H, G;
4156  int msg_len;
4157 
4158  mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
4159  rsa_init( &ctx, 2, 0 );
4160 
4161  memset( message_str, 0x00, 1000 );
4162  memset( hash_result, 0x00, 1000 );
4163  memset( output, 0x00, 1000 );
4164  memset( output_str, 0x00, 1000 );
4165 
4166  ctx.len = 2048 / 8;
4167  fct_chk( mpi_read_string( &ctx.P, 16, "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) == 0 );
4168  fct_chk( mpi_read_string( &ctx.Q, 16, "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) == 0 );
4169  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
4170  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
4171 
4172  fct_chk( mpi_sub_int( &P1, &ctx.P, 1 ) == 0 );
4173  fct_chk( mpi_sub_int( &Q1, &ctx.Q, 1 ) == 0 );
4174  fct_chk( mpi_mul_mpi( &H, &P1, &Q1 ) == 0 );
4175  fct_chk( mpi_gcd( &G, &ctx.E, &H ) == 0 );
4176  fct_chk( mpi_inv_mod( &ctx.D , &ctx.E, &H ) == 0 );
4177  fct_chk( mpi_mod_mpi( &ctx.DP, &ctx.D, &P1 ) == 0 );
4178  fct_chk( mpi_mod_mpi( &ctx.DQ, &ctx.D, &Q1 ) == 0 );
4179  fct_chk( mpi_inv_mod( &ctx.QP, &ctx.Q, &ctx.P ) == 0 );
4180 
4181  fct_chk( rsa_check_privkey( &ctx ) == 0 );
4182 
4183  msg_len = unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
4184 
4185  switch( SIG_RSA_MD5 )
4186  {
4187  #ifdef POLARSSL_MD2_C
4188  case SIG_RSA_MD2:
4189  md2( message_str, msg_len, hash_result );
4190  break;
4191  #endif
4192  #ifdef POLARSSL_MD4_C
4193  case SIG_RSA_MD4:
4194  md4( message_str, msg_len, hash_result );
4195  break;
4196  #endif
4197  #ifdef POLARSSL_MD5_C
4198  case SIG_RSA_MD5:
4199  md5( message_str, msg_len, hash_result );
4200  break;
4201  #endif
4202  #ifdef POLARSSL_SHA1_C
4203  case SIG_RSA_SHA1:
4204  sha1( message_str, msg_len, hash_result );
4205  break;
4206  #endif
4207  #ifdef POLARSSL_SHA2_C
4208  case SIG_RSA_SHA224:
4209  sha2( message_str, msg_len, hash_result, 1 );
4210  break;
4211  case SIG_RSA_SHA256:
4212  sha2( message_str, msg_len, hash_result, 0 );
4213  break;
4214  #endif
4215  #ifdef POLARSSL_SHA4_C
4216  case SIG_RSA_SHA384:
4217  sha4( message_str, msg_len, hash_result, 1 );
4218  break;
4219  case SIG_RSA_SHA512:
4220  sha4( message_str, msg_len, hash_result, 0 );
4221  break;
4222  #endif
4223  }
4224 
4225  fct_chk( rsa_pkcs1_sign( &ctx, NULL, NULL, RSA_PRIVATE, SIG_RSA_MD5, 0, hash_result, output ) == POLARSSL_ERR_RSA_INVALID_PADDING );
4227  {
4228  hexify( output_str, output, ctx.len );
4229 
4230  fct_chk( strcasecmp( (char *) output_str, "3bcf673c3b27f6e2ece4bb97c7a37161e6c6ee7419ef366efc3cfee0f15f415ff6d9d4390937386c6fec1771acba73f24ec6b0469ea8b88083f0b4e1b6069d7bf286e67cf94182a548663137e82a6e09c35de2c27779da0503f1f5bedfebadf2a875f17763a0564df4a6d945a5a3e46bc90fb692af3a55106aafc6b577587456ff8d49cfd5c299d7a2b776dbe4c1ae777b0f64aa3bab27689af32d6cc76157c7dc6900a3469e18a7d9b6bfe4951d1105a08864575e4f4ec05b3e053f9b7a2d5653ae085e50a63380d6bdd6f58ab378d7e0a2be708c559849891317089ab04c82d8bc589ea088b90b11dea5cf85856ff7e609cc1adb1d403beead4c126ff29021" ) == 0 );
4231  }
4232 
4233  mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
4234  rsa_free( &ctx );
4235  }
4236  FCT_TEST_END();
4237 
4238 
4239  FCT_TEST_BGN(rsa_pkcs1_sign_8_verify_invalid_padding_type)
4240  {
4241  unsigned char message_str[1000];
4242  unsigned char hash_result[1000];
4243  unsigned char result_str[1000];
4244  rsa_context ctx;
4245  int msg_len;
4246 
4247  rsa_init( &ctx, 1, 0 );
4248  memset( message_str, 0x00, 1000 );
4249  memset( hash_result, 0x00, 1000 );
4250  memset( result_str, 0x00, 1000 );
4251 
4252  ctx.len = 2048 / 8;
4253  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
4254  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
4255 
4256  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
4257 
4258  msg_len = unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
4259  unhexify( result_str, "3bcf673c3b27f6e2ece4bb97c7a37161e6c6ee7419ef366efc3cfee0f15f415ff6d9d4390937386c6fec1771acba73f24ec6b0469ea8b88083f0b4e1b6069d7bf286e67cf94182a548663137e82a6e09c35de2c27779da0503f1f5bedfebadf2a875f17763a0564df4a6d945a5a3e46bc90fb692af3a55106aafc6b577587456ff8d49cfd5c299d7a2b776dbe4c1ae777b0f64aa3bab27689af32d6cc76157c7dc6900a3469e18a7d9b6bfe4951d1105a08864575e4f4ec05b3e053f9b7a2d5653ae085e50a63380d6bdd6f58ab378d7e0a2be708c559849891317089ab04c82d8bc589ea088b90b11dea5cf85856ff7e609cc1adb1d403beead4c126ff29021" );
4260 
4261  switch( SIG_RSA_MD5 )
4262  {
4263  #ifdef POLARSSL_MD2_C
4264  case SIG_RSA_MD2:
4265  md2( message_str, msg_len, hash_result );
4266  break;
4267  #endif
4268  #ifdef POLARSSL_MD4_C
4269  case SIG_RSA_MD4:
4270  md4( message_str, msg_len, hash_result );
4271  break;
4272  #endif
4273  #ifdef POLARSSL_MD5_C
4274  case SIG_RSA_MD5:
4275  md5( message_str, msg_len, hash_result );
4276  break;
4277  #endif
4278  #ifdef POLARSSL_SHA1_C
4279  case SIG_RSA_SHA1:
4280  sha1( message_str, msg_len, hash_result );
4281  break;
4282  #endif
4283  #ifdef POLARSSL_SHA2_C
4284  case SIG_RSA_SHA224:
4285  sha2( message_str, msg_len, hash_result, 1 );
4286  break;
4287  case SIG_RSA_SHA256:
4288  sha2( message_str, msg_len, hash_result, 0 );
4289  break;
4290  #endif
4291  #ifdef POLARSSL_SHA4_C
4292  case SIG_RSA_SHA384:
4293  sha4( message_str, msg_len, hash_result, 1 );
4294  break;
4295  case SIG_RSA_SHA512:
4296  sha4( message_str, msg_len, hash_result, 0 );
4297  break;
4298  #endif
4299  }
4300 
4301  fct_chk( rsa_pkcs1_verify( &ctx, RSA_PUBLIC, SIG_RSA_MD5, 0, hash_result, result_str ) == POLARSSL_ERR_RSA_INVALID_PADDING );
4302 
4303  rsa_free( &ctx );
4304  }
4305  FCT_TEST_END();
4306 
4307 
4308  FCT_TEST_BGN(rsa_pkcs1_encrypt_1)
4309  {
4310  unsigned char message_str[1000];
4311  unsigned char output[1000];
4312  unsigned char output_str[1000];
4313  rsa_context ctx;
4314  size_t msg_len;
4315  rnd_pseudo_info rnd_info;
4316 
4317  memset( &rnd_info, 0, sizeof( rnd_pseudo_info ) );
4318 
4319  rsa_init( &ctx, RSA_PKCS_V15, 0 );
4320  memset( message_str, 0x00, 1000 );
4321  memset( output, 0x00, 1000 );
4322  memset( output_str, 0x00, 1000 );
4323 
4324  ctx.len = 2048 / 8;
4325  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
4326  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
4327 
4328  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
4329 
4330  msg_len = unhexify( message_str, "4E636AF98E40F3ADCFCCB698F4E80B9F" );
4331 
4332  fct_chk( rsa_pkcs1_encrypt( &ctx, &rnd_pseudo_rand, &rnd_info, RSA_PUBLIC, msg_len, message_str, output ) == 0 );
4333  if( 0 == 0 )
4334  {
4335  hexify( output_str, output, ctx.len );
4336 
4337  fct_chk( strcasecmp( (char *) output_str, "b0c0b193ba4a5b4502bfacd1a9c2697da5510f3e3ab7274cf404418afd2c62c89b98d83bbc21c8c1bf1afe6d8bf40425e053e9c03e03a3be0edbe1eda073fade1cc286cc0305a493d98fe795634c3cad7feb513edb742d66d910c87d07f6b0055c3488bb262b5fd1ce8747af64801fb39d2d3a3e57086ffe55ab8d0a2ca86975629a0f85767a4990c532a7c2dab1647997ebb234d0b28a0008bfebfc905e7ba5b30b60566a5e0190417465efdbf549934b8f0c5c9f36b7c5b6373a47ae553ced0608a161b1b70dfa509375cf7a3598223a6d7b7a1d1a06ac74d345a9bb7c0e44c8388858a4f1d8115f2bd769ffa69020385fa286302c80e950f9e2751308666c" ) == 0 );
4338  }
4339 
4340  rsa_free( &ctx );
4341  }
4342  FCT_TEST_END();
4343 
4344 
4345  FCT_TEST_BGN(rsa_pkcs1_decrypt_1_verify)
4346  {
4347  unsigned char message_str[1000];
4348  unsigned char output[1000];
4349  unsigned char output_str[1000];
4350  rsa_context ctx;
4351  mpi P1, Q1, H, G;
4352  size_t output_len;
4353 
4354  mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
4355  rsa_init( &ctx, RSA_PKCS_V15, 0 );
4356 
4357  memset( message_str, 0x00, 1000 );
4358  memset( output, 0x00, 1000 );
4359  memset( output_str, 0x00, 1000 );
4360 
4361  ctx.len = 2048 / 8;
4362  fct_chk( mpi_read_string( &ctx.P, 16, "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) == 0 );
4363  fct_chk( mpi_read_string( &ctx.Q, 16, "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) == 0 );
4364  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
4365  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
4366 
4367  fct_chk( mpi_sub_int( &P1, &ctx.P, 1 ) == 0 );
4368  fct_chk( mpi_sub_int( &Q1, &ctx.Q, 1 ) == 0 );
4369  fct_chk( mpi_mul_mpi( &H, &P1, &Q1 ) == 0 );
4370  fct_chk( mpi_gcd( &G, &ctx.E, &H ) == 0 );
4371  fct_chk( mpi_inv_mod( &ctx.D , &ctx.E, &H ) == 0 );
4372  fct_chk( mpi_mod_mpi( &ctx.DP, &ctx.D, &P1 ) == 0 );
4373  fct_chk( mpi_mod_mpi( &ctx.DQ, &ctx.D, &Q1 ) == 0 );
4374  fct_chk( mpi_inv_mod( &ctx.QP, &ctx.Q, &ctx.P ) == 0 );
4375 
4376  fct_chk( rsa_check_privkey( &ctx ) == 0 );
4377 
4378  unhexify( message_str, "a42eda41e56235e666e7faaa77100197f657288a1bf183e4820f0c37ce2c456b960278d6003e0bbcd4be4a969f8e8fd9231e1f492414f00ed09844994c86ec32db7cde3bec7f0c3dbf6ae55baeb2712fa609f5fc3207a824eb3dace31849cd6a6084318523912bccb84cf42e3c6d6d1685131d69bb545acec827d2b0dfdd5568b7dcc4f5a11d6916583fefa689d367f8c9e1d95dcd2240895a9470b0c1730f97cd6e8546860bd254801769f54be96e16362ddcbf34d56035028890199e0f48db38642cb66a4181e028a6443a404fea284ce02b4614b683367d40874e505611d23142d49f06feea831d52d347b13610b413c4efc43a6de9f0b08d2a951dc503b6" );
4379  output_len = 0;
4380 
4381  fct_chk( rsa_pkcs1_decrypt( &ctx, RSA_PRIVATE, &output_len, message_str, output, 1000 ) == 0 );
4382  if( 0 == 0 )
4383  {
4384  hexify( output_str, output, ctx.len );
4385 
4386  fct_chk( strncasecmp( (char *) output_str, "4E636AF98E40F3ADCFCCB698F4E80B9F", strlen( "4E636AF98E40F3ADCFCCB698F4E80B9F" ) ) == 0 );
4387  }
4388 
4389  mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
4390  rsa_free( &ctx );
4391  }
4392  FCT_TEST_END();
4393 
4394 
4395  FCT_TEST_BGN(rsa_pkcs1_encrypt_2_data_too_large)
4396  {
4397  unsigned char message_str[1000];
4398  unsigned char output[1000];
4399  unsigned char output_str[1000];
4400  rsa_context ctx;
4401  size_t msg_len;
4402  rnd_pseudo_info rnd_info;
4403 
4404  memset( &rnd_info, 0, sizeof( rnd_pseudo_info ) );
4405 
4406  rsa_init( &ctx, RSA_PKCS_V15, 0 );
4407  memset( message_str, 0x00, 1000 );
4408  memset( output, 0x00, 1000 );
4409  memset( output_str, 0x00, 1000 );
4410 
4411  ctx.len = 2048 / 8;
4412  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
4413  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
4414 
4415  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
4416 
4417  msg_len = unhexify( message_str, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" );
4418 
4419  fct_chk( rsa_pkcs1_encrypt( &ctx, &rnd_pseudo_rand, &rnd_info, RSA_PUBLIC, msg_len, message_str, output ) == POLARSSL_ERR_RSA_BAD_INPUT_DATA );
4421  {
4422  hexify( output_str, output, ctx.len );
4423 
4424  fct_chk( strcasecmp( (char *) output_str, "a42eda41e56235e666e7faaa77100197f657288a1bf183e4820f0c37ce2c456b960278d6003e0bbcd4be4a969f8e8fd9231e1f492414f00ed09844994c86ec32db7cde3bec7f0c3dbf6ae55baeb2712fa609f5fc3207a824eb3dace31849cd6a6084318523912bccb84cf42e3c6d6d1685131d69bb545acec827d2b0dfdd5568b7dcc4f5a11d6916583fefa689d367f8c9e1d95dcd2240895a9470b0c1730f97cd6e8546860bd254801769f54be96e16362ddcbf34d56035028890199e0f48db38642cb66a4181e028a6443a404fea284ce02b4614b683367d40874e505611d23142d49f06feea831d52d347b13610b413c4efc43a6de9f0b08d2a951dc503b6" ) == 0 );
4425  }
4426 
4427  rsa_free( &ctx );
4428  }
4429  FCT_TEST_END();
4430 
4431 
4432  FCT_TEST_BGN(rsa_pkcs1_decrypt_2_data_too_small)
4433  {
4434  unsigned char message_str[1000];
4435  unsigned char output[1000];
4436  unsigned char output_str[1000];
4437  rsa_context ctx;
4438  mpi P1, Q1, H, G;
4439  size_t output_len;
4440 
4441  mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
4442  rsa_init( &ctx, RSA_PKCS_V15, 0 );
4443 
4444  memset( message_str, 0x00, 1000 );
4445  memset( output, 0x00, 1000 );
4446  memset( output_str, 0x00, 1000 );
4447 
4448  ctx.len = 2048 / 8;
4449  fct_chk( mpi_read_string( &ctx.P, 16, "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) == 0 );
4450  fct_chk( mpi_read_string( &ctx.Q, 16, "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) == 0 );
4451  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
4452  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
4453 
4454  fct_chk( mpi_sub_int( &P1, &ctx.P, 1 ) == 0 );
4455  fct_chk( mpi_sub_int( &Q1, &ctx.Q, 1 ) == 0 );
4456  fct_chk( mpi_mul_mpi( &H, &P1, &Q1 ) == 0 );
4457  fct_chk( mpi_gcd( &G, &ctx.E, &H ) == 0 );
4458  fct_chk( mpi_inv_mod( &ctx.D , &ctx.E, &H ) == 0 );
4459  fct_chk( mpi_mod_mpi( &ctx.DP, &ctx.D, &P1 ) == 0 );
4460  fct_chk( mpi_mod_mpi( &ctx.DQ, &ctx.D, &Q1 ) == 0 );
4461  fct_chk( mpi_inv_mod( &ctx.QP, &ctx.Q, &ctx.P ) == 0 );
4462 
4463  fct_chk( rsa_check_privkey( &ctx ) == 0 );
4464 
4465  unhexify( message_str, "deadbeafcafedeadbeeffedcba9876" );
4466  output_len = 0;
4467 
4468  fct_chk( rsa_pkcs1_decrypt( &ctx, RSA_PRIVATE, &output_len, message_str, output, 1000 ) == POLARSSL_ERR_RSA_BAD_INPUT_DATA );
4470  {
4471  hexify( output_str, output, ctx.len );
4472 
4473  fct_chk( strncasecmp( (char *) output_str, "4E636AF98E40F3ADCFCCB698F4E80B9F", strlen( "4E636AF98E40F3ADCFCCB698F4E80B9F" ) ) == 0 );
4474  }
4475 
4476  mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
4477  rsa_free( &ctx );
4478  }
4479  FCT_TEST_END();
4480 
4481 
4482  FCT_TEST_BGN(rsa_pkcs1_encrypt_3_invalid_padding_mode)
4483  {
4484  unsigned char message_str[1000];
4485  unsigned char output[1000];
4486  unsigned char output_str[1000];
4487  rsa_context ctx;
4488  size_t msg_len;
4489  rnd_pseudo_info rnd_info;
4490 
4491  memset( &rnd_info, 0, sizeof( rnd_pseudo_info ) );
4492 
4493  rsa_init( &ctx, 2, 0 );
4494  memset( message_str, 0x00, 1000 );
4495  memset( output, 0x00, 1000 );
4496  memset( output_str, 0x00, 1000 );
4497 
4498  ctx.len = 2048 / 8;
4499  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
4500  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
4501 
4502  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
4503 
4504  msg_len = unhexify( message_str, "4E636AF98E40F3ADCFCCB698F4E80B9F" );
4505 
4506  fct_chk( rsa_pkcs1_encrypt( &ctx, &rnd_pseudo_rand, &rnd_info, RSA_PUBLIC, msg_len, message_str, output ) == POLARSSL_ERR_RSA_INVALID_PADDING );
4508  {
4509  hexify( output_str, output, ctx.len );
4510 
4511  fct_chk( strcasecmp( (char *) output_str, "a42eda41e56235e666e7faaa77100197f657288a1bf183e4820f0c37ce2c456b960278d6003e0bbcd4be4a969f8e8fd9231e1f492414f00ed09844994c86ec32db7cde3bec7f0c3dbf6ae55baeb2712fa609f5fc3207a824eb3dace31849cd6a6084318523912bccb84cf42e3c6d6d1685131d69bb545acec827d2b0dfdd5568b7dcc4f5a11d6916583fefa689d367f8c9e1d95dcd2240895a9470b0c1730f97cd6e8546860bd254801769f54be96e16362ddcbf34d56035028890199e0f48db38642cb66a4181e028a6443a404fea284ce02b4614b683367d40874e505611d23142d49f06feea831d52d347b13610b413c4efc43a6de9f0b08d2a951dc503b6" ) == 0 );
4512  }
4513 
4514  rsa_free( &ctx );
4515  }
4516  FCT_TEST_END();
4517 
4518 
4519  FCT_TEST_BGN(rsa_pkcs1_decrypt_3_invalid_padding_mode)
4520  {
4521  unsigned char message_str[1000];
4522  unsigned char output[1000];
4523  unsigned char output_str[1000];
4524  rsa_context ctx;
4525  mpi P1, Q1, H, G;
4526  size_t output_len;
4527 
4528  mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
4529  rsa_init( &ctx, 2, 0 );
4530 
4531  memset( message_str, 0x00, 1000 );
4532  memset( output, 0x00, 1000 );
4533  memset( output_str, 0x00, 1000 );
4534 
4535  ctx.len = 2048 / 8;
4536  fct_chk( mpi_read_string( &ctx.P, 16, "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) == 0 );
4537  fct_chk( mpi_read_string( &ctx.Q, 16, "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) == 0 );
4538  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
4539  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
4540 
4541  fct_chk( mpi_sub_int( &P1, &ctx.P, 1 ) == 0 );
4542  fct_chk( mpi_sub_int( &Q1, &ctx.Q, 1 ) == 0 );
4543  fct_chk( mpi_mul_mpi( &H, &P1, &Q1 ) == 0 );
4544  fct_chk( mpi_gcd( &G, &ctx.E, &H ) == 0 );
4545  fct_chk( mpi_inv_mod( &ctx.D , &ctx.E, &H ) == 0 );
4546  fct_chk( mpi_mod_mpi( &ctx.DP, &ctx.D, &P1 ) == 0 );
4547  fct_chk( mpi_mod_mpi( &ctx.DQ, &ctx.D, &Q1 ) == 0 );
4548  fct_chk( mpi_inv_mod( &ctx.QP, &ctx.Q, &ctx.P ) == 0 );
4549 
4550  fct_chk( rsa_check_privkey( &ctx ) == 0 );
4551 
4552  unhexify( message_str, "a42eda41e56235e666e7faaa77100197f657288a1bf183e4820f0c37ce2c456b960278d6003e0bbcd4be4a969f8e8fd9231e1f492414f00ed09844994c86ec32db7cde3bec7f0c3dbf6ae55baeb2712fa609f5fc3207a824eb3dace31849cd6a6084318523912bccb84cf42e3c6d6d1685131d69bb545acec827d2b0dfdd5568b7dcc4f5a11d6916583fefa689d367f8c9e1d95dcd2240895a9470b0c1730f97cd6e8546860bd254801769f54be96e16362ddcbf34d56035028890199e0f48db38642cb66a4181e028a6443a404fea284ce02b4614b683367d40874e505611d23142d49f06feea831d52d347b13610b413c4efc43a6de9f0b08d2a951dc503b6" );
4553  output_len = 0;
4554 
4555  fct_chk( rsa_pkcs1_decrypt( &ctx, RSA_PRIVATE, &output_len, message_str, output, 1000 ) == POLARSSL_ERR_RSA_INVALID_PADDING );
4557  {
4558  hexify( output_str, output, ctx.len );
4559 
4560  fct_chk( strncasecmp( (char *) output_str, "4E636AF98E40F3ADCFCCB698F4E80B9F", strlen( "4E636AF98E40F3ADCFCCB698F4E80B9F" ) ) == 0 );
4561  }
4562 
4563  mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
4564  rsa_free( &ctx );
4565  }
4566  FCT_TEST_END();
4567 
4568 
4569  FCT_TEST_BGN(rsa_pkcs1_decrypt_4_output_buffer_too_small)
4570  {
4571  unsigned char message_str[1000];
4572  unsigned char output[1000];
4573  unsigned char output_str[1000];
4574  rsa_context ctx;
4575  mpi P1, Q1, H, G;
4576  size_t output_len;
4577 
4578  mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
4579  rsa_init( &ctx, RSA_PKCS_V15, 0 );
4580 
4581  memset( message_str, 0x00, 1000 );
4582  memset( output, 0x00, 1000 );
4583  memset( output_str, 0x00, 1000 );
4584 
4585  ctx.len = 2048 / 8;
4586  fct_chk( mpi_read_string( &ctx.P, 16, "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) == 0 );
4587  fct_chk( mpi_read_string( &ctx.Q, 16, "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) == 0 );
4588  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
4589  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
4590 
4591  fct_chk( mpi_sub_int( &P1, &ctx.P, 1 ) == 0 );
4592  fct_chk( mpi_sub_int( &Q1, &ctx.Q, 1 ) == 0 );
4593  fct_chk( mpi_mul_mpi( &H, &P1, &Q1 ) == 0 );
4594  fct_chk( mpi_gcd( &G, &ctx.E, &H ) == 0 );
4595  fct_chk( mpi_inv_mod( &ctx.D , &ctx.E, &H ) == 0 );
4596  fct_chk( mpi_mod_mpi( &ctx.DP, &ctx.D, &P1 ) == 0 );
4597  fct_chk( mpi_mod_mpi( &ctx.DQ, &ctx.D, &Q1 ) == 0 );
4598  fct_chk( mpi_inv_mod( &ctx.QP, &ctx.Q, &ctx.P ) == 0 );
4599 
4600  fct_chk( rsa_check_privkey( &ctx ) == 0 );
4601 
4602  unhexify( message_str, "a42eda41e56235e666e7faaa77100197f657288a1bf183e4820f0c37ce2c456b960278d6003e0bbcd4be4a969f8e8fd9231e1f492414f00ed09844994c86ec32db7cde3bec7f0c3dbf6ae55baeb2712fa609f5fc3207a824eb3dace31849cd6a6084318523912bccb84cf42e3c6d6d1685131d69bb545acec827d2b0dfdd5568b7dcc4f5a11d6916583fefa689d367f8c9e1d95dcd2240895a9470b0c1730f97cd6e8546860bd254801769f54be96e16362ddcbf34d56035028890199e0f48db38642cb66a4181e028a6443a404fea284ce02b4614b683367d40874e505611d23142d49f06feea831d52d347b13610b413c4efc43a6de9f0b08d2a951dc503b6" );
4603  output_len = 0;
4604 
4605  fct_chk( rsa_pkcs1_decrypt( &ctx, RSA_PRIVATE, &output_len, message_str, output, 15 ) == POLARSSL_ERR_RSA_OUTPUT_TOO_LARGE );
4607  {
4608  hexify( output_str, output, ctx.len );
4609 
4610  fct_chk( strncasecmp( (char *) output_str, "4E636AF98E40F3ADCFCCB698F4E80B9F", strlen( "4E636AF98E40F3ADCFCCB698F4E80B9F" ) ) == 0 );
4611  }
4612 
4613  mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
4614  rsa_free( &ctx );
4615  }
4616  FCT_TEST_END();
4617 
4618 
4619  FCT_TEST_BGN(rsa_check_empty_private_key)
4620  {
4621  rsa_context ctx;
4622  memset( &ctx, 0x00, sizeof( rsa_context ) );
4623 
4625  }
4626  FCT_TEST_END();
4627 
4628 
4629  FCT_TEST_BGN(rsa_check_private_key_1_correct)
4630  {
4631  rsa_context ctx;
4632 
4633  rsa_init( &ctx, RSA_PKCS_V15, 0 );
4634 
4635  ctx.len = 2048 / 8;
4636  if( strlen( "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) )
4637  {
4638  fct_chk( mpi_read_string( &ctx.P, 16, "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) == 0 );
4639  }
4640  if( strlen( "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) )
4641  {
4642  fct_chk( mpi_read_string( &ctx.Q, 16, "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) == 0 );
4643  }
4644  if( strlen( "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) )
4645  {
4646  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
4647  }
4648  if( strlen( "3" ) )
4649  {
4650  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
4651  }
4652  if( strlen( "77B1D99300D6A54E864962DA09AE10CF19A7FB888456BC2672B72AEA52B204914493D16C184AD201EC3F762E1FBD8702BA796EF953D9EA2F26300D285264F11B0C8301D0207FEB1E2C984445C899B0ACEBAA74EF014DD1D4BDDB43202C08D2FF9692D8D788478DEC829EB52AFB5AE068FBDBAC499A27FACECC391E75C936D55F07BB45EE184DAB45808E15722502F279F89B38C1CB292557E5063597F52C75D61001EDC33F4739353E33E56AD273B067C1A2760208529EA421774A5FFFCB3423B1E0051E7702A55D80CBF2141569F18F87BFF538A1DA8EDBB2693A539F68E0D62D77743F89EACF3B1723BDB25CE2F333FA63CACF0E67DF1A431893BB9B352FCB" ) )
4653  {
4654  fct_chk( mpi_read_string( &ctx.D, 16, "77B1D99300D6A54E864962DA09AE10CF19A7FB888456BC2672B72AEA52B204914493D16C184AD201EC3F762E1FBD8702BA796EF953D9EA2F26300D285264F11B0C8301D0207FEB1E2C984445C899B0ACEBAA74EF014DD1D4BDDB43202C08D2FF9692D8D788478DEC829EB52AFB5AE068FBDBAC499A27FACECC391E75C936D55F07BB45EE184DAB45808E15722502F279F89B38C1CB292557E5063597F52C75D61001EDC33F4739353E33E56AD273B067C1A2760208529EA421774A5FFFCB3423B1E0051E7702A55D80CBF2141569F18F87BFF538A1DA8EDBB2693A539F68E0D62D77743F89EACF3B1723BDB25CE2F333FA63CACF0E67DF1A431893BB9B352FCB" ) == 0 );
4655  }
4656  if( strlen( "9A66CF76572A71A17475794FA1C8C70D987E581E990D772BB27C77C53FF1ECBB31260E9EDAFAEBC79991807E48918EAB8C3A5F03A600F30C69511546AE788EDF53168E2D035D300EDCD5E4BF3AA2A6D603EA0A7BD11E1C1089657306DF8A64E7F1BC6B266B825C1A6C5F0FC85775F4CF7ACD63367E42EAFE46511D58AD6DFE0F" ) )
4657  {
4658  fct_chk( mpi_read_string( &ctx.DP, 16, "9A66CF76572A71A17475794FA1C8C70D987E581E990D772BB27C77C53FF1ECBB31260E9EDAFAEBC79991807E48918EAB8C3A5F03A600F30C69511546AE788EDF53168E2D035D300EDCD5E4BF3AA2A6D603EA0A7BD11E1C1089657306DF8A64E7F1BC6B266B825C1A6C5F0FC85775F4CF7ACD63367E42EAFE46511D58AD6DFE0F" ) == 0 );
4659  }
4660  if( strlen( "844DBDD20925D9164F9A1E2F707076C261CCA8337D0241392B38AE3C12342F3AC14F8FD6DF4A1C36839662BD0D227344CD55A32AE5DBD2309A9A2B8A2C82BE6DDDDCE81D1B694775D9047AA765CA0C6E1BB8E61C8B7BE27ED711E8EE2FEAD87F3491F76A6D2262C14189EACDFD4CEFE0BF9D0A5B49857E0ED22CBEB98DC8D45B" ) )
4661  {
4662  fct_chk( mpi_read_string( &ctx.DQ, 16, "844DBDD20925D9164F9A1E2F707076C261CCA8337D0241392B38AE3C12342F3AC14F8FD6DF4A1C36839662BD0D227344CD55A32AE5DBD2309A9A2B8A2C82BE6DDDDCE81D1B694775D9047AA765CA0C6E1BB8E61C8B7BE27ED711E8EE2FEAD87F3491F76A6D2262C14189EACDFD4CEFE0BF9D0A5B49857E0ED22CBEB98DC8D45B" ) == 0 );
4663  }
4664  if( strlen( "4951A7B174DF972C37BADCC38457B5EDD1F078BC613E75CE25E08814E12461C7A1C189A70EB8138294298D141244C7A9DE31AB4F6D38B40B04D6353CD30F77ADBF66BBDE41C7BE463C5E30AAA3F7BAD6CEE99506DEAAFA2F335C1B1C5C88B8ABB0D0387EE0D1B4E7027F7F085A025CEDB5CCE18B88C0462F1C3C910D47C0D4AB" ) )
4665  {
4666  fct_chk( mpi_read_string( &ctx.QP, 16, "4951A7B174DF972C37BADCC38457B5EDD1F078BC613E75CE25E08814E12461C7A1C189A70EB8138294298D141244C7A9DE31AB4F6D38B40B04D6353CD30F77ADBF66BBDE41C7BE463C5E30AAA3F7BAD6CEE99506DEAAFA2F335C1B1C5C88B8ABB0D0387EE0D1B4E7027F7F085A025CEDB5CCE18B88C0462F1C3C910D47C0D4AB" ) == 0 );
4667  }
4668 
4669  fct_chk( rsa_check_privkey( &ctx ) == 0 );
4670 
4671  rsa_free( &ctx );
4672  }
4673  FCT_TEST_END();
4674 
4675 
4676  FCT_TEST_BGN(rsa_check_private_key_2_no_p)
4677  {
4678  rsa_context ctx;
4679 
4680  rsa_init( &ctx, RSA_PKCS_V15, 0 );
4681 
4682  ctx.len = 2048 / 8;
4683  if( strlen( "" ) )
4684  {
4685  fct_chk( mpi_read_string( &ctx.P, 16, "" ) == 0 );
4686  }
4687  if( strlen( "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) )
4688  {
4689  fct_chk( mpi_read_string( &ctx.Q, 16, "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) == 0 );
4690  }
4691  if( strlen( "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) )
4692  {
4693  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
4694  }
4695  if( strlen( "3" ) )
4696  {
4697  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
4698  }
4699  if( strlen( "77B1D99300D6A54E864962DA09AE10CF19A7FB888456BC2672B72AEA52B204914493D16C184AD201EC3F762E1FBD8702BA796EF953D9EA2F26300D285264F11B0C8301D0207FEB1E2C984445C899B0ACEBAA74EF014DD1D4BDDB43202C08D2FF9692D8D788478DEC829EB52AFB5AE068FBDBAC499A27FACECC391E75C936D55F07BB45EE184DAB45808E15722502F279F89B38C1CB292557E5063597F52C75D61001EDC33F4739353E33E56AD273B067C1A2760208529EA421774A5FFFCB3423B1E0051E7702A55D80CBF2141569F18F87BFF538A1DA8EDBB2693A539F68E0D62D77743F89EACF3B1723BDB25CE2F333FA63CACF0E67DF1A431893BB9B352FCB" ) )
4700  {
4701  fct_chk( mpi_read_string( &ctx.D, 16, "77B1D99300D6A54E864962DA09AE10CF19A7FB888456BC2672B72AEA52B204914493D16C184AD201EC3F762E1FBD8702BA796EF953D9EA2F26300D285264F11B0C8301D0207FEB1E2C984445C899B0ACEBAA74EF014DD1D4BDDB43202C08D2FF9692D8D788478DEC829EB52AFB5AE068FBDBAC499A27FACECC391E75C936D55F07BB45EE184DAB45808E15722502F279F89B38C1CB292557E5063597F52C75D61001EDC33F4739353E33E56AD273B067C1A2760208529EA421774A5FFFCB3423B1E0051E7702A55D80CBF2141569F18F87BFF538A1DA8EDBB2693A539F68E0D62D77743F89EACF3B1723BDB25CE2F333FA63CACF0E67DF1A431893BB9B352FCB" ) == 0 );
4702  }
4703  if( strlen( "9A66CF76572A71A17475794FA1C8C70D987E581E990D772BB27C77C53FF1ECBB31260E9EDAFAEBC79991807E48918EAB8C3A5F03A600F30C69511546AE788EDF53168E2D035D300EDCD5E4BF3AA2A6D603EA0A7BD11E1C1089657306DF8A64E7F1BC6B266B825C1A6C5F0FC85775F4CF7ACD63367E42EAFE46511D58AD6DFE0F" ) )
4704  {
4705  fct_chk( mpi_read_string( &ctx.DP, 16, "9A66CF76572A71A17475794FA1C8C70D987E581E990D772BB27C77C53FF1ECBB31260E9EDAFAEBC79991807E48918EAB8C3A5F03A600F30C69511546AE788EDF53168E2D035D300EDCD5E4BF3AA2A6D603EA0A7BD11E1C1089657306DF8A64E7F1BC6B266B825C1A6C5F0FC85775F4CF7ACD63367E42EAFE46511D58AD6DFE0F" ) == 0 );
4706  }
4707  if( strlen( "844DBDD20925D9164F9A1E2F707076C261CCA8337D0241392B38AE3C12342F3AC14F8FD6DF4A1C36839662BD0D227344CD55A32AE5DBD2309A9A2B8A2C82BE6DDDDCE81D1B694775D9047AA765CA0C6E1BB8E61C8B7BE27ED711E8EE2FEAD87F3491F76A6D2262C14189EACDFD4CEFE0BF9D0A5B49857E0ED22CBEB98DC8D45B" ) )
4708  {
4709  fct_chk( mpi_read_string( &ctx.DQ, 16, "844DBDD20925D9164F9A1E2F707076C261CCA8337D0241392B38AE3C12342F3AC14F8FD6DF4A1C36839662BD0D227344CD55A32AE5DBD2309A9A2B8A2C82BE6DDDDCE81D1B694775D9047AA765CA0C6E1BB8E61C8B7BE27ED711E8EE2FEAD87F3491F76A6D2262C14189EACDFD4CEFE0BF9D0A5B49857E0ED22CBEB98DC8D45B" ) == 0 );
4710  }
4711  if( strlen( "4951A7B174DF972C37BADCC38457B5EDD1F078BC613E75CE25E08814E12461C7A1C189A70EB8138294298D141244C7A9DE31AB4F6D38B40B04D6353CD30F77ADBF66BBDE41C7BE463C5E30AAA3F7BAD6CEE99506DEAAFA2F335C1B1C5C88B8ABB0D0387EE0D1B4E7027F7F085A025CEDB5CCE18B88C0462F1C3C910D47C0D4AB" ) )
4712  {
4713  fct_chk( mpi_read_string( &ctx.QP, 16, "4951A7B174DF972C37BADCC38457B5EDD1F078BC613E75CE25E08814E12461C7A1C189A70EB8138294298D141244C7A9DE31AB4F6D38B40B04D6353CD30F77ADBF66BBDE41C7BE463C5E30AAA3F7BAD6CEE99506DEAAFA2F335C1B1C5C88B8ABB0D0387EE0D1B4E7027F7F085A025CEDB5CCE18B88C0462F1C3C910D47C0D4AB" ) == 0 );
4714  }
4715 
4717 
4718  rsa_free( &ctx );
4719  }
4720  FCT_TEST_END();
4721 
4722 
4723  FCT_TEST_BGN(rsa_check_private_key_3_no_q)
4724  {
4725  rsa_context ctx;
4726 
4727  rsa_init( &ctx, RSA_PKCS_V15, 0 );
4728 
4729  ctx.len = 2048 / 8;
4730  if( strlen( "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) )
4731  {
4732  fct_chk( mpi_read_string( &ctx.P, 16, "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) == 0 );
4733  }
4734  if( strlen( "" ) )
4735  {
4736  fct_chk( mpi_read_string( &ctx.Q, 16, "" ) == 0 );
4737  }
4738  if( strlen( "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) )
4739  {
4740  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
4741  }
4742  if( strlen( "3" ) )
4743  {
4744  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
4745  }
4746  if( strlen( "77B1D99300D6A54E864962DA09AE10CF19A7FB888456BC2672B72AEA52B204914493D16C184AD201EC3F762E1FBD8702BA796EF953D9EA2F26300D285264F11B0C8301D0207FEB1E2C984445C899B0ACEBAA74EF014DD1D4BDDB43202C08D2FF9692D8D788478DEC829EB52AFB5AE068FBDBAC499A27FACECC391E75C936D55F07BB45EE184DAB45808E15722502F279F89B38C1CB292557E5063597F52C75D61001EDC33F4739353E33E56AD273B067C1A2760208529EA421774A5FFFCB3423B1E0051E7702A55D80CBF2141569F18F87BFF538A1DA8EDBB2693A539F68E0D62D77743F89EACF3B1723BDB25CE2F333FA63CACF0E67DF1A431893BB9B352FCB" ) )
4747  {
4748  fct_chk( mpi_read_string( &ctx.D, 16, "77B1D99300D6A54E864962DA09AE10CF19A7FB888456BC2672B72AEA52B204914493D16C184AD201EC3F762E1FBD8702BA796EF953D9EA2F26300D285264F11B0C8301D0207FEB1E2C984445C899B0ACEBAA74EF014DD1D4BDDB43202C08D2FF9692D8D788478DEC829EB52AFB5AE068FBDBAC499A27FACECC391E75C936D55F07BB45EE184DAB45808E15722502F279F89B38C1CB292557E5063597F52C75D61001EDC33F4739353E33E56AD273B067C1A2760208529EA421774A5FFFCB3423B1E0051E7702A55D80CBF2141569F18F87BFF538A1DA8EDBB2693A539F68E0D62D77743F89EACF3B1723BDB25CE2F333FA63CACF0E67DF1A431893BB9B352FCB" ) == 0 );
4749  }
4750  if( strlen( "9A66CF76572A71A17475794FA1C8C70D987E581E990D772BB27C77C53FF1ECBB31260E9EDAFAEBC79991807E48918EAB8C3A5F03A600F30C69511546AE788EDF53168E2D035D300EDCD5E4BF3AA2A6D603EA0A7BD11E1C1089657306DF8A64E7F1BC6B266B825C1A6C5F0FC85775F4CF7ACD63367E42EAFE46511D58AD6DFE0F" ) )
4751  {
4752  fct_chk( mpi_read_string( &ctx.DP, 16, "9A66CF76572A71A17475794FA1C8C70D987E581E990D772BB27C77C53FF1ECBB31260E9EDAFAEBC79991807E48918EAB8C3A5F03A600F30C69511546AE788EDF53168E2D035D300EDCD5E4BF3AA2A6D603EA0A7BD11E1C1089657306DF8A64E7F1BC6B266B825C1A6C5F0FC85775F4CF7ACD63367E42EAFE46511D58AD6DFE0F" ) == 0 );
4753  }
4754  if( strlen( "844DBDD20925D9164F9A1E2F707076C261CCA8337D0241392B38AE3C12342F3AC14F8FD6DF4A1C36839662BD0D227344CD55A32AE5DBD2309A9A2B8A2C82BE6DDDDCE81D1B694775D9047AA765CA0C6E1BB8E61C8B7BE27ED711E8EE2FEAD87F3491F76A6D2262C14189EACDFD4CEFE0BF9D0A5B49857E0ED22CBEB98DC8D45B" ) )
4755  {
4756  fct_chk( mpi_read_string( &ctx.DQ, 16, "844DBDD20925D9164F9A1E2F707076C261CCA8337D0241392B38AE3C12342F3AC14F8FD6DF4A1C36839662BD0D227344CD55A32AE5DBD2309A9A2B8A2C82BE6DDDDCE81D1B694775D9047AA765CA0C6E1BB8E61C8B7BE27ED711E8EE2FEAD87F3491F76A6D2262C14189EACDFD4CEFE0BF9D0A5B49857E0ED22CBEB98DC8D45B" ) == 0 );
4757  }
4758  if( strlen( "4951A7B174DF972C37BADCC38457B5EDD1F078BC613E75CE25E08814E12461C7A1C189A70EB8138294298D141244C7A9DE31AB4F6D38B40B04D6353CD30F77ADBF66BBDE41C7BE463C5E30AAA3F7BAD6CEE99506DEAAFA2F335C1B1C5C88B8ABB0D0387EE0D1B4E7027F7F085A025CEDB5CCE18B88C0462F1C3C910D47C0D4AB" ) )
4759  {
4760  fct_chk( mpi_read_string( &ctx.QP, 16, "4951A7B174DF972C37BADCC38457B5EDD1F078BC613E75CE25E08814E12461C7A1C189A70EB8138294298D141244C7A9DE31AB4F6D38B40B04D6353CD30F77ADBF66BBDE41C7BE463C5E30AAA3F7BAD6CEE99506DEAAFA2F335C1B1C5C88B8ABB0D0387EE0D1B4E7027F7F085A025CEDB5CCE18B88C0462F1C3C910D47C0D4AB" ) == 0 );
4761  }
4762 
4764 
4765  rsa_free( &ctx );
4766  }
4767  FCT_TEST_END();
4768 
4769 
4770  FCT_TEST_BGN(rsa_check_private_key_4_no_n)
4771  {
4772  rsa_context ctx;
4773 
4774  rsa_init( &ctx, RSA_PKCS_V15, 0 );
4775 
4776  ctx.len = 2048 / 8;
4777  if( strlen( "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) )
4778  {
4779  fct_chk( mpi_read_string( &ctx.P, 16, "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) == 0 );
4780  }
4781  if( strlen( "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) )
4782  {
4783  fct_chk( mpi_read_string( &ctx.Q, 16, "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) == 0 );
4784  }
4785  if( strlen( "" ) )
4786  {
4787  fct_chk( mpi_read_string( &ctx.N, 16, "" ) == 0 );
4788  }
4789  if( strlen( "3" ) )
4790  {
4791  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
4792  }
4793  if( strlen( "77B1D99300D6A54E864962DA09AE10CF19A7FB888456BC2672B72AEA52B204914493D16C184AD201EC3F762E1FBD8702BA796EF953D9EA2F26300D285264F11B0C8301D0207FEB1E2C984445C899B0ACEBAA74EF014DD1D4BDDB43202C08D2FF9692D8D788478DEC829EB52AFB5AE068FBDBAC499A27FACECC391E75C936D55F07BB45EE184DAB45808E15722502F279F89B38C1CB292557E5063597F52C75D61001EDC33F4739353E33E56AD273B067C1A2760208529EA421774A5FFFCB3423B1E0051E7702A55D80CBF2141569F18F87BFF538A1DA8EDBB2693A539F68E0D62D77743F89EACF3B1723BDB25CE2F333FA63CACF0E67DF1A431893BB9B352FCB" ) )
4794  {
4795  fct_chk( mpi_read_string( &ctx.D, 16, "77B1D99300D6A54E864962DA09AE10CF19A7FB888456BC2672B72AEA52B204914493D16C184AD201EC3F762E1FBD8702BA796EF953D9EA2F26300D285264F11B0C8301D0207FEB1E2C984445C899B0ACEBAA74EF014DD1D4BDDB43202C08D2FF9692D8D788478DEC829EB52AFB5AE068FBDBAC499A27FACECC391E75C936D55F07BB45EE184DAB45808E15722502F279F89B38C1CB292557E5063597F52C75D61001EDC33F4739353E33E56AD273B067C1A2760208529EA421774A5FFFCB3423B1E0051E7702A55D80CBF2141569F18F87BFF538A1DA8EDBB2693A539F68E0D62D77743F89EACF3B1723BDB25CE2F333FA63CACF0E67DF1A431893BB9B352FCB" ) == 0 );
4796  }
4797  if( strlen( "9A66CF76572A71A17475794FA1C8C70D987E581E990D772BB27C77C53FF1ECBB31260E9EDAFAEBC79991807E48918EAB8C3A5F03A600F30C69511546AE788EDF53168E2D035D300EDCD5E4BF3AA2A6D603EA0A7BD11E1C1089657306DF8A64E7F1BC6B266B825C1A6C5F0FC85775F4CF7ACD63367E42EAFE46511D58AD6DFE0F" ) )
4798  {
4799  fct_chk( mpi_read_string( &ctx.DP, 16, "9A66CF76572A71A17475794FA1C8C70D987E581E990D772BB27C77C53FF1ECBB31260E9EDAFAEBC79991807E48918EAB8C3A5F03A600F30C69511546AE788EDF53168E2D035D300EDCD5E4BF3AA2A6D603EA0A7BD11E1C1089657306DF8A64E7F1BC6B266B825C1A6C5F0FC85775F4CF7ACD63367E42EAFE46511D58AD6DFE0F" ) == 0 );
4800  }
4801  if( strlen( "844DBDD20925D9164F9A1E2F707076C261CCA8337D0241392B38AE3C12342F3AC14F8FD6DF4A1C36839662BD0D227344CD55A32AE5DBD2309A9A2B8A2C82BE6DDDDCE81D1B694775D9047AA765CA0C6E1BB8E61C8B7BE27ED711E8EE2FEAD87F3491F76A6D2262C14189EACDFD4CEFE0BF9D0A5B49857E0ED22CBEB98DC8D45B" ) )
4802  {
4803  fct_chk( mpi_read_string( &ctx.DQ, 16, "844DBDD20925D9164F9A1E2F707076C261CCA8337D0241392B38AE3C12342F3AC14F8FD6DF4A1C36839662BD0D227344CD55A32AE5DBD2309A9A2B8A2C82BE6DDDDCE81D1B694775D9047AA765CA0C6E1BB8E61C8B7BE27ED711E8EE2FEAD87F3491F76A6D2262C14189EACDFD4CEFE0BF9D0A5B49857E0ED22CBEB98DC8D45B" ) == 0 );
4804  }
4805  if( strlen( "4951A7B174DF972C37BADCC38457B5EDD1F078BC613E75CE25E08814E12461C7A1C189A70EB8138294298D141244C7A9DE31AB4F6D38B40B04D6353CD30F77ADBF66BBDE41C7BE463C5E30AAA3F7BAD6CEE99506DEAAFA2F335C1B1C5C88B8ABB0D0387EE0D1B4E7027F7F085A025CEDB5CCE18B88C0462F1C3C910D47C0D4AB" ) )
4806  {
4807  fct_chk( mpi_read_string( &ctx.QP, 16, "4951A7B174DF972C37BADCC38457B5EDD1F078BC613E75CE25E08814E12461C7A1C189A70EB8138294298D141244C7A9DE31AB4F6D38B40B04D6353CD30F77ADBF66BBDE41C7BE463C5E30AAA3F7BAD6CEE99506DEAAFA2F335C1B1C5C88B8ABB0D0387EE0D1B4E7027F7F085A025CEDB5CCE18B88C0462F1C3C910D47C0D4AB" ) == 0 );
4808  }
4809 
4811 
4812  rsa_free( &ctx );
4813  }
4814  FCT_TEST_END();
4815 
4816 
4817  FCT_TEST_BGN(rsa_check_private_key_5_no_e)
4818  {
4819  rsa_context ctx;
4820 
4821  rsa_init( &ctx, RSA_PKCS_V15, 0 );
4822 
4823  ctx.len = 2048 / 8;
4824  if( strlen( "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) )
4825  {
4826  fct_chk( mpi_read_string( &ctx.P, 16, "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) == 0 );
4827  }
4828  if( strlen( "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) )
4829  {
4830  fct_chk( mpi_read_string( &ctx.Q, 16, "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) == 0 );
4831  }
4832  if( strlen( "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) )
4833  {
4834  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
4835  }
4836  if( strlen( "" ) )
4837  {
4838  fct_chk( mpi_read_string( &ctx.E, 16, "" ) == 0 );
4839  }
4840  if( strlen( "77B1D99300D6A54E864962DA09AE10CF19A7FB888456BC2672B72AEA52B204914493D16C184AD201EC3F762E1FBD8702BA796EF953D9EA2F26300D285264F11B0C8301D0207FEB1E2C984445C899B0ACEBAA74EF014DD1D4BDDB43202C08D2FF9692D8D788478DEC829EB52AFB5AE068FBDBAC499A27FACECC391E75C936D55F07BB45EE184DAB45808E15722502F279F89B38C1CB292557E5063597F52C75D61001EDC33F4739353E33E56AD273B067C1A2760208529EA421774A5FFFCB3423B1E0051E7702A55D80CBF2141569F18F87BFF538A1DA8EDBB2693A539F68E0D62D77743F89EACF3B1723BDB25CE2F333FA63CACF0E67DF1A431893BB9B352FCB" ) )
4841  {
4842  fct_chk( mpi_read_string( &ctx.D, 16, "77B1D99300D6A54E864962DA09AE10CF19A7FB888456BC2672B72AEA52B204914493D16C184AD201EC3F762E1FBD8702BA796EF953D9EA2F26300D285264F11B0C8301D0207FEB1E2C984445C899B0ACEBAA74EF014DD1D4BDDB43202C08D2FF9692D8D788478DEC829EB52AFB5AE068FBDBAC499A27FACECC391E75C936D55F07BB45EE184DAB45808E15722502F279F89B38C1CB292557E5063597F52C75D61001EDC33F4739353E33E56AD273B067C1A2760208529EA421774A5FFFCB3423B1E0051E7702A55D80CBF2141569F18F87BFF538A1DA8EDBB2693A539F68E0D62D77743F89EACF3B1723BDB25CE2F333FA63CACF0E67DF1A431893BB9B352FCB" ) == 0 );
4843  }
4844  if( strlen( "9A66CF76572A71A17475794FA1C8C70D987E581E990D772BB27C77C53FF1ECBB31260E9EDAFAEBC79991807E48918EAB8C3A5F03A600F30C69511546AE788EDF53168E2D035D300EDCD5E4BF3AA2A6D603EA0A7BD11E1C1089657306DF8A64E7F1BC6B266B825C1A6C5F0FC85775F4CF7ACD63367E42EAFE46511D58AD6DFE0F" ) )
4845  {
4846  fct_chk( mpi_read_string( &ctx.DP, 16, "9A66CF76572A71A17475794FA1C8C70D987E581E990D772BB27C77C53FF1ECBB31260E9EDAFAEBC79991807E48918EAB8C3A5F03A600F30C69511546AE788EDF53168E2D035D300EDCD5E4BF3AA2A6D603EA0A7BD11E1C1089657306DF8A64E7F1BC6B266B825C1A6C5F0FC85775F4CF7ACD63367E42EAFE46511D58AD6DFE0F" ) == 0 );
4847  }
4848  if( strlen( "844DBDD20925D9164F9A1E2F707076C261CCA8337D0241392B38AE3C12342F3AC14F8FD6DF4A1C36839662BD0D227344CD55A32AE5DBD2309A9A2B8A2C82BE6DDDDCE81D1B694775D9047AA765CA0C6E1BB8E61C8B7BE27ED711E8EE2FEAD87F3491F76A6D2262C14189EACDFD4CEFE0BF9D0A5B49857E0ED22CBEB98DC8D45B" ) )
4849  {
4850  fct_chk( mpi_read_string( &ctx.DQ, 16, "844DBDD20925D9164F9A1E2F707076C261CCA8337D0241392B38AE3C12342F3AC14F8FD6DF4A1C36839662BD0D227344CD55A32AE5DBD2309A9A2B8A2C82BE6DDDDCE81D1B694775D9047AA765CA0C6E1BB8E61C8B7BE27ED711E8EE2FEAD87F3491F76A6D2262C14189EACDFD4CEFE0BF9D0A5B49857E0ED22CBEB98DC8D45B" ) == 0 );
4851  }
4852  if( strlen( "4951A7B174DF972C37BADCC38457B5EDD1F078BC613E75CE25E08814E12461C7A1C189A70EB8138294298D141244C7A9DE31AB4F6D38B40B04D6353CD30F77ADBF66BBDE41C7BE463C5E30AAA3F7BAD6CEE99506DEAAFA2F335C1B1C5C88B8ABB0D0387EE0D1B4E7027F7F085A025CEDB5CCE18B88C0462F1C3C910D47C0D4AB" ) )
4853  {
4854  fct_chk( mpi_read_string( &ctx.QP, 16, "4951A7B174DF972C37BADCC38457B5EDD1F078BC613E75CE25E08814E12461C7A1C189A70EB8138294298D141244C7A9DE31AB4F6D38B40B04D6353CD30F77ADBF66BBDE41C7BE463C5E30AAA3F7BAD6CEE99506DEAAFA2F335C1B1C5C88B8ABB0D0387EE0D1B4E7027F7F085A025CEDB5CCE18B88C0462F1C3C910D47C0D4AB" ) == 0 );
4855  }
4856 
4858 
4859  rsa_free( &ctx );
4860  }
4861  FCT_TEST_END();
4862 
4863 
4864  FCT_TEST_BGN(rsa_check_private_key_6_no_d)
4865  {
4866  rsa_context ctx;
4867 
4868  rsa_init( &ctx, RSA_PKCS_V15, 0 );
4869 
4870  ctx.len = 2048 / 8;
4871  if( strlen( "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) )
4872  {
4873  fct_chk( mpi_read_string( &ctx.P, 16, "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) == 0 );
4874  }
4875  if( strlen( "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) )
4876  {
4877  fct_chk( mpi_read_string( &ctx.Q, 16, "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) == 0 );
4878  }
4879  if( strlen( "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) )
4880  {
4881  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
4882  }
4883  if( strlen( "3" ) )
4884  {
4885  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
4886  }
4887  if( strlen( "" ) )
4888  {
4889  fct_chk( mpi_read_string( &ctx.D, 16, "" ) == 0 );
4890  }
4891  if( strlen( "9A66CF76572A71A17475794FA1C8C70D987E581E990D772BB27C77C53FF1ECBB31260E9EDAFAEBC79991807E48918EAB8C3A5F03A600F30C69511546AE788EDF53168E2D035D300EDCD5E4BF3AA2A6D603EA0A7BD11E1C1089657306DF8A64E7F1BC6B266B825C1A6C5F0FC85775F4CF7ACD63367E42EAFE46511D58AD6DFE0F" ) )
4892  {
4893  fct_chk( mpi_read_string( &ctx.DP, 16, "9A66CF76572A71A17475794FA1C8C70D987E581E990D772BB27C77C53FF1ECBB31260E9EDAFAEBC79991807E48918EAB8C3A5F03A600F30C69511546AE788EDF53168E2D035D300EDCD5E4BF3AA2A6D603EA0A7BD11E1C1089657306DF8A64E7F1BC6B266B825C1A6C5F0FC85775F4CF7ACD63367E42EAFE46511D58AD6DFE0F" ) == 0 );
4894  }
4895  if( strlen( "844DBDD20925D9164F9A1E2F707076C261CCA8337D0241392B38AE3C12342F3AC14F8FD6DF4A1C36839662BD0D227344CD55A32AE5DBD2309A9A2B8A2C82BE6DDDDCE81D1B694775D9047AA765CA0C6E1BB8E61C8B7BE27ED711E8EE2FEAD87F3491F76A6D2262C14189EACDFD4CEFE0BF9D0A5B49857E0ED22CBEB98DC8D45B" ) )
4896  {
4897  fct_chk( mpi_read_string( &ctx.DQ, 16, "844DBDD20925D9164F9A1E2F707076C261CCA8337D0241392B38AE3C12342F3AC14F8FD6DF4A1C36839662BD0D227344CD55A32AE5DBD2309A9A2B8A2C82BE6DDDDCE81D1B694775D9047AA765CA0C6E1BB8E61C8B7BE27ED711E8EE2FEAD87F3491F76A6D2262C14189EACDFD4CEFE0BF9D0A5B49857E0ED22CBEB98DC8D45B" ) == 0 );
4898  }
4899  if( strlen( "4951A7B174DF972C37BADCC38457B5EDD1F078BC613E75CE25E08814E12461C7A1C189A70EB8138294298D141244C7A9DE31AB4F6D38B40B04D6353CD30F77ADBF66BBDE41C7BE463C5E30AAA3F7BAD6CEE99506DEAAFA2F335C1B1C5C88B8ABB0D0387EE0D1B4E7027F7F085A025CEDB5CCE18B88C0462F1C3C910D47C0D4AB" ) )
4900  {
4901  fct_chk( mpi_read_string( &ctx.QP, 16, "4951A7B174DF972C37BADCC38457B5EDD1F078BC613E75CE25E08814E12461C7A1C189A70EB8138294298D141244C7A9DE31AB4F6D38B40B04D6353CD30F77ADBF66BBDE41C7BE463C5E30AAA3F7BAD6CEE99506DEAAFA2F335C1B1C5C88B8ABB0D0387EE0D1B4E7027F7F085A025CEDB5CCE18B88C0462F1C3C910D47C0D4AB" ) == 0 );
4902  }
4903 
4905 
4906  rsa_free( &ctx );
4907  }
4908  FCT_TEST_END();
4909 
4910 
4911  FCT_TEST_BGN(rsa_check_private_key_7_no_dp)
4912  {
4913  rsa_context ctx;
4914 
4915  rsa_init( &ctx, RSA_PKCS_V15, 0 );
4916 
4917  ctx.len = 2048 / 8;
4918  if( strlen( "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) )
4919  {
4920  fct_chk( mpi_read_string( &ctx.P, 16, "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) == 0 );
4921  }
4922  if( strlen( "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) )
4923  {
4924  fct_chk( mpi_read_string( &ctx.Q, 16, "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) == 0 );
4925  }
4926  if( strlen( "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) )
4927  {
4928  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
4929  }
4930  if( strlen( "3" ) )
4931  {
4932  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
4933  }
4934  if( strlen( "77B1D99300D6A54E864962DA09AE10CF19A7FB888456BC2672B72AEA52B204914493D16C184AD201EC3F762E1FBD8702BA796EF953D9EA2F26300D285264F11B0C8301D0207FEB1E2C984445C899B0ACEBAA74EF014DD1D4BDDB43202C08D2FF9692D8D788478DEC829EB52AFB5AE068FBDBAC499A27FACECC391E75C936D55F07BB45EE184DAB45808E15722502F279F89B38C1CB292557E5063597F52C75D61001EDC33F4739353E33E56AD273B067C1A2760208529EA421774A5FFFCB3423B1E0051E7702A55D80CBF2141569F18F87BFF538A1DA8EDBB2693A539F68E0D62D77743F89EACF3B1723BDB25CE2F333FA63CACF0E67DF1A431893BB9B352FCB" ) )
4935  {
4936  fct_chk( mpi_read_string( &ctx.D, 16, "77B1D99300D6A54E864962DA09AE10CF19A7FB888456BC2672B72AEA52B204914493D16C184AD201EC3F762E1FBD8702BA796EF953D9EA2F26300D285264F11B0C8301D0207FEB1E2C984445C899B0ACEBAA74EF014DD1D4BDDB43202C08D2FF9692D8D788478DEC829EB52AFB5AE068FBDBAC499A27FACECC391E75C936D55F07BB45EE184DAB45808E15722502F279F89B38C1CB292557E5063597F52C75D61001EDC33F4739353E33E56AD273B067C1A2760208529EA421774A5FFFCB3423B1E0051E7702A55D80CBF2141569F18F87BFF538A1DA8EDBB2693A539F68E0D62D77743F89EACF3B1723BDB25CE2F333FA63CACF0E67DF1A431893BB9B352FCB" ) == 0 );
4937  }
4938  if( strlen( "" ) )
4939  {
4940  fct_chk( mpi_read_string( &ctx.DP, 16, "" ) == 0 );
4941  }
4942  if( strlen( "844DBDD20925D9164F9A1E2F707076C261CCA8337D0241392B38AE3C12342F3AC14F8FD6DF4A1C36839662BD0D227344CD55A32AE5DBD2309A9A2B8A2C82BE6DDDDCE81D1B694775D9047AA765CA0C6E1BB8E61C8B7BE27ED711E8EE2FEAD87F3491F76A6D2262C14189EACDFD4CEFE0BF9D0A5B49857E0ED22CBEB98DC8D45B" ) )
4943  {
4944  fct_chk( mpi_read_string( &ctx.DQ, 16, "844DBDD20925D9164F9A1E2F707076C261CCA8337D0241392B38AE3C12342F3AC14F8FD6DF4A1C36839662BD0D227344CD55A32AE5DBD2309A9A2B8A2C82BE6DDDDCE81D1B694775D9047AA765CA0C6E1BB8E61C8B7BE27ED711E8EE2FEAD87F3491F76A6D2262C14189EACDFD4CEFE0BF9D0A5B49857E0ED22CBEB98DC8D45B" ) == 0 );
4945  }
4946  if( strlen( "4951A7B174DF972C37BADCC38457B5EDD1F078BC613E75CE25E08814E12461C7A1C189A70EB8138294298D141244C7A9DE31AB4F6D38B40B04D6353CD30F77ADBF66BBDE41C7BE463C5E30AAA3F7BAD6CEE99506DEAAFA2F335C1B1C5C88B8ABB0D0387EE0D1B4E7027F7F085A025CEDB5CCE18B88C0462F1C3C910D47C0D4AB" ) )
4947  {
4948  fct_chk( mpi_read_string( &ctx.QP, 16, "4951A7B174DF972C37BADCC38457B5EDD1F078BC613E75CE25E08814E12461C7A1C189A70EB8138294298D141244C7A9DE31AB4F6D38B40B04D6353CD30F77ADBF66BBDE41C7BE463C5E30AAA3F7BAD6CEE99506DEAAFA2F335C1B1C5C88B8ABB0D0387EE0D1B4E7027F7F085A025CEDB5CCE18B88C0462F1C3C910D47C0D4AB" ) == 0 );
4949  }
4950 
4952 
4953  rsa_free( &ctx );
4954  }
4955  FCT_TEST_END();
4956 
4957 
4958  FCT_TEST_BGN(rsa_check_private_key_8_no_dq)
4959  {
4960  rsa_context ctx;
4961 
4962  rsa_init( &ctx, RSA_PKCS_V15, 0 );
4963 
4964  ctx.len = 2048 / 8;
4965  if( strlen( "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) )
4966  {
4967  fct_chk( mpi_read_string( &ctx.P, 16, "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) == 0 );
4968  }
4969  if( strlen( "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) )
4970  {
4971  fct_chk( mpi_read_string( &ctx.Q, 16, "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) == 0 );
4972  }
4973  if( strlen( "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) )
4974  {
4975  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
4976  }
4977  if( strlen( "3" ) )
4978  {
4979  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
4980  }
4981  if( strlen( "77B1D99300D6A54E864962DA09AE10CF19A7FB888456BC2672B72AEA52B204914493D16C184AD201EC3F762E1FBD8702BA796EF953D9EA2F26300D285264F11B0C8301D0207FEB1E2C984445C899B0ACEBAA74EF014DD1D4BDDB43202C08D2FF9692D8D788478DEC829EB52AFB5AE068FBDBAC499A27FACECC391E75C936D55F07BB45EE184DAB45808E15722502F279F89B38C1CB292557E5063597F52C75D61001EDC33F4739353E33E56AD273B067C1A2760208529EA421774A5FFFCB3423B1E0051E7702A55D80CBF2141569F18F87BFF538A1DA8EDBB2693A539F68E0D62D77743F89EACF3B1723BDB25CE2F333FA63CACF0E67DF1A431893BB9B352FCB" ) )
4982  {
4983  fct_chk( mpi_read_string( &ctx.D, 16, "77B1D99300D6A54E864962DA09AE10CF19A7FB888456BC2672B72AEA52B204914493D16C184AD201EC3F762E1FBD8702BA796EF953D9EA2F26300D285264F11B0C8301D0207FEB1E2C984445C899B0ACEBAA74EF014DD1D4BDDB43202C08D2FF9692D8D788478DEC829EB52AFB5AE068FBDBAC499A27FACECC391E75C936D55F07BB45EE184DAB45808E15722502F279F89B38C1CB292557E5063597F52C75D61001EDC33F4739353E33E56AD273B067C1A2760208529EA421774A5FFFCB3423B1E0051E7702A55D80CBF2141569F18F87BFF538A1DA8EDBB2693A539F68E0D62D77743F89EACF3B1723BDB25CE2F333FA63CACF0E67DF1A431893BB9B352FCB" ) == 0 );
4984  }
4985  if( strlen( "9A66CF76572A71A17475794FA1C8C70D987E581E990D772BB27C77C53FF1ECBB31260E9EDAFAEBC79991807E48918EAB8C3A5F03A600F30C69511546AE788EDF53168E2D035D300EDCD5E4BF3AA2A6D603EA0A7BD11E1C1089657306DF8A64E7F1BC6B266B825C1A6C5F0FC85775F4CF7ACD63367E42EAFE46511D58AD6DFE0F" ) )
4986  {
4987  fct_chk( mpi_read_string( &ctx.DP, 16, "9A66CF76572A71A17475794FA1C8C70D987E581E990D772BB27C77C53FF1ECBB31260E9EDAFAEBC79991807E48918EAB8C3A5F03A600F30C69511546AE788EDF53168E2D035D300EDCD5E4BF3AA2A6D603EA0A7BD11E1C1089657306DF8A64E7F1BC6B266B825C1A6C5F0FC85775F4CF7ACD63367E42EAFE46511D58AD6DFE0F" ) == 0 );
4988  }
4989  if( strlen( "" ) )
4990  {
4991  fct_chk( mpi_read_string( &ctx.DQ, 16, "" ) == 0 );
4992  }
4993  if( strlen( "4951A7B174DF972C37BADCC38457B5EDD1F078BC613E75CE25E08814E12461C7A1C189A70EB8138294298D141244C7A9DE31AB4F6D38B40B04D6353CD30F77ADBF66BBDE41C7BE463C5E30AAA3F7BAD6CEE99506DEAAFA2F335C1B1C5C88B8ABB0D0387EE0D1B4E7027F7F085A025CEDB5CCE18B88C0462F1C3C910D47C0D4AB" ) )
4994  {
4995  fct_chk( mpi_read_string( &ctx.QP, 16, "4951A7B174DF972C37BADCC38457B5EDD1F078BC613E75CE25E08814E12461C7A1C189A70EB8138294298D141244C7A9DE31AB4F6D38B40B04D6353CD30F77ADBF66BBDE41C7BE463C5E30AAA3F7BAD6CEE99506DEAAFA2F335C1B1C5C88B8ABB0D0387EE0D1B4E7027F7F085A025CEDB5CCE18B88C0462F1C3C910D47C0D4AB" ) == 0 );
4996  }
4997 
4999 
5000  rsa_free( &ctx );
5001  }
5002  FCT_TEST_END();
5003 
5004 
5005  FCT_TEST_BGN(rsa_check_private_key_9_no_qp)
5006  {
5007  rsa_context ctx;
5008 
5009  rsa_init( &ctx, RSA_PKCS_V15, 0 );
5010 
5011  ctx.len = 2048 / 8;
5012  if( strlen( "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) )
5013  {
5014  fct_chk( mpi_read_string( &ctx.P, 16, "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) == 0 );
5015  }
5016  if( strlen( "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) )
5017  {
5018  fct_chk( mpi_read_string( &ctx.Q, 16, "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) == 0 );
5019  }
5020  if( strlen( "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) )
5021  {
5022  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
5023  }
5024  if( strlen( "3" ) )
5025  {
5026  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
5027  }
5028  if( strlen( "77B1D99300D6A54E864962DA09AE10CF19A7FB888456BC2672B72AEA52B204914493D16C184AD201EC3F762E1FBD8702BA796EF953D9EA2F26300D285264F11B0C8301D0207FEB1E2C984445C899B0ACEBAA74EF014DD1D4BDDB43202C08D2FF9692D8D788478DEC829EB52AFB5AE068FBDBAC499A27FACECC391E75C936D55F07BB45EE184DAB45808E15722502F279F89B38C1CB292557E5063597F52C75D61001EDC33F4739353E33E56AD273B067C1A2760208529EA421774A5FFFCB3423B1E0051E7702A55D80CBF2141569F18F87BFF538A1DA8EDBB2693A539F68E0D62D77743F89EACF3B1723BDB25CE2F333FA63CACF0E67DF1A431893BB9B352FCB" ) )
5029  {
5030  fct_chk( mpi_read_string( &ctx.D, 16, "77B1D99300D6A54E864962DA09AE10CF19A7FB888456BC2672B72AEA52B204914493D16C184AD201EC3F762E1FBD8702BA796EF953D9EA2F26300D285264F11B0C8301D0207FEB1E2C984445C899B0ACEBAA74EF014DD1D4BDDB43202C08D2FF9692D8D788478DEC829EB52AFB5AE068FBDBAC499A27FACECC391E75C936D55F07BB45EE184DAB45808E15722502F279F89B38C1CB292557E5063597F52C75D61001EDC33F4739353E33E56AD273B067C1A2760208529EA421774A5FFFCB3423B1E0051E7702A55D80CBF2141569F18F87BFF538A1DA8EDBB2693A539F68E0D62D77743F89EACF3B1723BDB25CE2F333FA63CACF0E67DF1A431893BB9B352FCB" ) == 0 );
5031  }
5032  if( strlen( "9A66CF76572A71A17475794FA1C8C70D987E581E990D772BB27C77C53FF1ECBB31260E9EDAFAEBC79991807E48918EAB8C3A5F03A600F30C69511546AE788EDF53168E2D035D300EDCD5E4BF3AA2A6D603EA0A7BD11E1C1089657306DF8A64E7F1BC6B266B825C1A6C5F0FC85775F4CF7ACD63367E42EAFE46511D58AD6DFE0F" ) )
5033  {
5034  fct_chk( mpi_read_string( &ctx.DP, 16, "9A66CF76572A71A17475794FA1C8C70D987E581E990D772BB27C77C53FF1ECBB31260E9EDAFAEBC79991807E48918EAB8C3A5F03A600F30C69511546AE788EDF53168E2D035D300EDCD5E4BF3AA2A6D603EA0A7BD11E1C1089657306DF8A64E7F1BC6B266B825C1A6C5F0FC85775F4CF7ACD63367E42EAFE46511D58AD6DFE0F" ) == 0 );
5035  }
5036  if( strlen( "844DBDD20925D9164F9A1E2F707076C261CCA8337D0241392B38AE3C12342F3AC14F8FD6DF4A1C36839662BD0D227344CD55A32AE5DBD2309A9A2B8A2C82BE6DDDDCE81D1B694775D9047AA765CA0C6E1BB8E61C8B7BE27ED711E8EE2FEAD87F3491F76A6D2262C14189EACDFD4CEFE0BF9D0A5B49857E0ED22CBEB98DC8D45B" ) )
5037  {
5038  fct_chk( mpi_read_string( &ctx.DQ, 16, "844DBDD20925D9164F9A1E2F707076C261CCA8337D0241392B38AE3C12342F3AC14F8FD6DF4A1C36839662BD0D227344CD55A32AE5DBD2309A9A2B8A2C82BE6DDDDCE81D1B694775D9047AA765CA0C6E1BB8E61C8B7BE27ED711E8EE2FEAD87F3491F76A6D2262C14189EACDFD4CEFE0BF9D0A5B49857E0ED22CBEB98DC8D45B" ) == 0 );
5039  }
5040  if( strlen( "" ) )
5041  {
5042  fct_chk( mpi_read_string( &ctx.QP, 16, "" ) == 0 );
5043  }
5044 
5046 
5047  rsa_free( &ctx );
5048  }
5049  FCT_TEST_END();
5050 
5051 
5052  FCT_TEST_BGN(rsa_check_private_key_10_incorrect)
5053  {
5054  rsa_context ctx;
5055 
5056  rsa_init( &ctx, RSA_PKCS_V15, 0 );
5057 
5058  ctx.len = 2048 / 8;
5059  if( strlen( "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) )
5060  {
5061  fct_chk( mpi_read_string( &ctx.P, 16, "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) == 0 );
5062  }
5063  if( strlen( "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) )
5064  {
5065  fct_chk( mpi_read_string( &ctx.Q, 16, "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) == 0 );
5066  }
5067  if( strlen( "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) )
5068  {
5069  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
5070  }
5071  if( strlen( "3" ) )
5072  {
5073  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
5074  }
5075  if( strlen( "77B1D99300D6A54E864962DA09AE10CF19A7FB888456BC2672B72AEA52B204914493D16C184AD201EC3F762E1FBD8702BA796EF953D9EA2F26300D285264F11B0C8301D0207FEB1E2C984445C899B0ACEBAA74EF014DD1D4BDDB43202C08D2FF9692D8D788478DEC829EB52AFB5AE068FBDBAC499A27FACECC391E75C936D55F07BB45EE184DAB45808E15722502F279F89B38C1CB292557E5063597F52C75D61001EDC33F4739353E33E56AD273B067C1A2760208529EA421774A5FFFCB3423B1E0051E7702A55D80CBF2141569F18F87BFF538A1DA8EDBB2693A539F68E0D62D77743F89EACF3B1723BDB25CE2F333FA63CACF0E67DF1A431893BB9B352FCC" ) )
5076  {
5077  fct_chk( mpi_read_string( &ctx.D, 16, "77B1D99300D6A54E864962DA09AE10CF19A7FB888456BC2672B72AEA52B204914493D16C184AD201EC3F762E1FBD8702BA796EF953D9EA2F26300D285264F11B0C8301D0207FEB1E2C984445C899B0ACEBAA74EF014DD1D4BDDB43202C08D2FF9692D8D788478DEC829EB52AFB5AE068FBDBAC499A27FACECC391E75C936D55F07BB45EE184DAB45808E15722502F279F89B38C1CB292557E5063597F52C75D61001EDC33F4739353E33E56AD273B067C1A2760208529EA421774A5FFFCB3423B1E0051E7702A55D80CBF2141569F18F87BFF538A1DA8EDBB2693A539F68E0D62D77743F89EACF3B1723BDB25CE2F333FA63CACF0E67DF1A431893BB9B352FCC" ) == 0 );
5078  }
5079  if( strlen( "9A66CF76572A71A17475794FA1C8C70D987E581E990D772BB27C77C53FF1ECBB31260E9EDAFAEBC79991807E48918EAB8C3A5F03A600F30C69511546AE788EDF53168E2D035D300EDCD5E4BF3AA2A6D603EA0A7BD11E1C1089657306DF8A64E7F1BC6B266B825C1A6C5F0FC85775F4CF7ACD63367E42EAFE46511D58AD6DFE0F" ) )
5080  {
5081  fct_chk( mpi_read_string( &ctx.DP, 16, "9A66CF76572A71A17475794FA1C8C70D987E581E990D772BB27C77C53FF1ECBB31260E9EDAFAEBC79991807E48918EAB8C3A5F03A600F30C69511546AE788EDF53168E2D035D300EDCD5E4BF3AA2A6D603EA0A7BD11E1C1089657306DF8A64E7F1BC6B266B825C1A6C5F0FC85775F4CF7ACD63367E42EAFE46511D58AD6DFE0F" ) == 0 );
5082  }
5083  if( strlen( "844DBDD20925D9164F9A1E2F707076C261CCA8337D0241392B38AE3C12342F3AC14F8FD6DF4A1C36839662BD0D227344CD55A32AE5DBD2309A9A2B8A2C82BE6DDDDCE81D1B694775D9047AA765CA0C6E1BB8E61C8B7BE27ED711E8EE2FEAD87F3491F76A6D2262C14189EACDFD4CEFE0BF9D0A5B49857E0ED22CBEB98DC8D45B" ) )
5084  {
5085  fct_chk( mpi_read_string( &ctx.DQ, 16, "844DBDD20925D9164F9A1E2F707076C261CCA8337D0241392B38AE3C12342F3AC14F8FD6DF4A1C36839662BD0D227344CD55A32AE5DBD2309A9A2B8A2C82BE6DDDDCE81D1B694775D9047AA765CA0C6E1BB8E61C8B7BE27ED711E8EE2FEAD87F3491F76A6D2262C14189EACDFD4CEFE0BF9D0A5B49857E0ED22CBEB98DC8D45B" ) == 0 );
5086  }
5087  if( strlen( "4951A7B174DF972C37BADCC38457B5EDD1F078BC613E75CE25E08814E12461C7A1C189A70EB8138294298D141244C7A9DE31AB4F6D38B40B04D6353CD30F77ADBF66BBDE41C7BE463C5E30AAA3F7BAD6CEE99506DEAAFA2F335C1B1C5C88B8ABB0D0387EE0D1B4E7027F7F085A025CEDB5CCE18B88C0462F1C3C910D47C0D4AB" ) )
5088  {
5089  fct_chk( mpi_read_string( &ctx.QP, 16, "4951A7B174DF972C37BADCC38457B5EDD1F078BC613E75CE25E08814E12461C7A1C189A70EB8138294298D141244C7A9DE31AB4F6D38B40B04D6353CD30F77ADBF66BBDE41C7BE463C5E30AAA3F7BAD6CEE99506DEAAFA2F335C1B1C5C88B8ABB0D0387EE0D1B4E7027F7F085A025CEDB5CCE18B88C0462F1C3C910D47C0D4AB" ) == 0 );
5090  }
5091 
5093 
5094  rsa_free( &ctx );
5095  }
5096  FCT_TEST_END();
5097 
5098 
5099  FCT_TEST_BGN(rsa_check_public_key_1_correct)
5100  {
5101  rsa_context ctx;
5102 
5103  rsa_init( &ctx, RSA_PKCS_V15, 0 );
5104 
5105  if( strlen( "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) )
5106  {
5107  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
5108  }
5109  if( strlen( "3" ) )
5110  {
5111  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
5112  }
5113 
5114  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
5115 
5116  rsa_free( &ctx );
5117  }
5118  FCT_TEST_END();
5119 
5120 
5121  FCT_TEST_BGN(rsa_check_public_key_2_even_n)
5122  {
5123  rsa_context ctx;
5124 
5125  rsa_init( &ctx, RSA_PKCS_V15, 0 );
5126 
5127  if( strlen( "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a20340" ) )
5128  {
5129  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a20340" ) == 0 );
5130  }
5131  if( strlen( "3" ) )
5132  {
5133  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
5134  }
5135 
5137 
5138  rsa_free( &ctx );
5139  }
5140  FCT_TEST_END();
5141 
5142 
5143  FCT_TEST_BGN(rsa_check_public_key_3_even_e)
5144  {
5145  rsa_context ctx;
5146 
5147  rsa_init( &ctx, RSA_PKCS_V15, 0 );
5148 
5149  if( strlen( "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a20340" ) )
5150  {
5151  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a20340" ) == 0 );
5152  }
5153  if( strlen( "65536" ) )
5154  {
5155  fct_chk( mpi_read_string( &ctx.E, 16, "65536" ) == 0 );
5156  }
5157 
5159 
5160  rsa_free( &ctx );
5161  }
5162  FCT_TEST_END();
5163 
5164 
5165  FCT_TEST_BGN(rsa_check_public_key_4_n_exactly_128_bits)
5166  {
5167  rsa_context ctx;
5168 
5169  rsa_init( &ctx, RSA_PKCS_V15, 0 );
5170 
5171  if( strlen( "fedcba9876543210deadbeefcafe4321" ) )
5172  {
5173  fct_chk( mpi_read_string( &ctx.N, 16, "fedcba9876543210deadbeefcafe4321" ) == 0 );
5174  }
5175  if( strlen( "3" ) )
5176  {
5177  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
5178  }
5179 
5180  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
5181 
5182  rsa_free( &ctx );
5183  }
5184  FCT_TEST_END();
5185 
5186 
5187  FCT_TEST_BGN(rsa_check_public_key_5_n_smaller_than_128_bits)
5188  {
5189  rsa_context ctx;
5190 
5191  rsa_init( &ctx, RSA_PKCS_V15, 0 );
5192 
5193  if( strlen( "7edcba9876543210deadbeefcafe4321" ) )
5194  {
5195  fct_chk( mpi_read_string( &ctx.N, 16, "7edcba9876543210deadbeefcafe4321" ) == 0 );
5196  }
5197  if( strlen( "3" ) )
5198  {
5199  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
5200  }
5201 
5203 
5204  rsa_free( &ctx );
5205  }
5206  FCT_TEST_END();
5207 
5208 
5209  FCT_TEST_BGN(rsa_check_public_key_6_n_exactly_4096_bits)
5210  {
5211  rsa_context ctx;
5212 
5213  rsa_init( &ctx, RSA_PKCS_V15, 0 );
5214 
5215  if( strlen( "00b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034fb38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) )
5216  {
5217  fct_chk( mpi_read_string( &ctx.N, 16, "00b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034fb38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
5218  }
5219  if( strlen( "3" ) )
5220  {
5221  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
5222  }
5223 
5224  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
5225 
5226  rsa_free( &ctx );
5227  }
5228  FCT_TEST_END();
5229 
5230 
5231  FCT_TEST_BGN(rsa_check_public_key_7_n_larger_than_4096_bits)
5232  {
5233  rsa_context ctx;
5234 
5235  rsa_init( &ctx, RSA_PKCS_V15, 0 );
5236 
5237  if( strlen( "01b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034fb38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) )
5238  {
5239  fct_chk( mpi_read_string( &ctx.N, 16, "01b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034fb38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
5240  }
5241  if( strlen( "3" ) )
5242  {
5243  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
5244  }
5245 
5247 
5248  rsa_free( &ctx );
5249  }
5250  FCT_TEST_END();
5251 
5252 
5253  FCT_TEST_BGN(rsa_check_public_key_8_e_exactly_2_bits)
5254  {
5255  rsa_context ctx;
5256 
5257  rsa_init( &ctx, RSA_PKCS_V15, 0 );
5258 
5259  if( strlen( "fedcba9876543210deadbeefcafe4321" ) )
5260  {
5261  fct_chk( mpi_read_string( &ctx.N, 16, "fedcba9876543210deadbeefcafe4321" ) == 0 );
5262  }
5263  if( strlen( "3" ) )
5264  {
5265  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
5266  }
5267 
5268  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
5269 
5270  rsa_free( &ctx );
5271  }
5272  FCT_TEST_END();
5273 
5274 
5275  FCT_TEST_BGN(rsa_check_public_key_8_e_exactly_1_bits)
5276  {
5277  rsa_context ctx;
5278 
5279  rsa_init( &ctx, RSA_PKCS_V15, 0 );
5280 
5281  if( strlen( "fedcba9876543210deadbeefcafe4321" ) )
5282  {
5283  fct_chk( mpi_read_string( &ctx.N, 16, "fedcba9876543210deadbeefcafe4321" ) == 0 );
5284  }
5285  if( strlen( "1" ) )
5286  {
5287  fct_chk( mpi_read_string( &ctx.E, 16, "1" ) == 0 );
5288  }
5289 
5291 
5292  rsa_free( &ctx );
5293  }
5294  FCT_TEST_END();
5295 
5296 
5297  FCT_TEST_BGN(rsa_check_public_key_8_e_exactly_64_bits)
5298  {
5299  rsa_context ctx;
5300 
5301  rsa_init( &ctx, RSA_PKCS_V15, 0 );
5302 
5303  if( strlen( "fedcba9876543210deadbeefcafe4321" ) )
5304  {
5305  fct_chk( mpi_read_string( &ctx.N, 16, "fedcba9876543210deadbeefcafe4321" ) == 0 );
5306  }
5307  if( strlen( "00fedcba9876543213" ) )
5308  {
5309  fct_chk( mpi_read_string( &ctx.E, 16, "00fedcba9876543213" ) == 0 );
5310  }
5311 
5312  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
5313 
5314  rsa_free( &ctx );
5315  }
5316  FCT_TEST_END();
5317 
5318 
5319  FCT_TEST_BGN(rsa_check_public_key_8_e_larger_than_64_bits)
5320  {
5321  rsa_context ctx;
5322 
5323  rsa_init( &ctx, RSA_PKCS_V15, 0 );
5324 
5325  if( strlen( "fedcba9876543210deadbeefcafe4321" ) )
5326  {
5327  fct_chk( mpi_read_string( &ctx.N, 16, "fedcba9876543210deadbeefcafe4321" ) == 0 );
5328  }
5329  if( strlen( "01fedcba9876543213" ) )
5330  {
5331  fct_chk( mpi_read_string( &ctx.E, 16, "01fedcba9876543213" ) == 0 );
5332  }
5333 
5335 
5336  rsa_free( &ctx );
5337  }
5338  FCT_TEST_END();
5339 
5340 
5341  FCT_TEST_BGN(rsa_private_correct)
5342  {
5343  unsigned char message_str[1000];
5344  unsigned char output[1000];
5345  unsigned char output_str[1000];
5346  rsa_context ctx;
5347  mpi P1, Q1, H, G;
5348 
5349  mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
5350  rsa_init( &ctx, RSA_PKCS_V15, 0 );
5351 
5352  memset( message_str, 0x00, 1000 );
5353  memset( output, 0x00, 1000 );
5354  memset( output_str, 0x00, 1000 );
5355 
5356  ctx.len = 2048 / 8;
5357  fct_chk( mpi_read_string( &ctx.P, 16, "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) == 0 );
5358  fct_chk( mpi_read_string( &ctx.Q, 16, "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) == 0 );
5359  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
5360  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
5361 
5362  fct_chk( mpi_sub_int( &P1, &ctx.P, 1 ) == 0 );
5363  fct_chk( mpi_sub_int( &Q1, &ctx.Q, 1 ) == 0 );
5364  fct_chk( mpi_mul_mpi( &H, &P1, &Q1 ) == 0 );
5365  fct_chk( mpi_gcd( &G, &ctx.E, &H ) == 0 );
5366  fct_chk( mpi_inv_mod( &ctx.D , &ctx.E, &H ) == 0 );
5367  fct_chk( mpi_mod_mpi( &ctx.DP, &ctx.D, &P1 ) == 0 );
5368  fct_chk( mpi_mod_mpi( &ctx.DQ, &ctx.D, &Q1 ) == 0 );
5369  fct_chk( mpi_inv_mod( &ctx.QP, &ctx.Q, &ctx.P ) == 0 );
5370 
5371  fct_chk( rsa_check_privkey( &ctx ) == 0 );
5372 
5373  unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
5374 
5375  fct_chk( rsa_private( &ctx, message_str, output ) == 0 );
5376  if( 0 == 0 )
5377  {
5378  hexify( output_str, output, ctx.len );
5379 
5380  fct_chk( strcasecmp( (char *) output_str, "48ce62658d82be10737bd5d3579aed15bc82617e6758ba862eeb12d049d7bacaf2f62fce8bf6e980763d1951f7f0eae3a493df9890d249314b39d00d6ef791de0daebf2c50f46e54aeb63a89113defe85de6dbe77642aae9f2eceb420f3a47a56355396e728917f17876bb829fabcaeef8bf7ef6de2ff9e84e6108ea2e52bbb62b7b288efa0a3835175b8b08fac56f7396eceb1c692d419ecb79d80aef5bc08a75d89de9f2b2d411d881c0e3ffad24c311a19029d210d3d3534f1b626f982ea322b4d1cfba476860ef20d4f672f38c371084b5301b429b747ea051a619e4430e0dac33c12f9ee41ca4d81a4f6da3e495aa8524574bdc60d290dd1f7a62e90a67" ) == 0 );
5381  }
5382 
5383  mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
5384  rsa_free( &ctx );
5385  }
5386  FCT_TEST_END();
5387 
5388 
5389  FCT_TEST_BGN(rsa_private_data_larger_than_n)
5390  {
5391  unsigned char message_str[1000];
5392  unsigned char output[1000];
5393  unsigned char output_str[1000];
5394  rsa_context ctx;
5395  mpi P1, Q1, H, G;
5396 
5397  mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
5398  rsa_init( &ctx, RSA_PKCS_V15, 0 );
5399 
5400  memset( message_str, 0x00, 1000 );
5401  memset( output, 0x00, 1000 );
5402  memset( output_str, 0x00, 1000 );
5403 
5404  ctx.len = 2048 / 8;
5405  fct_chk( mpi_read_string( &ctx.P, 16, "e79a373182bfaa722eb035f772ad2a9464bd842de59432c18bbab3a7dfeae318c9b915ee487861ab665a40bd6cda560152578e8579016c929df99fea05b4d64efca1d543850bc8164b40d71ed7f3fa4105df0fb9b9ad2a18ce182c8a4f4f975bea9aa0b9a1438a27a28e97ac8330ef37383414d1bd64607d6979ac050424fd17" ) == 0 );
5406  fct_chk( mpi_read_string( &ctx.Q, 16, "c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3b39421e24ee034fbf367d11f6b8f88ee483d163b431e1654ad3e89" ) == 0 );
5407  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
5408  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
5409 
5410  fct_chk( mpi_sub_int( &P1, &ctx.P, 1 ) == 0 );
5411  fct_chk( mpi_sub_int( &Q1, &ctx.Q, 1 ) == 0 );
5412  fct_chk( mpi_mul_mpi( &H, &P1, &Q1 ) == 0 );
5413  fct_chk( mpi_gcd( &G, &ctx.E, &H ) == 0 );
5414  fct_chk( mpi_inv_mod( &ctx.D , &ctx.E, &H ) == 0 );
5415  fct_chk( mpi_mod_mpi( &ctx.DP, &ctx.D, &P1 ) == 0 );
5416  fct_chk( mpi_mod_mpi( &ctx.DQ, &ctx.D, &Q1 ) == 0 );
5417  fct_chk( mpi_inv_mod( &ctx.QP, &ctx.Q, &ctx.P ) == 0 );
5418 
5419  fct_chk( rsa_check_privkey( &ctx ) == 0 );
5420 
5421  unhexify( message_str, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" );
5422 
5423  fct_chk( rsa_private( &ctx, message_str, output ) == POLARSSL_ERR_RSA_BAD_INPUT_DATA );
5425  {
5426  hexify( output_str, output, ctx.len );
5427 
5428  fct_chk( strcasecmp( (char *) output_str, "605baf947c0de49e4f6a0dfb94a43ae318d5df8ed20ba4ba5a37a73fb009c5c9e5cce8b70a25b1c7580f389f0d7092485cdfa02208b70d33482edf07a7eafebdc54862ca0e0396a5a7d09991b9753eb1ffb6091971bb5789c6b121abbcd0a3cbaa39969fa7c28146fce96c6d03272e3793e5be8f5abfa9afcbebb986d7b3050604a2af4d3a40fa6c003781a539a60259d1e84f13322da9e538a49c369b83e7286bf7d30b64bbb773506705da5d5d5483a563a1ffacc902fb75c9a751b1e83cdc7a6db0470056883f48b5a5446b43b1d180ea12ba11a6a8d93b3b32a30156b6084b7fb142998a2a0d28014b84098ece7d9d5e4d55cc342ca26f5a0167a679dec8" ) == 0 );
5429  }
5430 
5431  mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
5432  rsa_free( &ctx );
5433  }
5434  FCT_TEST_END();
5435 
5436 
5437  FCT_TEST_BGN(rsa_public_correct)
5438  {
5439  unsigned char message_str[1000];
5440  unsigned char output[1000];
5441  unsigned char output_str[1000];
5442  rsa_context ctx;
5443 
5444  rsa_init( &ctx, RSA_PKCS_V15, 0 );
5445  memset( message_str, 0x00, 1000 );
5446  memset( output, 0x00, 1000 );
5447  memset( output_str, 0x00, 1000 );
5448 
5449  ctx.len = 2048 / 8;
5450  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
5451  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
5452 
5453  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
5454 
5455  unhexify( message_str, "59779fd2a39e56640c4fc1e67b60aeffcecd78aed7ad2bdfa464e93d04198d48466b8da7445f25bfa19db2844edd5c8f539cf772cc132b483169d390db28a43bc4ee0f038f6568ffc87447746cb72fefac2d6d90ee3143a915ac4688028805905a68eb8f8a96674b093c495eddd8704461eaa2b345efbb2ad6930acd8023f870" );
5456 
5457  fct_chk( rsa_public( &ctx, message_str, output ) == 0 );
5458  if( 0 == 0 )
5459  {
5460  hexify( output_str, output, ctx.len );
5461 
5462  fct_chk( strcasecmp( (char *) output_str, "1f5e927c13ff231090b0f18c8c3526428ed0f4a7561457ee5afe4d22d5d9220c34ef5b9a34d0c07f7248a1f3d57f95d10f7936b3063e40660b3a7ca3e73608b013f85a6e778ac7c60d576e9d9c0c5a79ad84ceea74e4722eb3553bdb0c2d7783dac050520cb27ca73478b509873cb0dcbd1d51dd8fccb96c29ad314f36d67cc57835d92d94defa0399feb095fd41b9f0b2be10f6041079ed4290040449f8a79aba50b0a1f8cf83c9fb8772b0686ec1b29cb1814bb06f9c024857db54d395a8da9a2c6f9f53b94bec612a0cb306a3eaa9fc80992e85d9d232e37a50cabe48c9343f039601ff7d95d60025e582aec475d031888310e8ec3833b394a5cf0599101e" ) == 0 );
5463  }
5464 
5465  rsa_free( &ctx );
5466  }
5467  FCT_TEST_END();
5468 
5469 
5470  FCT_TEST_BGN(rsa_public_data_larger_than_n)
5471  {
5472  unsigned char message_str[1000];
5473  unsigned char output[1000];
5474  unsigned char output_str[1000];
5475  rsa_context ctx;
5476 
5477  rsa_init( &ctx, RSA_PKCS_V15, 0 );
5478  memset( message_str, 0x00, 1000 );
5479  memset( output, 0x00, 1000 );
5480  memset( output_str, 0x00, 1000 );
5481 
5482  ctx.len = 2048 / 8;
5483  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
5484  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
5485 
5486  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
5487 
5488  unhexify( message_str, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" );
5489 
5490  fct_chk( rsa_public( &ctx, message_str, output ) == POLARSSL_ERR_RSA_BAD_INPUT_DATA );
5492  {
5493  hexify( output_str, output, ctx.len );
5494 
5495  fct_chk( strcasecmp( (char *) output_str, "605baf947c0de49e4f6a0dfb94a43ae318d5df8ed20ba4ba5a37a73fb009c5c9e5cce8b70a25b1c7580f389f0d7092485cdfa02208b70d33482edf07a7eafebdc54862ca0e0396a5a7d09991b9753eb1ffb6091971bb5789c6b121abbcd0a3cbaa39969fa7c28146fce96c6d03272e3793e5be8f5abfa9afcbebb986d7b3050604a2af4d3a40fa6c003781a539a60259d1e84f13322da9e538a49c369b83e7286bf7d30b64bbb773506705da5d5d5483a563a1ffacc902fb75c9a751b1e83cdc7a6db0470056883f48b5a5446b43b1d180ea12ba11a6a8d93b3b32a30156b6084b7fb142998a2a0d28014b84098ece7d9d5e4d55cc342ca26f5a0167a679dec8" ) == 0 );
5496  }
5497 
5498  rsa_free( &ctx );
5499  }
5500  FCT_TEST_END();
5501 
5502 #ifdef POLARSSL_ENTROPY_C
5503 #ifdef POLARSSL_CTR_DRBG_C
5504 
5505  FCT_TEST_BGN(rsa_generate_key)
5506  {
5507  rsa_context ctx;
5508  entropy_context entropy;
5509  ctr_drbg_context ctr_drbg;
5510  char *pers = "test_suite_rsa";
5511 
5512  entropy_init( &entropy );
5513  fct_chk( ctr_drbg_init( &ctr_drbg, entropy_func, &entropy,
5514  (unsigned char *) pers, strlen( pers ) ) == 0 );
5515 
5516  rsa_init( &ctx, 0, 0 );
5517 
5518  fct_chk( rsa_gen_key( &ctx, ctr_drbg_random, &ctr_drbg, 128, 3 ) == 0 );
5519  if( 0 == 0 )
5520  {
5521  fct_chk( rsa_check_privkey( &ctx ) == 0 );
5522  }
5523 
5524  rsa_free( &ctx );
5525  }
5526  FCT_TEST_END();
5527 #endif /* POLARSSL_ENTROPY_C */
5528 #endif /* POLARSSL_CTR_DRBG_C */
5529 
5530 #ifdef POLARSSL_ENTROPY_C
5531 #ifdef POLARSSL_CTR_DRBG_C
5532 
5533  FCT_TEST_BGN(rsa_generate_key_number_of_bits_too_small)
5534  {
5535  rsa_context ctx;
5536  entropy_context entropy;
5537  ctr_drbg_context ctr_drbg;
5538  char *pers = "test_suite_rsa";
5539 
5540  entropy_init( &entropy );
5541  fct_chk( ctr_drbg_init( &ctr_drbg, entropy_func, &entropy,
5542  (unsigned char *) pers, strlen( pers ) ) == 0 );
5543 
5544  rsa_init( &ctx, 0, 0 );
5545 
5546  fct_chk( rsa_gen_key( &ctx, ctr_drbg_random, &ctr_drbg, 127, 3 ) == POLARSSL_ERR_RSA_BAD_INPUT_DATA );
5548  {
5549  fct_chk( rsa_check_privkey( &ctx ) == 0 );
5550  }
5551 
5552  rsa_free( &ctx );
5553  }
5554  FCT_TEST_END();
5555 #endif /* POLARSSL_ENTROPY_C */
5556 #endif /* POLARSSL_CTR_DRBG_C */
5557 
5558 #ifdef POLARSSL_ENTROPY_C
5559 #ifdef POLARSSL_CTR_DRBG_C
5560 
5561  FCT_TEST_BGN(rsa_generate_key_exponent_too_small)
5562  {
5563  rsa_context ctx;
5564  entropy_context entropy;
5565  ctr_drbg_context ctr_drbg;
5566  char *pers = "test_suite_rsa";
5567 
5568  entropy_init( &entropy );
5569  fct_chk( ctr_drbg_init( &ctr_drbg, entropy_func, &entropy,
5570  (unsigned char *) pers, strlen( pers ) ) == 0 );
5571 
5572  rsa_init( &ctx, 0, 0 );
5573 
5574  fct_chk( rsa_gen_key( &ctx, ctr_drbg_random, &ctr_drbg, 128, 2 ) == POLARSSL_ERR_RSA_BAD_INPUT_DATA );
5576  {
5577  fct_chk( rsa_check_privkey( &ctx ) == 0 );
5578  }
5579 
5580  rsa_free( &ctx );
5581  }
5582  FCT_TEST_END();
5583 #endif /* POLARSSL_ENTROPY_C */
5584 #endif /* POLARSSL_CTR_DRBG_C */
5585 
5586 #ifdef POLARSSL_ENTROPY_C
5587 #ifdef POLARSSL_CTR_DRBG_C
5588 
5589  FCT_TEST_BGN(rsa_generate_key)
5590  {
5591  rsa_context ctx;
5592  entropy_context entropy;
5593  ctr_drbg_context ctr_drbg;
5594  char *pers = "test_suite_rsa";
5595 
5596  entropy_init( &entropy );
5597  fct_chk( ctr_drbg_init( &ctr_drbg, entropy_func, &entropy,
5598  (unsigned char *) pers, strlen( pers ) ) == 0 );
5599 
5600  rsa_init( &ctx, 0, 0 );
5601 
5602  fct_chk( rsa_gen_key( &ctx, ctr_drbg_random, &ctr_drbg, 1024, 3 ) == 0 );
5603  if( 0 == 0 )
5604  {
5605  fct_chk( rsa_check_privkey( &ctx ) == 0 );
5606  }
5607 
5608  rsa_free( &ctx );
5609  }
5610  FCT_TEST_END();
5611 #endif /* POLARSSL_ENTROPY_C */
5612 #endif /* POLARSSL_CTR_DRBG_C */
5613 
5614 
5615  FCT_TEST_BGN(rsa_pkcs1_encrypt_bad_rng)
5616  {
5617  unsigned char message_str[1000];
5618  unsigned char output[1000];
5619  unsigned char output_str[1000];
5620  rsa_context ctx;
5621  size_t msg_len;
5622 
5623  rsa_init( &ctx, RSA_PKCS_V15, 0 );
5624  memset( message_str, 0x00, 1000 );
5625  memset( output, 0x00, 1000 );
5626  memset( output_str, 0x00, 1000 );
5627 
5628  ctx.len = 2048 / 8;
5629  fct_chk( mpi_read_string( &ctx.N, 16, "b38ac65c8141f7f5c96e14470e851936a67bf94cc6821a39ac12c05f7c0b06d9e6ddba2224703b02e25f31452f9c4a8417b62675fdc6df46b94813bc7b9769a892c482b830bfe0ad42e46668ace68903617faf6681f4babf1cc8e4b0420d3c7f61dc45434c6b54e2c3ee0fc07908509d79c9826e673bf8363255adb0add2401039a7bcd1b4ecf0fbe6ec8369d2da486eec59559dd1d54c9b24190965eafbdab203b35255765261cd0909acf93c3b8b8428cbb448de4715d1b813d0c94829c229543d391ce0adab5351f97a3810c1f73d7b1458b97daed4209c50e16d064d2d5bfda8c23893d755222793146d0a78c3d64f35549141486c3b0961a7b4c1a2034f" ) == 0 );
5630  fct_chk( mpi_read_string( &ctx.E, 16, "3" ) == 0 );
5631 
5632  fct_chk( rsa_check_pubkey( &ctx ) == 0 );
5633 
5634  msg_len = unhexify( message_str, "4E636AF98E40F3ADCFCCB698F4E80B9F" );
5635 
5636  fct_chk( rsa_pkcs1_encrypt( &ctx, &rnd_zero_rand, NULL, RSA_PUBLIC, msg_len, message_str, output ) == POLARSSL_ERR_RSA_RNG_FAILED );
5637  if( POLARSSL_ERR_RSA_RNG_FAILED == 0 )
5638  {
5639  hexify( output_str, output, ctx.len );
5640 
5641  fct_chk( strcasecmp( (char *) output_str, "a42eda41e56235e666e7faaa77100197f657288a1bf183e4820f0c37ce2c456b960278d6003e0bbcd4be4a969f8e8fd9231e1f492414f00ed09844994c86ec32db7cde3bec7f0c3dbf6ae55baeb2712fa609f5fc3207a824eb3dace31849cd6a6084318523912bccb84cf42e3c6d6d1685131d69bb545acec827d2b0dfdd5568b7dcc4f5a11d6916583fefa689d367f8c9e1d95dcd2240895a9470b0c1730f97cd6e8546860bd254801769f54be96e16362ddcbf34d56035028890199e0f48db38642cb66a4181e028a6443a404fea284ce02b4614b683367d40874e505611d23142d49f06feea831d52d347b13610b413c4efc43a6de9f0b08d2a951dc503b6" ) == 0 );
5642  }
5643 
5644  rsa_free( &ctx );
5645  }
5646  FCT_TEST_END();
5647 
5648 #ifdef POLARSSL_SELF_TEST
5649 
5650  FCT_TEST_BGN(rsa_selftest)
5651  {
5652  fct_chk( rsa_self_test( 0 ) == 0 );
5653  }
5654  FCT_TEST_END();
5655 #endif /* POLARSSL_SELF_TEST */
5656 
5657  }
5658  FCT_SUITE_END();
5659 
5660 #endif /* POLARSSL_RSA_C */
5661 #endif /* POLARSSL_BIGNUM_C */
5662 #endif /* POLARSSL_GENPRIME */
5663 
5664 }
5665 FCT_END();
5666