rsa.c 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206
  1. /*
  2. * The RSA public-key cryptosystem
  3. *
  4. * Copyright (C) 2006-2010, Brainspark B.V.
  5. *
  6. * This file is part of PolarSSL (http://www.polarssl.org)
  7. * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
  8. *
  9. * All rights reserved.
  10. *
  11. * This program is free software; you can redistribute it and/or modify
  12. * it under the terms of the GNU General Public License as published by
  13. * the Free Software Foundation; either version 2 of the License, or
  14. * (at your option) any later version.
  15. *
  16. * This program is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU General Public License along
  22. * with this program; if not, write to the Free Software Foundation, Inc.,
  23. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  24. */
  25. /*
  26. * RSA was designed by Ron Rivest, Adi Shamir and Len Adleman.
  27. *
  28. * http://theory.lcs.mit.edu/~rivest/rsapaper.pdf
  29. * http://www.cacr.math.uwaterloo.ca/hac/about/chap8.pdf
  30. */
  31. #include "config.h"
  32. #if defined(POLARSSL_RSA_C)
  33. #include "polarssl/rsa.h"
  34. #include "polarssl/md.h"
  35. #include <stdlib.h>
  36. #ifdef PRINTF_STDLIB
  37. #include <stdio.h>
  38. #endif
  39. #ifdef PRINTF_CUSTOM
  40. #include "tinystdio.h"
  41. #endif
  42. /*
  43. * Initialize an RSA context
  44. */
  45. void rsa_init( rsa_context *ctx,
  46. int padding,
  47. int hash_id )
  48. {
  49. memset( ctx, 0, sizeof( rsa_context ) );
  50. ctx->padding = padding;
  51. ctx->hash_id = hash_id;
  52. }
  53. #if defined(POLARSSL_GENPRIME)
  54. /*
  55. * Generate an RSA keypair
  56. */
  57. int rsa_gen_key( rsa_context *ctx,
  58. int (*f_rng)(void *),
  59. void *p_rng,
  60. unsigned int nbits, int exponent )
  61. {
  62. int ret;
  63. mpi P1, Q1, H, G;
  64. if( f_rng == NULL || nbits < 128 || exponent < 3 )
  65. return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
  66. mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
  67. /*
  68. * find primes P and Q with Q < P so that:
  69. * GCD( E, (P-1)*(Q-1) ) == 1
  70. */
  71. MPI_CHK( mpi_lset( &ctx->E, exponent ) );
  72. do
  73. {
  74. MPI_CHK( mpi_gen_prime( &ctx->P, ( nbits + 1 ) >> 1, 0,
  75. f_rng, p_rng ) );
  76. MPI_CHK( mpi_gen_prime( &ctx->Q, ( nbits + 1 ) >> 1, 0,
  77. f_rng, p_rng ) );
  78. if( mpi_cmp_mpi( &ctx->P, &ctx->Q ) < 0 )
  79. mpi_swap( &ctx->P, &ctx->Q );
  80. if( mpi_cmp_mpi( &ctx->P, &ctx->Q ) == 0 )
  81. continue;
  82. MPI_CHK( mpi_mul_mpi( &ctx->N, &ctx->P, &ctx->Q ) );
  83. if( mpi_msb( &ctx->N ) != nbits )
  84. continue;
  85. MPI_CHK( mpi_sub_int( &P1, &ctx->P, 1 ) );
  86. MPI_CHK( mpi_sub_int( &Q1, &ctx->Q, 1 ) );
  87. MPI_CHK( mpi_mul_mpi( &H, &P1, &Q1 ) );
  88. MPI_CHK( mpi_gcd( &G, &ctx->E, &H ) );
  89. }
  90. while( mpi_cmp_int( &G, 1 ) != 0 );
  91. /*
  92. * D = E^-1 mod ((P-1)*(Q-1))
  93. * DP = D mod (P - 1)
  94. * DQ = D mod (Q - 1)
  95. * QP = Q^-1 mod P
  96. */
  97. MPI_CHK( mpi_inv_mod( &ctx->D , &ctx->E, &H ) );
  98. MPI_CHK( mpi_mod_mpi( &ctx->DP, &ctx->D, &P1 ) );
  99. MPI_CHK( mpi_mod_mpi( &ctx->DQ, &ctx->D, &Q1 ) );
  100. MPI_CHK( mpi_inv_mod( &ctx->QP, &ctx->Q, &ctx->P ) );
  101. ctx->len = ( mpi_msb( &ctx->N ) + 7 ) >> 3;
  102. cleanup:
  103. mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
  104. if( ret != 0 )
  105. {
  106. rsa_free( ctx );
  107. return( POLARSSL_ERR_RSA_KEY_GEN_FAILED + ret );
  108. }
  109. return( 0 );
  110. }
  111. #endif
  112. /*
  113. * Check a public RSA key
  114. */
  115. int rsa_check_pubkey( const rsa_context *ctx )
  116. {
  117. if( !ctx->N.p || !ctx->E.p )
  118. return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED );
  119. if( ( ctx->N.p[0] & 1 ) == 0 ||
  120. ( ctx->E.p[0] & 1 ) == 0 )
  121. return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED );
  122. if( mpi_msb( &ctx->N ) < 128 ||
  123. mpi_msb( &ctx->N ) > 4096 )
  124. return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED );
  125. if( mpi_msb( &ctx->E ) < 2 ||
  126. mpi_msb( &ctx->E ) > 64 )
  127. return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED );
  128. return( 0 );
  129. }
  130. /*
  131. * Check a private RSA key
  132. */
  133. int rsa_check_privkey( const rsa_context *ctx )
  134. {
  135. int ret;
  136. mpi PQ, DE, P1, Q1, H, I, G, G2, L1, L2;
  137. if( ( ret = rsa_check_pubkey( ctx ) ) != 0 )
  138. return( ret );
  139. if( !ctx->P.p || !ctx->Q.p || !ctx->D.p )
  140. return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED );
  141. mpi_init( &PQ ); mpi_init( &DE ); mpi_init( &P1 ); mpi_init( &Q1 );
  142. mpi_init( &H ); mpi_init( &I ); mpi_init( &G ); mpi_init( &G2 );
  143. mpi_init( &L1 ); mpi_init( &L2 );
  144. MPI_CHK( mpi_mul_mpi( &PQ, &ctx->P, &ctx->Q ) );
  145. MPI_CHK( mpi_mul_mpi( &DE, &ctx->D, &ctx->E ) );
  146. MPI_CHK( mpi_sub_int( &P1, &ctx->P, 1 ) );
  147. MPI_CHK( mpi_sub_int( &Q1, &ctx->Q, 1 ) );
  148. MPI_CHK( mpi_mul_mpi( &H, &P1, &Q1 ) );
  149. MPI_CHK( mpi_gcd( &G, &ctx->E, &H ) );
  150. MPI_CHK( mpi_gcd( &G2, &P1, &Q1 ) );
  151. MPI_CHK( mpi_div_mpi( &L1, &L2, &H, &G2 ) );
  152. MPI_CHK( mpi_mod_mpi( &I, &DE, &L1 ) );
  153. /*
  154. * Check for a valid PKCS1v2 private key
  155. */
  156. if( mpi_cmp_mpi( &PQ, &ctx->N ) != 0 ||
  157. mpi_cmp_int( &L2, 0 ) != 0 ||
  158. mpi_cmp_int( &I, 1 ) != 0 ||
  159. mpi_cmp_int( &G, 1 ) != 0 )
  160. {
  161. ret = POLARSSL_ERR_RSA_KEY_CHECK_FAILED;
  162. }
  163. cleanup:
  164. mpi_free( &PQ ); mpi_free( &DE ); mpi_free( &P1 ); mpi_free( &Q1 );
  165. mpi_free( &H ); mpi_free( &I ); mpi_free( &G ); mpi_free( &G2 );
  166. mpi_free( &L1 ); mpi_free( &L2 );
  167. if( ret == POLARSSL_ERR_RSA_KEY_CHECK_FAILED )
  168. return( ret );
  169. if( ret != 0 )
  170. return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED + ret );
  171. return( 0 );
  172. }
  173. /*
  174. * Do an RSA public key operation
  175. */
  176. int rsa_public( rsa_context *ctx,
  177. const unsigned char *input,
  178. unsigned char *output )
  179. {
  180. int ret;
  181. size_t olen;
  182. mpi T;
  183. mpi_init( &T );
  184. MPI_CHK( mpi_read_binary( &T, input, ctx->len ) );
  185. if( mpi_cmp_mpi( &T, &ctx->N ) >= 0 )
  186. {
  187. mpi_free( &T );
  188. return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
  189. }
  190. olen = ctx->len;
  191. MPI_CHK( mpi_exp_mod( &T, &T, &ctx->E, &ctx->N, &ctx->RN ) );
  192. MPI_CHK( mpi_write_binary( &T, output, olen ) );
  193. cleanup:
  194. mpi_free( &T );
  195. if( ret != 0 )
  196. return( POLARSSL_ERR_RSA_PUBLIC_FAILED + ret );
  197. return( 0 );
  198. }
  199. /*
  200. * Do an RSA private key operation
  201. */
  202. int rsa_private( rsa_context *ctx,
  203. const unsigned char *input,
  204. unsigned char *output )
  205. {
  206. int ret;
  207. size_t olen;
  208. mpi T, T1, T2;
  209. mpi_init( &T ); mpi_init( &T1 ); mpi_init( &T2 );
  210. MPI_CHK( mpi_read_binary( &T, input, ctx->len ) );
  211. if( mpi_cmp_mpi( &T, &ctx->N ) >= 0 )
  212. {
  213. mpi_free( &T );
  214. return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
  215. }
  216. #if defined(POLARSSL_RSA_NO_CRT)
  217. MPI_CHK( mpi_exp_mod( &T, &T, &ctx->D, &ctx->N, &ctx->RN ) );
  218. #else
  219. /*
  220. * faster decryption using the CRT
  221. *
  222. * T1 = input ^ dP mod P
  223. * T2 = input ^ dQ mod Q
  224. */
  225. MPI_CHK( mpi_exp_mod( &T1, &T, &ctx->DP, &ctx->P, &ctx->RP ) );
  226. MPI_CHK( mpi_exp_mod( &T2, &T, &ctx->DQ, &ctx->Q, &ctx->RQ ) );
  227. /*
  228. * T = (T1 - T2) * (Q^-1 mod P) mod P
  229. */
  230. MPI_CHK( mpi_sub_mpi( &T, &T1, &T2 ) );
  231. MPI_CHK( mpi_mul_mpi( &T1, &T, &ctx->QP ) );
  232. MPI_CHK( mpi_mod_mpi( &T, &T1, &ctx->P ) );
  233. /*
  234. * output = T2 + T * Q
  235. */
  236. MPI_CHK( mpi_mul_mpi( &T1, &T, &ctx->Q ) );
  237. MPI_CHK( mpi_add_mpi( &T, &T2, &T1 ) );
  238. #endif
  239. olen = ctx->len;
  240. MPI_CHK( mpi_write_binary( &T, output, olen ) );
  241. cleanup:
  242. mpi_free( &T ); mpi_free( &T1 ); mpi_free( &T2 );
  243. if( ret != 0 )
  244. return( POLARSSL_ERR_RSA_PRIVATE_FAILED + ret );
  245. return( 0 );
  246. }
  247. #if defined(POLARSSL_PKCS1_V21)
  248. /**
  249. * Generate and apply the MGF1 operation (from PKCS#1 v2.1) to a buffer.
  250. *
  251. * @param dst buffer to mask
  252. * @param dlen length of destination buffer
  253. * @param src source of the mask generation
  254. * @param slen length of the source buffer
  255. * @param md_ctx message digest context to use
  256. */
  257. static void mgf_mask( unsigned char *dst, size_t dlen, unsigned char *src, size_t slen,
  258. md_context_t *md_ctx )
  259. {
  260. unsigned char mask[POLARSSL_MD_MAX_SIZE];
  261. unsigned char counter[4];
  262. unsigned char *p;
  263. unsigned int hlen;
  264. size_t i, use_len;
  265. memset( mask, 0, POLARSSL_MD_MAX_SIZE );
  266. memset( counter, 0, 4 );
  267. hlen = md_ctx->md_info->size;
  268. // Generate and apply dbMask
  269. //
  270. p = dst;
  271. while( dlen > 0 )
  272. {
  273. use_len = hlen;
  274. if( dlen < hlen )
  275. use_len = dlen;
  276. md_starts( md_ctx );
  277. md_update( md_ctx, src, slen );
  278. md_update( md_ctx, counter, 4 );
  279. md_finish( md_ctx, mask );
  280. for( i = 0; i < use_len; ++i )
  281. *p++ ^= mask[i];
  282. counter[3]++;
  283. dlen -= use_len;
  284. }
  285. }
  286. #endif
  287. /*
  288. * Add the message padding, then do an RSA operation
  289. */
  290. int rsa_pkcs1_encrypt( rsa_context *ctx,
  291. int (*f_rng)(void *),
  292. void *p_rng,
  293. int mode, size_t ilen,
  294. const unsigned char *input,
  295. unsigned char *output )
  296. {
  297. size_t nb_pad, olen;
  298. unsigned char *p = output;
  299. #if defined(POLARSSL_PKCS1_V21)
  300. unsigned int i, hlen;
  301. const md_info_t *md_info;
  302. md_context_t md_ctx;
  303. #endif
  304. olen = ctx->len;
  305. if( f_rng == NULL )
  306. return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
  307. switch( ctx->padding )
  308. {
  309. case RSA_PKCS_V15:
  310. if( olen < ilen + 11 )
  311. return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
  312. nb_pad = olen - 3 - ilen;
  313. *p++ = 0;
  314. *p++ = RSA_CRYPT;
  315. while( nb_pad-- > 0 )
  316. {
  317. int rng_dl = 100;
  318. do {
  319. *p = (unsigned char) f_rng( p_rng );
  320. } while( *p == 0 && --rng_dl );
  321. // Check if RNG failed to generate data
  322. //
  323. if( rng_dl == 0 )
  324. return POLARSSL_ERR_RSA_RNG_FAILED;
  325. p++;
  326. }
  327. *p++ = 0;
  328. memcpy( p, input, ilen );
  329. break;
  330. #if defined(POLARSSL_PKCS1_V21)
  331. case RSA_PKCS_V21:
  332. md_info = md_info_from_type( ctx->hash_id );
  333. if( md_info == NULL )
  334. return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
  335. hlen = md_get_size( md_info );
  336. if( olen < ilen + 2 * hlen + 2 || f_rng == NULL )
  337. return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
  338. memset( output, 0, olen );
  339. memset( &md_ctx, 0, sizeof( md_context_t ) );
  340. md_init_ctx( &md_ctx, md_info );
  341. *p++ = 0;
  342. // Generate a random octet string seed
  343. //
  344. for( i = 0; i < hlen; ++i )
  345. *p++ = (unsigned char) f_rng( p_rng );
  346. // Construct DB
  347. //
  348. md( md_info, p, 0, p );
  349. p += hlen;
  350. p += olen - 2 * hlen - 2 - ilen;
  351. *p++ = 1;
  352. memcpy( p, input, ilen );
  353. // maskedDB: Apply dbMask to DB
  354. //
  355. mgf_mask( output + hlen + 1, olen - hlen - 1, output + 1, hlen,
  356. &md_ctx );
  357. // maskedSeed: Apply seedMask to seed
  358. //
  359. mgf_mask( output + 1, hlen, output + hlen + 1, olen - hlen - 1,
  360. &md_ctx );
  361. break;
  362. #endif
  363. default:
  364. return( POLARSSL_ERR_RSA_INVALID_PADDING );
  365. }
  366. return( ( mode == RSA_PUBLIC )
  367. ? rsa_public( ctx, output, output )
  368. : rsa_private( ctx, output, output ) );
  369. }
  370. /*
  371. * Do an RSA operation, then remove the message padding
  372. */
  373. int rsa_pkcs1_decrypt( rsa_context *ctx,
  374. int mode, size_t *olen,
  375. const unsigned char *input,
  376. unsigned char *output,
  377. size_t output_max_len)
  378. {
  379. int ret;
  380. size_t ilen;
  381. unsigned char *p;
  382. unsigned char buf[1024];
  383. #if defined(POLARSSL_PKCS1_V21)
  384. unsigned char lhash[POLARSSL_MD_MAX_SIZE];
  385. unsigned int hlen;
  386. const md_info_t *md_info;
  387. md_context_t md_ctx;
  388. #endif
  389. ilen = ctx->len;
  390. if( ilen < 16 || ilen > sizeof( buf ) )
  391. return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
  392. ret = ( mode == RSA_PUBLIC )
  393. ? rsa_public( ctx, input, buf )
  394. : rsa_private( ctx, input, buf );
  395. if( ret != 0 )
  396. return( ret );
  397. p = buf;
  398. switch( ctx->padding )
  399. {
  400. case RSA_PKCS_V15:
  401. if( *p++ != 0 || *p++ != RSA_CRYPT )
  402. return( POLARSSL_ERR_RSA_INVALID_PADDING );
  403. while( *p != 0 )
  404. {
  405. if( p >= buf + ilen - 1 )
  406. return( POLARSSL_ERR_RSA_INVALID_PADDING );
  407. p++;
  408. }
  409. p++;
  410. break;
  411. #if defined(POLARSSL_PKCS1_V21)
  412. case RSA_PKCS_V21:
  413. if( *p++ != 0 )
  414. return( POLARSSL_ERR_RSA_INVALID_PADDING );
  415. md_info = md_info_from_type( ctx->hash_id );
  416. if( md_info == NULL )
  417. return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
  418. hlen = md_get_size( md_info );
  419. memset( &md_ctx, 0, sizeof( md_context_t ) );
  420. md_init_ctx( &md_ctx, md_info );
  421. // Generate lHash
  422. //
  423. md( md_info, lhash, 0, lhash );
  424. // seed: Apply seedMask to maskedSeed
  425. //
  426. mgf_mask( buf + 1, hlen, buf + hlen + 1, ilen - hlen - 1,
  427. &md_ctx );
  428. // DB: Apply dbMask to maskedDB
  429. //
  430. mgf_mask( buf + hlen + 1, ilen - hlen - 1, buf + 1, hlen,
  431. &md_ctx );
  432. p += hlen;
  433. // Check validity
  434. //
  435. if( memcmp( lhash, p, hlen ) != 0 )
  436. return( POLARSSL_ERR_RSA_INVALID_PADDING );
  437. p += hlen;
  438. while( *p == 0 && p < buf + ilen )
  439. p++;
  440. if( p == buf + ilen )
  441. return( POLARSSL_ERR_RSA_INVALID_PADDING );
  442. if( *p++ != 0x01 )
  443. return( POLARSSL_ERR_RSA_INVALID_PADDING );
  444. break;
  445. #endif
  446. default:
  447. return( POLARSSL_ERR_RSA_INVALID_PADDING );
  448. }
  449. if (ilen - (p - buf) > output_max_len)
  450. return( POLARSSL_ERR_RSA_OUTPUT_TOO_LARGE );
  451. *olen = ilen - (p - buf);
  452. memcpy( output, p, *olen );
  453. return( 0 );
  454. }
  455. /*
  456. * Do an RSA operation to sign the message digest
  457. */
  458. int rsa_pkcs1_sign( rsa_context *ctx,
  459. int (*f_rng)(void *),
  460. void *p_rng,
  461. int mode,
  462. int hash_id,
  463. unsigned int hashlen,
  464. const unsigned char *hash,
  465. unsigned char *sig )
  466. {
  467. size_t nb_pad, olen;
  468. unsigned char *p = sig;
  469. #if defined(POLARSSL_PKCS1_V21)
  470. unsigned char salt[POLARSSL_MD_MAX_SIZE];
  471. unsigned int i, slen, hlen, offset = 0;
  472. size_t msb;
  473. const md_info_t *md_info;
  474. md_context_t md_ctx;
  475. #else
  476. (void) f_rng;
  477. (void) p_rng;
  478. #endif
  479. olen = ctx->len;
  480. switch( ctx->padding )
  481. {
  482. case RSA_PKCS_V15:
  483. switch( hash_id )
  484. {
  485. case SIG_RSA_RAW:
  486. nb_pad = olen - 3 - hashlen;
  487. break;
  488. case SIG_RSA_MD2:
  489. case SIG_RSA_MD4:
  490. case SIG_RSA_MD5:
  491. nb_pad = olen - 3 - 34;
  492. break;
  493. case SIG_RSA_SHA1:
  494. nb_pad = olen - 3 - 35;
  495. break;
  496. case SIG_RSA_SHA224:
  497. nb_pad = olen - 3 - 47;
  498. break;
  499. case SIG_RSA_SHA256:
  500. nb_pad = olen - 3 - 51;
  501. break;
  502. case SIG_RSA_SHA384:
  503. nb_pad = olen - 3 - 67;
  504. break;
  505. case SIG_RSA_SHA512:
  506. nb_pad = olen - 3 - 83;
  507. break;
  508. default:
  509. return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
  510. }
  511. if( nb_pad < 8 )
  512. return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
  513. *p++ = 0;
  514. *p++ = RSA_SIGN;
  515. memset( p, 0xFF, nb_pad );
  516. p += nb_pad;
  517. *p++ = 0;
  518. switch( hash_id )
  519. {
  520. case SIG_RSA_RAW:
  521. memcpy( p, hash, hashlen );
  522. break;
  523. case SIG_RSA_MD2:
  524. memcpy( p, ASN1_HASH_MDX, 18 );
  525. memcpy( p + 18, hash, 16 );
  526. p[13] = 2; break;
  527. case SIG_RSA_MD4:
  528. memcpy( p, ASN1_HASH_MDX, 18 );
  529. memcpy( p + 18, hash, 16 );
  530. p[13] = 4; break;
  531. case SIG_RSA_MD5:
  532. memcpy( p, ASN1_HASH_MDX, 18 );
  533. memcpy( p + 18, hash, 16 );
  534. p[13] = 5; break;
  535. case SIG_RSA_SHA1:
  536. memcpy( p, ASN1_HASH_SHA1, 15 );
  537. memcpy( p + 15, hash, 20 );
  538. break;
  539. case SIG_RSA_SHA224:
  540. memcpy( p, ASN1_HASH_SHA2X, 19 );
  541. memcpy( p + 19, hash, 28 );
  542. p[1] += 28; p[14] = 4; p[18] += 28; break;
  543. case SIG_RSA_SHA256:
  544. memcpy( p, ASN1_HASH_SHA2X, 19 );
  545. memcpy( p + 19, hash, 32 );
  546. p[1] += 32; p[14] = 1; p[18] += 32; break;
  547. case SIG_RSA_SHA384:
  548. memcpy( p, ASN1_HASH_SHA2X, 19 );
  549. memcpy( p + 19, hash, 48 );
  550. p[1] += 48; p[14] = 2; p[18] += 48; break;
  551. case SIG_RSA_SHA512:
  552. memcpy( p, ASN1_HASH_SHA2X, 19 );
  553. memcpy( p + 19, hash, 64 );
  554. p[1] += 64; p[14] = 3; p[18] += 64; break;
  555. default:
  556. return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
  557. }
  558. break;
  559. #if defined(POLARSSL_PKCS1_V21)
  560. case RSA_PKCS_V21:
  561. if( f_rng == NULL )
  562. return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
  563. switch( hash_id )
  564. {
  565. case SIG_RSA_MD2:
  566. case SIG_RSA_MD4:
  567. case SIG_RSA_MD5:
  568. hashlen = 16;
  569. break;
  570. case SIG_RSA_SHA1:
  571. hashlen = 20;
  572. break;
  573. case SIG_RSA_SHA224:
  574. hashlen = 28;
  575. break;
  576. case SIG_RSA_SHA256:
  577. hashlen = 32;
  578. break;
  579. case SIG_RSA_SHA384:
  580. hashlen = 48;
  581. break;
  582. case SIG_RSA_SHA512:
  583. hashlen = 64;
  584. break;
  585. default:
  586. return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
  587. }
  588. md_info = md_info_from_type( ctx->hash_id );
  589. if( md_info == NULL )
  590. return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
  591. hlen = md_get_size( md_info );
  592. slen = hlen;
  593. memset( sig, 0, olen );
  594. memset( &md_ctx, 0, sizeof( md_context_t ) );
  595. md_init_ctx( &md_ctx, md_info );
  596. msb = mpi_msb( &ctx->N ) - 1;
  597. // Generate salt of length slen
  598. //
  599. for( i = 0; i < slen; ++i )
  600. salt[i] = (unsigned char) f_rng( p_rng );
  601. // Note: EMSA-PSS encoding is over the length of N - 1 bits
  602. //
  603. msb = mpi_msb( &ctx->N ) - 1;
  604. p += olen - hlen * 2 - 2;
  605. *p++ = 0x01;
  606. memcpy( p, salt, slen );
  607. p += slen;
  608. // Generate H = Hash( M' )
  609. //
  610. md_starts( &md_ctx );
  611. md_update( &md_ctx, p, 8 );
  612. md_update( &md_ctx, hash, hashlen );
  613. md_update( &md_ctx, salt, slen );
  614. md_finish( &md_ctx, p );
  615. // Compensate for boundary condition when applying mask
  616. //
  617. if( msb % 8 == 0 )
  618. offset = 1;
  619. // maskedDB: Apply dbMask to DB
  620. //
  621. mgf_mask( sig + offset, olen - hlen - 1 - offset, p, hlen, &md_ctx );
  622. msb = mpi_msb( &ctx->N ) - 1;
  623. sig[0] &= 0xFF >> ( olen * 8 - msb );
  624. p += hlen;
  625. *p++ = 0xBC;
  626. break;
  627. #endif
  628. default:
  629. return( POLARSSL_ERR_RSA_INVALID_PADDING );
  630. }
  631. return( ( mode == RSA_PUBLIC )
  632. ? rsa_public( ctx, sig, sig )
  633. : rsa_private( ctx, sig, sig ) );
  634. }
  635. /*
  636. * Do an RSA operation and check the message digest
  637. */
  638. int rsa_pkcs1_verify( rsa_context *ctx,
  639. int mode,
  640. int hash_id,
  641. unsigned int hashlen,
  642. const unsigned char *hash,
  643. unsigned char *sig )
  644. {
  645. int ret;
  646. size_t len, siglen;
  647. unsigned char *p, c;
  648. unsigned char buf[1024];
  649. #if defined(POLARSSL_PKCS1_V21)
  650. unsigned char zeros[8];
  651. unsigned int hlen;
  652. size_t slen, msb;
  653. const md_info_t *md_info;
  654. md_context_t md_ctx;
  655. #endif
  656. siglen = ctx->len;
  657. if( siglen < 16 || siglen > sizeof( buf ) )
  658. return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
  659. ret = ( mode == RSA_PUBLIC )
  660. ? rsa_public( ctx, sig, buf )
  661. : rsa_private( ctx, sig, buf );
  662. if( ret != 0 )
  663. return( ret );
  664. p = buf;
  665. switch( ctx->padding )
  666. {
  667. case RSA_PKCS_V15:
  668. if( *p++ != 0 || *p++ != RSA_SIGN )
  669. return( POLARSSL_ERR_RSA_INVALID_PADDING );
  670. while( *p != 0 )
  671. {
  672. if( p >= buf + siglen - 1 || *p != 0xFF )
  673. return( POLARSSL_ERR_RSA_INVALID_PADDING );
  674. p++;
  675. }
  676. p++;
  677. len = siglen - ( p - buf );
  678. if( len == 34 )
  679. {
  680. c = p[13];
  681. p[13] = 0;
  682. if( memcmp( p, ASN1_HASH_MDX, 18 ) != 0 )
  683. return( POLARSSL_ERR_RSA_VERIFY_FAILED );
  684. if( ( c == 2 && hash_id == SIG_RSA_MD2 ) ||
  685. ( c == 4 && hash_id == SIG_RSA_MD4 ) ||
  686. ( c == 5 && hash_id == SIG_RSA_MD5 ) )
  687. {
  688. if( memcmp( p + 18, hash, 16 ) == 0 )
  689. return( 0 );
  690. else
  691. return( POLARSSL_ERR_RSA_VERIFY_FAILED );
  692. }
  693. }
  694. if( len == 35 && hash_id == SIG_RSA_SHA1 )
  695. {
  696. if( memcmp( p, ASN1_HASH_SHA1, 15 ) == 0 &&
  697. memcmp( p + 15, hash, 20 ) == 0 )
  698. return( 0 );
  699. else
  700. return( POLARSSL_ERR_RSA_VERIFY_FAILED );
  701. }
  702. if( ( len == 19 + 28 && p[14] == 4 && hash_id == SIG_RSA_SHA224 ) ||
  703. ( len == 19 + 32 && p[14] == 1 && hash_id == SIG_RSA_SHA256 ) ||
  704. ( len == 19 + 48 && p[14] == 2 && hash_id == SIG_RSA_SHA384 ) ||
  705. ( len == 19 + 64 && p[14] == 3 && hash_id == SIG_RSA_SHA512 ) )
  706. {
  707. c = p[1] - 17;
  708. p[1] = 17;
  709. p[14] = 0;
  710. if( p[18] == c &&
  711. memcmp( p, ASN1_HASH_SHA2X, 18 ) == 0 &&
  712. memcmp( p + 19, hash, c ) == 0 )
  713. return( 0 );
  714. else
  715. return( POLARSSL_ERR_RSA_VERIFY_FAILED );
  716. }
  717. if( len == hashlen && hash_id == SIG_RSA_RAW )
  718. {
  719. if( memcmp( p, hash, hashlen ) == 0 )
  720. return( 0 );
  721. else
  722. return( POLARSSL_ERR_RSA_VERIFY_FAILED );
  723. }
  724. break;
  725. #if defined(POLARSSL_PKCS1_V21)
  726. case RSA_PKCS_V21:
  727. if( buf[siglen - 1] != 0xBC )
  728. return( POLARSSL_ERR_RSA_INVALID_PADDING );
  729. switch( hash_id )
  730. {
  731. case SIG_RSA_MD2:
  732. case SIG_RSA_MD4:
  733. case SIG_RSA_MD5:
  734. hashlen = 16;
  735. break;
  736. case SIG_RSA_SHA1:
  737. hashlen = 20;
  738. break;
  739. case SIG_RSA_SHA224:
  740. hashlen = 28;
  741. break;
  742. case SIG_RSA_SHA256:
  743. hashlen = 32;
  744. break;
  745. case SIG_RSA_SHA384:
  746. hashlen = 48;
  747. break;
  748. case SIG_RSA_SHA512:
  749. hashlen = 64;
  750. break;
  751. default:
  752. return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
  753. }
  754. md_info = md_info_from_type( ctx->hash_id );
  755. if( md_info == NULL )
  756. return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
  757. hlen = md_get_size( md_info );
  758. slen = siglen - hlen - 1;
  759. memset( &md_ctx, 0, sizeof( md_context_t ) );
  760. memset( zeros, 0, 8 );
  761. md_init_ctx( &md_ctx, md_info );
  762. // Note: EMSA-PSS verification is over the length of N - 1 bits
  763. //
  764. msb = mpi_msb( &ctx->N ) - 1;
  765. // Compensate for boundary condition when applying mask
  766. //
  767. if( msb % 8 == 0 )
  768. {
  769. p++;
  770. siglen -= 1;
  771. }
  772. if( buf[0] >> ( 8 - siglen * 8 + msb ) )
  773. return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
  774. mgf_mask( p, siglen - hlen - 1, p + siglen - hlen - 1, hlen, &md_ctx );
  775. buf[0] &= 0xFF >> ( siglen * 8 - msb );
  776. while( *p == 0 && p < buf + siglen )
  777. p++;
  778. if( p == buf + siglen )
  779. return( POLARSSL_ERR_RSA_INVALID_PADDING );
  780. if( *p++ != 0x01 )
  781. return( POLARSSL_ERR_RSA_INVALID_PADDING );
  782. slen -= p - buf;
  783. // Generate H = Hash( M' )
  784. //
  785. md_starts( &md_ctx );
  786. md_update( &md_ctx, zeros, 8 );
  787. md_update( &md_ctx, hash, hashlen );
  788. md_update( &md_ctx, p, slen );
  789. md_finish( &md_ctx, p );
  790. if( memcmp( p, p + slen, hlen ) == 0 )
  791. return( 0 );
  792. else
  793. return( POLARSSL_ERR_RSA_VERIFY_FAILED );
  794. #endif
  795. default:
  796. return( POLARSSL_ERR_RSA_INVALID_PADDING );
  797. }
  798. return( POLARSSL_ERR_RSA_INVALID_PADDING );
  799. }
  800. /*
  801. * Free the components of an RSA key
  802. */
  803. void rsa_free( rsa_context *ctx )
  804. {
  805. mpi_free( &ctx->RQ ); mpi_free( &ctx->RP ); mpi_free( &ctx->RN );
  806. mpi_free( &ctx->QP ); mpi_free( &ctx->DQ ); mpi_free( &ctx->DP );
  807. mpi_free( &ctx->Q ); mpi_free( &ctx->P ); mpi_free( &ctx->D );
  808. mpi_free( &ctx->E ); mpi_free( &ctx->N );
  809. }
  810. #if defined(POLARSSL_SELF_TEST)
  811. #include "polarssl/sha1.h"
  812. /*
  813. * Example RSA-1024 keypair, for test purposes
  814. */
  815. #define KEY_LEN 128
  816. #define RSA_N "9292758453063D803DD603D5E777D788" \
  817. "8ED1D5BF35786190FA2F23EBC0848AEA" \
  818. "DDA92CA6C3D80B32C4D109BE0F36D6AE" \
  819. "7130B9CED7ACDF54CFC7555AC14EEBAB" \
  820. "93A89813FBF3C4F8066D2D800F7C38A8" \
  821. "1AE31942917403FF4946B0A83D3D3E05" \
  822. "EE57C6F5F5606FB5D4BC6CD34EE0801A" \
  823. "5E94BB77B07507233A0BC7BAC8F90F79"
  824. #define RSA_E "10001"
  825. #define RSA_D "24BF6185468786FDD303083D25E64EFC" \
  826. "66CA472BC44D253102F8B4A9D3BFA750" \
  827. "91386C0077937FE33FA3252D28855837" \
  828. "AE1B484A8A9A45F7EE8C0C634F99E8CD" \
  829. "DF79C5CE07EE72C7F123142198164234" \
  830. "CABB724CF78B8173B9F880FC86322407" \
  831. "AF1FEDFDDE2BEB674CA15F3E81A1521E" \
  832. "071513A1E85B5DFA031F21ECAE91A34D"
  833. #define RSA_P "C36D0EB7FCD285223CFB5AABA5BDA3D8" \
  834. "2C01CAD19EA484A87EA4377637E75500" \
  835. "FCB2005C5C7DD6EC4AC023CDA285D796" \
  836. "C3D9E75E1EFC42488BB4F1D13AC30A57"
  837. #define RSA_Q "C000DF51A7C77AE8D7C7370C1FF55B69" \
  838. "E211C2B9E5DB1ED0BF61D0D9899620F4" \
  839. "910E4168387E3C30AA1E00C339A79508" \
  840. "8452DD96A9A5EA5D9DCA68DA636032AF"
  841. #define RSA_DP "C1ACF567564274FB07A0BBAD5D26E298" \
  842. "3C94D22288ACD763FD8E5600ED4A702D" \
  843. "F84198A5F06C2E72236AE490C93F07F8" \
  844. "3CC559CD27BC2D1CA488811730BB5725"
  845. #define RSA_DQ "4959CBF6F8FEF750AEE6977C155579C7" \
  846. "D8AAEA56749EA28623272E4F7D0592AF" \
  847. "7C1F1313CAC9471B5C523BFE592F517B" \
  848. "407A1BD76C164B93DA2D32A383E58357"
  849. #define RSA_QP "9AE7FBC99546432DF71896FC239EADAE" \
  850. "F38D18D2B2F0E2DD275AA977E2BF4411" \
  851. "F5A3B2A5D33605AEBBCCBA7FEB9F2D2F" \
  852. "A74206CEC169D74BF5A8C50D6F48EA08"
  853. #define PT_LEN 24
  854. #define RSA_PT "\xAA\xBB\xCC\x03\x02\x01\x00\xFF\xFF\xFF\xFF\xFF" \
  855. "\x11\x22\x33\x0A\x0B\x0C\xCC\xDD\xDD\xDD\xDD\xDD"
  856. static int myrand( void *rng_state )
  857. {
  858. if( rng_state != NULL )
  859. rng_state = NULL;
  860. return( rand() );
  861. }
  862. /*
  863. * Checkup routine
  864. */
  865. int rsa_self_test( int verbose )
  866. {
  867. size_t len;
  868. rsa_context rsa;
  869. unsigned char rsa_plaintext[PT_LEN];
  870. unsigned char rsa_decrypted[PT_LEN];
  871. unsigned char rsa_ciphertext[KEY_LEN];
  872. #if defined(POLARSSL_SHA1_C)
  873. unsigned char sha1sum[20];
  874. #endif
  875. rsa_init( &rsa, RSA_PKCS_V15, 0 );
  876. rsa.len = KEY_LEN;
  877. mpi_read_string( &rsa.N , 16, RSA_N );
  878. mpi_read_string( &rsa.E , 16, RSA_E );
  879. mpi_read_string( &rsa.D , 16, RSA_D );
  880. mpi_read_string( &rsa.P , 16, RSA_P );
  881. mpi_read_string( &rsa.Q , 16, RSA_Q );
  882. mpi_read_string( &rsa.DP, 16, RSA_DP );
  883. mpi_read_string( &rsa.DQ, 16, RSA_DQ );
  884. mpi_read_string( &rsa.QP, 16, RSA_QP );
  885. if( verbose != 0 )
  886. printf( " RSA key validation: " );
  887. if( rsa_check_pubkey( &rsa ) != 0 ||
  888. rsa_check_privkey( &rsa ) != 0 )
  889. {
  890. if( verbose != 0 )
  891. printf( "failed\n" );
  892. return( 1 );
  893. }
  894. if( verbose != 0 )
  895. printf( "passed\n PKCS#1 encryption : " );
  896. memcpy( rsa_plaintext, RSA_PT, PT_LEN );
  897. if( rsa_pkcs1_encrypt( &rsa, &myrand, NULL, RSA_PUBLIC, PT_LEN,
  898. rsa_plaintext, rsa_ciphertext ) != 0 )
  899. {
  900. if( verbose != 0 )
  901. printf( "failed\n" );
  902. return( 1 );
  903. }
  904. if( verbose != 0 )
  905. printf( "passed\n PKCS#1 decryption : " );
  906. if( rsa_pkcs1_decrypt( &rsa, RSA_PRIVATE, &len,
  907. rsa_ciphertext, rsa_decrypted,
  908. sizeof(rsa_decrypted) ) != 0 )
  909. {
  910. if( verbose != 0 )
  911. printf( "failed\n" );
  912. return( 1 );
  913. }
  914. if( memcmp( rsa_decrypted, rsa_plaintext, len ) != 0 )
  915. {
  916. if( verbose != 0 )
  917. printf( "failed\n" );
  918. return( 1 );
  919. }
  920. #if defined(POLARSSL_SHA1_C)
  921. if( verbose != 0 )
  922. printf( "passed\n PKCS#1 data sign : " );
  923. sha1( rsa_plaintext, PT_LEN, sha1sum );
  924. if( rsa_pkcs1_sign( &rsa, NULL, NULL, RSA_PRIVATE, SIG_RSA_SHA1, 20,
  925. sha1sum, rsa_ciphertext ) != 0 )
  926. {
  927. if( verbose != 0 )
  928. printf( "failed\n" );
  929. return( 1 );
  930. }
  931. if( verbose != 0 )
  932. printf( "passed\n PKCS#1 sig. verify: " );
  933. if( rsa_pkcs1_verify( &rsa, RSA_PUBLIC, SIG_RSA_SHA1, 20,
  934. sha1sum, rsa_ciphertext ) != 0 )
  935. {
  936. if( verbose != 0 )
  937. printf( "failed\n" );
  938. return( 1 );
  939. }
  940. if( verbose != 0 )
  941. printf( "passed\n\n" );
  942. #endif /* POLARSSL_SHA1_C */
  943. rsa_free( &rsa );
  944. return( 0 );
  945. }
  946. #endif
  947. #endif