Pkcs11 ECDSA 签名返回 CKR_DATA_INVALID

Pkcs11 ECDSA signing returning CKR_DATA_INVALID

我在加载了可信证书的 Yubikey 上使用 piv 与服务器进行双向 tls。我正在使用 this golang pkcs11 library 这是 opensc-pkcs11.so

的包装器

我正在使用 yubikey 实现一个签名者接口,以便它可以用作 go 的 crypo/tls 库的私钥。

我的 signer 函数如下所示(我在错误中添加了调试数据):

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: The plaintext input data to a cryptographic operation is invalid. This return value has lower priority than CKR_DATA_LEN_RANGE.

数据显然是正确的长度,pkcs11 在签名之前还检查摘要中的什么?

谢谢!

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