PKCS11 中带有 ISO/IEC 9796-2 方案 2 的 RSA

RSA with ISO/IEC 9796-2 scheme 2 in PKCS11

有没有办法使用 PKCS11 接口使用 ISO-9796 方案 2 创建 RSA 签名?我知道定义中列出了适当的机制(或者至少我是这么认为的): CKM_RSA_97960x00000002

但根据 ISO Descrption 模式 2 需要参数(即 salt 和 trailer),这似乎与

冲突

6.1.11 ISO/IEC 9796 RSA The ISO/IEC 9796 RSA mechanism, denoted CKM_RSA_9796, is a mechanism for single-part signatures and verification with and without message recovery based on the RSA public-key cryptosystem and the block formats defined in ISO/IEC 9796 and its annex A.

This mechanism does not have a parameter.

我尝试使用 PKCS11Interop C# class 和 HSM 模拟器创建带有(抛出 PKCS11 异常)和不带参数(似乎无效)的签名。任何帮助将不胜感激。

编辑

我使用的代码:

using (Session session = slot[slotIndex].OpenSession(SessionType.ReadOnly))
                    {
                        session.Login(CKU.CKU_USER, callback.GetPassword());

                        List<ObjectAttribute> objectAttributes = new List<ObjectAttribute>();
                        objectAttributes.Add(new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_PRIVATE_KEY));

                        var prm = new Net.Pkcs11Interop.HighLevelAPI.MechanismParams.CkRsaPkcsPssParams(Convert.ToUInt32(CKM.CKM_SHA256), Convert.ToUInt32(CKG.CKG_MGF1_SHA256),Convert.ToUInt32(20));   
                        Mechanism mchanism = new Mechanism(CKM.CKM_RSA_9796,prm);
                        List<ObjectHandle> foundObjects = session.FindAllObjects(objectAttributes);
                        if (foundObjects != null && foundObjects.Count > 0)
                        {
                            signature = session.SignRecover(mchanism, foundObjects[0], result);
                        }
                        else
                        {
                            throw new DSException("There was a problem with reading private key from token");
                        }
                        session.Logout();
                    }

我收到异常:

Method C_SignRecoverInit returned CKR_MECHANISM_PARAM_INVALID

谢谢。

是的,所以我终于弄明白了,或者至少我是这么认为的。事实证明,CKM_RSA_9796 机制实现了旧的、不太安全的 RSA_9796 签名机制,它要求消息的长度 < k/2,其中 k 是私钥长度。所以这是我一直在寻找的不同的东西。根据 fgrieu 用户对 StackExchange 的评论:

https://crypto.stackexchange.com/questions/24294/how-do-signrecover-and-verifyrecover-work.

PKCS11 中 根本没有实施 ISO/IEC 9796-2 方案 2。我能够通过将这个过程分成 2 个子过程来创建签名。第一个创建 MessageRepresentative(如 http://www.sarm.am/docs/ISO_IEC_9796-2_2002(E)-Character_PDF_document.pdf 中所示),第二个 - 在 PKCS#11 实现中使用 CKM.CKM_RSA_X_509 创建签名(使用 MessageRepresentative 作为输入)。希望这对以后的人有所帮助。

感谢所有对我的问题发表评论的人。