summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/pkcs7/pk7_lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/pkcs7/pk7_lib.c')
-rw-r--r--src/lib/libcrypto/pkcs7/pk7_lib.c117
1 files changed, 14 insertions, 103 deletions
diff --git a/src/lib/libcrypto/pkcs7/pk7_lib.c b/src/lib/libcrypto/pkcs7/pk7_lib.c
index f2490941a3..ee1817c7af 100644
--- a/src/lib/libcrypto/pkcs7/pk7_lib.c
+++ b/src/lib/libcrypto/pkcs7/pk7_lib.c
@@ -138,10 +138,6 @@ int PKCS7_set_content(PKCS7 *p7, PKCS7 *p7_data)
138 p7->d.sign->contents=p7_data; 138 p7->d.sign->contents=p7_data;
139 break; 139 break;
140 case NID_pkcs7_digest: 140 case NID_pkcs7_digest:
141 if (p7->d.digest->contents != NULL)
142 PKCS7_free(p7->d.digest->contents);
143 p7->d.digest->contents=p7_data;
144 break;
145 case NID_pkcs7_data: 141 case NID_pkcs7_data:
146 case NID_pkcs7_enveloped: 142 case NID_pkcs7_enveloped:
147 case NID_pkcs7_signedAndEnveloped: 143 case NID_pkcs7_signedAndEnveloped:
@@ -210,12 +206,6 @@ int PKCS7_set_type(PKCS7 *p7, int type)
210 break; 206 break;
211 207
212 case NID_pkcs7_digest: 208 case NID_pkcs7_digest:
213 p7->type=obj;
214 if ((p7->d.digest=PKCS7_DIGEST_new())
215 == NULL) goto err;
216 if (!ASN1_INTEGER_set(p7->d.digest->version,0))
217 goto err;
218 break;
219 default: 209 default:
220 PKCS7err(PKCS7_F_PKCS7_SET_TYPE,PKCS7_R_UNSUPPORTED_CONTENT_TYPE); 210 PKCS7err(PKCS7_F_PKCS7_SET_TYPE,PKCS7_R_UNSUPPORTED_CONTENT_TYPE);
221 goto err; 211 goto err;
@@ -225,13 +215,6 @@ err:
225 return(0); 215 return(0);
226 } 216 }
227 217
228int PKCS7_set0_type_other(PKCS7 *p7, int type, ASN1_TYPE *other)
229 {
230 p7->type = OBJ_nid2obj(type);
231 p7->d.other = other;
232 return 1;
233 }
234
235int PKCS7_add_signer(PKCS7 *p7, PKCS7_SIGNER_INFO *psi) 218int PKCS7_add_signer(PKCS7 *p7, PKCS7_SIGNER_INFO *psi)
236 { 219 {
237 int i,j,nid; 220 int i,j,nid;
@@ -271,23 +254,16 @@ int PKCS7_add_signer(PKCS7 *p7, PKCS7_SIGNER_INFO *psi)
271 if (!j) /* we need to add another algorithm */ 254 if (!j) /* we need to add another algorithm */
272 { 255 {
273 if(!(alg=X509_ALGOR_new()) 256 if(!(alg=X509_ALGOR_new())
274 || !(alg->parameter = ASN1_TYPE_new())) 257 || !(alg->parameter = ASN1_TYPE_new())) {
275 {
276 X509_ALGOR_free(alg);
277 PKCS7err(PKCS7_F_PKCS7_ADD_SIGNER,ERR_R_MALLOC_FAILURE); 258 PKCS7err(PKCS7_F_PKCS7_ADD_SIGNER,ERR_R_MALLOC_FAILURE);
278 return(0); 259 return(0);
279 } 260 }
280 alg->algorithm=OBJ_nid2obj(nid); 261 alg->algorithm=OBJ_nid2obj(nid);
281 alg->parameter->type = V_ASN1_NULL; 262 alg->parameter->type = V_ASN1_NULL;
282 if (!sk_X509_ALGOR_push(md_sk,alg)) 263 sk_X509_ALGOR_push(md_sk,alg);
283 {
284 X509_ALGOR_free(alg);
285 return 0;
286 }
287 } 264 }
288 265
289 if (!sk_PKCS7_SIGNER_INFO_push(signer_sk,psi)) 266 sk_PKCS7_SIGNER_INFO_push(signer_sk,psi);
290 return 0;
291 return(1); 267 return(1);
292 } 268 }
293 269
@@ -312,17 +288,8 @@ int PKCS7_add_certificate(PKCS7 *p7, X509 *x509)
312 288
313 if (*sk == NULL) 289 if (*sk == NULL)
314 *sk=sk_X509_new_null(); 290 *sk=sk_X509_new_null();
315 if (*sk == NULL)
316 {
317 PKCS7err(PKCS7_F_PKCS7_ADD_CERTIFICATE,ERR_R_MALLOC_FAILURE);
318 return 0;
319 }
320 CRYPTO_add(&x509->references,1,CRYPTO_LOCK_X509); 291 CRYPTO_add(&x509->references,1,CRYPTO_LOCK_X509);
321 if (!sk_X509_push(*sk,x509)) 292 sk_X509_push(*sk,x509);
322 {
323 X509_free(x509);
324 return 0;
325 }
326 return(1); 293 return(1);
327 } 294 }
328 295
@@ -347,31 +314,18 @@ int PKCS7_add_crl(PKCS7 *p7, X509_CRL *crl)
347 314
348 if (*sk == NULL) 315 if (*sk == NULL)
349 *sk=sk_X509_CRL_new_null(); 316 *sk=sk_X509_CRL_new_null();
350 if (*sk == NULL)
351 {
352 PKCS7err(PKCS7_F_PKCS7_ADD_CRL,ERR_R_MALLOC_FAILURE);
353 return 0;
354 }
355 317
356 CRYPTO_add(&crl->references,1,CRYPTO_LOCK_X509_CRL); 318 CRYPTO_add(&crl->references,1,CRYPTO_LOCK_X509_CRL);
357 if (!sk_X509_CRL_push(*sk,crl)) 319 sk_X509_CRL_push(*sk,crl);
358 {
359 X509_CRL_free(crl);
360 return 0;
361 }
362 return(1); 320 return(1);
363 } 321 }
364 322
365int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509, EVP_PKEY *pkey, 323int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509, EVP_PKEY *pkey,
366 const EVP_MD *dgst) 324 const EVP_MD *dgst)
367 { 325 {
368 int nid;
369 char is_dsa; 326 char is_dsa;
370 327 if (pkey->type == EVP_PKEY_DSA) is_dsa = 1;
371 if (pkey->type == EVP_PKEY_DSA || pkey->type == EVP_PKEY_EC) 328 else is_dsa = 0;
372 is_dsa = 1;
373 else
374 is_dsa = 0;
375 /* We now need to add another PKCS7_SIGNER_INFO entry */ 329 /* We now need to add another PKCS7_SIGNER_INFO entry */
376 if (!ASN1_INTEGER_set(p7i->version,1)) 330 if (!ASN1_INTEGER_set(p7i->version,1))
377 goto err; 331 goto err;
@@ -401,38 +355,16 @@ int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509, EVP_PKEY *pkey,
401 goto err; 355 goto err;
402 p7i->digest_alg->parameter->type=V_ASN1_NULL; 356 p7i->digest_alg->parameter->type=V_ASN1_NULL;
403 357
358 p7i->digest_enc_alg->algorithm=OBJ_nid2obj(EVP_PKEY_type(pkey->type));
359
404 if (p7i->digest_enc_alg->parameter != NULL) 360 if (p7i->digest_enc_alg->parameter != NULL)
405 ASN1_TYPE_free(p7i->digest_enc_alg->parameter); 361 ASN1_TYPE_free(p7i->digest_enc_alg->parameter);
406 nid = EVP_PKEY_type(pkey->type); 362 if(is_dsa) p7i->digest_enc_alg->parameter = NULL;
407 if (nid == EVP_PKEY_RSA) 363 else {
408 {
409 p7i->digest_enc_alg->algorithm=OBJ_nid2obj(NID_rsaEncryption);
410 if (!(p7i->digest_enc_alg->parameter=ASN1_TYPE_new()))
411 goto err;
412 p7i->digest_enc_alg->parameter->type=V_ASN1_NULL;
413 }
414 else if (nid == EVP_PKEY_DSA)
415 {
416#if 1
417 /* use 'dsaEncryption' OID for compatibility with other software
418 * (PKCS #7 v1.5 does specify how to handle DSA) ... */
419 p7i->digest_enc_alg->algorithm=OBJ_nid2obj(NID_dsa);
420#else
421 /* ... although the 'dsaWithSHA1' OID (as required by RFC 2630 for CMS)
422 * would make more sense. */
423 p7i->digest_enc_alg->algorithm=OBJ_nid2obj(NID_dsaWithSHA1);
424#endif
425 p7i->digest_enc_alg->parameter = NULL; /* special case for DSA: omit 'parameter'! */
426 }
427 else if (nid == EVP_PKEY_EC)
428 {
429 p7i->digest_enc_alg->algorithm=OBJ_nid2obj(NID_ecdsa_with_SHA1);
430 if (!(p7i->digest_enc_alg->parameter=ASN1_TYPE_new())) 364 if (!(p7i->digest_enc_alg->parameter=ASN1_TYPE_new()))
431 goto err; 365 goto err;
432 p7i->digest_enc_alg->parameter->type=V_ASN1_NULL; 366 p7i->digest_enc_alg->parameter->type=V_ASN1_NULL;
433 } 367 }
434 else
435 return(0);
436 368
437 return(1); 369 return(1);
438err: 370err:
@@ -449,28 +381,9 @@ PKCS7_SIGNER_INFO *PKCS7_add_signature(PKCS7 *p7, X509 *x509, EVP_PKEY *pkey,
449 if (!PKCS7_add_signer(p7,si)) goto err; 381 if (!PKCS7_add_signer(p7,si)) goto err;
450 return(si); 382 return(si);
451err: 383err:
452 PKCS7_SIGNER_INFO_free(si);
453 return(NULL); 384 return(NULL);
454 } 385 }
455 386
456int PKCS7_set_digest(PKCS7 *p7, const EVP_MD *md)
457 {
458 if (PKCS7_type_is_digest(p7))
459 {
460 if(!(p7->d.digest->md->parameter = ASN1_TYPE_new()))
461 {
462 PKCS7err(PKCS7_F_PKCS7_SET_DIGEST,ERR_R_MALLOC_FAILURE);
463 return 0;
464 }
465 p7->d.digest->md->parameter->type = V_ASN1_NULL;
466 p7->d.digest->md->algorithm = OBJ_nid2obj(EVP_MD_nid(md));
467 return 1;
468 }
469
470 PKCS7err(PKCS7_F_PKCS7_SET_DIGEST,PKCS7_R_WRONG_CONTENT_TYPE);
471 return 1;
472 }
473
474STACK_OF(PKCS7_SIGNER_INFO) *PKCS7_get_signer_info(PKCS7 *p7) 387STACK_OF(PKCS7_SIGNER_INFO) *PKCS7_get_signer_info(PKCS7 *p7)
475 { 388 {
476 if (PKCS7_type_is_signed(p7)) 389 if (PKCS7_type_is_signed(p7))
@@ -494,7 +407,6 @@ PKCS7_RECIP_INFO *PKCS7_add_recipient(PKCS7 *p7, X509 *x509)
494 if (!PKCS7_add_recipient_info(p7,ri)) goto err; 407 if (!PKCS7_add_recipient_info(p7,ri)) goto err;
495 return(ri); 408 return(ri);
496err: 409err:
497 PKCS7_RECIP_INFO_free(ri);
498 return(NULL); 410 return(NULL);
499 } 411 }
500 412
@@ -517,8 +429,7 @@ int PKCS7_add_recipient_info(PKCS7 *p7, PKCS7_RECIP_INFO *ri)
517 return(0); 429 return(0);
518 } 430 }
519 431
520 if (!sk_PKCS7_RECIP_INFO_push(sk,ri)) 432 sk_PKCS7_RECIP_INFO_push(sk,ri);
521 return 0;
522 return(1); 433 return(1);
523 } 434 }
524 435