summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/evp/evp_pkey.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/evp/evp_pkey.c')
-rw-r--r--src/lib/libcrypto/evp/evp_pkey.c124
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
308static int dsa_pkey2pkcs8(PKCS8_PRIV_KEY_INFO *p8, EVP_PKEY *pkey) 304static 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;
460err:
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