Fix for a bug which meant encrypting BIOs sometimes wouldn't read the final

block.
This commit is contained in:
Dr. Stephen Henson 1999-08-24 13:21:35 +00:00
parent 13066cee60
commit 7b65c3298f
2 changed files with 18 additions and 3 deletions

View File

@ -4,6 +4,13 @@
Changes between 0.9.4 and 0.9.5 [xx XXX 1999] Changes between 0.9.4 and 0.9.5 [xx XXX 1999]
*) Fix a horrible bug in enc_read() in crypto/evp/bio_enc.c: if the first data
read consists of only the final block it would not decrypted because
EVP_CipherUpdate() would correctly report zero bytes had been decrypted.
A misplaced 'break' also meant the decrypted final block might not be
copied until the next read.
[Steve Henson]
*) Initial support for DH_METHOD. Again based on RSA_METHOD. Also added *) Initial support for DH_METHOD. Again based on RSA_METHOD. Also added
a few extra parameters to the DH structure: these will be useful if a few extra parameters to the DH structure: these will be useful if
for example we want the value of 'q' or implement X9.42 DH. for example we want the value of 'q' or implement X9.42 DH.

View File

@ -185,8 +185,10 @@ static int enc_read(BIO *b, char *out, int outl)
ctx->buf_off=0; ctx->buf_off=0;
} }
else else
{
ret=(ret == 0)?i:ret; ret=(ret == 0)?i:ret;
break; break;
}
} }
else else
{ {
@ -194,13 +196,19 @@ static int enc_read(BIO *b, char *out, int outl)
(unsigned char *)ctx->buf,&ctx->buf_len, (unsigned char *)ctx->buf,&ctx->buf_len,
(unsigned char *)&(ctx->buf[8]),i); (unsigned char *)&(ctx->buf[8]),i);
ctx->cont=1; ctx->cont=1;
/* Note: it is possible for EVP_CipherUpdate to
* decrypt zero bytes because this is or looks like
* the final block: if this happens we should retry
* and either read more data or decrypt the final
* block
*/
if(ctx->buf_len == 0) continue;
} }
if (ctx->buf_len <= outl) if (ctx->buf_len <= outl)
i=ctx->buf_len; i=ctx->buf_len;
else else
i=outl; i=outl;
if (i <= 0) break; if (i <= 0) break;
memcpy(out,ctx->buf,i); memcpy(out,ctx->buf,i);
ret+=i; ret+=i;