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