标签: javacard

如何使用java在智能卡上安装小程序

有什么办法可以加载. 将java卡中的cap(转换小程序)设计成java,然后将小程序从该.cap(转换小程序)文件安装到智能卡中?
我有一个转换成小程序文件的 .cap 文件,我想在该 .cap 文件中安装小程序。
首先告诉我如何在java中加载.cap文件。
在 java 中,我使用javax.smartcardio包与智能卡和 apdu 命令进行交互,以与安装在智能卡中的小程序进行交互。
我在用:

  1. 智能卡类型 = 联系人卡
  2. 使用JavaCard2.2.2JCOP使用APDU

java applet apdu smartcard javacard

5
推荐指数
1
解决办法
2万
查看次数

0x6f00 转换 Javacard 共享接口时出错

我尝试对两个不同的包使用 SIO(可共享接口对象),以便将来更新我的小程序的业务逻辑。我正在使用 eclipse,并启动两个不同的 JavaCard 应用程序:ClientSIOApplet 和 ServerSIOApplet。ClientSIOApplet 中有一个名为 appClient 的包,ServerSIOApplet 中有一个名为 appServer 的包。另外,ClientApplet.java 和 ServerAppBankInterface.java 是 appClient 中的类,而 ServerAppBankInterface.java 和 ServerApplet.java 是 appServer 中的类。您可以看到下面的源代码:

appClient 中的 ClientApplet.java

package appClient;

import javacard.framework.AID;
import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISO7816;
import javacard.framework.ISOException;
import javacard.framework.JCSystem;
import javacard.framework.Shareable;
import javacard.framework.Util;

public class ClientApplet extends Applet {

    Shareable  sio;

    byte[] serverAID = {(byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04, (byte)0x05, (byte)0x01};

    public ClientApplet() {
        // TODO Auto-generated constructor stub

    }

    public static void install(byte[] bArray, short bOffset, byte bLength) …
Run Code Online (Sandbox Code Playgroud)

smartcard javacard

5
推荐指数
1
解决办法
1371
查看次数

定义 ECDSA 签名数据的规范

我想知道ECDSA签名和公钥的数据格式是什么规范(或标准)定义的?

我正在 java 卡上测试 ECDSA 签名。我发现签名和公钥值中有一个TLV格式。

* Public key (TV format)
[Tag=04] [public key value 1] [public key value 2]
04 038A3F59E813995DAB730588CFCBB985F5A1ED90C0D62960AE0B274D 2E6B12672318E0B113DECC0406B62887B6BCB9B1583B1A50779EAB5A

* Signature (TLV format)
[Tag=30] [Length=3C~3E] [Tag=02] [Length=1C~1D] [signature value 1] [Tag=02] [Length=1C~1D] [signature value 2]

303C 021C 7EEB0B2596F74344B3D7B046EA0BD17C4461FC277658CE93509F1674      021C 4F5DBFB30D994664DA80528847A767F0194876B068E5958161797991
303E 021D 0080F20B82D407AE663F010F4990F12073631D653EA1D65DC75EBD4293    021D 00880DB667EF51AEA8E7C9BB012496C7C9ECE3BC5829B82B692B9211C3
303D 021D 00F77447EF326A4A49597D0B839F68F524891F3655DA4561F1AA10EF70    021C 152F7FF18644C5E5C9118736E1F7528F0B10C5FF641C7B7CDF012129
303D 021D 00A2EBCC5C5981341D0726F2E846CC3879C74EFD64D8698589A8CEAB60    021C 6E04FF884A451D7C0737A182BC2DE7F7D3008EE182B46A009BFFC9E8
Run Code Online (Sandbox Code Playgroud)

我认为数据格式是在某些规范或标准中定义的。我只想知道文档名称。

format specifications javacard ecdsa

5
推荐指数
1
解决办法
6972
查看次数

SIM 上 JavaCard 小程序的可信时间来源

我有一个 JavaCard 小程序,可以在智能手机中处理 Gemalto SIM 卡。我想创建一个在指定日期和时间有效的电子钱包。

我知道使用经典智能卡是不可能的,因为没有电池,它里面没有时钟。然而,使用 SIM 卡可能是这样:当连接到网络时,SIM 卡必须对网络时间(不是本地系统时间,用户可以更改)有一定的访问权,并且最后已知的网络时间值可能是可能存储在 SIM 卡上的某个地方。

有没有办法以安全的方式从我的小程序访问最后一个已知的网络时间?(我不相信手机中安装的任何应用程序,因为它很容易被黑客入侵)

你认为我的问题还有其他解决方案吗?

编辑

我没有提到我想到这个的原因:我需要在没有互联网连接的情况下解决这个问题,因为我的客户应该在他们的手机中没有互联网连接的情况下使用我的电子钱包。他们需要在没有信号的地铁中使用它,其中一些人根本不支付互联网连接费用。所以我的应用程序必须能够找出离线时间。

编辑 2

在 Android 手机上,有一个选项:

安卓网络时间设置

这意味着有一些独立于用户的时间来源。问题是,是否可以通过 SIM 卡上的 JavaCard 小程序以安全的方式访问它。(或者如果在没有连接的情况下可以访问最后一个已知值)

time android gsm javacard sim-card

5
推荐指数
1
解决办法
836
查看次数

在 javacard 上使用 Curve25519

我正在考虑在 javacard 3.0.4 上使用 curve25519 但我卡住了,我有以下问题:

javacard 3.0.4 是否支持这样的曲线?

到目前为止,我所尝试的是将蒙哥马利方程转换为魏尔斯特拉斯方程。这样做并使用伯恩斯坦的网站,我得到了以下参数:

p  = 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed
a  = 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa984914a144
b  = 0x7b425ed097b425ed097b425ed097b425ed097b425ed097b4260b5e9c7710c864
r  = 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed
Gx = 0x9
Gy = 0x20ae19a1b8a086b4e01edd2c7748d14c923d4d7e6d7c61b229e9c5a27eced3d9
Run Code Online (Sandbox Code Playgroud)

当我在互联网上发现一些其他值时,我也尝试过

Gx: 0x2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad245a
Run Code Online (Sandbox Code Playgroud)

然后我遵循了ykneo-curves的实现,最终得到了这个:

public class Curve25519 {

   public final static byte[] p = { // 32 bytes
        (byte) 0x7f, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
        (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, …
Run Code Online (Sandbox Code Playgroud)

encryption signature javacard curve-25519

5
推荐指数
2
解决办法
842
查看次数

Elliptic Curve Diffie Hellman 如何在 JavaCard 上与 Java 结合使用?

我正在尝试让 Elliptic Curve Diffie Hellman 在 JavaCard(2.2.1 版)上工作。

在 JavaCard 上,我现在有以下代码:

byte temp[] = new byte[100];
byte secret[] = new byte[100];
byte size = buf[ISO7816.OFFSET_LC];

Util.arrayCopy(buf, ISO7816.OFFSET_CDATA, temp, (byte) 0, size);

// the public key is in temp
short len = dh.generateSecret(temp, (byte) 0, size, secret, (byte) 0);

Util.arrayCopy(temp, (byte) 0, buf, ISO7816.OFFSET_CDATA, size);
//Util.arrayCopy(secret, (byte) 0, buf, ISO7816.OFFSET_CDATA, len);
apdu.setOutgoingAndSend(ISO7816.OFFSET_CDATA, size);
Run Code Online (Sandbox Code Playgroud)

我初始化dh如下:

keyPair = new KeyPair(KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_F2M_163);
keyPair.genKeyPair();
dh = KeyAgreement.getInstance(KeyAgreement.ALG_EC_SVDP_DH, false);
dh.init(keyPair.getPrivate());
Run Code Online (Sandbox Code Playgroud)

所有这些似乎都有效,除了dh.generateSecret调用外,小程序似乎只是崩溃了。如果我忽略调用并返回其他数据,则效果很好。其中我导入了终端发送的数据。在终端中,我有以下内容:

// …
Run Code Online (Sandbox Code Playgroud)

java elliptic-curve javacard diffie-hellman

5
推荐指数
1
解决办法
769
查看次数

在 Java 卡上安装小程序时出现错误 0x643A

在成功安装(和删除)同一个小程序两次后,我无法再在我的 Java 卡上安装小程序。

设置涉及:

  • 智能卡:ACS ACOSJ 40KB Java Card 3.0.4(双接口)
  • 读卡器:Cherry TC 1300(双接口)
  • CCID 驱动程序:HID Global OMNIKEY ifdokccid_linux_x86_64-v4.2.8
  • 软件:GlobalPlatformPro最新提交

一般卡信息:

$ gp-pro --info --debug --verbose
GlobalPlatformPro v0.3.9-26-gf426164
Running on Linux 4.11.3-1-ARCH amd64, Java 1.8.0_121 by Oracle Corporation
[DEBUG] PlaintextKeys - static keys: 
ENC: Ver:0 ID:0 Type:DES3 Len:16 Value:404142434445464748494A4B4C4D4E4F KCV: 8BAF47
MAC: Ver:0 ID:0 Type:DES3 Len:16 Value:404142434445464748494A4B4C4D4E4F KCV: 8BAF47
KEK: Ver:0 ID:0 Type:DES3 Len:16 Value:404142434445464748494A4B4C4D4E4F KCV: 8BAF47
# Detected readers from JNA2PCSC
[ ] Cherry SC …
Run Code Online (Sandbox Code Playgroud)

applet apdu javacard contactless-smartcard globalplatform

5
推荐指数
0
解决办法
505
查看次数

验证 Java Card 签名

我正在 NXP J3D081 卡上编写 Java Card 3.0.2 应用程序。我使用 ALG_ECDSA_SHA_256 对签名进行签名和验证。我的测试应用程序已将密钥写入卡中。如果我对 32 个字节的数据进行签名并将签名传回卡,则验证代码将成功验证签名。如果我使用私钥在 Bouncy Castle 中签署 32 个字节并传递给卡上的验证,它会成功验证签名。充气城堡验证代码成功验证了充气城堡签名例程创建的签名。

但是,如果我从 Java Card 获取返回的签名并将其传递给 C# 充气城堡代码,则无法验证签名。我已经检查了所有输入值,它们是正确的。我的代码在这里(注意我将公钥作为 64 字节传递并在它们前面加上 0x04)

public bool HashAndVerifyDSA(byte[] pb, byte[] inData, byte[] sig)
{
    byte[] pub = new byte[65];
    pub[0] = 0x4;
    Array.Copy(pb, 0, pub, 1, 64);
    ECCurve curve = parameters.Curve;
    ECPoint q = curve.DecodePoint(pub);
    ICipherParameters Public = new ECPublicKeyParameters(algorithm, q, parameters);
    ISigner bSigner = SignerUtilities.GetSigner("SHA-256withECDSA");

    bSigner.Init(false, Public);
    bSigner.BlockUpdate(inData, 0, inData.Length);
    return (bSigner.VerifySignature(sig));
}
Run Code Online (Sandbox Code Playgroud)

我应该注意到参数指定了 P-256 曲线,并且成功地用于与卡的加密通信。公钥创建成功。

我现在的头发似乎比两天前少了。任何指针都会受到欢迎。

c# signing elliptic-curve javacard

5
推荐指数
1
解决办法
258
查看次数

瞬态内存中的 Java Card 对象实例

我正在开发一个 Java Card 小程序(用于 Java Card 2.2.1),它需要一些临时对象来处理 APDU 命令。我对正确的内存管理有疑问。我花了很多时间研究这些问题,但在某些 Java 卡 API 上没有找到任何说明或好的示例代码。我有两个主要问题:

  1. 如何创建一个瞬态对象数组(我的意思是 RAM 中的自定义对象而不是 EEPROM)。我已经读过,makeTransientObjectArray但它只返回 Object 类型的数组。例如,我知道如何使用 来创建瞬态字节数组makeTransientByteArray,但我的问题是关于对象实例的瞬态数组。或者可以用java语言以任何方式将字节数组转换为没有序列化的实例?

  2. 我只在传入 APDU 命令的过程中需要这个临时对象数组,而不需要保留为我分配的内存。分配这个临时内存的最佳位置在哪里(在install, select, process, ... 函数内)?

编辑以获取更多解释:

  1. 正如我已经从文档中读到的,任何对象实例都存储在 EEPROM 中。假设我知道在我的过程算法中需要的最大对象数(比如 100)。我在 install 方法中生成了 100 个 MyClass 实例。MyClass 的每个实例包含 3 个字段:field1 是一个短类型,field2 是一个字节,field3 是一个短类型。所有这 100 个实例都将通过输入 APDU 命令来填充。如果对于每个命令,我都在 EEPROM 上填充对象,这不是一个好习惯,因为它们是临时数据。EEPROM 也有一个最大的写入周期。一种方法可能是,对于每个实例,我使用makeTransientByteArray和为每个对象分配 5 个字节makeTransientShortArray。但正如我从文档中读到的,它按集群(32 字节 - 不确定大小)分配内存,这是无效的。那么在这种情况下我必须做什么?

  2. 我的意思是如何处理瞬态记忆。如果在安装函数内部分配临时内存,则其他小程序将无法使用它。如果小程序是卡上唯一的小程序,则在install函数中分配所有瞬态内存是一种很好的做法。我想知道一种适用于所有条件(单小程序设备或多小程序设备)的通用有效方法。此外,我不确定,如果在内部分配了瞬态内存install,只要将卡插入读卡器,就可以在进程函数内部使用。

java smartcard javacard

5
推荐指数
1
解决办法
1130
查看次数

我可以使用 Java Applets 对 eSIM/eUICC 设备进行编程吗

根据我对嵌入式 SIM (eSIM) 技术的研究,它是消费者拥有的 SIM 卡,能够下载和在 3rd 方订阅之间切换。我还读到,预计大多数 eSIM 将运行 Java 运行时并支持 Java 小程序 [1]。

是否可以将 Java 小程序编程到 eSIM 上,类似于对 Java 智能卡进行编程?

[1]“EUICC45”,https: //www.gsma.com/newsroom/wp-content/uploads/SGP.21_v2.1.pdf

mobile smartcard javacard sim-card lte

5
推荐指数
1
解决办法
752
查看次数