提交 9ae08a9c 编写于 作者: B Bodo Möller

Make sure buffers are large enough even for weird parameters

Submitted by: Nils Larsch
上级 76f8a1f5
...@@ -100,10 +100,34 @@ int RSA_print(BIO *bp, const RSA *x, int off) ...@@ -100,10 +100,34 @@ int RSA_print(BIO *bp, const RSA *x, int off)
char str[128]; char str[128];
const char *s; const char *s;
unsigned char *m=NULL; unsigned char *m=NULL;
int i,ret=0; int ret=0;
size_t buf_len=0, i;
i=RSA_size(x); if (x->n)
m=(unsigned char *)OPENSSL_malloc((unsigned int)i+10); buf_len = (size_t)BN_num_bytes(x->n);
if (x->e)
if (buf_len < (i = (size_t)BN_num_bytes(x->e)))
buf_len = i;
if (x->d)
if (buf_len < (i = (size_t)BN_num_bytes(x->d)))
buf_len = i;
if (x->p)
if (buf_len < (i = (size_t)BN_num_bytes(x->p)))
buf_len = i;
if (x->q)
if (buf_len < (i = (size_t)BN_num_bytes(x->q)))
buf_len = i;
if (x->dmp1)
if (buf_len < (i = (size_t)BN_num_bytes(x->dmp1)))
buf_len = i;
if (x->dmq1)
if (buf_len < (i = (size_t)BN_num_bytes(x->dmq1)))
buf_len = i;
if (x->iqmp)
if (buf_len < (i = (size_t)BN_num_bytes(x->iqmp)))
buf_len = i;
m=(unsigned char *)OPENSSL_malloc(buf_len+10);
if (m == NULL) if (m == NULL)
{ {
RSAerr(RSA_F_RSA_PRINT,ERR_R_MALLOC_FAILURE); RSAerr(RSA_F_RSA_PRINT,ERR_R_MALLOC_FAILURE);
...@@ -165,22 +189,25 @@ int DSA_print(BIO *bp, const DSA *x, int off) ...@@ -165,22 +189,25 @@ int DSA_print(BIO *bp, const DSA *x, int off)
{ {
char str[128]; char str[128];
unsigned char *m=NULL; unsigned char *m=NULL;
int i,ret=0; int ret=0;
BIGNUM *bn=NULL; size_t buf_len=0,i;
if (x->p != NULL) if (x->p)
bn=x->p; buf_len = (size_t)BN_num_bytes(x->p);
else if (x->priv_key != NULL) if (x->q)
bn=x->priv_key; if (buf_len < (i = (size_t)BN_num_bytes(x->q)))
else if (x->pub_key != NULL) buf_len = i;
bn=x->pub_key; if (x->g)
if (buf_len < (i = (size_t)BN_num_bytes(x->g)))
/* larger than needed but what the hell :-) */ buf_len = i;
if (bn != NULL) if (x->priv_key)
i=BN_num_bytes(bn)*2; if (buf_len < (i = (size_t)BN_num_bytes(x->priv_key)))
else buf_len = i;
i=256; if (x->pub_key)
m=(unsigned char *)OPENSSL_malloc((unsigned int)i+10); if (buf_len < (i = (size_t)BN_num_bytes(x->pub_key)))
buf_len = i;
m=(unsigned char *)OPENSSL_malloc(buf_len+10);
if (m == NULL) if (m == NULL)
{ {
DSAerr(DSA_F_DSA_PRINT,ERR_R_MALLOC_FAILURE); DSAerr(DSA_F_DSA_PRINT,ERR_R_MALLOC_FAILURE);
...@@ -572,10 +599,15 @@ int DHparams_print_fp(FILE *fp, const DH *x) ...@@ -572,10 +599,15 @@ int DHparams_print_fp(FILE *fp, const DH *x)
int DHparams_print(BIO *bp, const DH *x) int DHparams_print(BIO *bp, const DH *x)
{ {
unsigned char *m=NULL; unsigned char *m=NULL;
int reason=ERR_R_BUF_LIB,i,ret=0; int reason=ERR_R_BUF_LIB,ret=0;
size_t buf_len=0, i;
i=BN_num_bytes(x->p); if (x->p)
m=(unsigned char *)OPENSSL_malloc((unsigned int)i+10); buf_len = (size_t)BN_num_bytes(x->p);
if (x->g)
if (buf_len < (i = (size_t)BN_num_bytes(x->g)))
buf_len = i;
m=(unsigned char *)OPENSSL_malloc(buf_len+10);
if (m == NULL) if (m == NULL)
{ {
reason=ERR_R_MALLOC_FAILURE; reason=ERR_R_MALLOC_FAILURE;
...@@ -625,10 +657,18 @@ int DSAparams_print_fp(FILE *fp, const DSA *x) ...@@ -625,10 +657,18 @@ int DSAparams_print_fp(FILE *fp, const DSA *x)
int DSAparams_print(BIO *bp, const DSA *x) int DSAparams_print(BIO *bp, const DSA *x)
{ {
unsigned char *m=NULL; unsigned char *m=NULL;
int reason=ERR_R_BUF_LIB,i,ret=0; int reason=ERR_R_BUF_LIB,ret=0;
size_t buf_len=0,i;
i=BN_num_bytes(x->p); if (x->p)
m=(unsigned char *)OPENSSL_malloc((unsigned int)i+10); buf_len = (size_t)BN_num_bytes(x->p);
if (x->q)
if (buf_len < (i = (size_t)BN_num_bytes(x->q)))
buf_len = i;
if (x->g)
if (buf_len < (i = (size_t)BN_num_bytes(x->g)))
buf_len = i;
m=(unsigned char *)OPENSSL_malloc(buf_len+10);
if (m == NULL) if (m == NULL)
{ {
reason=ERR_R_MALLOC_FAILURE; reason=ERR_R_MALLOC_FAILURE;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册