Java 向jCardSim添加对bouncycastle API的支持

Java 向jCardSim添加对bouncycastle API的支持,java,cryptography,bouncycastle,javacard,elliptic-curve,Java,Cryptography,Bouncycastle,Javacard,Elliptic Curve,现在对于javacard 2.2.2,有一个支持椭圆曲线点操作的 然而,有一个名为的模拟器将所有加密操作委托给java库 官方网站上没有关于如何添加“代理”BouncyCastleAPI以便在模拟小程序中使用它的线索 因此,我们的目标是升级: import javacard.framework.*; import javacard.security.*; 对这样的事情: import javacard.framework.*; import javacard.security.*; impor

现在对于javacard 2.2.2,有一个支持椭圆曲线点操作的

然而,有一个名为的模拟器将所有加密操作委托给java库

官方网站上没有关于如何添加“代理”BouncyCastleAPI以便在模拟小程序中使用它的线索

因此,我们的目标是升级:

import javacard.framework.*;
import javacard.security.*;
对这样的事情:

import javacard.framework.*;
import javacard.security.*;
import local.org.bouncycastle.math.ec.ECPoint;
由于源代码是免费提供的,因此应该有一种方法来重建某些模拟器,以便为我的小程序提供
ECPoint
支持。当然,在将小程序上传到具有本机
ECPoint
支持的卡之前,所有这些操作都是小程序测试所必需的


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

您不应该这样做。即使有可能,您也会希望Java卡不能处理
int
基类型。此外,BouncyAPI可以很好地创建对象,除了
byte[]
参数之外,还可以执行各种与Java卡(经典)理念不兼容的操作


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

完成一点工作后,解决方案就完成了。在编写代码之前,只需进行一些澄清

  • 无法“按原样”导入Bouncycastle中的ECPoint:需要两个包装器。第一个任务-执行诸如点乘法和加法之类的高级任务(请参见ECOperation类)。第二,需要一些纯JavaCard类来包装高级构造以供低级使用(参见JCECC类)
  • 此集成解决方案只能在jcardsim emulator中的测试环境中使用。为了备份硬件设备的
    ECPoint
    ,需要将所有jcardsim导入替换为令牌特定导入(即
    import com.licel.jcardsim.SESPAKE.JCECC;
    例如
    import com.gemalto.javacard.gostservices.math.ECMathFp;
    )并确保所有API提供的函数在小程序中正确绑定。此外,还需要
    .exp
    文件来编译相应设备的
    .cap
    文件
  • 工作原理:

  • 为了应用补丁,应该设置IDE,并从中取出最新的jcardsim源代码版本
  • 类应添加到某些jcardsim包中。我在我的源代码中使用了
    crypto
  • 类应添加到某些jcardsim包中。我在我的源代码中使用了单独的
    samples.SESPAKE
  • 在小程序中添加一些测试结构,以验证所有操作是否正常:
  • private JCECC JCECC=new JCECC((短)32)process()中的某个地方


    旁注

    所有这些努力可能看起来真的太过分了:当有卡上ECDH支持时,谁需要这些东西?不幸的是,有时使用EC poitns直接操作是实现JavaCard等协议的唯一方法



    欢迎任何反馈。

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

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


    其优势在于不同供应商的卡之间的可移植性,以及使用JCardSim模拟器而不是专用模拟器的可能性。

    这里的实际问题是什么?如果愿意的话,可以在jCardSim中更改各种内容,如Java和JavaCardAPIsupport@PaulBastian是我的错,问题没有明确说明。更新了。我的答案有什么遗漏吗?臭名昭著?问题解决了。为了获得灵感,我试着实现你写的所有东西。
     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();