Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何正确编写PKCS#7签名文件?_C++_Pkcs#7_Botan - Fatal编程技术网

C++ 如何正确编写PKCS#7签名文件?

C++ 如何正确编写PKCS#7签名文件?,c++,pkcs#7,botan,C++,Pkcs#7,Botan,我正在尝试使用Botan库生成分离的签名文件。生成的签名文件未经OpenSSL验证(无其他检查)。提示签名文件的格式可能存在错误 一对用于签名的密钥和证书存储在HSM中,获取它们并不困难。对于测试,我使用RSA密钥和SoftHSM,稍后将使用另一种密钥格式和物理HSM。PKCS#11用于与HSM通信 对于创建PKCS#7: 静态常量Botan::BigInt CMSVersion(1UL); std::vector createAttributes(std::vector和digestData)

我正在尝试使用Botan库生成分离的签名文件。生成的签名文件未经OpenSSL验证(无其他检查)。提示签名文件的格式可能存在错误

一对用于签名的密钥和证书存储在HSM中,获取它们并不困难。对于测试,我使用RSA密钥和SoftHSM,稍后将使用另一种密钥格式和物理HSM。PKCS#11用于与HSM通信

对于创建PKCS#7:

静态常量Botan::BigInt CMSVersion(1UL); std::vector createAttributes(std::vector和digestData) { std::chrono::time_point time=std::chrono::system_clock::now(); Botan::OID数据类(“1.2.840.113549.1.7.1”); Botan::属性contentType(Botan::OIDS::str2oid(“PKCS9.contentType”), dataOID.BER_encode()); 植物学::X509_时间timeASN1(时间); 向量属性数据; Botan::DER_编码器属性(attributesData); 属性开始标记(Botan::ASN1标记(0), Botan::ASN1_标记(Botan::ASN1_标记::特定于上下文); 属性编码(contentType) .start_cons(植物学::ASN1_标记::序列) .encode(植物学::OID(“1.2.840.113549.1.9.5”)) .start_cons(Botan::ASN1_Tag::SET).encode(timeASN1).end_cons() (完) .start_cons(植物学::ASN1_标记::序列) .encode(植物学::OID::str2oid(“PKCS9.MessageDigest”)) .start_cons(Botan::ASN1_标记::SET) .encode(digestData,Botan::ASN1_标记::八位字节_字符串, Botan::ASN1_标记::八位字节字符串,Botan::ASN1_标记::通用) (完) .end_cons(); 属性end_cons(); 返回属性数据; } std::vector createCMS(const Botan::AlgorithmIdentifier&digestAlg, 植物学::X509_证书和证书, const Botan::算法识别器和keyAlg, std::矢量和sigData, 标准::向量和签名属性) { 植物学::安全_载体msgData; Botan::DER_编码器(msgData); encoder.start_cons(Botan::ASN1_标记::序列)。encode(CMSVersion) .start_cons(Botan::ASN1_标记::SET)。start_cons(Botan::ASN1_标记::序列) .encode(digestAlg.get_-oid()).end_-cons().end_-cons(); Botan::OID数据类(“1.2.840.113549.1.7.1”); encoder.start_cons(Botan::ASN1_标记::SEQUENCE).encode(dataOID.end_cons(); 编码器.启动图标(Botan::ASN1\U标记::通用,Botan::ASN1\U标记::专用) .encode(cert).end_cons(); 编码器.启动图标(Botan::ASN1\标记::SET); Botan::安全的向量签名数据; Botan::DER_编码器signerInfo(signerInfoData); signerInfo.start_cons(植物学::ASN1_标记::序列); 签名信息编码(CMSVersion); signerInfo.start_cons(Botan::ASN1_标记::序列) .encode(证书颁发者\u dn()) .encode(Botan::BigInt(证书序列号()).end_cons(); signerInfo.start_cons(Botan::ASN1_标记::SEQUENCE).encode(digestAlg.get_oid()) .end_cons(); signerInfo.raw_字节(signedAttribute); 签名信息编码(keyAlg) .encode(sigData,Botan::ASN1_标记::八位字节_字符串, Botan::ASN1_标记::八位字节字符串,Botan::ASN1_标记::通用); 签名信息。结束(); 编码器.raw_字节(signerInfoData).end_cons().end_cons(); std::矢量数据; Botan::DER_编码器结果(ResultData); 结果.启动图标(Botan::ASN1\标记::序列) .encode(植物学::OID(“1.2.840.113549.1.7.2”)) .start_cons(Botan::ASN1_标记::通用,Botan::ASN1_标记::专用) .raw_字节(msgData).end_cons().end_cons(); 返回结果数据; } 要使用PKCS#11计算哈希和签名,如下所示:

QFile输入(m_content->text()),输出(m_sigFile->text());
如果(!input.open(QFile::ReadOnly))
{
QMessageBox::critical(这是tr(“错误”),
tr(“内容文件“%1”未打开。\n”
“错误消息:%2”).arg(m_内容->文本())
.arg(input.errorString());
返回;
}
植物学家::PKCS11::PKCS11_X509_证书*证书=nullptr;
Botan::Private_Key*Key=nullptr;
// извлечение ключа и сертификата из токена
而(!input.atEnd())
{
静态常数qint64 maxLen=1024;
QByteArray数据=输入.读取(maxLen);
(*模块)->C_DigestUpdate(会话->句柄(),
重新解释强制转换(data.data()),
data.size(),&rv);
如果(rv!=Botan::PKCS11::ReturnValue::OK)
{
QMessageBox::critical(这是tr(“错误”),
tr(“摘要未运行。\n错误代码:0x%3”)
.arg(静态_铸造(rv),0,16));
删除密钥;
删除证书;
删除会话;
删除插槽;
删除模块;
返回;
}
}
摘要:调整大小(102400);
乌龙消化片;
(*模块)->C_DigestFinal(会话->句柄(),摘要.data(),&digestLen,&rv);
如果(rv!=Botan::PKCS11::ReturnValue::OK)
{
QMessageBox::critical(这是tr(“错误”),
tr(“摘要未开始。\n错误代码:0x%3”)
.arg(静态_铸造(rv),0,16));
删除密钥;
删除证书;
删除会话;
删除插槽;
删除模块;
返回;
}
digest.resize(digestLen);
{
植物学::PKCS11::PKCS11_RNG RNG(*会议);
std::唯一的\u ptr签名者=
密钥->创建签名操作(rng、,
“EMSA3(SHA-256)”,
"");
签名者->更新(digest.data(),digest.size());
std::vector attr=createAttributes(摘要);
自动签名数据=签名者->签名(rng);
用于(uint8_t i:signData)
签名。推回(i);
植物学::算法识别器digAlg(“SHA-256”,{});
自动文件数据=createCMS(数字证书,*证书,密钥->算法\标识符(),
信号
Verification failure
140365848428992:error:04091068:rsa routines:int_rsa_verify:bad signature:../crypto/rsa/rsa_sign.c:220:
140365848428992:error:2E09A09E:CMS routines:CMS_SignerInfo_verify_content:verification failure:../crypto/cms/cms_sd.c:842:
140365848428992:error:2E09D06D:CMS routines:CMS_verify:content verify error:../crypto/cms/cms_smime.c:393: