添加对bouncycastle API的支持到jCardSim

时间:2016-01-20 19:12:29

标签: java cryptography bouncycastle javacard elliptic-curve

现在对于javacard 2.2.2,有no such emulator支持椭圆曲线点操作。

但是,有一个名为jCardSim的模拟器将所有加密操作委托给Bouncycastle java库。

官方网站上没有关于如何添加"代理"的消息。 bouncycastle API,以便在模拟小程序中使用它。

所以我们的目标是升级它:

import javacard.framework.*;
import javacard.security.*;

这样的事情:

import javacard.framework.*;
import javacard.security.*;
import local.org.bouncycastle.math.ec.ECPoint;

由于源是免费提供的,因此应该有一种方法来重建某些模拟器,以便为我的applet提供ECPoint支持。当然,在将applet上传到卡之前,所有这些操作都是必需的,具有本机ECPoint支持。

所以,问题是:为了在运行applet中实现bouncycastle API的可见性,我应该修补什么?

3 个答案:

答案 0 :(得分:1)

你不应该这样做。即使有可能,您也希望Java Card不会处理int基类型。此外,Bouncy API可能会创建对象,期望byte[]参数,并做各种与Java Card(经典)概念不兼容的东西。

相反,您应该实现或扩展Java Card API以获得所需的功能,然后使用Bouncy Castle进行备份。

答案 1 :(得分:1)

经过一番工作后,解决方案就完成了。在代码之前只需做一些澄清

    来自Bouncycastle的
  1. ECPoint无法“按原样”导入:需要两个包装器。第一个 - 执行高级任务,如点乘法和加法(参见ECOperation类)。第二 - 需要一些纯JavaCard类,以便为低级别使用包装高级构造(参见JCECC类)。
  2. 此集成解决方案不能超过jcardsim仿真器中的测试环境。为了备份硬件设备的ECPoint,需要将所有jcardsim导入替换为特定于令牌的导入(例如import com.licel.jcardsim.SESPAKE.JCECC;,例如import com.gemalto.javacard.gostservices.math.ECMathFp;),并确保所有API提供的功能都绑定在applet中正确。此外,还需要.exp文件来编译相应设备的.cap文件。
  3. 这是如何运作的:

    1. 为了应用补丁,IDE应设置为this方式,并且应从repo中提取最新的jcardsim源代码版本。
    2. ECOperations类应添加到某些jcardsim包中。我在我的来源中使用了crypto包。
    3. JCECC类应添加到某些jcardsim包中。我在我的来源中使用了单独的samples.SESPAKE包。
    4. 在applet中添加一些测试构造只是为了验证所有操作都正常:
    5. 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 poitns直接操作是在JavaCard中实现SESPAKE等协议的唯一方法。

      欢迎任何反馈。

答案 2 :(得分:1)

仅基于公共javacard API(无供应商专有API)的ECPoint开源实现可作为JCMathLib库的一部分(与Bignat和(Big-)Integer一起)提供。 JCMathLib既可以在真实卡上运行(需要本机EC支持KeyPair.ALG_EC_FP),也可以直接在JCardSim模拟器中运行(因为不需要非标准API)。

与供应商专有API相比,潜在的缺点是某些操作的性能较慢,而侧通道和故障诱导攻击的弹性较低。

优点是来自不同供应商的卡之间的可移植性以及使用JCardSim模拟器而非专有模拟器的可能性。