summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/evp/evp_lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/evp/evp_lib.c')
-rw-r--r--src/lib/libcrypto/evp/evp_lib.c330
1 files changed, 176 insertions, 154 deletions
diff --git a/src/lib/libcrypto/evp/evp_lib.c b/src/lib/libcrypto/evp/evp_lib.c
index b180e4828a..791f6b8fb1 100644
--- a/src/lib/libcrypto/evp/evp_lib.c
+++ b/src/lib/libcrypto/evp/evp_lib.c
@@ -5,21 +5,21 @@
5 * This package is an SSL implementation written 5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com). 6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL. 7 * The implementation was written so as to conform with Netscapes SSL.
8 * 8 *
9 * This library is free for commercial and non-commercial use as long as 9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions 10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA, 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 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 13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com). 14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 * 15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in 16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed. 17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution 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. 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 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. 21 * in documentation (online or textual) provided with the package.
22 * 22 *
23 * Redistribution and use in source and binary forms, with or without 23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions 24 * modification, are permitted provided that the following conditions
25 * are met: 25 * are met:
@@ -34,10 +34,10 @@
34 * Eric Young (eay@cryptsoft.com)" 34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library 35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-). 36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from 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: 38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 * 40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@@ -49,7 +49,7 @@
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 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 50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE. 51 * SUCH DAMAGE.
52 * 52 *
53 * The licence and distribution terms for any publically available version or 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 54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence 55 * copied and put under another distribution licence
@@ -61,256 +61,278 @@
61#include <openssl/evp.h> 61#include <openssl/evp.h>
62#include <openssl/objects.h> 62#include <openssl/objects.h>
63 63
64int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type) 64int
65 { 65EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
66{
66 int ret; 67 int ret;
67 68
68 if (c->cipher->set_asn1_parameters != NULL) 69 if (c->cipher->set_asn1_parameters != NULL)
69 ret=c->cipher->set_asn1_parameters(c,type); 70 ret = c->cipher->set_asn1_parameters(c, type);
70 else if (c->cipher->flags & EVP_CIPH_FLAG_DEFAULT_ASN1) 71 else if (c->cipher->flags & EVP_CIPH_FLAG_DEFAULT_ASN1)
71 ret=EVP_CIPHER_set_asn1_iv(c, type); 72 ret = EVP_CIPHER_set_asn1_iv(c, type);
72 else 73 else
73 ret=-1; 74 ret = -1;
74 return(ret); 75 return (ret);
75 } 76}
76 77
77int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type) 78int
78 { 79EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
80{
79 int ret; 81 int ret;
80 82
81 if (c->cipher->get_asn1_parameters != NULL) 83 if (c->cipher->get_asn1_parameters != NULL)
82 ret=c->cipher->get_asn1_parameters(c,type); 84 ret = c->cipher->get_asn1_parameters(c, type);
83 else if (c->cipher->flags & EVP_CIPH_FLAG_DEFAULT_ASN1) 85 else if (c->cipher->flags & EVP_CIPH_FLAG_DEFAULT_ASN1)
84 ret=EVP_CIPHER_get_asn1_iv(c, type); 86 ret = EVP_CIPHER_get_asn1_iv(c, type);
85 else 87 else
86 ret=-1; 88 ret = -1;
87 return(ret); 89 return (ret);
88 } 90}
89 91
90int EVP_CIPHER_get_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type) 92int
91 { 93EVP_CIPHER_get_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
92 int i=0; 94{
95 int i = 0;
93 unsigned int l; 96 unsigned int l;
94 97
95 if (type != NULL) 98 if (type != NULL) {
96 { 99 l = EVP_CIPHER_CTX_iv_length(c);
97 l=EVP_CIPHER_CTX_iv_length(c);
98 OPENSSL_assert(l <= sizeof(c->iv)); 100 OPENSSL_assert(l <= sizeof(c->iv));
99 i=ASN1_TYPE_get_octetstring(type,c->oiv,l); 101 i = ASN1_TYPE_get_octetstring(type, c->oiv, l);
100 if (i != (int)l) 102 if (i != (int)l)
101 return(-1); 103 return (-1);
102 else if (i > 0) 104 else if (i > 0)
103 memcpy(c->iv,c->oiv,l); 105 memcpy(c->iv, c->oiv, l);
104 }
105 return(i);
106 } 106 }
107 return (i);
108}
107 109
108int EVP_CIPHER_set_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type) 110int
109 { 111EVP_CIPHER_set_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
110 int i=0; 112{
113 int i = 0;
111 unsigned int j; 114 unsigned int j;
112 115
113 if (type != NULL) 116 if (type != NULL) {
114 { 117 j = EVP_CIPHER_CTX_iv_length(c);
115 j=EVP_CIPHER_CTX_iv_length(c);
116 OPENSSL_assert(j <= sizeof(c->iv)); 118 OPENSSL_assert(j <= sizeof(c->iv));
117 i=ASN1_TYPE_set_octetstring(type,c->oiv,j); 119 i = ASN1_TYPE_set_octetstring(type, c->oiv, j);
118 }
119 return(i);
120 } 120 }
121 return (i);
122}
121 123
122/* Convert the various cipher NIDs and dummies to a proper OID NID */ 124/* Convert the various cipher NIDs and dummies to a proper OID NID */
123int EVP_CIPHER_type(const EVP_CIPHER *ctx) 125int
126EVP_CIPHER_type(const EVP_CIPHER *ctx)
124{ 127{
125 int nid; 128 int nid;
126 ASN1_OBJECT *otmp; 129 ASN1_OBJECT *otmp;
127 nid = EVP_CIPHER_nid(ctx); 130 nid = EVP_CIPHER_nid(ctx);
128 131
129 switch(nid) { 132 switch (nid) {
130 133 case NID_rc2_cbc:
131 case NID_rc2_cbc: 134 case NID_rc2_64_cbc:
132 case NID_rc2_64_cbc: 135 case NID_rc2_40_cbc:
133 case NID_rc2_40_cbc:
134
135 return NID_rc2_cbc; 136 return NID_rc2_cbc;
136 137
137 case NID_rc4: 138 case NID_rc4:
138 case NID_rc4_40: 139 case NID_rc4_40:
139
140 return NID_rc4; 140 return NID_rc4;
141 141
142 case NID_aes_128_cfb128: 142 case NID_aes_128_cfb128:
143 case NID_aes_128_cfb8: 143 case NID_aes_128_cfb8:
144 case NID_aes_128_cfb1: 144 case NID_aes_128_cfb1:
145
146 return NID_aes_128_cfb128; 145 return NID_aes_128_cfb128;
147 146
148 case NID_aes_192_cfb128: 147 case NID_aes_192_cfb128:
149 case NID_aes_192_cfb8: 148 case NID_aes_192_cfb8:
150 case NID_aes_192_cfb1: 149 case NID_aes_192_cfb1:
151
152 return NID_aes_192_cfb128; 150 return NID_aes_192_cfb128;
153 151
154 case NID_aes_256_cfb128: 152 case NID_aes_256_cfb128:
155 case NID_aes_256_cfb8: 153 case NID_aes_256_cfb8:
156 case NID_aes_256_cfb1: 154 case NID_aes_256_cfb1:
157
158 return NID_aes_256_cfb128; 155 return NID_aes_256_cfb128;
159 156
160 case NID_des_cfb64: 157 case NID_des_cfb64:
161 case NID_des_cfb8: 158 case NID_des_cfb8:
162 case NID_des_cfb1: 159 case NID_des_cfb1:
163
164 return NID_des_cfb64; 160 return NID_des_cfb64;
165 161
166 case NID_des_ede3_cfb64: 162 case NID_des_ede3_cfb64:
167 case NID_des_ede3_cfb8: 163 case NID_des_ede3_cfb8:
168 case NID_des_ede3_cfb1: 164 case NID_des_ede3_cfb1:
169
170 return NID_des_cfb64; 165 return NID_des_cfb64;
171 166
172 default: 167 default:
173 /* Check it has an OID and it is valid */ 168 /* Check it has an OID and it is valid */
174 otmp = OBJ_nid2obj(nid); 169 otmp = OBJ_nid2obj(nid);
175 if(!otmp || !otmp->data) nid = NID_undef; 170 if (!otmp || !otmp->data)
171 nid = NID_undef;
176 ASN1_OBJECT_free(otmp); 172 ASN1_OBJECT_free(otmp);
177 return nid; 173 return nid;
178 } 174 }
179} 175}
180 176
181int EVP_CIPHER_block_size(const EVP_CIPHER *e) 177int
182 { 178EVP_CIPHER_block_size(const EVP_CIPHER *e)
179{
183 return e->block_size; 180 return e->block_size;
184 } 181}
185 182
186int EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *ctx) 183int
187 { 184EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *ctx)
185{
188 return ctx->cipher->block_size; 186 return ctx->cipher->block_size;
189 } 187}
190 188
191int EVP_Cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) 189int
192 { 190EVP_Cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in,
193 return ctx->cipher->do_cipher(ctx,out,in,inl); 191 unsigned int inl)
194 } 192{
193 return ctx->cipher->do_cipher(ctx, out, in, inl);
194}
195 195
196const EVP_CIPHER *EVP_CIPHER_CTX_cipher(const EVP_CIPHER_CTX *ctx) 196const EVP_CIPHER *
197 { 197EVP_CIPHER_CTX_cipher(const EVP_CIPHER_CTX *ctx)
198{
198 return ctx->cipher; 199 return ctx->cipher;
199 } 200}
200 201
201unsigned long EVP_CIPHER_flags(const EVP_CIPHER *cipher) 202unsigned long
202 { 203EVP_CIPHER_flags(const EVP_CIPHER *cipher)
204{
203 return cipher->flags; 205 return cipher->flags;
204 } 206}
205 207
206unsigned long EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX *ctx) 208unsigned long
207 { 209EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX *ctx)
210{
208 return ctx->cipher->flags; 211 return ctx->cipher->flags;
209 } 212}
210 213
211void *EVP_CIPHER_CTX_get_app_data(const EVP_CIPHER_CTX *ctx) 214void *
212 { 215EVP_CIPHER_CTX_get_app_data(const EVP_CIPHER_CTX *ctx)
216{
213 return ctx->app_data; 217 return ctx->app_data;
214 } 218}
215 219
216void EVP_CIPHER_CTX_set_app_data(EVP_CIPHER_CTX *ctx, void *data) 220void
217 { 221EVP_CIPHER_CTX_set_app_data(EVP_CIPHER_CTX *ctx, void *data)
222{
218 ctx->app_data = data; 223 ctx->app_data = data;
219 } 224}
220 225
221int EVP_CIPHER_iv_length(const EVP_CIPHER *cipher) 226int
222 { 227EVP_CIPHER_iv_length(const EVP_CIPHER *cipher)
228{
223 return cipher->iv_len; 229 return cipher->iv_len;
224 } 230}
225 231
226int EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX *ctx) 232int
227 { 233EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX *ctx)
234{
228 return ctx->cipher->iv_len; 235 return ctx->cipher->iv_len;
229 } 236}
230 237
231int EVP_CIPHER_key_length(const EVP_CIPHER *cipher) 238int
232 { 239EVP_CIPHER_key_length(const EVP_CIPHER *cipher)
240{
233 return cipher->key_len; 241 return cipher->key_len;
234 } 242}
235 243
236int EVP_CIPHER_CTX_key_length(const EVP_CIPHER_CTX *ctx) 244int
237 { 245EVP_CIPHER_CTX_key_length(const EVP_CIPHER_CTX *ctx)
246{
238 return ctx->key_len; 247 return ctx->key_len;
239 } 248}
240 249
241int EVP_CIPHER_nid(const EVP_CIPHER *cipher) 250int
242 { 251EVP_CIPHER_nid(const EVP_CIPHER *cipher)
252{
243 return cipher->nid; 253 return cipher->nid;
244 } 254}
245 255
246int EVP_CIPHER_CTX_nid(const EVP_CIPHER_CTX *ctx) 256int
247 { 257EVP_CIPHER_CTX_nid(const EVP_CIPHER_CTX *ctx)
258{
248 return ctx->cipher->nid; 259 return ctx->cipher->nid;
249 } 260}
250 261
251int EVP_MD_block_size(const EVP_MD *md) 262int
252 { 263EVP_MD_block_size(const EVP_MD *md)
264{
253 return md->block_size; 265 return md->block_size;
254 } 266}
255 267
256int EVP_MD_type(const EVP_MD *md) 268int
257 { 269EVP_MD_type(const EVP_MD *md)
270{
258 return md->type; 271 return md->type;
259 } 272}
260 273
261int EVP_MD_pkey_type(const EVP_MD *md) 274int
262 { 275EVP_MD_pkey_type(const EVP_MD *md)
276{
263 return md->pkey_type; 277 return md->pkey_type;
264 } 278}
265 279
266int EVP_MD_size(const EVP_MD *md) 280int
267 { 281EVP_MD_size(const EVP_MD *md)
268 if (!md) 282{
269 { 283 if (!md) {
270 EVPerr(EVP_F_EVP_MD_SIZE, EVP_R_MESSAGE_DIGEST_IS_NULL); 284 EVPerr(EVP_F_EVP_MD_SIZE, EVP_R_MESSAGE_DIGEST_IS_NULL);
271 return -1; 285 return -1;
272 }
273 return md->md_size;
274 } 286 }
287 return md->md_size;
288}
275 289
276unsigned long EVP_MD_flags(const EVP_MD *md) 290unsigned long
277 { 291EVP_MD_flags(const EVP_MD *md)
292{
278 return md->flags; 293 return md->flags;
279 } 294}
280 295
281const EVP_MD *EVP_MD_CTX_md(const EVP_MD_CTX *ctx) 296const EVP_MD *
282 { 297EVP_MD_CTX_md(const EVP_MD_CTX *ctx)
298{
283 if (!ctx) 299 if (!ctx)
284 return NULL; 300 return NULL;
285 return ctx->digest; 301 return ctx->digest;
286 } 302}
287 303
288void EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags) 304void
289 { 305EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags)
306{
290 ctx->flags |= flags; 307 ctx->flags |= flags;
291 } 308}
292 309
293void EVP_MD_CTX_clear_flags(EVP_MD_CTX *ctx, int flags) 310void
294 { 311EVP_MD_CTX_clear_flags(EVP_MD_CTX *ctx, int flags)
312{
295 ctx->flags &= ~flags; 313 ctx->flags &= ~flags;
296 } 314}
297 315
298int EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx, int flags) 316int
299 { 317EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx, int flags)
318{
300 return (ctx->flags & flags); 319 return (ctx->flags & flags);
301 } 320}
302 321
303void EVP_CIPHER_CTX_set_flags(EVP_CIPHER_CTX *ctx, int flags) 322void
304 { 323EVP_CIPHER_CTX_set_flags(EVP_CIPHER_CTX *ctx, int flags)
324{
305 ctx->flags |= flags; 325 ctx->flags |= flags;
306 } 326}
307 327
308void EVP_CIPHER_CTX_clear_flags(EVP_CIPHER_CTX *ctx, int flags) 328void
309 { 329EVP_CIPHER_CTX_clear_flags(EVP_CIPHER_CTX *ctx, int flags)
330{
310 ctx->flags &= ~flags; 331 ctx->flags &= ~flags;
311 } 332}
312 333
313int EVP_CIPHER_CTX_test_flags(const EVP_CIPHER_CTX *ctx, int flags) 334int
314 { 335EVP_CIPHER_CTX_test_flags(const EVP_CIPHER_CTX *ctx, int flags)
336{
315 return (ctx->flags & flags); 337 return (ctx->flags & flags);
316 } 338}