summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/evp/bio_ok.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/evp/bio_ok.c')
-rw-r--r--src/lib/libcrypto/evp/bio_ok.c103
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);
133static int ok_free(BIO *data); 133static int ok_free(BIO *data);
134static long ok_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp); 134static long ok_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp);
135 135
136static int sig_out(BIO* b); 136static void sig_out(BIO* b);
137static int sig_in(BIO* b); 137static void sig_in(BIO* b);
138static int block_out(BIO* b); 138static void block_out(BIO* b);
139static int block_in(BIO* b); 139static 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
479static int sig_out(BIO* b) 458static 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
512static int sig_in(BIO* b) 484static 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
556static int block_out(BIO* b) 521static 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
583static int block_in(BIO* b) 541static 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