问题标签 [pkcs11interop]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3144 浏览

c# - Pkcs11Interop.PDF 库中私钥的识别

我正在尝试使用Pkcs11Interop.PDF扩展名设置示例应用程序。不幸的是,我正在System.ArgumentNullException设置ckaId。什么在这里工作?我在这里尝试了不同的数字,它们都给了我一个System.ArgumentOutOfRangeException.

该设置使用 VirtualCryptoki-64-1.0.6.7.exe 应用程序来模拟智能卡。

令人不安的电话是:

我使用的哈希算法是:

使用 pkcs11-tool 后更新:

虚拟卡的内容是:

我使用的参数是:

不幸的是,我正在Net.Pkcs11Interop.PDF.ObjectNotFoundException设置 ckaId。更改 pin 给了我一个不同的例外,所以我在这里明确地访问了正确的设备。

切换到 SoftHSM 后更新: jariq 表示这里有太多具有相同 id 的对象存在问题。不幸的是,Virtual Key Explorer 不允许我删除任何对象,所以我切换到 SoftHSM(我一开始就使用它)。我收到“未找到带有标签“ibis-it key”和 ID“A1B2”的证书”。我想这里的问题是这个虚拟卡只包含一个 RSA 密钥对而不是一个证书。

pkcs11 工具的输出是:

问题是 SoftHSM 只导入 PKCS#8 (RSA) 密钥对,所以这里永远不会有证书。我想您一直在将它与 RSA 密钥对一起使用,但没有与证书一起使用。

0 投票
1 回答
1124 浏览

c# - 使用 Pkcs11Interop 进行 PDF 签名

我尝试将 Pkcs11Interop 库用于我们的机构项目。但问题是,当我尝试从令牌卡中获取价值时,“尝试读取或写入受保护的内存。这通常表明其他内存已损坏”错误来自 Pkcs11Interop。我找不到任何解决方案。请帮助我,提前谢谢你。

项目是用 .Net Framework 4.5 编写的 Windows 窗体应用程序

错误: system.accessviolationexception {"Attempted to read or write protected memory. This is often an indication that other memory is corrupt."}

错误堆栈跟踪:

代码是这样的:

0 投票
1 回答
1644 浏览

c# - 使用 pkcs11Interop 和输出密钥值创建 3DES 密钥,或提供用于创建的密钥值

我想知道是否可以使用 pkcs11interop 创建一个 3DES 密钥并指定要创建的密钥值,或者创建一个密钥并输出生成的密钥值。基本上我需要将密钥导出到另一台设备。

我尝试使用 CKA_VALUE 属性并将密钥作为 byte[] 数组传递,但没有成功。

请问这样的事情可能吗?有人可以帮助我吗?

编辑:

这是我到目前为止没有运气的代码:

因此,我正在尝试使用此代码创建一个 3DES 密钥,然后按照下面的说明使用 GetAttributeValue 获取它的值。我试过 GetValueAsByteArray 和 GetValueAsString 但都没有成功。我注意到的是,即使我在创建时设置了可提取属性,检索到的属性上的 cannotread 属性也设置为 true。

除此之外,我还考虑在生成 3DES 密钥时传递密钥值,但令我困惑的是,文档说与 CKA.CKA_VALUE 一起使用的密钥值应该是长度为 24 的字节数组。在我的情况下,密钥我需要创建的长度为 16,而不是 24。我想创建一个类似于此的密钥,在此处以十六进制表示:1616161616161616 1010101010101010

0 投票
2 回答
998 浏览

rsa - 如何使用智能卡和 PKCS#11 重用现有私钥生成数字签名

我想使用 pkcs11 标准创建数字签名。假设我已经有一个公钥和私钥对存储在我的智能卡上。此密钥是通过使用下一个代码生成的:

现在我可以使用这些密钥来签署一些数据。例如:

当您想要创建密钥然后在 C_sign 方法中使用它时,此代码非常有效

但是如何访问已经存在的密钥来执行类似的操作呢?据我了解,我应该使用 C_Derrive() 方法从现有的私钥派生一个私钥,而不是在 C_Sign() 方法中使用它。为此,我编写了下一个代码:

但是当我运行这段代码时,它会抛出下一个错误:

方法 C_GenerateKey 返回 CKR_MECHANISM_INVALID

谁能告诉我我做错了什么以及如何解决这个问题?

0 投票
1 回答
700 浏览

c# - How to use Pkcs11Interop with an NitroKey HSM to derive an shared secret with an EC

I bought a NitroKey HSM and manged to create an EC on it.

Now I want to derive a shared secret.
I found Pkcs11Interop, which seems to be the right tool for the job, but the handling is unclear.

A code snipplet or link to a working project would be very appreciated.

0 投票
1 回答
1821 浏览

pkcs#11 - 带有 pkcs11interop 的热门使用机制 CKM_ECDH1_DERIVE

我买了一个 NitroKey HSM,想用 EC 导出一个秘密。 以前的问题

为此,我想使用这些CKM_ECDH1_DERIVE机制。此 HSM 支持,请参阅:

参考PKCS#11 规范,这必须考虑:

  1. 机构CKM_ECDH1_DERIVE必须与功能一起使用Derive(页 188)
  2. 该机制CKM_ECDH1_DERIVE需要CK_ECDH1_DERIVE_PARAMS具有以下参数的参数(第 222 页):
    1. kdf : 用于共享秘密值 (CKD) 的密钥派生函数
    2. sharedData : 双方共享的一些数据
    3. publicData : 对方EC公钥值
  3. 该函数DeriveKey需要这些参数:
    1. 机制 CKM.CKM_ECDH1_DERIVE
    2. 对象句柄私钥
    3. 对象属性(第 338 页)
      1. CKA.CKA_CLASS -> CKO.CKO_SECRET_KEY
      2. CKA.CKA_KEY_TYPE -> CKK.CKK_GENERIC_SECRET
      3. 但是“但是,由于这些事实都隐含在机制中,因此无需指定其中任何一个”,因此这些可以为空吗?

问题

所以有了这些信息,我尝试实现一个方法。

但我得到这个错误:

Net.Pkcs11Interop.Common.Pkcs11Exception:方法 C_DeriveKey 返回 CKR_TEMPLATE_INCOMPLETE

Session.DeriveKey.

CKR_TEMPLATE_INCOMPLETE(第 64 页)的解释:

如果提供的模板中的属性值以及任何默认属性值和由对象创建函数本身贡献给对象的任何属性值都不足以完全指定要创建的对象,则尝试应该失败并返回错误代码CKR_TEMPLATE_INCOMPLETE。

在这里(第 98 页)

CKR_TEMPLATE_INCOMPLETE:为创建对象指定的模板不完整,缺少一些必要的属性。有关详细信息,请参阅第 10.1 节。

但我使用了必要的属性:

  1. CKA.CKA_CLASS -> CKO.CKO_SECRET_KEY
  2. CKA.CKA_KEY_TYPE -> CKK.CKK_GENERIC_SECRET

想法?

代码

另请参阅要点(相同代码)https://gist.github.com/dhcgn/4ea235cdb20155ec5ea9dc9bbf3c9887

更新

现在使用更新的 ObjectAttributes 列表(感谢答案)我得到了异常Net.Pkcs11Interop.Common.Pkcs11Exception : Method C_DeriveKey returned CKR_DATA_LEN_RANGE

CKR_DATA_LEN_RANGE:加密操作的明文输入数据长度错误。根据操作的机制,这可能意味着明文数据太短、太长,或者不是某些特定块大小的倍数。此返回值的优先级高于 CKR_DATA_INVALID。

因为CKA.CKA_VALUE_LEN我尝试了不同的值但没有成功:

我偶然发现了公钥,我不确定我是否以正确的方式提取公钥。因为它的长度为664 Bit

CKA.CKA_VALUE( CKO.CKO_PUBLIC_KEY) 664 Bit:

pkcs15-tool用( 864 Bit)提取

  • pkcs15-tool为什么和之间的公钥不同CKO.CKO_PUBLIC_KEY
  • CkEcdh1DeriveParams期望哪种格式publicData
  • 我是否publicData以正确的方式提取?或者什么是正确的方法?
  • 的值必须CKA.CKA_VALUE_LEN等于我的 EC ( 320 Bit) 的长度吗?
0 投票
3 回答
2922 浏览

c# - 使用来自 Thales nShield HSM 的 PKCS11interop c# 包装库导出/导入 RSA 密钥对?

我使用 PKCS11Interop 生成密钥 API 在 HSM 中生成了一个 RSA 公私钥对。我想导出密钥对。我使用 Findobject API 来获取密钥,API 返回一个 ObjectHandle ,在使用 GetAttributeValue API 读取属性时,我无法读取密钥的值。当我将密钥的属性设置为 CKA_EXTRACTABLE 为 true 时,我无法完全生成密钥。

我还需要在 HSM 中导入外部提供的密钥对。

非常感谢任何帮助。

0 投票
1 回答
1193 浏览

pkcs#11 - 多线程签名生成 C#

我正在使用 PKCS11 Compliant Crypto Device 来保护我的私钥。加密设备每秒能够生成 500 个 RSA-2048 位签名。我在 C#.NET 中编写了一个与 PKCS11Interop Wrapper 接口的应用程序。这是我的代码:

干得好!!

  1. 使用顺序签名循环区域,我只能实现 250-280 个签名,但不能达到我的 Crypto OEM 指定的 500 个签名的速度。至少我每秒需要 440~480 个签名。如何使用 Sequential ' for ' 循环来实现这一点?

  2. 为什么我的 UNMANAGED Parallel 循环总是抛出异常?即使我处理了这些异常,40% 的签名也会失败(session.Sign() 函数返回 null)。为什么会这样?

  3. 使用“MANAGED Parallel Loop”代码,我可以达到 280 的最大速度,就像使用顺序签名循环一样。为什么我的 MANAGED Parallel 循环很慢?是因为''吗?如果我删除了,它就变成了 UNMANAGED PARALLEL LOOP。我该如何处理?

  4. 如果您觉得我的多线程编码(以及整个 PKCS11 编程和操作)是错误的,请建议我一些方法来达到最大速度。

  5. 如果您觉得 PCKS11Interop Wrapper 可能存在问题,无法让我达到速度,请建议其他一些包装器。我使用了 NCryptoki、Pkcs11.Net Wrappers,但我无法达到最大速度。

  6. 我 100% 确信我的 PKCS11 兼容设备能够生成 500 个签名。我与我的 OEM 确认了这一点。只有当我通过编程方式(C# 或 Java)操作设备时,我的速度才会下降。

我请本论坛的专家就以上6点给我澄清。

非常感谢。

卡西克

0 投票
1 回答
907 浏览

c# - 在 C# 中将 PKCS'11 对象句柄转换为 X509Certificate 对象

如何将 C_FindObject 返回的 ulong Object_Handle 转换为 C# 中的 X509Certificate 对象。这是代码。

现在我必须将 foundObjectIds[0] 转换为 X509Certificate 对象。

我尝试了以下方法,但它对我不起作用。

0 投票
1 回答
311 浏览

pkcs#11 - 尝试读取或写入受保护的内存。PKCS11互操作

我在突出显示的行中收到访问冲突异常。

尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

我在hsm和上都有证书label。我正在将我的应用程序构建为 x64

我从这条线上得到了例外session.FindObjectsInit();。我是新手pkcs11

感谢您在这方面的任何帮助。

我还尝试通过传递 32bit 将应用程序构建为 32 位crypto.dll,但在这种情况下,我从这一行得到异常,PKCS11Interop Net.Pkcs11Interop.LowLevelAPI81.Delegates.InitializeWithGetF‌​unctionList(IntPtr libraryHandle)异常是

对于 UInt32,值太大或太小。溢出异常未处理。