blob: b9d6bec0ce8a8c533f4f0832793e0d45b1f7d61c [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * The RSA public-key cryptosystem
3 *
Paul Bakkerb125ed82011-11-10 13:33:51 +00004 * Copyright (C) 2006-2011, Brainspark B.V.
Paul Bakkerb96f1542010-07-18 20:36:00 +00005 *
6 * This file is part of PolarSSL (http://www.polarssl.org)
Paul Bakker84f12b72010-07-18 10:13:04 +00007 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
Paul Bakkerb96f1542010-07-18 20:36:00 +00008 *
Paul Bakker77b385e2009-07-28 17:23:11 +00009 * All rights reserved.
Paul Bakkere0ccd0a2009-01-04 16:27:10 +000010 *
Paul Bakker5121ce52009-01-03 21:22:43 +000011 * 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
Paul Bakker40e46942009-01-03 21:51:57 +000032#include "polarssl/config.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000033
Paul Bakker40e46942009-01-03 21:51:57 +000034#if defined(POLARSSL_RSA_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000035
Paul Bakker40e46942009-01-03 21:51:57 +000036#include "polarssl/rsa.h"
Paul Bakkerbb51f0c2012-08-23 07:46:58 +000037
38#if defined(POLARSSL_PKCS1_V21)
Paul Bakker9dcc3222011-03-08 14:16:06 +000039#include "polarssl/md.h"
Paul Bakkerbb51f0c2012-08-23 07:46:58 +000040#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000041
42#include <stdlib.h>
Paul Bakker5121ce52009-01-03 21:22:43 +000043#include <stdio.h>
44
45/*
46 * Initialize an RSA context
47 */
48void rsa_init( rsa_context *ctx,
49 int padding,
Paul Bakker21eb2802010-08-16 11:10:02 +000050 int hash_id )
Paul Bakker5121ce52009-01-03 21:22:43 +000051{
52 memset( ctx, 0, sizeof( rsa_context ) );
53
54 ctx->padding = padding;
55 ctx->hash_id = hash_id;
Paul Bakker5121ce52009-01-03 21:22:43 +000056}
57
Paul Bakker40e46942009-01-03 21:51:57 +000058#if defined(POLARSSL_GENPRIME)
Paul Bakker5121ce52009-01-03 21:22:43 +000059
60/*
61 * Generate an RSA keypair
62 */
Paul Bakker21eb2802010-08-16 11:10:02 +000063int rsa_gen_key( rsa_context *ctx,
Paul Bakkera3d195c2011-11-27 21:07:34 +000064 int (*f_rng)(void *, unsigned char *, size_t),
65 void *p_rng,
66 unsigned int nbits, int exponent )
Paul Bakker5121ce52009-01-03 21:22:43 +000067{
68 int ret;
69 mpi P1, Q1, H, G;
70
Paul Bakker21eb2802010-08-16 11:10:02 +000071 if( f_rng == NULL || nbits < 128 || exponent < 3 )
Paul Bakker40e46942009-01-03 21:51:57 +000072 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +000073
Paul Bakker6c591fa2011-05-05 11:49:20 +000074 mpi_init( &P1 ); mpi_init( &Q1 ); mpi_init( &H ); mpi_init( &G );
Paul Bakker5121ce52009-01-03 21:22:43 +000075
76 /*
77 * find primes P and Q with Q < P so that:
78 * GCD( E, (P-1)*(Q-1) ) == 1
79 */
80 MPI_CHK( mpi_lset( &ctx->E, exponent ) );
81
82 do
83 {
84 MPI_CHK( mpi_gen_prime( &ctx->P, ( nbits + 1 ) >> 1, 0,
Paul Bakker21eb2802010-08-16 11:10:02 +000085 f_rng, p_rng ) );
Paul Bakker5121ce52009-01-03 21:22:43 +000086
87 MPI_CHK( mpi_gen_prime( &ctx->Q, ( nbits + 1 ) >> 1, 0,
Paul Bakker21eb2802010-08-16 11:10:02 +000088 f_rng, p_rng ) );
Paul Bakker5121ce52009-01-03 21:22:43 +000089
90 if( mpi_cmp_mpi( &ctx->P, &ctx->Q ) < 0 )
91 mpi_swap( &ctx->P, &ctx->Q );
92
93 if( mpi_cmp_mpi( &ctx->P, &ctx->Q ) == 0 )
94 continue;
95
96 MPI_CHK( mpi_mul_mpi( &ctx->N, &ctx->P, &ctx->Q ) );
97 if( mpi_msb( &ctx->N ) != nbits )
98 continue;
99
100 MPI_CHK( mpi_sub_int( &P1, &ctx->P, 1 ) );
101 MPI_CHK( mpi_sub_int( &Q1, &ctx->Q, 1 ) );
102 MPI_CHK( mpi_mul_mpi( &H, &P1, &Q1 ) );
103 MPI_CHK( mpi_gcd( &G, &ctx->E, &H ) );
104 }
105 while( mpi_cmp_int( &G, 1 ) != 0 );
106
107 /*
108 * D = E^-1 mod ((P-1)*(Q-1))
109 * DP = D mod (P - 1)
110 * DQ = D mod (Q - 1)
111 * QP = Q^-1 mod P
112 */
113 MPI_CHK( mpi_inv_mod( &ctx->D , &ctx->E, &H ) );
114 MPI_CHK( mpi_mod_mpi( &ctx->DP, &ctx->D, &P1 ) );
115 MPI_CHK( mpi_mod_mpi( &ctx->DQ, &ctx->D, &Q1 ) );
116 MPI_CHK( mpi_inv_mod( &ctx->QP, &ctx->Q, &ctx->P ) );
117
118 ctx->len = ( mpi_msb( &ctx->N ) + 7 ) >> 3;
119
120cleanup:
121
Paul Bakker6c591fa2011-05-05 11:49:20 +0000122 mpi_free( &P1 ); mpi_free( &Q1 ); mpi_free( &H ); mpi_free( &G );
Paul Bakker5121ce52009-01-03 21:22:43 +0000123
124 if( ret != 0 )
125 {
126 rsa_free( ctx );
Paul Bakker9d781402011-05-09 16:17:09 +0000127 return( POLARSSL_ERR_RSA_KEY_GEN_FAILED + ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000128 }
129
130 return( 0 );
131}
132
133#endif
134
135/*
136 * Check a public RSA key
137 */
Paul Bakkerff60ee62010-03-16 21:09:09 +0000138int rsa_check_pubkey( const rsa_context *ctx )
Paul Bakker5121ce52009-01-03 21:22:43 +0000139{
Paul Bakker37940d9f2009-07-10 22:38:58 +0000140 if( !ctx->N.p || !ctx->E.p )
141 return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED );
142
Paul Bakker5121ce52009-01-03 21:22:43 +0000143 if( ( ctx->N.p[0] & 1 ) == 0 ||
144 ( ctx->E.p[0] & 1 ) == 0 )
Paul Bakker40e46942009-01-03 21:51:57 +0000145 return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000146
147 if( mpi_msb( &ctx->N ) < 128 ||
Paul Bakkerfe3256e2011-11-25 12:11:43 +0000148 mpi_msb( &ctx->N ) > POLARSSL_MPI_MAX_BITS )
Paul Bakker40e46942009-01-03 21:51:57 +0000149 return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000150
151 if( mpi_msb( &ctx->E ) < 2 ||
152 mpi_msb( &ctx->E ) > 64 )
Paul Bakker40e46942009-01-03 21:51:57 +0000153 return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000154
155 return( 0 );
156}
157
158/*
159 * Check a private RSA key
160 */
Paul Bakkerff60ee62010-03-16 21:09:09 +0000161int rsa_check_privkey( const rsa_context *ctx )
Paul Bakker5121ce52009-01-03 21:22:43 +0000162{
163 int ret;
Paul Bakkerb572adf2010-07-18 08:29:32 +0000164 mpi PQ, DE, P1, Q1, H, I, G, G2, L1, L2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000165
166 if( ( ret = rsa_check_pubkey( ctx ) ) != 0 )
167 return( ret );
168
Paul Bakker37940d9f2009-07-10 22:38:58 +0000169 if( !ctx->P.p || !ctx->Q.p || !ctx->D.p )
170 return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED );
171
Paul Bakker6c591fa2011-05-05 11:49:20 +0000172 mpi_init( &PQ ); mpi_init( &DE ); mpi_init( &P1 ); mpi_init( &Q1 );
173 mpi_init( &H ); mpi_init( &I ); mpi_init( &G ); mpi_init( &G2 );
174 mpi_init( &L1 ); mpi_init( &L2 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000175
176 MPI_CHK( mpi_mul_mpi( &PQ, &ctx->P, &ctx->Q ) );
177 MPI_CHK( mpi_mul_mpi( &DE, &ctx->D, &ctx->E ) );
178 MPI_CHK( mpi_sub_int( &P1, &ctx->P, 1 ) );
179 MPI_CHK( mpi_sub_int( &Q1, &ctx->Q, 1 ) );
180 MPI_CHK( mpi_mul_mpi( &H, &P1, &Q1 ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000181 MPI_CHK( mpi_gcd( &G, &ctx->E, &H ) );
182
Paul Bakkerb572adf2010-07-18 08:29:32 +0000183 MPI_CHK( mpi_gcd( &G2, &P1, &Q1 ) );
184 MPI_CHK( mpi_div_mpi( &L1, &L2, &H, &G2 ) );
185 MPI_CHK( mpi_mod_mpi( &I, &DE, &L1 ) );
186
187 /*
188 * Check for a valid PKCS1v2 private key
189 */
Paul Bakker6c591fa2011-05-05 11:49:20 +0000190 if( mpi_cmp_mpi( &PQ, &ctx->N ) != 0 ||
191 mpi_cmp_int( &L2, 0 ) != 0 ||
192 mpi_cmp_int( &I, 1 ) != 0 ||
193 mpi_cmp_int( &G, 1 ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000194 {
Paul Bakker6c591fa2011-05-05 11:49:20 +0000195 ret = POLARSSL_ERR_RSA_KEY_CHECK_FAILED;
Paul Bakker5121ce52009-01-03 21:22:43 +0000196 }
197
Paul Bakkerb572adf2010-07-18 08:29:32 +0000198
Paul Bakker5121ce52009-01-03 21:22:43 +0000199cleanup:
200
Paul Bakker6c591fa2011-05-05 11:49:20 +0000201 mpi_free( &PQ ); mpi_free( &DE ); mpi_free( &P1 ); mpi_free( &Q1 );
202 mpi_free( &H ); mpi_free( &I ); mpi_free( &G ); mpi_free( &G2 );
203 mpi_free( &L1 ); mpi_free( &L2 );
204
Paul Bakker9d781402011-05-09 16:17:09 +0000205 if( ret == POLARSSL_ERR_RSA_KEY_CHECK_FAILED )
206 return( ret );
207
Paul Bakker6c591fa2011-05-05 11:49:20 +0000208 if( ret != 0 )
Paul Bakker9d781402011-05-09 16:17:09 +0000209 return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED + ret );
Paul Bakker6c591fa2011-05-05 11:49:20 +0000210
211 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000212}
213
214/*
215 * Do an RSA public key operation
216 */
217int rsa_public( rsa_context *ctx,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000218 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +0000219 unsigned char *output )
220{
Paul Bakker23986e52011-04-24 08:57:21 +0000221 int ret;
222 size_t olen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000223 mpi T;
224
Paul Bakker6c591fa2011-05-05 11:49:20 +0000225 mpi_init( &T );
Paul Bakker5121ce52009-01-03 21:22:43 +0000226
227 MPI_CHK( mpi_read_binary( &T, input, ctx->len ) );
228
229 if( mpi_cmp_mpi( &T, &ctx->N ) >= 0 )
230 {
Paul Bakker6c591fa2011-05-05 11:49:20 +0000231 mpi_free( &T );
Paul Bakker40e46942009-01-03 21:51:57 +0000232 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +0000233 }
234
235 olen = ctx->len;
236 MPI_CHK( mpi_exp_mod( &T, &T, &ctx->E, &ctx->N, &ctx->RN ) );
237 MPI_CHK( mpi_write_binary( &T, output, olen ) );
238
239cleanup:
240
Paul Bakker6c591fa2011-05-05 11:49:20 +0000241 mpi_free( &T );
Paul Bakker5121ce52009-01-03 21:22:43 +0000242
243 if( ret != 0 )
Paul Bakker9d781402011-05-09 16:17:09 +0000244 return( POLARSSL_ERR_RSA_PUBLIC_FAILED + ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000245
246 return( 0 );
247}
248
249/*
250 * Do an RSA private key operation
251 */
252int rsa_private( rsa_context *ctx,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000253 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +0000254 unsigned char *output )
255{
Paul Bakker23986e52011-04-24 08:57:21 +0000256 int ret;
257 size_t olen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000258 mpi T, T1, T2;
259
Paul Bakker6c591fa2011-05-05 11:49:20 +0000260 mpi_init( &T ); mpi_init( &T1 ); mpi_init( &T2 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000261
262 MPI_CHK( mpi_read_binary( &T, input, ctx->len ) );
263
264 if( mpi_cmp_mpi( &T, &ctx->N ) >= 0 )
265 {
Paul Bakker6c591fa2011-05-05 11:49:20 +0000266 mpi_free( &T );
Paul Bakker40e46942009-01-03 21:51:57 +0000267 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +0000268 }
269
Paul Bakker0216cc12011-03-26 13:40:23 +0000270#if defined(POLARSSL_RSA_NO_CRT)
Paul Bakker5121ce52009-01-03 21:22:43 +0000271 MPI_CHK( mpi_exp_mod( &T, &T, &ctx->D, &ctx->N, &ctx->RN ) );
272#else
273 /*
274 * faster decryption using the CRT
275 *
276 * T1 = input ^ dP mod P
277 * T2 = input ^ dQ mod Q
278 */
279 MPI_CHK( mpi_exp_mod( &T1, &T, &ctx->DP, &ctx->P, &ctx->RP ) );
280 MPI_CHK( mpi_exp_mod( &T2, &T, &ctx->DQ, &ctx->Q, &ctx->RQ ) );
281
282 /*
283 * T = (T1 - T2) * (Q^-1 mod P) mod P
284 */
285 MPI_CHK( mpi_sub_mpi( &T, &T1, &T2 ) );
286 MPI_CHK( mpi_mul_mpi( &T1, &T, &ctx->QP ) );
287 MPI_CHK( mpi_mod_mpi( &T, &T1, &ctx->P ) );
288
289 /*
290 * output = T2 + T * Q
291 */
292 MPI_CHK( mpi_mul_mpi( &T1, &T, &ctx->Q ) );
293 MPI_CHK( mpi_add_mpi( &T, &T2, &T1 ) );
294#endif
295
296 olen = ctx->len;
297 MPI_CHK( mpi_write_binary( &T, output, olen ) );
298
299cleanup:
300
Paul Bakker6c591fa2011-05-05 11:49:20 +0000301 mpi_free( &T ); mpi_free( &T1 ); mpi_free( &T2 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000302
303 if( ret != 0 )
Paul Bakker9d781402011-05-09 16:17:09 +0000304 return( POLARSSL_ERR_RSA_PRIVATE_FAILED + ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000305
306 return( 0 );
307}
308
Paul Bakker9dcc3222011-03-08 14:16:06 +0000309#if defined(POLARSSL_PKCS1_V21)
310/**
311 * Generate and apply the MGF1 operation (from PKCS#1 v2.1) to a buffer.
312 *
Paul Bakkerb125ed82011-11-10 13:33:51 +0000313 * \param dst buffer to mask
314 * \param dlen length of destination buffer
315 * \param src source of the mask generation
316 * \param slen length of the source buffer
317 * \param md_ctx message digest context to use
Paul Bakker9dcc3222011-03-08 14:16:06 +0000318 */
Paul Bakker23986e52011-04-24 08:57:21 +0000319static void mgf_mask( unsigned char *dst, size_t dlen, unsigned char *src, size_t slen,
Paul Bakker9dcc3222011-03-08 14:16:06 +0000320 md_context_t *md_ctx )
321{
322 unsigned char mask[POLARSSL_MD_MAX_SIZE];
323 unsigned char counter[4];
324 unsigned char *p;
Paul Bakker23986e52011-04-24 08:57:21 +0000325 unsigned int hlen;
326 size_t i, use_len;
Paul Bakker9dcc3222011-03-08 14:16:06 +0000327
328 memset( mask, 0, POLARSSL_MD_MAX_SIZE );
329 memset( counter, 0, 4 );
330
331 hlen = md_ctx->md_info->size;
332
333 // Generate and apply dbMask
334 //
335 p = dst;
336
337 while( dlen > 0 )
338 {
339 use_len = hlen;
340 if( dlen < hlen )
341 use_len = dlen;
342
343 md_starts( md_ctx );
344 md_update( md_ctx, src, slen );
345 md_update( md_ctx, counter, 4 );
346 md_finish( md_ctx, mask );
347
348 for( i = 0; i < use_len; ++i )
349 *p++ ^= mask[i];
350
351 counter[3]++;
352
353 dlen -= use_len;
354 }
355}
356#endif
357
Paul Bakker5121ce52009-01-03 21:22:43 +0000358/*
359 * Add the message padding, then do an RSA operation
360 */
361int rsa_pkcs1_encrypt( rsa_context *ctx,
Paul Bakkera3d195c2011-11-27 21:07:34 +0000362 int (*f_rng)(void *, unsigned char *, size_t),
Paul Bakker21eb2802010-08-16 11:10:02 +0000363 void *p_rng,
Paul Bakker23986e52011-04-24 08:57:21 +0000364 int mode, size_t ilen,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000365 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +0000366 unsigned char *output )
367{
Paul Bakkered375ca2012-01-14 18:10:38 +0000368 size_t nb_pad, olen;
369 int ret;
Paul Bakker5121ce52009-01-03 21:22:43 +0000370 unsigned char *p = output;
Paul Bakker9dcc3222011-03-08 14:16:06 +0000371#if defined(POLARSSL_PKCS1_V21)
Paul Bakkera3d195c2011-11-27 21:07:34 +0000372 unsigned int hlen;
Paul Bakker9dcc3222011-03-08 14:16:06 +0000373 const md_info_t *md_info;
374 md_context_t md_ctx;
Paul Bakker9dcc3222011-03-08 14:16:06 +0000375#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000376
377 olen = ctx->len;
378
Paul Bakker9dcc3222011-03-08 14:16:06 +0000379 if( f_rng == NULL )
380 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
381
Paul Bakker5121ce52009-01-03 21:22:43 +0000382 switch( ctx->padding )
383 {
384 case RSA_PKCS_V15:
385
Paul Bakker23986e52011-04-24 08:57:21 +0000386 if( olen < ilen + 11 )
Paul Bakker40e46942009-01-03 21:51:57 +0000387 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +0000388
389 nb_pad = olen - 3 - ilen;
390
391 *p++ = 0;
Paul Bakkere6ee41f2012-05-19 08:43:48 +0000392 if( mode == RSA_PUBLIC )
Paul Bakker5121ce52009-01-03 21:22:43 +0000393 {
Paul Bakkere6ee41f2012-05-19 08:43:48 +0000394 *p++ = RSA_CRYPT;
Paul Bakkerb572adf2010-07-18 08:29:32 +0000395
Paul Bakkere6ee41f2012-05-19 08:43:48 +0000396 while( nb_pad-- > 0 )
397 {
398 int rng_dl = 100;
Paul Bakkerb572adf2010-07-18 08:29:32 +0000399
Paul Bakkere6ee41f2012-05-19 08:43:48 +0000400 do {
401 ret = f_rng( p_rng, p, 1 );
402 } while( *p == 0 && --rng_dl && ret == 0 );
Paul Bakkerb572adf2010-07-18 08:29:32 +0000403
Paul Bakkere6ee41f2012-05-19 08:43:48 +0000404 // Check if RNG failed to generate data
405 //
406 if( rng_dl == 0 || ret != 0)
407 return POLARSSL_ERR_RSA_RNG_FAILED + ret;
408
409 p++;
410 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000411 }
Paul Bakkere6ee41f2012-05-19 08:43:48 +0000412 else
413 {
414 *p++ = RSA_SIGN;
415
416 while( nb_pad-- > 0 )
417 *p++ = 0xFF;
418 }
419
Paul Bakker5121ce52009-01-03 21:22:43 +0000420 *p++ = 0;
421 memcpy( p, input, ilen );
422 break;
Paul Bakker9dcc3222011-03-08 14:16:06 +0000423
424#if defined(POLARSSL_PKCS1_V21)
425 case RSA_PKCS_V21:
426
427 md_info = md_info_from_type( ctx->hash_id );
428 if( md_info == NULL )
429 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
430
431 hlen = md_get_size( md_info );
432
Paul Bakker23986e52011-04-24 08:57:21 +0000433 if( olen < ilen + 2 * hlen + 2 || f_rng == NULL )
Paul Bakker9dcc3222011-03-08 14:16:06 +0000434 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
435
436 memset( output, 0, olen );
437 memset( &md_ctx, 0, sizeof( md_context_t ) );
438
439 md_init_ctx( &md_ctx, md_info );
440
441 *p++ = 0;
442
443 // Generate a random octet string seed
444 //
Paul Bakkera3d195c2011-11-27 21:07:34 +0000445 if( ( ret = f_rng( p_rng, p, hlen ) ) != 0 )
446 return( POLARSSL_ERR_RSA_RNG_FAILED + ret );
447
448 p += hlen;
Paul Bakker9dcc3222011-03-08 14:16:06 +0000449
450 // Construct DB
451 //
452 md( md_info, p, 0, p );
453 p += hlen;
454 p += olen - 2 * hlen - 2 - ilen;
455 *p++ = 1;
456 memcpy( p, input, ilen );
457
458 // maskedDB: Apply dbMask to DB
459 //
460 mgf_mask( output + hlen + 1, olen - hlen - 1, output + 1, hlen,
461 &md_ctx );
462
463 // maskedSeed: Apply seedMask to seed
464 //
465 mgf_mask( output + 1, hlen, output + hlen + 1, olen - hlen - 1,
466 &md_ctx );
467 break;
468#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000469
470 default:
471
Paul Bakker40e46942009-01-03 21:51:57 +0000472 return( POLARSSL_ERR_RSA_INVALID_PADDING );
Paul Bakker5121ce52009-01-03 21:22:43 +0000473 }
474
475 return( ( mode == RSA_PUBLIC )
476 ? rsa_public( ctx, output, output )
477 : rsa_private( ctx, output, output ) );
478}
479
480/*
481 * Do an RSA operation, then remove the message padding
482 */
483int rsa_pkcs1_decrypt( rsa_context *ctx,
Paul Bakker23986e52011-04-24 08:57:21 +0000484 int mode, size_t *olen,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000485 const unsigned char *input,
Paul Bakker060c5682009-01-12 21:48:39 +0000486 unsigned char *output,
Paul Bakker23986e52011-04-24 08:57:21 +0000487 size_t output_max_len)
Paul Bakker5121ce52009-01-03 21:22:43 +0000488{
Paul Bakker23986e52011-04-24 08:57:21 +0000489 int ret;
490 size_t ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000491 unsigned char *p;
Paul Bakkere6ee41f2012-05-19 08:43:48 +0000492 unsigned char bt;
Paul Bakkercde51572009-05-17 10:11:56 +0000493 unsigned char buf[1024];
Paul Bakker9dcc3222011-03-08 14:16:06 +0000494#if defined(POLARSSL_PKCS1_V21)
495 unsigned char lhash[POLARSSL_MD_MAX_SIZE];
Paul Bakker23986e52011-04-24 08:57:21 +0000496 unsigned int hlen;
Paul Bakker9dcc3222011-03-08 14:16:06 +0000497 const md_info_t *md_info;
498 md_context_t md_ctx;
Paul Bakker9dcc3222011-03-08 14:16:06 +0000499#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000500
501 ilen = ctx->len;
502
Paul Bakker27fdf462011-06-09 13:55:13 +0000503 if( ilen < 16 || ilen > sizeof( buf ) )
Paul Bakker40e46942009-01-03 21:51:57 +0000504 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +0000505
506 ret = ( mode == RSA_PUBLIC )
507 ? rsa_public( ctx, input, buf )
508 : rsa_private( ctx, input, buf );
509
510 if( ret != 0 )
511 return( ret );
512
513 p = buf;
514
515 switch( ctx->padding )
516 {
517 case RSA_PKCS_V15:
518
Paul Bakkere6ee41f2012-05-19 08:43:48 +0000519 if( *p++ != 0 )
Paul Bakker40e46942009-01-03 21:51:57 +0000520 return( POLARSSL_ERR_RSA_INVALID_PADDING );
Paul Bakkere6ee41f2012-05-19 08:43:48 +0000521
522 bt = *p++;
523 if( ( bt != RSA_CRYPT && mode == RSA_PRIVATE ) ||
524 ( bt != RSA_SIGN && mode == RSA_PUBLIC ) )
Paul Bakker5121ce52009-01-03 21:22:43 +0000525 {
Paul Bakkere6ee41f2012-05-19 08:43:48 +0000526 return( POLARSSL_ERR_RSA_INVALID_PADDING );
527 }
528
529 if( bt == RSA_CRYPT )
530 {
531 while( *p != 0 && p < buf + ilen - 1 )
532 p++;
533
534 if( *p != 0 || p >= buf + ilen - 1 )
Paul Bakker40e46942009-01-03 21:51:57 +0000535 return( POLARSSL_ERR_RSA_INVALID_PADDING );
Paul Bakkere6ee41f2012-05-19 08:43:48 +0000536
Paul Bakker5121ce52009-01-03 21:22:43 +0000537 p++;
538 }
Paul Bakkere6ee41f2012-05-19 08:43:48 +0000539 else
540 {
541 while( *p == 0xFF && p < buf + ilen - 1 )
542 p++;
543
544 if( *p != 0 || p >= buf + ilen - 1 )
545 return( POLARSSL_ERR_RSA_INVALID_PADDING );
546
547 p++;
548 }
549
Paul Bakker5121ce52009-01-03 21:22:43 +0000550 break;
551
Paul Bakker9dcc3222011-03-08 14:16:06 +0000552#if defined(POLARSSL_PKCS1_V21)
553 case RSA_PKCS_V21:
554
555 if( *p++ != 0 )
556 return( POLARSSL_ERR_RSA_INVALID_PADDING );
557
558 md_info = md_info_from_type( ctx->hash_id );
559 if( md_info == NULL )
560 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
561
562 hlen = md_get_size( md_info );
563 memset( &md_ctx, 0, sizeof( md_context_t ) );
564
565 md_init_ctx( &md_ctx, md_info );
566
567 // Generate lHash
568 //
569 md( md_info, lhash, 0, lhash );
570
571 // seed: Apply seedMask to maskedSeed
572 //
573 mgf_mask( buf + 1, hlen, buf + hlen + 1, ilen - hlen - 1,
574 &md_ctx );
575
576 // DB: Apply dbMask to maskedDB
577 //
578 mgf_mask( buf + hlen + 1, ilen - hlen - 1, buf + 1, hlen,
579 &md_ctx );
580
581 p += hlen;
582
583 // Check validity
584 //
585 if( memcmp( lhash, p, hlen ) != 0 )
586 return( POLARSSL_ERR_RSA_INVALID_PADDING );
587
588 p += hlen;
589
590 while( *p == 0 && p < buf + ilen )
591 p++;
592
593 if( p == buf + ilen )
594 return( POLARSSL_ERR_RSA_INVALID_PADDING );
595
596 if( *p++ != 0x01 )
597 return( POLARSSL_ERR_RSA_INVALID_PADDING );
598
599 break;
600#endif
601
Paul Bakker5121ce52009-01-03 21:22:43 +0000602 default:
603
Paul Bakker40e46942009-01-03 21:51:57 +0000604 return( POLARSSL_ERR_RSA_INVALID_PADDING );
Paul Bakker5121ce52009-01-03 21:22:43 +0000605 }
606
Paul Bakker27fdf462011-06-09 13:55:13 +0000607 if (ilen - (p - buf) > output_max_len)
Paul Bakker23986e52011-04-24 08:57:21 +0000608 return( POLARSSL_ERR_RSA_OUTPUT_TOO_LARGE );
Paul Bakker060c5682009-01-12 21:48:39 +0000609
Paul Bakker27fdf462011-06-09 13:55:13 +0000610 *olen = ilen - (p - buf);
Paul Bakker5121ce52009-01-03 21:22:43 +0000611 memcpy( output, p, *olen );
612
613 return( 0 );
614}
615
616/*
617 * Do an RSA operation to sign the message digest
618 */
619int rsa_pkcs1_sign( rsa_context *ctx,
Paul Bakkera3d195c2011-11-27 21:07:34 +0000620 int (*f_rng)(void *, unsigned char *, size_t),
Paul Bakker9dcc3222011-03-08 14:16:06 +0000621 void *p_rng,
Paul Bakker5121ce52009-01-03 21:22:43 +0000622 int mode,
623 int hash_id,
Paul Bakker23986e52011-04-24 08:57:21 +0000624 unsigned int hashlen,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000625 const unsigned char *hash,
Paul Bakker5121ce52009-01-03 21:22:43 +0000626 unsigned char *sig )
627{
Paul Bakker23986e52011-04-24 08:57:21 +0000628 size_t nb_pad, olen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000629 unsigned char *p = sig;
Paul Bakker9dcc3222011-03-08 14:16:06 +0000630#if defined(POLARSSL_PKCS1_V21)
631 unsigned char salt[POLARSSL_MD_MAX_SIZE];
Paul Bakkered375ca2012-01-14 18:10:38 +0000632 unsigned int slen, hlen, offset = 0;
633 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000634 size_t msb;
Paul Bakker9dcc3222011-03-08 14:16:06 +0000635 const md_info_t *md_info;
636 md_context_t md_ctx;
Paul Bakker9dcc3222011-03-08 14:16:06 +0000637#else
638 (void) f_rng;
639 (void) p_rng;
640#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000641
642 olen = ctx->len;
643
644 switch( ctx->padding )
645 {
646 case RSA_PKCS_V15:
647
648 switch( hash_id )
649 {
Paul Bakkerfc22c442009-07-19 20:36:27 +0000650 case SIG_RSA_RAW:
Paul Bakker5121ce52009-01-03 21:22:43 +0000651 nb_pad = olen - 3 - hashlen;
652 break;
653
Paul Bakker4593aea2009-02-09 22:32:35 +0000654 case SIG_RSA_MD2:
655 case SIG_RSA_MD4:
656 case SIG_RSA_MD5:
Paul Bakker5121ce52009-01-03 21:22:43 +0000657 nb_pad = olen - 3 - 34;
658 break;
659
Paul Bakker4593aea2009-02-09 22:32:35 +0000660 case SIG_RSA_SHA1:
Paul Bakker5121ce52009-01-03 21:22:43 +0000661 nb_pad = olen - 3 - 35;
662 break;
663
Paul Bakkercde51572009-05-17 10:11:56 +0000664 case SIG_RSA_SHA224:
665 nb_pad = olen - 3 - 47;
666 break;
667
668 case SIG_RSA_SHA256:
669 nb_pad = olen - 3 - 51;
670 break;
671
672 case SIG_RSA_SHA384:
673 nb_pad = olen - 3 - 67;
674 break;
675
676 case SIG_RSA_SHA512:
677 nb_pad = olen - 3 - 83;
678 break;
679
680
Paul Bakker5121ce52009-01-03 21:22:43 +0000681 default:
Paul Bakker40e46942009-01-03 21:51:57 +0000682 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +0000683 }
684
Paul Bakker3c16db92012-07-05 13:58:08 +0000685 if( ( nb_pad < 8 ) || ( nb_pad > olen ) )
Paul Bakker40e46942009-01-03 21:51:57 +0000686 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +0000687
688 *p++ = 0;
689 *p++ = RSA_SIGN;
690 memset( p, 0xFF, nb_pad );
691 p += nb_pad;
692 *p++ = 0;
Paul Bakker9dcc3222011-03-08 14:16:06 +0000693
694 switch( hash_id )
695 {
696 case SIG_RSA_RAW:
697 memcpy( p, hash, hashlen );
698 break;
699
700 case SIG_RSA_MD2:
701 memcpy( p, ASN1_HASH_MDX, 18 );
702 memcpy( p + 18, hash, 16 );
703 p[13] = 2; break;
704
705 case SIG_RSA_MD4:
706 memcpy( p, ASN1_HASH_MDX, 18 );
707 memcpy( p + 18, hash, 16 );
708 p[13] = 4; break;
709
710 case SIG_RSA_MD5:
711 memcpy( p, ASN1_HASH_MDX, 18 );
712 memcpy( p + 18, hash, 16 );
713 p[13] = 5; break;
714
715 case SIG_RSA_SHA1:
716 memcpy( p, ASN1_HASH_SHA1, 15 );
717 memcpy( p + 15, hash, 20 );
718 break;
719
720 case SIG_RSA_SHA224:
721 memcpy( p, ASN1_HASH_SHA2X, 19 );
722 memcpy( p + 19, hash, 28 );
723 p[1] += 28; p[14] = 4; p[18] += 28; break;
724
725 case SIG_RSA_SHA256:
726 memcpy( p, ASN1_HASH_SHA2X, 19 );
727 memcpy( p + 19, hash, 32 );
728 p[1] += 32; p[14] = 1; p[18] += 32; break;
729
730 case SIG_RSA_SHA384:
731 memcpy( p, ASN1_HASH_SHA2X, 19 );
732 memcpy( p + 19, hash, 48 );
733 p[1] += 48; p[14] = 2; p[18] += 48; break;
734
735 case SIG_RSA_SHA512:
736 memcpy( p, ASN1_HASH_SHA2X, 19 );
737 memcpy( p + 19, hash, 64 );
738 p[1] += 64; p[14] = 3; p[18] += 64; break;
739
740 default:
741 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
742 }
743
Paul Bakker5121ce52009-01-03 21:22:43 +0000744 break;
745
Paul Bakker9dcc3222011-03-08 14:16:06 +0000746#if defined(POLARSSL_PKCS1_V21)
747 case RSA_PKCS_V21:
748
749 if( f_rng == NULL )
750 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
751
752 switch( hash_id )
753 {
754 case SIG_RSA_MD2:
755 case SIG_RSA_MD4:
756 case SIG_RSA_MD5:
757 hashlen = 16;
758 break;
759
760 case SIG_RSA_SHA1:
761 hashlen = 20;
762 break;
763
764 case SIG_RSA_SHA224:
765 hashlen = 28;
766 break;
767
768 case SIG_RSA_SHA256:
769 hashlen = 32;
770 break;
771
772 case SIG_RSA_SHA384:
773 hashlen = 48;
774 break;
775
776 case SIG_RSA_SHA512:
777 hashlen = 64;
778 break;
779
780 default:
781 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
782 }
783
784 md_info = md_info_from_type( ctx->hash_id );
785 if( md_info == NULL )
786 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
787
788 hlen = md_get_size( md_info );
Paul Bakker53019ae2011-03-25 13:58:48 +0000789 slen = hlen;
790
Paul Bakker9dcc3222011-03-08 14:16:06 +0000791 memset( sig, 0, olen );
792 memset( &md_ctx, 0, sizeof( md_context_t ) );
793
794 md_init_ctx( &md_ctx, md_info );
795
796 msb = mpi_msb( &ctx->N ) - 1;
797
Paul Bakker53019ae2011-03-25 13:58:48 +0000798 // Generate salt of length slen
Paul Bakker9dcc3222011-03-08 14:16:06 +0000799 //
Paul Bakkera3d195c2011-11-27 21:07:34 +0000800 if( ( ret = f_rng( p_rng, salt, slen ) ) != 0 )
801 return( POLARSSL_ERR_RSA_RNG_FAILED + ret );
Paul Bakker9dcc3222011-03-08 14:16:06 +0000802
803 // Note: EMSA-PSS encoding is over the length of N - 1 bits
804 //
805 msb = mpi_msb( &ctx->N ) - 1;
806 p += olen - hlen * 2 - 2;
807 *p++ = 0x01;
Paul Bakker53019ae2011-03-25 13:58:48 +0000808 memcpy( p, salt, slen );
809 p += slen;
Paul Bakker9dcc3222011-03-08 14:16:06 +0000810
811 // Generate H = Hash( M' )
812 //
813 md_starts( &md_ctx );
814 md_update( &md_ctx, p, 8 );
815 md_update( &md_ctx, hash, hashlen );
Paul Bakker53019ae2011-03-25 13:58:48 +0000816 md_update( &md_ctx, salt, slen );
Paul Bakker9dcc3222011-03-08 14:16:06 +0000817 md_finish( &md_ctx, p );
818
819 // Compensate for boundary condition when applying mask
820 //
821 if( msb % 8 == 0 )
822 offset = 1;
823
824 // maskedDB: Apply dbMask to DB
825 //
826 mgf_mask( sig + offset, olen - hlen - 1 - offset, p, hlen, &md_ctx );
827
828 msb = mpi_msb( &ctx->N ) - 1;
829 sig[0] &= 0xFF >> ( olen * 8 - msb );
830
831 p += hlen;
832 *p++ = 0xBC;
833 break;
834#endif
835
Paul Bakker5121ce52009-01-03 21:22:43 +0000836 default:
837
Paul Bakker40e46942009-01-03 21:51:57 +0000838 return( POLARSSL_ERR_RSA_INVALID_PADDING );
Paul Bakker5121ce52009-01-03 21:22:43 +0000839 }
840
Paul Bakker5121ce52009-01-03 21:22:43 +0000841 return( ( mode == RSA_PUBLIC )
842 ? rsa_public( ctx, sig, sig )
843 : rsa_private( ctx, sig, sig ) );
844}
845
846/*
847 * Do an RSA operation and check the message digest
848 */
849int rsa_pkcs1_verify( rsa_context *ctx,
850 int mode,
851 int hash_id,
Paul Bakker23986e52011-04-24 08:57:21 +0000852 unsigned int hashlen,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000853 const unsigned char *hash,
Paul Bakker5121ce52009-01-03 21:22:43 +0000854 unsigned char *sig )
855{
Paul Bakker23986e52011-04-24 08:57:21 +0000856 int ret;
857 size_t len, siglen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000858 unsigned char *p, c;
Paul Bakkercde51572009-05-17 10:11:56 +0000859 unsigned char buf[1024];
Paul Bakker9dcc3222011-03-08 14:16:06 +0000860#if defined(POLARSSL_PKCS1_V21)
Paul Bakker1fe7d9b2011-11-15 15:26:03 +0000861 unsigned char result[POLARSSL_MD_MAX_SIZE];
Paul Bakker9dcc3222011-03-08 14:16:06 +0000862 unsigned char zeros[8];
Paul Bakker23986e52011-04-24 08:57:21 +0000863 unsigned int hlen;
864 size_t slen, msb;
Paul Bakker9dcc3222011-03-08 14:16:06 +0000865 const md_info_t *md_info;
866 md_context_t md_ctx;
Paul Bakker9dcc3222011-03-08 14:16:06 +0000867#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000868 siglen = ctx->len;
869
Paul Bakker27fdf462011-06-09 13:55:13 +0000870 if( siglen < 16 || siglen > sizeof( buf ) )
Paul Bakker40e46942009-01-03 21:51:57 +0000871 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +0000872
873 ret = ( mode == RSA_PUBLIC )
874 ? rsa_public( ctx, sig, buf )
875 : rsa_private( ctx, sig, buf );
876
877 if( ret != 0 )
878 return( ret );
879
880 p = buf;
881
882 switch( ctx->padding )
883 {
884 case RSA_PKCS_V15:
885
886 if( *p++ != 0 || *p++ != RSA_SIGN )
Paul Bakker40e46942009-01-03 21:51:57 +0000887 return( POLARSSL_ERR_RSA_INVALID_PADDING );
Paul Bakker5121ce52009-01-03 21:22:43 +0000888
889 while( *p != 0 )
890 {
891 if( p >= buf + siglen - 1 || *p != 0xFF )
Paul Bakker40e46942009-01-03 21:51:57 +0000892 return( POLARSSL_ERR_RSA_INVALID_PADDING );
Paul Bakker5121ce52009-01-03 21:22:43 +0000893 p++;
894 }
895 p++;
Paul Bakker9dcc3222011-03-08 14:16:06 +0000896
Paul Bakker27fdf462011-06-09 13:55:13 +0000897 len = siglen - ( p - buf );
Paul Bakker9dcc3222011-03-08 14:16:06 +0000898
Paul Bakker56a76842012-03-22 15:31:27 +0000899 if( len == 33 && hash_id == SIG_RSA_SHA1 )
900 {
901 if( memcmp( p, ASN1_HASH_SHA1_ALT, 13 ) == 0 &&
902 memcmp( p + 13, hash, 20 ) == 0 )
903 return( 0 );
904 else
905 return( POLARSSL_ERR_RSA_VERIFY_FAILED );
906 }
Paul Bakker9dcc3222011-03-08 14:16:06 +0000907 if( len == 34 )
908 {
909 c = p[13];
910 p[13] = 0;
911
912 if( memcmp( p, ASN1_HASH_MDX, 18 ) != 0 )
913 return( POLARSSL_ERR_RSA_VERIFY_FAILED );
914
915 if( ( c == 2 && hash_id == SIG_RSA_MD2 ) ||
916 ( c == 4 && hash_id == SIG_RSA_MD4 ) ||
917 ( c == 5 && hash_id == SIG_RSA_MD5 ) )
918 {
919 if( memcmp( p + 18, hash, 16 ) == 0 )
920 return( 0 );
921 else
922 return( POLARSSL_ERR_RSA_VERIFY_FAILED );
923 }
924 }
925
926 if( len == 35 && hash_id == SIG_RSA_SHA1 )
927 {
928 if( memcmp( p, ASN1_HASH_SHA1, 15 ) == 0 &&
929 memcmp( p + 15, hash, 20 ) == 0 )
930 return( 0 );
931 else
932 return( POLARSSL_ERR_RSA_VERIFY_FAILED );
933 }
934 if( ( len == 19 + 28 && p[14] == 4 && hash_id == SIG_RSA_SHA224 ) ||
935 ( len == 19 + 32 && p[14] == 1 && hash_id == SIG_RSA_SHA256 ) ||
936 ( len == 19 + 48 && p[14] == 2 && hash_id == SIG_RSA_SHA384 ) ||
937 ( len == 19 + 64 && p[14] == 3 && hash_id == SIG_RSA_SHA512 ) )
938 {
939 c = p[1] - 17;
940 p[1] = 17;
941 p[14] = 0;
942
943 if( p[18] == c &&
944 memcmp( p, ASN1_HASH_SHA2X, 18 ) == 0 &&
945 memcmp( p + 19, hash, c ) == 0 )
946 return( 0 );
947 else
948 return( POLARSSL_ERR_RSA_VERIFY_FAILED );
949 }
950
951 if( len == hashlen && hash_id == SIG_RSA_RAW )
952 {
953 if( memcmp( p, hash, hashlen ) == 0 )
954 return( 0 );
955 else
956 return( POLARSSL_ERR_RSA_VERIFY_FAILED );
957 }
958
Paul Bakker5121ce52009-01-03 21:22:43 +0000959 break;
960
Paul Bakker9dcc3222011-03-08 14:16:06 +0000961#if defined(POLARSSL_PKCS1_V21)
962 case RSA_PKCS_V21:
963
964 if( buf[siglen - 1] != 0xBC )
965 return( POLARSSL_ERR_RSA_INVALID_PADDING );
966
967 switch( hash_id )
968 {
969 case SIG_RSA_MD2:
970 case SIG_RSA_MD4:
971 case SIG_RSA_MD5:
972 hashlen = 16;
973 break;
974
975 case SIG_RSA_SHA1:
976 hashlen = 20;
977 break;
978
979 case SIG_RSA_SHA224:
980 hashlen = 28;
981 break;
982
983 case SIG_RSA_SHA256:
984 hashlen = 32;
985 break;
986
987 case SIG_RSA_SHA384:
988 hashlen = 48;
989 break;
990
991 case SIG_RSA_SHA512:
992 hashlen = 64;
993 break;
994
995 default:
996 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
997 }
998
999 md_info = md_info_from_type( ctx->hash_id );
1000 if( md_info == NULL )
1001 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
1002
1003 hlen = md_get_size( md_info );
Paul Bakker53019ae2011-03-25 13:58:48 +00001004 slen = siglen - hlen - 1;
1005
Paul Bakker9dcc3222011-03-08 14:16:06 +00001006 memset( &md_ctx, 0, sizeof( md_context_t ) );
1007 memset( zeros, 0, 8 );
1008
1009 md_init_ctx( &md_ctx, md_info );
1010
1011 // Note: EMSA-PSS verification is over the length of N - 1 bits
1012 //
1013 msb = mpi_msb( &ctx->N ) - 1;
1014
1015 // Compensate for boundary condition when applying mask
1016 //
1017 if( msb % 8 == 0 )
1018 {
1019 p++;
1020 siglen -= 1;
1021 }
1022 if( buf[0] >> ( 8 - siglen * 8 + msb ) )
1023 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
1024
1025 mgf_mask( p, siglen - hlen - 1, p + siglen - hlen - 1, hlen, &md_ctx );
1026
1027 buf[0] &= 0xFF >> ( siglen * 8 - msb );
1028
1029 while( *p == 0 && p < buf + siglen )
1030 p++;
1031
1032 if( p == buf + siglen )
1033 return( POLARSSL_ERR_RSA_INVALID_PADDING );
1034
1035 if( *p++ != 0x01 )
1036 return( POLARSSL_ERR_RSA_INVALID_PADDING );
1037
Paul Bakker53019ae2011-03-25 13:58:48 +00001038 slen -= p - buf;
1039
Paul Bakker9dcc3222011-03-08 14:16:06 +00001040 // Generate H = Hash( M' )
1041 //
1042 md_starts( &md_ctx );
1043 md_update( &md_ctx, zeros, 8 );
1044 md_update( &md_ctx, hash, hashlen );
Paul Bakker53019ae2011-03-25 13:58:48 +00001045 md_update( &md_ctx, p, slen );
Paul Bakker1fe7d9b2011-11-15 15:26:03 +00001046 md_finish( &md_ctx, result );
Paul Bakker9dcc3222011-03-08 14:16:06 +00001047
Paul Bakker1fe7d9b2011-11-15 15:26:03 +00001048 if( memcmp( p + slen, result, hlen ) == 0 )
Paul Bakker9dcc3222011-03-08 14:16:06 +00001049 return( 0 );
1050 else
1051 return( POLARSSL_ERR_RSA_VERIFY_FAILED );
Paul Bakker9dcc3222011-03-08 14:16:06 +00001052#endif
1053
Paul Bakker5121ce52009-01-03 21:22:43 +00001054 default:
1055
Paul Bakker40e46942009-01-03 21:51:57 +00001056 return( POLARSSL_ERR_RSA_INVALID_PADDING );
Paul Bakker5121ce52009-01-03 21:22:43 +00001057 }
1058
Paul Bakker40e46942009-01-03 21:51:57 +00001059 return( POLARSSL_ERR_RSA_INVALID_PADDING );
Paul Bakker5121ce52009-01-03 21:22:43 +00001060}
1061
1062/*
1063 * Free the components of an RSA key
1064 */
1065void rsa_free( rsa_context *ctx )
1066{
Paul Bakker6c591fa2011-05-05 11:49:20 +00001067 mpi_free( &ctx->RQ ); mpi_free( &ctx->RP ); mpi_free( &ctx->RN );
1068 mpi_free( &ctx->QP ); mpi_free( &ctx->DQ ); mpi_free( &ctx->DP );
1069 mpi_free( &ctx->Q ); mpi_free( &ctx->P ); mpi_free( &ctx->D );
1070 mpi_free( &ctx->E ); mpi_free( &ctx->N );
Paul Bakker5121ce52009-01-03 21:22:43 +00001071}
1072
Paul Bakker40e46942009-01-03 21:51:57 +00001073#if defined(POLARSSL_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +00001074
Paul Bakker40e46942009-01-03 21:51:57 +00001075#include "polarssl/sha1.h"
Paul Bakker5121ce52009-01-03 21:22:43 +00001076
1077/*
1078 * Example RSA-1024 keypair, for test purposes
1079 */
1080#define KEY_LEN 128
1081
1082#define RSA_N "9292758453063D803DD603D5E777D788" \
1083 "8ED1D5BF35786190FA2F23EBC0848AEA" \
1084 "DDA92CA6C3D80B32C4D109BE0F36D6AE" \
1085 "7130B9CED7ACDF54CFC7555AC14EEBAB" \
1086 "93A89813FBF3C4F8066D2D800F7C38A8" \
1087 "1AE31942917403FF4946B0A83D3D3E05" \
1088 "EE57C6F5F5606FB5D4BC6CD34EE0801A" \
1089 "5E94BB77B07507233A0BC7BAC8F90F79"
1090
1091#define RSA_E "10001"
1092
1093#define RSA_D "24BF6185468786FDD303083D25E64EFC" \
1094 "66CA472BC44D253102F8B4A9D3BFA750" \
1095 "91386C0077937FE33FA3252D28855837" \
1096 "AE1B484A8A9A45F7EE8C0C634F99E8CD" \
1097 "DF79C5CE07EE72C7F123142198164234" \
1098 "CABB724CF78B8173B9F880FC86322407" \
1099 "AF1FEDFDDE2BEB674CA15F3E81A1521E" \
1100 "071513A1E85B5DFA031F21ECAE91A34D"
1101
1102#define RSA_P "C36D0EB7FCD285223CFB5AABA5BDA3D8" \
1103 "2C01CAD19EA484A87EA4377637E75500" \
1104 "FCB2005C5C7DD6EC4AC023CDA285D796" \
1105 "C3D9E75E1EFC42488BB4F1D13AC30A57"
1106
1107#define RSA_Q "C000DF51A7C77AE8D7C7370C1FF55B69" \
1108 "E211C2B9E5DB1ED0BF61D0D9899620F4" \
1109 "910E4168387E3C30AA1E00C339A79508" \
1110 "8452DD96A9A5EA5D9DCA68DA636032AF"
1111
1112#define RSA_DP "C1ACF567564274FB07A0BBAD5D26E298" \
1113 "3C94D22288ACD763FD8E5600ED4A702D" \
1114 "F84198A5F06C2E72236AE490C93F07F8" \
1115 "3CC559CD27BC2D1CA488811730BB5725"
1116
1117#define RSA_DQ "4959CBF6F8FEF750AEE6977C155579C7" \
1118 "D8AAEA56749EA28623272E4F7D0592AF" \
1119 "7C1F1313CAC9471B5C523BFE592F517B" \
1120 "407A1BD76C164B93DA2D32A383E58357"
1121
1122#define RSA_QP "9AE7FBC99546432DF71896FC239EADAE" \
1123 "F38D18D2B2F0E2DD275AA977E2BF4411" \
1124 "F5A3B2A5D33605AEBBCCBA7FEB9F2D2F" \
1125 "A74206CEC169D74BF5A8C50D6F48EA08"
1126
1127#define PT_LEN 24
1128#define RSA_PT "\xAA\xBB\xCC\x03\x02\x01\x00\xFF\xFF\xFF\xFF\xFF" \
1129 "\x11\x22\x33\x0A\x0B\x0C\xCC\xDD\xDD\xDD\xDD\xDD"
1130
Paul Bakkera3d195c2011-11-27 21:07:34 +00001131static int myrand( void *rng_state, unsigned char *output, size_t len )
Paul Bakker545570e2010-07-18 09:00:25 +00001132{
Paul Bakkera3d195c2011-11-27 21:07:34 +00001133 size_t i;
1134
Paul Bakker545570e2010-07-18 09:00:25 +00001135 if( rng_state != NULL )
1136 rng_state = NULL;
1137
Paul Bakkera3d195c2011-11-27 21:07:34 +00001138 for( i = 0; i < len; ++i )
1139 output[i] = rand();
1140
1141 return( 0 );
Paul Bakker545570e2010-07-18 09:00:25 +00001142}
1143
Paul Bakker5121ce52009-01-03 21:22:43 +00001144/*
1145 * Checkup routine
1146 */
1147int rsa_self_test( int verbose )
1148{
Paul Bakker23986e52011-04-24 08:57:21 +00001149 size_t len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001150 rsa_context rsa;
Paul Bakker5121ce52009-01-03 21:22:43 +00001151 unsigned char rsa_plaintext[PT_LEN];
1152 unsigned char rsa_decrypted[PT_LEN];
1153 unsigned char rsa_ciphertext[KEY_LEN];
Paul Bakker5690efc2011-05-26 13:16:06 +00001154#if defined(POLARSSL_SHA1_C)
1155 unsigned char sha1sum[20];
1156#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001157
Paul Bakker21eb2802010-08-16 11:10:02 +00001158 rsa_init( &rsa, RSA_PKCS_V15, 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001159
1160 rsa.len = KEY_LEN;
1161 mpi_read_string( &rsa.N , 16, RSA_N );
1162 mpi_read_string( &rsa.E , 16, RSA_E );
1163 mpi_read_string( &rsa.D , 16, RSA_D );
1164 mpi_read_string( &rsa.P , 16, RSA_P );
1165 mpi_read_string( &rsa.Q , 16, RSA_Q );
1166 mpi_read_string( &rsa.DP, 16, RSA_DP );
1167 mpi_read_string( &rsa.DQ, 16, RSA_DQ );
1168 mpi_read_string( &rsa.QP, 16, RSA_QP );
1169
1170 if( verbose != 0 )
1171 printf( " RSA key validation: " );
1172
1173 if( rsa_check_pubkey( &rsa ) != 0 ||
1174 rsa_check_privkey( &rsa ) != 0 )
1175 {
1176 if( verbose != 0 )
1177 printf( "failed\n" );
1178
1179 return( 1 );
1180 }
1181
1182 if( verbose != 0 )
1183 printf( "passed\n PKCS#1 encryption : " );
1184
1185 memcpy( rsa_plaintext, RSA_PT, PT_LEN );
1186
Paul Bakker21eb2802010-08-16 11:10:02 +00001187 if( rsa_pkcs1_encrypt( &rsa, &myrand, NULL, RSA_PUBLIC, PT_LEN,
Paul Bakker5121ce52009-01-03 21:22:43 +00001188 rsa_plaintext, rsa_ciphertext ) != 0 )
1189 {
1190 if( verbose != 0 )
1191 printf( "failed\n" );
1192
1193 return( 1 );
1194 }
1195
1196 if( verbose != 0 )
1197 printf( "passed\n PKCS#1 decryption : " );
1198
1199 if( rsa_pkcs1_decrypt( &rsa, RSA_PRIVATE, &len,
Paul Bakker060c5682009-01-12 21:48:39 +00001200 rsa_ciphertext, rsa_decrypted,
Paul Bakker23986e52011-04-24 08:57:21 +00001201 sizeof(rsa_decrypted) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001202 {
1203 if( verbose != 0 )
1204 printf( "failed\n" );
1205
1206 return( 1 );
1207 }
1208
1209 if( memcmp( rsa_decrypted, rsa_plaintext, len ) != 0 )
1210 {
1211 if( verbose != 0 )
1212 printf( "failed\n" );
1213
1214 return( 1 );
1215 }
1216
Paul Bakker5690efc2011-05-26 13:16:06 +00001217#if defined(POLARSSL_SHA1_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00001218 if( verbose != 0 )
1219 printf( "passed\n PKCS#1 data sign : " );
1220
1221 sha1( rsa_plaintext, PT_LEN, sha1sum );
1222
Paul Bakker9dcc3222011-03-08 14:16:06 +00001223 if( rsa_pkcs1_sign( &rsa, NULL, NULL, RSA_PRIVATE, SIG_RSA_SHA1, 20,
Paul Bakker5121ce52009-01-03 21:22:43 +00001224 sha1sum, rsa_ciphertext ) != 0 )
1225 {
1226 if( verbose != 0 )
1227 printf( "failed\n" );
1228
1229 return( 1 );
1230 }
1231
1232 if( verbose != 0 )
1233 printf( "passed\n PKCS#1 sig. verify: " );
1234
Paul Bakker4593aea2009-02-09 22:32:35 +00001235 if( rsa_pkcs1_verify( &rsa, RSA_PUBLIC, SIG_RSA_SHA1, 20,
Paul Bakker5121ce52009-01-03 21:22:43 +00001236 sha1sum, rsa_ciphertext ) != 0 )
1237 {
1238 if( verbose != 0 )
1239 printf( "failed\n" );
1240
1241 return( 1 );
1242 }
1243
1244 if( verbose != 0 )
1245 printf( "passed\n\n" );
Paul Bakker5690efc2011-05-26 13:16:06 +00001246#endif /* POLARSSL_SHA1_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00001247
1248 rsa_free( &rsa );
1249
1250 return( 0 );
1251}
1252
1253#endif
1254
1255#endif