34 #if defined(POLARSSL_RSA_C)
38 #if defined(POLARSSL_PKCS1_V21)
58 #if defined(POLARSSL_GENPRIME)
64 int (*f_rng)(
void *,
unsigned char *,
size_t),
66 unsigned int nbits,
int exponent )
71 if( f_rng == NULL || nbits < 128 || exponent < 3 )
140 if( !ctx->
N.
p || !ctx->
E.
p )
143 if( ( ctx->
N.
p[0] & 1 ) == 0 ||
144 ( ctx->
E.
p[0] & 1 ) == 0 )
164 mpi PQ, DE, P1, Q1, H, I, G, G2, L1, L2, DP, DQ, QP;
169 if( !ctx->
P.
p || !ctx->
Q.
p || !ctx->
D.
p )
224 const unsigned char *input,
225 unsigned char *output )
259 int (*f_rng)(
void *,
unsigned char *,
size_t),
261 const unsigned char *input,
262 unsigned char *output )
266 mpi T, T1, T2, Vi, Vf;
279 #if defined(POLARSSL_RSA_NO_CRT)
361 #if defined(POLARSSL_PKCS1_V21)
371 static void mgf_mask(
unsigned char *dst,
size_t dlen,
unsigned char *src,
size_t slen,
375 unsigned char counter[4];
381 memset( counter, 0, 4 );
400 for( i = 0; i < use_len; ++i )
410 #if defined(POLARSSL_PKCS1_V21)
415 int (*f_rng)(
void *,
unsigned char *,
size_t),
418 const unsigned char *label,
size_t label_len,
420 const unsigned char *input,
421 unsigned char *output )
425 unsigned char *p = output;
435 if( md_info == NULL )
441 if( olen < ilen + 2 * hlen + 2 || f_rng == NULL )
444 memset( output, 0, olen );
450 if( ( ret = f_rng( p_rng, p, hlen ) ) != 0 )
457 md( md_info, label, label_len, p );
459 p += olen - 2 * hlen - 2 - ilen;
461 memcpy( p, input, ilen );
467 mgf_mask( output + hlen + 1, olen - hlen - 1, output + 1, hlen,
472 mgf_mask( output + 1, hlen, output + hlen + 1, olen - hlen - 1,
479 :
rsa_private( ctx, f_rng, p_rng, output, output ) );
487 int (*f_rng)(
void *,
unsigned char *,
size_t),
489 int mode,
size_t ilen,
490 const unsigned char *input,
491 unsigned char *output )
495 unsigned char *p = output;
502 if( olen < ilen + 11 )
505 nb_pad = olen - 3 - ilen;
512 while( nb_pad-- > 0 )
517 ret = f_rng( p_rng, p, 1 );
518 }
while( *p == 0 && --rng_dl && ret == 0 );
522 if( rng_dl == 0 || ret != 0)
532 while( nb_pad-- > 0 )
537 memcpy( p, input, ilen );
541 :
rsa_private( ctx, f_rng, p_rng, output, output ) );
548 int (*f_rng)(
void *,
unsigned char *,
size_t),
550 int mode,
size_t ilen,
551 const unsigned char *input,
552 unsigned char *output )
560 #if defined(POLARSSL_PKCS1_V21)
563 ilen, input, output );
571 #if defined(POLARSSL_PKCS1_V21)
576 int (*f_rng)(
void *,
unsigned char *,
size_t),
579 const unsigned char *label,
size_t label_len,
581 const unsigned char *input,
582 unsigned char *output,
583 size_t output_max_len )
586 size_t ilen, i, pad_len;
587 unsigned char *p, bad, pad_done;
602 if( ilen < 16 || ilen >
sizeof( buf ) )
606 if( md_info == NULL )
627 md( md_info, label, label_len, lhash );
630 mgf_mask( buf + 1, hlen, buf + hlen + 1, ilen - hlen - 1,
634 mgf_mask( buf + hlen + 1, ilen - hlen - 1, buf + 1, hlen,
650 for( i = 0; i < hlen; i++ )
651 bad |= lhash[i] ^ *p++;
657 for( i = 0; i < ilen - 2 * hlen - 2; i++ )
660 pad_len += ( pad_done == 0 );
675 if (ilen - (p - buf) > output_max_len)
678 *olen = ilen - (p - buf);
679 memcpy( output, p, *olen );
689 int (*f_rng)(
void *,
unsigned char *,
size_t),
691 int mode,
size_t *olen,
692 const unsigned char *input,
693 unsigned char *output,
694 size_t output_max_len)
697 size_t ilen, pad_count = 0, i;
698 unsigned char *p, bad, pad_done = 0;
706 if( ilen < 16 || ilen >
sizeof( buf ) )
731 for( i = 0; i < ilen - 3; i++ )
733 pad_done |= ( p[i] == 0 );
734 pad_count += ( pad_done == 0 );
746 for( i = 0; i < ilen - 3; i++ )
748 pad_done |= ( p[i] != 0xFF );
749 pad_count += ( pad_done == 0 );
759 if (ilen - (p - buf) > output_max_len)
762 *olen = ilen - (p - buf);
763 memcpy( output, p, *olen );
772 int (*f_rng)(
void *,
unsigned char *,
size_t),
774 int mode,
size_t *olen,
775 const unsigned char *input,
776 unsigned char *output,
777 size_t output_max_len)
783 input, output, output_max_len );
785 #if defined(POLARSSL_PKCS1_V21)
788 olen, input, output, output_max_len );
796 #if defined(POLARSSL_PKCS1_V21)
801 int (*f_rng)(
void *,
unsigned char *,
size_t),
805 unsigned int hashlen,
806 const unsigned char *hash,
810 unsigned char *p = sig;
812 unsigned int slen, hlen, offset = 0;
856 if( md_info == NULL )
862 if( olen < hlen + slen + 2 )
865 memset( sig, 0, olen );
871 if( ( ret = f_rng( p_rng, salt, slen ) ) != 0 )
877 p += olen - hlen * 2 - 2;
879 memcpy( p, salt, slen );
899 mgf_mask( sig + offset, olen - hlen - 1 - offset, p, hlen, &md_ctx );
903 sig[0] &= 0xFF >> ( olen * 8 - msb );
921 int (*f_rng)(
void *,
unsigned char *,
size_t),
925 unsigned int hashlen,
926 const unsigned char *hash,
930 unsigned char *p = sig;
940 nb_pad = olen - 3 - hashlen;
946 nb_pad = olen - 3 - 34;
950 nb_pad = olen - 3 - 35;
954 nb_pad = olen - 3 - 47;
958 nb_pad = olen - 3 - 51;
962 nb_pad = olen - 3 - 67;
966 nb_pad = olen - 3 - 83;
974 if( ( nb_pad < 8 ) || ( nb_pad > olen ) )
979 memset( p, 0xFF, nb_pad );
986 memcpy( p, hash, hashlen );
991 memcpy( p + 18, hash, 16 );
996 memcpy( p + 18, hash, 16 );
1001 memcpy( p + 18, hash, 16 );
1006 memcpy( p + 15, hash, 20 );
1011 memcpy( p + 19, hash, 28 );
1012 p[1] += 28; p[14] = 4; p[18] += 28;
break;
1016 memcpy( p + 19, hash, 32 );
1017 p[1] += 32; p[14] = 1; p[18] += 32;
break;
1021 memcpy( p + 19, hash, 48 );
1022 p[1] += 48; p[14] = 2; p[18] += 48;
break;
1026 memcpy( p + 19, hash, 64 );
1027 p[1] += 64; p[14] = 3; p[18] += 64;
break;
1042 int (*f_rng)(
void *,
unsigned char *,
size_t),
1046 unsigned int hashlen,
1047 const unsigned char *hash,
1048 unsigned char *sig )
1054 hashlen, hash, sig );
1056 #if defined(POLARSSL_PKCS1_V21)
1059 hashlen, hash, sig );
1067 #if defined(POLARSSL_PKCS1_V21)
1072 int (*f_rng)(
void *,
unsigned char *,
size_t),
1076 unsigned int hashlen,
1077 const unsigned char *hash,
1078 unsigned char *sig )
1085 unsigned char zeros[8];
1096 if( siglen < 16 || siglen >
sizeof( buf ) )
1108 if( buf[siglen - 1] != 0xBC )
1144 if( md_info == NULL )
1148 slen = siglen - hlen - 1;
1150 memset( zeros, 0, 8 );
1163 if( buf[0] >> ( 8 - siglen * 8 + msb ) )
1168 mgf_mask( p, siglen - hlen - 1, p + siglen - hlen - 1, hlen, &md_ctx );
1170 buf[0] &= 0xFF >> ( siglen * 8 - msb );
1172 while( *p == 0 && p < buf + siglen )
1175 if( p == buf + siglen ||
1194 if( memcmp( p + slen, result, hlen ) == 0 )
1205 int (*f_rng)(
void *,
unsigned char *,
size_t),
1209 unsigned int hashlen,
1210 const unsigned char *hash,
1211 unsigned char *sig )
1215 unsigned char *p, c;
1223 if( siglen < 16 || siglen >
sizeof( buf ) )
1235 if( *p++ != 0 || *p++ != RSA_SIGN )
1240 if( p >= buf + siglen - 1 || *p != 0xFF )
1246 len = siglen - ( p - buf );
1251 memcmp( p + 13, hash, 20 ) == 0 )
1268 if( memcmp( p + 18, hash, 16 ) == 0 )
1278 memcmp( p + 15, hash, 20 ) == 0 )
1283 if( ( len == 19 + 28 && p[14] == 4 && hash_id ==
SIG_RSA_SHA224 ) ||
1294 memcmp( p + 19, hash, c ) == 0 )
1302 if( memcmp( p, hash, hashlen ) == 0 )
1315 int (*f_rng)(
void *,
unsigned char *,
size_t),
1319 unsigned int hashlen,
1320 const unsigned char *hash,
1321 unsigned char *sig )
1327 hash_id, hashlen, hash, sig );
1329 #if defined(POLARSSL_PKCS1_V21)
1332 hashlen, hash, sig );
1351 #if defined(POLARSSL_SELF_TEST)
1360 #define RSA_N "9292758453063D803DD603D5E777D788" \
1361 "8ED1D5BF35786190FA2F23EBC0848AEA" \
1362 "DDA92CA6C3D80B32C4D109BE0F36D6AE" \
1363 "7130B9CED7ACDF54CFC7555AC14EEBAB" \
1364 "93A89813FBF3C4F8066D2D800F7C38A8" \
1365 "1AE31942917403FF4946B0A83D3D3E05" \
1366 "EE57C6F5F5606FB5D4BC6CD34EE0801A" \
1367 "5E94BB77B07507233A0BC7BAC8F90F79"
1369 #define RSA_E "10001"
1371 #define RSA_D "24BF6185468786FDD303083D25E64EFC" \
1372 "66CA472BC44D253102F8B4A9D3BFA750" \
1373 "91386C0077937FE33FA3252D28855837" \
1374 "AE1B484A8A9A45F7EE8C0C634F99E8CD" \
1375 "DF79C5CE07EE72C7F123142198164234" \
1376 "CABB724CF78B8173B9F880FC86322407" \
1377 "AF1FEDFDDE2BEB674CA15F3E81A1521E" \
1378 "071513A1E85B5DFA031F21ECAE91A34D"
1380 #define RSA_P "C36D0EB7FCD285223CFB5AABA5BDA3D8" \
1381 "2C01CAD19EA484A87EA4377637E75500" \
1382 "FCB2005C5C7DD6EC4AC023CDA285D796" \
1383 "C3D9E75E1EFC42488BB4F1D13AC30A57"
1385 #define RSA_Q "C000DF51A7C77AE8D7C7370C1FF55B69" \
1386 "E211C2B9E5DB1ED0BF61D0D9899620F4" \
1387 "910E4168387E3C30AA1E00C339A79508" \
1388 "8452DD96A9A5EA5D9DCA68DA636032AF"
1390 #define RSA_DP "C1ACF567564274FB07A0BBAD5D26E298" \
1391 "3C94D22288ACD763FD8E5600ED4A702D" \
1392 "F84198A5F06C2E72236AE490C93F07F8" \
1393 "3CC559CD27BC2D1CA488811730BB5725"
1395 #define RSA_DQ "4959CBF6F8FEF750AEE6977C155579C7" \
1396 "D8AAEA56749EA28623272E4F7D0592AF" \
1397 "7C1F1313CAC9471B5C523BFE592F517B" \
1398 "407A1BD76C164B93DA2D32A383E58357"
1400 #define RSA_QP "9AE7FBC99546432DF71896FC239EADAE" \
1401 "F38D18D2B2F0E2DD275AA977E2BF4411" \
1402 "F5A3B2A5D33605AEBBCCBA7FEB9F2D2F" \
1403 "A74206CEC169D74BF5A8C50D6F48EA08"
1406 #define RSA_PT "\xAA\xBB\xCC\x03\x02\x01\x00\xFF\xFF\xFF\xFF\xFF" \
1407 "\x11\x22\x33\x0A\x0B\x0C\xCC\xDD\xDD\xDD\xDD\xDD"
1409 static int myrand(
void *rng_state,
unsigned char *output,
size_t len )
1411 #if !defined(__OpenBSD__)
1414 if( rng_state != NULL )
1417 for( i = 0; i < len; ++i )
1420 if( rng_state != NULL )
1423 arc4random_buf( output, len );
1437 unsigned char rsa_plaintext[PT_LEN];
1438 unsigned char rsa_decrypted[PT_LEN];
1439 unsigned char rsa_ciphertext[KEY_LEN];
1440 #if defined(POLARSSL_SHA1_C)
1441 unsigned char sha1sum[20];
1457 printf(
" RSA key validation: " );
1463 printf(
"failed\n" );
1469 printf(
"passed\n PKCS#1 encryption : " );
1471 memcpy( rsa_plaintext, RSA_PT, PT_LEN );
1474 rsa_plaintext, rsa_ciphertext ) != 0 )
1477 printf(
"failed\n" );
1483 printf(
"passed\n PKCS#1 decryption : " );
1486 rsa_ciphertext, rsa_decrypted,
1487 sizeof(rsa_decrypted) ) != 0 )
1490 printf(
"failed\n" );
1495 if( memcmp( rsa_decrypted, rsa_plaintext, len ) != 0 )
1498 printf(
"failed\n" );
1503 #if defined(POLARSSL_SHA1_C)
1505 printf(
"passed\n PKCS#1 data sign : " );
1507 sha1( rsa_plaintext, PT_LEN, sha1sum );
1510 sha1sum, rsa_ciphertext ) != 0 )
1513 printf(
"failed\n" );
1519 printf(
"passed\n PKCS#1 sig. verify: " );
1522 sha1sum, rsa_ciphertext ) != 0 )
1525 printf(
"failed\n" );
1531 printf(
"passed\n\n" );