summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libcrypto/evp/c_all.c26
-rw-r--r--src/lib/libcrypto/evp/digest.c273
-rw-r--r--src/lib/libcrypto/evp/encode.c524
-rw-r--r--src/lib/libcrypto/evp/names.c186
-rw-r--r--src/lib/libssl/src/crypto/evp/c_all.c26
-rw-r--r--src/lib/libssl/src/crypto/evp/digest.c273
-rw-r--r--src/lib/libssl/src/crypto/evp/encode.c524
-rw-r--r--src/lib/libssl/src/crypto/evp/names.c186
8 files changed, 1028 insertions, 990 deletions
diff --git a/src/lib/libcrypto/evp/c_all.c b/src/lib/libcrypto/evp/c_all.c
index 766c4cecdf..0596484742 100644
--- a/src/lib/libcrypto/evp/c_all.c
+++ b/src/lib/libcrypto/evp/c_all.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
@@ -66,14 +66,16 @@
66#if 0 66#if 0
67#undef OpenSSL_add_all_algorithms 67#undef OpenSSL_add_all_algorithms
68 68
69void OpenSSL_add_all_algorithms(void) 69void
70 { 70OpenSSL_add_all_algorithms(void)
71{
71 OPENSSL_add_all_algorithms_noconf(); 72 OPENSSL_add_all_algorithms_noconf();
72 } 73}
73#endif 74#endif
74 75
75void OPENSSL_add_all_algorithms_noconf(void) 76void
76 { 77OPENSSL_add_all_algorithms_noconf(void)
78{
77 /* 79 /*
78 * For the moment OPENSSL_cpuid_setup does something 80 * For the moment OPENSSL_cpuid_setup does something
79 * only on IA-32, but we reserve the option for all 81 * only on IA-32, but we reserve the option for all
@@ -87,4 +89,4 @@ void OPENSSL_add_all_algorithms_noconf(void)
87 ENGINE_setup_bsd_cryptodev(); 89 ENGINE_setup_bsd_cryptodev();
88# endif 90# endif
89#endif 91#endif
90 } 92}
diff --git a/src/lib/libcrypto/evp/digest.c b/src/lib/libcrypto/evp/digest.c
index 2fae68ef5e..238030820c 100644
--- a/src/lib/libcrypto/evp/digest.c
+++ b/src/lib/libcrypto/evp/digest.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
@@ -63,7 +63,7 @@
63 * are met: 63 * are met:
64 * 64 *
65 * 1. Redistributions of source code must retain the above copyright 65 * 1. Redistributions of source code must retain the above copyright
66 * notice, this list of conditions and the following disclaimer. 66 * notice, this list of conditions and the following disclaimer.
67 * 67 *
68 * 2. Redistributions in binary form must reproduce the above copyright 68 * 2. Redistributions in binary form must reproduce the above copyright
69 * notice, this list of conditions and the following disclaimer in 69 * notice, this list of conditions and the following disclaimer in
@@ -117,264 +117,257 @@
117#include <openssl/engine.h> 117#include <openssl/engine.h>
118#endif 118#endif
119 119
120void EVP_MD_CTX_init(EVP_MD_CTX *ctx) 120void
121 { 121EVP_MD_CTX_init(EVP_MD_CTX *ctx)
122 memset(ctx,'\0',sizeof *ctx); 122{
123 } 123 memset(ctx, '\0', sizeof *ctx);
124}
124 125
125EVP_MD_CTX *EVP_MD_CTX_create(void) 126EVP_MD_CTX *
126 { 127EVP_MD_CTX_create(void)
127 EVP_MD_CTX *ctx=malloc(sizeof *ctx); 128{
129 EVP_MD_CTX *ctx = malloc(sizeof *ctx);
128 130
129 if (ctx) 131 if (ctx)
130 EVP_MD_CTX_init(ctx); 132 EVP_MD_CTX_init(ctx);
131 133
132 return ctx; 134 return ctx;
133 } 135}
134 136
135int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type) 137int
136 { 138EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type)
139{
137 EVP_MD_CTX_init(ctx); 140 EVP_MD_CTX_init(ctx);
138 return EVP_DigestInit_ex(ctx, type, NULL); 141 return EVP_DigestInit_ex(ctx, type, NULL);
139 } 142}
143
144int
145EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl)
146{
147 EVP_MD_CTX_clear_flags(ctx, EVP_MD_CTX_FLAG_CLEANED);
140 148
141int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl)
142 {
143 EVP_MD_CTX_clear_flags(ctx,EVP_MD_CTX_FLAG_CLEANED);
144#ifndef OPENSSL_NO_ENGINE 149#ifndef OPENSSL_NO_ENGINE
145 /* Whether it's nice or not, "Inits" can be used on "Final"'d contexts 150 /* Whether it's nice or not, "Inits" can be used on "Final"'d contexts
146 * so this context may already have an ENGINE! Try to avoid releasing 151 * so this context may already have an ENGINE! Try to avoid releasing
147 * the previous handle, re-querying for an ENGINE, and having a 152 * the previous handle, re-querying for an ENGINE, and having a
148 * reinitialisation, when it may all be unecessary. */ 153 * reinitialisation, when it may all be unecessary. */
149 if (ctx->engine && ctx->digest && (!type || 154 if (ctx->engine && ctx->digest && (!type ||
150 (type && (type->type == ctx->digest->type)))) 155 (type && (type->type == ctx->digest->type))))
151 goto skip_to_init; 156 goto skip_to_init;
152 if (type) 157 if (type) {
153 {
154 /* Ensure an ENGINE left lying around from last time is cleared 158 /* Ensure an ENGINE left lying around from last time is cleared
155 * (the previous check attempted to avoid this if the same 159 * (the previous check attempted to avoid this if the same
156 * ENGINE and EVP_MD could be used). */ 160 * ENGINE and EVP_MD could be used). */
157 if(ctx->engine) 161 if (ctx->engine)
158 ENGINE_finish(ctx->engine); 162 ENGINE_finish(ctx->engine);
159 if(impl) 163 if (impl) {
160 { 164 if (!ENGINE_init(impl)) {
161 if (!ENGINE_init(impl)) 165 EVPerr(EVP_F_EVP_DIGESTINIT_EX,
162 { 166 EVP_R_INITIALIZATION_ERROR);
163 EVPerr(EVP_F_EVP_DIGESTINIT_EX,EVP_R_INITIALIZATION_ERROR);
164 return 0; 167 return 0;
165 }
166 } 168 }
167 else 169 } else
168 /* Ask if an ENGINE is reserved for this job */ 170 /* Ask if an ENGINE is reserved for this job */
169 impl = ENGINE_get_digest_engine(type->type); 171 impl = ENGINE_get_digest_engine(type->type);
170 if(impl) 172 if (impl) {
171 {
172 /* There's an ENGINE for this job ... (apparently) */ 173 /* There's an ENGINE for this job ... (apparently) */
173 const EVP_MD *d = ENGINE_get_digest(impl, type->type); 174 const EVP_MD *d = ENGINE_get_digest(impl, type->type);
174 if(!d) 175 if (!d) {
175 {
176 /* Same comment from evp_enc.c */ 176 /* Same comment from evp_enc.c */
177 EVPerr(EVP_F_EVP_DIGESTINIT_EX,EVP_R_INITIALIZATION_ERROR); 177 EVPerr(EVP_F_EVP_DIGESTINIT_EX,
178 EVP_R_INITIALIZATION_ERROR);
178 ENGINE_finish(impl); 179 ENGINE_finish(impl);
179 return 0; 180 return 0;
180 } 181 }
181 /* We'll use the ENGINE's private digest definition */ 182 /* We'll use the ENGINE's private digest definition */
182 type = d; 183 type = d;
183 /* Store the ENGINE functional reference so we know 184 /* Store the ENGINE functional reference so we know
184 * 'type' came from an ENGINE and we need to release 185 * 'type' came from an ENGINE and we need to release
185 * it when done. */ 186 * it when done. */
186 ctx->engine = impl; 187 ctx->engine = impl;
187 } 188 } else
188 else
189 ctx->engine = NULL; 189 ctx->engine = NULL;
190 } 190 } else if (!ctx->digest) {
191 else 191 EVPerr(EVP_F_EVP_DIGESTINIT_EX, EVP_R_NO_DIGEST_SET);
192 if(!ctx->digest)
193 {
194 EVPerr(EVP_F_EVP_DIGESTINIT_EX,EVP_R_NO_DIGEST_SET);
195 return 0; 192 return 0;
196 } 193 }
197#endif 194#endif
198 if (ctx->digest != type) 195 if (ctx->digest != type) {
199 {
200 if (ctx->digest && ctx->digest->ctx_size) 196 if (ctx->digest && ctx->digest->ctx_size)
201 free(ctx->md_data); 197 free(ctx->md_data);
202 ctx->digest=type; 198 ctx->digest = type;
203 if (!(ctx->flags & EVP_MD_CTX_FLAG_NO_INIT) && type->ctx_size) 199 if (!(ctx->flags & EVP_MD_CTX_FLAG_NO_INIT) && type->ctx_size) {
204 {
205 ctx->update = type->update; 200 ctx->update = type->update;
206 ctx->md_data=malloc(type->ctx_size); 201 ctx->md_data = malloc(type->ctx_size);
207 if (ctx->md_data == NULL) 202 if (ctx->md_data == NULL) {
208 {
209 EVPerr(EVP_F_EVP_DIGESTINIT_EX, 203 EVPerr(EVP_F_EVP_DIGESTINIT_EX,
210 ERR_R_MALLOC_FAILURE); 204 ERR_R_MALLOC_FAILURE);
211 return 0; 205 return 0;
212 }
213 } 206 }
214 } 207 }
208 }
215#ifndef OPENSSL_NO_ENGINE 209#ifndef OPENSSL_NO_ENGINE
216skip_to_init: 210skip_to_init:
217#endif 211#endif
218 if (ctx->pctx) 212 if (ctx->pctx) {
219 {
220 int r; 213 int r;
221 r = EVP_PKEY_CTX_ctrl(ctx->pctx, -1, EVP_PKEY_OP_TYPE_SIG, 214 r = EVP_PKEY_CTX_ctrl(ctx->pctx, -1, EVP_PKEY_OP_TYPE_SIG,
222 EVP_PKEY_CTRL_DIGESTINIT, 0, ctx); 215 EVP_PKEY_CTRL_DIGESTINIT, 0, ctx);
223 if (r <= 0 && (r != -2)) 216 if (r <= 0 && (r != -2))
224 return 0; 217 return 0;
225 } 218 }
226 if (ctx->flags & EVP_MD_CTX_FLAG_NO_INIT) 219 if (ctx->flags & EVP_MD_CTX_FLAG_NO_INIT)
227 return 1; 220 return 1;
228 return ctx->digest->init(ctx); 221 return ctx->digest->init(ctx);
229 } 222}
230 223
231int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data, size_t count) 224int
232 { 225EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data, size_t count)
233 return ctx->update(ctx,data,count); 226{
234 } 227 return ctx->update(ctx, data, count);
228}
235 229
236/* The caller can assume that this removes any secret data from the context */ 230/* The caller can assume that this removes any secret data from the context */
237int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size) 231int
238 { 232EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size)
233{
239 int ret; 234 int ret;
235
240 ret = EVP_DigestFinal_ex(ctx, md, size); 236 ret = EVP_DigestFinal_ex(ctx, md, size);
241 EVP_MD_CTX_cleanup(ctx); 237 EVP_MD_CTX_cleanup(ctx);
242 return ret; 238 return ret;
243 } 239}
244 240
245/* The caller can assume that this removes any secret data from the context */ 241/* The caller can assume that this removes any secret data from the context */
246int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size) 242int
247 { 243EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size)
244{
248 int ret; 245 int ret;
249 246
250 OPENSSL_assert(ctx->digest->md_size <= EVP_MAX_MD_SIZE); 247 OPENSSL_assert(ctx->digest->md_size <= EVP_MAX_MD_SIZE);
251 ret=ctx->digest->final(ctx,md); 248 ret = ctx->digest->final(ctx, md);
252 if (size != NULL) 249 if (size != NULL)
253 *size=ctx->digest->md_size; 250 *size = ctx->digest->md_size;
254 if (ctx->digest->cleanup) 251 if (ctx->digest->cleanup) {
255 {
256 ctx->digest->cleanup(ctx); 252 ctx->digest->cleanup(ctx);
257 EVP_MD_CTX_set_flags(ctx,EVP_MD_CTX_FLAG_CLEANED); 253 EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_CLEANED);
258 }
259 memset(ctx->md_data,0,ctx->digest->ctx_size);
260 return ret;
261 } 254 }
255 memset(ctx->md_data, 0, ctx->digest->ctx_size);
256 return ret;
257}
262 258
263int EVP_MD_CTX_copy(EVP_MD_CTX *out, const EVP_MD_CTX *in) 259int
264 { 260EVP_MD_CTX_copy(EVP_MD_CTX *out, const EVP_MD_CTX *in)
261{
265 EVP_MD_CTX_init(out); 262 EVP_MD_CTX_init(out);
266 return EVP_MD_CTX_copy_ex(out, in); 263 return EVP_MD_CTX_copy_ex(out, in);
267 } 264}
268 265
269int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in) 266int
270 { 267EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in)
268{
271 unsigned char *tmp_buf; 269 unsigned char *tmp_buf;
272 if ((in == NULL) || (in->digest == NULL)) 270
273 { 271 if ((in == NULL) || (in->digest == NULL)) {
274 EVPerr(EVP_F_EVP_MD_CTX_COPY_EX,EVP_R_INPUT_NOT_INITIALIZED); 272 EVPerr(EVP_F_EVP_MD_CTX_COPY_EX, EVP_R_INPUT_NOT_INITIALIZED);
275 return 0; 273 return 0;
276 } 274 }
277#ifndef OPENSSL_NO_ENGINE 275#ifndef OPENSSL_NO_ENGINE
278 /* Make sure it's safe to copy a digest context using an ENGINE */ 276 /* Make sure it's safe to copy a digest context using an ENGINE */
279 if (in->engine && !ENGINE_init(in->engine)) 277 if (in->engine && !ENGINE_init(in->engine)) {
280 { 278 EVPerr(EVP_F_EVP_MD_CTX_COPY_EX, ERR_R_ENGINE_LIB);
281 EVPerr(EVP_F_EVP_MD_CTX_COPY_EX,ERR_R_ENGINE_LIB);
282 return 0; 279 return 0;
283 } 280 }
284#endif 281#endif
285 282
286 if (out->digest == in->digest) 283 if (out->digest == in->digest) {
287 {
288 tmp_buf = out->md_data; 284 tmp_buf = out->md_data;
289 EVP_MD_CTX_set_flags(out,EVP_MD_CTX_FLAG_REUSE); 285 EVP_MD_CTX_set_flags(out, EVP_MD_CTX_FLAG_REUSE);
290 } 286 } else
291 else tmp_buf = NULL; 287 tmp_buf = NULL;
292 EVP_MD_CTX_cleanup(out); 288 EVP_MD_CTX_cleanup(out);
293 memcpy(out,in,sizeof *out); 289 memcpy(out, in, sizeof *out);
294 290
295 if (in->md_data && out->digest->ctx_size) 291 if (in->md_data && out->digest->ctx_size) {
296 {
297 if (tmp_buf) 292 if (tmp_buf)
298 out->md_data = tmp_buf; 293 out->md_data = tmp_buf;
299 else 294 else {
300 { 295 out->md_data = malloc(out->digest->ctx_size);
301 out->md_data=malloc(out->digest->ctx_size); 296 if (!out->md_data) {
302 if (!out->md_data) 297 EVPerr(EVP_F_EVP_MD_CTX_COPY_EX,
303 { 298 ERR_R_MALLOC_FAILURE);
304 EVPerr(EVP_F_EVP_MD_CTX_COPY_EX,ERR_R_MALLOC_FAILURE);
305 return 0; 299 return 0;
306 }
307 } 300 }
308 memcpy(out->md_data,in->md_data,out->digest->ctx_size);
309 } 301 }
302 memcpy(out->md_data, in->md_data, out->digest->ctx_size);
303 }
310 304
311 out->update = in->update; 305 out->update = in->update;
312 306
313 if (in->pctx) 307 if (in->pctx) {
314 {
315 out->pctx = EVP_PKEY_CTX_dup(in->pctx); 308 out->pctx = EVP_PKEY_CTX_dup(in->pctx);
316 if (!out->pctx) 309 if (!out->pctx) {
317 {
318 EVP_MD_CTX_cleanup(out); 310 EVP_MD_CTX_cleanup(out);
319 return 0; 311 return 0;
320 }
321 } 312 }
313 }
322 314
323 if (out->digest->copy) 315 if (out->digest->copy)
324 return out->digest->copy(out,in); 316 return out->digest->copy(out, in);
325 317
326 return 1; 318 return 1;
327 } 319}
328 320
329int EVP_Digest(const void *data, size_t count, 321int
330 unsigned char *md, unsigned int *size, const EVP_MD *type, ENGINE *impl) 322EVP_Digest(const void *data, size_t count,
331 { 323 unsigned char *md, unsigned int *size, const EVP_MD *type, ENGINE *impl)
324{
332 EVP_MD_CTX ctx; 325 EVP_MD_CTX ctx;
333 int ret; 326 int ret;
334 327
335 EVP_MD_CTX_init(&ctx); 328 EVP_MD_CTX_init(&ctx);
336 EVP_MD_CTX_set_flags(&ctx,EVP_MD_CTX_FLAG_ONESHOT); 329 EVP_MD_CTX_set_flags(&ctx, EVP_MD_CTX_FLAG_ONESHOT);
337 ret=EVP_DigestInit_ex(&ctx, type, impl) 330 ret = EVP_DigestInit_ex(&ctx, type, impl) &&
338 && EVP_DigestUpdate(&ctx, data, count) 331 EVP_DigestUpdate(&ctx, data, count) &&
339 && EVP_DigestFinal_ex(&ctx, md, size); 332 EVP_DigestFinal_ex(&ctx, md, size);
340 EVP_MD_CTX_cleanup(&ctx); 333 EVP_MD_CTX_cleanup(&ctx);
341 334
342 return ret; 335 return ret;
343 } 336}
344 337
345void EVP_MD_CTX_destroy(EVP_MD_CTX *ctx) 338void
346 { 339EVP_MD_CTX_destroy(EVP_MD_CTX *ctx)
347 if (ctx) 340{
348 { 341 if (ctx) {
349 EVP_MD_CTX_cleanup(ctx); 342 EVP_MD_CTX_cleanup(ctx);
350 free(ctx); 343 free(ctx);
351 }
352 } 344 }
345}
353 346
354/* This call frees resources associated with the context */ 347/* This call frees resources associated with the context */
355int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx) 348int
356 { 349EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx)
350{
357 /* Don't assume ctx->md_data was cleaned in EVP_Digest_Final, 351 /* Don't assume ctx->md_data was cleaned in EVP_Digest_Final,
358 * because sometimes only copies of the context are ever finalised. 352 * because sometimes only copies of the context are ever finalised.
359 */ 353 */
360 if (ctx->digest && ctx->digest->cleanup 354 if (ctx->digest && ctx->digest->cleanup &&
361 && !EVP_MD_CTX_test_flags(ctx,EVP_MD_CTX_FLAG_CLEANED)) 355 !EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_CLEANED))
362 ctx->digest->cleanup(ctx); 356 ctx->digest->cleanup(ctx);
363 if (ctx->digest && ctx->digest->ctx_size && ctx->md_data 357 if (ctx->digest && ctx->digest->ctx_size && ctx->md_data &&
364 && !EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_REUSE)) 358 !EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_REUSE)) {
365 { 359 OPENSSL_cleanse(ctx->md_data, ctx->digest->ctx_size);
366 OPENSSL_cleanse(ctx->md_data,ctx->digest->ctx_size);
367 free(ctx->md_data); 360 free(ctx->md_data);
368 } 361 }
369 if (ctx->pctx) 362 if (ctx->pctx)
370 EVP_PKEY_CTX_free(ctx->pctx); 363 EVP_PKEY_CTX_free(ctx->pctx);
371#ifndef OPENSSL_NO_ENGINE 364#ifndef OPENSSL_NO_ENGINE
372 if(ctx->engine) 365 if (ctx->engine)
373 /* The EVP_MD we used belongs to an ENGINE, release the 366 /* The EVP_MD we used belongs to an ENGINE, release the
374 * functional reference we held for this reason. */ 367 * functional reference we held for this reason. */
375 ENGINE_finish(ctx->engine); 368 ENGINE_finish(ctx->engine);
376#endif 369#endif
377 memset(ctx,'\0',sizeof *ctx); 370 memset(ctx, '\0', sizeof *ctx);
378 371
379 return 1; 372 return 1;
380 } 373}
diff --git a/src/lib/libcrypto/evp/encode.c b/src/lib/libcrypto/evp/encode.c
index 7af9a2780b..dca5ffdcf4 100644
--- a/src/lib/libcrypto/evp/encode.c
+++ b/src/lib/libcrypto/evp/encode.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
@@ -74,7 +74,7 @@
74#define CHUNKS_PER_LINE (64/4) 74#define CHUNKS_PER_LINE (64/4)
75#define CHAR_PER_LINE (64+1) 75#define CHAR_PER_LINE (64+1)
76 76
77static const unsigned char data_bin2ascii[65]="ABCDEFGHIJKLMNOPQRSTUVWXYZ\ 77static const unsigned char data_bin2ascii[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\
78abcdefghijklmnopqrstuvwxyz0123456789+/"; 78abcdefghijklmnopqrstuvwxyz0123456789+/";
79 79
80/* 0xF0 is a EOLN 80/* 0xF0 is a EOLN
@@ -91,344 +91,346 @@ abcdefghijklmnopqrstuvwxyz0123456789+/";
91#define B64_ERROR 0xFF 91#define B64_ERROR 0xFF
92#define B64_NOT_BASE64(a) (((a)|0x13) == 0xF3) 92#define B64_NOT_BASE64(a) (((a)|0x13) == 0xF3)
93 93
94static const unsigned char data_ascii2bin[128]={ 94static const unsigned char data_ascii2bin[128] = {
95 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 95 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
96 0xFF,0xE0,0xF0,0xFF,0xFF,0xF1,0xFF,0xFF, 96 0xFF, 0xE0, 0xF0, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF,
97 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 97 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
98 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 98 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
99 0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 99 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
100 0xFF,0xFF,0xFF,0x3E,0xFF,0xF2,0xFF,0x3F, 100 0xFF, 0xFF, 0xFF, 0x3E, 0xFF, 0xF2, 0xFF, 0x3F,
101 0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B, 101 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B,
102 0x3C,0x3D,0xFF,0xFF,0xFF,0x00,0xFF,0xFF, 102 0x3C, 0x3D, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF,
103 0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06, 103 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
104 0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E, 104 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,
105 0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16, 105 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
106 0x17,0x18,0x19,0xFF,0xFF,0xFF,0xFF,0xFF, 106 0x17, 0x18, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
107 0xFF,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20, 107 0xFF, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20,
108 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, 108 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
109 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30, 109 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30,
110 0x31,0x32,0x33,0xFF,0xFF,0xFF,0xFF,0xFF, 110 0x31, 0x32, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
111 }; 111};
112 112
113void EVP_EncodeInit(EVP_ENCODE_CTX *ctx) 113void
114 { 114EVP_EncodeInit(EVP_ENCODE_CTX *ctx)
115 ctx->length=48; 115{
116 ctx->num=0; 116 ctx->length = 48;
117 ctx->line_num=0; 117 ctx->num = 0;
118 } 118 ctx->line_num = 0;
119 119}
120void EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl, 120
121 const unsigned char *in, int inl) 121void
122 { 122EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl,
123 int i,j; 123 const unsigned char *in, int inl)
124 unsigned int total=0; 124{
125 125 int i, j;
126 *outl=0; 126 unsigned int total = 0;
127 if (inl == 0) return; 127
128 *outl = 0;
129 if (inl == 0)
130 return;
128 OPENSSL_assert(ctx->length <= (int)sizeof(ctx->enc_data)); 131 OPENSSL_assert(ctx->length <= (int)sizeof(ctx->enc_data));
129 if ((ctx->num+inl) < ctx->length) 132 if ((ctx->num + inl) < ctx->length) {
130 { 133 memcpy(&(ctx->enc_data[ctx->num]), in, inl);
131 memcpy(&(ctx->enc_data[ctx->num]),in,inl); 134 ctx->num += inl;
132 ctx->num+=inl;
133 return; 135 return;
134 }
135 if (ctx->num != 0)
136 {
137 i=ctx->length-ctx->num;
138 memcpy(&(ctx->enc_data[ctx->num]),in,i);
139 in+=i;
140 inl-=i;
141 j=EVP_EncodeBlock(out,ctx->enc_data,ctx->length);
142 ctx->num=0;
143 out+=j;
144 *(out++)='\n';
145 *out='\0';
146 total=j+1;
147 }
148 while (inl >= ctx->length)
149 {
150 j=EVP_EncodeBlock(out,in,ctx->length);
151 in+=ctx->length;
152 inl-=ctx->length;
153 out+=j;
154 *(out++)='\n';
155 *out='\0';
156 total+=j+1;
157 }
158 if (inl != 0)
159 memcpy(&(ctx->enc_data[0]),in,inl);
160 ctx->num=inl;
161 *outl=total;
162 } 136 }
163 137 if (ctx->num != 0) {
164void EVP_EncodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl) 138 i = ctx->length - ctx->num;
165 { 139 memcpy(&(ctx->enc_data[ctx->num]), in, i);
166 unsigned int ret=0; 140 in += i;
167 141 inl -= i;
168 if (ctx->num != 0) 142 j = EVP_EncodeBlock(out, ctx->enc_data, ctx->length);
169 { 143 ctx->num = 0;
170 ret=EVP_EncodeBlock(out,ctx->enc_data,ctx->num); 144 out += j;
171 out[ret++]='\n'; 145 *(out++) = '\n';
172 out[ret]='\0'; 146 *out = '\0';
173 ctx->num=0; 147 total = j + 1;
174 } 148 }
175 *outl=ret; 149 while (inl >= ctx->length) {
150 j = EVP_EncodeBlock(out, in, ctx->length);
151 in += ctx->length;
152 inl -= ctx->length;
153 out += j;
154 *(out++) = '\n';
155 *out = '\0';
156 total += j + 1;
157 }
158 if (inl != 0)
159 memcpy(&(ctx->enc_data[0]), in, inl);
160 ctx->num = inl;
161 *outl = total;
162}
163
164void
165EVP_EncodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl)
166{
167 unsigned int ret = 0;
168
169 if (ctx->num != 0) {
170 ret = EVP_EncodeBlock(out, ctx->enc_data, ctx->num);
171 out[ret++] = '\n';
172 out[ret] = '\0';
173 ctx->num = 0;
176 } 174 }
175 *outl = ret;
176}
177 177
178int EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int dlen) 178int
179 { 179EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int dlen)
180 int i,ret=0; 180{
181 int i, ret = 0;
181 unsigned long l; 182 unsigned long l;
182 183
183 for (i=dlen; i > 0; i-=3) 184 for (i = dlen; i > 0; i -= 3) {
184 { 185 if (i >= 3) {
185 if (i >= 3) 186 l = (((unsigned long)f[0]) << 16L) |
186 { 187 (((unsigned long)f[1]) << 8L) | f[2];
187 l= (((unsigned long)f[0])<<16L)| 188 *(t++) = conv_bin2ascii(l >> 18L);
188 (((unsigned long)f[1])<< 8L)|f[2]; 189 *(t++) = conv_bin2ascii(l >> 12L);
189 *(t++)=conv_bin2ascii(l>>18L); 190 *(t++) = conv_bin2ascii(l >> 6L);
190 *(t++)=conv_bin2ascii(l>>12L); 191 *(t++) = conv_bin2ascii(l );
191 *(t++)=conv_bin2ascii(l>> 6L); 192 } else {
192 *(t++)=conv_bin2ascii(l ); 193 l = ((unsigned long)f[0]) << 16L;
193 } 194 if (i == 2)
194 else 195 l |= ((unsigned long)f[1] << 8L);
195 { 196
196 l=((unsigned long)f[0])<<16L; 197 *(t++) = conv_bin2ascii(l >> 18L);
197 if (i == 2) l|=((unsigned long)f[1]<<8L); 198 *(t++) = conv_bin2ascii(l >> 12L);
198 199 *(t++) = (i == 1) ? '=' : conv_bin2ascii(l >> 6L);
199 *(t++)=conv_bin2ascii(l>>18L); 200 *(t++) = '=';
200 *(t++)=conv_bin2ascii(l>>12L);
201 *(t++)=(i == 1)?'=':conv_bin2ascii(l>> 6L);
202 *(t++)='=';
203 }
204 ret+=4;
205 f+=3;
206 } 201 }
207 202 ret += 4;
208 *t='\0'; 203 f += 3;
209 return(ret);
210 } 204 }
211 205
212void EVP_DecodeInit(EVP_ENCODE_CTX *ctx) 206 *t = '\0';
213 { 207 return (ret);
214 ctx->length=30; 208}
215 ctx->num=0; 209
216 ctx->line_num=0; 210void
217 ctx->expect_nl=0; 211EVP_DecodeInit(EVP_ENCODE_CTX *ctx)
218 } 212{
213 ctx->length = 30;
214 ctx->num = 0;
215 ctx->line_num = 0;
216 ctx->expect_nl = 0;
217}
219 218
220/* -1 for error 219/* -1 for error
221 * 0 for last line 220 * 0 for last line
222 * 1 for full line 221 * 1 for full line
223 */ 222 */
224int EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl, 223int
225 const unsigned char *in, int inl) 224EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl,
226 { 225 const unsigned char *in, int inl)
227 int seof= -1,eof=0,rv= -1,ret=0,i,v,tmp,n,ln,exp_nl; 226{
227 int seof = -1, eof = 0, rv = -1, ret = 0, i,v, tmp, n,ln, exp_nl;
228 unsigned char *d; 228 unsigned char *d;
229 229
230 n=ctx->num; 230 n = ctx->num;
231 d=ctx->enc_data; 231 d = ctx->enc_data;
232 ln=ctx->line_num; 232 ln = ctx->line_num;
233 exp_nl=ctx->expect_nl; 233 exp_nl = ctx->expect_nl;
234 234
235 /* last line of input. */ 235 /* last line of input. */
236 if ((inl == 0) || ((n == 0) && (conv_ascii2bin(in[0]) == B64_EOF))) 236 if ((inl == 0) || ((n == 0) && (conv_ascii2bin(in[0]) == B64_EOF))) {
237 { rv=0; goto end; } 237 rv = 0;
238 238 goto end;
239 }
240
239 /* We parse the input data */ 241 /* We parse the input data */
240 for (i=0; i<inl; i++) 242 for (i = 0; i < inl; i++) {
241 {
242 /* If the current line is > 80 characters, scream alot */ 243 /* If the current line is > 80 characters, scream alot */
243 if (ln >= 80) { rv= -1; goto end; } 244 if (ln >= 80) {
245 rv = -1;
246 goto end;
247 }
244 248
245 /* Get char and put it into the buffer */ 249 /* Get char and put it into the buffer */
246 tmp= *(in++); 250 tmp= *(in++);
247 v=conv_ascii2bin(tmp); 251 v = conv_ascii2bin(tmp);
248 /* only save the good data :-) */ 252 /* only save the good data :-) */
249 if (!B64_NOT_BASE64(v)) 253 if (!B64_NOT_BASE64(v)) {
250 {
251 OPENSSL_assert(n < (int)sizeof(ctx->enc_data)); 254 OPENSSL_assert(n < (int)sizeof(ctx->enc_data));
252 d[n++]=tmp; 255 d[n++] = tmp;
253 ln++; 256 ln++;
254 } 257 } else if (v == B64_ERROR) {
255 else if (v == B64_ERROR) 258 rv = -1;
256 {
257 rv= -1;
258 goto end; 259 goto end;
259 } 260 }
260 261
261 /* have we seen a '=' which is 'definitly' the last 262 /* have we seen a '=' which is 'definitly' the last
262 * input line. seof will point to the character that 263 * input line. seof will point to the character that
263 * holds it. and eof will hold how many characters to 264 * holds it. and eof will hold how many characters to
264 * chop off. */ 265 * chop off. */
265 if (tmp == '=') 266 if (tmp == '=') {
266 { 267 if (seof == -1)
267 if (seof == -1) seof=n; 268 seof = n;
268 eof++; 269 eof++;
269 } 270 }
270 271
271 if (v == B64_CR) 272 if (v == B64_CR) {
272 {
273 ln = 0; 273 ln = 0;
274 if (exp_nl) 274 if (exp_nl)
275 continue; 275 continue;
276 } 276 }
277 277
278 /* eoln */ 278 /* eoln */
279 if (v == B64_EOLN) 279 if (v == B64_EOLN) {
280 { 280 ln = 0;
281 ln=0; 281 if (exp_nl) {
282 if (exp_nl) 282 exp_nl = 0;
283 {
284 exp_nl=0;
285 continue; 283 continue;
286 }
287 } 284 }
288 exp_nl=0; 285 }
286 exp_nl = 0;
289 287
290 /* If we are at the end of input and it looks like a 288 /* If we are at the end of input and it looks like a
291 * line, process it. */ 289 * line, process it. */
292 if (((i+1) == inl) && (((n&3) == 0) || eof)) 290 if (((i + 1) == inl) && (((n&3) == 0) || eof)) {
293 { 291 v = B64_EOF;
294 v=B64_EOF;
295 /* In case things were given us in really small 292 /* In case things were given us in really small
296 records (so two '=' were given in separate 293 records (so two '=' were given in separate
297 updates), eof may contain the incorrect number 294 updates), eof may contain the incorrect number
298 of ending bytes to skip, so let's redo the count */ 295 of ending bytes to skip, so let's redo the count */
299 eof = 0; 296 eof = 0;
300 if (d[n-1] == '=') eof++; 297 if (d[n-1] == '=')
301 if (d[n-2] == '=') eof++; 298 eof++;
299 if (d[n-2] == '=')
300 eof++;
302 /* There will never be more than two '=' */ 301 /* There will never be more than two '=' */
303 } 302 }
304 303
305 if ((v == B64_EOF && (n&3) == 0) || (n >= 64)) 304 if ((v == B64_EOF && (n&3) == 0) || (n >= 64)) {
306 {
307 /* This is needed to work correctly on 64 byte input 305 /* This is needed to work correctly on 64 byte input
308 * lines. We process the line and then need to 306 * lines. We process the line and then need to
309 * accept the '\n' */ 307 * accept the '\n' */
310 if ((v != B64_EOF) && (n >= 64)) exp_nl=1; 308 if ((v != B64_EOF) && (n >= 64))
311 if (n > 0) 309 exp_nl = 1;
312 { 310 if (n > 0) {
313 v=EVP_DecodeBlock(out,d,n); 311 v = EVP_DecodeBlock(out, d, n);
314 n=0; 312 n = 0;
315 if (v < 0) { rv=0; goto end; } 313 if (v < 0) {
316 ret+=(v-eof); 314 rv = 0;
317 } 315 goto end;
318 else
319 {
320 eof=1;
321 v=0;
322 } 316 }
317 ret += (v - eof);
318 } else {
319 eof = 1;
320 v = 0;
321 }
323 322
324 /* This is the case where we have had a short 323 /* This is the case where we have had a short
325 * but valid input line */ 324 * but valid input line */
326 if ((v < ctx->length) && eof) 325 if ((v < ctx->length) && eof) {
327 { 326 rv = 0;
328 rv=0;
329 goto end; 327 goto end;
330 } 328 } else
331 else 329 ctx->length = v;
332 ctx->length=v;
333 330
334 if (seof >= 0) { rv=0; goto end; } 331 if (seof >= 0) {
335 out+=v; 332 rv = 0;
333 goto end;
336 } 334 }
335 out += v;
337 } 336 }
338 rv=1;
339end:
340 *outl=ret;
341 ctx->num=n;
342 ctx->line_num=ln;
343 ctx->expect_nl=exp_nl;
344 return(rv);
345 } 337 }
338 rv = 1;
346 339
347int EVP_DecodeBlock(unsigned char *t, const unsigned char *f, int n) 340end:
348 { 341 *outl = ret;
349 int i,ret=0,a,b,c,d; 342 ctx->num = n;
343 ctx->line_num = ln;
344 ctx->expect_nl = exp_nl;
345 return (rv);
346}
347
348int
349EVP_DecodeBlock(unsigned char *t, const unsigned char *f, int n)
350{
351 int i, ret = 0, a,b, c, d;
350 unsigned long l; 352 unsigned long l;
351 353
352 /* trim white space from the start of the line. */ 354 /* trim white space from the start of the line. */
353 while ((conv_ascii2bin(*f) == B64_WS) && (n > 0)) 355 while ((conv_ascii2bin(*f) == B64_WS) && (n > 0)) {
354 {
355 f++; 356 f++;
356 n--; 357 n--;
357 } 358 }
358 359
359 /* strip off stuff at the end of the line 360 /* strip off stuff at the end of the line
360 * ascii2bin values B64_WS, B64_EOLN, B64_EOLN and B64_EOF */ 361 * ascii2bin values B64_WS, B64_EOLN, B64_EOLN and B64_EOF */
361 while ((n > 3) && (B64_NOT_BASE64(conv_ascii2bin(f[n-1])))) 362 while ((n > 3) && (B64_NOT_BASE64(conv_ascii2bin(f[n - 1]))))
362 n--; 363 n--;
363 364
364 if (n%4 != 0) return(-1); 365 if (n % 4 != 0)
365 366 return (-1);
366 for (i=0; i<n; i+=4) 367
367 { 368 for (i = 0; i < n; i += 4) {
368 a=conv_ascii2bin(*(f++)); 369 a = conv_ascii2bin(*(f++));
369 b=conv_ascii2bin(*(f++)); 370 b = conv_ascii2bin(*(f++));
370 c=conv_ascii2bin(*(f++)); 371 c = conv_ascii2bin(*(f++));
371 d=conv_ascii2bin(*(f++)); 372 d = conv_ascii2bin(*(f++));
372 if ( (a & 0x80) || (b & 0x80) || 373 if ((a & 0x80) || (b & 0x80) ||
373 (c & 0x80) || (d & 0x80)) 374 (c & 0x80) || (d & 0x80))
374 return(-1); 375 return (-1);
375 l=( (((unsigned long)a)<<18L)| 376 l = ((((unsigned long)a) << 18L) |
376 (((unsigned long)b)<<12L)| 377 (((unsigned long)b) << 12L) |
377 (((unsigned long)c)<< 6L)| 378 (((unsigned long)c) << 6L) |
378 (((unsigned long)d) )); 379 (((unsigned long)d)));
379 *(t++)=(unsigned char)(l>>16L)&0xff; 380 *(t++) = (unsigned char)(l >> 16L) & 0xff;
380 *(t++)=(unsigned char)(l>> 8L)&0xff; 381 *(t++) = (unsigned char)(l >> 8L) & 0xff;
381 *(t++)=(unsigned char)(l )&0xff; 382 *(t++) = (unsigned char)(l) & 0xff;
382 ret+=3; 383 ret += 3;
383 }
384 return(ret);
385 } 384 }
385 return (ret);
386}
386 387
387int EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl) 388int
388 { 389EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl)
390{
389 int i; 391 int i;
390 392
391 *outl=0; 393 *outl = 0;
392 if (ctx->num != 0) 394 if (ctx->num != 0) {
393 { 395 i = EVP_DecodeBlock(out, ctx->enc_data, ctx->num);
394 i=EVP_DecodeBlock(out,ctx->enc_data,ctx->num); 396 if (i < 0)
395 if (i < 0) return(-1); 397 return (-1);
396 ctx->num=0; 398 ctx->num = 0;
397 *outl=i; 399 *outl = i;
398 return(1); 400 return (1);
399 } 401 } else
400 else 402 return (1);
401 return(1); 403}
402 }
403 404
404#ifdef undef 405#ifdef undef
405int EVP_DecodeValid(unsigned char *buf, int len) 406int
406 { 407EVP_DecodeValid(unsigned char *buf, int len)
407 int i,num=0,bad=0; 408{
408 409 int i, num = 0, bad = 0;
409 if (len == 0) return(-1); 410
410 while (conv_ascii2bin(*buf) == B64_WS) 411 if (len == 0)
411 { 412 return (-1);
413 while (conv_ascii2bin(*buf) == B64_WS) {
412 buf++; 414 buf++;
413 len--; 415 len--;
414 if (len == 0) return(-1); 416 if (len == 0)
415 } 417 return (-1);
418 }
416 419
417 for (i=len; i >= 4; i-=4) 420 for (i = len; i >= 4; i -= 4) {
418 { 421 if ((conv_ascii2bin(buf[0]) >= 0x40) ||
419 if ( (conv_ascii2bin(buf[0]) >= 0x40) || 422 (conv_ascii2bin(buf[1]) >= 0x40) ||
420 (conv_ascii2bin(buf[1]) >= 0x40) || 423 (conv_ascii2bin(buf[2]) >= 0x40) ||
421 (conv_ascii2bin(buf[2]) >= 0x40) || 424 (conv_ascii2bin(buf[3]) >= 0x40))
422 (conv_ascii2bin(buf[3]) >= 0x40)) 425 return (-1);
423 return(-1); 426 buf += 4;
424 buf+=4; 427 num += 1 + (buf[2] != '=') + (buf[3] != '=');
425 num+=1+(buf[2] != '=')+(buf[3] != '='); 428 }
426 }
427 if ((i == 1) && (conv_ascii2bin(buf[0]) == B64_EOLN)) 429 if ((i == 1) && (conv_ascii2bin(buf[0]) == B64_EOLN))
428 return(num); 430 return (num);
429 if ((i == 2) && (conv_ascii2bin(buf[0]) == B64_EOLN) && 431 if ((i == 2) && (conv_ascii2bin(buf[0]) == B64_EOLN) &&
430 (conv_ascii2bin(buf[0]) == B64_EOLN)) 432 (conv_ascii2bin(buf[0]) == B64_EOLN))
431 return(num); 433 return (num);
432 return(1); 434 return (1);
433 } 435}
434#endif 436#endif
diff --git a/src/lib/libcrypto/evp/names.c b/src/lib/libcrypto/evp/names.c
index 6311ad7cfb..b4793b954b 100644
--- a/src/lib/libcrypto/evp/names.c
+++ b/src/lib/libcrypto/evp/names.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
@@ -62,65 +62,77 @@
62#include <openssl/objects.h> 62#include <openssl/objects.h>
63#include <openssl/x509.h> 63#include <openssl/x509.h>
64 64
65int EVP_add_cipher(const EVP_CIPHER *c) 65int
66 { 66EVP_add_cipher(const EVP_CIPHER *c)
67{
67 int r; 68 int r;
68 69
69 if (c == NULL) return 0; 70 if (c == NULL)
71 return 0;
70 72
71 OPENSSL_init(); 73 OPENSSL_init();
72 74
73 r=OBJ_NAME_add(OBJ_nid2sn(c->nid),OBJ_NAME_TYPE_CIPHER_METH,(const char *)c); 75 r = OBJ_NAME_add(OBJ_nid2sn(c->nid), OBJ_NAME_TYPE_CIPHER_METH,
74 if (r == 0) return(0); 76 (const char *)c);
77 if (r == 0)
78 return (0);
75 check_defer(c->nid); 79 check_defer(c->nid);
76 r=OBJ_NAME_add(OBJ_nid2ln(c->nid),OBJ_NAME_TYPE_CIPHER_METH,(const char *)c); 80 r = OBJ_NAME_add(OBJ_nid2ln(c->nid), OBJ_NAME_TYPE_CIPHER_METH,
77 return(r); 81 (const char *)c);
78 } 82 return (r);
79 83}
80 84
81int EVP_add_digest(const EVP_MD *md) 85int
82 { 86EVP_add_digest(const EVP_MD *md)
87{
83 int r; 88 int r;
84 const char *name; 89 const char *name;
90
85 OPENSSL_init(); 91 OPENSSL_init();
86 92
87 name=OBJ_nid2sn(md->type); 93 name = OBJ_nid2sn(md->type);
88 r=OBJ_NAME_add(name,OBJ_NAME_TYPE_MD_METH,(const char *)md); 94 r = OBJ_NAME_add(name, OBJ_NAME_TYPE_MD_METH, (const char *)md);
89 if (r == 0) return(0); 95 if (r == 0)
96 return (0);
90 check_defer(md->type); 97 check_defer(md->type);
91 r=OBJ_NAME_add(OBJ_nid2ln(md->type),OBJ_NAME_TYPE_MD_METH,(const char *)md); 98 r = OBJ_NAME_add(OBJ_nid2ln(md->type), OBJ_NAME_TYPE_MD_METH,
92 if (r == 0) return(0); 99 (const char *)md);
93 100 if (r == 0)
94 if (md->pkey_type && md->type != md->pkey_type) 101 return (0);
95 { 102
96 r=OBJ_NAME_add(OBJ_nid2sn(md->pkey_type), 103 if (md->pkey_type && md->type != md->pkey_type) {
97 OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS,name); 104 r = OBJ_NAME_add(OBJ_nid2sn(md->pkey_type),
98 if (r == 0) return(0); 105 OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS, name);
106 if (r == 0)
107 return (0);
99 check_defer(md->pkey_type); 108 check_defer(md->pkey_type);
100 r=OBJ_NAME_add(OBJ_nid2ln(md->pkey_type), 109 r = OBJ_NAME_add(OBJ_nid2ln(md->pkey_type),
101 OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS,name); 110 OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS, name);
102 }
103 return(r);
104 } 111 }
112 return (r);
113}
105 114
106const EVP_CIPHER *EVP_get_cipherbyname(const char *name) 115const EVP_CIPHER *
107 { 116EVP_get_cipherbyname(const char *name)
117{
108 const EVP_CIPHER *cp; 118 const EVP_CIPHER *cp;
109 119
110 cp=(const EVP_CIPHER *)OBJ_NAME_get(name,OBJ_NAME_TYPE_CIPHER_METH); 120 cp = (const EVP_CIPHER *)OBJ_NAME_get(name, OBJ_NAME_TYPE_CIPHER_METH);
111 return(cp); 121 return (cp);
112 } 122}
113 123
114const EVP_MD *EVP_get_digestbyname(const char *name) 124const EVP_MD *
115 { 125EVP_get_digestbyname(const char *name)
126{
116 const EVP_MD *cp; 127 const EVP_MD *cp;
117 128
118 cp=(const EVP_MD *)OBJ_NAME_get(name,OBJ_NAME_TYPE_MD_METH); 129 cp = (const EVP_MD *)OBJ_NAME_get(name, OBJ_NAME_TYPE_MD_METH);
119 return(cp); 130 return (cp);
120 } 131}
121 132
122void EVP_cleanup(void) 133void
123 { 134EVP_cleanup(void)
135{
124 OBJ_NAME_cleanup(OBJ_NAME_TYPE_CIPHER_METH); 136 OBJ_NAME_cleanup(OBJ_NAME_TYPE_CIPHER_METH);
125 OBJ_NAME_cleanup(OBJ_NAME_TYPE_MD_METH); 137 OBJ_NAME_cleanup(OBJ_NAME_TYPE_MD_METH);
126 /* The above calls will only clean out the contents of the name 138 /* The above calls will only clean out the contents of the name
@@ -129,78 +141,88 @@ void EVP_cleanup(void)
129 OBJ_NAME_cleanup(-1); 141 OBJ_NAME_cleanup(-1);
130 142
131 EVP_PBE_cleanup(); 143 EVP_PBE_cleanup();
132 if (obj_cleanup_defer == 2) 144 if (obj_cleanup_defer == 2) {
133 {
134 obj_cleanup_defer = 0; 145 obj_cleanup_defer = 0;
135 OBJ_cleanup(); 146 OBJ_cleanup();
136 }
137 OBJ_sigid_free();
138 } 147 }
148 OBJ_sigid_free();
149}
139 150
140struct doall_cipher 151struct doall_cipher {
141 {
142 void *arg; 152 void *arg;
143 void (*fn)(const EVP_CIPHER *ciph, 153 void (*fn)(const EVP_CIPHER *ciph, const char *from, const char *to,
144 const char *from, const char *to, void *arg); 154 void *arg);
145 }; 155};
146 156
147static void do_all_cipher_fn(const OBJ_NAME *nm, void *arg) 157static void
148 { 158do_all_cipher_fn(const OBJ_NAME *nm, void *arg)
159{
149 struct doall_cipher *dc = arg; 160 struct doall_cipher *dc = arg;
161
150 if (nm->alias) 162 if (nm->alias)
151 dc->fn(NULL, nm->name, nm->data, dc->arg); 163 dc->fn(NULL, nm->name, nm->data, dc->arg);
152 else 164 else
153 dc->fn((const EVP_CIPHER *)nm->data, nm->name, NULL, dc->arg); 165 dc->fn((const EVP_CIPHER *)nm->data, nm->name, NULL, dc->arg);
154 } 166}
155 167
156void EVP_CIPHER_do_all(void (*fn)(const EVP_CIPHER *ciph, 168void
157 const char *from, const char *to, void *x), void *arg) 169EVP_CIPHER_do_all(void (*fn)(const EVP_CIPHER *ciph, const char *from,
158 { 170 const char *to, void *x), void *arg)
171{
159 struct doall_cipher dc; 172 struct doall_cipher dc;
173
160 dc.fn = fn; 174 dc.fn = fn;
161 dc.arg = arg; 175 dc.arg = arg;
162 OBJ_NAME_do_all(OBJ_NAME_TYPE_CIPHER_METH, do_all_cipher_fn, &dc); 176 OBJ_NAME_do_all(OBJ_NAME_TYPE_CIPHER_METH, do_all_cipher_fn, &dc);
163 } 177}
164 178
165void EVP_CIPHER_do_all_sorted(void (*fn)(const EVP_CIPHER *ciph, 179void
166 const char *from, const char *to, void *x), void *arg) 180EVP_CIPHER_do_all_sorted(void (*fn)(const EVP_CIPHER *ciph, const char *from,
167 { 181 const char *to, void *x), void *arg)
182{
168 struct doall_cipher dc; 183 struct doall_cipher dc;
184
169 dc.fn = fn; 185 dc.fn = fn;
170 dc.arg = arg; 186 dc.arg = arg;
171 OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_CIPHER_METH, do_all_cipher_fn,&dc); 187 OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_CIPHER_METH,
172 } 188 do_all_cipher_fn, &dc);
189}
173 190
174struct doall_md 191struct doall_md {
175 {
176 void *arg; 192 void *arg;
177 void (*fn)(const EVP_MD *ciph, 193 void (*fn)(const EVP_MD *ciph, const char *from, const char *to,
178 const char *from, const char *to, void *arg); 194 void *arg);
179 }; 195};
180 196
181static void do_all_md_fn(const OBJ_NAME *nm, void *arg) 197static void
182 { 198do_all_md_fn(const OBJ_NAME *nm, void *arg)
199{
183 struct doall_md *dc = arg; 200 struct doall_md *dc = arg;
201
184 if (nm->alias) 202 if (nm->alias)
185 dc->fn(NULL, nm->name, nm->data, dc->arg); 203 dc->fn(NULL, nm->name, nm->data, dc->arg);
186 else 204 else
187 dc->fn((const EVP_MD *)nm->data, nm->name, NULL, dc->arg); 205 dc->fn((const EVP_MD *)nm->data, nm->name, NULL, dc->arg);
188 } 206}
189 207
190void EVP_MD_do_all(void (*fn)(const EVP_MD *md, 208void
191 const char *from, const char *to, void *x), void *arg) 209EVP_MD_do_all(void (*fn)(const EVP_MD *md, const char *from, const char *to,
192 { 210 void *x), void *arg)
211{
193 struct doall_md dc; 212 struct doall_md dc;
213
194 dc.fn = fn; 214 dc.fn = fn;
195 dc.arg = arg; 215 dc.arg = arg;
196 OBJ_NAME_do_all(OBJ_NAME_TYPE_MD_METH, do_all_md_fn, &dc); 216 OBJ_NAME_do_all(OBJ_NAME_TYPE_MD_METH, do_all_md_fn, &dc);
197 } 217}
198 218
199void EVP_MD_do_all_sorted(void (*fn)(const EVP_MD *md, 219void
200 const char *from, const char *to, void *x), void *arg) 220EVP_MD_do_all_sorted(void (*fn)(const EVP_MD *md,
201 { 221 const char *from, const char *to, void *x), void *arg)
222{
202 struct doall_md dc; 223 struct doall_md dc;
224
203 dc.fn = fn; 225 dc.fn = fn;
204 dc.arg = arg; 226 dc.arg = arg;
205 OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_MD_METH, do_all_md_fn, &dc); 227 OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_MD_METH, do_all_md_fn, &dc);
206 } 228}
diff --git a/src/lib/libssl/src/crypto/evp/c_all.c b/src/lib/libssl/src/crypto/evp/c_all.c
index 766c4cecdf..0596484742 100644
--- a/src/lib/libssl/src/crypto/evp/c_all.c
+++ b/src/lib/libssl/src/crypto/evp/c_all.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
@@ -66,14 +66,16 @@
66#if 0 66#if 0
67#undef OpenSSL_add_all_algorithms 67#undef OpenSSL_add_all_algorithms
68 68
69void OpenSSL_add_all_algorithms(void) 69void
70 { 70OpenSSL_add_all_algorithms(void)
71{
71 OPENSSL_add_all_algorithms_noconf(); 72 OPENSSL_add_all_algorithms_noconf();
72 } 73}
73#endif 74#endif
74 75
75void OPENSSL_add_all_algorithms_noconf(void) 76void
76 { 77OPENSSL_add_all_algorithms_noconf(void)
78{
77 /* 79 /*
78 * For the moment OPENSSL_cpuid_setup does something 80 * For the moment OPENSSL_cpuid_setup does something
79 * only on IA-32, but we reserve the option for all 81 * only on IA-32, but we reserve the option for all
@@ -87,4 +89,4 @@ void OPENSSL_add_all_algorithms_noconf(void)
87 ENGINE_setup_bsd_cryptodev(); 89 ENGINE_setup_bsd_cryptodev();
88# endif 90# endif
89#endif 91#endif
90 } 92}
diff --git a/src/lib/libssl/src/crypto/evp/digest.c b/src/lib/libssl/src/crypto/evp/digest.c
index 2fae68ef5e..238030820c 100644
--- a/src/lib/libssl/src/crypto/evp/digest.c
+++ b/src/lib/libssl/src/crypto/evp/digest.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
@@ -63,7 +63,7 @@
63 * are met: 63 * are met:
64 * 64 *
65 * 1. Redistributions of source code must retain the above copyright 65 * 1. Redistributions of source code must retain the above copyright
66 * notice, this list of conditions and the following disclaimer. 66 * notice, this list of conditions and the following disclaimer.
67 * 67 *
68 * 2. Redistributions in binary form must reproduce the above copyright 68 * 2. Redistributions in binary form must reproduce the above copyright
69 * notice, this list of conditions and the following disclaimer in 69 * notice, this list of conditions and the following disclaimer in
@@ -117,264 +117,257 @@
117#include <openssl/engine.h> 117#include <openssl/engine.h>
118#endif 118#endif
119 119
120void EVP_MD_CTX_init(EVP_MD_CTX *ctx) 120void
121 { 121EVP_MD_CTX_init(EVP_MD_CTX *ctx)
122 memset(ctx,'\0',sizeof *ctx); 122{
123 } 123 memset(ctx, '\0', sizeof *ctx);
124}
124 125
125EVP_MD_CTX *EVP_MD_CTX_create(void) 126EVP_MD_CTX *
126 { 127EVP_MD_CTX_create(void)
127 EVP_MD_CTX *ctx=malloc(sizeof *ctx); 128{
129 EVP_MD_CTX *ctx = malloc(sizeof *ctx);
128 130
129 if (ctx) 131 if (ctx)
130 EVP_MD_CTX_init(ctx); 132 EVP_MD_CTX_init(ctx);
131 133
132 return ctx; 134 return ctx;
133 } 135}
134 136
135int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type) 137int
136 { 138EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type)
139{
137 EVP_MD_CTX_init(ctx); 140 EVP_MD_CTX_init(ctx);
138 return EVP_DigestInit_ex(ctx, type, NULL); 141 return EVP_DigestInit_ex(ctx, type, NULL);
139 } 142}
143
144int
145EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl)
146{
147 EVP_MD_CTX_clear_flags(ctx, EVP_MD_CTX_FLAG_CLEANED);
140 148
141int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl)
142 {
143 EVP_MD_CTX_clear_flags(ctx,EVP_MD_CTX_FLAG_CLEANED);
144#ifndef OPENSSL_NO_ENGINE 149#ifndef OPENSSL_NO_ENGINE
145 /* Whether it's nice or not, "Inits" can be used on "Final"'d contexts 150 /* Whether it's nice or not, "Inits" can be used on "Final"'d contexts
146 * so this context may already have an ENGINE! Try to avoid releasing 151 * so this context may already have an ENGINE! Try to avoid releasing
147 * the previous handle, re-querying for an ENGINE, and having a 152 * the previous handle, re-querying for an ENGINE, and having a
148 * reinitialisation, when it may all be unecessary. */ 153 * reinitialisation, when it may all be unecessary. */
149 if (ctx->engine && ctx->digest && (!type || 154 if (ctx->engine && ctx->digest && (!type ||
150 (type && (type->type == ctx->digest->type)))) 155 (type && (type->type == ctx->digest->type))))
151 goto skip_to_init; 156 goto skip_to_init;
152 if (type) 157 if (type) {
153 {
154 /* Ensure an ENGINE left lying around from last time is cleared 158 /* Ensure an ENGINE left lying around from last time is cleared
155 * (the previous check attempted to avoid this if the same 159 * (the previous check attempted to avoid this if the same
156 * ENGINE and EVP_MD could be used). */ 160 * ENGINE and EVP_MD could be used). */
157 if(ctx->engine) 161 if (ctx->engine)
158 ENGINE_finish(ctx->engine); 162 ENGINE_finish(ctx->engine);
159 if(impl) 163 if (impl) {
160 { 164 if (!ENGINE_init(impl)) {
161 if (!ENGINE_init(impl)) 165 EVPerr(EVP_F_EVP_DIGESTINIT_EX,
162 { 166 EVP_R_INITIALIZATION_ERROR);
163 EVPerr(EVP_F_EVP_DIGESTINIT_EX,EVP_R_INITIALIZATION_ERROR);
164 return 0; 167 return 0;
165 }
166 } 168 }
167 else 169 } else
168 /* Ask if an ENGINE is reserved for this job */ 170 /* Ask if an ENGINE is reserved for this job */
169 impl = ENGINE_get_digest_engine(type->type); 171 impl = ENGINE_get_digest_engine(type->type);
170 if(impl) 172 if (impl) {
171 {
172 /* There's an ENGINE for this job ... (apparently) */ 173 /* There's an ENGINE for this job ... (apparently) */
173 const EVP_MD *d = ENGINE_get_digest(impl, type->type); 174 const EVP_MD *d = ENGINE_get_digest(impl, type->type);
174 if(!d) 175 if (!d) {
175 {
176 /* Same comment from evp_enc.c */ 176 /* Same comment from evp_enc.c */
177 EVPerr(EVP_F_EVP_DIGESTINIT_EX,EVP_R_INITIALIZATION_ERROR); 177 EVPerr(EVP_F_EVP_DIGESTINIT_EX,
178 EVP_R_INITIALIZATION_ERROR);
178 ENGINE_finish(impl); 179 ENGINE_finish(impl);
179 return 0; 180 return 0;
180 } 181 }
181 /* We'll use the ENGINE's private digest definition */ 182 /* We'll use the ENGINE's private digest definition */
182 type = d; 183 type = d;
183 /* Store the ENGINE functional reference so we know 184 /* Store the ENGINE functional reference so we know
184 * 'type' came from an ENGINE and we need to release 185 * 'type' came from an ENGINE and we need to release
185 * it when done. */ 186 * it when done. */
186 ctx->engine = impl; 187 ctx->engine = impl;
187 } 188 } else
188 else
189 ctx->engine = NULL; 189 ctx->engine = NULL;
190 } 190 } else if (!ctx->digest) {
191 else 191 EVPerr(EVP_F_EVP_DIGESTINIT_EX, EVP_R_NO_DIGEST_SET);
192 if(!ctx->digest)
193 {
194 EVPerr(EVP_F_EVP_DIGESTINIT_EX,EVP_R_NO_DIGEST_SET);
195 return 0; 192 return 0;
196 } 193 }
197#endif 194#endif
198 if (ctx->digest != type) 195 if (ctx->digest != type) {
199 {
200 if (ctx->digest && ctx->digest->ctx_size) 196 if (ctx->digest && ctx->digest->ctx_size)
201 free(ctx->md_data); 197 free(ctx->md_data);
202 ctx->digest=type; 198 ctx->digest = type;
203 if (!(ctx->flags & EVP_MD_CTX_FLAG_NO_INIT) && type->ctx_size) 199 if (!(ctx->flags & EVP_MD_CTX_FLAG_NO_INIT) && type->ctx_size) {
204 {
205 ctx->update = type->update; 200 ctx->update = type->update;
206 ctx->md_data=malloc(type->ctx_size); 201 ctx->md_data = malloc(type->ctx_size);
207 if (ctx->md_data == NULL) 202 if (ctx->md_data == NULL) {
208 {
209 EVPerr(EVP_F_EVP_DIGESTINIT_EX, 203 EVPerr(EVP_F_EVP_DIGESTINIT_EX,
210 ERR_R_MALLOC_FAILURE); 204 ERR_R_MALLOC_FAILURE);
211 return 0; 205 return 0;
212 }
213 } 206 }
214 } 207 }
208 }
215#ifndef OPENSSL_NO_ENGINE 209#ifndef OPENSSL_NO_ENGINE
216skip_to_init: 210skip_to_init:
217#endif 211#endif
218 if (ctx->pctx) 212 if (ctx->pctx) {
219 {
220 int r; 213 int r;
221 r = EVP_PKEY_CTX_ctrl(ctx->pctx, -1, EVP_PKEY_OP_TYPE_SIG, 214 r = EVP_PKEY_CTX_ctrl(ctx->pctx, -1, EVP_PKEY_OP_TYPE_SIG,
222 EVP_PKEY_CTRL_DIGESTINIT, 0, ctx); 215 EVP_PKEY_CTRL_DIGESTINIT, 0, ctx);
223 if (r <= 0 && (r != -2)) 216 if (r <= 0 && (r != -2))
224 return 0; 217 return 0;
225 } 218 }
226 if (ctx->flags & EVP_MD_CTX_FLAG_NO_INIT) 219 if (ctx->flags & EVP_MD_CTX_FLAG_NO_INIT)
227 return 1; 220 return 1;
228 return ctx->digest->init(ctx); 221 return ctx->digest->init(ctx);
229 } 222}
230 223
231int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data, size_t count) 224int
232 { 225EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data, size_t count)
233 return ctx->update(ctx,data,count); 226{
234 } 227 return ctx->update(ctx, data, count);
228}
235 229
236/* The caller can assume that this removes any secret data from the context */ 230/* The caller can assume that this removes any secret data from the context */
237int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size) 231int
238 { 232EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size)
233{
239 int ret; 234 int ret;
235
240 ret = EVP_DigestFinal_ex(ctx, md, size); 236 ret = EVP_DigestFinal_ex(ctx, md, size);
241 EVP_MD_CTX_cleanup(ctx); 237 EVP_MD_CTX_cleanup(ctx);
242 return ret; 238 return ret;
243 } 239}
244 240
245/* The caller can assume that this removes any secret data from the context */ 241/* The caller can assume that this removes any secret data from the context */
246int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size) 242int
247 { 243EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size)
244{
248 int ret; 245 int ret;
249 246
250 OPENSSL_assert(ctx->digest->md_size <= EVP_MAX_MD_SIZE); 247 OPENSSL_assert(ctx->digest->md_size <= EVP_MAX_MD_SIZE);
251 ret=ctx->digest->final(ctx,md); 248 ret = ctx->digest->final(ctx, md);
252 if (size != NULL) 249 if (size != NULL)
253 *size=ctx->digest->md_size; 250 *size = ctx->digest->md_size;
254 if (ctx->digest->cleanup) 251 if (ctx->digest->cleanup) {
255 {
256 ctx->digest->cleanup(ctx); 252 ctx->digest->cleanup(ctx);
257 EVP_MD_CTX_set_flags(ctx,EVP_MD_CTX_FLAG_CLEANED); 253 EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_CLEANED);
258 }
259 memset(ctx->md_data,0,ctx->digest->ctx_size);
260 return ret;
261 } 254 }
255 memset(ctx->md_data, 0, ctx->digest->ctx_size);
256 return ret;
257}
262 258
263int EVP_MD_CTX_copy(EVP_MD_CTX *out, const EVP_MD_CTX *in) 259int
264 { 260EVP_MD_CTX_copy(EVP_MD_CTX *out, const EVP_MD_CTX *in)
261{
265 EVP_MD_CTX_init(out); 262 EVP_MD_CTX_init(out);
266 return EVP_MD_CTX_copy_ex(out, in); 263 return EVP_MD_CTX_copy_ex(out, in);
267 } 264}
268 265
269int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in) 266int
270 { 267EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in)
268{
271 unsigned char *tmp_buf; 269 unsigned char *tmp_buf;
272 if ((in == NULL) || (in->digest == NULL)) 270
273 { 271 if ((in == NULL) || (in->digest == NULL)) {
274 EVPerr(EVP_F_EVP_MD_CTX_COPY_EX,EVP_R_INPUT_NOT_INITIALIZED); 272 EVPerr(EVP_F_EVP_MD_CTX_COPY_EX, EVP_R_INPUT_NOT_INITIALIZED);
275 return 0; 273 return 0;
276 } 274 }
277#ifndef OPENSSL_NO_ENGINE 275#ifndef OPENSSL_NO_ENGINE
278 /* Make sure it's safe to copy a digest context using an ENGINE */ 276 /* Make sure it's safe to copy a digest context using an ENGINE */
279 if (in->engine && !ENGINE_init(in->engine)) 277 if (in->engine && !ENGINE_init(in->engine)) {
280 { 278 EVPerr(EVP_F_EVP_MD_CTX_COPY_EX, ERR_R_ENGINE_LIB);
281 EVPerr(EVP_F_EVP_MD_CTX_COPY_EX,ERR_R_ENGINE_LIB);
282 return 0; 279 return 0;
283 } 280 }
284#endif 281#endif
285 282
286 if (out->digest == in->digest) 283 if (out->digest == in->digest) {
287 {
288 tmp_buf = out->md_data; 284 tmp_buf = out->md_data;
289 EVP_MD_CTX_set_flags(out,EVP_MD_CTX_FLAG_REUSE); 285 EVP_MD_CTX_set_flags(out, EVP_MD_CTX_FLAG_REUSE);
290 } 286 } else
291 else tmp_buf = NULL; 287 tmp_buf = NULL;
292 EVP_MD_CTX_cleanup(out); 288 EVP_MD_CTX_cleanup(out);
293 memcpy(out,in,sizeof *out); 289 memcpy(out, in, sizeof *out);
294 290
295 if (in->md_data && out->digest->ctx_size) 291 if (in->md_data && out->digest->ctx_size) {
296 {
297 if (tmp_buf) 292 if (tmp_buf)
298 out->md_data = tmp_buf; 293 out->md_data = tmp_buf;
299 else 294 else {
300 { 295 out->md_data = malloc(out->digest->ctx_size);
301 out->md_data=malloc(out->digest->ctx_size); 296 if (!out->md_data) {
302 if (!out->md_data) 297 EVPerr(EVP_F_EVP_MD_CTX_COPY_EX,
303 { 298 ERR_R_MALLOC_FAILURE);
304 EVPerr(EVP_F_EVP_MD_CTX_COPY_EX,ERR_R_MALLOC_FAILURE);
305 return 0; 299 return 0;
306 }
307 } 300 }
308 memcpy(out->md_data,in->md_data,out->digest->ctx_size);
309 } 301 }
302 memcpy(out->md_data, in->md_data, out->digest->ctx_size);
303 }
310 304
311 out->update = in->update; 305 out->update = in->update;
312 306
313 if (in->pctx) 307 if (in->pctx) {
314 {
315 out->pctx = EVP_PKEY_CTX_dup(in->pctx); 308 out->pctx = EVP_PKEY_CTX_dup(in->pctx);
316 if (!out->pctx) 309 if (!out->pctx) {
317 {
318 EVP_MD_CTX_cleanup(out); 310 EVP_MD_CTX_cleanup(out);
319 return 0; 311 return 0;
320 }
321 } 312 }
313 }
322 314
323 if (out->digest->copy) 315 if (out->digest->copy)
324 return out->digest->copy(out,in); 316 return out->digest->copy(out, in);
325 317
326 return 1; 318 return 1;
327 } 319}
328 320
329int EVP_Digest(const void *data, size_t count, 321int
330 unsigned char *md, unsigned int *size, const EVP_MD *type, ENGINE *impl) 322EVP_Digest(const void *data, size_t count,
331 { 323 unsigned char *md, unsigned int *size, const EVP_MD *type, ENGINE *impl)
324{
332 EVP_MD_CTX ctx; 325 EVP_MD_CTX ctx;
333 int ret; 326 int ret;
334 327
335 EVP_MD_CTX_init(&ctx); 328 EVP_MD_CTX_init(&ctx);
336 EVP_MD_CTX_set_flags(&ctx,EVP_MD_CTX_FLAG_ONESHOT); 329 EVP_MD_CTX_set_flags(&ctx, EVP_MD_CTX_FLAG_ONESHOT);
337 ret=EVP_DigestInit_ex(&ctx, type, impl) 330 ret = EVP_DigestInit_ex(&ctx, type, impl) &&
338 && EVP_DigestUpdate(&ctx, data, count) 331 EVP_DigestUpdate(&ctx, data, count) &&
339 && EVP_DigestFinal_ex(&ctx, md, size); 332 EVP_DigestFinal_ex(&ctx, md, size);
340 EVP_MD_CTX_cleanup(&ctx); 333 EVP_MD_CTX_cleanup(&ctx);
341 334
342 return ret; 335 return ret;
343 } 336}
344 337
345void EVP_MD_CTX_destroy(EVP_MD_CTX *ctx) 338void
346 { 339EVP_MD_CTX_destroy(EVP_MD_CTX *ctx)
347 if (ctx) 340{
348 { 341 if (ctx) {
349 EVP_MD_CTX_cleanup(ctx); 342 EVP_MD_CTX_cleanup(ctx);
350 free(ctx); 343 free(ctx);
351 }
352 } 344 }
345}
353 346
354/* This call frees resources associated with the context */ 347/* This call frees resources associated with the context */
355int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx) 348int
356 { 349EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx)
350{
357 /* Don't assume ctx->md_data was cleaned in EVP_Digest_Final, 351 /* Don't assume ctx->md_data was cleaned in EVP_Digest_Final,
358 * because sometimes only copies of the context are ever finalised. 352 * because sometimes only copies of the context are ever finalised.
359 */ 353 */
360 if (ctx->digest && ctx->digest->cleanup 354 if (ctx->digest && ctx->digest->cleanup &&
361 && !EVP_MD_CTX_test_flags(ctx,EVP_MD_CTX_FLAG_CLEANED)) 355 !EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_CLEANED))
362 ctx->digest->cleanup(ctx); 356 ctx->digest->cleanup(ctx);
363 if (ctx->digest && ctx->digest->ctx_size && ctx->md_data 357 if (ctx->digest && ctx->digest->ctx_size && ctx->md_data &&
364 && !EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_REUSE)) 358 !EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_REUSE)) {
365 { 359 OPENSSL_cleanse(ctx->md_data, ctx->digest->ctx_size);
366 OPENSSL_cleanse(ctx->md_data,ctx->digest->ctx_size);
367 free(ctx->md_data); 360 free(ctx->md_data);
368 } 361 }
369 if (ctx->pctx) 362 if (ctx->pctx)
370 EVP_PKEY_CTX_free(ctx->pctx); 363 EVP_PKEY_CTX_free(ctx->pctx);
371#ifndef OPENSSL_NO_ENGINE 364#ifndef OPENSSL_NO_ENGINE
372 if(ctx->engine) 365 if (ctx->engine)
373 /* The EVP_MD we used belongs to an ENGINE, release the 366 /* The EVP_MD we used belongs to an ENGINE, release the
374 * functional reference we held for this reason. */ 367 * functional reference we held for this reason. */
375 ENGINE_finish(ctx->engine); 368 ENGINE_finish(ctx->engine);
376#endif 369#endif
377 memset(ctx,'\0',sizeof *ctx); 370 memset(ctx, '\0', sizeof *ctx);
378 371
379 return 1; 372 return 1;
380 } 373}
diff --git a/src/lib/libssl/src/crypto/evp/encode.c b/src/lib/libssl/src/crypto/evp/encode.c
index 7af9a2780b..dca5ffdcf4 100644
--- a/src/lib/libssl/src/crypto/evp/encode.c
+++ b/src/lib/libssl/src/crypto/evp/encode.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
@@ -74,7 +74,7 @@
74#define CHUNKS_PER_LINE (64/4) 74#define CHUNKS_PER_LINE (64/4)
75#define CHAR_PER_LINE (64+1) 75#define CHAR_PER_LINE (64+1)
76 76
77static const unsigned char data_bin2ascii[65]="ABCDEFGHIJKLMNOPQRSTUVWXYZ\ 77static const unsigned char data_bin2ascii[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\
78abcdefghijklmnopqrstuvwxyz0123456789+/"; 78abcdefghijklmnopqrstuvwxyz0123456789+/";
79 79
80/* 0xF0 is a EOLN 80/* 0xF0 is a EOLN
@@ -91,344 +91,346 @@ abcdefghijklmnopqrstuvwxyz0123456789+/";
91#define B64_ERROR 0xFF 91#define B64_ERROR 0xFF
92#define B64_NOT_BASE64(a) (((a)|0x13) == 0xF3) 92#define B64_NOT_BASE64(a) (((a)|0x13) == 0xF3)
93 93
94static const unsigned char data_ascii2bin[128]={ 94static const unsigned char data_ascii2bin[128] = {
95 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 95 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
96 0xFF,0xE0,0xF0,0xFF,0xFF,0xF1,0xFF,0xFF, 96 0xFF, 0xE0, 0xF0, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF,
97 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 97 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
98 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 98 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
99 0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 99 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
100 0xFF,0xFF,0xFF,0x3E,0xFF,0xF2,0xFF,0x3F, 100 0xFF, 0xFF, 0xFF, 0x3E, 0xFF, 0xF2, 0xFF, 0x3F,
101 0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B, 101 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B,
102 0x3C,0x3D,0xFF,0xFF,0xFF,0x00,0xFF,0xFF, 102 0x3C, 0x3D, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF,
103 0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06, 103 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
104 0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E, 104 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,
105 0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16, 105 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
106 0x17,0x18,0x19,0xFF,0xFF,0xFF,0xFF,0xFF, 106 0x17, 0x18, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
107 0xFF,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20, 107 0xFF, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20,
108 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, 108 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
109 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30, 109 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30,
110 0x31,0x32,0x33,0xFF,0xFF,0xFF,0xFF,0xFF, 110 0x31, 0x32, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
111 }; 111};
112 112
113void EVP_EncodeInit(EVP_ENCODE_CTX *ctx) 113void
114 { 114EVP_EncodeInit(EVP_ENCODE_CTX *ctx)
115 ctx->length=48; 115{
116 ctx->num=0; 116 ctx->length = 48;
117 ctx->line_num=0; 117 ctx->num = 0;
118 } 118 ctx->line_num = 0;
119 119}
120void EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl, 120
121 const unsigned char *in, int inl) 121void
122 { 122EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl,
123 int i,j; 123 const unsigned char *in, int inl)
124 unsigned int total=0; 124{
125 125 int i, j;
126 *outl=0; 126 unsigned int total = 0;
127 if (inl == 0) return; 127
128 *outl = 0;
129 if (inl == 0)
130 return;
128 OPENSSL_assert(ctx->length <= (int)sizeof(ctx->enc_data)); 131 OPENSSL_assert(ctx->length <= (int)sizeof(ctx->enc_data));
129 if ((ctx->num+inl) < ctx->length) 132 if ((ctx->num + inl) < ctx->length) {
130 { 133 memcpy(&(ctx->enc_data[ctx->num]), in, inl);
131 memcpy(&(ctx->enc_data[ctx->num]),in,inl); 134 ctx->num += inl;
132 ctx->num+=inl;
133 return; 135 return;
134 }
135 if (ctx->num != 0)
136 {
137 i=ctx->length-ctx->num;
138 memcpy(&(ctx->enc_data[ctx->num]),in,i);
139 in+=i;
140 inl-=i;
141 j=EVP_EncodeBlock(out,ctx->enc_data,ctx->length);
142 ctx->num=0;
143 out+=j;
144 *(out++)='\n';
145 *out='\0';
146 total=j+1;
147 }
148 while (inl >= ctx->length)
149 {
150 j=EVP_EncodeBlock(out,in,ctx->length);
151 in+=ctx->length;
152 inl-=ctx->length;
153 out+=j;
154 *(out++)='\n';
155 *out='\0';
156 total+=j+1;
157 }
158 if (inl != 0)
159 memcpy(&(ctx->enc_data[0]),in,inl);
160 ctx->num=inl;
161 *outl=total;
162 } 136 }
163 137 if (ctx->num != 0) {
164void EVP_EncodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl) 138 i = ctx->length - ctx->num;
165 { 139 memcpy(&(ctx->enc_data[ctx->num]), in, i);
166 unsigned int ret=0; 140 in += i;
167 141 inl -= i;
168 if (ctx->num != 0) 142 j = EVP_EncodeBlock(out, ctx->enc_data, ctx->length);
169 { 143 ctx->num = 0;
170 ret=EVP_EncodeBlock(out,ctx->enc_data,ctx->num); 144 out += j;
171 out[ret++]='\n'; 145 *(out++) = '\n';
172 out[ret]='\0'; 146 *out = '\0';
173 ctx->num=0; 147 total = j + 1;
174 } 148 }
175 *outl=ret; 149 while (inl >= ctx->length) {
150 j = EVP_EncodeBlock(out, in, ctx->length);
151 in += ctx->length;
152 inl -= ctx->length;
153 out += j;
154 *(out++) = '\n';
155 *out = '\0';
156 total += j + 1;
157 }
158 if (inl != 0)
159 memcpy(&(ctx->enc_data[0]), in, inl);
160 ctx->num = inl;
161 *outl = total;
162}
163
164void
165EVP_EncodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl)
166{
167 unsigned int ret = 0;
168
169 if (ctx->num != 0) {
170 ret = EVP_EncodeBlock(out, ctx->enc_data, ctx->num);
171 out[ret++] = '\n';
172 out[ret] = '\0';
173 ctx->num = 0;
176 } 174 }
175 *outl = ret;
176}
177 177
178int EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int dlen) 178int
179 { 179EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int dlen)
180 int i,ret=0; 180{
181 int i, ret = 0;
181 unsigned long l; 182 unsigned long l;
182 183
183 for (i=dlen; i > 0; i-=3) 184 for (i = dlen; i > 0; i -= 3) {
184 { 185 if (i >= 3) {
185 if (i >= 3) 186 l = (((unsigned long)f[0]) << 16L) |
186 { 187 (((unsigned long)f[1]) << 8L) | f[2];
187 l= (((unsigned long)f[0])<<16L)| 188 *(t++) = conv_bin2ascii(l >> 18L);
188 (((unsigned long)f[1])<< 8L)|f[2]; 189 *(t++) = conv_bin2ascii(l >> 12L);
189 *(t++)=conv_bin2ascii(l>>18L); 190 *(t++) = conv_bin2ascii(l >> 6L);
190 *(t++)=conv_bin2ascii(l>>12L); 191 *(t++) = conv_bin2ascii(l );
191 *(t++)=conv_bin2ascii(l>> 6L); 192 } else {
192 *(t++)=conv_bin2ascii(l ); 193 l = ((unsigned long)f[0]) << 16L;
193 } 194 if (i == 2)
194 else 195 l |= ((unsigned long)f[1] << 8L);
195 { 196
196 l=((unsigned long)f[0])<<16L; 197 *(t++) = conv_bin2ascii(l >> 18L);
197 if (i == 2) l|=((unsigned long)f[1]<<8L); 198 *(t++) = conv_bin2ascii(l >> 12L);
198 199 *(t++) = (i == 1) ? '=' : conv_bin2ascii(l >> 6L);
199 *(t++)=conv_bin2ascii(l>>18L); 200 *(t++) = '=';
200 *(t++)=conv_bin2ascii(l>>12L);
201 *(t++)=(i == 1)?'=':conv_bin2ascii(l>> 6L);
202 *(t++)='=';
203 }
204 ret+=4;
205 f+=3;
206 } 201 }
207 202 ret += 4;
208 *t='\0'; 203 f += 3;
209 return(ret);
210 } 204 }
211 205
212void EVP_DecodeInit(EVP_ENCODE_CTX *ctx) 206 *t = '\0';
213 { 207 return (ret);
214 ctx->length=30; 208}
215 ctx->num=0; 209
216 ctx->line_num=0; 210void
217 ctx->expect_nl=0; 211EVP_DecodeInit(EVP_ENCODE_CTX *ctx)
218 } 212{
213 ctx->length = 30;
214 ctx->num = 0;
215 ctx->line_num = 0;
216 ctx->expect_nl = 0;
217}
219 218
220/* -1 for error 219/* -1 for error
221 * 0 for last line 220 * 0 for last line
222 * 1 for full line 221 * 1 for full line
223 */ 222 */
224int EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl, 223int
225 const unsigned char *in, int inl) 224EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl,
226 { 225 const unsigned char *in, int inl)
227 int seof= -1,eof=0,rv= -1,ret=0,i,v,tmp,n,ln,exp_nl; 226{
227 int seof = -1, eof = 0, rv = -1, ret = 0, i,v, tmp, n,ln, exp_nl;
228 unsigned char *d; 228 unsigned char *d;
229 229
230 n=ctx->num; 230 n = ctx->num;
231 d=ctx->enc_data; 231 d = ctx->enc_data;
232 ln=ctx->line_num; 232 ln = ctx->line_num;
233 exp_nl=ctx->expect_nl; 233 exp_nl = ctx->expect_nl;
234 234
235 /* last line of input. */ 235 /* last line of input. */
236 if ((inl == 0) || ((n == 0) && (conv_ascii2bin(in[0]) == B64_EOF))) 236 if ((inl == 0) || ((n == 0) && (conv_ascii2bin(in[0]) == B64_EOF))) {
237 { rv=0; goto end; } 237 rv = 0;
238 238 goto end;
239 }
240
239 /* We parse the input data */ 241 /* We parse the input data */
240 for (i=0; i<inl; i++) 242 for (i = 0; i < inl; i++) {
241 {
242 /* If the current line is > 80 characters, scream alot */ 243 /* If the current line is > 80 characters, scream alot */
243 if (ln >= 80) { rv= -1; goto end; } 244 if (ln >= 80) {
245 rv = -1;
246 goto end;
247 }
244 248
245 /* Get char and put it into the buffer */ 249 /* Get char and put it into the buffer */
246 tmp= *(in++); 250 tmp= *(in++);
247 v=conv_ascii2bin(tmp); 251 v = conv_ascii2bin(tmp);
248 /* only save the good data :-) */ 252 /* only save the good data :-) */
249 if (!B64_NOT_BASE64(v)) 253 if (!B64_NOT_BASE64(v)) {
250 {
251 OPENSSL_assert(n < (int)sizeof(ctx->enc_data)); 254 OPENSSL_assert(n < (int)sizeof(ctx->enc_data));
252 d[n++]=tmp; 255 d[n++] = tmp;
253 ln++; 256 ln++;
254 } 257 } else if (v == B64_ERROR) {
255 else if (v == B64_ERROR) 258 rv = -1;
256 {
257 rv= -1;
258 goto end; 259 goto end;
259 } 260 }
260 261
261 /* have we seen a '=' which is 'definitly' the last 262 /* have we seen a '=' which is 'definitly' the last
262 * input line. seof will point to the character that 263 * input line. seof will point to the character that
263 * holds it. and eof will hold how many characters to 264 * holds it. and eof will hold how many characters to
264 * chop off. */ 265 * chop off. */
265 if (tmp == '=') 266 if (tmp == '=') {
266 { 267 if (seof == -1)
267 if (seof == -1) seof=n; 268 seof = n;
268 eof++; 269 eof++;
269 } 270 }
270 271
271 if (v == B64_CR) 272 if (v == B64_CR) {
272 {
273 ln = 0; 273 ln = 0;
274 if (exp_nl) 274 if (exp_nl)
275 continue; 275 continue;
276 } 276 }
277 277
278 /* eoln */ 278 /* eoln */
279 if (v == B64_EOLN) 279 if (v == B64_EOLN) {
280 { 280 ln = 0;
281 ln=0; 281 if (exp_nl) {
282 if (exp_nl) 282 exp_nl = 0;
283 {
284 exp_nl=0;
285 continue; 283 continue;
286 }
287 } 284 }
288 exp_nl=0; 285 }
286 exp_nl = 0;
289 287
290 /* If we are at the end of input and it looks like a 288 /* If we are at the end of input and it looks like a
291 * line, process it. */ 289 * line, process it. */
292 if (((i+1) == inl) && (((n&3) == 0) || eof)) 290 if (((i + 1) == inl) && (((n&3) == 0) || eof)) {
293 { 291 v = B64_EOF;
294 v=B64_EOF;
295 /* In case things were given us in really small 292 /* In case things were given us in really small
296 records (so two '=' were given in separate 293 records (so two '=' were given in separate
297 updates), eof may contain the incorrect number 294 updates), eof may contain the incorrect number
298 of ending bytes to skip, so let's redo the count */ 295 of ending bytes to skip, so let's redo the count */
299 eof = 0; 296 eof = 0;
300 if (d[n-1] == '=') eof++; 297 if (d[n-1] == '=')
301 if (d[n-2] == '=') eof++; 298 eof++;
299 if (d[n-2] == '=')
300 eof++;
302 /* There will never be more than two '=' */ 301 /* There will never be more than two '=' */
303 } 302 }
304 303
305 if ((v == B64_EOF && (n&3) == 0) || (n >= 64)) 304 if ((v == B64_EOF && (n&3) == 0) || (n >= 64)) {
306 {
307 /* This is needed to work correctly on 64 byte input 305 /* This is needed to work correctly on 64 byte input
308 * lines. We process the line and then need to 306 * lines. We process the line and then need to
309 * accept the '\n' */ 307 * accept the '\n' */
310 if ((v != B64_EOF) && (n >= 64)) exp_nl=1; 308 if ((v != B64_EOF) && (n >= 64))
311 if (n > 0) 309 exp_nl = 1;
312 { 310 if (n > 0) {
313 v=EVP_DecodeBlock(out,d,n); 311 v = EVP_DecodeBlock(out, d, n);
314 n=0; 312 n = 0;
315 if (v < 0) { rv=0; goto end; } 313 if (v < 0) {
316 ret+=(v-eof); 314 rv = 0;
317 } 315 goto end;
318 else
319 {
320 eof=1;
321 v=0;
322 } 316 }
317 ret += (v - eof);
318 } else {
319 eof = 1;
320 v = 0;
321 }
323 322
324 /* This is the case where we have had a short 323 /* This is the case where we have had a short
325 * but valid input line */ 324 * but valid input line */
326 if ((v < ctx->length) && eof) 325 if ((v < ctx->length) && eof) {
327 { 326 rv = 0;
328 rv=0;
329 goto end; 327 goto end;
330 } 328 } else
331 else 329 ctx->length = v;
332 ctx->length=v;
333 330
334 if (seof >= 0) { rv=0; goto end; } 331 if (seof >= 0) {
335 out+=v; 332 rv = 0;
333 goto end;
336 } 334 }
335 out += v;
337 } 336 }
338 rv=1;
339end:
340 *outl=ret;
341 ctx->num=n;
342 ctx->line_num=ln;
343 ctx->expect_nl=exp_nl;
344 return(rv);
345 } 337 }
338 rv = 1;
346 339
347int EVP_DecodeBlock(unsigned char *t, const unsigned char *f, int n) 340end:
348 { 341 *outl = ret;
349 int i,ret=0,a,b,c,d; 342 ctx->num = n;
343 ctx->line_num = ln;
344 ctx->expect_nl = exp_nl;
345 return (rv);
346}
347
348int
349EVP_DecodeBlock(unsigned char *t, const unsigned char *f, int n)
350{
351 int i, ret = 0, a,b, c, d;
350 unsigned long l; 352 unsigned long l;
351 353
352 /* trim white space from the start of the line. */ 354 /* trim white space from the start of the line. */
353 while ((conv_ascii2bin(*f) == B64_WS) && (n > 0)) 355 while ((conv_ascii2bin(*f) == B64_WS) && (n > 0)) {
354 {
355 f++; 356 f++;
356 n--; 357 n--;
357 } 358 }
358 359
359 /* strip off stuff at the end of the line 360 /* strip off stuff at the end of the line
360 * ascii2bin values B64_WS, B64_EOLN, B64_EOLN and B64_EOF */ 361 * ascii2bin values B64_WS, B64_EOLN, B64_EOLN and B64_EOF */
361 while ((n > 3) && (B64_NOT_BASE64(conv_ascii2bin(f[n-1])))) 362 while ((n > 3) && (B64_NOT_BASE64(conv_ascii2bin(f[n - 1]))))
362 n--; 363 n--;
363 364
364 if (n%4 != 0) return(-1); 365 if (n % 4 != 0)
365 366 return (-1);
366 for (i=0; i<n; i+=4) 367
367 { 368 for (i = 0; i < n; i += 4) {
368 a=conv_ascii2bin(*(f++)); 369 a = conv_ascii2bin(*(f++));
369 b=conv_ascii2bin(*(f++)); 370 b = conv_ascii2bin(*(f++));
370 c=conv_ascii2bin(*(f++)); 371 c = conv_ascii2bin(*(f++));
371 d=conv_ascii2bin(*(f++)); 372 d = conv_ascii2bin(*(f++));
372 if ( (a & 0x80) || (b & 0x80) || 373 if ((a & 0x80) || (b & 0x80) ||
373 (c & 0x80) || (d & 0x80)) 374 (c & 0x80) || (d & 0x80))
374 return(-1); 375 return (-1);
375 l=( (((unsigned long)a)<<18L)| 376 l = ((((unsigned long)a) << 18L) |
376 (((unsigned long)b)<<12L)| 377 (((unsigned long)b) << 12L) |
377 (((unsigned long)c)<< 6L)| 378 (((unsigned long)c) << 6L) |
378 (((unsigned long)d) )); 379 (((unsigned long)d)));
379 *(t++)=(unsigned char)(l>>16L)&0xff; 380 *(t++) = (unsigned char)(l >> 16L) & 0xff;
380 *(t++)=(unsigned char)(l>> 8L)&0xff; 381 *(t++) = (unsigned char)(l >> 8L) & 0xff;
381 *(t++)=(unsigned char)(l )&0xff; 382 *(t++) = (unsigned char)(l) & 0xff;
382 ret+=3; 383 ret += 3;
383 }
384 return(ret);
385 } 384 }
385 return (ret);
386}
386 387
387int EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl) 388int
388 { 389EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl)
390{
389 int i; 391 int i;
390 392
391 *outl=0; 393 *outl = 0;
392 if (ctx->num != 0) 394 if (ctx->num != 0) {
393 { 395 i = EVP_DecodeBlock(out, ctx->enc_data, ctx->num);
394 i=EVP_DecodeBlock(out,ctx->enc_data,ctx->num); 396 if (i < 0)
395 if (i < 0) return(-1); 397 return (-1);
396 ctx->num=0; 398 ctx->num = 0;
397 *outl=i; 399 *outl = i;
398 return(1); 400 return (1);
399 } 401 } else
400 else 402 return (1);
401 return(1); 403}
402 }
403 404
404#ifdef undef 405#ifdef undef
405int EVP_DecodeValid(unsigned char *buf, int len) 406int
406 { 407EVP_DecodeValid(unsigned char *buf, int len)
407 int i,num=0,bad=0; 408{
408 409 int i, num = 0, bad = 0;
409 if (len == 0) return(-1); 410
410 while (conv_ascii2bin(*buf) == B64_WS) 411 if (len == 0)
411 { 412 return (-1);
413 while (conv_ascii2bin(*buf) == B64_WS) {
412 buf++; 414 buf++;
413 len--; 415 len--;
414 if (len == 0) return(-1); 416 if (len == 0)
415 } 417 return (-1);
418 }
416 419
417 for (i=len; i >= 4; i-=4) 420 for (i = len; i >= 4; i -= 4) {
418 { 421 if ((conv_ascii2bin(buf[0]) >= 0x40) ||
419 if ( (conv_ascii2bin(buf[0]) >= 0x40) || 422 (conv_ascii2bin(buf[1]) >= 0x40) ||
420 (conv_ascii2bin(buf[1]) >= 0x40) || 423 (conv_ascii2bin(buf[2]) >= 0x40) ||
421 (conv_ascii2bin(buf[2]) >= 0x40) || 424 (conv_ascii2bin(buf[3]) >= 0x40))
422 (conv_ascii2bin(buf[3]) >= 0x40)) 425 return (-1);
423 return(-1); 426 buf += 4;
424 buf+=4; 427 num += 1 + (buf[2] != '=') + (buf[3] != '=');
425 num+=1+(buf[2] != '=')+(buf[3] != '='); 428 }
426 }
427 if ((i == 1) && (conv_ascii2bin(buf[0]) == B64_EOLN)) 429 if ((i == 1) && (conv_ascii2bin(buf[0]) == B64_EOLN))
428 return(num); 430 return (num);
429 if ((i == 2) && (conv_ascii2bin(buf[0]) == B64_EOLN) && 431 if ((i == 2) && (conv_ascii2bin(buf[0]) == B64_EOLN) &&
430 (conv_ascii2bin(buf[0]) == B64_EOLN)) 432 (conv_ascii2bin(buf[0]) == B64_EOLN))
431 return(num); 433 return (num);
432 return(1); 434 return (1);
433 } 435}
434#endif 436#endif
diff --git a/src/lib/libssl/src/crypto/evp/names.c b/src/lib/libssl/src/crypto/evp/names.c
index 6311ad7cfb..b4793b954b 100644
--- a/src/lib/libssl/src/crypto/evp/names.c
+++ b/src/lib/libssl/src/crypto/evp/names.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
@@ -62,65 +62,77 @@
62#include <openssl/objects.h> 62#include <openssl/objects.h>
63#include <openssl/x509.h> 63#include <openssl/x509.h>
64 64
65int EVP_add_cipher(const EVP_CIPHER *c) 65int
66 { 66EVP_add_cipher(const EVP_CIPHER *c)
67{
67 int r; 68 int r;
68 69
69 if (c == NULL) return 0; 70 if (c == NULL)
71 return 0;
70 72
71 OPENSSL_init(); 73 OPENSSL_init();
72 74
73 r=OBJ_NAME_add(OBJ_nid2sn(c->nid),OBJ_NAME_TYPE_CIPHER_METH,(const char *)c); 75 r = OBJ_NAME_add(OBJ_nid2sn(c->nid), OBJ_NAME_TYPE_CIPHER_METH,
74 if (r == 0) return(0); 76 (const char *)c);
77 if (r == 0)
78 return (0);
75 check_defer(c->nid); 79 check_defer(c->nid);
76 r=OBJ_NAME_add(OBJ_nid2ln(c->nid),OBJ_NAME_TYPE_CIPHER_METH,(const char *)c); 80 r = OBJ_NAME_add(OBJ_nid2ln(c->nid), OBJ_NAME_TYPE_CIPHER_METH,
77 return(r); 81 (const char *)c);
78 } 82 return (r);
79 83}
80 84
81int EVP_add_digest(const EVP_MD *md) 85int
82 { 86EVP_add_digest(const EVP_MD *md)
87{
83 int r; 88 int r;
84 const char *name; 89 const char *name;
90
85 OPENSSL_init(); 91 OPENSSL_init();
86 92
87 name=OBJ_nid2sn(md->type); 93 name = OBJ_nid2sn(md->type);
88 r=OBJ_NAME_add(name,OBJ_NAME_TYPE_MD_METH,(const char *)md); 94 r = OBJ_NAME_add(name, OBJ_NAME_TYPE_MD_METH, (const char *)md);
89 if (r == 0) return(0); 95 if (r == 0)
96 return (0);
90 check_defer(md->type); 97 check_defer(md->type);
91 r=OBJ_NAME_add(OBJ_nid2ln(md->type),OBJ_NAME_TYPE_MD_METH,(const char *)md); 98 r = OBJ_NAME_add(OBJ_nid2ln(md->type), OBJ_NAME_TYPE_MD_METH,
92 if (r == 0) return(0); 99 (const char *)md);
93 100 if (r == 0)
94 if (md->pkey_type && md->type != md->pkey_type) 101 return (0);
95 { 102
96 r=OBJ_NAME_add(OBJ_nid2sn(md->pkey_type), 103 if (md->pkey_type && md->type != md->pkey_type) {
97 OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS,name); 104 r = OBJ_NAME_add(OBJ_nid2sn(md->pkey_type),
98 if (r == 0) return(0); 105 OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS, name);
106 if (r == 0)
107 return (0);
99 check_defer(md->pkey_type); 108 check_defer(md->pkey_type);
100 r=OBJ_NAME_add(OBJ_nid2ln(md->pkey_type), 109 r = OBJ_NAME_add(OBJ_nid2ln(md->pkey_type),
101 OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS,name); 110 OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS, name);
102 }
103 return(r);
104 } 111 }
112 return (r);
113}
105 114
106const EVP_CIPHER *EVP_get_cipherbyname(const char *name) 115const EVP_CIPHER *
107 { 116EVP_get_cipherbyname(const char *name)
117{
108 const EVP_CIPHER *cp; 118 const EVP_CIPHER *cp;
109 119
110 cp=(const EVP_CIPHER *)OBJ_NAME_get(name,OBJ_NAME_TYPE_CIPHER_METH); 120 cp = (const EVP_CIPHER *)OBJ_NAME_get(name, OBJ_NAME_TYPE_CIPHER_METH);
111 return(cp); 121 return (cp);
112 } 122}
113 123
114const EVP_MD *EVP_get_digestbyname(const char *name) 124const EVP_MD *
115 { 125EVP_get_digestbyname(const char *name)
126{
116 const EVP_MD *cp; 127 const EVP_MD *cp;
117 128
118 cp=(const EVP_MD *)OBJ_NAME_get(name,OBJ_NAME_TYPE_MD_METH); 129 cp = (const EVP_MD *)OBJ_NAME_get(name, OBJ_NAME_TYPE_MD_METH);
119 return(cp); 130 return (cp);
120 } 131}
121 132
122void EVP_cleanup(void) 133void
123 { 134EVP_cleanup(void)
135{
124 OBJ_NAME_cleanup(OBJ_NAME_TYPE_CIPHER_METH); 136 OBJ_NAME_cleanup(OBJ_NAME_TYPE_CIPHER_METH);
125 OBJ_NAME_cleanup(OBJ_NAME_TYPE_MD_METH); 137 OBJ_NAME_cleanup(OBJ_NAME_TYPE_MD_METH);
126 /* The above calls will only clean out the contents of the name 138 /* The above calls will only clean out the contents of the name
@@ -129,78 +141,88 @@ void EVP_cleanup(void)
129 OBJ_NAME_cleanup(-1); 141 OBJ_NAME_cleanup(-1);
130 142
131 EVP_PBE_cleanup(); 143 EVP_PBE_cleanup();
132 if (obj_cleanup_defer == 2) 144 if (obj_cleanup_defer == 2) {
133 {
134 obj_cleanup_defer = 0; 145 obj_cleanup_defer = 0;
135 OBJ_cleanup(); 146 OBJ_cleanup();
136 }
137 OBJ_sigid_free();
138 } 147 }
148 OBJ_sigid_free();
149}
139 150
140struct doall_cipher 151struct doall_cipher {
141 {
142 void *arg; 152 void *arg;
143 void (*fn)(const EVP_CIPHER *ciph, 153 void (*fn)(const EVP_CIPHER *ciph, const char *from, const char *to,
144 const char *from, const char *to, void *arg); 154 void *arg);
145 }; 155};
146 156
147static void do_all_cipher_fn(const OBJ_NAME *nm, void *arg) 157static void
148 { 158do_all_cipher_fn(const OBJ_NAME *nm, void *arg)
159{
149 struct doall_cipher *dc = arg; 160 struct doall_cipher *dc = arg;
161
150 if (nm->alias) 162 if (nm->alias)
151 dc->fn(NULL, nm->name, nm->data, dc->arg); 163 dc->fn(NULL, nm->name, nm->data, dc->arg);
152 else 164 else
153 dc->fn((const EVP_CIPHER *)nm->data, nm->name, NULL, dc->arg); 165 dc->fn((const EVP_CIPHER *)nm->data, nm->name, NULL, dc->arg);
154 } 166}
155 167
156void EVP_CIPHER_do_all(void (*fn)(const EVP_CIPHER *ciph, 168void
157 const char *from, const char *to, void *x), void *arg) 169EVP_CIPHER_do_all(void (*fn)(const EVP_CIPHER *ciph, const char *from,
158 { 170 const char *to, void *x), void *arg)
171{
159 struct doall_cipher dc; 172 struct doall_cipher dc;
173
160 dc.fn = fn; 174 dc.fn = fn;
161 dc.arg = arg; 175 dc.arg = arg;
162 OBJ_NAME_do_all(OBJ_NAME_TYPE_CIPHER_METH, do_all_cipher_fn, &dc); 176 OBJ_NAME_do_all(OBJ_NAME_TYPE_CIPHER_METH, do_all_cipher_fn, &dc);
163 } 177}
164 178
165void EVP_CIPHER_do_all_sorted(void (*fn)(const EVP_CIPHER *ciph, 179void
166 const char *from, const char *to, void *x), void *arg) 180EVP_CIPHER_do_all_sorted(void (*fn)(const EVP_CIPHER *ciph, const char *from,
167 { 181 const char *to, void *x), void *arg)
182{
168 struct doall_cipher dc; 183 struct doall_cipher dc;
184
169 dc.fn = fn; 185 dc.fn = fn;
170 dc.arg = arg; 186 dc.arg = arg;
171 OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_CIPHER_METH, do_all_cipher_fn,&dc); 187 OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_CIPHER_METH,
172 } 188 do_all_cipher_fn, &dc);
189}
173 190
174struct doall_md 191struct doall_md {
175 {
176 void *arg; 192 void *arg;
177 void (*fn)(const EVP_MD *ciph, 193 void (*fn)(const EVP_MD *ciph, const char *from, const char *to,
178 const char *from, const char *to, void *arg); 194 void *arg);
179 }; 195};
180 196
181static void do_all_md_fn(const OBJ_NAME *nm, void *arg) 197static void
182 { 198do_all_md_fn(const OBJ_NAME *nm, void *arg)
199{
183 struct doall_md *dc = arg; 200 struct doall_md *dc = arg;
201
184 if (nm->alias) 202 if (nm->alias)
185 dc->fn(NULL, nm->name, nm->data, dc->arg); 203 dc->fn(NULL, nm->name, nm->data, dc->arg);
186 else 204 else
187 dc->fn((const EVP_MD *)nm->data, nm->name, NULL, dc->arg); 205 dc->fn((const EVP_MD *)nm->data, nm->name, NULL, dc->arg);
188 } 206}
189 207
190void EVP_MD_do_all(void (*fn)(const EVP_MD *md, 208void
191 const char *from, const char *to, void *x), void *arg) 209EVP_MD_do_all(void (*fn)(const EVP_MD *md, const char *from, const char *to,
192 { 210 void *x), void *arg)
211{
193 struct doall_md dc; 212 struct doall_md dc;
213
194 dc.fn = fn; 214 dc.fn = fn;
195 dc.arg = arg; 215 dc.arg = arg;
196 OBJ_NAME_do_all(OBJ_NAME_TYPE_MD_METH, do_all_md_fn, &dc); 216 OBJ_NAME_do_all(OBJ_NAME_TYPE_MD_METH, do_all_md_fn, &dc);
197 } 217}
198 218
199void EVP_MD_do_all_sorted(void (*fn)(const EVP_MD *md, 219void
200 const char *from, const char *to, void *x), void *arg) 220EVP_MD_do_all_sorted(void (*fn)(const EVP_MD *md,
201 { 221 const char *from, const char *to, void *x), void *arg)
222{
202 struct doall_md dc; 223 struct doall_md dc;
224
203 dc.fn = fn; 225 dc.fn = fn;
204 dc.arg = arg; 226 dc.arg = arg;
205 OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_MD_METH, do_all_md_fn, &dc); 227 OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_MD_METH, do_all_md_fn, &dc);
206 } 228}