21755c0e2fc5959461321b1414eb4ef143026a5d
[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 #include <stdio.h>
60 #include "cryptlib.h"
61 #include <openssl/bn.h>
62 #include <openssl/rsa.h>
63 #include <openssl/rand.h>
64
65 #ifndef RSA_NULL
66
67 static int RSA_eay_public_encrypt(int flen, const unsigned char *from,
68                 unsigned char *to, RSA *rsa,int padding);
69 static int RSA_eay_private_encrypt(int flen, const unsigned char *from,
70                 unsigned char *to, RSA *rsa,int padding);
71 static int RSA_eay_public_decrypt(int flen, const unsigned char *from,
72                 unsigned char *to, RSA *rsa,int padding);
73 static int RSA_eay_private_decrypt(int flen, const unsigned char *from,
74                 unsigned char *to, RSA *rsa,int padding);
75 static int RSA_eay_mod_exp(BIGNUM *r0, const BIGNUM *i, RSA *rsa, BN_CTX *ctx);
76 static int RSA_eay_init(RSA *rsa);
77 static int RSA_eay_finish(RSA *rsa);
78 static RSA_METHOD rsa_pkcs1_eay_meth={
79         "Eric Young's PKCS#1 RSA",
80         RSA_eay_public_encrypt,
81         RSA_eay_public_decrypt, /* signature verification */
82         RSA_eay_private_encrypt, /* signing */
83         RSA_eay_private_decrypt,
84         RSA_eay_mod_exp,
85         BN_mod_exp_mont, /* XXX probably we should not use Montgomery if  e == 3 */
86         RSA_eay_init,
87         RSA_eay_finish,
88         0, /* flags */
89         NULL,
90         0, /* rsa_sign */
91         0, /* rsa_verify */
92         NULL /* rsa_keygen */
93         };
94
95 const RSA_METHOD *RSA_PKCS1_SSLeay(void)
96         {
97         return(&rsa_pkcs1_eay_meth);
98         }
99
100 /* Usage example;
101  *    MONT_HELPER(rsa, bn_ctx, p, rsa->flags & RSA_FLAG_CACHE_PRIVATE, goto err);
102  */
103 #define MONT_HELPER(rsa, ctx, m, pre_cond, err_instr) \
104         if((pre_cond) && ((rsa)->_method_mod_##m == NULL) && \
105                         !BN_MONT_CTX_set_locked(&((rsa)->_method_mod_##m), \
106                                 CRYPTO_LOCK_RSA, \
107                                 (rsa)->m, (ctx))) \
108                 err_instr
109
110 static int RSA_eay_public_encrypt(int flen, const unsigned char *from,
111              unsigned char *to, RSA *rsa, int padding)
112         {
113         BIGNUM *f,*ret;
114         int i,j,k,num=0,r= -1;
115         unsigned char *buf=NULL;
116         BN_CTX *ctx=NULL;
117
118         if ((ctx=BN_CTX_new()) == NULL) goto err;
119         BN_CTX_start(ctx);
120         f = BN_CTX_get(ctx);
121         ret = BN_CTX_get(ctx);
122         num=BN_num_bytes(rsa->n);
123         buf = OPENSSL_malloc(num);
124         if (!f || !ret || !buf)
125                 {
126                 RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT,ERR_R_MALLOC_FAILURE);
127                 goto err;
128                 }
129
130         switch (padding)
131                 {
132         case RSA_PKCS1_PADDING:
133                 i=RSA_padding_add_PKCS1_type_2(buf,num,from,flen);
134                 break;
135 #ifndef OPENSSL_NO_SHA
136         case RSA_PKCS1_OAEP_PADDING:
137                 i=RSA_padding_add_PKCS1_OAEP(buf,num,from,flen,NULL,0);
138                 break;
139 #endif
140         case RSA_SSLV23_PADDING:
141                 i=RSA_padding_add_SSLv23(buf,num,from,flen);
142                 break;
143         case RSA_NO_PADDING:
144                 i=RSA_padding_add_none(buf,num,from,flen);
145                 break;
146         default:
147                 RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT,RSA_R_UNKNOWN_PADDING_TYPE);
148                 goto err;
149                 }
150         if (i <= 0) goto err;
151
152         if (BN_bin2bn(buf,num,f) == NULL) goto err;
153         
154         if (BN_ucmp(f, rsa->n) >= 0)
155                 {       
156                 /* usually the padding functions would catch this */
157                 RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
158                 goto err;
159                 }
160
161         MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err);
162
163         if (!rsa->meth->bn_mod_exp(ret,f,rsa->e,rsa->n,ctx,
164                 rsa->_method_mod_n)) goto err;
165
166         /* put in leading 0 bytes if the number is less than the
167          * length of the modulus */
168         j=BN_num_bytes(ret);
169         i=BN_bn2bin(ret,&(to[num-j]));
170         for (k=0; k<(num-i); k++)
171                 to[k]=0;
172
173         r=num;
174 err:
175         if (ctx != NULL)
176                 {
177                 BN_CTX_end(ctx);
178                 BN_CTX_free(ctx);
179                 }
180         if (buf != NULL) 
181                 {
182                 OPENSSL_cleanse(buf,num);
183                 OPENSSL_free(buf);
184                 }
185         return(r);
186         }
187
188 static BN_BLINDING *rsa_get_blinding(RSA *rsa, BIGNUM **r, int *local, BN_CTX *ctx)
189 {
190         BN_BLINDING *ret;
191
192         if (rsa->blinding == NULL)
193                 {
194                 if (rsa->blinding == NULL)
195                         {
196                         CRYPTO_w_lock(CRYPTO_LOCK_RSA);
197                         if (rsa->blinding == NULL)
198                                 rsa->blinding = RSA_setup_blinding(rsa, ctx);
199                         CRYPTO_w_unlock(CRYPTO_LOCK_RSA);
200                         }
201                 }
202
203         ret = rsa->blinding;
204         if (ret == NULL)
205                 return NULL;
206
207         if (BN_BLINDING_get_thread_id(ret) != CRYPTO_thread_id())
208                 {
209                 *local = 0;
210                 if (rsa->mt_blinding == NULL)
211                         {
212                         CRYPTO_w_lock(CRYPTO_LOCK_RSA);
213                         if (rsa->mt_blinding == NULL)
214                                 rsa->mt_blinding = RSA_setup_blinding(rsa, ctx);
215                         CRYPTO_w_unlock(CRYPTO_LOCK_RSA);
216                         }
217                 ret = rsa->mt_blinding;
218                 }
219         else
220                 *local = 1;
221
222         return ret;
223 }
224
225 static int rsa_blinding_convert(BN_BLINDING *b, int local, BIGNUM *f,
226         BIGNUM *r, BN_CTX *ctx)
227 {
228         if (local)
229                 return BN_BLINDING_convert_ex(f, NULL, b, ctx);
230         else
231                 {
232                 int ret;
233                 CRYPTO_w_lock(CRYPTO_LOCK_RSA_BLINDING);
234                 ret = BN_BLINDING_convert_ex(f, r, b, ctx);
235                 CRYPTO_w_unlock(CRYPTO_LOCK_RSA_BLINDING);
236                 return ret;
237                 }
238 }
239
240 static int rsa_blinding_invert(BN_BLINDING *b, int local, BIGNUM *f,
241         BIGNUM *r, BN_CTX *ctx)
242 {
243         if (local)
244                 return BN_BLINDING_invert_ex(f, NULL, b, ctx);
245         else
246                 {
247                 int ret;
248                 CRYPTO_r_lock(CRYPTO_LOCK_RSA_BLINDING);
249                 ret = BN_BLINDING_invert_ex(f, r, b, ctx);
250                 CRYPTO_r_unlock(CRYPTO_LOCK_RSA_BLINDING);
251                 return ret;
252                 }
253 }
254
255 /* signing */
256 static int RSA_eay_private_encrypt(int flen, const unsigned char *from,
257              unsigned char *to, RSA *rsa, int padding)
258         {
259         BIGNUM *f, *ret, *br;
260         int i,j,k,num=0,r= -1;
261         unsigned char *buf=NULL;
262         BN_CTX *ctx=NULL;
263         int local_blinding = 0;
264         BN_BLINDING *blinding = NULL;
265
266         if ((ctx=BN_CTX_new()) == NULL) goto err;
267         BN_CTX_start(ctx);
268         f   = BN_CTX_get(ctx);
269         br  = BN_CTX_get(ctx);
270         ret = BN_CTX_get(ctx);
271         num = BN_num_bytes(rsa->n);
272         buf = OPENSSL_malloc(num);
273         if(!f || !ret || !buf)
274                 {
275                 RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,ERR_R_MALLOC_FAILURE);
276                 goto err;
277                 }
278
279         switch (padding)
280                 {
281         case RSA_PKCS1_PADDING:
282                 i=RSA_padding_add_PKCS1_type_1(buf,num,from,flen);
283                 break;
284         case RSA_NO_PADDING:
285                 i=RSA_padding_add_none(buf,num,from,flen);
286                 break;
287         case RSA_SSLV23_PADDING:
288         default:
289                 RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,RSA_R_UNKNOWN_PADDING_TYPE);
290                 goto err;
291                 }
292         if (i <= 0) goto err;
293
294         if (BN_bin2bn(buf,num,f) == NULL) goto err;
295         
296         if (BN_ucmp(f, rsa->n) >= 0)
297                 {       
298                 /* usually the padding functions would catch this */
299                 RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
300                 goto err;
301                 }
302
303         if (!(rsa->flags & RSA_FLAG_NO_BLINDING))
304                 {
305                 blinding = rsa_get_blinding(rsa, &br, &local_blinding, ctx);
306                 if (blinding == NULL)
307                         {
308                         RSAerr(RSA_F_RSA_EAY_PRIVATE_ENCRYPT, ERR_R_INTERNAL_ERROR);
309                         goto err;
310                         }
311                 }
312         
313         if (blinding != NULL)
314                 if (!rsa_blinding_convert(blinding, local_blinding, f, br, ctx))
315                         goto err;
316
317         if ( (rsa->flags & RSA_FLAG_EXT_PKEY) ||
318                 ((rsa->p != NULL) &&
319                 (rsa->q != NULL) &&
320                 (rsa->dmp1 != NULL) &&
321                 (rsa->dmq1 != NULL) &&
322                 (rsa->iqmp != NULL)) )
323                 { if (!rsa->meth->rsa_mod_exp(ret,f,rsa,ctx)) goto err; }
324         else
325                 {
326                 MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err);
327                 if (!rsa->meth->bn_mod_exp(ret,f,rsa->d,rsa->n,ctx,
328                                 rsa->_method_mod_n)) goto err;
329                 }
330
331         if (blinding)
332                 if (!rsa_blinding_invert(blinding, local_blinding, ret, br, ctx))
333                         goto err;
334
335         /* put in leading 0 bytes if the number is less than the
336          * length of the modulus */
337         j=BN_num_bytes(ret);
338         i=BN_bn2bin(ret,&(to[num-j]));
339         for (k=0; k<(num-i); k++)
340                 to[k]=0;
341
342         r=num;
343 err:
344         if (ctx != NULL)
345                 {
346                 BN_CTX_end(ctx);
347                 BN_CTX_free(ctx);
348                 }
349         if (buf != NULL)
350                 {
351                 OPENSSL_cleanse(buf,num);
352                 OPENSSL_free(buf);
353                 }
354         return(r);
355         }
356
357 static int RSA_eay_private_decrypt(int flen, const unsigned char *from,
358              unsigned char *to, RSA *rsa, int padding)
359         {
360         BIGNUM *f, *ret, *br;
361         int j,num=0,r= -1;
362         unsigned char *p;
363         unsigned char *buf=NULL;
364         BN_CTX *ctx=NULL;
365         int local_blinding = 0;
366         BN_BLINDING *blinding = NULL;
367
368         if((ctx = BN_CTX_new()) == NULL) goto err;
369         BN_CTX_start(ctx);
370         f   = BN_CTX_get(ctx);
371         br  = BN_CTX_get(ctx);
372         ret = BN_CTX_get(ctx);
373         num = BN_num_bytes(rsa->n);
374         buf = OPENSSL_malloc(num);
375         if(!f || !ret || !buf)
376                 {
377                 RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,ERR_R_MALLOC_FAILURE);
378                 goto err;
379                 }
380
381         /* This check was for equality but PGP does evil things
382          * and chops off the top '0' bytes */
383         if (flen > num)
384                 {
385                 RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_DATA_GREATER_THAN_MOD_LEN);
386                 goto err;
387                 }
388
389         /* make data into a big number */
390         if (BN_bin2bn(from,(int)flen,f) == NULL) goto err;
391
392         if (BN_ucmp(f, rsa->n) >= 0)
393                 {
394                 RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
395                 goto err;
396                 }
397
398         if (!(rsa->flags & RSA_FLAG_NO_BLINDING))
399                 {
400                 blinding = rsa_get_blinding(rsa, &br, &local_blinding, ctx);
401                 if (blinding == NULL)
402                         {
403                         RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT, ERR_R_INTERNAL_ERROR);
404                         goto err;
405                         }
406                 }
407         
408         if (blinding != NULL)
409                 if (!rsa_blinding_convert(blinding, local_blinding, f, br, ctx))
410                         goto err;
411
412         /* do the decrypt */
413         if ( (rsa->flags & RSA_FLAG_EXT_PKEY) ||
414                 ((rsa->p != NULL) &&
415                 (rsa->q != NULL) &&
416                 (rsa->dmp1 != NULL) &&
417                 (rsa->dmq1 != NULL) &&
418                 (rsa->iqmp != NULL)) )
419                 { if (!rsa->meth->rsa_mod_exp(ret,f,rsa,ctx)) goto err; }
420         else
421                 {
422                 MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err);
423                 if (!rsa->meth->bn_mod_exp(ret,f,rsa->d,rsa->n,ctx,
424                                 rsa->_method_mod_n))
425                         goto err;
426                 }
427
428         if (blinding)
429                 if (!rsa_blinding_invert(blinding, local_blinding, ret, br, ctx))
430                         goto err;
431
432         p=buf;
433         j=BN_bn2bin(ret,p); /* j is only used with no-padding mode */
434
435         switch (padding)
436                 {
437         case RSA_PKCS1_PADDING:
438                 r=RSA_padding_check_PKCS1_type_2(to,num,buf,j,num);
439                 break;
440 #ifndef OPENSSL_NO_SHA
441         case RSA_PKCS1_OAEP_PADDING:
442                 r=RSA_padding_check_PKCS1_OAEP(to,num,buf,j,num,NULL,0);
443                 break;
444 #endif
445         case RSA_SSLV23_PADDING:
446                 r=RSA_padding_check_SSLv23(to,num,buf,j,num);
447                 break;
448         case RSA_NO_PADDING:
449                 r=RSA_padding_check_none(to,num,buf,j,num);
450                 break;
451         default:
452                 RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_UNKNOWN_PADDING_TYPE);
453                 goto err;
454                 }
455         if (r < 0)
456                 RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_PADDING_CHECK_FAILED);
457
458 err:
459         if (ctx != NULL)
460                 {
461                 BN_CTX_end(ctx);
462                 BN_CTX_free(ctx);
463                 }
464         if (buf != NULL)
465                 {
466                 OPENSSL_cleanse(buf,num);
467                 OPENSSL_free(buf);
468                 }
469         return(r);
470         }
471
472 /* signature verification */
473 static int RSA_eay_public_decrypt(int flen, const unsigned char *from,
474              unsigned char *to, RSA *rsa, int padding)
475         {
476         BIGNUM *f,*ret;
477         int i,num=0,r= -1;
478         unsigned char *p;
479         unsigned char *buf=NULL;
480         BN_CTX *ctx=NULL;
481
482         if((ctx = BN_CTX_new()) == NULL) goto err;
483         BN_CTX_start(ctx);
484         f = BN_CTX_get(ctx);
485         ret = BN_CTX_get(ctx);
486         num=BN_num_bytes(rsa->n);
487         buf = OPENSSL_malloc(num);
488         if(!f || !ret || !buf)
489                 {
490                 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,ERR_R_MALLOC_FAILURE);
491                 goto err;
492                 }
493
494         /* This check was for equality but PGP does evil things
495          * and chops off the top '0' bytes */
496         if (flen > num)
497                 {
498                 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_DATA_GREATER_THAN_MOD_LEN);
499                 goto err;
500                 }
501
502         if (BN_bin2bn(from,flen,f) == NULL) goto err;
503
504         if (BN_ucmp(f, rsa->n) >= 0)
505                 {
506                 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
507                 goto err;
508                 }
509
510         MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err);
511
512         if (!rsa->meth->bn_mod_exp(ret,f,rsa->e,rsa->n,ctx,
513                 rsa->_method_mod_n)) goto err;
514
515         p=buf;
516         i=BN_bn2bin(ret,p);
517
518         switch (padding)
519                 {
520         case RSA_PKCS1_PADDING:
521                 r=RSA_padding_check_PKCS1_type_1(to,num,buf,i,num);
522                 break;
523         case RSA_NO_PADDING:
524                 r=RSA_padding_check_none(to,num,buf,i,num);
525                 break;
526         default:
527                 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_UNKNOWN_PADDING_TYPE);
528                 goto err;
529                 }
530         if (r < 0)
531                 RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT,RSA_R_PADDING_CHECK_FAILED);
532
533 err:
534         if (ctx != NULL)
535                 {
536                 BN_CTX_end(ctx);
537                 BN_CTX_free(ctx);
538                 }
539         if (buf != NULL)
540                 {
541                 OPENSSL_cleanse(buf,num);
542                 OPENSSL_free(buf);
543                 }
544         return(r);
545         }
546
547 static int RSA_eay_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx)
548         {
549         BIGNUM *r1,*m1,*vrfy;
550         int ret=0;
551
552         BN_CTX_start(ctx);
553         r1 = BN_CTX_get(ctx);
554         m1 = BN_CTX_get(ctx);
555         vrfy = BN_CTX_get(ctx);
556
557         MONT_HELPER(rsa, ctx, p, rsa->flags & RSA_FLAG_CACHE_PRIVATE, goto err);
558         MONT_HELPER(rsa, ctx, q, rsa->flags & RSA_FLAG_CACHE_PRIVATE, goto err);
559         MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err);
560
561         if (!BN_mod(r1,I,rsa->q,ctx)) goto err;
562         if (!rsa->meth->bn_mod_exp(m1,r1,rsa->dmq1,rsa->q,ctx,
563                 rsa->_method_mod_q)) goto err;
564
565         if (!BN_mod(r1,I,rsa->p,ctx)) goto err;
566         if (!rsa->meth->bn_mod_exp(r0,r1,rsa->dmp1,rsa->p,ctx,
567                 rsa->_method_mod_p)) goto err;
568
569         if (!BN_sub(r0,r0,m1)) goto err;
570         /* This will help stop the size of r0 increasing, which does
571          * affect the multiply if it optimised for a power of 2 size */
572         if (BN_is_negative(r0))
573                 if (!BN_add(r0,r0,rsa->p)) goto err;
574
575         if (!BN_mul(r1,r0,rsa->iqmp,ctx)) goto err;
576         if (!BN_mod(r0,r1,rsa->p,ctx)) goto err;
577         /* If p < q it is occasionally possible for the correction of
578          * adding 'p' if r0 is negative above to leave the result still
579          * negative. This can break the private key operations: the following
580          * second correction should *always* correct this rare occurrence.
581          * This will *never* happen with OpenSSL generated keys because
582          * they ensure p > q [steve]
583          */
584         if (BN_is_negative(r0))
585                 if (!BN_add(r0,r0,rsa->p)) goto err;
586         if (!BN_mul(r1,r0,rsa->q,ctx)) goto err;
587         if (!BN_add(r0,r1,m1)) goto err;
588
589         if (rsa->e && rsa->n)
590                 {
591                 if (!rsa->meth->bn_mod_exp(vrfy,r0,rsa->e,rsa->n,ctx,rsa->_method_mod_n)) goto err;
592                 /* If 'I' was greater than (or equal to) rsa->n, the operation
593                  * will be equivalent to using 'I mod n'. However, the result of
594                  * the verify will *always* be less than 'n' so we don't check
595                  * for absolute equality, just congruency. */
596                 if (!BN_sub(vrfy, vrfy, I)) goto err;
597                 if (!BN_mod(vrfy, vrfy, rsa->n, ctx)) goto err;
598                 if (BN_is_negative(vrfy))
599                         if (!BN_add(vrfy, vrfy, rsa->n)) goto err;
600                 if (!BN_is_zero(vrfy))
601                         /* 'I' and 'vrfy' aren't congruent mod n. Don't leak
602                          * miscalculated CRT output, just do a raw (slower)
603                          * mod_exp and return that instead. */
604                         if (!rsa->meth->bn_mod_exp(r0,I,rsa->d,rsa->n,ctx,
605                                         rsa->_method_mod_n)) goto err;
606                 }
607         ret=1;
608 err:
609         BN_CTX_end(ctx);
610         return(ret);
611         }
612
613 static int RSA_eay_init(RSA *rsa)
614         {
615         rsa->flags|=RSA_FLAG_CACHE_PUBLIC|RSA_FLAG_CACHE_PRIVATE;
616         return(1);
617         }
618
619 static int RSA_eay_finish(RSA *rsa)
620         {
621         if (rsa->_method_mod_n != NULL)
622                 BN_MONT_CTX_free(rsa->_method_mod_n);
623         if (rsa->_method_mod_p != NULL)
624                 BN_MONT_CTX_free(rsa->_method_mod_p);
625         if (rsa->_method_mod_q != NULL)
626                 BN_MONT_CTX_free(rsa->_method_mod_q);
627         return(1);
628         }
629
630 #endif