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