Latest update.
This commit is contained in:
@@ -27,6 +27,10 @@ static const ERR_STRING_DATA CMS_str_functs[] = {
|
||||
{ERR_PACK(ERR_LIB_CMS, CMS_F_CMS_ADD1_SIGNER, 0), "CMS_add1_signer"},
|
||||
{ERR_PACK(ERR_LIB_CMS, CMS_F_CMS_ADD1_SIGNINGTIME, 0),
|
||||
"cms_add1_signingTime"},
|
||||
{ERR_PACK(ERR_LIB_CMS, CMS_F_CMS_ADD1_SIGNING_CERT, 0),
|
||||
"CMS_add1_signing_cert"},
|
||||
{ERR_PACK(ERR_LIB_CMS, CMS_F_CMS_ADD1_SIGNING_CERT_V2, 0),
|
||||
"CMS_add1_signing_cert_v2"},
|
||||
{ERR_PACK(ERR_LIB_CMS, CMS_F_CMS_COMPRESS, 0), "CMS_compress"},
|
||||
{ERR_PACK(ERR_LIB_CMS, CMS_F_CMS_COMPRESSEDDATA_CREATE, 0),
|
||||
"cms_CompressedData_create"},
|
||||
|
||||
+71
-2
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2008-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
* Copyright 2008-2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -14,11 +14,13 @@
|
||||
#include <openssl/x509v3.h>
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/cms.h>
|
||||
#include <openssl/ess.h>
|
||||
#include "cms_lcl.h"
|
||||
#include "internal/ess_int.h"
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS(CMS_ReceiptRequest)
|
||||
|
||||
/* ESS services: for now just Signed Receipt related */
|
||||
/* ESS services */
|
||||
|
||||
int CMS_get1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest **prr)
|
||||
{
|
||||
@@ -335,3 +337,70 @@ ASN1_OCTET_STRING *cms_encode_Receipt(CMS_SignerInfo *si)
|
||||
CMS_ReceiptRequest_free(rr);
|
||||
return os;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add signer certificate's V2 digest to a SignerInfo
|
||||
* structure
|
||||
*/
|
||||
|
||||
int CMS_add1_signing_cert_v2(CMS_SignerInfo *si,
|
||||
ESS_SIGNING_CERT_V2 *sc)
|
||||
{
|
||||
ASN1_STRING *seq = NULL;
|
||||
unsigned char *p, *pp;
|
||||
int len;
|
||||
|
||||
/* Add SigningCertificateV2 signed attribute to the signer info. */
|
||||
len = i2d_ESS_SIGNING_CERT_V2(sc, NULL);
|
||||
if ((pp = OPENSSL_malloc(len)) == NULL)
|
||||
goto err;
|
||||
p = pp;
|
||||
i2d_ESS_SIGNING_CERT_V2(sc, &p);
|
||||
if (!(seq = ASN1_STRING_new()) || !ASN1_STRING_set(seq, pp, len))
|
||||
goto err;
|
||||
OPENSSL_free(pp);
|
||||
pp = NULL;
|
||||
if (!CMS_signed_add1_attr_by_NID(si, NID_id_smime_aa_signingCertificateV2,
|
||||
V_ASN1_SEQUENCE, seq, -1))
|
||||
goto err;
|
||||
ASN1_STRING_free(seq);
|
||||
return 1;
|
||||
err:
|
||||
CMSerr(CMS_F_CMS_ADD1_SIGNING_CERT_V2, ERR_R_MALLOC_FAILURE);
|
||||
ASN1_STRING_free(seq);
|
||||
OPENSSL_free(pp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add signer certificate's digest to a SignerInfo
|
||||
* structure
|
||||
*/
|
||||
|
||||
int CMS_add1_signing_cert(CMS_SignerInfo *si, ESS_SIGNING_CERT *sc)
|
||||
{
|
||||
ASN1_STRING *seq = NULL;
|
||||
unsigned char *p, *pp;
|
||||
int len;
|
||||
|
||||
/* Add SigningCertificate signed attribute to the signer info. */
|
||||
len = i2d_ESS_SIGNING_CERT(sc, NULL);
|
||||
if ((pp = OPENSSL_malloc(len)) == NULL)
|
||||
goto err;
|
||||
p = pp;
|
||||
i2d_ESS_SIGNING_CERT(sc, &p);
|
||||
if (!(seq = ASN1_STRING_new()) || !ASN1_STRING_set(seq, pp, len))
|
||||
goto err;
|
||||
OPENSSL_free(pp);
|
||||
pp = NULL;
|
||||
if (!CMS_signed_add1_attr_by_NID(si, NID_id_smime_aa_signingCertificate,
|
||||
V_ASN1_SEQUENCE, seq, -1))
|
||||
goto err;
|
||||
ASN1_STRING_free(seq);
|
||||
return 1;
|
||||
err:
|
||||
CMSerr(CMS_F_CMS_ADD1_SIGNING_CERT, ERR_R_MALLOC_FAILURE);
|
||||
ASN1_STRING_free(seq);
|
||||
OPENSSL_free(pp);
|
||||
return 0;
|
||||
}
|
||||
@@ -332,6 +332,27 @@ CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms,
|
||||
!CMS_SignerInfo_sign(si))
|
||||
goto err;
|
||||
}
|
||||
if (flags & CMS_CADES) {
|
||||
ESS_SIGNING_CERT *sc = NULL;
|
||||
ESS_SIGNING_CERT_V2 *sc2 = NULL;
|
||||
int add_sc;
|
||||
|
||||
if (md == EVP_sha1() || md == NULL) {
|
||||
if ((sc = ESS_SIGNING_CERT_new_init(signer,
|
||||
NULL, 1)) == NULL)
|
||||
goto err;
|
||||
add_sc = CMS_add1_signing_cert(si, sc);
|
||||
ESS_SIGNING_CERT_free(sc);
|
||||
} else {
|
||||
if ((sc2 = ESS_SIGNING_CERT_V2_new_init(md, signer,
|
||||
NULL, 1)) == NULL)
|
||||
goto err;
|
||||
add_sc = CMS_add1_signing_cert_v2(si, sc2);
|
||||
ESS_SIGNING_CERT_V2_free(sc2);
|
||||
}
|
||||
if (!add_sc)
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(flags & CMS_NOCERTS)) {
|
||||
|
||||
Reference in New Issue
Block a user