Index: openssl/crypto/pkcs12/p12_key.c |
=================================================================== |
--- openssl/crypto/pkcs12/p12_key.c (revision 105093) |
+++ openssl/crypto/pkcs12/p12_key.c (working copy) |
@@ -69,12 +69,6 @@ |
void h__dump (unsigned char *p, int len); |
#endif |
-#ifdef OPENSSL_SYS_NETWARE |
-/* Rename these functions to avoid name clashes on NetWare OS */ |
-#define uni2asc OPENSSL_uni2asc |
-#define asc2uni OPENSSL_asc2uni |
-#endif |
- |
/* PKCS12 compatible key/IV generation */ |
#ifndef min |
#define min(a,b) ((a) < (b) ? (a) : (b)) |
@@ -87,15 +81,18 @@ |
int ret; |
unsigned char *unipass; |
int uniplen; |
+ |
if(!pass) { |
unipass = NULL; |
uniplen = 0; |
- } else if (!asc2uni(pass, passlen, &unipass, &uniplen)) { |
+ } else if (!OPENSSL_asc2uni(pass, passlen, &unipass, &uniplen)) { |
PKCS12err(PKCS12_F_PKCS12_KEY_GEN_ASC,ERR_R_MALLOC_FAILURE); |
return 0; |
} |
ret = PKCS12_key_gen_uni(unipass, uniplen, salt, saltlen, |
id, iter, n, out, md_type); |
+ if (ret <= 0) |
+ return 0; |
if(unipass) { |
OPENSSL_cleanse(unipass, uniplen); /* Clear password from memory */ |
OPENSSL_free(unipass); |
@@ -110,6 +107,7 @@ |
unsigned char *B, *D, *I, *p, *Ai; |
int Slen, Plen, Ilen, Ijlen; |
int i, j, u, v; |
+ int ret = 0; |
BIGNUM *Ij, *Bpl1; /* These hold Ij and B + 1 */ |
EVP_MD_CTX ctx; |
#ifdef DEBUG_KEYGEN |
@@ -135,6 +133,8 @@ |
#endif |
v = EVP_MD_block_size (md_type); |
u = EVP_MD_size (md_type); |
+ if (u < 0) |
+ return 0; |
D = OPENSSL_malloc (v); |
Ai = OPENSSL_malloc (u); |
B = OPENSSL_malloc (v + 1); |
@@ -145,10 +145,8 @@ |
I = OPENSSL_malloc (Ilen); |
Ij = BN_new(); |
Bpl1 = BN_new(); |
- if (!D || !Ai || !B || !I || !Ij || !Bpl1) { |
- PKCS12err(PKCS12_F_PKCS12_KEY_GEN_UNI,ERR_R_MALLOC_FAILURE); |
- return 0; |
- } |
+ if (!D || !Ai || !B || !I || !Ij || !Bpl1) |
+ goto err; |
for (i = 0; i < v; i++) D[i] = id; |
p = I; |
for (i = 0; i < Slen; i++) *p++ = salt[i % saltlen]; |
@@ -165,28 +163,22 @@ |
} |
memcpy (out, Ai, min (n, u)); |
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 |
fprintf(stderr, "Output KEY (length %d)\n", tmpn); |
h__dump(tmpout, tmpn); |
#endif |
- return 1; |
+ ret = 1; |
+ goto end; |
} |
n -= u; |
out += u; |
for (j = 0; j < v; j++) B[j] = Ai[j % u]; |
/* Work out B + 1 first then can use B as tmp space */ |
- BN_bin2bn (B, v, Bpl1); |
- BN_add_word (Bpl1, 1); |
+ if (!BN_bin2bn (B, v, Bpl1)) goto err; |
+ if (!BN_add_word (Bpl1, 1)) goto err; |
for (j = 0; j < Ilen ; j+=v) { |
- BN_bin2bn (I + j, v, Ij); |
- BN_add (Ij, Ij, Bpl1); |
+ if (!BN_bin2bn (I + j, v, Ij)) goto err; |
+ if (!BN_add (Ij, Ij, Bpl1)) goto err; |
BN_bn2bin (Ij, B); |
Ijlen = BN_num_bytes (Ij); |
/* If more than 2^(v*8) - 1 cut off MSB */ |
@@ -202,6 +194,19 @@ |
} else BN_bn2bin (Ij, I + j); |
} |
} |
+ |
+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); |
+ return ret; |
} |
#ifdef DEBUG_KEYGEN |
void h__dump (unsigned char *p, int len) |