projects
/
oweals
/
openssl.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
In RSA, DSA, DH, and RAND - if the "***_new()" function fails because the
[oweals/openssl.git]
/
crypto
/
pkcs12
/
p12_key.c
diff --git
a/crypto/pkcs12/p12_key.c
b/crypto/pkcs12/p12_key.c
index b364671ed2264b3b8807daa67be37a7ef1640748..a4fd5b98ec9ab85bc7941609b89e0893614d2dec 100644
(file)
--- a/
crypto/pkcs12/p12_key.c
+++ b/
crypto/pkcs12/p12_key.c
@@
-74,30
+74,35
@@
void h__dump (unsigned char *p, int len);
#define min(a,b) ((a) < (b) ? (a) : (b))
#endif
#define min(a,b) ((a) < (b) ? (a) : (b))
#endif
-int PKCS12_key_gen_asc
(const char *pass, int passlen, unsigned char *salt,
+int PKCS12_key_gen_asc(const char *pass, int passlen, unsigned char *salt,
int saltlen, int id, int iter, int n, unsigned char *out,
const EVP_MD *md_type)
{
int ret;
unsigned char *unipass;
int uniplen;
int saltlen, int id, int iter, int n, unsigned char *out,
const EVP_MD *md_type)
{
int ret;
unsigned char *unipass;
int uniplen;
- if (!asc2uni (pass, &unipass, &uniplen)) {
+ if(!pass) {
+ unipass = NULL;
+ uniplen = 0;
+ } else if (!asc2uni(pass, passlen, &unipass, &uniplen)) {
PKCS12err(PKCS12_F_PKCS12_KEY_GEN_ASC,ERR_R_MALLOC_FAILURE);
return 0;
}
PKCS12err(PKCS12_F_PKCS12_KEY_GEN_ASC,ERR_R_MALLOC_FAILURE);
return 0;
}
- ret = PKCS12_key_gen_uni
(unipass, uniplen, salt, saltlen,
+ ret = PKCS12_key_gen_uni(unipass, uniplen, salt, saltlen,
id, iter, n, out, md_type);
id, iter, n, out, md_type);
- memset(unipass, 0, uniplen); /* Clear password from memory */
- Free(unipass);
+ if(unipass) {
+ memset(unipass, 0, uniplen); /* Clear password from memory */
+ OPENSSL_free(unipass);
+ }
return ret;
}
return ret;
}
-int PKCS12_key_gen_uni
(unsigned char *pass, int passlen, unsigned char *salt,
+int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt,
int saltlen, int id, int iter, int n, unsigned char *out,
const EVP_MD *md_type)
{
unsigned char *B, *D, *I, *p, *Ai;
int saltlen, int id, int iter, int n, unsigned char *out,
const EVP_MD *md_type)
{
unsigned char *B, *D, *I, *p, *Ai;
- int Slen, Plen, Ilen;
+ int Slen, Plen, Ilen
, Ijlen
;
int i, j, u, v;
BIGNUM *Ij, *Bpl1; /* These hold Ij and B + 1 */
EVP_MD_CTX ctx;
int i, j, u, v;
BIGNUM *Ij, *Bpl1; /* These hold Ij and B + 1 */
EVP_MD_CTX ctx;
@@
-106,10
+111,12
@@
int PKCS12_key_gen_uni (unsigned char *pass, int passlen, unsigned char *salt,
int tmpn = n;
#endif
int tmpn = n;
#endif
+#if 0
if (!pass) {
PKCS12err(PKCS12_F_PKCS12_KEY_GEN_UNI,ERR_R_PASSED_NULL_PARAMETER);
return 0;
}
if (!pass) {
PKCS12err(PKCS12_F_PKCS12_KEY_GEN_UNI,ERR_R_PASSED_NULL_PARAMETER);
return 0;
}
+#endif
#ifdef DEBUG_KEYGEN
fprintf(stderr, "KEYGEN DEBUG\n");
#ifdef DEBUG_KEYGEN
fprintf(stderr, "KEYGEN DEBUG\n");
@@
-121,13
+128,14
@@
int PKCS12_key_gen_uni (unsigned char *pass, int passlen, unsigned char *salt,
#endif
v = EVP_MD_block_size (md_type);
u = EVP_MD_size (md_type);
#endif
v = EVP_MD_block_size (md_type);
u = EVP_MD_size (md_type);
- D =
M
alloc (v);
- Ai =
M
alloc (u);
- B =
M
alloc (v + 1);
+ D =
OPENSSL_m
alloc (v);
+ Ai =
OPENSSL_m
alloc (u);
+ B =
OPENSSL_m
alloc (v + 1);
Slen = v * ((saltlen+v-1)/v);
Slen = v * ((saltlen+v-1)/v);
- Plen = v * ((passlen+v-1)/v);
+ if(passlen) Plen = v * ((passlen+v-1)/v);
+ else Plen = 0;
Ilen = Slen + Plen;
Ilen = Slen + Plen;
- I =
M
alloc (Ilen);
+ I =
OPENSSL_m
alloc (Ilen);
Ij = BN_new();
Bpl1 = BN_new();
if (!D || !Ai || !B || !I || !Ij || !Bpl1) {
Ij = BN_new();
Bpl1 = BN_new();
if (!D || !Ai || !B || !I || !Ij || !Bpl1) {
@@
-150,10
+158,10
@@
int PKCS12_key_gen_uni (unsigned char *pass, int passlen, unsigned char *salt,
}
memcpy (out, Ai, min (n, u));
if (u >= n) {
}
memcpy (out, Ai, min (n, u));
if (u >= n) {
-
F
ree (Ai);
-
F
ree (B);
-
F
ree (D);
-
F
ree (I);
+
OPENSSL_f
ree (Ai);
+
OPENSSL_f
ree (B);
+
OPENSSL_f
ree (D);
+
OPENSSL_f
ree (I);
BN_free (Ij);
BN_free (Bpl1);
#ifdef DEBUG_KEYGEN
BN_free (Ij);
BN_free (Bpl1);
#ifdef DEBUG_KEYGEN
@@
-172,10
+180,17
@@
int PKCS12_key_gen_uni (unsigned char *pass, int passlen, unsigned char *salt,
BN_bin2bn (I + j, v, Ij);
BN_add (Ij, Ij, Bpl1);
BN_bn2bin (Ij, B);
BN_bin2bn (I + j, v, Ij);
BN_add (Ij, Ij, Bpl1);
BN_bn2bin (Ij, B);
+ 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 (
BN_num_bytes (Ij)
> v) {
+ if (
Ijlen
> v) {
BN_bn2bin (Ij, B);
memcpy (I + j, B + 1, v);
BN_bn2bin (Ij, B);
memcpy (I + j, B + 1, v);
+#ifndef PKCS12_BROKEN_KEYGEN
+ /* If less than v bytes pad with zeroes */
+ } else if (Ijlen < v) {
+ memset(I + j, 0, v - Ijlen);
+ BN_bn2bin(Ij, I + j + v - Ijlen);
+#endif
} else BN_bn2bin (Ij, I + j);
}
}
} else BN_bn2bin (Ij, I + j);
}
}