解密已签名的CMS_ContentInfo *的内容

时间:2015-03-10 15:22:07

标签: c openssl libcrypto

使用内存EnvelopedData时,我在访问签名CMS_ContentInfo*对象中的BIO时遇到问题。

使用以下代码,一切正常:

BIO* output = BIO_new_file("/absolute/path/test.txt", "r+");
                    if (CMS_verify(cms, stack, store, dcont, output, CMS_NOINTERN)) {
    BIO_flush(output);
    BIO_reset(output);
    CMS_ContentInfo* cms2 = SMIME_read_CMS(output, nullptr);
}

cms2正确实例化,我能够解密其内容。虽然,我不希望将文件写入磁盘,所以我试图在内存中使这个工作如下:

BIO* output = BIO_new(BIO_s_mem());
if (CMS_verify(cms, stack, store, dcont, output, CMS_NOINTERN)) {
    BIO_flush(output);
    BIO_seek(output, 0);
    CMS_ContentInfo* cms2 = SMIME_read_CMS(output, nullptr);
}

出于某种原因,似乎SMIME_read_CMS函数永远无法从BIO读取。任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。这是我用过的一段代码:

BIO* output = BIO_new(BIO_s_mem());
if (CMS_verify(cms, stack, store, dcont, nullptr, CMS_NOINTERN)) {
    CMS_ContentInfo* cms2 = SMIME_read_CMS(dcont, nullptr);
}

显然,持有BIO的dcont SignedData我可以使用cms2变量对其进行正确解密。