diff options
| author | djm <> | 2012-10-13 21:23:58 +0000 |
|---|---|---|
| committer | djm <> | 2012-10-13 21:23:58 +0000 |
| commit | adb31f466163d59ad933cf9d299ce6c610f1cff3 (patch) | |
| tree | cfb338ea736543eb88bd6c3f56f007ecb05dce51 /src/lib/libcrypto/evp/bio_ok.c | |
| parent | 767ddad28eb81a703656eed39ed362c83ac9e20a (diff) | |
| download | openbsd-adb31f466163d59ad933cf9d299ce6c610f1cff3.tar.gz openbsd-adb31f466163d59ad933cf9d299ce6c610f1cff3.tar.bz2 openbsd-adb31f466163d59ad933cf9d299ce6c610f1cff3.zip | |
import OpenSSL-1.0.1c
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 | ||
