diff options
Diffstat (limited to 'src/lib/libcrypto/evp/bio_ok.c')
-rw-r--r-- | src/lib/libcrypto/evp/bio_ok.c | 52 |
1 files changed, 29 insertions, 23 deletions
diff --git a/src/lib/libcrypto/evp/bio_ok.c b/src/lib/libcrypto/evp/bio_ok.c index e617ce1d43..3cbc6e7848 100644 --- a/src/lib/libcrypto/evp/bio_ok.c +++ b/src/lib/libcrypto/evp/bio_ok.c | |||
@@ -162,7 +162,7 @@ typedef struct ok_struct | |||
162 | EVP_MD_CTX md; | 162 | EVP_MD_CTX md; |
163 | int blockout; /* output block is ready */ | 163 | int blockout; /* output block is ready */ |
164 | int sigio; /* must process signature */ | 164 | int sigio; /* must process signature */ |
165 | char buf[IOBS]; | 165 | unsigned char buf[IOBS]; |
166 | } BIO_OK_CTX; | 166 | } BIO_OK_CTX; |
167 | 167 | ||
168 | static BIO_METHOD methods_ok= | 168 | static BIO_METHOD methods_ok= |
@@ -199,6 +199,8 @@ static int ok_new(BIO *bi) | |||
199 | ctx->blockout= 0; | 199 | ctx->blockout= 0; |
200 | ctx->sigio=1; | 200 | ctx->sigio=1; |
201 | 201 | ||
202 | EVP_MD_CTX_init(&ctx->md); | ||
203 | |||
202 | bi->init=0; | 204 | bi->init=0; |
203 | bi->ptr=(char *)ctx; | 205 | bi->ptr=(char *)ctx; |
204 | bi->flags=0; | 206 | bi->flags=0; |
@@ -208,6 +210,7 @@ static int ok_new(BIO *bi) | |||
208 | static int ok_free(BIO *a) | 210 | static int ok_free(BIO *a) |
209 | { | 211 | { |
210 | if (a == NULL) return(0); | 212 | if (a == NULL) return(0); |
213 | EVP_MD_CTX_cleanup(&((BIO_OK_CTX *)a->ptr)->md); | ||
211 | memset(a->ptr,0,sizeof(BIO_OK_CTX)); | 214 | memset(a->ptr,0,sizeof(BIO_OK_CTX)); |
212 | OPENSSL_free(a->ptr); | 215 | OPENSSL_free(a->ptr); |
213 | a->ptr=NULL; | 216 | a->ptr=NULL; |
@@ -353,7 +356,7 @@ static long ok_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
353 | long ret=1; | 356 | long ret=1; |
354 | int i; | 357 | int i; |
355 | 358 | ||
356 | ctx=(BIO_OK_CTX *)b->ptr; | 359 | ctx=b->ptr; |
357 | 360 | ||
358 | switch (cmd) | 361 | switch (cmd) |
359 | { | 362 | { |
@@ -411,14 +414,14 @@ static long ok_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
411 | ret=(long)ctx->cont; | 414 | ret=(long)ctx->cont; |
412 | break; | 415 | break; |
413 | case BIO_C_SET_MD: | 416 | case BIO_C_SET_MD: |
414 | md=(EVP_MD *)ptr; | 417 | md=ptr; |
415 | EVP_DigestInit(&(ctx->md),md); | 418 | EVP_DigestInit_ex(&ctx->md, md, NULL); |
416 | b->init=1; | 419 | b->init=1; |
417 | break; | 420 | break; |
418 | case BIO_C_GET_MD: | 421 | case BIO_C_GET_MD: |
419 | if (b->init) | 422 | if (b->init) |
420 | { | 423 | { |
421 | ppmd=(const EVP_MD **)ptr; | 424 | ppmd=ptr; |
422 | *ppmd=ctx->md.digest; | 425 | *ppmd=ctx->md.digest; |
423 | } | 426 | } |
424 | else | 427 | else |
@@ -462,19 +465,22 @@ static void sig_out(BIO* b) | |||
462 | BIO_OK_CTX *ctx; | 465 | BIO_OK_CTX *ctx; |
463 | EVP_MD_CTX *md; | 466 | EVP_MD_CTX *md; |
464 | 467 | ||
465 | ctx=(BIO_OK_CTX *)b->ptr; | 468 | ctx=b->ptr; |
466 | md= &(ctx->md); | 469 | md=&ctx->md; |
467 | 470 | ||
468 | if(ctx->buf_len+ 2* md->digest->md_size > OK_BLOCK_SIZE) return; | 471 | if(ctx->buf_len+ 2* md->digest->md_size > OK_BLOCK_SIZE) return; |
469 | 472 | ||
470 | EVP_DigestInit(md, md->digest); | 473 | EVP_DigestInit_ex(md, md->digest, NULL); |
471 | RAND_pseudo_bytes(&(md->md.base[0]), md->digest->md_size); | 474 | /* FIXME: there's absolutely no guarantee this makes any sense at all, |
472 | memcpy(&(ctx->buf[ctx->buf_len]), &(md->md.base[0]), md->digest->md_size); | 475 | * particularly now EVP_MD_CTX has been restructured. |
476 | */ | ||
477 | RAND_pseudo_bytes(md->md_data, md->digest->md_size); | ||
478 | memcpy(&(ctx->buf[ctx->buf_len]), md->md_data, md->digest->md_size); | ||
473 | longswap(&(ctx->buf[ctx->buf_len]), md->digest->md_size); | 479 | longswap(&(ctx->buf[ctx->buf_len]), md->digest->md_size); |
474 | ctx->buf_len+= md->digest->md_size; | 480 | ctx->buf_len+= md->digest->md_size; |
475 | 481 | ||
476 | EVP_DigestUpdate(md, WELLKNOWN, strlen(WELLKNOWN)); | 482 | EVP_DigestUpdate(md, WELLKNOWN, strlen(WELLKNOWN)); |
477 | md->digest->final(&(ctx->buf[ctx->buf_len]), &(md->md.base[0])); | 483 | EVP_DigestFinal_ex(md, &(ctx->buf[ctx->buf_len]), NULL); |
478 | ctx->buf_len+= md->digest->md_size; | 484 | ctx->buf_len+= md->digest->md_size; |
479 | ctx->blockout= 1; | 485 | ctx->blockout= 1; |
480 | ctx->sigio= 0; | 486 | ctx->sigio= 0; |
@@ -487,18 +493,18 @@ static void sig_in(BIO* b) | |||
487 | unsigned char tmp[EVP_MAX_MD_SIZE]; | 493 | unsigned char tmp[EVP_MAX_MD_SIZE]; |
488 | int ret= 0; | 494 | int ret= 0; |
489 | 495 | ||
490 | ctx=(BIO_OK_CTX *)b->ptr; | 496 | ctx=b->ptr; |
491 | md= &(ctx->md); | 497 | md=&ctx->md; |
492 | 498 | ||
493 | if(ctx->buf_len- ctx->buf_off < 2* md->digest->md_size) return; | 499 | if(ctx->buf_len- ctx->buf_off < 2* md->digest->md_size) return; |
494 | 500 | ||
495 | EVP_DigestInit(md, md->digest); | 501 | EVP_DigestInit_ex(md, md->digest, NULL); |
496 | memcpy(&(md->md.base[0]), &(ctx->buf[ctx->buf_off]), md->digest->md_size); | 502 | memcpy(md->md_data, &(ctx->buf[ctx->buf_off]), md->digest->md_size); |
497 | longswap(&(md->md.base[0]), md->digest->md_size); | 503 | longswap(md->md_data, md->digest->md_size); |
498 | ctx->buf_off+= md->digest->md_size; | 504 | ctx->buf_off+= md->digest->md_size; |
499 | 505 | ||
500 | EVP_DigestUpdate(md, WELLKNOWN, strlen(WELLKNOWN)); | 506 | EVP_DigestUpdate(md, WELLKNOWN, strlen(WELLKNOWN)); |
501 | md->digest->final(tmp, &(md->md.base[0])); | 507 | EVP_DigestFinal_ex(md, tmp, NULL); |
502 | ret= memcmp(&(ctx->buf[ctx->buf_off]), tmp, md->digest->md_size) == 0; | 508 | ret= memcmp(&(ctx->buf[ctx->buf_off]), tmp, md->digest->md_size) == 0; |
503 | ctx->buf_off+= md->digest->md_size; | 509 | ctx->buf_off+= md->digest->md_size; |
504 | if(ret == 1) | 510 | if(ret == 1) |
@@ -523,15 +529,15 @@ static void block_out(BIO* b) | |||
523 | EVP_MD_CTX *md; | 529 | EVP_MD_CTX *md; |
524 | unsigned long tl; | 530 | unsigned long tl; |
525 | 531 | ||
526 | ctx=(BIO_OK_CTX *)b->ptr; | 532 | ctx=b->ptr; |
527 | md= &(ctx->md); | 533 | md=&ctx->md; |
528 | 534 | ||
529 | tl= ctx->buf_len- OK_BLOCK_BLOCK; | 535 | tl= ctx->buf_len- OK_BLOCK_BLOCK; |
530 | tl= swapem(tl); | 536 | tl= swapem(tl); |
531 | memcpy(ctx->buf, &tl, OK_BLOCK_BLOCK); | 537 | memcpy(ctx->buf, &tl, OK_BLOCK_BLOCK); |
532 | tl= swapem(tl); | 538 | tl= swapem(tl); |
533 | EVP_DigestUpdate(md, (unsigned char*) &(ctx->buf[OK_BLOCK_BLOCK]), tl); | 539 | EVP_DigestUpdate(md, (unsigned char*) &(ctx->buf[OK_BLOCK_BLOCK]), tl); |
534 | md->digest->final(&(ctx->buf[ctx->buf_len]), &(md->md.base[0])); | 540 | EVP_DigestFinal_ex(md, &(ctx->buf[ctx->buf_len]), NULL); |
535 | ctx->buf_len+= md->digest->md_size; | 541 | ctx->buf_len+= md->digest->md_size; |
536 | ctx->blockout= 1; | 542 | ctx->blockout= 1; |
537 | } | 543 | } |
@@ -543,15 +549,15 @@ static void block_in(BIO* b) | |||
543 | long tl= 0; | 549 | long tl= 0; |
544 | unsigned char tmp[EVP_MAX_MD_SIZE]; | 550 | unsigned char tmp[EVP_MAX_MD_SIZE]; |
545 | 551 | ||
546 | ctx=(BIO_OK_CTX *)b->ptr; | 552 | ctx=b->ptr; |
547 | md= &(ctx->md); | 553 | md=&ctx->md; |
548 | 554 | ||
549 | memcpy(&tl, ctx->buf, OK_BLOCK_BLOCK); | 555 | memcpy(&tl, ctx->buf, OK_BLOCK_BLOCK); |
550 | tl= swapem(tl); | 556 | tl= swapem(tl); |
551 | if (ctx->buf_len < tl+ OK_BLOCK_BLOCK+ md->digest->md_size) return; | 557 | if (ctx->buf_len < tl+ OK_BLOCK_BLOCK+ md->digest->md_size) return; |
552 | 558 | ||
553 | EVP_DigestUpdate(md, (unsigned char*) &(ctx->buf[OK_BLOCK_BLOCK]), tl); | 559 | EVP_DigestUpdate(md, (unsigned char*) &(ctx->buf[OK_BLOCK_BLOCK]), tl); |
554 | md->digest->final(tmp, &(md->md.base[0])); | 560 | EVP_DigestFinal_ex(md, tmp, NULL); |
555 | 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) |
556 | { | 562 | { |
557 | /* there might be parts from next block lurking around ! */ | 563 | /* there might be parts from next block lurking around ! */ |