diff options
Diffstat (limited to 'src/lib/libcrypto/evp/evp_pkey.c')
-rw-r--r-- | src/lib/libcrypto/evp/evp_pkey.c | 124 |
1 files changed, 34 insertions, 90 deletions
diff --git a/src/lib/libcrypto/evp/evp_pkey.c b/src/lib/libcrypto/evp/evp_pkey.c index 47a69932a5..eb481ec661 100644 --- a/src/lib/libcrypto/evp/evp_pkey.c +++ b/src/lib/libcrypto/evp/evp_pkey.c | |||
@@ -235,11 +235,7 @@ PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8_broken(EVP_PKEY *pkey, int broken) | |||
235 | return NULL; | 235 | return NULL; |
236 | } | 236 | } |
237 | p8->broken = broken; | 237 | p8->broken = broken; |
238 | if (!ASN1_INTEGER_set(p8->version, 0)) { | 238 | ASN1_INTEGER_set (p8->version, 0); |
239 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | ||
240 | PKCS8_PRIV_KEY_INFO_free (p8); | ||
241 | return NULL; | ||
242 | } | ||
243 | if (!(p8->pkeyalg->parameter = ASN1_TYPE_new ())) { | 239 | if (!(p8->pkeyalg->parameter = ASN1_TYPE_new ())) { |
244 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | 240 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); |
245 | PKCS8_PRIV_KEY_INFO_free (p8); | 241 | PKCS8_PRIV_KEY_INFO_free (p8); |
@@ -307,35 +303,29 @@ PKCS8_PRIV_KEY_INFO *PKCS8_set_broken(PKCS8_PRIV_KEY_INFO *p8, int broken) | |||
307 | #ifndef OPENSSL_NO_DSA | 303 | #ifndef OPENSSL_NO_DSA |
308 | static int dsa_pkey2pkcs8(PKCS8_PRIV_KEY_INFO *p8, EVP_PKEY *pkey) | 304 | static int dsa_pkey2pkcs8(PKCS8_PRIV_KEY_INFO *p8, EVP_PKEY *pkey) |
309 | { | 305 | { |
310 | ASN1_STRING *params = NULL; | 306 | ASN1_STRING *params; |
311 | ASN1_INTEGER *prkey = NULL; | 307 | ASN1_INTEGER *prkey; |
312 | ASN1_TYPE *ttmp = NULL; | 308 | ASN1_TYPE *ttmp; |
313 | STACK_OF(ASN1_TYPE) *ndsa = NULL; | 309 | STACK_OF(ASN1_TYPE) *ndsa; |
314 | unsigned char *p = NULL, *q; | 310 | unsigned char *p, *q; |
315 | int len; | 311 | int len; |
316 | 312 | ||
317 | p8->pkeyalg->algorithm = OBJ_nid2obj(NID_dsa); | 313 | p8->pkeyalg->algorithm = OBJ_nid2obj(NID_dsa); |
318 | len = i2d_DSAparams (pkey->pkey.dsa, NULL); | 314 | len = i2d_DSAparams (pkey->pkey.dsa, NULL); |
319 | if (!(p = OPENSSL_malloc(len))) { | 315 | if (!(p = OPENSSL_malloc(len))) { |
320 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | 316 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); |
321 | goto err; | 317 | PKCS8_PRIV_KEY_INFO_free (p8); |
318 | return 0; | ||
322 | } | 319 | } |
323 | q = p; | 320 | q = p; |
324 | i2d_DSAparams (pkey->pkey.dsa, &q); | 321 | i2d_DSAparams (pkey->pkey.dsa, &q); |
325 | if (!(params = ASN1_STRING_new())) { | 322 | params = ASN1_STRING_new(); |
326 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | 323 | ASN1_STRING_set(params, p, len); |
327 | goto err; | ||
328 | } | ||
329 | if (!ASN1_STRING_set(params, p, len)) { | ||
330 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | ||
331 | goto err; | ||
332 | } | ||
333 | OPENSSL_free(p); | 324 | OPENSSL_free(p); |
334 | p = NULL; | ||
335 | /* Get private key into integer */ | 325 | /* Get private key into integer */ |
336 | if (!(prkey = BN_to_ASN1_INTEGER (pkey->pkey.dsa->priv_key, NULL))) { | 326 | if (!(prkey = BN_to_ASN1_INTEGER (pkey->pkey.dsa->priv_key, NULL))) { |
337 | EVPerr(EVP_F_EVP_PKEY2PKCS8,EVP_R_ENCODE_ERROR); | 327 | EVPerr(EVP_F_EVP_PKEY2PKCS8,EVP_R_ENCODE_ERROR); |
338 | goto err; | 328 | return 0; |
339 | } | 329 | } |
340 | 330 | ||
341 | switch(p8->broken) { | 331 | switch(p8->broken) { |
@@ -346,13 +336,12 @@ static int dsa_pkey2pkcs8(PKCS8_PRIV_KEY_INFO *p8, EVP_PKEY *pkey) | |||
346 | if (!ASN1_pack_string((char *)prkey, i2d_ASN1_INTEGER, | 336 | if (!ASN1_pack_string((char *)prkey, i2d_ASN1_INTEGER, |
347 | &p8->pkey->value.octet_string)) { | 337 | &p8->pkey->value.octet_string)) { |
348 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | 338 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); |
349 | goto err; | 339 | M_ASN1_INTEGER_free (prkey); |
340 | return 0; | ||
350 | } | 341 | } |
351 | 342 | ||
352 | M_ASN1_INTEGER_free (prkey); | 343 | M_ASN1_INTEGER_free (prkey); |
353 | prkey = NULL; | ||
354 | p8->pkeyalg->parameter->value.sequence = params; | 344 | p8->pkeyalg->parameter->value.sequence = params; |
355 | params = NULL; | ||
356 | p8->pkeyalg->parameter->type = V_ASN1_SEQUENCE; | 345 | p8->pkeyalg->parameter->type = V_ASN1_SEQUENCE; |
357 | 346 | ||
358 | break; | 347 | break; |
@@ -360,51 +349,32 @@ static int dsa_pkey2pkcs8(PKCS8_PRIV_KEY_INFO *p8, EVP_PKEY *pkey) | |||
360 | case PKCS8_NS_DB: | 349 | case PKCS8_NS_DB: |
361 | 350 | ||
362 | p8->pkeyalg->parameter->value.sequence = params; | 351 | p8->pkeyalg->parameter->value.sequence = params; |
363 | params = NULL; | ||
364 | p8->pkeyalg->parameter->type = V_ASN1_SEQUENCE; | 352 | p8->pkeyalg->parameter->type = V_ASN1_SEQUENCE; |
365 | if (!(ndsa = sk_ASN1_TYPE_new_null())) { | 353 | ndsa = sk_ASN1_TYPE_new_null(); |
366 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | 354 | ttmp = ASN1_TYPE_new(); |
367 | goto err; | 355 | if (!(ttmp->value.integer = BN_to_ASN1_INTEGER (pkey->pkey.dsa->pub_key, NULL))) { |
368 | } | ||
369 | if (!(ttmp = ASN1_TYPE_new())) { | ||
370 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | ||
371 | goto err; | ||
372 | } | ||
373 | if (!(ttmp->value.integer = | ||
374 | BN_to_ASN1_INTEGER(pkey->pkey.dsa->pub_key, NULL))) { | ||
375 | EVPerr(EVP_F_EVP_PKEY2PKCS8,EVP_R_ENCODE_ERROR); | 356 | EVPerr(EVP_F_EVP_PKEY2PKCS8,EVP_R_ENCODE_ERROR); |
376 | goto err; | 357 | PKCS8_PRIV_KEY_INFO_free(p8); |
358 | return 0; | ||
377 | } | 359 | } |
378 | ttmp->type = V_ASN1_INTEGER; | 360 | ttmp->type = V_ASN1_INTEGER; |
379 | if (!sk_ASN1_TYPE_push(ndsa, ttmp)) { | 361 | sk_ASN1_TYPE_push(ndsa, ttmp); |
380 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | ||
381 | goto err; | ||
382 | } | ||
383 | 362 | ||
384 | if (!(ttmp = ASN1_TYPE_new())) { | 363 | ttmp = ASN1_TYPE_new(); |
385 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | ||
386 | goto err; | ||
387 | } | ||
388 | ttmp->value.integer = prkey; | 364 | ttmp->value.integer = prkey; |
389 | prkey = NULL; | ||
390 | ttmp->type = V_ASN1_INTEGER; | 365 | ttmp->type = V_ASN1_INTEGER; |
391 | if (!sk_ASN1_TYPE_push(ndsa, ttmp)) { | 366 | sk_ASN1_TYPE_push(ndsa, ttmp); |
392 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | ||
393 | goto err; | ||
394 | } | ||
395 | ttmp = NULL; | ||
396 | 367 | ||
397 | if (!(p8->pkey->value.octet_string = ASN1_OCTET_STRING_new())) { | 368 | p8->pkey->value.octet_string = ASN1_OCTET_STRING_new(); |
398 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | ||
399 | goto err; | ||
400 | } | ||
401 | 369 | ||
402 | if (!ASN1_seq_pack_ASN1_TYPE(ndsa, i2d_ASN1_TYPE, | 370 | if (!ASN1_seq_pack_ASN1_TYPE(ndsa, i2d_ASN1_TYPE, |
403 | &p8->pkey->value.octet_string->data, | 371 | &p8->pkey->value.octet_string->data, |
404 | &p8->pkey->value.octet_string->length)) { | 372 | &p8->pkey->value.octet_string->length)) { |
405 | 373 | ||
406 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | 374 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); |
407 | goto err; | 375 | sk_ASN1_TYPE_pop_free(ndsa, ASN1_TYPE_free); |
376 | M_ASN1_INTEGER_free(prkey); | ||
377 | return 0; | ||
408 | } | 378 | } |
409 | sk_ASN1_TYPE_pop_free(ndsa, ASN1_TYPE_free); | 379 | sk_ASN1_TYPE_pop_free(ndsa, ASN1_TYPE_free); |
410 | break; | 380 | break; |
@@ -412,57 +382,31 @@ static int dsa_pkey2pkcs8(PKCS8_PRIV_KEY_INFO *p8, EVP_PKEY *pkey) | |||
412 | case PKCS8_EMBEDDED_PARAM: | 382 | case PKCS8_EMBEDDED_PARAM: |
413 | 383 | ||
414 | p8->pkeyalg->parameter->type = V_ASN1_NULL; | 384 | p8->pkeyalg->parameter->type = V_ASN1_NULL; |
415 | if (!(ndsa = sk_ASN1_TYPE_new_null())) { | 385 | ndsa = sk_ASN1_TYPE_new_null(); |
416 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | 386 | ttmp = ASN1_TYPE_new(); |
417 | goto err; | ||
418 | } | ||
419 | if (!(ttmp = ASN1_TYPE_new())) { | ||
420 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | ||
421 | goto err; | ||
422 | } | ||
423 | ttmp->value.sequence = params; | 387 | ttmp->value.sequence = params; |
424 | params = NULL; | ||
425 | ttmp->type = V_ASN1_SEQUENCE; | 388 | ttmp->type = V_ASN1_SEQUENCE; |
426 | if (!sk_ASN1_TYPE_push(ndsa, ttmp)) { | 389 | sk_ASN1_TYPE_push(ndsa, ttmp); |
427 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | ||
428 | goto err; | ||
429 | } | ||
430 | 390 | ||
431 | if (!(ttmp = ASN1_TYPE_new())) { | 391 | ttmp = ASN1_TYPE_new(); |
432 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | ||
433 | goto err; | ||
434 | } | ||
435 | ttmp->value.integer = prkey; | 392 | ttmp->value.integer = prkey; |
436 | prkey = NULL; | ||
437 | ttmp->type = V_ASN1_INTEGER; | 393 | ttmp->type = V_ASN1_INTEGER; |
438 | if (!sk_ASN1_TYPE_push(ndsa, ttmp)) { | 394 | sk_ASN1_TYPE_push(ndsa, ttmp); |
439 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | ||
440 | goto err; | ||
441 | } | ||
442 | ttmp = NULL; | ||
443 | 395 | ||
444 | if (!(p8->pkey->value.octet_string = ASN1_OCTET_STRING_new())) { | 396 | p8->pkey->value.octet_string = ASN1_OCTET_STRING_new(); |
445 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | ||
446 | goto err; | ||
447 | } | ||
448 | 397 | ||
449 | if (!ASN1_seq_pack_ASN1_TYPE(ndsa, i2d_ASN1_TYPE, | 398 | if (!ASN1_seq_pack_ASN1_TYPE(ndsa, i2d_ASN1_TYPE, |
450 | &p8->pkey->value.octet_string->data, | 399 | &p8->pkey->value.octet_string->data, |
451 | &p8->pkey->value.octet_string->length)) { | 400 | &p8->pkey->value.octet_string->length)) { |
452 | 401 | ||
453 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); | 402 | EVPerr(EVP_F_EVP_PKEY2PKCS8,ERR_R_MALLOC_FAILURE); |
454 | goto err; | 403 | sk_ASN1_TYPE_pop_free(ndsa, ASN1_TYPE_free); |
404 | M_ASN1_INTEGER_free (prkey); | ||
405 | return 0; | ||
455 | } | 406 | } |
456 | sk_ASN1_TYPE_pop_free(ndsa, ASN1_TYPE_free); | 407 | sk_ASN1_TYPE_pop_free(ndsa, ASN1_TYPE_free); |
457 | break; | 408 | break; |
458 | } | 409 | } |
459 | return 1; | 410 | return 1; |
460 | err: | ||
461 | if (p != NULL) OPENSSL_free(p); | ||
462 | if (params != NULL) ASN1_STRING_free(params); | ||
463 | if (prkey != NULL) M_ASN1_INTEGER_free(prkey); | ||
464 | if (ttmp != NULL) ASN1_TYPE_free(ttmp); | ||
465 | if (ndsa != NULL) sk_ASN1_TYPE_pop_free(ndsa, ASN1_TYPE_free); | ||
466 | return 0; | ||
467 | } | 411 | } |
468 | #endif | 412 | #endif |