diff options
author | markus <> | 2002-09-05 12:51:50 +0000 |
---|---|---|
committer | markus <> | 2002-09-05 12:51:50 +0000 |
commit | 15b5d84f9da2ce4bfae8580e56e34a859f74ad71 (patch) | |
tree | bf939e82d7fd73cc8a01cf6959002209972091bc /src/lib/libcrypto/bio/bio_lib.c | |
parent | 027351f729b9e837200dae6e1520cda6577ab930 (diff) | |
download | openbsd-15b5d84f9da2ce4bfae8580e56e34a859f74ad71.tar.gz openbsd-15b5d84f9da2ce4bfae8580e56e34a859f74ad71.tar.bz2 openbsd-15b5d84f9da2ce4bfae8580e56e34a859f74ad71.zip |
import openssl-0.9.7-beta1
Diffstat (limited to 'src/lib/libcrypto/bio/bio_lib.c')
-rw-r--r-- | src/lib/libcrypto/bio/bio_lib.c | 208 |
1 files changed, 116 insertions, 92 deletions
diff --git a/src/lib/libcrypto/bio/bio_lib.c b/src/lib/libcrypto/bio/bio_lib.c index 7a66b0892e..50df2238fa 100644 --- a/src/lib/libcrypto/bio/bio_lib.c +++ b/src/lib/libcrypto/bio/bio_lib.c | |||
@@ -58,20 +58,16 @@ | |||
58 | 58 | ||
59 | #include <stdio.h> | 59 | #include <stdio.h> |
60 | #include <errno.h> | 60 | #include <errno.h> |
61 | #include "crypto.h" | 61 | #include <openssl/crypto.h> |
62 | #include "cryptlib.h" | 62 | #include "cryptlib.h" |
63 | #include "bio.h" | 63 | #include <openssl/bio.h> |
64 | #include "stack.h" | 64 | #include <openssl/stack.h> |
65 | 65 | ||
66 | static STACK *bio_meth=NULL; | 66 | BIO *BIO_new(BIO_METHOD *method) |
67 | static int bio_meth_num=0; | ||
68 | |||
69 | BIO *BIO_new(method) | ||
70 | BIO_METHOD *method; | ||
71 | { | 67 | { |
72 | BIO *ret=NULL; | 68 | BIO *ret=NULL; |
73 | 69 | ||
74 | ret=(BIO *)Malloc(sizeof(BIO)); | 70 | ret=(BIO *)OPENSSL_malloc(sizeof(BIO)); |
75 | if (ret == NULL) | 71 | if (ret == NULL) |
76 | { | 72 | { |
77 | BIOerr(BIO_F_BIO_NEW,ERR_R_MALLOC_FAILURE); | 73 | BIOerr(BIO_F_BIO_NEW,ERR_R_MALLOC_FAILURE); |
@@ -79,15 +75,13 @@ BIO_METHOD *method; | |||
79 | } | 75 | } |
80 | if (!BIO_set(ret,method)) | 76 | if (!BIO_set(ret,method)) |
81 | { | 77 | { |
82 | Free(ret); | 78 | OPENSSL_free(ret); |
83 | ret=NULL; | 79 | ret=NULL; |
84 | } | 80 | } |
85 | return(ret); | 81 | return(ret); |
86 | } | 82 | } |
87 | 83 | ||
88 | int BIO_set(bio,method) | 84 | int BIO_set(BIO *bio, BIO_METHOD *method) |
89 | BIO *bio; | ||
90 | BIO_METHOD *method; | ||
91 | { | 85 | { |
92 | bio->method=method; | 86 | bio->method=method; |
93 | bio->callback=NULL; | 87 | bio->callback=NULL; |
@@ -103,15 +97,18 @@ BIO_METHOD *method; | |||
103 | bio->references=1; | 97 | bio->references=1; |
104 | bio->num_read=0L; | 98 | bio->num_read=0L; |
105 | bio->num_write=0L; | 99 | bio->num_write=0L; |
106 | CRYPTO_new_ex_data(bio_meth,(char *)bio,&bio->ex_data); | 100 | CRYPTO_new_ex_data(CRYPTO_EX_INDEX_BIO, bio, &bio->ex_data); |
107 | if (method->create != NULL) | 101 | if (method->create != NULL) |
108 | if (!method->create(bio)) | 102 | if (!method->create(bio)) |
103 | { | ||
104 | CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, bio, | ||
105 | &bio->ex_data); | ||
109 | return(0); | 106 | return(0); |
107 | } | ||
110 | return(1); | 108 | return(1); |
111 | } | 109 | } |
112 | 110 | ||
113 | int BIO_free(a) | 111 | int BIO_free(BIO *a) |
114 | BIO *a; | ||
115 | { | 112 | { |
116 | int ret=0,i; | 113 | int ret=0,i; |
117 | 114 | ||
@@ -121,7 +118,7 @@ BIO *a; | |||
121 | #ifdef REF_PRINT | 118 | #ifdef REF_PRINT |
122 | REF_PRINT("BIO",a); | 119 | REF_PRINT("BIO",a); |
123 | #endif | 120 | #endif |
124 | if (i > 0) return(1); | 121 | if (i > 0) return(1); |
125 | #ifdef REF_CHECK | 122 | #ifdef REF_CHECK |
126 | if (i < 0) | 123 | if (i < 0) |
127 | { | 124 | { |
@@ -133,18 +130,18 @@ BIO *a; | |||
133 | ((i=(int)a->callback(a,BIO_CB_FREE,NULL,0,0L,1L)) <= 0)) | 130 | ((i=(int)a->callback(a,BIO_CB_FREE,NULL,0,0L,1L)) <= 0)) |
134 | return(i); | 131 | return(i); |
135 | 132 | ||
136 | CRYPTO_free_ex_data(bio_meth,(char *)a,&a->ex_data); | 133 | CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, a, &a->ex_data); |
137 | 134 | ||
138 | if ((a->method == NULL) || (a->method->destroy == NULL)) return(1); | 135 | if ((a->method == NULL) || (a->method->destroy == NULL)) return(1); |
139 | ret=a->method->destroy(a); | 136 | ret=a->method->destroy(a); |
140 | Free(a); | 137 | OPENSSL_free(a); |
141 | return(1); | 138 | return(1); |
142 | } | 139 | } |
143 | 140 | ||
144 | int BIO_read(b,out,outl) | 141 | void BIO_vfree(BIO *a) |
145 | BIO *b; | 142 | { BIO_free(a); } |
146 | char *out; | 143 | |
147 | int outl; | 144 | int BIO_read(BIO *b, void *out, int outl) |
148 | { | 145 | { |
149 | int i; | 146 | int i; |
150 | long (*cb)(); | 147 | long (*cb)(); |
@@ -162,11 +159,12 @@ int outl; | |||
162 | 159 | ||
163 | if (!b->init) | 160 | if (!b->init) |
164 | { | 161 | { |
165 | BIOerr(BIO_F_BIO_READ,BIO_R_UNINITALISED); | 162 | BIOerr(BIO_F_BIO_READ,BIO_R_UNINITIALIZED); |
166 | return(-2); | 163 | return(-2); |
167 | } | 164 | } |
168 | 165 | ||
169 | i=b->method->bread(b,out,outl); | 166 | i=b->method->bread(b,out,outl); |
167 | |||
170 | if (i > 0) b->num_read+=(unsigned long)i; | 168 | if (i > 0) b->num_read+=(unsigned long)i; |
171 | 169 | ||
172 | if (cb != NULL) | 170 | if (cb != NULL) |
@@ -175,10 +173,7 @@ int outl; | |||
175 | return(i); | 173 | return(i); |
176 | } | 174 | } |
177 | 175 | ||
178 | int BIO_write(b,in,inl) | 176 | int BIO_write(BIO *b, const void *in, int inl) |
179 | BIO *b; | ||
180 | char *in; | ||
181 | int inl; | ||
182 | { | 177 | { |
183 | int i; | 178 | int i; |
184 | long (*cb)(); | 179 | long (*cb)(); |
@@ -199,11 +194,12 @@ int inl; | |||
199 | 194 | ||
200 | if (!b->init) | 195 | if (!b->init) |
201 | { | 196 | { |
202 | BIOerr(BIO_F_BIO_WRITE,BIO_R_UNINITALISED); | 197 | BIOerr(BIO_F_BIO_WRITE,BIO_R_UNINITIALIZED); |
203 | return(-2); | 198 | return(-2); |
204 | } | 199 | } |
205 | 200 | ||
206 | i=b->method->bwrite(b,in,inl); | 201 | i=b->method->bwrite(b,in,inl); |
202 | |||
207 | if (i > 0) b->num_write+=(unsigned long)i; | 203 | if (i > 0) b->num_write+=(unsigned long)i; |
208 | 204 | ||
209 | if (cb != NULL) | 205 | if (cb != NULL) |
@@ -212,9 +208,7 @@ int inl; | |||
212 | return(i); | 208 | return(i); |
213 | } | 209 | } |
214 | 210 | ||
215 | int BIO_puts(b,in) | 211 | int BIO_puts(BIO *b, const char *in) |
216 | BIO *b; | ||
217 | char *in; | ||
218 | { | 212 | { |
219 | int i; | 213 | int i; |
220 | long (*cb)(); | 214 | long (*cb)(); |
@@ -233,22 +227,21 @@ char *in; | |||
233 | 227 | ||
234 | if (!b->init) | 228 | if (!b->init) |
235 | { | 229 | { |
236 | BIOerr(BIO_F_BIO_PUTS,BIO_R_UNINITALISED); | 230 | BIOerr(BIO_F_BIO_PUTS,BIO_R_UNINITIALIZED); |
237 | return(-2); | 231 | return(-2); |
238 | } | 232 | } |
239 | 233 | ||
240 | i=b->method->bputs(b,in); | 234 | i=b->method->bputs(b,in); |
241 | 235 | ||
236 | if (i > 0) b->num_write+=(unsigned long)i; | ||
237 | |||
242 | if (cb != NULL) | 238 | if (cb != NULL) |
243 | i=(int)cb(b,BIO_CB_PUTS|BIO_CB_RETURN,in,0, | 239 | i=(int)cb(b,BIO_CB_PUTS|BIO_CB_RETURN,in,0, |
244 | 0L,(long)i); | 240 | 0L,(long)i); |
245 | return(i); | 241 | return(i); |
246 | } | 242 | } |
247 | 243 | ||
248 | int BIO_gets(b,in,inl) | 244 | int BIO_gets(BIO *b, char *in, int inl) |
249 | BIO *b; | ||
250 | char *in; | ||
251 | int inl; | ||
252 | { | 245 | { |
253 | int i; | 246 | int i; |
254 | long (*cb)(); | 247 | long (*cb)(); |
@@ -267,7 +260,7 @@ int inl; | |||
267 | 260 | ||
268 | if (!b->init) | 261 | if (!b->init) |
269 | { | 262 | { |
270 | BIOerr(BIO_F_BIO_GETS,BIO_R_UNINITALISED); | 263 | BIOerr(BIO_F_BIO_GETS,BIO_R_UNINITIALIZED); |
271 | return(-2); | 264 | return(-2); |
272 | } | 265 | } |
273 | 266 | ||
@@ -279,11 +272,7 @@ int inl; | |||
279 | return(i); | 272 | return(i); |
280 | } | 273 | } |
281 | 274 | ||
282 | long BIO_int_ctrl(b,cmd,larg,iarg) | 275 | long BIO_int_ctrl(BIO *b, int cmd, long larg, int iarg) |
283 | BIO *b; | ||
284 | int cmd; | ||
285 | long larg; | ||
286 | int iarg; | ||
287 | { | 276 | { |
288 | int i; | 277 | int i; |
289 | 278 | ||
@@ -291,10 +280,7 @@ int iarg; | |||
291 | return(BIO_ctrl(b,cmd,larg,(char *)&i)); | 280 | return(BIO_ctrl(b,cmd,larg,(char *)&i)); |
292 | } | 281 | } |
293 | 282 | ||
294 | char *BIO_ptr_ctrl(b,cmd,larg) | 283 | char *BIO_ptr_ctrl(BIO *b, int cmd, long larg) |
295 | BIO *b; | ||
296 | int cmd; | ||
297 | long larg; | ||
298 | { | 284 | { |
299 | char *p=NULL; | 285 | char *p=NULL; |
300 | 286 | ||
@@ -304,11 +290,7 @@ long larg; | |||
304 | return(p); | 290 | return(p); |
305 | } | 291 | } |
306 | 292 | ||
307 | long BIO_ctrl(b,cmd,larg,parg) | 293 | long BIO_ctrl(BIO *b, int cmd, long larg, void *parg) |
308 | BIO *b; | ||
309 | int cmd; | ||
310 | long larg; | ||
311 | char *parg; | ||
312 | { | 294 | { |
313 | long ret; | 295 | long ret; |
314 | long (*cb)(); | 296 | long (*cb)(); |
@@ -335,9 +317,49 @@ char *parg; | |||
335 | return(ret); | 317 | return(ret); |
336 | } | 318 | } |
337 | 319 | ||
320 | long BIO_callback_ctrl(BIO *b, int cmd, void (*fp)(struct bio_st *, int, const char *, int, long, long)) | ||
321 | { | ||
322 | long ret; | ||
323 | long (*cb)(); | ||
324 | |||
325 | if (b == NULL) return(0); | ||
326 | |||
327 | if ((b->method == NULL) || (b->method->callback_ctrl == NULL)) | ||
328 | { | ||
329 | BIOerr(BIO_F_BIO_CTRL,BIO_R_UNSUPPORTED_METHOD); | ||
330 | return(-2); | ||
331 | } | ||
332 | |||
333 | cb=b->callback; | ||
334 | |||
335 | if ((cb != NULL) && | ||
336 | ((ret=cb(b,BIO_CB_CTRL,(void *)&fp,cmd,0,1L)) <= 0)) | ||
337 | return(ret); | ||
338 | |||
339 | ret=b->method->callback_ctrl(b,cmd,fp); | ||
340 | |||
341 | if (cb != NULL) | ||
342 | ret=cb(b,BIO_CB_CTRL|BIO_CB_RETURN,(void *)&fp,cmd, | ||
343 | 0,ret); | ||
344 | return(ret); | ||
345 | } | ||
346 | |||
347 | /* It is unfortunate to duplicate in functions what the BIO_(w)pending macros | ||
348 | * do; but those macros have inappropriate return type, and for interfacing | ||
349 | * from other programming languages, C macros aren't much of a help anyway. */ | ||
350 | size_t BIO_ctrl_pending(BIO *bio) | ||
351 | { | ||
352 | return BIO_ctrl(bio, BIO_CTRL_PENDING, 0, NULL); | ||
353 | } | ||
354 | |||
355 | size_t BIO_ctrl_wpending(BIO *bio) | ||
356 | { | ||
357 | return BIO_ctrl(bio, BIO_CTRL_WPENDING, 0, NULL); | ||
358 | } | ||
359 | |||
360 | |||
338 | /* put the 'bio' on the end of b's list of operators */ | 361 | /* put the 'bio' on the end of b's list of operators */ |
339 | BIO *BIO_push(b,bio) | 362 | BIO *BIO_push(BIO *b, BIO *bio) |
340 | BIO *b,*bio; | ||
341 | { | 363 | { |
342 | BIO *lb; | 364 | BIO *lb; |
343 | 365 | ||
@@ -354,8 +376,7 @@ BIO *b,*bio; | |||
354 | } | 376 | } |
355 | 377 | ||
356 | /* Remove the first and return the rest */ | 378 | /* Remove the first and return the rest */ |
357 | BIO *BIO_pop(b) | 379 | BIO *BIO_pop(BIO *b) |
358 | BIO *b; | ||
359 | { | 380 | { |
360 | BIO *ret; | 381 | BIO *ret; |
361 | 382 | ||
@@ -373,9 +394,7 @@ BIO *b; | |||
373 | return(ret); | 394 | return(ret); |
374 | } | 395 | } |
375 | 396 | ||
376 | BIO *BIO_get_retry_BIO(bio,reason) | 397 | BIO *BIO_get_retry_BIO(BIO *bio, int *reason) |
377 | BIO *bio; | ||
378 | int *reason; | ||
379 | { | 398 | { |
380 | BIO *b,*last; | 399 | BIO *b,*last; |
381 | 400 | ||
@@ -391,18 +410,16 @@ int *reason; | |||
391 | return(last); | 410 | return(last); |
392 | } | 411 | } |
393 | 412 | ||
394 | int BIO_get_retry_reason(bio) | 413 | int BIO_get_retry_reason(BIO *bio) |
395 | BIO *bio; | ||
396 | { | 414 | { |
397 | return(bio->retry_reason); | 415 | return(bio->retry_reason); |
398 | } | 416 | } |
399 | 417 | ||
400 | BIO *BIO_find_type(bio,type) | 418 | BIO *BIO_find_type(BIO *bio, int type) |
401 | BIO *bio; | ||
402 | int type; | ||
403 | { | 419 | { |
404 | int mt,mask; | 420 | int mt,mask; |
405 | 421 | ||
422 | if(!bio) return NULL; | ||
406 | mask=type&0xff; | 423 | mask=type&0xff; |
407 | do { | 424 | do { |
408 | if (bio->method != NULL) | 425 | if (bio->method != NULL) |
@@ -421,8 +438,13 @@ int type; | |||
421 | return(NULL); | 438 | return(NULL); |
422 | } | 439 | } |
423 | 440 | ||
424 | void BIO_free_all(bio) | 441 | BIO *BIO_next(BIO *b) |
425 | BIO *bio; | 442 | { |
443 | if(!b) return NULL; | ||
444 | return b->next_bio; | ||
445 | } | ||
446 | |||
447 | void BIO_free_all(BIO *bio) | ||
426 | { | 448 | { |
427 | BIO *b; | 449 | BIO *b; |
428 | int ref; | 450 | int ref; |
@@ -438,8 +460,7 @@ BIO *bio; | |||
438 | } | 460 | } |
439 | } | 461 | } |
440 | 462 | ||
441 | BIO *BIO_dup_chain(in) | 463 | BIO *BIO_dup_chain(BIO *in) |
442 | BIO *in; | ||
443 | { | 464 | { |
444 | BIO *ret=NULL,*eoc=NULL,*bio,*new; | 465 | BIO *ret=NULL,*eoc=NULL,*bio,*new; |
445 | 466 | ||
@@ -461,9 +482,10 @@ BIO *in; | |||
461 | goto err; | 482 | goto err; |
462 | } | 483 | } |
463 | 484 | ||
464 | /* copy app data */ | 485 | /* copy app data */ |
465 | if (!CRYPTO_dup_ex_data(bio_meth,&new->ex_data,&bio->ex_data)) | 486 | if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_BIO, &new->ex_data, |
466 | goto err; | 487 | &bio->ex_data)) |
488 | goto err; | ||
467 | 489 | ||
468 | if (ret == NULL) | 490 | if (ret == NULL) |
469 | { | 491 | { |
@@ -483,37 +505,39 @@ err: | |||
483 | return(NULL); | 505 | return(NULL); |
484 | } | 506 | } |
485 | 507 | ||
486 | void BIO_copy_next_retry(b) | 508 | void BIO_copy_next_retry(BIO *b) |
487 | BIO *b; | ||
488 | { | 509 | { |
489 | BIO_set_flags(b,BIO_get_retry_flags(b->next_bio)); | 510 | BIO_set_flags(b,BIO_get_retry_flags(b->next_bio)); |
490 | b->retry_reason=b->next_bio->retry_reason; | 511 | b->retry_reason=b->next_bio->retry_reason; |
491 | } | 512 | } |
492 | 513 | ||
493 | int BIO_get_ex_new_index(argl,argp,new_func,dup_func,free_func) | 514 | int BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, |
494 | long argl; | 515 | CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) |
495 | char *argp; | 516 | { |
496 | int (*new_func)(); | 517 | return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_BIO, argl, argp, |
497 | int (*dup_func)(); | 518 | new_func, dup_func, free_func); |
498 | void (*free_func)(); | 519 | } |
499 | { | 520 | |
500 | bio_meth_num++; | 521 | int BIO_set_ex_data(BIO *bio, int idx, void *data) |
501 | return(CRYPTO_get_ex_new_index(bio_meth_num-1,&bio_meth, | ||
502 | argl,argp,new_func,dup_func,free_func)); | ||
503 | } | ||
504 | |||
505 | int BIO_set_ex_data(bio,idx,data) | ||
506 | BIO *bio; | ||
507 | int idx; | ||
508 | char *data; | ||
509 | { | 522 | { |
510 | return(CRYPTO_set_ex_data(&(bio->ex_data),idx,data)); | 523 | return(CRYPTO_set_ex_data(&(bio->ex_data),idx,data)); |
511 | } | 524 | } |
512 | 525 | ||
513 | char *BIO_get_ex_data(bio,idx) | 526 | void *BIO_get_ex_data(BIO *bio, int idx) |
514 | BIO *bio; | ||
515 | int idx; | ||
516 | { | 527 | { |
517 | return(CRYPTO_get_ex_data(&(bio->ex_data),idx)); | 528 | return(CRYPTO_get_ex_data(&(bio->ex_data),idx)); |
518 | } | 529 | } |
519 | 530 | ||
531 | unsigned long BIO_number_read(BIO *bio) | ||
532 | { | ||
533 | if(bio) return bio->num_read; | ||
534 | return 0; | ||
535 | } | ||
536 | |||
537 | unsigned long BIO_number_written(BIO *bio) | ||
538 | { | ||
539 | if(bio) return bio->num_write; | ||
540 | return 0; | ||
541 | } | ||
542 | |||
543 | IMPLEMENT_STACK_OF(BIO) | ||