diff options
Diffstat (limited to 'src/lib/libcrypto/pkcs7/pk7_smime.c')
-rw-r--r-- | src/lib/libcrypto/pkcs7/pk7_smime.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/src/lib/libcrypto/pkcs7/pk7_smime.c b/src/lib/libcrypto/pkcs7/pk7_smime.c index 86742d0dcd..a5104f8d05 100644 --- a/src/lib/libcrypto/pkcs7/pk7_smime.c +++ b/src/lib/libcrypto/pkcs7/pk7_smime.c | |||
@@ -573,15 +573,34 @@ int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data, int flags) | |||
573 | return 0; | 573 | return 0; |
574 | } | 574 | } |
575 | ret = SMIME_text(bread, data); | 575 | ret = SMIME_text(bread, data); |
576 | if (ret > 0 && BIO_method_type(tmpmem) == BIO_TYPE_CIPHER) | ||
577 | { | ||
578 | if (!BIO_get_cipher_status(tmpmem)) | ||
579 | ret = 0; | ||
580 | } | ||
576 | BIO_free_all(bread); | 581 | BIO_free_all(bread); |
577 | return ret; | 582 | return ret; |
578 | } else { | 583 | } else { |
579 | for(;;) { | 584 | for(;;) { |
580 | i = BIO_read(tmpmem, buf, sizeof(buf)); | 585 | i = BIO_read(tmpmem, buf, sizeof(buf)); |
581 | if(i <= 0) break; | 586 | if(i <= 0) |
582 | BIO_write(data, buf, i); | 587 | { |
588 | ret = 1; | ||
589 | if (BIO_method_type(tmpmem) == BIO_TYPE_CIPHER) | ||
590 | { | ||
591 | if (!BIO_get_cipher_status(tmpmem)) | ||
592 | ret = 0; | ||
593 | } | ||
594 | |||
595 | break; | ||
596 | } | ||
597 | if (BIO_write(data, buf, i) != i) | ||
598 | { | ||
599 | ret = 0; | ||
600 | break; | ||
601 | } | ||
583 | } | 602 | } |
584 | BIO_free_all(tmpmem); | 603 | BIO_free_all(tmpmem); |
585 | return 1; | 604 | return ret; |
586 | } | 605 | } |
587 | } | 606 | } |