Run util/openssl-format-source -v -c .
[openssl.git] / crypto / rsa / rsa_eay.c
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
150 const RSA_METHOD *RSA_PKCS1_SSLeay(void)
151 {
152     return (&rsa_pkcs1_eay_meth);
153 }
154
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
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
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
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 */
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
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 ((ctx = BN_CTX_new()) == NULL)
501         goto err;
502     BN_CTX_start(ctx);
503     f = BN_CTX_get(ctx);
504     ret = BN_CTX_get(ctx);
505     num = BN_num_bytes(rsa->n);
506     buf = OPENSSL_malloc(num);
507     if (!f || !ret || !buf) {
508         RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT, ERR_R_MALLOC_FAILURE);
509         goto err;
510     }
511
512     /*
513      * This check was for equality but PGP does evil things and chops off the
514      * top '0' bytes
515      */
516     if (flen > num) {
517         RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,
518                RSA_R_DATA_GREATER_THAN_MOD_LEN);
519         goto err;
520     }
521
522     /* make data into a big number */
523     if (BN_bin2bn(from, (int)flen, f) == NULL)
524         goto err;
525
526     if (BN_ucmp(f, rsa->n) >= 0) {
527         RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,
528                RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
529         goto err;
530     }
531
532     if (!(rsa->flags & RSA_FLAG_NO_BLINDING)) {
533         blinding = rsa_get_blinding(rsa, &local_blinding, ctx);
534         if (blinding == NULL) {
535             RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT, ERR_R_INTERNAL_ERROR);
536             goto err;
537         }
538     }
539
540     if (blinding != NULL) {
541         if (!local_blinding && ((unblind = BN_CTX_get(ctx)) == NULL)) {
542             RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT, ERR_R_MALLOC_FAILURE);
543             goto err;
544         }
545         if (!rsa_blinding_convert(blinding, f, unblind, ctx))
546             goto err;
547     }
548
549     /* do the decrypt */
550     if ((rsa->flags & RSA_FLAG_EXT_PKEY) ||
551         ((rsa->p != NULL) &&
552          (rsa->q != NULL) &&
553          (rsa->dmp1 != NULL) && (rsa->dmq1 != NULL) && (rsa->iqmp != NULL))) {
554         if (!rsa->meth->rsa_mod_exp(ret, f, rsa, ctx))
555             goto err;
556     } else {
557         BIGNUM local_d;
558         BIGNUM *d = NULL;
559
560         if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
561             d = &local_d;
562             BN_with_flags(d, rsa->d, BN_FLG_CONSTTIME);
563         } else
564             d = rsa->d;
565
566         if (rsa->flags & RSA_FLAG_CACHE_PUBLIC)
567             if (!BN_MONT_CTX_set_locked
568                 (&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx))
569                 goto err;
570         if (!rsa->meth->bn_mod_exp(ret, f, d, rsa->n, ctx,
571                                    rsa->_method_mod_n))
572             goto err;
573     }
574
575     if (blinding)
576         if (!rsa_blinding_invert(blinding, ret, unblind, ctx))
577             goto err;
578
579     p = buf;
580     j = BN_bn2bin(ret, p);      /* j is only used with no-padding mode */
581
582     switch (padding) {
583     case RSA_PKCS1_PADDING:
584         r = RSA_padding_check_PKCS1_type_2(to, num, buf, j, num);
585         break;
586 # ifndef OPENSSL_NO_SHA
587     case RSA_PKCS1_OAEP_PADDING:
588         r = RSA_padding_check_PKCS1_OAEP(to, num, buf, j, num, NULL, 0);
589         break;
590 # endif
591     case RSA_SSLV23_PADDING:
592         r = RSA_padding_check_SSLv23(to, num, buf, j, num);
593         break;
594     case RSA_NO_PADDING:
595         r = RSA_padding_check_none(to, num, buf, j, num);
596         break;
597     default:
598         RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT, RSA_R_UNKNOWN_PADDING_TYPE);
599         goto err;
600     }
601     if (r < 0)
602         RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT, RSA_R_PADDING_CHECK_FAILED);
603
604  err:
605     if (ctx != NULL) {
606         BN_CTX_end(ctx);
607         BN_CTX_free(ctx);
608     }
609     if (buf != NULL) {
610         OPENSSL_cleanse(buf, num);
611         OPENSSL_free(buf);
612     }
613     return (r);
614 }
615
616 /* signature verification */
617 static int RSA_eay_public_decrypt(int flen, const unsigned char *from,
618                                   unsigned char *to, RSA *rsa, int padding)
619 {
620     BIGNUM *f, *ret;
621     int i, num = 0, r = -1;
622     unsigned char *p;
623     unsigned char *buf = NULL;
624     BN_CTX *ctx = NULL;
625
626     if (BN_num_bits(rsa->n) > OPENSSL_RSA_MAX_MODULUS_BITS) {
627         RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_MODULUS_TOO_LARGE);
628         return -1;
629     }
630
631     if (BN_ucmp(rsa->n, rsa->e) <= 0) {
632         RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_BAD_E_VALUE);
633         return -1;
634     }
635
636     /* for large moduli, enforce exponent limit */
637     if (BN_num_bits(rsa->n) > OPENSSL_RSA_SMALL_MODULUS_BITS) {
638         if (BN_num_bits(rsa->e) > OPENSSL_RSA_MAX_PUBEXP_BITS) {
639             RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_BAD_E_VALUE);
640             return -1;
641         }
642     }
643
644     if ((ctx = BN_CTX_new()) == NULL)
645         goto err;
646     BN_CTX_start(ctx);
647     f = BN_CTX_get(ctx);
648     ret = BN_CTX_get(ctx);
649     num = BN_num_bytes(rsa->n);
650     buf = OPENSSL_malloc(num);
651     if (!f || !ret || !buf) {
652         RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, ERR_R_MALLOC_FAILURE);
653         goto err;
654     }
655
656     /*
657      * This check was for equality but PGP does evil things and chops off the
658      * top '0' bytes
659      */
660     if (flen > num) {
661         RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_DATA_GREATER_THAN_MOD_LEN);
662         goto err;
663     }
664
665     if (BN_bin2bn(from, flen, f) == NULL)
666         goto err;
667
668     if (BN_ucmp(f, rsa->n) >= 0) {
669         RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,
670                RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
671         goto err;
672     }
673
674     if (rsa->flags & RSA_FLAG_CACHE_PUBLIC)
675         if (!BN_MONT_CTX_set_locked
676             (&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx))
677             goto err;
678
679     if (!rsa->meth->bn_mod_exp(ret, f, rsa->e, rsa->n, ctx,
680                                rsa->_method_mod_n))
681         goto err;
682
683     if ((padding == RSA_X931_PADDING) && ((ret->d[0] & 0xf) != 12))
684         if (!BN_sub(ret, rsa->n, ret))
685             goto err;
686
687     p = buf;
688     i = BN_bn2bin(ret, p);
689
690     switch (padding) {
691     case RSA_PKCS1_PADDING:
692         r = RSA_padding_check_PKCS1_type_1(to, num, buf, i, num);
693         break;
694     case RSA_X931_PADDING:
695         r = RSA_padding_check_X931(to, num, buf, i, num);
696         break;
697     case RSA_NO_PADDING:
698         r = RSA_padding_check_none(to, num, buf, i, num);
699         break;
700     default:
701         RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_UNKNOWN_PADDING_TYPE);
702         goto err;
703     }
704     if (r < 0)
705         RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_PADDING_CHECK_FAILED);
706
707  err:
708     if (ctx != NULL) {
709         BN_CTX_end(ctx);
710         BN_CTX_free(ctx);
711     }
712     if (buf != NULL) {
713         OPENSSL_cleanse(buf, num);
714         OPENSSL_free(buf);
715     }
716     return (r);
717 }
718
719 static int RSA_eay_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx)
720 {
721     BIGNUM *r1, *m1, *vrfy;
722     BIGNUM local_dmp1, local_dmq1, local_c, local_r1;
723     BIGNUM *dmp1, *dmq1, *c, *pr1;
724     int ret = 0;
725
726     BN_CTX_start(ctx);
727     r1 = BN_CTX_get(ctx);
728     m1 = BN_CTX_get(ctx);
729     vrfy = BN_CTX_get(ctx);
730
731     {
732         BIGNUM local_p, local_q;
733         BIGNUM *p = NULL, *q = NULL;
734
735         /*
736          * Make sure BN_mod_inverse in Montgomery intialization uses the
737          * BN_FLG_CONSTTIME flag (unless RSA_FLAG_NO_CONSTTIME is set)
738          */
739         if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
740             BN_init(&local_p);
741             p = &local_p;
742             BN_with_flags(p, rsa->p, BN_FLG_CONSTTIME);
743
744             BN_init(&local_q);
745             q = &local_q;
746             BN_with_flags(q, rsa->q, BN_FLG_CONSTTIME);
747         } else {
748             p = rsa->p;
749             q = rsa->q;
750         }
751
752         if (rsa->flags & RSA_FLAG_CACHE_PRIVATE) {
753             if (!BN_MONT_CTX_set_locked
754                 (&rsa->_method_mod_p, CRYPTO_LOCK_RSA, p, ctx))
755                 goto err;
756             if (!BN_MONT_CTX_set_locked
757                 (&rsa->_method_mod_q, CRYPTO_LOCK_RSA, q, ctx))
758                 goto err;
759         }
760     }
761
762     if (rsa->flags & RSA_FLAG_CACHE_PUBLIC)
763         if (!BN_MONT_CTX_set_locked
764             (&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx))
765             goto err;
766
767     /* compute I mod q */
768     if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
769         c = &local_c;
770         BN_with_flags(c, I, BN_FLG_CONSTTIME);
771         if (!BN_mod(r1, c, rsa->q, ctx))
772             goto err;
773     } else {
774         if (!BN_mod(r1, I, rsa->q, ctx))
775             goto err;
776     }
777
778     /* compute r1^dmq1 mod q */
779     if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
780         dmq1 = &local_dmq1;
781         BN_with_flags(dmq1, rsa->dmq1, BN_FLG_CONSTTIME);
782     } else
783         dmq1 = rsa->dmq1;
784     if (!rsa->meth->bn_mod_exp(m1, r1, dmq1, rsa->q, ctx, rsa->_method_mod_q))
785         goto err;
786
787     /* compute I mod p */
788     if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
789         c = &local_c;
790         BN_with_flags(c, I, BN_FLG_CONSTTIME);
791         if (!BN_mod(r1, c, rsa->p, ctx))
792             goto err;
793     } else {
794         if (!BN_mod(r1, I, rsa->p, ctx))
795             goto err;
796     }
797
798     /* compute r1^dmp1 mod p */
799     if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
800         dmp1 = &local_dmp1;
801         BN_with_flags(dmp1, rsa->dmp1, BN_FLG_CONSTTIME);
802     } else
803         dmp1 = rsa->dmp1;
804     if (!rsa->meth->bn_mod_exp(r0, r1, dmp1, rsa->p, ctx, rsa->_method_mod_p))
805         goto err;
806
807     if (!BN_sub(r0, r0, m1))
808         goto err;
809     /*
810      * This will help stop the size of r0 increasing, which does affect the
811      * multiply if it optimised for a power of 2 size
812      */
813     if (BN_is_negative(r0))
814         if (!BN_add(r0, r0, rsa->p))
815             goto err;
816
817     if (!BN_mul(r1, r0, rsa->iqmp, ctx))
818         goto err;
819
820     /* Turn BN_FLG_CONSTTIME flag on before division operation */
821     if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
822         pr1 = &local_r1;
823         BN_with_flags(pr1, r1, BN_FLG_CONSTTIME);
824     } else
825         pr1 = r1;
826     if (!BN_mod(r0, pr1, rsa->p, ctx))
827         goto err;
828
829     /*
830      * If p < q it is occasionally possible for the correction of adding 'p'
831      * if r0 is negative above to leave the result still negative. This can
832      * break the private key operations: the following second correction
833      * should *always* correct this rare occurrence. This will *never* happen
834      * with OpenSSL generated keys because they ensure p > q [steve]
835      */
836     if (BN_is_negative(r0))
837         if (!BN_add(r0, r0, rsa->p))
838             goto err;
839     if (!BN_mul(r1, r0, rsa->q, ctx))
840         goto err;
841     if (!BN_add(r0, r1, m1))
842         goto err;
843
844     if (rsa->e && rsa->n) {
845         if (!rsa->
846             meth->bn_mod_exp(vrfy, r0, rsa->e, rsa->n, ctx,
847                              rsa->_method_mod_n))
848             goto err;
849         /*
850          * If 'I' was greater than (or equal to) rsa->n, the operation will
851          * be equivalent to using 'I mod n'. However, the result of the
852          * verify will *always* be less than 'n' so we don't check for
853          * absolute equality, just congruency.
854          */
855         if (!BN_sub(vrfy, vrfy, I))
856             goto err;
857         if (!BN_mod(vrfy, vrfy, rsa->n, ctx))
858             goto err;
859         if (BN_is_negative(vrfy))
860             if (!BN_add(vrfy, vrfy, rsa->n))
861                 goto err;
862         if (!BN_is_zero(vrfy)) {
863             /*
864              * 'I' and 'vrfy' aren't congruent mod n. Don't leak
865              * miscalculated CRT output, just do a raw (slower) mod_exp and
866              * return that instead.
867              */
868
869             BIGNUM local_d;
870             BIGNUM *d = NULL;
871
872             if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
873                 d = &local_d;
874                 BN_with_flags(d, rsa->d, BN_FLG_CONSTTIME);
875             } else
876                 d = rsa->d;
877             if (!rsa->meth->bn_mod_exp(r0, I, d, rsa->n, ctx,
878                                        rsa->_method_mod_n))
879                 goto err;
880         }
881     }
882     ret = 1;
883  err:
884     BN_CTX_end(ctx);
885     return (ret);
886 }
887
888 static int RSA_eay_init(RSA *rsa)
889 {
890     rsa->flags |= RSA_FLAG_CACHE_PUBLIC | RSA_FLAG_CACHE_PRIVATE;
891     return (1);
892 }
893
894 static int RSA_eay_finish(RSA *rsa)
895 {
896     if (rsa->_method_mod_n != NULL)
897         BN_MONT_CTX_free(rsa->_method_mod_n);
898     if (rsa->_method_mod_p != NULL)
899         BN_MONT_CTX_free(rsa->_method_mod_p);
900     if (rsa->_method_mod_q != NULL)
901         BN_MONT_CTX_free(rsa->_method_mod_q);
902     return (1);
903 }
904
905 #endif