summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/evp/bio_ok.c
diff options
context:
space:
mode:
authorbeck <>2002-05-15 02:29:21 +0000
committerbeck <>2002-05-15 02:29:21 +0000
commitb64270d1e45fe7f3241e4c9b6ce60d5ac89bc2e9 (patch)
treefa27cf82a1250b64ed3bf5f4a18c7354d470bbcc /src/lib/libcrypto/evp/bio_ok.c
parente471e1ea98d673597b182ea85f29e30c97cd08b5 (diff)
downloadopenbsd-b64270d1e45fe7f3241e4c9b6ce60d5ac89bc2e9.tar.gz
openbsd-b64270d1e45fe7f3241e4c9b6ce60d5ac89bc2e9.tar.bz2
openbsd-b64270d1e45fe7f3241e4c9b6ce60d5ac89bc2e9.zip
OpenSSL 0.9.7 stable 2002 05 08 merge
Diffstat (limited to 'src/lib/libcrypto/evp/bio_ok.c')
-rw-r--r--src/lib/libcrypto/evp/bio_ok.c52
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
168static BIO_METHOD methods_ok= 168static 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)
208static int ok_free(BIO *a) 210static 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 ! */