2016-01-20 74 views
1

现在对于javacard 2.2.2,有支持椭圆曲线点操作的no such emulator将对bouncycastle API的支持添加到jCardSim中

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

在官方网站上没有关于如何添加“proxy”bouncycastle API以便在模拟的applet中使用它的线索。

因此我们的目标是升级这样的:

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

到这样的事情:

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

由于来源是免费提供的,应该有重建某些仿真器以一种方式为我的小程序提供ECPoint支持。当然,所有这些操作都是在上传到卡之前进行小程序测试所必需的,该卡具有原生ECPoint支持。

所以,问题是:为了实现运行applet中的bouncycastle API的可见性,我应该修补哪些内容?

+0

实际上这里的问题是什么?如果你喜欢Java的API支持JavaCard API的话,你可以在jCardSim中更改各种各样的东西 –

+0

@PaulBastian,那个问题没有明确说明。更新。 –

回答

1

经过一些工作,解决方案就完成了。代码

  1. ECPoint之前,从BouncyCastle的短短几年澄清无法导入“原样”:有需要两个包装。第一个 - 执行点乘法和加法等高级任务(请参阅ECOperation类)。其次 - 为了低层次使用包装高层次的构造,请使用一些纯JavaCard类(请参阅JCECC类)。
  2. 此集成解决方案不能超过jcardsim仿真器中的测试环境。为了备份硬件设备的ECPoint,需要使用特定于令牌的导入(即import com.licel.jcardsim.SESPAKE.JCECC;,例如import com.gemalto.javacard.gostservices.math.ECMathFp;)来替换所有jcardsim导入,并确保所有API提供的功能都在applet中正确绑定。还需要.exp文件来编译相应设备的.cap文件。

这是如何工作:

  1. 为了打补丁,IDE应设立this方式最新jcardsim源代码版本应该repo拉出。
  2. ECOperations类应添加到一些jcardsim包。我在源中使用了crypto包。
  3. JCECC类应该添加到一些jcardsim包。我在源代码中使用了单独的samples.SESPAKE包。
  4. 添加一些测试结构中的小程序,只是为了验证所有的操作都OK:

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等协议的唯一方式。


欢迎任何反馈。

1

你不应该这样做。即使可能,你也会期望你的Java卡不能处理基本类型int。此外,Bouncy API可能会创建对象,期望参数以及各种与Java Card(经典)思想不兼容的内容。

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

+0

从我的回答中找不到任何东西,im_infamous? –

+0

问题已解决。 thnx的灵感,我试图实现你所写的一切。 –

1

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

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

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