在CMS_final之前为CMS_sign计算TSA的消息摘要

问题描述 投票:2回答:1

我有代码来创建CMS签名。它现在运行良好我需要添加可信的时间戳。

BIO *data_output = BIO_new(BIO_s_mem());
const EVP_MD *sign_md = EVP_get_digestbyname(digest_name);

cms = CMS_sign(NULL, NULL, NULL, bio_in, flags);
BOOST_ASSERT(cms);

for (size_t i = 0; i < m_signers.size(); i++) {
    int tflags = flags;

    SignerInfo si = m_signers[i];

    CMS_SignerInfo *signer_info = CMS_add1_signer(cms,
        si.m_x509, si.m_privateKey, sign_md, tflags);
    BOOST_ASSERT(signer_info != NULL);

    for (int c = 0; c < sk_X509_num(si.m_ca); c++) {
        X509* cert = sk_X509_value(si.m_ca, c);
        BOOST_ASSERT(CMS_add0_cert(cms, cert) != 0);
    }
}

BOOST_ASSERT(CMS_final(cms, bio_in, NULL, flags) != 0);
BOOST_ASSERT(i2d_CMS_bio_stream(data_output, cms, bio_in, flags) != 0);

为了与TSA交谈,我需要摘要值,但在调用CMS_final之前无法获取摘要值。我无法在任何地方找到答案。

security openssl signing pki pkcs#7
1个回答
0
投票

id-aa-timeStampToken是一个无符号属性。如果你的实现没有钩子来修改消息,你可以在两遍中完成。调用final,获取哈希值并将其发送给TSA。然后构建第二个相同的CMS并添加一个unsigned id-aa-timeStampToken attibute(OID 1.2.840.113549.1.9.16.2.14)。将timestampToken粘贴到那里并调用final。

请注意,使用时间戳通常需要SIGNED属性签名时间Pkcs9SigningTime(OID 1.2.840.113549.1.9.5),因此请节省第一次传递时使用的时间以获取两个相同的CMS消息。

它有点便宜,但它做的工作。如果你需要在智能卡上要一个引脚,它会问两次。

© www.soinside.com 2019 - 2024. All rights reserved.