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 | ||
