如何计算智能卡上的数字签名?

How to compute a digital signature on a Smartcard?

所以我对智能卡还很陌生,我正在尝试计算一些随机字节的签名。卡上的操作系统是cardos v4.3。我能够使用 PKCS#15 格式和 ISO 7816 标准。

我计算签名的工作流程如下:

  1. select SigG 应用程序 APDU= 00 A4 01 0C 02 1F FF 00.status = 90 00

  2. 验证 Sig。当前DF APDU中的引脚= 00 20 00 81 08 31 32 33 34 35 36 37 38 00 status = 90 00

  3. 试图用 PSO_CDS APDU= 00 2A 9E 9A 08 01 02 03 04 05 06 07 08 .... 28(hex) 00 status = 6A88

智能卡处于全新重置状态。

我是否缺少需要满足的命令或先决条件或其他内容? 签署使用例如 openssl 计算的哈希值时的一般工作流程是什么?

我知道 PSO_CDS 必须有一个当前安全环境,其中必须指定有效的 PSO_PrivateKey,但我不明白如何将其合并到命令流中。

我正计划创建一个 c++ 函数,它将获取哈希值、使用智能卡计算签名,然后 return 签名。

问题是,卡不知道使用哪个密钥。这是由于正确观察到缺乏有意义的当前安全环境。由于 Perform Security Environment(简称:PSO)没有指定要使用的密钥的标准化方法,因此必须通过向安全环境提供该信息来更早地进行设置,例如。 G。通过管理安全环境(见下文)。

提供密钥参考的最简单方法是,在与您的密钥相同的 DF 中创建 ID 为 1 的持久安全环境,因为它会在 SELECT 期间自动加载(或恢复)(FILE ) 的 DF,否则您必须在恢复模式下手动或在 SET 模式下发送管理安全环境(简称 MSE)(对于此会话来说是易变的)。 (无论您使用哪种安全环境,它都必须在数字签名模板中包含对私钥的引用。)您可以选择在选择 DF 之后、PIN 验证之前或两者之间的任何时刻直接执行 MSE RESTORE,但发送PSO命令时必须激活

40 字节似乎不是典型散列值的长度,因此请注意正确设置算法以包含散列。

所以,我能够计算出一个签名。因为 PSO_CDS 对我不起作用,所以我这样做了:

  1. Select SigG Application/DF.

  2. 创建了一个管理安全环境集 (mse set),我在其中指定了当前安全环境之外的 CON 组件(即应用程序中的 PSO 私钥)。

  3. 在 SigG 应用程序中使用 Pin 对象验证了 Pin。

  4. 用PSO_DEC计算签名。使用 PSO_DEC 时,您需要提供扩展的 apdu,因为命令字段必须包含填充的 256 字节哈希值,而对于普通 apdu,我的卡上最多只能有 255 字节的命令字段。