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