为 jCardSim 添加对 bouncycastle API 的支持
Add support for bouncycastle API to jCardSim
现在 javacard 2.2.2 有 no such emulator 支持椭圆曲线点操作。
但是,有一个名为 jCardSim that delegates all crypto operations to Bouncycastle java 库的模拟器。
官方网站上没有关于如何添加 "proxy" bouncycastle API 以便在模拟小程序中使用它的线索。
所以目标是升级这个:
import javacard.framework.*;
import javacard.security.*;
像这样:
import javacard.framework.*;
import javacard.security.*;
import local.org.bouncycastle.math.ec.ECPoint;
由于资源是免费提供的,应该有一种方法可以重建某些模拟器以便为我的小程序提供 ECPoint
支持。当然,所有这些操作都需要在上传到卡片之前进行小程序测试,具有原生 ECPoint
支持。
所以,问题是:我到底应该打什么补丁才能在 运行 小程序中实现 bouncycastle API 的可见性?
你不应该这样做。即使有可能,您也会希望您的 Java 卡无法处理 int
基本类型。此外,Bouncy API 很可能会创建对象,期望 byte[]
参数并执行各种与 Java Card(经典)的想法不兼容的事情。
相反,您应该实施或扩展 Java 卡 API 以获得所需的功能,然后使用 Bouncy Castle 对其进行备份。
经过一些工作,解决方案已完成。代码前的一些说明
ECPoint
无法导入 Bouncycastle "as is": 需要两个包装器。第一个 - 执行点乘法和加法等高级任务(参见 ECOperation class)。其次 - 需要一些纯 JavaCard class 来为低级使用包装高级构造(参见 JCECC class)。
- 此集成解决方案不能超过jcardsim 模拟器中的测试环境。为了备份硬件设备的
ECPoint
,需要将所有 jcardsim 导入替换为特定于令牌的导入(即 import com.licel.jcardsim.SESPAKE.JCECC;
,例如 import com.gemalto.javacard.gostservices.math.ECMathFp;
)并确保所有 API-提供的功能在小程序中正确绑定。还需要 .exp
文件来编译相应设备的 .cap
文件。
这是如何工作的:
- 为了应用补丁 IDE 应该设置 this way and latest jcardsim source code version should be pulled out from repo。
ECOperations
class 应该添加到一些 jcardsim 包中。我在我的资源中使用了 crypto
包。
JCECC
class 应该添加到一些 jcardsim 包中。我在源代码中使用了单独的 samples.SESPAKE
包。
- 在小程序中添加一些测试结构,以验证所有操作是否正常:
private JCECC jcecc = new JCECC((short) 32);
然后在 process()
的某处
jcecc.generatePointData();
jcecc.multiplyBasepoint();
byte[] Qpwx = { (byte) 0x9d,(byte) 0x33,(byte) 0x9b,(byte) 0x33,(byte) 0x96,(byte) 0xae,(byte) 0x4a,
(byte) 0x81,(byte) 0x63,(byte) 0x88,(byte) 0xa1,(byte) 0x4c,(byte) 0x79,(byte) 0xab,
(byte) 0x3a,(byte) 0x8d,(byte) 0xd4,(byte) 0x95,(byte) 0xfa,(byte) 0x4c,(byte) 0x53,
(byte) 0xf0,(byte) 0xd4,(byte) 0x07,(byte) 0x65,(byte) 0x79,(byte) 0x02,(byte) 0x2e,
(byte) 0xf2,(byte) 0xaa,(byte) 0xeb,(byte) 0x68 };
byte[] Qpwy = { (byte) 0xda,(byte) 0xd9,(byte) 0x14,(byte) 0x82,(byte) 0xe2,(byte) 0x08,(byte) 0x59,
(byte) 0x0f,(byte) 0xd3,(byte) 0x16,(byte) 0xbf,(byte) 0x95,(byte) 0x94,(byte) 0x80,
(byte) 0xf5, (byte)0xec,(byte) 0x2c,(byte) 0x17,(byte) 0x46,(byte) 0x3e,(byte) 0xc8,
(byte) 0xfc,(byte) 0x8f,(byte) 0x63,(byte) 0x03,(byte) 0x06,(byte) 0x49,(byte) 0xb4,
(byte) 0x52,(byte) 0xcd,(byte) 0xdd,(byte) 0xa8 };
jcecc.addPoints(jcecc.Qx, jcecc.Qy, Qpwx, Qpwy);
Qpwx = jcecc.getRx();
Qpwy = jcecc.getRy();
旁注
所有这些努力可能看起来确实过分:当有卡上 ECDH 支持时,谁需要这些东西?不幸的是,有时直接使用 EC 点进行操作是在 JavaCard 中实现像 SESPAKE
这样的协议的唯一方法。
欢迎任何反馈。
仅基于 public javacard API(无供应商专有 API)的 ECPoint 开源实现作为 JCMathLib 库的一部分(一起与 Bignat 和(大)整数)。 JCMathLib 既可以在真实卡上运行(需要原生 EC 支持 KeyPair.ALG_EC_FP),也可以直接在 JCardSim 模拟器中运行(因为不需要非标准 API)。
潜在的缺点是与供应商专有的 API 相比,某些操作的性能较慢,并且对侧信道和故障诱导攻击的弹性较低。
优点是不同供应商的卡之间的可移植性以及使用 JCardSim 模拟器而不是专有模拟器的可能性。
现在 javacard 2.2.2 有 no such emulator 支持椭圆曲线点操作。
但是,有一个名为 jCardSim that delegates all crypto operations to Bouncycastle java 库的模拟器。
官方网站上没有关于如何添加 "proxy" bouncycastle API 以便在模拟小程序中使用它的线索。
所以目标是升级这个:
import javacard.framework.*;
import javacard.security.*;
像这样:
import javacard.framework.*;
import javacard.security.*;
import local.org.bouncycastle.math.ec.ECPoint;
由于资源是免费提供的,应该有一种方法可以重建某些模拟器以便为我的小程序提供 ECPoint
支持。当然,所有这些操作都需要在上传到卡片之前进行小程序测试,具有原生 ECPoint
支持。
所以,问题是:我到底应该打什么补丁才能在 运行 小程序中实现 bouncycastle API 的可见性?
你不应该这样做。即使有可能,您也会希望您的 Java 卡无法处理 int
基本类型。此外,Bouncy API 很可能会创建对象,期望 byte[]
参数并执行各种与 Java Card(经典)的想法不兼容的事情。
相反,您应该实施或扩展 Java 卡 API 以获得所需的功能,然后使用 Bouncy Castle 对其进行备份。
经过一些工作,解决方案已完成。代码前的一些说明
ECPoint
无法导入 Bouncycastle "as is": 需要两个包装器。第一个 - 执行点乘法和加法等高级任务(参见 ECOperation class)。其次 - 需要一些纯 JavaCard class 来为低级使用包装高级构造(参见 JCECC class)。- 此集成解决方案不能超过jcardsim 模拟器中的测试环境。为了备份硬件设备的
ECPoint
,需要将所有 jcardsim 导入替换为特定于令牌的导入(即import com.licel.jcardsim.SESPAKE.JCECC;
,例如import com.gemalto.javacard.gostservices.math.ECMathFp;
)并确保所有 API-提供的功能在小程序中正确绑定。还需要.exp
文件来编译相应设备的.cap
文件。
这是如何工作的:
- 为了应用补丁 IDE 应该设置 this way and latest jcardsim source code version should be pulled out from repo。
ECOperations
class 应该添加到一些 jcardsim 包中。我在我的资源中使用了crypto
包。JCECC
class 应该添加到一些 jcardsim 包中。我在源代码中使用了单独的samples.SESPAKE
包。- 在小程序中添加一些测试结构,以验证所有操作是否正常:
private JCECC jcecc = new JCECC((short) 32);
然后在 process()
jcecc.generatePointData();
jcecc.multiplyBasepoint();
byte[] Qpwx = { (byte) 0x9d,(byte) 0x33,(byte) 0x9b,(byte) 0x33,(byte) 0x96,(byte) 0xae,(byte) 0x4a,
(byte) 0x81,(byte) 0x63,(byte) 0x88,(byte) 0xa1,(byte) 0x4c,(byte) 0x79,(byte) 0xab,
(byte) 0x3a,(byte) 0x8d,(byte) 0xd4,(byte) 0x95,(byte) 0xfa,(byte) 0x4c,(byte) 0x53,
(byte) 0xf0,(byte) 0xd4,(byte) 0x07,(byte) 0x65,(byte) 0x79,(byte) 0x02,(byte) 0x2e,
(byte) 0xf2,(byte) 0xaa,(byte) 0xeb,(byte) 0x68 };
byte[] Qpwy = { (byte) 0xda,(byte) 0xd9,(byte) 0x14,(byte) 0x82,(byte) 0xe2,(byte) 0x08,(byte) 0x59,
(byte) 0x0f,(byte) 0xd3,(byte) 0x16,(byte) 0xbf,(byte) 0x95,(byte) 0x94,(byte) 0x80,
(byte) 0xf5, (byte)0xec,(byte) 0x2c,(byte) 0x17,(byte) 0x46,(byte) 0x3e,(byte) 0xc8,
(byte) 0xfc,(byte) 0x8f,(byte) 0x63,(byte) 0x03,(byte) 0x06,(byte) 0x49,(byte) 0xb4,
(byte) 0x52,(byte) 0xcd,(byte) 0xdd,(byte) 0xa8 };
jcecc.addPoints(jcecc.Qx, jcecc.Qy, Qpwx, Qpwy);
Qpwx = jcecc.getRx();
Qpwy = jcecc.getRy();
旁注
所有这些努力可能看起来确实过分:当有卡上 ECDH 支持时,谁需要这些东西?不幸的是,有时直接使用 EC 点进行操作是在 JavaCard 中实现像 SESPAKE
这样的协议的唯一方法。
欢迎任何反馈。
仅基于 public javacard API(无供应商专有 API)的 ECPoint 开源实现作为 JCMathLib 库的一部分(一起与 Bignat 和(大)整数)。 JCMathLib 既可以在真实卡上运行(需要原生 EC 支持 KeyPair.ALG_EC_FP),也可以直接在 JCardSim 模拟器中运行(因为不需要非标准 API)。
潜在的缺点是与供应商专有的 API 相比,某些操作的性能较慢,并且对侧信道和故障诱导攻击的弹性较低。
优点是不同供应商的卡之间的可移植性以及使用 JCardSim 模拟器而不是专有模拟器的可能性。