提交 776654ad 编写于 作者: D Dr. Stephen Henson

PR: 2295

Submitted by: Alexei Khlebnikov <alexei.khlebnikov@opera.com>
Reviewed by: steve

OOM checking. Leak in OOM fix. Fall-through comment. Duplicate code
elimination.
上级 d6522548
...@@ -301,7 +301,8 @@ int BN_mod_exp2_mont(BIGNUM *rr, const BIGNUM *a1, const BIGNUM *p1, ...@@ -301,7 +301,8 @@ int BN_mod_exp2_mont(BIGNUM *rr, const BIGNUM *a1, const BIGNUM *p1,
r_is_one = 0; r_is_one = 0;
} }
} }
BN_from_montgomery(rr,r,mont,ctx); if (!BN_from_montgomery(rr,r,mont,ctx))
goto err;
ret=1; ret=1;
err: err:
if ((in_mont == NULL) && (mont != NULL)) BN_MONT_CTX_free(mont); if ((in_mont == NULL) && (mont != NULL)) BN_MONT_CTX_free(mont);
......
...@@ -185,7 +185,7 @@ static DSA_SIG *dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa) ...@@ -185,7 +185,7 @@ static DSA_SIG *dsa_do_sign(const unsigned char *dgst, int dlen, DSA *dsa)
if (!BN_mod_mul(&xr,dsa->priv_key,r,dsa->q,ctx)) goto err;/* s = xr */ if (!BN_mod_mul(&xr,dsa->priv_key,r,dsa->q,ctx)) goto err;/* s = xr */
if (!BN_add(s, &xr, &m)) goto err; /* s = m + xr */ if (!BN_add(s, &xr, &m)) goto err; /* s = m + xr */
if (BN_cmp(s,dsa->q) > 0) if (BN_cmp(s,dsa->q) > 0)
BN_sub(s,s,dsa->q); if (!BN_sub(s,s,dsa->q)) goto err;
if (!BN_mod_mul(s,s,kinv,dsa->q,ctx)) goto err; if (!BN_mod_mul(s,s,kinv,dsa->q,ctx)) goto err;
ret=DSA_SIG_new(); ret=DSA_SIG_new();
......
...@@ -204,6 +204,7 @@ skip_to_init: ...@@ -204,6 +204,7 @@ skip_to_init:
case EVP_CIPH_OFB_MODE: case EVP_CIPH_OFB_MODE:
ctx->num = 0; ctx->num = 0;
/* fall-through */
case EVP_CIPH_CBC_MODE: case EVP_CIPH_CBC_MODE:
......
...@@ -107,6 +107,7 @@ int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, ...@@ -107,6 +107,7 @@ int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt,
unsigned char *B, *D, *I, *p, *Ai; unsigned char *B, *D, *I, *p, *Ai;
int Slen, Plen, Ilen, Ijlen; int Slen, Plen, Ilen, Ijlen;
int i, j, u, v; int i, j, u, v;
int ret = 0;
BIGNUM *Ij, *Bpl1; /* These hold Ij and B + 1 */ BIGNUM *Ij, *Bpl1; /* These hold Ij and B + 1 */
EVP_MD_CTX ctx; EVP_MD_CTX ctx;
#ifdef DEBUG_KEYGEN #ifdef DEBUG_KEYGEN
...@@ -144,10 +145,8 @@ int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, ...@@ -144,10 +145,8 @@ int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt,
I = OPENSSL_malloc (Ilen); I = OPENSSL_malloc (Ilen);
Ij = BN_new(); Ij = BN_new();
Bpl1 = BN_new(); Bpl1 = BN_new();
if (!D || !Ai || !B || !I || !Ij || !Bpl1) { if (!D || !Ai || !B || !I || !Ij || !Bpl1)
PKCS12err(PKCS12_F_PKCS12_KEY_GEN_UNI,ERR_R_MALLOC_FAILURE); goto err;
return 0;
}
for (i = 0; i < v; i++) D[i] = id; for (i = 0; i < v; i++) D[i] = id;
p = I; p = I;
for (i = 0; i < Slen; i++) *p++ = salt[i % saltlen]; for (i = 0; i < Slen; i++) *p++ = salt[i % saltlen];
...@@ -166,18 +165,12 @@ int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, ...@@ -166,18 +165,12 @@ int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt,
} }
memcpy (out, Ai, min (n, u)); memcpy (out, Ai, min (n, u));
if (u >= n) { if (u >= n) {
OPENSSL_free (Ai);
OPENSSL_free (B);
OPENSSL_free (D);
OPENSSL_free (I);
BN_free (Ij);
BN_free (Bpl1);
EVP_MD_CTX_cleanup(&ctx);
#ifdef DEBUG_KEYGEN #ifdef DEBUG_KEYGEN
fprintf(stderr, "Output KEY (length %d)\n", tmpn); fprintf(stderr, "Output KEY (length %d)\n", tmpn);
h__dump(tmpout, tmpn); h__dump(tmpout, tmpn);
#endif #endif
return 1; ret = 1;
goto end;
} }
n -= u; n -= u;
out += u; out += u;
...@@ -186,26 +179,41 @@ int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, ...@@ -186,26 +179,41 @@ int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt,
BN_bin2bn (B, v, Bpl1); BN_bin2bn (B, v, Bpl1);
BN_add_word (Bpl1, 1); BN_add_word (Bpl1, 1);
for (j = 0; j < Ilen ; j+=v) { for (j = 0; j < Ilen ; j+=v) {
BN_bin2bn (I + j, v, Ij); if (!BN_bin2bn(I + j, v, Ij))
BN_add (Ij, Ij, Bpl1); goto err;
BN_bn2bin (Ij, B); if (!BN_add(Ij, Ij, Bpl1))
goto err;
if (!BN_bn2bin(Ij, B))
goto err;
Ijlen = BN_num_bytes (Ij); Ijlen = BN_num_bytes (Ij);
/* If more than 2^(v*8) - 1 cut off MSB */ /* If more than 2^(v*8) - 1 cut off MSB */
if (Ijlen > v) { if (Ijlen > v) {
BN_bn2bin (Ij, B); if (!BN_bn2bin (Ij, B))
goto err;
memcpy (I + j, B + 1, v); memcpy (I + j, B + 1, v);
#ifndef PKCS12_BROKEN_KEYGEN #ifndef PKCS12_BROKEN_KEYGEN
/* If less than v bytes pad with zeroes */ /* If less than v bytes pad with zeroes */
} else if (Ijlen < v) { } else if (Ijlen < v) {
memset(I + j, 0, v - Ijlen); memset(I + j, 0, v - Ijlen);
BN_bn2bin(Ij, I + j + v - Ijlen); if (!BN_bn2bin(Ij, I + j + v - Ijlen))
goto err;
#endif #endif
} else BN_bn2bin (Ij, I + j); } else if (!BN_bn2bin (Ij, I + j))
goto err;
} }
} }
err: err:
PKCS12err(PKCS12_F_PKCS12_KEY_GEN_UNI,ERR_R_MALLOC_FAILURE);
end:
OPENSSL_free (Ai);
OPENSSL_free (B);
OPENSSL_free (D);
OPENSSL_free (I);
BN_free (Ij);
BN_free (Bpl1);
EVP_MD_CTX_cleanup(&ctx); EVP_MD_CTX_cleanup(&ctx);
return 0; return ret;
} }
#ifdef DEBUG_KEYGEN #ifdef DEBUG_KEYGEN
void h__dump (unsigned char *p, int len) void h__dump (unsigned char *p, int len)
......
...@@ -675,7 +675,7 @@ static int RSA_eay_public_decrypt(int flen, const unsigned char *from, ...@@ -675,7 +675,7 @@ static int RSA_eay_public_decrypt(int flen, const unsigned char *from,
rsa->_method_mod_n)) goto err; rsa->_method_mod_n)) goto err;
if ((padding == RSA_X931_PADDING) && ((ret->d[0] & 0xf) != 12)) if ((padding == RSA_X931_PADDING) && ((ret->d[0] & 0xf) != 12))
BN_sub(ret, rsa->n, ret); if (!BN_sub(ret, rsa->n, ret)) goto err;
p=buf; p=buf;
i=BN_bn2bin(ret,p); i=BN_bn2bin(ret,p);
......
...@@ -189,7 +189,6 @@ static int do_i2r_name_constraints(const X509V3_EXT_METHOD *method, ...@@ -189,7 +189,6 @@ static int do_i2r_name_constraints(const X509V3_EXT_METHOD *method,
print_nc_ipadd(bp, tree->base->d.ip); print_nc_ipadd(bp, tree->base->d.ip);
else else
GENERAL_NAME_print(bp, tree->base); GENERAL_NAME_print(bp, tree->base);
tree = sk_GENERAL_SUBTREE_value(trees, i);
BIO_puts(bp, "\n"); BIO_puts(bp, "\n");
} }
return 1; return 1;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册