1 /* crypto/rsa/rsa_eay.c */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3  * All rights reserved.
4  *
5  * This package is an SSL implementation written
6  * by Eric Young (eay@cryptsoft.com).
7  * The implementation was written so as to conform with Netscapes SSL.
8  *
9  * This library is free for commercial and non-commercial use as long as
10  * the following conditions are aheared to.  The following conditions
11  * apply to all code found in this distribution, be it the RC4, RSA,
12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13  * included with this distribution is covered by the same copyright terms
14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15  *
16  * Copyright remains Eric Young's, and as such any Copyright notices in
17  * the code are not to be removed.
18  * If this package is used in a product, Eric Young should be given attribution
19  * as the author of the parts of the library used.
20  * This can be in the form of a textual message at program startup or
21  * in documentation (online or textual) provided with the package.
22  *
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  * 1. Redistributions of source code must retain the copyright
27  *    notice, this list of conditions and the following disclaimer.
28  * 2. Redistributions in binary form must reproduce the above copyright
29  *    notice, this list of conditions and the following disclaimer in the
30  *    documentation and/or other materials provided with the distribution.
31  * 3. All advertising materials mentioning features or use of this software
32  *    must display the following acknowledgement:
33  *    "This product includes cryptographic software written by
34  *     Eric Young (eay@cryptsoft.com)"
35  *    The word 'cryptographic' can be left out if the rouines from the library
36  *    being used are not cryptographic related :-).
37  * 4. If you include any Windows specific code (or a derivative thereof) from
38  *    the apps directory (application code) you must include an acknowledgement:
39  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40  *
41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  *
53  * The licence and distribution terms for any publically available version or
54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
55  * copied and put under another distribution licence
56  * [including the GNU Public Licence.]
57  */
58 /* ====================================================================
59  * Copyright (c) 1998-2006 The OpenSSL Project.  All rights reserved.
60  *
61  * Redistribution and use in source and binary forms, with or without
62  * modification, are permitted provided that the following conditions
63  * are met:
64  *
65  * 1. Redistributions of source code must retain the above copyright
66  *    notice, this list of conditions and the following disclaimer.
67  *
68  * 2. Redistributions in binary form must reproduce the above copyright
69  *    notice, this list of conditions and the following disclaimer in
70  *    the documentation and/or other materials provided with the
71  *    distribution.
72  *
73  * 3. All advertising materials mentioning features or use of this
74  *    software must display the following acknowledgment:
75  *    "This product includes software developed by the OpenSSL Project
76  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77  *
78  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79  *    endorse or promote products derived from this software without
80  *    prior written permission. For written permission, please contact
81  *    openssl-core@openssl.org.
82  *
83  * 5. Products derived from this software may not be called "OpenSSL"
84  *    nor may "OpenSSL" appear in their names without prior written
85  *    permission of the OpenSSL Project.
86  *
87  * 6. Redistributions of any form whatsoever must retain the following
88  *    acknowledgment:
89  *    "This product includes software developed by the OpenSSL Project
90  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91  *
92  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
96  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103  * OF THE POSSIBILITY OF SUCH DAMAGE.
104  * ====================================================================
105  *
106  * This product includes cryptographic software written by Eric Young
107  * (eay@cryptsoft.com).  This product includes software written by Tim
108  * Hudson (tjh@cryptsoft.com).
109  *
110  */
111 
112 #include <stdio.h>
113 #include "cryptlib.h"
114 #include <openssl/bn.h>
115 #include <openssl/rsa.h>
116 #include <openssl/rand.h>
117 
118 #ifndef RSA_NULL
119 
120 static int RSA_eay_public_encrypt(int flen, const unsigned char *from,
121                                   unsigned char *to, RSA *rsa, int padding);
122 static int RSA_eay_private_encrypt(int flen, const unsigned char *from,
123                                    unsigned char *to, RSA *rsa, int padding);
124 static int RSA_eay_public_decrypt(int flen, const unsigned char *from,
125                                   unsigned char *to, RSA *rsa, int padding);
126 static int RSA_eay_private_decrypt(int flen, const unsigned char *from,
127                                    unsigned char *to, RSA *rsa, int padding);
128 static int RSA_eay_mod_exp(BIGNUM *r0, const BIGNUM *i, RSA *rsa,
129                            BN_CTX *ctx);
130 static int RSA_eay_init(RSA *rsa);
131 static int RSA_eay_finish(RSA *rsa);
132 static RSA_METHOD rsa_pkcs1_eay_meth = {
133     "Eric Young's PKCS#1 RSA",
134     RSA_eay_public_encrypt,
135     RSA_eay_public_decrypt,     /* signature verification */
136     RSA_eay_private_encrypt,    /* signing */
137     RSA_eay_private_decrypt,
138     RSA_eay_mod_exp,
139     BN_mod_exp_mont,            /* XXX probably we should not use Montgomery
140                                  * if e == 3 */
141     RSA_eay_init,
142     RSA_eay_finish,
143     0,                          /* flags */
144     NULL,
145     0,                          /* rsa_sign */
146     0,                          /* rsa_verify */
147     NULL                        /* rsa_keygen */
148 };
149 
RSA_PKCS1_SSLeay(void)150 const RSA_METHOD *RSA_PKCS1_SSLeay(void)
151 {
152     return (&rsa_pkcs1_eay_meth);
153 }
154 
RSA_eay_public_encrypt(int flen,const unsigned char * from,unsigned char * to,RSA * rsa,int padding)155 static int RSA_eay_public_encrypt(int flen, const unsigned char *from,
156                                   unsigned char *to, RSA *rsa, int padding)
157 {
158     BIGNUM *f, *ret;
159     int i, j, k, num = 0, r = -1;
160     unsigned char *buf = NULL;
161     BN_CTX *ctx = NULL;
162 
163     if (BN_num_bits(rsa->n) > OPENSSL_RSA_MAX_MODULUS_BITS) {
164         RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_MODULUS_TOO_LARGE);
165         return -1;
166     }
167 
168     if (BN_ucmp(rsa->n, rsa->e) <= 0) {
169         RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_BAD_E_VALUE);
170         return -1;
171     }
172 
173     /* for large moduli, enforce exponent limit */
174     if (BN_num_bits(rsa->n) > OPENSSL_RSA_SMALL_MODULUS_BITS) {
175         if (BN_num_bits(rsa->e) > OPENSSL_RSA_MAX_PUBEXP_BITS) {
176             RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_BAD_E_VALUE);
177             return -1;
178         }
179     }
180 
181     if ((ctx = BN_CTX_new()) == NULL)
182         goto err;
183     BN_CTX_start(ctx);
184     f = BN_CTX_get(ctx);
185     ret = BN_CTX_get(ctx);
186     num = BN_num_bytes(rsa->n);
187     buf = OPENSSL_malloc(num);
188     if (!f || !ret || !buf) {
189         RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, ERR_R_MALLOC_FAILURE);
190         goto err;
191     }
192 
193     switch (padding) {
194     case RSA_PKCS1_PADDING:
195         i = RSA_padding_add_PKCS1_type_2(buf, num, from, flen);
196         break;
197 # ifndef OPENSSL_NO_SHA
198     case RSA_PKCS1_OAEP_PADDING:
199         i = RSA_padding_add_PKCS1_OAEP(buf, num, from, flen, NULL, 0);
200         break;
201 # endif
202     case RSA_SSLV23_PADDING:
203         i = RSA_padding_add_SSLv23(buf, num, from, flen);
204         break;
205     case RSA_NO_PADDING:
206         i = RSA_padding_add_none(buf, num, from, flen);
207         break;
208     default:
209         RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_UNKNOWN_PADDING_TYPE);
210         goto err;
211     }
212     if (i <= 0)
213         goto err;
214 
215     if (BN_bin2bn(buf, num, f) == NULL)
216         goto err;
217 
218     if (BN_ucmp(f, rsa->n) >= 0) {
219         /* usually the padding functions would catch this */
220         RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT,
221                RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
222         goto err;
223     }
224 
225     if (rsa->flags & RSA_FLAG_CACHE_PUBLIC)
226         if (!BN_MONT_CTX_set_locked
227             (&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx))
228             goto err;
229 
230     if (!rsa->meth->bn_mod_exp(ret, f, rsa->e, rsa->n, ctx,
231                                rsa->_method_mod_n))
232         goto err;
233 
234     /*
235      * put in leading 0 bytes if the number is less than the length of the
236      * modulus
237      */
238     j = BN_num_bytes(ret);
239     i = BN_bn2bin(ret, &(to[num - j]));
240     for (k = 0; k < (num - i); k++)
241         to[k] = 0;
242 
243     r = num;
244  err:
245     if (ctx != NULL) {
246         BN_CTX_end(ctx);
247         BN_CTX_free(ctx);
248     }
249     if (buf != NULL) {
250         OPENSSL_cleanse(buf, num);
251         OPENSSL_free(buf);
252     }
253     return (r);
254 }
255 
rsa_get_blinding(RSA * rsa,int * local,BN_CTX * ctx)256 static BN_BLINDING *rsa_get_blinding(RSA *rsa, int *local, BN_CTX *ctx)
257 {
258     BN_BLINDING *ret;
259     int got_write_lock = 0;
260     CRYPTO_THREADID cur;
261 
262     CRYPTO_r_lock(CRYPTO_LOCK_RSA);
263 
264     if (rsa->blinding == NULL) {
265         CRYPTO_r_unlock(CRYPTO_LOCK_RSA);
266         CRYPTO_w_lock(CRYPTO_LOCK_RSA);
267         got_write_lock = 1;
268 
269         if (rsa->blinding == NULL)
270             rsa->blinding = RSA_setup_blinding(rsa, ctx);
271     }
272 
273     ret = rsa->blinding;
274     if (ret == NULL)
275         goto err;
276 
277     CRYPTO_THREADID_current(&cur);
278     if (!CRYPTO_THREADID_cmp(&cur, BN_BLINDING_thread_id(ret))) {
279         /* rsa->blinding is ours! */
280 
281         *local = 1;
282     } else {
283         /* resort to rsa->mt_blinding instead */
284 
285         /*
286          * instructs rsa_blinding_convert(), rsa_blinding_invert() that the
287          * BN_BLINDING is shared, meaning that accesses require locks, and
288          * that the blinding factor must be stored outside the BN_BLINDING
289          */
290         *local = 0;
291 
292         if (rsa->mt_blinding == NULL) {
293             if (!got_write_lock) {
294                 CRYPTO_r_unlock(CRYPTO_LOCK_RSA);
295                 CRYPTO_w_lock(CRYPTO_LOCK_RSA);
296                 got_write_lock = 1;
297             }
298 
299             if (rsa->mt_blinding == NULL)
300                 rsa->mt_blinding = RSA_setup_blinding(rsa, ctx);
301         }
302         ret = rsa->mt_blinding;
303     }
304 
305  err:
306     if (got_write_lock)
307         CRYPTO_w_unlock(CRYPTO_LOCK_RSA);
308     else
309         CRYPTO_r_unlock(CRYPTO_LOCK_RSA);
310     return ret;
311 }
312 
rsa_blinding_convert(BN_BLINDING * b,BIGNUM * f,BIGNUM * unblind,BN_CTX * ctx)313 static int rsa_blinding_convert(BN_BLINDING *b, BIGNUM *f, BIGNUM *unblind,
314                                 BN_CTX *ctx)
315 {
316     if (unblind == NULL)
317         /*
318          * Local blinding: store the unblinding factor in BN_BLINDING.
319          */
320         return BN_BLINDING_convert_ex(f, NULL, b, ctx);
321     else {
322         /*
323          * Shared blinding: store the unblinding factor outside BN_BLINDING.
324          */
325         int ret;
326         CRYPTO_w_lock(CRYPTO_LOCK_RSA_BLINDING);
327         ret = BN_BLINDING_convert_ex(f, unblind, b, ctx);
328         CRYPTO_w_unlock(CRYPTO_LOCK_RSA_BLINDING);
329         return ret;
330     }
331 }
332 
rsa_blinding_invert(BN_BLINDING * b,BIGNUM * f,BIGNUM * unblind,BN_CTX * ctx)333 static int rsa_blinding_invert(BN_BLINDING *b, BIGNUM *f, BIGNUM *unblind,
334                                BN_CTX *ctx)
335 {
336     /*
337      * For local blinding, unblind is set to NULL, and BN_BLINDING_invert_ex
338      * will use the unblinding factor stored in BN_BLINDING. If BN_BLINDING
339      * is shared between threads, unblind must be non-null:
340      * BN_BLINDING_invert_ex will then use the local unblinding factor, and
341      * will only read the modulus from BN_BLINDING. In both cases it's safe
342      * to access the blinding without a lock.
343      */
344     return BN_BLINDING_invert_ex(f, unblind, b, ctx);
345 }
346 
347 /* signing */
RSA_eay_private_encrypt(int flen,const unsigned char * from,unsigned char * to,RSA * rsa,int padding)348 static int RSA_eay_private_encrypt(int flen, const unsigned char *from,
349                                    unsigned char *to, RSA *rsa, int padding)
350 {
351     BIGNUM *f, *ret, *res;
352     int i, j, k, num = 0, r = -1;
353     unsigned char *buf = NULL;
354     BN_CTX *ctx = NULL;
355     int local_blinding = 0;
356     /*
357      * Used only if the blinding structure is shared. A non-NULL unblind
358      * instructs rsa_blinding_convert() and rsa_blinding_invert() to store
359      * the unblinding factor outside the blinding structure.
360      */
361     BIGNUM *unblind = NULL;
362     BN_BLINDING *blinding = NULL;
363 
364     if ((ctx = BN_CTX_new()) == NULL)
365         goto err;
366     BN_CTX_start(ctx);
367     f = BN_CTX_get(ctx);
368     ret = BN_CTX_get(ctx);
369     num = BN_num_bytes(rsa->n);
370     buf = OPENSSL_malloc(num);
371     if (!f || !ret || !buf) {
372         RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT, ERR_R_MALLOC_FAILURE);
373         goto err;
374     }
375 
376     switch (padding) {
377     case RSA_PKCS1_PADDING:
378         i = RSA_padding_add_PKCS1_type_1(buf, num, from, flen);
379         break;
380     case RSA_X931_PADDING:
381         i = RSA_padding_add_X931(buf, num, from, flen);
382         break;
383     case RSA_NO_PADDING:
384         i = RSA_padding_add_none(buf, num, from, flen);
385         break;
386     case RSA_SSLV23_PADDING:
387     default:
388         RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT, RSA_R_UNKNOWN_PADDING_TYPE);
389         goto err;
390     }
391     if (i <= 0)
392         goto err;
393 
394     if (BN_bin2bn(buf, num, f) == NULL)
395         goto err;
396 
397     if (BN_ucmp(f, rsa->n) >= 0) {
398         /* usually the padding functions would catch this */
399         RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,
400                RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
401         goto err;
402     }
403 
404     if (!(rsa->flags & RSA_FLAG_NO_BLINDING)) {
405         blinding = rsa_get_blinding(rsa, &local_blinding, ctx);
406         if (blinding == NULL) {
407             RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT, ERR_R_INTERNAL_ERROR);
408             goto err;
409         }
410     }
411 
412     if (blinding != NULL) {
413         if (!local_blinding && ((unblind = BN_CTX_get(ctx)) == NULL)) {
414             RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT, ERR_R_MALLOC_FAILURE);
415             goto err;
416         }
417         if (!rsa_blinding_convert(blinding, f, unblind, ctx))
418             goto err;
419     }
420 
421     if ((rsa->flags & RSA_FLAG_EXT_PKEY) ||
422         ((rsa->p != NULL) &&
423          (rsa->q != NULL) &&
424          (rsa->dmp1 != NULL) && (rsa->dmq1 != NULL) && (rsa->iqmp != NULL))) {
425         if (!rsa->meth->rsa_mod_exp(ret, f, rsa, ctx))
426             goto err;
427     } else {
428         BIGNUM local_d;
429         BIGNUM *d = NULL;
430 
431         if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
432             BN_init(&local_d);
433             d = &local_d;
434             BN_with_flags(d, rsa->d, BN_FLG_CONSTTIME);
435         } else
436             d = rsa->d;
437 
438         if (rsa->flags & RSA_FLAG_CACHE_PUBLIC)
439             if (!BN_MONT_CTX_set_locked
440                 (&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx))
441                 goto err;
442 
443         if (!rsa->meth->bn_mod_exp(ret, f, d, rsa->n, ctx,
444                                    rsa->_method_mod_n))
445             goto err;
446     }
447 
448     if (blinding)
449         if (!rsa_blinding_invert(blinding, ret, unblind, ctx))
450             goto err;
451 
452     if (padding == RSA_X931_PADDING) {
453         BN_sub(f, rsa->n, ret);
454         if (BN_cmp(ret, f) > 0)
455             res = f;
456         else
457             res = ret;
458     } else
459         res = ret;
460 
461     /*
462      * put in leading 0 bytes if the number is less than the length of the
463      * modulus
464      */
465     j = BN_num_bytes(res);
466     i = BN_bn2bin(res, &(to[num - j]));
467     for (k = 0; k < (num - i); k++)
468         to[k] = 0;
469 
470     r = num;
471  err:
472     if (ctx != NULL) {
473         BN_CTX_end(ctx);
474         BN_CTX_free(ctx);
475     }
476     if (buf != NULL) {
477         OPENSSL_cleanse(buf, num);
478         OPENSSL_free(buf);
479     }
480     return (r);
481 }
482 
RSA_eay_private_decrypt(int flen,const unsigned char * from,unsigned char * to,RSA * rsa,int padding)483 static int RSA_eay_private_decrypt(int flen, const unsigned char *from,
484                                    unsigned char *to, RSA *rsa, int padding)
485 {
486     BIGNUM *f, *ret;
487     int j, num = 0, r = -1;
488     unsigned char *p;
489     unsigned char *buf = NULL;
490     BN_CTX *ctx = NULL;
491     int local_blinding = 0;
492     /*
493      * Used only if the blinding structure is shared. A non-NULL unblind
494      * instructs rsa_blinding_convert() and rsa_blinding_invert() to store
495      * the unblinding factor outside the blinding structure.
496      */
497     BIGNUM *unblind = NULL;
498     BN_BLINDING *blinding = NULL;
499 
500     if (BN_num_bits(rsa->n) > OPENSSL_RSA_MAX_MODULUS_BITS) {
501 	RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_MODULUS_TOO_LARGE);
502 	return -1;
503     }
504 
505     if (BN_ucmp(rsa->n, rsa->e) <= 0) {
506 	RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_BAD_E_VALUE);
507 	return -1;
508     }
509 
510     /* for large moduli, enforce exponent limit */
511     if (BN_num_bits(rsa->n) > OPENSSL_RSA_SMALL_MODULUS_BITS) {
512 	if (BN_num_bits(rsa->e) > OPENSSL_RSA_MAX_PUBEXP_BITS) {
513 		RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_BAD_E_VALUE);
514 		return -1;
515 	}
516     }
517 
518     if ((ctx = BN_CTX_new()) == NULL)
519         goto err;
520     BN_CTX_start(ctx);
521     f = BN_CTX_get(ctx);
522     ret = BN_CTX_get(ctx);
523     num = BN_num_bytes(rsa->n);
524     buf = OPENSSL_malloc(num);
525     if (!f || !ret || !buf) {
526         RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT, ERR_R_MALLOC_FAILURE);
527         goto err;
528     }
529 
530     /*
531      * This check was for equality but PGP does evil things and chops off the
532      * top '0' bytes
533      */
534     if (flen > num) {
535         RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,
536                RSA_R_DATA_GREATER_THAN_MOD_LEN);
537         goto err;
538     }
539 
540     /* make data into a big number */
541     if (BN_bin2bn(from, (int)flen, f) == NULL)
542         goto err;
543 
544     if (BN_ucmp(f, rsa->n) >= 0) {
545         RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,
546                RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
547         goto err;
548     }
549 
550     if (!(rsa->flags & RSA_FLAG_NO_BLINDING)) {
551         blinding = rsa_get_blinding(rsa, &local_blinding, ctx);
552         if (blinding == NULL) {
553             RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT, ERR_R_INTERNAL_ERROR);
554             goto err;
555         }
556     }
557 
558     if (blinding != NULL) {
559         if (!local_blinding && ((unblind = BN_CTX_get(ctx)) == NULL)) {
560             RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT, ERR_R_MALLOC_FAILURE);
561             goto err;
562         }
563         if (!rsa_blinding_convert(blinding, f, unblind, ctx))
564             goto err;
565     }
566 
567     /* do the decrypt */
568     if ((rsa->flags & RSA_FLAG_EXT_PKEY) ||
569         ((rsa->p != NULL) &&
570          (rsa->q != NULL) &&
571          (rsa->dmp1 != NULL) && (rsa->dmq1 != NULL) && (rsa->iqmp != NULL))) {
572         if (!rsa->meth->rsa_mod_exp(ret, f, rsa, ctx))
573             goto err;
574     } else {
575         BIGNUM local_d;
576         BIGNUM *d = NULL;
577 
578         if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
579             d = &local_d;
580             BN_with_flags(d, rsa->d, BN_FLG_CONSTTIME);
581         } else
582             d = rsa->d;
583 
584         if (rsa->flags & RSA_FLAG_CACHE_PUBLIC)
585             if (!BN_MONT_CTX_set_locked
586                 (&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx))
587                 goto err;
588         if (!rsa->meth->bn_mod_exp(ret, f, d, rsa->n, ctx,
589                                    rsa->_method_mod_n))
590             goto err;
591     }
592 
593     if (blinding)
594         if (!rsa_blinding_invert(blinding, ret, unblind, ctx))
595             goto err;
596 
597     p = buf;
598     j = BN_bn2bin(ret, p);      /* j is only used with no-padding mode */
599 
600     switch (padding) {
601     case RSA_PKCS1_PADDING:
602         r = RSA_padding_check_PKCS1_type_2(to, num, buf, j, num);
603         break;
604 # ifndef OPENSSL_NO_SHA
605     case RSA_PKCS1_OAEP_PADDING:
606         r = RSA_padding_check_PKCS1_OAEP(to, num, buf, j, num, NULL, 0);
607         break;
608 # endif
609     case RSA_SSLV23_PADDING:
610         r = RSA_padding_check_SSLv23(to, num, buf, j, num);
611         break;
612     case RSA_NO_PADDING:
613         r = RSA_padding_check_none(to, num, buf, j, num);
614         break;
615     default:
616         RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT, RSA_R_UNKNOWN_PADDING_TYPE);
617         goto err;
618     }
619     if (r < 0)
620         RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT, RSA_R_PADDING_CHECK_FAILED);
621 
622  err:
623     if (ctx != NULL) {
624         BN_CTX_end(ctx);
625         BN_CTX_free(ctx);
626     }
627     if (buf != NULL) {
628         OPENSSL_cleanse(buf, num);
629         OPENSSL_free(buf);
630     }
631     return (r);
632 }
633 
634 /* signature verification */
RSA_eay_public_decrypt(int flen,const unsigned char * from,unsigned char * to,RSA * rsa,int padding)635 static int RSA_eay_public_decrypt(int flen, const unsigned char *from,
636                                   unsigned char *to, RSA *rsa, int padding)
637 {
638     BIGNUM *f, *ret;
639     int i, num = 0, r = -1;
640     unsigned char *p;
641     unsigned char *buf = NULL;
642     BN_CTX *ctx = NULL;
643 
644     if (BN_num_bits(rsa->n) > OPENSSL_RSA_MAX_MODULUS_BITS) {
645         RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_MODULUS_TOO_LARGE);
646         return -1;
647     }
648 
649     if (BN_ucmp(rsa->n, rsa->e) <= 0) {
650         RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_BAD_E_VALUE);
651         return -1;
652     }
653 
654     /* for large moduli, enforce exponent limit */
655     if (BN_num_bits(rsa->n) > OPENSSL_RSA_SMALL_MODULUS_BITS) {
656         if (BN_num_bits(rsa->e) > OPENSSL_RSA_MAX_PUBEXP_BITS) {
657             RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_BAD_E_VALUE);
658             return -1;
659         }
660     }
661 
662     if ((ctx = BN_CTX_new()) == NULL)
663         goto err;
664     BN_CTX_start(ctx);
665     f = BN_CTX_get(ctx);
666     ret = BN_CTX_get(ctx);
667     num = BN_num_bytes(rsa->n);
668     buf = OPENSSL_malloc(num);
669     if (!f || !ret || !buf) {
670         RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, ERR_R_MALLOC_FAILURE);
671         goto err;
672     }
673 
674     /*
675      * This check was for equality but PGP does evil things and chops off the
676      * top '0' bytes
677      */
678     if (flen > num) {
679         RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_DATA_GREATER_THAN_MOD_LEN);
680         goto err;
681     }
682 
683     if (BN_bin2bn(from, flen, f) == NULL)
684         goto err;
685 
686     if (BN_ucmp(f, rsa->n) >= 0) {
687         RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,
688                RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
689         goto err;
690     }
691 
692     if (rsa->flags & RSA_FLAG_CACHE_PUBLIC)
693         if (!BN_MONT_CTX_set_locked
694             (&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx))
695             goto err;
696 
697     if (!rsa->meth->bn_mod_exp(ret, f, rsa->e, rsa->n, ctx,
698                                rsa->_method_mod_n))
699         goto err;
700 
701     if ((padding == RSA_X931_PADDING) && ((ret->d[0] & 0xf) != 12))
702         if (!BN_sub(ret, rsa->n, ret))
703             goto err;
704 
705     p = buf;
706     i = BN_bn2bin(ret, p);
707 
708     switch (padding) {
709     case RSA_PKCS1_PADDING:
710         r = RSA_padding_check_PKCS1_type_1(to, num, buf, i, num);
711         break;
712     case RSA_X931_PADDING:
713         r = RSA_padding_check_X931(to, num, buf, i, num);
714         break;
715     case RSA_NO_PADDING:
716         r = RSA_padding_check_none(to, num, buf, i, num);
717         break;
718     default:
719         RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_UNKNOWN_PADDING_TYPE);
720         goto err;
721     }
722     if (r < 0)
723         RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_PADDING_CHECK_FAILED);
724 
725  err:
726     if (ctx != NULL) {
727         BN_CTX_end(ctx);
728         BN_CTX_free(ctx);
729     }
730     if (buf != NULL) {
731         OPENSSL_cleanse(buf, num);
732         OPENSSL_free(buf);
733     }
734     return (r);
735 }
736 
RSA_eay_mod_exp(BIGNUM * r0,const BIGNUM * I,RSA * rsa,BN_CTX * ctx)737 static int RSA_eay_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx)
738 {
739     BIGNUM *r1, *m1, *vrfy;
740     BIGNUM local_dmp1, local_dmq1, local_c, local_r1;
741     BIGNUM *dmp1, *dmq1, *c, *pr1;
742     int ret = 0;
743 
744     BN_CTX_start(ctx);
745     r1 = BN_CTX_get(ctx);
746     m1 = BN_CTX_get(ctx);
747     vrfy = BN_CTX_get(ctx);
748 
749     {
750         BIGNUM local_p, local_q;
751         BIGNUM *p = NULL, *q = NULL;
752 
753         /*
754          * Make sure BN_mod_inverse in Montgomery intialization uses the
755          * BN_FLG_CONSTTIME flag (unless RSA_FLAG_NO_CONSTTIME is set)
756          */
757         if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
758             BN_init(&local_p);
759             p = &local_p;
760             BN_with_flags(p, rsa->p, BN_FLG_CONSTTIME);
761 
762             BN_init(&local_q);
763             q = &local_q;
764             BN_with_flags(q, rsa->q, BN_FLG_CONSTTIME);
765         } else {
766             p = rsa->p;
767             q = rsa->q;
768         }
769 
770         if (rsa->flags & RSA_FLAG_CACHE_PRIVATE) {
771             if (!BN_MONT_CTX_set_locked
772                 (&rsa->_method_mod_p, CRYPTO_LOCK_RSA, p, ctx))
773                 goto err;
774             if (!BN_MONT_CTX_set_locked
775                 (&rsa->_method_mod_q, CRYPTO_LOCK_RSA, q, ctx))
776                 goto err;
777         }
778     }
779 
780     if (rsa->flags & RSA_FLAG_CACHE_PUBLIC)
781         if (!BN_MONT_CTX_set_locked
782             (&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx))
783             goto err;
784 
785     /* compute I mod q */
786     if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
787         c = &local_c;
788         BN_with_flags(c, I, BN_FLG_CONSTTIME);
789         if (!BN_mod(r1, c, rsa->q, ctx))
790             goto err;
791     } else {
792         if (!BN_mod(r1, I, rsa->q, ctx))
793             goto err;
794     }
795 
796     /* compute r1^dmq1 mod q */
797     if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
798         dmq1 = &local_dmq1;
799         BN_with_flags(dmq1, rsa->dmq1, BN_FLG_CONSTTIME);
800     } else
801         dmq1 = rsa->dmq1;
802     if (!rsa->meth->bn_mod_exp(m1, r1, dmq1, rsa->q, ctx, rsa->_method_mod_q))
803         goto err;
804 
805     /* compute I mod p */
806     if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
807         c = &local_c;
808         BN_with_flags(c, I, BN_FLG_CONSTTIME);
809         if (!BN_mod(r1, c, rsa->p, ctx))
810             goto err;
811     } else {
812         if (!BN_mod(r1, I, rsa->p, ctx))
813             goto err;
814     }
815 
816     /* compute r1^dmp1 mod p */
817     if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
818         dmp1 = &local_dmp1;
819         BN_with_flags(dmp1, rsa->dmp1, BN_FLG_CONSTTIME);
820     } else
821         dmp1 = rsa->dmp1;
822     if (!rsa->meth->bn_mod_exp(r0, r1, dmp1, rsa->p, ctx, rsa->_method_mod_p))
823         goto err;
824 
825     if (!BN_sub(r0, r0, m1))
826         goto err;
827     /*
828      * This will help stop the size of r0 increasing, which does affect the
829      * multiply if it optimised for a power of 2 size
830      */
831     if (BN_is_negative(r0))
832         if (!BN_add(r0, r0, rsa->p))
833             goto err;
834 
835     if (!BN_mul(r1, r0, rsa->iqmp, ctx))
836         goto err;
837 
838     /* Turn BN_FLG_CONSTTIME flag on before division operation */
839     if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
840         pr1 = &local_r1;
841         BN_with_flags(pr1, r1, BN_FLG_CONSTTIME);
842     } else
843         pr1 = r1;
844     if (!BN_mod(r0, pr1, rsa->p, ctx))
845         goto err;
846 
847     /*
848      * If p < q it is occasionally possible for the correction of adding 'p'
849      * if r0 is negative above to leave the result still negative. This can
850      * break the private key operations: the following second correction
851      * should *always* correct this rare occurrence. This will *never* happen
852      * with OpenSSL generated keys because they ensure p > q [steve]
853      */
854     if (BN_is_negative(r0))
855         if (!BN_add(r0, r0, rsa->p))
856             goto err;
857     if (!BN_mul(r1, r0, rsa->q, ctx))
858         goto err;
859     if (!BN_add(r0, r1, m1))
860         goto err;
861 
862     if (rsa->e && rsa->n) {
863         if (!rsa->meth->bn_mod_exp(vrfy, r0, rsa->e, rsa->n, ctx,
864                                    rsa->_method_mod_n))
865             goto err;
866         /*
867          * If 'I' was greater than (or equal to) rsa->n, the operation will
868          * be equivalent to using 'I mod n'. However, the result of the
869          * verify will *always* be less than 'n' so we don't check for
870          * absolute equality, just congruency.
871          */
872         if (!BN_sub(vrfy, vrfy, I))
873             goto err;
874         if (!BN_mod(vrfy, vrfy, rsa->n, ctx))
875             goto err;
876         if (BN_is_negative(vrfy))
877             if (!BN_add(vrfy, vrfy, rsa->n))
878                 goto err;
879         if (!BN_is_zero(vrfy)) {
880             /*
881              * 'I' and 'vrfy' aren't congruent mod n. Don't leak
882              * miscalculated CRT output, just do a raw (slower) mod_exp and
883              * return that instead.
884              */
885 
886             BIGNUM local_d;
887             BIGNUM *d = NULL;
888 
889             if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
890                 d = &local_d;
891                 BN_with_flags(d, rsa->d, BN_FLG_CONSTTIME);
892             } else
893                 d = rsa->d;
894             if (!rsa->meth->bn_mod_exp(r0, I, d, rsa->n, ctx,
895                                        rsa->_method_mod_n))
896                 goto err;
897         }
898     }
899     ret = 1;
900  err:
901     BN_CTX_end(ctx);
902     return (ret);
903 }
904 
RSA_eay_init(RSA * rsa)905 static int RSA_eay_init(RSA *rsa)
906 {
907     rsa->flags |= RSA_FLAG_CACHE_PUBLIC | RSA_FLAG_CACHE_PRIVATE;
908     return (1);
909 }
910 
RSA_eay_finish(RSA * rsa)911 static int RSA_eay_finish(RSA *rsa)
912 {
913     if (rsa->_method_mod_n != NULL)
914         BN_MONT_CTX_free(rsa->_method_mod_n);
915     if (rsa->_method_mod_p != NULL)
916         BN_MONT_CTX_free(rsa->_method_mod_p);
917     if (rsa->_method_mod_q != NULL)
918         BN_MONT_CTX_free(rsa->_method_mod_q);
919     return (1);
920 }
921 
922 #endif
923