diff options
Diffstat (limited to 'src/lib/libcrypto/evp/bio_ok.c')
-rw-r--r-- | src/lib/libcrypto/evp/bio_ok.c | 103 |
1 files changed, 27 insertions, 76 deletions
diff --git a/src/lib/libcrypto/evp/bio_ok.c b/src/lib/libcrypto/evp/bio_ok.c index e64335353f..98bc1ab409 100644 --- a/src/lib/libcrypto/evp/bio_ok.c +++ b/src/lib/libcrypto/evp/bio_ok.c | |||
@@ -133,10 +133,10 @@ static int ok_new(BIO *h); | |||
133 | static int ok_free(BIO *data); | 133 | static int ok_free(BIO *data); |
134 | static long ok_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp); | 134 | static long ok_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp); |
135 | 135 | ||
136 | static int sig_out(BIO* b); | 136 | static void sig_out(BIO* b); |
137 | static int sig_in(BIO* b); | 137 | static void sig_in(BIO* b); |
138 | static int block_out(BIO* b); | 138 | static void block_out(BIO* b); |
139 | static int block_in(BIO* b); | 139 | static void block_in(BIO* b); |
140 | #define OK_BLOCK_SIZE (1024*4) | 140 | #define OK_BLOCK_SIZE (1024*4) |
141 | #define OK_BLOCK_BLOCK 4 | 141 | #define OK_BLOCK_BLOCK 4 |
142 | #define IOBS (OK_BLOCK_SIZE+ OK_BLOCK_BLOCK+ 3*EVP_MAX_MD_SIZE) | 142 | #define IOBS (OK_BLOCK_SIZE+ OK_BLOCK_BLOCK+ 3*EVP_MAX_MD_SIZE) |
@@ -266,24 +266,10 @@ static int ok_read(BIO *b, char *out, int outl) | |||
266 | ctx->buf_len+= i; | 266 | ctx->buf_len+= i; |
267 | 267 | ||
268 | /* no signature yet -- check if we got one */ | 268 | /* no signature yet -- check if we got one */ |
269 | if (ctx->sigio == 1) | 269 | if (ctx->sigio == 1) sig_in(b); |
270 | { | ||
271 | if (!sig_in(b)) | ||
272 | { | ||
273 | BIO_clear_retry_flags(b); | ||
274 | return 0; | ||
275 | } | ||
276 | } | ||
277 | 270 | ||
278 | /* signature ok -- check if we got block */ | 271 | /* signature ok -- check if we got block */ |
279 | if (ctx->sigio == 0) | 272 | if (ctx->sigio == 0) block_in(b); |
280 | { | ||
281 | if (!block_in(b)) | ||
282 | { | ||
283 | BIO_clear_retry_flags(b); | ||
284 | return 0; | ||
285 | } | ||
286 | } | ||
287 | 273 | ||
288 | /* invalid block -- cancel */ | 274 | /* invalid block -- cancel */ |
289 | if (ctx->cont <= 0) break; | 275 | if (ctx->cont <= 0) break; |
@@ -307,8 +293,7 @@ static int ok_write(BIO *b, const char *in, int inl) | |||
307 | 293 | ||
308 | if ((ctx == NULL) || (b->next_bio == NULL) || (b->init == 0)) return(0); | 294 | if ((ctx == NULL) || (b->next_bio == NULL) || (b->init == 0)) return(0); |
309 | 295 | ||
310 | if(ctx->sigio && !sig_out(b)) | 296 | if(ctx->sigio) sig_out(b); |
311 | return 0; | ||
312 | 297 | ||
313 | do{ | 298 | do{ |
314 | BIO_clear_retry_flags(b); | 299 | BIO_clear_retry_flags(b); |
@@ -347,11 +332,7 @@ static int ok_write(BIO *b, const char *in, int inl) | |||
347 | 332 | ||
348 | if(ctx->buf_len >= OK_BLOCK_SIZE+ OK_BLOCK_BLOCK) | 333 | if(ctx->buf_len >= OK_BLOCK_SIZE+ OK_BLOCK_BLOCK) |
349 | { | 334 | { |
350 | if (!block_out(b)) | 335 | block_out(b); |
351 | { | ||
352 | BIO_clear_retry_flags(b); | ||
353 | return 0; | ||
354 | } | ||
355 | } | 336 | } |
356 | }while(inl > 0); | 337 | }while(inl > 0); |
357 | 338 | ||
@@ -398,8 +379,7 @@ static long ok_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
398 | case BIO_CTRL_FLUSH: | 379 | case BIO_CTRL_FLUSH: |
399 | /* do a final write */ | 380 | /* do a final write */ |
400 | if(ctx->blockout == 0) | 381 | if(ctx->blockout == 0) |
401 | if (!block_out(b)) | 382 | block_out(b); |
402 | return 0; | ||
403 | 383 | ||
404 | while (ctx->blockout) | 384 | while (ctx->blockout) |
405 | { | 385 | { |
@@ -428,8 +408,7 @@ static long ok_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
428 | break; | 408 | break; |
429 | case BIO_C_SET_MD: | 409 | case BIO_C_SET_MD: |
430 | md=ptr; | 410 | md=ptr; |
431 | if (!EVP_DigestInit_ex(&ctx->md, md, NULL)) | 411 | EVP_DigestInit_ex(&ctx->md, md, NULL); |
432 | return 0; | ||
433 | b->init=1; | 412 | b->init=1; |
434 | break; | 413 | break; |
435 | case BIO_C_GET_MD: | 414 | case BIO_C_GET_MD: |
@@ -476,7 +455,7 @@ static void longswap(void *_ptr, size_t len) | |||
476 | } | 455 | } |
477 | } | 456 | } |
478 | 457 | ||
479 | static int sig_out(BIO* b) | 458 | static void sig_out(BIO* b) |
480 | { | 459 | { |
481 | BIO_OK_CTX *ctx; | 460 | BIO_OK_CTX *ctx; |
482 | EVP_MD_CTX *md; | 461 | EVP_MD_CTX *md; |
@@ -484,10 +463,9 @@ static int sig_out(BIO* b) | |||
484 | ctx=b->ptr; | 463 | ctx=b->ptr; |
485 | md=&ctx->md; | 464 | md=&ctx->md; |
486 | 465 | ||
487 | if(ctx->buf_len+ 2* md->digest->md_size > OK_BLOCK_SIZE) return 1; | 466 | if(ctx->buf_len+ 2* md->digest->md_size > OK_BLOCK_SIZE) return; |
488 | 467 | ||
489 | if (!EVP_DigestInit_ex(md, md->digest, NULL)) | 468 | EVP_DigestInit_ex(md, md->digest, NULL); |
490 | goto berr; | ||
491 | /* FIXME: there's absolutely no guarantee this makes any sense at all, | 469 | /* FIXME: there's absolutely no guarantee this makes any sense at all, |
492 | * particularly now EVP_MD_CTX has been restructured. | 470 | * particularly now EVP_MD_CTX has been restructured. |
493 | */ | 471 | */ |
@@ -496,20 +474,14 @@ static int sig_out(BIO* b) | |||
496 | longswap(&(ctx->buf[ctx->buf_len]), md->digest->md_size); | 474 | longswap(&(ctx->buf[ctx->buf_len]), md->digest->md_size); |
497 | ctx->buf_len+= md->digest->md_size; | 475 | ctx->buf_len+= md->digest->md_size; |
498 | 476 | ||
499 | if (!EVP_DigestUpdate(md, WELLKNOWN, strlen(WELLKNOWN))) | 477 | EVP_DigestUpdate(md, WELLKNOWN, strlen(WELLKNOWN)); |
500 | goto berr; | 478 | EVP_DigestFinal_ex(md, &(ctx->buf[ctx->buf_len]), NULL); |
501 | if (!EVP_DigestFinal_ex(md, &(ctx->buf[ctx->buf_len]), NULL)) | ||
502 | goto berr; | ||
503 | ctx->buf_len+= md->digest->md_size; | 479 | ctx->buf_len+= md->digest->md_size; |
504 | ctx->blockout= 1; | 480 | ctx->blockout= 1; |
505 | ctx->sigio= 0; | 481 | ctx->sigio= 0; |
506 | return 1; | ||
507 | berr: | ||
508 | BIO_clear_retry_flags(b); | ||
509 | return 0; | ||
510 | } | 482 | } |
511 | 483 | ||
512 | static int sig_in(BIO* b) | 484 | static void sig_in(BIO* b) |
513 | { | 485 | { |
514 | BIO_OK_CTX *ctx; | 486 | BIO_OK_CTX *ctx; |
515 | EVP_MD_CTX *md; | 487 | EVP_MD_CTX *md; |
@@ -519,18 +491,15 @@ static int sig_in(BIO* b) | |||
519 | ctx=b->ptr; | 491 | ctx=b->ptr; |
520 | md=&ctx->md; | 492 | md=&ctx->md; |
521 | 493 | ||
522 | if((int)(ctx->buf_len-ctx->buf_off) < 2*md->digest->md_size) return 1; | 494 | if((int)(ctx->buf_len-ctx->buf_off) < 2*md->digest->md_size) return; |
523 | 495 | ||
524 | if (!EVP_DigestInit_ex(md, md->digest, NULL)) | 496 | EVP_DigestInit_ex(md, md->digest, NULL); |
525 | goto berr; | ||
526 | memcpy(md->md_data, &(ctx->buf[ctx->buf_off]), md->digest->md_size); | 497 | memcpy(md->md_data, &(ctx->buf[ctx->buf_off]), md->digest->md_size); |
527 | longswap(md->md_data, md->digest->md_size); | 498 | longswap(md->md_data, md->digest->md_size); |
528 | ctx->buf_off+= md->digest->md_size; | 499 | ctx->buf_off+= md->digest->md_size; |
529 | 500 | ||
530 | if (!EVP_DigestUpdate(md, WELLKNOWN, strlen(WELLKNOWN))) | 501 | EVP_DigestUpdate(md, WELLKNOWN, strlen(WELLKNOWN)); |
531 | goto berr; | 502 | EVP_DigestFinal_ex(md, tmp, NULL); |
532 | if (!EVP_DigestFinal_ex(md, tmp, NULL)) | ||
533 | goto berr; | ||
534 | ret= memcmp(&(ctx->buf[ctx->buf_off]), tmp, md->digest->md_size) == 0; | 503 | ret= memcmp(&(ctx->buf[ctx->buf_off]), tmp, md->digest->md_size) == 0; |
535 | ctx->buf_off+= md->digest->md_size; | 504 | ctx->buf_off+= md->digest->md_size; |
536 | if(ret == 1) | 505 | if(ret == 1) |
@@ -547,13 +516,9 @@ static int sig_in(BIO* b) | |||
547 | { | 516 | { |
548 | ctx->cont= 0; | 517 | ctx->cont= 0; |
549 | } | 518 | } |
550 | return 1; | ||
551 | berr: | ||
552 | BIO_clear_retry_flags(b); | ||
553 | return 0; | ||
554 | } | 519 | } |
555 | 520 | ||
556 | static int block_out(BIO* b) | 521 | static void block_out(BIO* b) |
557 | { | 522 | { |
558 | BIO_OK_CTX *ctx; | 523 | BIO_OK_CTX *ctx; |
559 | EVP_MD_CTX *md; | 524 | EVP_MD_CTX *md; |
@@ -567,20 +532,13 @@ static int block_out(BIO* b) | |||
567 | ctx->buf[1]=(unsigned char)(tl>>16); | 532 | ctx->buf[1]=(unsigned char)(tl>>16); |
568 | ctx->buf[2]=(unsigned char)(tl>>8); | 533 | ctx->buf[2]=(unsigned char)(tl>>8); |
569 | ctx->buf[3]=(unsigned char)(tl); | 534 | ctx->buf[3]=(unsigned char)(tl); |
570 | if (!EVP_DigestUpdate(md, | 535 | EVP_DigestUpdate(md, (unsigned char*) &(ctx->buf[OK_BLOCK_BLOCK]), tl); |
571 | (unsigned char*) &(ctx->buf[OK_BLOCK_BLOCK]), tl)) | 536 | EVP_DigestFinal_ex(md, &(ctx->buf[ctx->buf_len]), NULL); |
572 | goto berr; | ||
573 | if (!EVP_DigestFinal_ex(md, &(ctx->buf[ctx->buf_len]), NULL)) | ||
574 | goto berr; | ||
575 | ctx->buf_len+= md->digest->md_size; | 537 | ctx->buf_len+= md->digest->md_size; |
576 | ctx->blockout= 1; | 538 | ctx->blockout= 1; |
577 | return 1; | ||
578 | berr: | ||
579 | BIO_clear_retry_flags(b); | ||
580 | return 0; | ||
581 | } | 539 | } |
582 | 540 | ||
583 | static int block_in(BIO* b) | 541 | static void block_in(BIO* b) |
584 | { | 542 | { |
585 | BIO_OK_CTX *ctx; | 543 | BIO_OK_CTX *ctx; |
586 | EVP_MD_CTX *md; | 544 | EVP_MD_CTX *md; |
@@ -596,13 +554,10 @@ static int block_in(BIO* b) | |||
596 | tl|=ctx->buf[2]; tl<<=8; | 554 | tl|=ctx->buf[2]; tl<<=8; |
597 | tl|=ctx->buf[3]; | 555 | tl|=ctx->buf[3]; |
598 | 556 | ||
599 | if (ctx->buf_len < tl+ OK_BLOCK_BLOCK+ md->digest->md_size) return 1; | 557 | if (ctx->buf_len < tl+ OK_BLOCK_BLOCK+ md->digest->md_size) return; |
600 | 558 | ||
601 | if (!EVP_DigestUpdate(md, | 559 | EVP_DigestUpdate(md, (unsigned char*) &(ctx->buf[OK_BLOCK_BLOCK]), tl); |
602 | (unsigned char*) &(ctx->buf[OK_BLOCK_BLOCK]), tl)) | 560 | EVP_DigestFinal_ex(md, tmp, NULL); |
603 | goto berr; | ||
604 | if (!EVP_DigestFinal_ex(md, tmp, NULL)) | ||
605 | goto berr; | ||
606 | if(memcmp(&(ctx->buf[tl+ OK_BLOCK_BLOCK]), tmp, md->digest->md_size) == 0) | 561 | if(memcmp(&(ctx->buf[tl+ OK_BLOCK_BLOCK]), tmp, md->digest->md_size) == 0) |
607 | { | 562 | { |
608 | /* there might be parts from next block lurking around ! */ | 563 | /* there might be parts from next block lurking around ! */ |
@@ -616,9 +571,5 @@ static int block_in(BIO* b) | |||
616 | { | 571 | { |
617 | ctx->cont= 0; | 572 | ctx->cont= 0; |
618 | } | 573 | } |
619 | return 1; | ||
620 | berr: | ||
621 | BIO_clear_retry_flags(b); | ||
622 | return 0; | ||
623 | } | 574 | } |
624 | 575 | ||