2 * The RSA public-key cryptosystem
4 * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine
6 * Copyright (C) 2009 Paul Bakker <polarssl_maintainer at polarssl dot org>
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
14 * * Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * * Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * * Neither the names of PolarSSL or XySSL nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
29 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 * RSA was designed by Ron Rivest, Adi Shamir and Len Adleman.
38 * http://theory.lcs.mit.edu/~rivest/rsapaper.pdf
39 * http://www.cacr.math.uwaterloo.ca/hac/about/chap8.pdf
42 #include "polarssl/config.h"
44 #if defined(POLARSSL_RSA_C)
46 #include "polarssl/rsa.h"
53 * Initialize an RSA context
55 void rsa_init( rsa_context
*ctx
,
61 memset( ctx
, 0, sizeof( rsa_context
) );
63 ctx
->padding
= padding
;
64 ctx
->hash_id
= hash_id
;
70 #if defined(POLARSSL_GENPRIME)
73 * Generate an RSA keypair
75 int rsa_gen_key( rsa_context
*ctx
, int nbits
, int exponent
)
80 if( ctx
->f_rng
== NULL
|| nbits
< 128 || exponent
< 3 )
81 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA
);
83 mpi_init( &P1
, &Q1
, &H
, &G
, NULL
);
86 * find primes P and Q with Q < P so that:
87 * GCD( E, (P-1)*(Q-1) ) == 1
89 MPI_CHK( mpi_lset( &ctx
->E
, exponent
) );
93 MPI_CHK( mpi_gen_prime( &ctx
->P
, ( nbits
+ 1 ) >> 1, 0,
94 ctx
->f_rng
, ctx
->p_rng
) );
96 MPI_CHK( mpi_gen_prime( &ctx
->Q
, ( nbits
+ 1 ) >> 1, 0,
97 ctx
->f_rng
, ctx
->p_rng
) );
99 if( mpi_cmp_mpi( &ctx
->P
, &ctx
->Q
) < 0 )
100 mpi_swap( &ctx
->P
, &ctx
->Q
);
102 if( mpi_cmp_mpi( &ctx
->P
, &ctx
->Q
) == 0 )
105 MPI_CHK( mpi_mul_mpi( &ctx
->N
, &ctx
->P
, &ctx
->Q
) );
106 if( mpi_msb( &ctx
->N
) != nbits
)
109 MPI_CHK( mpi_sub_int( &P1
, &ctx
->P
, 1 ) );
110 MPI_CHK( mpi_sub_int( &Q1
, &ctx
->Q
, 1 ) );
111 MPI_CHK( mpi_mul_mpi( &H
, &P1
, &Q1
) );
112 MPI_CHK( mpi_gcd( &G
, &ctx
->E
, &H
) );
114 while( mpi_cmp_int( &G
, 1 ) != 0 );
117 * D = E^-1 mod ((P-1)*(Q-1))
122 MPI_CHK( mpi_inv_mod( &ctx
->D
, &ctx
->E
, &H
) );
123 MPI_CHK( mpi_mod_mpi( &ctx
->DP
, &ctx
->D
, &P1
) );
124 MPI_CHK( mpi_mod_mpi( &ctx
->DQ
, &ctx
->D
, &Q1
) );
125 MPI_CHK( mpi_inv_mod( &ctx
->QP
, &ctx
->Q
, &ctx
->P
) );
127 ctx
->len
= ( mpi_msb( &ctx
->N
) + 7 ) >> 3;
131 mpi_free( &G
, &H
, &Q1
, &P1
, NULL
);
136 return( POLARSSL_ERR_RSA_KEY_GEN_FAILED
| ret
);
145 * Check a public RSA key
147 int rsa_check_pubkey( rsa_context
*ctx
)
149 if( ( ctx
->N
.p
[0] & 1 ) == 0 ||
150 ( ctx
->E
.p
[0] & 1 ) == 0 )
151 return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED
);
153 if( mpi_msb( &ctx
->N
) < 128 ||
154 mpi_msb( &ctx
->N
) > 4096 )
155 return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED
);
157 if( mpi_msb( &ctx
->E
) < 2 ||
158 mpi_msb( &ctx
->E
) > 64 )
159 return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED
);
165 * Check a private RSA key
167 int rsa_check_privkey( rsa_context
*ctx
)
170 mpi PQ
, DE
, P1
, Q1
, H
, I
, G
;
172 if( ( ret
= rsa_check_pubkey( ctx
) ) != 0 )
175 mpi_init( &PQ
, &DE
, &P1
, &Q1
, &H
, &I
, &G
, NULL
);
177 MPI_CHK( mpi_mul_mpi( &PQ
, &ctx
->P
, &ctx
->Q
) );
178 MPI_CHK( mpi_mul_mpi( &DE
, &ctx
->D
, &ctx
->E
) );
179 MPI_CHK( mpi_sub_int( &P1
, &ctx
->P
, 1 ) );
180 MPI_CHK( mpi_sub_int( &Q1
, &ctx
->Q
, 1 ) );
181 MPI_CHK( mpi_mul_mpi( &H
, &P1
, &Q1
) );
182 MPI_CHK( mpi_mod_mpi( &I
, &DE
, &H
) );
183 MPI_CHK( mpi_gcd( &G
, &ctx
->E
, &H
) );
185 if( mpi_cmp_mpi( &PQ
, &ctx
->N
) == 0 &&
186 mpi_cmp_int( &I
, 1 ) == 0 &&
187 mpi_cmp_int( &G
, 1 ) == 0 )
189 mpi_free( &G
, &I
, &H
, &Q1
, &P1
, &DE
, &PQ
, NULL
);
195 mpi_free( &G
, &I
, &H
, &Q1
, &P1
, &DE
, &PQ
, NULL
);
196 return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED
| ret
);
200 * Do an RSA public key operation
202 int rsa_public( rsa_context
*ctx
,
203 unsigned char *input
,
204 unsigned char *output
)
209 mpi_init( &T
, NULL
);
211 MPI_CHK( mpi_read_binary( &T
, input
, ctx
->len
) );
213 if( mpi_cmp_mpi( &T
, &ctx
->N
) >= 0 )
215 mpi_free( &T
, NULL
);
216 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA
);
220 MPI_CHK( mpi_exp_mod( &T
, &T
, &ctx
->E
, &ctx
->N
, &ctx
->RN
) );
221 MPI_CHK( mpi_write_binary( &T
, output
, olen
) );
225 mpi_free( &T
, NULL
);
228 return( POLARSSL_ERR_RSA_PUBLIC_FAILED
| ret
);
234 * Do an RSA private key operation
236 int rsa_private( rsa_context
*ctx
,
237 unsigned char *input
,
238 unsigned char *output
)
243 mpi_init( &T
, &T1
, &T2
, NULL
);
245 MPI_CHK( mpi_read_binary( &T
, input
, ctx
->len
) );
247 if( mpi_cmp_mpi( &T
, &ctx
->N
) >= 0 )
249 mpi_free( &T
, NULL
);
250 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA
);
254 MPI_CHK( mpi_exp_mod( &T
, &T
, &ctx
->D
, &ctx
->N
, &ctx
->RN
) );
257 * faster decryption using the CRT
259 * T1 = input ^ dP mod P
260 * T2 = input ^ dQ mod Q
262 MPI_CHK( mpi_exp_mod( &T1
, &T
, &ctx
->DP
, &ctx
->P
, &ctx
->RP
) );
263 MPI_CHK( mpi_exp_mod( &T2
, &T
, &ctx
->DQ
, &ctx
->Q
, &ctx
->RQ
) );
266 * T = (T1 - T2) * (Q^-1 mod P) mod P
268 MPI_CHK( mpi_sub_mpi( &T
, &T1
, &T2
) );
269 MPI_CHK( mpi_mul_mpi( &T1
, &T
, &ctx
->QP
) );
270 MPI_CHK( mpi_mod_mpi( &T
, &T1
, &ctx
->P
) );
273 * output = T2 + T * Q
275 MPI_CHK( mpi_mul_mpi( &T1
, &T
, &ctx
->Q
) );
276 MPI_CHK( mpi_add_mpi( &T
, &T2
, &T1
) );
280 MPI_CHK( mpi_write_binary( &T
, output
, olen
) );
284 mpi_free( &T
, &T1
, &T2
, NULL
);
287 return( POLARSSL_ERR_RSA_PRIVATE_FAILED
| ret
);
293 * Add the message padding, then do an RSA operation
295 int rsa_pkcs1_encrypt( rsa_context
*ctx
,
297 unsigned char *input
,
298 unsigned char *output
)
301 unsigned char *p
= output
;
305 switch( ctx
->padding
)
309 if( ilen
< 0 || olen
< ilen
+ 11 )
310 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA
);
312 nb_pad
= olen
- 3 - ilen
;
317 while( nb_pad
-- > 0 )
320 *p
= (unsigned char) rand();
325 memcpy( p
, input
, ilen
);
330 return( POLARSSL_ERR_RSA_INVALID_PADDING
);
333 return( ( mode
== RSA_PUBLIC
)
334 ? rsa_public( ctx
, output
, output
)
335 : rsa_private( ctx
, output
, output
) );
339 * Do an RSA operation, then remove the message padding
341 int rsa_pkcs1_decrypt( rsa_context
*ctx
,
343 unsigned char *input
,
344 unsigned char *output
,
349 unsigned char buf
[512];
353 if( ilen
< 16 || ilen
> (int) sizeof( buf
) )
354 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA
);
356 ret
= ( mode
== RSA_PUBLIC
)
357 ? rsa_public( ctx
, input
, buf
)
358 : rsa_private( ctx
, input
, buf
);
365 switch( ctx
->padding
)
369 if( *p
++ != 0 || *p
++ != RSA_CRYPT
)
370 return( POLARSSL_ERR_RSA_INVALID_PADDING
);
374 if( p
>= buf
+ ilen
- 1 )
375 return( POLARSSL_ERR_RSA_INVALID_PADDING
);
383 return( POLARSSL_ERR_RSA_INVALID_PADDING
);
386 if (ilen
- (int)(p
- buf
) > output_max_len
)
387 return( POLARSSL_ERR_RSA_OUTPUT_TO_LARGE
);
389 *olen
= ilen
- (int)(p
- buf
);
390 memcpy( output
, p
, *olen
);
396 * Do an RSA operation to sign the message digest
398 int rsa_pkcs1_sign( rsa_context
*ctx
,
406 unsigned char *p
= sig
;
410 switch( ctx
->padding
)
417 nb_pad
= olen
- 3 - hashlen
;
423 nb_pad
= olen
- 3 - 34;
427 nb_pad
= olen
- 3 - 35;
431 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA
);
435 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA
);
439 memset( p
, 0xFF, nb_pad
);
446 return( POLARSSL_ERR_RSA_INVALID_PADDING
);
452 memcpy( p
, hash
, hashlen
);
456 memcpy( p
, ASN1_HASH_MDX
, 18 );
457 memcpy( p
+ 18, hash
, 16 );
461 memcpy( p
, ASN1_HASH_MDX
, 18 );
462 memcpy( p
+ 18, hash
, 16 );
466 memcpy( p
, ASN1_HASH_MDX
, 18 );
467 memcpy( p
+ 18, hash
, 16 );
471 memcpy( p
, ASN1_HASH_SHA1
, 15 );
472 memcpy( p
+ 15, hash
, 20 );
476 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA
);
479 return( ( mode
== RSA_PUBLIC
)
480 ? rsa_public( ctx
, sig
, sig
)
481 : rsa_private( ctx
, sig
, sig
) );
485 * Do an RSA operation and check the message digest
487 int rsa_pkcs1_verify( rsa_context
*ctx
,
494 int ret
, len
, siglen
;
496 unsigned char buf
[512];
500 if( siglen
< 16 || siglen
> (int) sizeof( buf
) )
501 return( POLARSSL_ERR_RSA_BAD_INPUT_DATA
);
503 ret
= ( mode
== RSA_PUBLIC
)
504 ? rsa_public( ctx
, sig
, buf
)
505 : rsa_private( ctx
, sig
, buf
);
512 switch( ctx
->padding
)
516 if( *p
++ != 0 || *p
++ != RSA_SIGN
)
517 return( POLARSSL_ERR_RSA_INVALID_PADDING
);
521 if( p
>= buf
+ siglen
- 1 || *p
!= 0xFF )
522 return( POLARSSL_ERR_RSA_INVALID_PADDING
);
530 return( POLARSSL_ERR_RSA_INVALID_PADDING
);
533 len
= siglen
- (int)( p
- buf
);
540 if( memcmp( p
, ASN1_HASH_MDX
, 18 ) != 0 )
541 return( POLARSSL_ERR_RSA_VERIFY_FAILED
);
543 if( ( c
== 2 && hash_id
== RSA_MD2
) ||
544 ( c
== 4 && hash_id
== RSA_MD4
) ||
545 ( c
== 5 && hash_id
== RSA_MD5
) )
547 if( memcmp( p
+ 18, hash
, 16 ) == 0 )
550 return( POLARSSL_ERR_RSA_VERIFY_FAILED
);
554 if( len
== 35 && hash_id
== RSA_SHA1
)
556 if( memcmp( p
, ASN1_HASH_SHA1
, 15 ) == 0 &&
557 memcmp( p
+ 15, hash
, 20 ) == 0 )
560 return( POLARSSL_ERR_RSA_VERIFY_FAILED
);
563 if( len
== hashlen
&& hash_id
== RSA_RAW
)
565 if( memcmp( p
, hash
, hashlen
) == 0 )
568 return( POLARSSL_ERR_RSA_VERIFY_FAILED
);
571 return( POLARSSL_ERR_RSA_INVALID_PADDING
);
575 * Free the components of an RSA key
577 void rsa_free( rsa_context
*ctx
)
579 mpi_free( &ctx
->RQ
, &ctx
->RP
, &ctx
->RN
,
580 &ctx
->QP
, &ctx
->DQ
, &ctx
->DP
,
581 &ctx
->Q
, &ctx
->P
, &ctx
->D
,
582 &ctx
->E
, &ctx
->N
, NULL
);
585 #if defined(POLARSSL_SELF_TEST)
587 #include "polarssl/sha1.h"
590 * Example RSA-1024 keypair, for test purposes
594 #define RSA_N "9292758453063D803DD603D5E777D788" \
595 "8ED1D5BF35786190FA2F23EBC0848AEA" \
596 "DDA92CA6C3D80B32C4D109BE0F36D6AE" \
597 "7130B9CED7ACDF54CFC7555AC14EEBAB" \
598 "93A89813FBF3C4F8066D2D800F7C38A8" \
599 "1AE31942917403FF4946B0A83D3D3E05" \
600 "EE57C6F5F5606FB5D4BC6CD34EE0801A" \
601 "5E94BB77B07507233A0BC7BAC8F90F79"
603 #define RSA_E "10001"
605 #define RSA_D "24BF6185468786FDD303083D25E64EFC" \
606 "66CA472BC44D253102F8B4A9D3BFA750" \
607 "91386C0077937FE33FA3252D28855837" \
608 "AE1B484A8A9A45F7EE8C0C634F99E8CD" \
609 "DF79C5CE07EE72C7F123142198164234" \
610 "CABB724CF78B8173B9F880FC86322407" \
611 "AF1FEDFDDE2BEB674CA15F3E81A1521E" \
612 "071513A1E85B5DFA031F21ECAE91A34D"
614 #define RSA_P "C36D0EB7FCD285223CFB5AABA5BDA3D8" \
615 "2C01CAD19EA484A87EA4377637E75500" \
616 "FCB2005C5C7DD6EC4AC023CDA285D796" \
617 "C3D9E75E1EFC42488BB4F1D13AC30A57"
619 #define RSA_Q "C000DF51A7C77AE8D7C7370C1FF55B69" \
620 "E211C2B9E5DB1ED0BF61D0D9899620F4" \
621 "910E4168387E3C30AA1E00C339A79508" \
622 "8452DD96A9A5EA5D9DCA68DA636032AF"
624 #define RSA_DP "C1ACF567564274FB07A0BBAD5D26E298" \
625 "3C94D22288ACD763FD8E5600ED4A702D" \
626 "F84198A5F06C2E72236AE490C93F07F8" \
627 "3CC559CD27BC2D1CA488811730BB5725"
629 #define RSA_DQ "4959CBF6F8FEF750AEE6977C155579C7" \
630 "D8AAEA56749EA28623272E4F7D0592AF" \
631 "7C1F1313CAC9471B5C523BFE592F517B" \
632 "407A1BD76C164B93DA2D32A383E58357"
634 #define RSA_QP "9AE7FBC99546432DF71896FC239EADAE" \
635 "F38D18D2B2F0E2DD275AA977E2BF4411" \
636 "F5A3B2A5D33605AEBBCCBA7FEB9F2D2F" \
637 "A74206CEC169D74BF5A8C50D6F48EA08"
640 #define RSA_PT "\xAA\xBB\xCC\x03\x02\x01\x00\xFF\xFF\xFF\xFF\xFF" \
641 "\x11\x22\x33\x0A\x0B\x0C\xCC\xDD\xDD\xDD\xDD\xDD"
646 int rsa_self_test( int verbose
)
650 unsigned char sha1sum
[20];
651 unsigned char rsa_plaintext
[PT_LEN
];
652 unsigned char rsa_decrypted
[PT_LEN
];
653 unsigned char rsa_ciphertext
[KEY_LEN
];
655 memset( &rsa
, 0, sizeof( rsa_context
) );
658 mpi_read_string( &rsa
.N
, 16, RSA_N
);
659 mpi_read_string( &rsa
.E
, 16, RSA_E
);
660 mpi_read_string( &rsa
.D
, 16, RSA_D
);
661 mpi_read_string( &rsa
.P
, 16, RSA_P
);
662 mpi_read_string( &rsa
.Q
, 16, RSA_Q
);
663 mpi_read_string( &rsa
.DP
, 16, RSA_DP
);
664 mpi_read_string( &rsa
.DQ
, 16, RSA_DQ
);
665 mpi_read_string( &rsa
.QP
, 16, RSA_QP
);
668 printf( " RSA key validation: " );
670 if( rsa_check_pubkey( &rsa
) != 0 ||
671 rsa_check_privkey( &rsa
) != 0 )
674 printf( "failed\n" );
680 printf( "passed\n PKCS#1 encryption : " );
682 memcpy( rsa_plaintext
, RSA_PT
, PT_LEN
);
684 if( rsa_pkcs1_encrypt( &rsa
, RSA_PUBLIC
, PT_LEN
,
685 rsa_plaintext
, rsa_ciphertext
) != 0 )
688 printf( "failed\n" );
694 printf( "passed\n PKCS#1 decryption : " );
696 if( rsa_pkcs1_decrypt( &rsa
, RSA_PRIVATE
, &len
,
697 rsa_ciphertext
, rsa_decrypted
,
698 sizeof(rsa_decrypted
) ) != 0 )
701 printf( "failed\n" );
706 if( memcmp( rsa_decrypted
, rsa_plaintext
, len
) != 0 )
709 printf( "failed\n" );
715 printf( "passed\n PKCS#1 data sign : " );
717 sha1( rsa_plaintext
, PT_LEN
, sha1sum
);
719 if( rsa_pkcs1_sign( &rsa
, RSA_PRIVATE
, RSA_SHA1
, 20,
720 sha1sum
, rsa_ciphertext
) != 0 )
723 printf( "failed\n" );
729 printf( "passed\n PKCS#1 sig. verify: " );
731 if( rsa_pkcs1_verify( &rsa
, RSA_PUBLIC
, RSA_SHA1
, 20,
732 sha1sum
, rsa_ciphertext
) != 0 )
735 printf( "failed\n" );
741 printf( "passed\n\n" );