微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pkcs11 ECDSA 签名返回 CKR_DATA_INVALID

如何解决Pkcs11 ECDSA 签名返回 CKR_DATA_INVALID

我在装有受信任证书的 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.Mechanism{pkcs11.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 在签名之前检查摘要还有什么?

谢谢!

解决方法

加载到插槽中的密钥是 RSA 密钥,而不是 EC 密钥,这意味着执行 ECDSA 失败。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。