PKCS11-为SHA256_HMAC生成密钥

时间:2020-05-12 07:10:59

标签: c++ pkcs#11 botan softhsm

我使用Botan2库访问SoftHSM2。我设法生成了一些AES / DES密钥,但是我想为SHA256 HMAC生成一个秘密。

我的代码(在创建会话,登录并检测我的令牌之后):

namespace p11 = Botan::PKCS11;
p11::SecretKeyProperties propsOtpGen(p11::KeyType::Sha256Hmac);
propsOtpGen.set_label("OTPGEN");
propsOtpGen.set_modifiable(false);
propsOtpGen.set_private(true);
propsOtpGen.set_token(true);
propsOtpGen.set_sensitive(true);
propsOtpGen.set_sign(true);
propsOtpGen.set_verify(true);
propsOtpGen.add_numeric(p11::AttributeType::ValueLen, 16UL);

p11::Mechanism m {static_cast<CK_MECHANISM_TYPE >::MechanismType::GenericSecretKeyGen), NULL_PTR, 0};
11::ObjectHandle keyHandle;
const std::vector<p11::Attribute> vec = propsOtpGen.attributes();

module->C_GenerateKey(session.handle(), &m, const_cast<CK_ATTRIBUTE*>(&vec[0]), vec.size(), &keyHandle);

抛出0xd1 CKR_TEMPLATE_INCONSISTENT

我检查了SofthHSM2日志,但是没有更多信息。

编辑

我还有其他一些使用nCipher的示例实现,并且类似的态度与供应商机制CKM_NC_SHA256_HMAC_KEY_GEN一起工作。但是,该版本不在pkcs11标准中,因此我无法使用它。

1 个答案:

答案 0 :(得分:0)

尝试了所有可以想象的呼叫之后,我仍然没有使其与SHA256HMAC密钥类型一起使用。似乎没有生成器。

我发现的onlu解决方法是使用GenericSecret密钥类型。

namespace p11 = Botan::PKCS11;
p11::SecretKeyProperties propsOtpGen(p11::KeyType::GenericSecret);
//...

这会生成密钥,稍后可以使用适当的机制传递对象句柄以进行签名/验证

CK_MECHANISM mechanism{CKM_SHA256_HMAC, NULL_PTR, 0};
module->C_SignInit(session.handle(), &mechanism, keyHandle);
module->C_Sign(session.handle(), data, signature);

但是,上述操作在我使用的SoftHSM2下仍将失败,因为它不支持所提供的密钥大小(可以从插槽的get_mechanism_info中读取)-支持的范围是<32,512>。因此,最终的修饰将会修补

propsOtpGen.add_numeric(p11::AttributeType::ValueLen, 32UL);

我尝试将不同的密钥大小应用回Sha256Hmac密钥类型,但似乎无法解决问题。 (我认为模板不一致可能是由该属性引起的。

相关问题