A few more constifications of some RSA routines that I forgot
[openssl.git] / rsaref / rsaref.c
1 /* rsaref/rsaref.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 #ifndef NO_RSA
60 #include <stdio.h>
61 #include "cryptlib.h"
62 #include <openssl/bn.h>
63 #include <openssl/rsa.h>
64 #include <openssl/rsaref.h>
65 #include <openssl/rand.h>
66
67 static int RSAref_bn2bin(BIGNUM * from, unsigned char* to, int max);
68 #ifdef undef
69 static BIGNUM* RSAref_bin2bn(const unsigned char* from, BIGNUM * to, int max);
70 #endif
71 static int RSAref_Public_eay2ref(RSA * from, RSArefPublicKey * to);
72 static int RSAref_Private_eay2ref(RSA * from, RSArefPrivateKey * to);
73 int RSA_ref_private_decrypt(int len, const unsigned char *from,
74         unsigned char *to, RSA *rsa, int padding);
75 int RSA_ref_private_encrypt(int len, const unsigned char *from,
76         unsigned char *to, RSA *rsa, int padding);
77 int RSA_ref_public_encrypt(int len, const unsigned char *from,
78         unsigned char *to, RSA *rsa, int padding);
79 int RSA_ref_public_decrypt(int len, const unsigned char *from,
80         unsigned char *to, RSA *rsa, int padding);
81 static int BN_ref_mod_exp(BIGNUM *r,const BIGNUM *a,
82                           const BIGNUM *p,const BIGNUM *m,
83                           BN_CTX *ctx, BN_MONT_CTX *m_ctx);
84 static int RSA_ref_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa);
85 static RSA_METHOD rsa_pkcs1_ref_meth={
86         "RSAref PKCS#1 RSA",
87         RSA_ref_public_encrypt,
88         RSA_ref_public_decrypt,
89         RSA_ref_private_encrypt,
90         RSA_ref_private_decrypt,
91         RSA_ref_mod_exp,
92         BN_ref_mod_exp,
93         NULL,
94         NULL,
95         0,
96         NULL,
97         };
98
99 const RSA_METHOD *RSA_PKCS1_RSAref(void)
100         {
101         return(&rsa_pkcs1_ref_meth);
102         }
103
104 static int RSA_ref_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa)
105         {
106         RSAREFerr(RSAREF_F_RSA_REF_MOD_EXP,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
107         return(0);
108         }
109
110 static int BN_ref_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
111                           const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx)
112         {
113         RSAREFerr(RSAREF_F_BN_REF_MOD_EXP,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
114         return(0);
115         }
116
117 /* unsigned char *to:  [max]    */
118 static int RSAref_bn2bin(BIGNUM *from, unsigned char *to, int max)
119         {
120         int i;
121
122         i=BN_num_bytes(from);
123         if (i > max)
124                 {
125                 RSAREFerr(RSAREF_F_RSAREF_BN2BIN,RSAREF_R_LEN);
126                 return(0);
127                 }
128
129         memset(to,0,(unsigned int)max);
130         if (!BN_bn2bin(from,&(to[max-i])))
131                 return(0);
132         return(1);
133         }
134
135 #ifdef undef
136 /* unsigned char *from:  [max]    */
137 static BIGNUM *RSAref_bin2bn(unsigned char *from, BIGNUM *to, int max)
138         {
139         int i;
140         BIGNUM *ret;
141
142         for (i=0; i<max; i++)
143                 if (from[i]) break;
144
145         ret=BN_bin2bn(&(from[i]),max-i,to);
146         return(ret);
147         }
148
149 static int RSAref_Public_ref2eay(RSArefPublicKey *from, RSA *to)
150         {
151         to->n=RSAref_bin2bn(from->m,NULL,RSAref_MAX_LEN);
152         to->e=RSAref_bin2bn(from->e,NULL,RSAref_MAX_LEN);
153         if ((to->n == NULL) || (to->e == NULL)) return(0);
154         return(1);
155         }
156 #endif
157
158 static int RSAref_Public_eay2ref(RSA *from, RSArefPublicKey *to)
159         {
160         to->bits=BN_num_bits(from->n);
161         if (!RSAref_bn2bin(from->n,to->m,RSAref_MAX_LEN)) return(0);
162         if (!RSAref_bn2bin(from->e,to->e,RSAref_MAX_LEN)) return(0);
163         return(1);
164         }
165
166 #ifdef undef
167 static int RSAref_Private_ref2eay(RSArefPrivateKey *from, RSA *to)
168         {
169         if ((to->n=RSAref_bin2bn(from->m,NULL,RSAref_MAX_LEN)) == NULL)
170                 return(0);
171         if ((to->e=RSAref_bin2bn(from->e,NULL,RSAref_MAX_LEN)) == NULL)
172                 return(0);
173         if ((to->d=RSAref_bin2bn(from->d,NULL,RSAref_MAX_LEN)) == NULL)
174                 return(0);
175         if ((to->p=RSAref_bin2bn(from->prime[0],NULL,RSAref_MAX_PLEN)) == NULL)
176                 return(0);
177         if ((to->q=RSAref_bin2bn(from->prime[1],NULL,RSAref_MAX_PLEN)) == NULL)
178                 return(0);
179         if ((to->dmp1=RSAref_bin2bn(from->pexp[0],NULL,RSAref_MAX_PLEN))
180                 == NULL)
181                 return(0);
182         if ((to->dmq1=RSAref_bin2bn(from->pexp[1],NULL,RSAref_MAX_PLEN))
183                 == NULL)
184                 return(0);
185         if ((to->iqmp=RSAref_bin2bn(from->coef,NULL,RSAref_MAX_PLEN)) == NULL)
186                 return(0);
187         return(1);
188         }
189 #endif
190
191 static int RSAref_Private_eay2ref(RSA *from, RSArefPrivateKey *to)
192         {
193         to->bits=BN_num_bits(from->n);
194         if (!RSAref_bn2bin(from->n,to->m,RSAref_MAX_LEN)) return(0);
195         if (!RSAref_bn2bin(from->e,to->e,RSAref_MAX_LEN)) return(0);
196         if (!RSAref_bn2bin(from->d,to->d,RSAref_MAX_LEN)) return(0);
197         if (!RSAref_bn2bin(from->p,to->prime[0],RSAref_MAX_PLEN)) return(0);
198         if (!RSAref_bn2bin(from->q,to->prime[1],RSAref_MAX_PLEN)) return(0);
199         if (!RSAref_bn2bin(from->dmp1,to->pexp[0],RSAref_MAX_PLEN)) return(0);
200         if (!RSAref_bn2bin(from->dmq1,to->pexp[1],RSAref_MAX_PLEN)) return(0);
201         if (!RSAref_bn2bin(from->iqmp,to->coef,RSAref_MAX_PLEN)) return(0);
202         return(1);
203         }
204
205 int RSA_ref_private_decrypt(int len, const unsigned char *from,
206         unsigned char *to, RSA *rsa, int padding)
207         {
208         int i,outlen= -1;
209         RSArefPrivateKey RSAkey;
210
211         if (!RSAref_Private_eay2ref(rsa,&RSAkey))
212                 goto err;
213         if ((i=RSAPrivateDecrypt(to,&outlen,from,len,&RSAkey)) != 0)
214                 {
215                 RSAREFerr(RSAREF_F_RSA_REF_PRIVATE_DECRYPT,i);
216                 outlen= -1;
217                 }
218 err:
219         memset(&RSAkey,0,sizeof(RSAkey));
220         return(outlen);
221         }
222
223 int RSA_ref_private_encrypt(int len, const unsigned char *from,
224         unsigned char *to, RSA *rsa, int padding)
225         {
226         int i,outlen= -1;
227         RSArefPrivateKey RSAkey;
228
229         if (padding != RSA_PKCS1_PADDING)
230                 {
231                 RSAREFerr(RSAREF_F_RSA_REF_PRIVATE_ENCRYPT, RSA_R_UNKNOWN_PADDING_TYPE);
232                 goto err;
233         }
234         if (!RSAref_Private_eay2ref(rsa,&RSAkey))
235                 goto err;
236         if ((i=RSAPrivateEncrypt(to,&outlen,from,len,&RSAkey)) != 0)
237                 {
238                 RSAREFerr(RSAREF_F_RSA_REF_PRIVATE_ENCRYPT,i);
239                 outlen= -1;
240                 }
241 err:
242         memset(&RSAkey,0,sizeof(RSAkey));
243         return(outlen);
244         }
245
246 int RSA_ref_public_decrypt(int len, const unsigned char *from,
247         unsigned char *to, RSA *rsa, int padding)
248         {
249         int i,outlen= -1;
250         RSArefPublicKey RSAkey;
251
252         if (!RSAref_Public_eay2ref(rsa,&RSAkey))
253                 goto err;
254         if ((i=RSAPublicDecrypt(to,&outlen,from,len,&RSAkey)) != 0)
255                 {
256                 RSAREFerr(RSAREF_F_RSA_REF_PUBLIC_DECRYPT,i);
257                 outlen= -1;
258                 }
259 err:
260         memset(&RSAkey,0,sizeof(RSAkey));
261         return(outlen);
262         }
263
264 int RSA_ref_public_encrypt(int len, const unsigned char *from,
265         unsigned char *to, RSA *rsa, int padding)
266         {
267         int outlen= -1;
268         int i;
269         RSArefPublicKey RSAkey;
270         RSARandomState rnd;
271         unsigned char buf[16];
272
273         if (padding != RSA_PKCS1_PADDING && padding != RSA_SSLV23_PADDING) 
274                 {
275                 RSAREFerr(RSAREF_F_RSA_REF_PUBLIC_ENCRYPT, RSA_R_UNKNOWN_PADDING_TYPE);
276                 goto err;
277                 }
278         
279         R_RandomInit(&rnd);
280         R_GetRandomBytesNeeded((unsigned int *)&i,&rnd);
281         while (i > 0)
282                 {
283                 if (RAND_bytes(buf,16) <= 0)
284                         goto err;
285                 R_RandomUpdate(&rnd,buf,(unsigned int)((i>16)?16:i));
286                 i-=16;
287                 }
288
289         if (!RSAref_Public_eay2ref(rsa,&RSAkey))
290                 goto err;
291         if ((i=RSAPublicEncrypt(to,&outlen,from,len,&RSAkey,&rnd)) != 0)
292                 {
293                 RSAREFerr(RSAREF_F_RSA_REF_PUBLIC_ENCRYPT,i);
294                 outlen= -1;
295                 goto err;
296                 }
297 err:
298         memset(&RSAkey,0,sizeof(RSAkey));
299         R_RandomFinal(&rnd);
300         memset(&rnd,0,sizeof(rnd));
301         return(outlen);
302         }
303 #else /* !NO_RSA */
304
305 # if PEDANTIC
306 static void *dummy=&dummy;
307 # endif
308
309 #endif