Pkcs11 ECDSA 签名返回 CKR_DATA_INVALID
Posted
技术标签:
【中文标题】Pkcs11 ECDSA 签名返回 CKR_DATA_INVALID【英文标题】:Pkcs11 ECDSA signing returning CKR_DATA_INVALID 【发布时间】:2021-10-04 15:17:22 【问题描述】:我在装有可信证书的 Yubikey 上使用 piv 与服务器进行双向 tls。我正在使用this golang pkcs11 library 这是对 opensc-pkcs11.so 的包装器
我正在使用 yubikey 实现一个签名者接口,以便它可以用作 go 的 crypo/tls 库的私钥。
我的签名函数是这样的(我在错误中添加了数据进行调试):
func (signer *pkcs11PrivateKeyECDSA) Sign(rand io.Reader, digest []byte, opts crypto.SignerOpts) ([]byte, error)
return signer.yubi.dsaGeneric(signer.handle, pkcs11.CKM_ECDSA, digest)
func (yubi yubiInfo) dsaGeneric(key pkcs11.ObjectHandle, mechanism uint, digest []byte) ([]byte, error)
var err error
var sigBytes []byte
var sig dsaSignature
mech := []*pkcs11.Mechanismpkcs11.NewMechanism(mechanism, nil)
fmt.Println("Siging with key: ", key)
if err = yubi.ctx.SignInit(yubi.ses, mech, key); err != nil
return nil, fmt.Errorf("signer init: %v", err)
sigBytes, err = yubi.ctx.Sign(yubi.ses, digest)
if err != nil
return nil, fmt.Errorf("signer sign: %v, len: %d, \n %s", err, len(digest), string(digest))
err = sig.unmarshalBytes(sigBytes)
if err != nil
return nil, err
return sig.marshalDER()
在上述代码中尝试与签名者进行 tls 握手会产生以下错误消息:
rpc error: code = Unavailable desc = connection error: desc = "transport: authentication handshake failed: signer sign: pkcs11: 0x20: CKR_DATA_INVALID, len: 32, \n ZX\xe0ތ\xcdў\xbf\xdeTh.\xacS\x1d\x89\xeeH\xe0\xf0$\xd1\xda\xf7\t\xfan:\xa7\b\xb6"
什么可能使摘要对签名者无效?根据我在网上发现的错误意味着:
CKR_DATA_INVALID:加密操作的明文输入数据无效。此返回值的优先级低于 CKR_DATA_LEN_RANGE。
数据的长度显然是正确的,pkcs11 在签名之前还在摘要中检查什么?
谢谢!
【问题讨论】:
不幸的是我真的不确定,但我知道你可以将它移植到 Rust 【参考方案1】:加载到插槽中的密钥是 RSA 密钥,而不是 EC 密钥,这意味着执行 ECDSA 失败。
【讨论】:
以上是关于Pkcs11 ECDSA 签名返回 CKR_DATA_INVALID的主要内容,如果未能解决你的问题,请参考以下文章
PHP中的PKCS#7签名使用PKCS#11而没有CLI调用
验证充气城堡上的 javacard 签名 ALG_ECDSA_SHA
如何从 Crypto++ ECDSA 中的签名体中获取签名长度