]> git.ipfire.org Git - thirdparty/openssl.git/blame - crypto/evp/p_lib.c
Import of old SSLeay release: SSLeay 0.9.0b
[thirdparty/openssl.git] / crypto / evp / p_lib.c
CommitLineData
d02b48c6 1/* crypto/evp/p_lib.c */
58964a49 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
d02b48c6
RE
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 "objects.h"
62#include "evp.h"
63#include "asn1_mac.h"
64#include "x509.h"
65
66/* EVPerr(EVP_F_D2I_PKEY,EVP_R_UNSUPPORTED_CIPHER); */
67/* EVPerr(EVP_F_D2I_PKEY,EVP_R_IV_TOO_LARGE); */
68
69#ifndef NOPROTO
70static void EVP_PKEY_free_it(EVP_PKEY *x);
71#else
72static void EVP_PKEY_free_it();
73#endif
74
58964a49
RE
75int EVP_PKEY_bits(pkey)
76EVP_PKEY *pkey;
77 {
78#ifndef NO_RSA
79 if (pkey->type == EVP_PKEY_RSA)
80 return(BN_num_bits(pkey->pkey.rsa->n));
81 else
82#endif
83#ifndef NO_DSA
84 if (pkey->type == EVP_PKEY_DSA)
85 return(BN_num_bits(pkey->pkey.dsa->p));
86#endif
87 return(0);
88 }
89
d02b48c6
RE
90int EVP_PKEY_size(pkey)
91EVP_PKEY *pkey;
92 {
93#ifndef NO_RSA
94 if (pkey->type == EVP_PKEY_RSA)
95 return(RSA_size(pkey->pkey.rsa));
96 else
97#endif
98#ifndef NO_DSA
99 if (pkey->type == EVP_PKEY_DSA)
100 return(DSA_size(pkey->pkey.dsa));
101#endif
102 return(0);
103 }
104
105int EVP_PKEY_save_parameters(pkey,mode)
106EVP_PKEY *pkey;
107int mode;
108 {
109#ifndef NO_DSA
110 if (pkey->type == EVP_PKEY_DSA)
111 {
112 int ret=pkey->save_parameters=mode;
113
114 if (mode >= 0)
115 pkey->save_parameters=mode;
116 return(ret);
117 }
118#endif
119 return(0);
120 }
121
122int EVP_PKEY_copy_parameters(to,from)
123EVP_PKEY *to,*from;
124 {
125 if (to->type != from->type)
126 {
127 EVPerr(EVP_F_EVP_PKEY_COPY_PARAMETERS,EVP_R_DIFFERENT_KEY_TYPES);
58964a49 128 goto err;
d02b48c6
RE
129 }
130
131 if (EVP_PKEY_missing_parameters(from))
132 {
133 EVPerr(EVP_F_EVP_PKEY_COPY_PARAMETERS,EVP_R_MISSING_PARMATERS);
58964a49 134 goto err;
d02b48c6
RE
135 }
136#ifndef NO_DSA
137 if (to->type == EVP_PKEY_DSA)
138 {
139 BIGNUM *a;
140
141 if ((a=BN_dup(from->pkey.dsa->p)) == NULL) goto err;
142 if (to->pkey.dsa->p != NULL) BN_free(to->pkey.dsa->p);
143 to->pkey.dsa->p=a;
144
145 if ((a=BN_dup(from->pkey.dsa->q)) == NULL) goto err;
146 if (to->pkey.dsa->q != NULL) BN_free(to->pkey.dsa->q);
147 to->pkey.dsa->q=a;
148
149 if ((a=BN_dup(from->pkey.dsa->g)) == NULL) goto err;
150 if (to->pkey.dsa->g != NULL) BN_free(to->pkey.dsa->g);
151 to->pkey.dsa->g=a;
152 }
153#endif
154 return(1);
155err:
156 return(0);
157 }
158
159int EVP_PKEY_missing_parameters(pkey)
160EVP_PKEY *pkey;
161 {
162#ifndef NO_DSA
163 if (pkey->type == EVP_PKEY_DSA)
164 {
165 DSA *dsa;
166
167 dsa=pkey->pkey.dsa;
168 if ((dsa->p == NULL) || (dsa->q == NULL) || (dsa->g == NULL))
169 return(1);
170 }
171#endif
172 return(0);
173 }
174
58964a49
RE
175int EVP_PKEY_cmp_parameters(a,b)
176EVP_PKEY *a,*b;
177 {
178#ifndef NO_DSA
179 if ((a->type == EVP_PKEY_DSA) && (b->type == EVP_PKEY_DSA))
180 {
181 if ( BN_cmp(a->pkey.dsa->p,b->pkey.dsa->p) ||
182 BN_cmp(a->pkey.dsa->q,b->pkey.dsa->q) ||
183 BN_cmp(a->pkey.dsa->g,b->pkey.dsa->g))
184 return(0);
185 else
186 return(1);
187 }
188#endif
189 return(-1);
190 }
191
d02b48c6
RE
192EVP_PKEY *EVP_PKEY_new()
193 {
194 EVP_PKEY *ret;
195
196 ret=(EVP_PKEY *)Malloc(sizeof(EVP_PKEY));
197 if (ret == NULL)
198 {
199 EVPerr(EVP_F_EVP_PKEY_NEW,ERR_R_MALLOC_FAILURE);
200 return(NULL);
201 }
202 ret->type=EVP_PKEY_NONE;
203 ret->references=1;
204 ret->pkey.ptr=NULL;
205 ret->attributes=NULL;
206 ret->save_parameters=1;
207 return(ret);
208 }
209
210int EVP_PKEY_assign(pkey,type,key)
211EVP_PKEY *pkey;
212int type;
213char *key;
214 {
215 if (pkey == NULL) return(0);
216 if (pkey->pkey.ptr != NULL)
217 EVP_PKEY_free_it(pkey);
218 pkey->type=EVP_PKEY_type(type);
219 pkey->save_type=type;
220 pkey->pkey.ptr=key;
221 return(1);
222 }
223
224int EVP_PKEY_type(type)
225int type;
226 {
227 switch (type)
228 {
229 case EVP_PKEY_RSA:
230 case EVP_PKEY_RSA2:
231 return(EVP_PKEY_RSA);
232 case EVP_PKEY_DSA:
58964a49 233 case EVP_PKEY_DSA1:
d02b48c6
RE
234 case EVP_PKEY_DSA2:
235 case EVP_PKEY_DSA3:
58964a49 236 case EVP_PKEY_DSA4:
d02b48c6
RE
237 return(EVP_PKEY_DSA);
238 case EVP_PKEY_DH:
239 return(EVP_PKEY_DH);
240 default:
241 return(NID_undef);
242 }
243 }
244
245void EVP_PKEY_free(x)
246EVP_PKEY *x;
247 {
248 int i;
249
250 if (x == NULL) return;
251
252 i=CRYPTO_add(&x->references,-1,CRYPTO_LOCK_EVP_PKEY);
58964a49
RE
253#ifdef REF_PRINT
254 REF_PRINT("EVP_PKEY",x);
255#endif
d02b48c6
RE
256 if (i > 0) return;
257#ifdef REF_CHECK
258 if (i < 0)
259 {
260 fprintf(stderr,"EVP_PKEY_free, bad reference count\n");
261 abort();
262 }
263#endif
264 EVP_PKEY_free_it(x);
265 Free((char *)x);
266 }
267
268static void EVP_PKEY_free_it(x)
269EVP_PKEY *x;
270 {
271 switch (x->type)
272 {
273#ifndef NO_RSA
274 case EVP_PKEY_RSA:
275 case EVP_PKEY_RSA2:
276 RSA_free(x->pkey.rsa);
277 break;
278#endif
279#ifndef NO_DSA
280 case EVP_PKEY_DSA:
281 case EVP_PKEY_DSA2:
282 case EVP_PKEY_DSA3:
58964a49 283 case EVP_PKEY_DSA4:
d02b48c6
RE
284 DSA_free(x->pkey.dsa);
285 break;
286#endif
287#ifndef NO_DH
288 case EVP_PKEY_DH:
289 DH_free(x->pkey.dh);
290 break;
291#endif
292 }
293 }
294