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 "tropicssl/config.h"
44 #if defined(TROPICSSL_RSA_C)
46 #include "tropicssl/rsa.h"
53 * Initialize an RSA context
55 void rsa_init(rsa_context
* ctx
,
56 int padding
, int hash_id
, int (*f_rng
) (void *), void *p_rng
)
58 memset(ctx
, 0, sizeof(rsa_context
));
60 ctx
->padding
= padding
;
61 ctx
->hash_id
= hash_id
;
67 #if defined(TROPICSSL_GENPRIME)
70 * Generate an RSA keypair
72 int rsa_gen_key(rsa_context
* ctx
, int nbits
, int exponent
)
77 if (ctx
->f_rng
== NULL
|| nbits
< 128 || exponent
< 3)
78 return (TROPICSSL_ERR_RSA_BAD_INPUT_DATA
);
80 mpi_init(&P1
, &Q1
, &H
, &G
, NULL
);
83 * find primes P and Q with Q < P so that:
84 * GCD( E, (P-1)*(Q-1) ) == 1
86 MPI_CHK(mpi_lset(&ctx
->E
, exponent
));
89 MPI_CHK(mpi_gen_prime(&ctx
->P
, (nbits
+ 1) >> 1, 0,
90 ctx
->f_rng
, ctx
->p_rng
));
92 MPI_CHK(mpi_gen_prime(&ctx
->Q
, (nbits
+ 1) >> 1, 0,
93 ctx
->f_rng
, ctx
->p_rng
));
95 if (mpi_cmp_mpi(&ctx
->P
, &ctx
->Q
) < 0)
96 mpi_swap(&ctx
->P
, &ctx
->Q
);
98 if (mpi_cmp_mpi(&ctx
->P
, &ctx
->Q
) == 0)
101 MPI_CHK(mpi_mul_mpi(&ctx
->N
, &ctx
->P
, &ctx
->Q
));
102 if (mpi_msb(&ctx
->N
) != nbits
)
105 MPI_CHK(mpi_sub_int(&P1
, &ctx
->P
, 1));
106 MPI_CHK(mpi_sub_int(&Q1
, &ctx
->Q
, 1));
107 MPI_CHK(mpi_mul_mpi(&H
, &P1
, &Q1
));
108 MPI_CHK(mpi_gcd(&G
, &ctx
->E
, &H
));
109 } while (mpi_cmp_int(&G
, 1) != 0);
112 * D = E^-1 mod ((P-1)*(Q-1))
117 MPI_CHK(mpi_inv_mod(&ctx
->D
, &ctx
->E
, &H
));
118 MPI_CHK(mpi_mod_mpi(&ctx
->DP
, &ctx
->D
, &P1
));
119 MPI_CHK(mpi_mod_mpi(&ctx
->DQ
, &ctx
->D
, &Q1
));
120 MPI_CHK(mpi_inv_mod(&ctx
->QP
, &ctx
->Q
, &ctx
->P
));
122 ctx
->len
= (mpi_msb(&ctx
->N
) + 7) >> 3;
126 mpi_free(&G
, &H
, &Q1
, &P1
, NULL
);
130 return (TROPICSSL_ERR_RSA_KEY_GEN_FAILED
| ret
);
139 * Check a public RSA key
141 int rsa_check_pubkey(const rsa_context
* ctx
)
143 if ((ctx
->N
.p
[0] & 1) == 0 || (ctx
->E
.p
[0] & 1) == 0)
144 return (TROPICSSL_ERR_RSA_KEY_CHECK_FAILED
);
146 if (mpi_msb(&ctx
->N
) < 128 || mpi_msb(&ctx
->N
) > 4096)
147 return (TROPICSSL_ERR_RSA_KEY_CHECK_FAILED
);
149 if (mpi_msb(&ctx
->E
) < 2 || mpi_msb(&ctx
->E
) > 64)
150 return (TROPICSSL_ERR_RSA_KEY_CHECK_FAILED
);
156 * Check a private RSA key
158 int rsa_check_privkey(const rsa_context
* ctx
)
161 mpi PQ
, DE
, P1
, Q1
, H
, I
, G
;
163 if ((ret
= rsa_check_pubkey(ctx
)) != 0)
166 mpi_init(&PQ
, &DE
, &P1
, &Q1
, &H
, &I
, &G
, NULL
);
168 MPI_CHK(mpi_mul_mpi(&PQ
, &ctx
->P
, &ctx
->Q
));
169 MPI_CHK(mpi_mul_mpi(&DE
, &ctx
->D
, &ctx
->E
));
170 MPI_CHK(mpi_sub_int(&P1
, &ctx
->P
, 1));
171 MPI_CHK(mpi_sub_int(&Q1
, &ctx
->Q
, 1));
172 MPI_CHK(mpi_mul_mpi(&H
, &P1
, &Q1
));
173 MPI_CHK(mpi_mod_mpi(&I
, &DE
, &H
));
174 MPI_CHK(mpi_gcd(&G
, &ctx
->E
, &H
));
176 if (mpi_cmp_mpi(&PQ
, &ctx
->N
) == 0 &&
177 mpi_cmp_int(&I
, 1) == 0 && mpi_cmp_int(&G
, 1) == 0) {
178 mpi_free(&G
, &I
, &H
, &Q1
, &P1
, &DE
, &PQ
, NULL
);
184 mpi_free(&G
, &I
, &H
, &Q1
, &P1
, &DE
, &PQ
, NULL
);
185 return (TROPICSSL_ERR_RSA_KEY_CHECK_FAILED
| ret
);
189 * Do an RSA public key operation
191 int rsa_public(rsa_context
* ctx
, const unsigned char *input
, unsigned char *output
)
198 MPI_CHK(mpi_read_binary(&T
, input
, ctx
->len
));
200 if (mpi_cmp_mpi(&T
, &ctx
->N
) >= 0) {
202 return (TROPICSSL_ERR_RSA_BAD_INPUT_DATA
);
206 MPI_CHK(mpi_exp_mod(&T
, &T
, &ctx
->E
, &ctx
->N
, &ctx
->RN
));
207 MPI_CHK(mpi_write_binary(&T
, output
, olen
));
214 return (TROPICSSL_ERR_RSA_PUBLIC_FAILED
| ret
);
220 * Do an RSA private key operation
222 int rsa_private(rsa_context
* ctx
, const unsigned char *input
, unsigned char *output
)
227 mpi_init(&T
, &T1
, &T2
, NULL
);
229 MPI_CHK(mpi_read_binary(&T
, input
, ctx
->len
));
231 if (mpi_cmp_mpi(&T
, &ctx
->N
) >= 0) {
233 return (TROPICSSL_ERR_RSA_BAD_INPUT_DATA
);
236 MPI_CHK(mpi_exp_mod(&T
, &T
, &ctx
->D
, &ctx
->N
, &ctx
->RN
));
239 * faster decryption using the CRT
241 * T1 = input ^ dP mod P
242 * T2 = input ^ dQ mod Q
244 MPI_CHK(mpi_exp_mod(&T1
, &T
, &ctx
->DP
, &ctx
->P
, &ctx
->RP
));
245 MPI_CHK(mpi_exp_mod(&T2
, &T
, &ctx
->DQ
, &ctx
->Q
, &ctx
->RQ
));
248 * T = (T1 - T2) * (Q^-1 mod P) mod P
250 MPI_CHK(mpi_sub_mpi(&T
, &T1
, &T2
));
251 MPI_CHK(mpi_mul_mpi(&T1
, &T
, &ctx
->QP
));
252 MPI_CHK(mpi_mod_mpi(&T
, &T1
, &ctx
->P
));
255 * output = T2 + T * Q
257 MPI_CHK(mpi_mul_mpi(&T1
, &T
, &ctx
->Q
));
258 MPI_CHK(mpi_add_mpi(&T
, &T2
, &T1
));
262 MPI_CHK(mpi_write_binary(&T
, output
, olen
));
266 mpi_free(&T
, &T1
, &T2
, NULL
);
269 return (TROPICSSL_ERR_RSA_PRIVATE_FAILED
| ret
);
275 * Add the message padding, then do an RSA operation
277 int rsa_pkcs1_encrypt(rsa_context
* ctx
,
279 const unsigned char *input
,
280 unsigned char *output
)
283 unsigned char *p
= output
;
287 switch (ctx
->padding
) {
290 if (ilen
< 0 || olen
< ilen
+ 11)
291 return (TROPICSSL_ERR_RSA_BAD_INPUT_DATA
);
293 nb_pad
= olen
- 3 - ilen
;
298 while (nb_pad
-- > 0) {
300 *p
= (unsigned char)rand();
305 memcpy(p
, input
, ilen
);
310 return (TROPICSSL_ERR_RSA_INVALID_PADDING
);
313 return ((mode
== RSA_PUBLIC
)
314 ? rsa_public(ctx
, output
, output
)
315 : rsa_private(ctx
, output
, output
));
319 * Do an RSA operation, then remove the message padding
321 int rsa_pkcs1_decrypt(rsa_context
* ctx
,
323 const unsigned char *input
,
324 unsigned char *output
,
329 unsigned char buf
[512];
333 if (ilen
< 16 || ilen
> (int)sizeof(buf
))
334 return (TROPICSSL_ERR_RSA_BAD_INPUT_DATA
);
336 ret
= (mode
== RSA_PUBLIC
)
337 ? rsa_public(ctx
, input
, buf
)
338 : rsa_private(ctx
, input
, buf
);
345 switch (ctx
->padding
) {
348 if (*p
++ != 0 || *p
++ != RSA_CRYPT
)
349 return (TROPICSSL_ERR_RSA_INVALID_PADDING
);
352 if (p
>= buf
+ ilen
- 1)
353 return (TROPICSSL_ERR_RSA_INVALID_PADDING
);
361 return (TROPICSSL_ERR_RSA_INVALID_PADDING
);
364 if (ilen
- (int)(p
- buf
) > output_max_len
)
365 return (TROPICSSL_ERR_RSA_OUTPUT_TO_LARGE
);
367 *olen
= ilen
- (int)(p
- buf
);
368 memcpy(output
, p
, *olen
);
374 * Do an RSA operation to sign the message digest
376 int rsa_pkcs1_sign(rsa_context
* ctx
,
380 const unsigned char *hash
,
384 unsigned char *p
= sig
;
388 switch (ctx
->padding
) {
393 nb_pad
= olen
- 3 - hashlen
;
399 nb_pad
= olen
- 3 - 34;
403 nb_pad
= olen
- 3 - 35;
407 return (TROPICSSL_ERR_RSA_BAD_INPUT_DATA
);
411 return (TROPICSSL_ERR_RSA_BAD_INPUT_DATA
);
415 memset(p
, 0xFF, nb_pad
);
422 return (TROPICSSL_ERR_RSA_INVALID_PADDING
);
427 memcpy(p
, hash
, hashlen
);
431 memcpy(p
, ASN1_HASH_MDX
, 18);
432 memcpy(p
+ 18, hash
, 16);
437 memcpy(p
, ASN1_HASH_MDX
, 18);
438 memcpy(p
+ 18, hash
, 16);
443 memcpy(p
, ASN1_HASH_MDX
, 18);
444 memcpy(p
+ 18, hash
, 16);
449 memcpy(p
, ASN1_HASH_SHA1
, 15);
450 memcpy(p
+ 15, hash
, 20);
454 return (TROPICSSL_ERR_RSA_BAD_INPUT_DATA
);
457 return ((mode
== RSA_PUBLIC
)
458 ? rsa_public(ctx
, sig
, sig
)
459 : rsa_private(ctx
, sig
, sig
));
463 * Do an RSA operation and check the message digest
465 int rsa_pkcs1_verify(rsa_context
* ctx
,
469 const unsigned char *hash
,
470 const unsigned char *sig
)
472 int ret
, len
, siglen
;
474 unsigned char buf
[512];
478 if (siglen
< 16 || siglen
> (int)sizeof(buf
))
479 return (TROPICSSL_ERR_RSA_BAD_INPUT_DATA
);
481 ret
= (mode
== RSA_PUBLIC
)
482 ? rsa_public(ctx
, sig
, buf
)
483 : rsa_private(ctx
, sig
, buf
);
490 switch (ctx
->padding
) {
493 if (*p
++ != 0 || *p
++ != RSA_SIGN
)
494 return (TROPICSSL_ERR_RSA_INVALID_PADDING
);
497 if (p
>= buf
+ siglen
- 1 || *p
!= 0xFF)
498 return (TROPICSSL_ERR_RSA_INVALID_PADDING
);
506 return (TROPICSSL_ERR_RSA_INVALID_PADDING
);
509 len
= siglen
- (int)(p
- buf
);
515 if (memcmp(p
, ASN1_HASH_MDX
, 18) != 0)
516 return (TROPICSSL_ERR_RSA_VERIFY_FAILED
);
518 if ((c
== 2 && hash_id
== RSA_MD2
) ||
519 (c
== 4 && hash_id
== RSA_MD4
) ||
520 (c
== 5 && hash_id
== RSA_MD5
)) {
521 if (memcmp(p
+ 18, hash
, 16) == 0)
524 return (TROPICSSL_ERR_RSA_VERIFY_FAILED
);
528 if (len
== 35 && hash_id
== RSA_SHA1
) {
529 if (memcmp(p
, ASN1_HASH_SHA1
, 15) == 0 &&
530 memcmp(p
+ 15, hash
, 20) == 0)
533 return (TROPICSSL_ERR_RSA_VERIFY_FAILED
);
536 if (len
== hashlen
&& hash_id
== RSA_RAW
) {
537 if (memcmp(p
, hash
, hashlen
) == 0)
540 return (TROPICSSL_ERR_RSA_VERIFY_FAILED
);
543 return (TROPICSSL_ERR_RSA_INVALID_PADDING
);
547 * Free the components of an RSA key
549 void rsa_free(rsa_context
* ctx
)
551 mpi_free(&ctx
->RQ
, &ctx
->RP
, &ctx
->RN
,
552 &ctx
->QP
, &ctx
->DQ
, &ctx
->DP
,
553 &ctx
->Q
, &ctx
->P
, &ctx
->D
, &ctx
->E
, &ctx
->N
, NULL
);
556 #if defined(TROPICSSL_SELF_TEST)
558 #include "tropicssl/sha1.h"
561 * Example RSA-1024 keypair, for test purposes
565 #define RSA_N "9292758453063D803DD603D5E777D788" \
566 "8ED1D5BF35786190FA2F23EBC0848AEA" \
567 "DDA92CA6C3D80B32C4D109BE0F36D6AE" \
568 "7130B9CED7ACDF54CFC7555AC14EEBAB" \
569 "93A89813FBF3C4F8066D2D800F7C38A8" \
570 "1AE31942917403FF4946B0A83D3D3E05" \
571 "EE57C6F5F5606FB5D4BC6CD34EE0801A" \
572 "5E94BB77B07507233A0BC7BAC8F90F79"
574 #define RSA_E "10001"
576 #define RSA_D "24BF6185468786FDD303083D25E64EFC" \
577 "66CA472BC44D253102F8B4A9D3BFA750" \
578 "91386C0077937FE33FA3252D28855837" \
579 "AE1B484A8A9A45F7EE8C0C634F99E8CD" \
580 "DF79C5CE07EE72C7F123142198164234" \
581 "CABB724CF78B8173B9F880FC86322407" \
582 "AF1FEDFDDE2BEB674CA15F3E81A1521E" \
583 "071513A1E85B5DFA031F21ECAE91A34D"
585 #define RSA_P "C36D0EB7FCD285223CFB5AABA5BDA3D8" \
586 "2C01CAD19EA484A87EA4377637E75500" \
587 "FCB2005C5C7DD6EC4AC023CDA285D796" \
588 "C3D9E75E1EFC42488BB4F1D13AC30A57"
590 #define RSA_Q "C000DF51A7C77AE8D7C7370C1FF55B69" \
591 "E211C2B9E5DB1ED0BF61D0D9899620F4" \
592 "910E4168387E3C30AA1E00C339A79508" \
593 "8452DD96A9A5EA5D9DCA68DA636032AF"
595 #define RSA_DP "C1ACF567564274FB07A0BBAD5D26E298" \
596 "3C94D22288ACD763FD8E5600ED4A702D" \
597 "F84198A5F06C2E72236AE490C93F07F8" \
598 "3CC559CD27BC2D1CA488811730BB5725"
600 #define RSA_DQ "4959CBF6F8FEF750AEE6977C155579C7" \
601 "D8AAEA56749EA28623272E4F7D0592AF" \
602 "7C1F1313CAC9471B5C523BFE592F517B" \
603 "407A1BD76C164B93DA2D32A383E58357"
605 #define RSA_QP "9AE7FBC99546432DF71896FC239EADAE" \
606 "F38D18D2B2F0E2DD275AA977E2BF4411" \
607 "F5A3B2A5D33605AEBBCCBA7FEB9F2D2F" \
608 "A74206CEC169D74BF5A8C50D6F48EA08"
611 #define RSA_PT "\xAA\xBB\xCC\x03\x02\x01\x00\xFF\xFF\xFF\xFF\xFF" \
612 "\x11\x22\x33\x0A\x0B\x0C\xCC\xDD\xDD\xDD\xDD\xDD"
617 int rsa_self_test(int verbose
)
621 unsigned char sha1sum
[20];
622 unsigned char rsa_plaintext
[PT_LEN
];
623 unsigned char rsa_decrypted
[PT_LEN
];
624 unsigned char rsa_ciphertext
[KEY_LEN
];
626 memset(&rsa
, 0, sizeof(rsa_context
));
629 mpi_read_string(&rsa
.N
, 16, RSA_N
);
630 mpi_read_string(&rsa
.E
, 16, RSA_E
);
631 mpi_read_string(&rsa
.D
, 16, RSA_D
);
632 mpi_read_string(&rsa
.P
, 16, RSA_P
);
633 mpi_read_string(&rsa
.Q
, 16, RSA_Q
);
634 mpi_read_string(&rsa
.DP
, 16, RSA_DP
);
635 mpi_read_string(&rsa
.DQ
, 16, RSA_DQ
);
636 mpi_read_string(&rsa
.QP
, 16, RSA_QP
);
639 printf(" RSA key validation: ");
641 if (rsa_check_pubkey(&rsa
) != 0 || rsa_check_privkey(&rsa
) != 0) {
649 printf("passed\n PKCS#1 encryption : ");
651 memcpy(rsa_plaintext
, RSA_PT
, PT_LEN
);
653 if (rsa_pkcs1_encrypt(&rsa
, RSA_PUBLIC
, PT_LEN
,
654 rsa_plaintext
, rsa_ciphertext
) != 0) {
662 printf("passed\n PKCS#1 decryption : ");
664 if (rsa_pkcs1_decrypt(&rsa
, RSA_PRIVATE
, &len
,
665 rsa_ciphertext
, rsa_decrypted
,
666 sizeof(rsa_decrypted
)) != 0) {
673 if (memcmp(rsa_decrypted
, rsa_plaintext
, len
) != 0) {
681 printf("passed\n PKCS#1 data sign : ");
683 sha1(rsa_plaintext
, PT_LEN
, sha1sum
);
685 if (rsa_pkcs1_sign(&rsa
, RSA_PRIVATE
, RSA_SHA1
, 20,
686 sha1sum
, rsa_ciphertext
) != 0) {
694 printf("passed\n PKCS#1 sig. verify: ");
696 if (rsa_pkcs1_verify(&rsa
, RSA_PUBLIC
, RSA_SHA1
, 20,
697 sha1sum
, rsa_ciphertext
) != 0) {
705 printf("passed\n\n");