Update copyright year
[oweals/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-2018 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 #include "bn_int.h"
118
119 #ifndef RSA_NULL
120
121 static int RSA_eay_public_encrypt(int flen, const unsigned char *from,
122                                   unsigned char *to, RSA *rsa, int padding);
123 static int RSA_eay_private_encrypt(int flen, const unsigned char *from,
124                                    unsigned char *to, RSA *rsa, int padding);
125 static int RSA_eay_public_decrypt(int flen, const unsigned char *from,
126                                   unsigned char *to, RSA *rsa, int padding);
127 static int RSA_eay_private_decrypt(int flen, const unsigned char *from,
128                                    unsigned char *to, RSA *rsa, int padding);
129 static int RSA_eay_mod_exp(BIGNUM *r0, const BIGNUM *i, RSA *rsa,
130                            BN_CTX *ctx);
131 static int RSA_eay_init(RSA *rsa);
132 static int RSA_eay_finish(RSA *rsa);
133 static RSA_METHOD rsa_pkcs1_eay_meth = {
134     "Eric Young's PKCS#1 RSA",
135     RSA_eay_public_encrypt,
136     RSA_eay_public_decrypt,     /* signature verification */
137     RSA_eay_private_encrypt,    /* signing */
138     RSA_eay_private_decrypt,
139     RSA_eay_mod_exp,
140     BN_mod_exp_mont,            /* XXX probably we should not use Montgomery
141                                  * if e == 3 */
142     RSA_eay_init,
143     RSA_eay_finish,
144     0,                          /* flags */
145     NULL,
146     0,                          /* rsa_sign */
147     0,                          /* rsa_verify */
148     NULL                        /* rsa_keygen */
149 };
150
151 const RSA_METHOD *RSA_PKCS1_SSLeay(void)
152 {
153     return (&rsa_pkcs1_eay_meth);
154 }
155
156 static int RSA_eay_public_encrypt(int flen, const unsigned char *from,
157                                   unsigned char *to, RSA *rsa, int padding)
158 {
159     BIGNUM *f, *ret;
160     int i, num = 0, r = -1;
161     unsigned char *buf = NULL;
162     BN_CTX *ctx = NULL;
163
164     if (BN_num_bits(rsa->n) > OPENSSL_RSA_MAX_MODULUS_BITS) {
165         RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_MODULUS_TOO_LARGE);
166         return -1;
167     }
168
169     if (BN_ucmp(rsa->n, rsa->e) <= 0) {
170         RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_BAD_E_VALUE);
171         return -1;
172     }
173
174     /* for large moduli, enforce exponent limit */
175     if (BN_num_bits(rsa->n) > OPENSSL_RSA_SMALL_MODULUS_BITS) {
176         if (BN_num_bits(rsa->e) > OPENSSL_RSA_MAX_PUBEXP_BITS) {
177             RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_BAD_E_VALUE);
178             return -1;
179         }
180     }
181
182     if ((ctx = BN_CTX_new()) == NULL)
183         goto err;
184     BN_CTX_start(ctx);
185     f = BN_CTX_get(ctx);
186     ret = BN_CTX_get(ctx);
187     num = BN_num_bytes(rsa->n);
188     buf = OPENSSL_malloc(num);
189     if (!f || !ret || !buf) {
190         RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, ERR_R_MALLOC_FAILURE);
191         goto err;
192     }
193
194     switch (padding) {
195     case RSA_PKCS1_PADDING:
196         i = RSA_padding_add_PKCS1_type_2(buf, num, from, flen);
197         break;
198 # ifndef OPENSSL_NO_SHA
199     case RSA_PKCS1_OAEP_PADDING:
200         i = RSA_padding_add_PKCS1_OAEP(buf, num, from, flen, NULL, 0);
201         break;
202 # endif
203     case RSA_SSLV23_PADDING:
204         i = RSA_padding_add_SSLv23(buf, num, from, flen);
205         break;
206     case RSA_NO_PADDING:
207         i = RSA_padding_add_none(buf, num, from, flen);
208         break;
209     default:
210         RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_UNKNOWN_PADDING_TYPE);
211         goto err;
212     }
213     if (i <= 0)
214         goto err;
215
216     if (BN_bin2bn(buf, num, f) == NULL)
217         goto err;
218
219     if (BN_ucmp(f, rsa->n) >= 0) {
220         /* usually the padding functions would catch this */
221         RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT,
222                RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
223         goto err;
224     }
225
226     if (rsa->flags & RSA_FLAG_CACHE_PUBLIC)
227         if (!BN_MONT_CTX_set_locked
228             (&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx))
229             goto err;
230
231     if (!rsa->meth->bn_mod_exp(ret, f, rsa->e, rsa->n, ctx,
232                                rsa->_method_mod_n))
233         goto err;
234
235     /*
236      * BN_bn2binpad puts in leading 0 bytes if the number is less than
237      * the length of the modulus.
238      */
239     r = bn_bn2binpad(ret, to, num);
240  err:
241     if (ctx != NULL) {
242         BN_CTX_end(ctx);
243         BN_CTX_free(ctx);
244     }
245     if (buf != NULL) {
246         OPENSSL_cleanse(buf, num);
247         OPENSSL_free(buf);
248     }
249     return (r);
250 }
251
252 static BN_BLINDING *rsa_get_blinding(RSA *rsa, int *local, BN_CTX *ctx)
253 {
254     BN_BLINDING *ret;
255     int got_write_lock = 0;
256     CRYPTO_THREADID cur;
257
258     CRYPTO_r_lock(CRYPTO_LOCK_RSA);
259
260     if (rsa->blinding == NULL) {
261         CRYPTO_r_unlock(CRYPTO_LOCK_RSA);
262         CRYPTO_w_lock(CRYPTO_LOCK_RSA);
263         got_write_lock = 1;
264
265         if (rsa->blinding == NULL)
266             rsa->blinding = RSA_setup_blinding(rsa, ctx);
267     }
268
269     ret = rsa->blinding;
270     if (ret == NULL)
271         goto err;
272
273     CRYPTO_THREADID_current(&cur);
274     if (!CRYPTO_THREADID_cmp(&cur, BN_BLINDING_thread_id(ret))) {
275         /* rsa->blinding is ours! */
276
277         *local = 1;
278     } else {
279         /* resort to rsa->mt_blinding instead */
280
281         /*
282          * instructs rsa_blinding_convert(), rsa_blinding_invert() that the
283          * BN_BLINDING is shared, meaning that accesses require locks, and
284          * that the blinding factor must be stored outside the BN_BLINDING
285          */
286         *local = 0;
287
288         if (rsa->mt_blinding == NULL) {
289             if (!got_write_lock) {
290                 CRYPTO_r_unlock(CRYPTO_LOCK_RSA);
291                 CRYPTO_w_lock(CRYPTO_LOCK_RSA);
292                 got_write_lock = 1;
293             }
294
295             if (rsa->mt_blinding == NULL)
296                 rsa->mt_blinding = RSA_setup_blinding(rsa, ctx);
297         }
298         ret = rsa->mt_blinding;
299     }
300
301  err:
302     if (got_write_lock)
303         CRYPTO_w_unlock(CRYPTO_LOCK_RSA);
304     else
305         CRYPTO_r_unlock(CRYPTO_LOCK_RSA);
306     return ret;
307 }
308
309 static int rsa_blinding_convert(BN_BLINDING *b, BIGNUM *f, BIGNUM *unblind,
310                                 BN_CTX *ctx)
311 {
312     if (unblind == NULL)
313         /*
314          * Local blinding: store the unblinding factor in BN_BLINDING.
315          */
316         return BN_BLINDING_convert_ex(f, NULL, b, ctx);
317     else {
318         /*
319          * Shared blinding: store the unblinding factor outside BN_BLINDING.
320          */
321         int ret;
322         CRYPTO_w_lock(CRYPTO_LOCK_RSA_BLINDING);
323         ret = BN_BLINDING_convert_ex(f, unblind, b, ctx);
324         CRYPTO_w_unlock(CRYPTO_LOCK_RSA_BLINDING);
325         return ret;
326     }
327 }
328
329 static int rsa_blinding_invert(BN_BLINDING *b, BIGNUM *f, BIGNUM *unblind,
330                                BN_CTX *ctx)
331 {
332     /*
333      * For local blinding, unblind is set to NULL, and BN_BLINDING_invert_ex
334      * will use the unblinding factor stored in BN_BLINDING. If BN_BLINDING
335      * is shared between threads, unblind must be non-null:
336      * BN_BLINDING_invert_ex will then use the local unblinding factor, and
337      * will only read the modulus from BN_BLINDING. In both cases it's safe
338      * to access the blinding without a lock.
339      */
340     return BN_BLINDING_invert_ex(f, unblind, b, ctx);
341 }
342
343 /* signing */
344 static int RSA_eay_private_encrypt(int flen, const unsigned char *from,
345                                    unsigned char *to, RSA *rsa, int padding)
346 {
347     BIGNUM *f, *ret, *res;
348     int i, num = 0, r = -1;
349     unsigned char *buf = NULL;
350     BN_CTX *ctx = NULL;
351     int local_blinding = 0;
352     /*
353      * Used only if the blinding structure is shared. A non-NULL unblind
354      * instructs rsa_blinding_convert() and rsa_blinding_invert() to store
355      * the unblinding factor outside the blinding structure.
356      */
357     BIGNUM *unblind = NULL;
358     BN_BLINDING *blinding = NULL;
359
360     if ((ctx = BN_CTX_new()) == NULL)
361         goto err;
362     BN_CTX_start(ctx);
363     f = BN_CTX_get(ctx);
364     ret = BN_CTX_get(ctx);
365     num = BN_num_bytes(rsa->n);
366     buf = OPENSSL_malloc(num);
367     if (!f || !ret || !buf) {
368         RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT, ERR_R_MALLOC_FAILURE);
369         goto err;
370     }
371
372     switch (padding) {
373     case RSA_PKCS1_PADDING:
374         i = RSA_padding_add_PKCS1_type_1(buf, num, from, flen);
375         break;
376     case RSA_X931_PADDING:
377         i = RSA_padding_add_X931(buf, num, from, flen);
378         break;
379     case RSA_NO_PADDING:
380         i = RSA_padding_add_none(buf, num, from, flen);
381         break;
382     case RSA_SSLV23_PADDING:
383     default:
384         RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT, RSA_R_UNKNOWN_PADDING_TYPE);
385         goto err;
386     }
387     if (i <= 0)
388         goto err;
389
390     if (BN_bin2bn(buf, num, f) == NULL)
391         goto err;
392
393     if (BN_ucmp(f, rsa->n) >= 0) {
394         /* usually the padding functions would catch this */
395         RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,
396                RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
397         goto err;
398     }
399
400     if (!(rsa->flags & RSA_FLAG_NO_BLINDING)) {
401         blinding = rsa_get_blinding(rsa, &local_blinding, ctx);
402         if (blinding == NULL) {
403             RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT, ERR_R_INTERNAL_ERROR);
404             goto err;
405         }
406     }
407
408     if (blinding != NULL) {
409         if (!local_blinding && ((unblind = BN_CTX_get(ctx)) == NULL)) {
410             RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT, ERR_R_MALLOC_FAILURE);
411             goto err;
412         }
413         if (!rsa_blinding_convert(blinding, f, unblind, ctx))
414             goto err;
415     }
416
417     if ((rsa->flags & RSA_FLAG_EXT_PKEY) ||
418         ((rsa->p != NULL) &&
419          (rsa->q != NULL) &&
420          (rsa->dmp1 != NULL) && (rsa->dmq1 != NULL) && (rsa->iqmp != NULL))) {
421         if (!rsa->meth->rsa_mod_exp(ret, f, rsa, ctx))
422             goto err;
423     } else {
424         BIGNUM local_d;
425         BIGNUM *d = NULL;
426
427         if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
428             BN_init(&local_d);
429             d = &local_d;
430             BN_with_flags(d, rsa->d, BN_FLG_CONSTTIME);
431         } else
432             d = rsa->d;
433
434         if (rsa->flags & RSA_FLAG_CACHE_PUBLIC)
435             if (!BN_MONT_CTX_set_locked
436                 (&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx))
437                 goto err;
438
439         if (!rsa->meth->bn_mod_exp(ret, f, d, rsa->n, ctx,
440                                    rsa->_method_mod_n))
441             goto err;
442     }
443
444     if (blinding)
445         if (!rsa_blinding_invert(blinding, ret, unblind, ctx))
446             goto err;
447
448     if (padding == RSA_X931_PADDING) {
449         BN_sub(f, rsa->n, ret);
450         if (BN_cmp(ret, f) > 0)
451             res = f;
452         else
453             res = ret;
454     } else
455         res = ret;
456
457     /*
458      * BN_bn2binpad puts in leading 0 bytes if the number is less than
459      * the length of the modulus.
460      */
461     r = bn_bn2binpad(res, to, num);
462  err:
463     if (ctx != NULL) {
464         BN_CTX_end(ctx);
465         BN_CTX_free(ctx);
466     }
467     if (buf != NULL) {
468         OPENSSL_cleanse(buf, num);
469         OPENSSL_free(buf);
470     }
471     return (r);
472 }
473
474 static int RSA_eay_private_decrypt(int flen, const unsigned char *from,
475                                    unsigned char *to, RSA *rsa, int padding)
476 {
477     BIGNUM *f, *ret;
478     int j, num = 0, r = -1;
479     unsigned char *buf = NULL;
480     BN_CTX *ctx = NULL;
481     int local_blinding = 0;
482     /*
483      * Used only if the blinding structure is shared. A non-NULL unblind
484      * instructs rsa_blinding_convert() and rsa_blinding_invert() to store
485      * the unblinding factor outside the blinding structure.
486      */
487     BIGNUM *unblind = NULL;
488     BN_BLINDING *blinding = NULL;
489
490     if ((ctx = BN_CTX_new()) == NULL)
491         goto err;
492     BN_CTX_start(ctx);
493     f = BN_CTX_get(ctx);
494     ret = BN_CTX_get(ctx);
495     num = BN_num_bytes(rsa->n);
496     buf = OPENSSL_malloc(num);
497     if (!f || !ret || !buf) {
498         RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT, ERR_R_MALLOC_FAILURE);
499         goto err;
500     }
501
502     /*
503      * This check was for equality but PGP does evil things and chops off the
504      * top '0' bytes
505      */
506     if (flen > num) {
507         RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,
508                RSA_R_DATA_GREATER_THAN_MOD_LEN);
509         goto err;
510     }
511
512     /* make data into a big number */
513     if (BN_bin2bn(from, (int)flen, f) == NULL)
514         goto err;
515
516     if (BN_ucmp(f, rsa->n) >= 0) {
517         RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,
518                RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
519         goto err;
520     }
521
522     if (!(rsa->flags & RSA_FLAG_NO_BLINDING)) {
523         blinding = rsa_get_blinding(rsa, &local_blinding, ctx);
524         if (blinding == NULL) {
525             RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT, ERR_R_INTERNAL_ERROR);
526             goto err;
527         }
528     }
529
530     if (blinding != NULL) {
531         if (!local_blinding && ((unblind = BN_CTX_get(ctx)) == NULL)) {
532             RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT, ERR_R_MALLOC_FAILURE);
533             goto err;
534         }
535         if (!rsa_blinding_convert(blinding, f, unblind, ctx))
536             goto err;
537     }
538
539     /* do the decrypt */
540     if ((rsa->flags & RSA_FLAG_EXT_PKEY) ||
541         ((rsa->p != NULL) &&
542          (rsa->q != NULL) &&
543          (rsa->dmp1 != NULL) && (rsa->dmq1 != NULL) && (rsa->iqmp != NULL))) {
544         if (!rsa->meth->rsa_mod_exp(ret, f, rsa, ctx))
545             goto err;
546     } else {
547         BIGNUM local_d;
548         BIGNUM *d = NULL;
549
550         if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
551             d = &local_d;
552             BN_with_flags(d, rsa->d, BN_FLG_CONSTTIME);
553         } else
554             d = rsa->d;
555
556         if (rsa->flags & RSA_FLAG_CACHE_PUBLIC)
557             if (!BN_MONT_CTX_set_locked
558                 (&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx))
559                 goto err;
560         if (!rsa->meth->bn_mod_exp(ret, f, d, rsa->n, ctx,
561                                    rsa->_method_mod_n))
562             goto err;
563     }
564
565     if (blinding)
566         if (!rsa_blinding_invert(blinding, ret, unblind, ctx))
567             goto err;
568
569     j = bn_bn2binpad(ret, buf, num);
570
571     switch (padding) {
572     case RSA_PKCS1_PADDING:
573         r = RSA_padding_check_PKCS1_type_2(to, num, buf, j, num);
574         break;
575 # ifndef OPENSSL_NO_SHA
576     case RSA_PKCS1_OAEP_PADDING:
577         r = RSA_padding_check_PKCS1_OAEP(to, num, buf, j, num, NULL, 0);
578         break;
579 # endif
580     case RSA_SSLV23_PADDING:
581         r = RSA_padding_check_SSLv23(to, num, buf, j, num);
582         break;
583     case RSA_NO_PADDING:
584         memcpy(to, buf, (r = j));
585         break;
586     default:
587         RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT, RSA_R_UNKNOWN_PADDING_TYPE);
588         goto err;
589     }
590     if (r < 0)
591         RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT, RSA_R_PADDING_CHECK_FAILED);
592
593  err:
594     if (ctx != NULL) {
595         BN_CTX_end(ctx);
596         BN_CTX_free(ctx);
597     }
598     if (buf != NULL) {
599         OPENSSL_cleanse(buf, num);
600         OPENSSL_free(buf);
601     }
602     return (r);
603 }
604
605 /* signature verification */
606 static int RSA_eay_public_decrypt(int flen, const unsigned char *from,
607                                   unsigned char *to, RSA *rsa, int padding)
608 {
609     BIGNUM *f, *ret;
610     int i, num = 0, r = -1;
611     unsigned char *buf = NULL;
612     BN_CTX *ctx = NULL;
613
614     if (BN_num_bits(rsa->n) > OPENSSL_RSA_MAX_MODULUS_BITS) {
615         RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_MODULUS_TOO_LARGE);
616         return -1;
617     }
618
619     if (BN_ucmp(rsa->n, rsa->e) <= 0) {
620         RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_BAD_E_VALUE);
621         return -1;
622     }
623
624     /* for large moduli, enforce exponent limit */
625     if (BN_num_bits(rsa->n) > OPENSSL_RSA_SMALL_MODULUS_BITS) {
626         if (BN_num_bits(rsa->e) > OPENSSL_RSA_MAX_PUBEXP_BITS) {
627             RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_BAD_E_VALUE);
628             return -1;
629         }
630     }
631
632     if ((ctx = BN_CTX_new()) == NULL)
633         goto err;
634     BN_CTX_start(ctx);
635     f = BN_CTX_get(ctx);
636     ret = BN_CTX_get(ctx);
637     num = BN_num_bytes(rsa->n);
638     buf = OPENSSL_malloc(num);
639     if (!f || !ret || !buf) {
640         RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, ERR_R_MALLOC_FAILURE);
641         goto err;
642     }
643
644     /*
645      * This check was for equality but PGP does evil things and chops off the
646      * top '0' bytes
647      */
648     if (flen > num) {
649         RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_DATA_GREATER_THAN_MOD_LEN);
650         goto err;
651     }
652
653     if (BN_bin2bn(from, flen, f) == NULL)
654         goto err;
655
656     if (BN_ucmp(f, rsa->n) >= 0) {
657         RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,
658                RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
659         goto err;
660     }
661
662     if (rsa->flags & RSA_FLAG_CACHE_PUBLIC)
663         if (!BN_MONT_CTX_set_locked
664             (&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx))
665             goto err;
666
667     if (!rsa->meth->bn_mod_exp(ret, f, rsa->e, rsa->n, ctx,
668                                rsa->_method_mod_n))
669         goto err;
670
671     if ((padding == RSA_X931_PADDING) && ((ret->d[0] & 0xf) != 12))
672         if (!BN_sub(ret, rsa->n, ret))
673             goto err;
674
675     i = bn_bn2binpad(ret, buf, num);
676
677     switch (padding) {
678     case RSA_PKCS1_PADDING:
679         r = RSA_padding_check_PKCS1_type_1(to, num, buf, i, num);
680         break;
681     case RSA_X931_PADDING:
682         r = RSA_padding_check_X931(to, num, buf, i, num);
683         break;
684     case RSA_NO_PADDING:
685         memcpy(to, buf, (r = i));
686         break;
687     default:
688         RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_UNKNOWN_PADDING_TYPE);
689         goto err;
690     }
691     if (r < 0)
692         RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_PADDING_CHECK_FAILED);
693
694  err:
695     if (ctx != NULL) {
696         BN_CTX_end(ctx);
697         BN_CTX_free(ctx);
698     }
699     if (buf != NULL) {
700         OPENSSL_cleanse(buf, num);
701         OPENSSL_free(buf);
702     }
703     return (r);
704 }
705
706 static int RSA_eay_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx)
707 {
708     BIGNUM *r1, *m1, *vrfy;
709     BIGNUM local_dmp1, local_dmq1, local_c, local_r1;
710     BIGNUM *dmp1, *dmq1, *c, *pr1;
711     int ret = 0;
712
713     BN_CTX_start(ctx);
714     r1 = BN_CTX_get(ctx);
715     m1 = BN_CTX_get(ctx);
716     vrfy = BN_CTX_get(ctx);
717
718     {
719         BIGNUM local_p, local_q;
720         BIGNUM *p = NULL, *q = NULL;
721
722         /*
723          * Make sure BN_mod_inverse in Montgomery intialization uses the
724          * BN_FLG_CONSTTIME flag (unless RSA_FLAG_NO_CONSTTIME is set)
725          */
726         if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
727             BN_init(&local_p);
728             p = &local_p;
729             BN_with_flags(p, rsa->p, BN_FLG_CONSTTIME);
730
731             BN_init(&local_q);
732             q = &local_q;
733             BN_with_flags(q, rsa->q, BN_FLG_CONSTTIME);
734         } else {
735             p = rsa->p;
736             q = rsa->q;
737         }
738
739         if (rsa->flags & RSA_FLAG_CACHE_PRIVATE) {
740             if (!BN_MONT_CTX_set_locked
741                 (&rsa->_method_mod_p, CRYPTO_LOCK_RSA, p, ctx))
742                 goto err;
743             if (!BN_MONT_CTX_set_locked
744                 (&rsa->_method_mod_q, CRYPTO_LOCK_RSA, q, ctx))
745                 goto err;
746         }
747     }
748
749     if (rsa->flags & RSA_FLAG_CACHE_PUBLIC)
750         if (!BN_MONT_CTX_set_locked
751             (&rsa->_method_mod_n, CRYPTO_LOCK_RSA, rsa->n, ctx))
752             goto err;
753
754     /* compute I mod q */
755     if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
756         c = &local_c;
757         BN_with_flags(c, I, BN_FLG_CONSTTIME);
758         if (!BN_mod(r1, c, rsa->q, ctx))
759             goto err;
760     } else {
761         if (!BN_mod(r1, I, rsa->q, ctx))
762             goto err;
763     }
764
765     /* compute r1^dmq1 mod q */
766     if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
767         dmq1 = &local_dmq1;
768         BN_with_flags(dmq1, rsa->dmq1, BN_FLG_CONSTTIME);
769     } else
770         dmq1 = rsa->dmq1;
771     if (!rsa->meth->bn_mod_exp(m1, r1, dmq1, rsa->q, ctx, rsa->_method_mod_q))
772         goto err;
773
774     /* compute I mod p */
775     if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
776         c = &local_c;
777         BN_with_flags(c, I, BN_FLG_CONSTTIME);
778         if (!BN_mod(r1, c, rsa->p, ctx))
779             goto err;
780     } else {
781         if (!BN_mod(r1, I, rsa->p, ctx))
782             goto err;
783     }
784
785     /* compute r1^dmp1 mod p */
786     if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
787         dmp1 = &local_dmp1;
788         BN_with_flags(dmp1, rsa->dmp1, BN_FLG_CONSTTIME);
789     } else
790         dmp1 = rsa->dmp1;
791     if (!rsa->meth->bn_mod_exp(r0, r1, dmp1, rsa->p, ctx, rsa->_method_mod_p))
792         goto err;
793
794     if (!BN_sub(r0, r0, m1))
795         goto err;
796     /*
797      * This will help stop the size of r0 increasing, which does affect the
798      * multiply if it optimised for a power of 2 size
799      */
800     if (BN_is_negative(r0))
801         if (!BN_add(r0, r0, rsa->p))
802             goto err;
803
804     if (!BN_mul(r1, r0, rsa->iqmp, ctx))
805         goto err;
806
807     /* Turn BN_FLG_CONSTTIME flag on before division operation */
808     if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
809         pr1 = &local_r1;
810         BN_with_flags(pr1, r1, BN_FLG_CONSTTIME);
811     } else
812         pr1 = r1;
813     if (!BN_mod(r0, pr1, rsa->p, ctx))
814         goto err;
815
816     /*
817      * If p < q it is occasionally possible for the correction of adding 'p'
818      * if r0 is negative above to leave the result still negative. This can
819      * break the private key operations: the following second correction
820      * should *always* correct this rare occurrence. This will *never* happen
821      * with OpenSSL generated keys because they ensure p > q [steve]
822      */
823     if (BN_is_negative(r0))
824         if (!BN_add(r0, r0, rsa->p))
825             goto err;
826     if (!BN_mul(r1, r0, rsa->q, ctx))
827         goto err;
828     if (!BN_add(r0, r1, m1))
829         goto err;
830
831     if (rsa->e && rsa->n) {
832         if (!rsa->meth->bn_mod_exp(vrfy, r0, rsa->e, rsa->n, ctx,
833                                    rsa->_method_mod_n))
834             goto err;
835         /*
836          * If 'I' was greater than (or equal to) rsa->n, the operation will
837          * be equivalent to using 'I mod n'. However, the result of the
838          * verify will *always* be less than 'n' so we don't check for
839          * absolute equality, just congruency.
840          */
841         if (!BN_sub(vrfy, vrfy, I))
842             goto err;
843         if (!BN_mod(vrfy, vrfy, rsa->n, ctx))
844             goto err;
845         if (BN_is_negative(vrfy))
846             if (!BN_add(vrfy, vrfy, rsa->n))
847                 goto err;
848         if (!BN_is_zero(vrfy)) {
849             /*
850              * 'I' and 'vrfy' aren't congruent mod n. Don't leak
851              * miscalculated CRT output, just do a raw (slower) mod_exp and
852              * return that instead.
853              */
854
855             BIGNUM local_d;
856             BIGNUM *d = NULL;
857
858             if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) {
859                 d = &local_d;
860                 BN_with_flags(d, rsa->d, BN_FLG_CONSTTIME);
861             } else
862                 d = rsa->d;
863             if (!rsa->meth->bn_mod_exp(r0, I, d, rsa->n, ctx,
864                                        rsa->_method_mod_n))
865                 goto err;
866         }
867     }
868     ret = 1;
869  err:
870     BN_CTX_end(ctx);
871     return (ret);
872 }
873
874 static int RSA_eay_init(RSA *rsa)
875 {
876     rsa->flags |= RSA_FLAG_CACHE_PUBLIC | RSA_FLAG_CACHE_PRIVATE;
877     return (1);
878 }
879
880 static int RSA_eay_finish(RSA *rsa)
881 {
882     if (rsa->_method_mod_n != NULL)
883         BN_MONT_CTX_free(rsa->_method_mod_n);
884     if (rsa->_method_mod_p != NULL)
885         BN_MONT_CTX_free(rsa->_method_mod_p);
886     if (rsa->_method_mod_q != NULL)
887         BN_MONT_CTX_free(rsa->_method_mod_q);
888     return (1);
889 }
890
891 #endif