diff options
Diffstat (limited to 'src/lib/libcrypto/cms/cms_lib.c')
-rw-r--r-- | src/lib/libcrypto/cms/cms_lib.c | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/src/lib/libcrypto/cms/cms_lib.c b/src/lib/libcrypto/cms/cms_lib.c index 8e6c1d29a5..d00fe0f87b 100644 --- a/src/lib/libcrypto/cms/cms_lib.c +++ b/src/lib/libcrypto/cms/cms_lib.c | |||
@@ -60,7 +60,8 @@ | |||
60 | #include "cms.h" | 60 | #include "cms.h" |
61 | #include "cms_lcl.h" | 61 | #include "cms_lcl.h" |
62 | 62 | ||
63 | IMPLEMENT_ASN1_FUNCTIONS_const(CMS_ContentInfo) | 63 | IMPLEMENT_ASN1_FUNCTIONS(CMS_ContentInfo) |
64 | IMPLEMENT_ASN1_PRINT_FUNCTION(CMS_ContentInfo) | ||
64 | 65 | ||
65 | DECLARE_ASN1_ITEM(CMS_CertificateChoices) | 66 | DECLARE_ASN1_ITEM(CMS_CertificateChoices) |
66 | DECLARE_ASN1_ITEM(CMS_RevocationInfoChoice) | 67 | DECLARE_ASN1_ITEM(CMS_RevocationInfoChoice) |
@@ -346,20 +347,10 @@ void cms_DigestAlgorithm_set(X509_ALGOR *alg, const EVP_MD *md) | |||
346 | { | 347 | { |
347 | int param_type; | 348 | int param_type; |
348 | 349 | ||
349 | switch (EVP_MD_type(md)) | 350 | if (md->flags & EVP_MD_FLAG_DIGALGID_ABSENT) |
350 | { | ||
351 | case NID_sha1: | ||
352 | case NID_sha224: | ||
353 | case NID_sha256: | ||
354 | case NID_sha384: | ||
355 | case NID_sha512: | ||
356 | param_type = V_ASN1_UNDEF; | 351 | param_type = V_ASN1_UNDEF; |
357 | break; | 352 | else |
358 | |||
359 | default: | ||
360 | param_type = V_ASN1_NULL; | 353 | param_type = V_ASN1_NULL; |
361 | break; | ||
362 | } | ||
363 | 354 | ||
364 | X509_ALGOR_set0(alg, OBJ_nid2obj(EVP_MD_type(md)), param_type, NULL); | 355 | X509_ALGOR_set0(alg, OBJ_nid2obj(EVP_MD_type(md)), param_type, NULL); |
365 | 356 | ||
@@ -415,7 +406,11 @@ int cms_DigestAlgorithm_find_ctx(EVP_MD_CTX *mctx, BIO *chain, | |||
415 | return 0; | 406 | return 0; |
416 | } | 407 | } |
417 | BIO_get_md_ctx(chain, &mtmp); | 408 | BIO_get_md_ctx(chain, &mtmp); |
418 | if (EVP_MD_CTX_type(mtmp) == nid) | 409 | if (EVP_MD_CTX_type(mtmp) == nid |
410 | /* Workaround for broken implementations that use signature | ||
411 | * algorithm OID instead of digest. | ||
412 | */ | ||
413 | || EVP_MD_pkey_type(EVP_MD_CTX_md(mtmp)) == nid) | ||
419 | { | 414 | { |
420 | EVP_MD_CTX_copy_ex(mctx, mtmp); | 415 | EVP_MD_CTX_copy_ex(mctx, mtmp); |
421 | return 1; | 416 | return 1; |
@@ -557,6 +552,15 @@ int CMS_add0_crl(CMS_ContentInfo *cms, X509_CRL *crl) | |||
557 | return 1; | 552 | return 1; |
558 | } | 553 | } |
559 | 554 | ||
555 | int CMS_add1_crl(CMS_ContentInfo *cms, X509_CRL *crl) | ||
556 | { | ||
557 | int r; | ||
558 | r = CMS_add0_crl(cms, crl); | ||
559 | if (r > 0) | ||
560 | CRYPTO_add(&crl->references, 1, CRYPTO_LOCK_X509_CRL); | ||
561 | return r; | ||
562 | } | ||
563 | |||
560 | STACK_OF(X509) *CMS_get1_certs(CMS_ContentInfo *cms) | 564 | STACK_OF(X509) *CMS_get1_certs(CMS_ContentInfo *cms) |
561 | { | 565 | { |
562 | STACK_OF(X509) *certs = NULL; | 566 | STACK_OF(X509) *certs = NULL; |