- 25364B546A9EC5983239A7C783B316F704C814EBEE5778CFA595F14F802E64930B7234EE536E0F69E519BF36B558BEA432D62A85D670D0FF62556CC12C6A1DC6
+ 8293DE5FE325F0499D3FC0B882E94B3E8E297911D2C9AA83ECDCBCAA13914273DB14ED6A077CA24F75B34D9258224E72806F917DEF17D5CF7762B06D5A54F008
eucrypt/smg_rsa/tests/tests.c
(184 . 10)(184 . 234)
241 close(entropy_source);
242 }
243
244 /* Test encryption+decryption on noctets of random data, using sk
245 * Output is written to file.
246 */
247 void test_rsa_keys( RSA_secret_key *sk, unsigned int noctets, FILE *file ) {
248 RSA_public_key pk;
249 MPI test = mpi_alloc ( mpi_nlimb_hint_from_nbytes (noctets) );
250 MPI out1 = mpi_alloc ( mpi_nlimb_hint_from_nbytes (noctets) );
251 MPI out2 = mpi_alloc ( mpi_nlimb_hint_from_nbytes (noctets) );
252
253 pk.n = mpi_copy(sk->n);
254 pk.e = mpi_copy(sk->e);
255 unsigned char *p;
256 p = xmalloc(noctets);
257
258 fprintf(file, "TEST encrypt/decrypt on %d octets of random data\n", noctets);
259 fflush(file);
260 if (get_random_octets( noctets, p) == noctets) {
261 mpi_set_buffer( test, p, noctets, 0 );
262
263 fprintf(file, "TEST data:\n");
264 mpi_print(file, test, 1);
265 fprintf(file, "\n");
266 fflush(file);
267
268 public_rsa( out1, test, &pk );
269 secret_rsa( out2, out1, sk );
270
271 fprintf(file, "ENCRYPTED with PUBLIC key data:\n");
272 mpi_print(file, out1, 1);
273 fprintf(file, "\n");
274 fflush(file);
275
276 fprintf(file, "DECRYPTED with SECRET key:\n");
277 mpi_print(file, out2, 1);
278 fprintf(file, "\n");
279 fflush(file);
280
281 if( mpi_cmp( test, out2 ) )
282 fprintf(file, "FAILED: RSA operation: public(secret) failed\n");
283 else
284 fprintf(file, "PASSED: RSA operation: public(secret) passed\n");
285 fflush(file);
286
287 secret_rsa( out1, test, sk );
288 public_rsa( out2, out1, &pk );
289 if( mpi_cmp( test, out2 ) )
290 fprintf(file, "FAILED: RSA operation: secret(public) failed\n");
291 else
292 fprintf(file, "PASSED: RSA operation: secret(public) passed\n");
293 }
294 else
295 fprintf(file, "FAILED: not enough bits returned from entropy source\n");
296
297 fflush(file);
298 xfree(p);
299 mpi_free( pk.n);
300 mpi_free( pk.e);
301
302 mpi_free( test );
303 mpi_free( out1 );
304 mpi_free( out2 );
305 }
306
307 void test_rsa( int nruns, FILE *fkeys, FILE *fout) {
308 RSA_secret_key sk;
309 int noctets = KEY_LENGTH_OCTETS;
310 int noctets_pq = noctets / 2;
311 int nlimbs = mpi_nlimb_hint_from_nbytes(noctets);
312 int nlimbs_pq = mpi_nlimb_hint_from_nbytes(noctets_pq);
313 int i;
314
315 sk.n = mpi_alloc(nlimbs);
316 sk.e = mpi_alloc(nlimbs);
317 sk.d = mpi_alloc(nlimbs);
318 sk.p = mpi_alloc(nlimbs_pq);
319 sk.q = mpi_alloc(nlimbs_pq);
320 sk.u = mpi_alloc(nlimbs_pq);
321
322 printf("TEST RSA key generation and use with %d runs\n", nruns);
323 fflush(stdout);
324
325 for (i = 0;i < nruns; i++) {
326 gen_keypair(&sk);
327 printf(".");
328 fflush(stdout);
329
330 mpi_print(fkeys, sk.n, 1);
331 fwrite("\n", sizeof(char), 1, fkeys);
332
333 mpi_print(fkeys, sk.e, 1);
334 fwrite("\n", sizeof(char), 1, fkeys);
335
336 mpi_print(fkeys, sk.d, 1);
337 fwrite("\n", sizeof(char), 1, fkeys);
338
339 mpi_print(fkeys, sk.p, 1);
340 fwrite("\n", sizeof(char), 1, fkeys);
341
342 mpi_print(fkeys, sk.q, 1);
343 fwrite("\n", sizeof(char), 1, fkeys);
344
345 mpi_print(fkeys, sk.u, 1);
346 fwrite("\n", sizeof(char), 1, fkeys);
347
348 test_rsa_keys(&sk, noctets_pq, fout);
349 printf("*");
350 fflush(stdout);
351 }
352
353 mpi_free(sk.n);
354 mpi_free(sk.e);
355 mpi_free(sk.d);
356 mpi_free(sk.p);
357 mpi_free(sk.q);
358 mpi_free(sk.u);
359
360 }
361
362 void test_rsa_exp() {
363 MPI msg = mpi_alloc(0);
364 MPI expected = mpi_alloc(0);
365 MPI result;
366
367 RSA_public_key pk;
368 pk.n = mpi_alloc(0);
369 pk.e = mpi_alloc(0);
370
371 printf("TEST verify of rsa exponentiation on input data: \n");
372
373 mpi_fromstr(msg, "0x\
374 5B6A8A0ACF4F4DB3F82EAC2D20255E4DF3E4B7C799603210766F26EF87C8980E737579\
375 EC08E6505A51D19654C26D806BAF1B62F9C032E0B13D02AF99F7313BFCFD68DA46836E\
376 CA529D7360948550F982C6476C054A97FD01635AB44BFBDBE2A90BE06F7984AC8534C3\
377 8613747F340C18176E6D5F0C10246A2FCE3A668EACB6165C2052497CA2EE483F4FD8D0\
378 6A9911BD97E9B6720521D872BD08FF8DA11A1B8DB147F252E4E69AE6201D3B374B171D\
379 F445EF2BF509D468FD57CEB5840349B14C6E2AAA194D9531D238B85B8F0DD352D1E596\
380 71539B429849E5D965E438BF9EFFC338DF9AADF304C4130D5A05E006ED855F37A06242\
381 28097EF92F6E78CAE0CB97");
382
383 mpi_fromstr(expected, "0x\
384 1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\
385 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\
386 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\
387 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\
388 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF003051300\
389 D0609608648016503040203050004406255509399A3AF322C486C770C5F7F6E05E18FC\
390 3E2219A03CA56C7501426A597187468B2F71B4A198C807171B73D0E7DBC3EEF6EA6AFF\
391 693DE58E18FF84395BE");
392 result = mpi_alloc( mpi_get_nlimbs(expected) );
393
394 mpi_fromstr(pk.n, "0x\
395 CDD49A674BAF76D3B73E25BC6DF66EF3ABEDDCA461D3CCB6416793E3437C7806562694\
396 73C2212D5FD5EED17AA067FEC001D8E76EC901EDEDF960304F891BD3CAD7F9A335D1A2\
397 EC37EABEFF3FBE6D3C726DC68E599EBFE5456EF19813398CD7D548D746A30AA47D4293\
398 968BFBAFCBF65A90DFFC87816FEE2A01E1DC699F4DDABB84965514C0D909D54FDA7062\
399 A2037B50B771C153D5429BA4BA335EAB840F9551E9CD9DF8BB4A6DC3ED1318FF3969F7\
400 B99D9FB90CAB968813F8AD4F9A069C9639A74D70A659C69C29692567CE863B88E191CC\
401 9535B91B417D0AF14BE09C78B53AF9C5F494BCF2C60349FFA93C81E817AC682F0055A6\
402 07BB56D6A281C1A04CEFE1");
403
404 mpi_fromstr( pk.e, "0x10001");
405
406 mpi_print( stdout, msg, 1);
407 printf("\n");
408
409 public_rsa( result, msg, &pk);
410 if ( mpi_cmp( result, expected) != 0 )
411 printf( "FAILED\n");
412 else
413 printf( "PASSED\n");
414
415 printf("Expected:\n");
416 mpi_print( stdout, expected, 1);
417 printf("\n");
418
419 printf("Obtained:\n");
420 mpi_print( stdout, result, 1);
421 printf("\n");
422
423 mpi_free( pk.n );
424 mpi_free( pk.e );
425 mpi_free( msg );
426 mpi_free( expected );
427 mpi_free( result );
428 }
429
430 void time_rsa_gen( int nruns ) {
431 struct timespec tstart, tend;
432 long int diff;
433 int i;
434
435 RSA_secret_key sk;
436 int noctets = KEY_LENGTH_OCTETS;
437 int noctets_pq = noctets / 2;
438 int nlimbs = mpi_nlimb_hint_from_nbytes(noctets);
439 int nlimbs_pq = mpi_nlimb_hint_from_nbytes(noctets_pq);
440 sk.n = mpi_alloc(nlimbs);
441 sk.e = mpi_alloc(nlimbs);
442 sk.d = mpi_alloc(nlimbs);
443 sk.p = mpi_alloc(nlimbs_pq);
444 sk.q = mpi_alloc(nlimbs_pq);
445 sk.u = mpi_alloc(nlimbs_pq);
446
447 clock_gettime(CLOCK_MONOTONIC, &tstart);
448 for (i = 0;i < nruns; i++) {
449 gen_keypair(&sk);
450 }
451 clock_gettime(CLOCK_MONOTONIC, &tend);
452
453 diff = tend.tv_sec-tstart.tv_sec;
454
455 printf("TOTAL: %ld seconds for generating %d key pairs\n", diff, nruns);
456 printf("Average (%d runs): %f seconds per TMSR RSA key pair.\n",
457 nruns, diff / (1.0*nruns));
458 mpi_free(sk.n);
459 mpi_free(sk.e);
460 mpi_free(sk.d);
461 mpi_free(sk.p);
462 mpi_free(sk.q);
463 mpi_free(sk.u);
464 }
465
466 int main(int ac, char **av)
467 {
468 int nruns;
469 int id;
470 FILE *fk;
471 FILE *fout;
472
473 if (ac<2) {
474 printf("Usage: %s number_of_runs/octets [testID]\n", av[0]);
(236 . 6)(460 . 25)
476 case 5:
477 time_rpng(nruns);
478 break;
479 case 6:
480 fk = fopen("keys.asc", "a");
481 if ( fk == NULL )
482 err("Failed to open file keys.asc!");
483 fout = fopen("check_keys.asc", "a");
484 if ( fout == NULL ) {
485 fclose(fk);
486 err("Failed to open file keys_check.asc!");
487 }
488 test_rsa(nruns, fk, fout);
489 fclose(fk);
490 fclose(fout);
491 break;
492 case 7:
493 test_rsa_exp();
494 break;
495 case 8:
496 time_rsa_gen(nruns);
497 break;
498 default:
499 printf("Current test ids:\n");
500 printf("0 for timing entropy source\n");
(244 . 6)(487 . 10)
502 printf("3 for timing Miller-Rabin\n");
503 printf("4 for random prime number generator test\n");
504 printf("5 for timing random prime number generator\n");
505 printf("6 for testing rsa key pair generation and use; \
506 writes to keys.asc and check_keys.asc\n");
507 printf("7 for testing rsa exponentiation (fixed data)\n");
508 printf("8 for timing rsa key pair generator\n");
509 }
510
511 return 0;