diff options
Diffstat (limited to 'src/lib/libcrypto/pkcs12')
-rw-r--r-- | src/lib/libcrypto/pkcs12/p12_key.c | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/src/lib/libcrypto/pkcs12/p12_key.c b/src/lib/libcrypto/pkcs12/p12_key.c index a29794bbbc..424203f648 100644 --- a/src/lib/libcrypto/pkcs12/p12_key.c +++ b/src/lib/libcrypto/pkcs12/p12_key.c | |||
@@ -107,6 +107,7 @@ int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, | |||
107 | unsigned char *B, *D, *I, *p, *Ai; | 107 | unsigned char *B, *D, *I, *p, *Ai; |
108 | int Slen, Plen, Ilen, Ijlen; | 108 | int Slen, Plen, Ilen, Ijlen; |
109 | int i, j, u, v; | 109 | int i, j, u, v; |
110 | int ret = 0; | ||
110 | BIGNUM *Ij, *Bpl1; /* These hold Ij and B + 1 */ | 111 | BIGNUM *Ij, *Bpl1; /* These hold Ij and B + 1 */ |
111 | EVP_MD_CTX ctx; | 112 | EVP_MD_CTX ctx; |
112 | #ifdef DEBUG_KEYGEN | 113 | #ifdef DEBUG_KEYGEN |
@@ -144,10 +145,8 @@ int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, | |||
144 | I = OPENSSL_malloc (Ilen); | 145 | I = OPENSSL_malloc (Ilen); |
145 | Ij = BN_new(); | 146 | Ij = BN_new(); |
146 | Bpl1 = BN_new(); | 147 | Bpl1 = BN_new(); |
147 | if (!D || !Ai || !B || !I || !Ij || !Bpl1) { | 148 | if (!D || !Ai || !B || !I || !Ij || !Bpl1) |
148 | PKCS12err(PKCS12_F_PKCS12_KEY_GEN_UNI,ERR_R_MALLOC_FAILURE); | 149 | goto err; |
149 | return 0; | ||
150 | } | ||
151 | for (i = 0; i < v; i++) D[i] = id; | 150 | for (i = 0; i < v; i++) D[i] = id; |
152 | p = I; | 151 | p = I; |
153 | for (i = 0; i < Slen; i++) *p++ = salt[i % saltlen]; | 152 | for (i = 0; i < Slen; i++) *p++ = salt[i % saltlen]; |
@@ -164,28 +163,22 @@ int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, | |||
164 | } | 163 | } |
165 | memcpy (out, Ai, min (n, u)); | 164 | memcpy (out, Ai, min (n, u)); |
166 | if (u >= n) { | 165 | if (u >= n) { |
167 | OPENSSL_free (Ai); | ||
168 | OPENSSL_free (B); | ||
169 | OPENSSL_free (D); | ||
170 | OPENSSL_free (I); | ||
171 | BN_free (Ij); | ||
172 | BN_free (Bpl1); | ||
173 | EVP_MD_CTX_cleanup(&ctx); | ||
174 | #ifdef DEBUG_KEYGEN | 166 | #ifdef DEBUG_KEYGEN |
175 | fprintf(stderr, "Output KEY (length %d)\n", tmpn); | 167 | fprintf(stderr, "Output KEY (length %d)\n", tmpn); |
176 | h__dump(tmpout, tmpn); | 168 | h__dump(tmpout, tmpn); |
177 | #endif | 169 | #endif |
178 | return 1; | 170 | ret = 1; |
171 | goto end; | ||
179 | } | 172 | } |
180 | n -= u; | 173 | n -= u; |
181 | out += u; | 174 | out += u; |
182 | for (j = 0; j < v; j++) B[j] = Ai[j % u]; | 175 | for (j = 0; j < v; j++) B[j] = Ai[j % u]; |
183 | /* Work out B + 1 first then can use B as tmp space */ | 176 | /* Work out B + 1 first then can use B as tmp space */ |
184 | BN_bin2bn (B, v, Bpl1); | 177 | if (!BN_bin2bn (B, v, Bpl1)) goto err; |
185 | BN_add_word (Bpl1, 1); | 178 | if (!BN_add_word (Bpl1, 1)) goto err; |
186 | for (j = 0; j < Ilen ; j+=v) { | 179 | for (j = 0; j < Ilen ; j+=v) { |
187 | BN_bin2bn (I + j, v, Ij); | 180 | if (!BN_bin2bn (I + j, v, Ij)) goto err; |
188 | BN_add (Ij, Ij, Bpl1); | 181 | if (!BN_add (Ij, Ij, Bpl1)) goto err; |
189 | BN_bn2bin (Ij, B); | 182 | BN_bn2bin (Ij, B); |
190 | Ijlen = BN_num_bytes (Ij); | 183 | Ijlen = BN_num_bytes (Ij); |
191 | /* If more than 2^(v*8) - 1 cut off MSB */ | 184 | /* If more than 2^(v*8) - 1 cut off MSB */ |
@@ -201,6 +194,19 @@ int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, | |||
201 | } else BN_bn2bin (Ij, I + j); | 194 | } else BN_bn2bin (Ij, I + j); |
202 | } | 195 | } |
203 | } | 196 | } |
197 | |||
198 | err: | ||
199 | PKCS12err(PKCS12_F_PKCS12_KEY_GEN_UNI,ERR_R_MALLOC_FAILURE); | ||
200 | |||
201 | end: | ||
202 | OPENSSL_free (Ai); | ||
203 | OPENSSL_free (B); | ||
204 | OPENSSL_free (D); | ||
205 | OPENSSL_free (I); | ||
206 | BN_free (Ij); | ||
207 | BN_free (Bpl1); | ||
208 | EVP_MD_CTX_cleanup(&ctx); | ||
209 | return ret; | ||
204 | } | 210 | } |
205 | #ifdef DEBUG_KEYGEN | 211 | #ifdef DEBUG_KEYGEN |
206 | void h__dump (unsigned char *p, int len) | 212 | void h__dump (unsigned char *p, int len) |