【问题标题】:Loading applets to a real Java Card将小程序加载到真正的 Java 卡
【发布时间】:2015-05-25 00:22:55
【问题描述】:

我正在尝试开发 Java Card 应用程序。我正在使用最新的 Eclipse 4.4.2、Java Card SDK 2.2.2 和 Eclipse Java Card Development Environment (EclipseJCDE)。以前我成功使用了 JCWDE Java Card Emulator 和 APDU Tool。我使用的是我在本教程中找到的一个非常基本的小程序(youtube:教程 1 Java Card Master SID ENSET 20 01 14),它运行完美。我想做的是将这个小程序部署到真正的 Java Card(全新的Gemalto IDCore 3010),但到目前为止我还没有成功。

我还发现了这个关于在真实卡上部署小程序的聪明而简单的教程(youtube:开发 Java Card JCOP 硬件教程 w/Python),但它对我不起作用。创建一个非常基本的小程序后,它使用所谓的Global Platform Pro 命令行界面——确实非常方便——加载和管理小程序。遗憾的是,我在第一个命令之后就失败了,这将转储智能卡的 ATR(gp -i 命令)。这是使用 -d -v -i 开关重新运行命令后收到的错误消息:

C:\JavaCard\GP>gp -d -v -i
# Detected readers from SunPCSC
[*] OMNIKEY AG Smart Card Reader USB 0
SCardConnect("OMNIKEY AG Smart Card Reader USB 0", T=*) -> T=0, 3B7D960000803180
65B0831111AC83009000
SCardBeginTransaction("OMNIKEY AG Smart Card Reader USB 0")
Reader: OMNIKEY AG Smart Card Reader USB 0
ATR: 3B7D96000080318065B0831111AC83009000
More information about your card:
    http://smartcard-atr.appspot.com/parse?ATR=3B7D96000080318065B0831111AC83009
000

A>> T=0 (4+0000) 00A40400 00
A<< (0027+2) (646ms) 6F198408A000000018434D00A50D9F6E061291518101009F6501FF 9000

Auto-detected ISD AID: A000000018434D00
***** Card info:
A>> T=0 (4+0000) 80CA9F7F 00
A<< (0045+2) (12ms) 9F7F2A40705072129151810100927100004DCDC6C0033201190333011903
340119000000610000000000000000 9000
Card CPLC:
ICFabricator: 4070
ICType: 5072
OperatingSystemID: 1291
OperatingSystemReleaseDate: 5181
OperatingSystemReleaseLevel: 0100
ICFabricationDate: 9271
ICSerialNumber: 00004DCD
ICBatchIdentifier: C6C0
ICModuleFabricator: 0332
ICModulePackagingDate: 0119
ICCManufacturer: 0333
ICEmbeddingDate: 0119
ICPrePersonalizer: 0334
ICPrePersonalizationEquipmentDate: 0119
ICPrePersonalizationEquipmentID: 00000061
ICPersonalizer: 0000
ICPersonalizationDate: 0000
ICPersonalizationEquipmentID: 00000000
***** CARD DATA
A>> T=0 (4+0000) 80CA0066 00
A<< (0000+2) (5ms) 6A88
NO CARD DATA
***** KEY INFO
A>> T=0 (4+0000) 80CA00E0 00
A<< (0020+2) (11ms) E012C00401FF8110C00402FF8110C00403FF8110 9000
SCardEndTransaction()
SCardDisconnect("OMNIKEY AG Smart Card Reader USB 0", false)
Exception in thread "main" java.lang.RuntimeException: pro.javacard.gp.GPKeySet$
GPKey currently only support DES and AES keys
        at pro.javacard.gp.GPKeySet$GPKey.<init>(GPKeySet.java:80)
        at pro.javacard.gp.GPData.get_key_template_list(GPData.java:145)
        at pro.javacard.gp.GlobalPlatform.getKeyInfoTemplate(GlobalPlatform.java
:268)
        at pro.javacard.gp.GPData.print_card_info(GPData.java:260)
        at pro.javacard.gp.GPTool.main(GPTool.java:339)

另一个列出卡上内容的命令会返回更糟糕的错误消息:

pro.javacard.gp.GPException: STRICT WARNING: Card cryptogram invalid!
Card: 6B7F3BA2EF7DFC99
Host: 0FCFF9EDF25027BA
!!! DO NOT RE-TRY THE SAME COMMAND/KEYS OR YOU MAY BRICK YOUR CARD !!!
        at pro.javacard.gp.GlobalPlatform.printStrictWarning(GlobalPlatform.java
:184)
        at pro.javacard.gp.GlobalPlatform.openSecureChannel(GlobalPlatform.java:
513)
        at pro.javacard.gp.GPTool.main(GPTool.java:371)

由于这个 Global Platform Pro 无法正常工作,我尝试使用不太易于管理的标准 Global Platform Interface (sourceforge: GPShell),但没有任何运气。即使我尝试运行他们最初提供的示例脚本,我也收到了相同的错误消息。例如,运行 GPSShell.exe list.txt(将列出卡上的小程序)后,我得到的输出是找不到要选择的应用程序,我不明白。

我在这里复制源代码以防万一,但这不应该是问题,因为它与模拟器一起工作:

package jctest;

import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISO7816;
import javacard.framework.ISOException;

public class JCTest extends Applet {

    private byte counter = 0;
    private final static byte CLS = (byte) 0xB0;
    private final static byte INC = (byte) 0x00;
    private final static byte DEC = (byte) 0x01;
    private final static byte GET = (byte) 0x02;
    private final static byte INIT = (byte) 0x03;

    private JCTest() {
    }

    public static void install(byte bArray[], short bOffset, byte bLength) throws ISOException {
        new JCTest().register();
    }

    public void process(APDU apdu) throws ISOException {
        if (this.selectingApplet())
            return;
        byte[] buffer = apdu.getBuffer();
        if (buffer[ISO7816.OFFSET_CLA] != CLS)
            ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
        switch (buffer[ISO7816.OFFSET_INS]) {
        case INC:
            ++counter;
            break;
        case DEC:
            --counter;
            break;
        case GET:
            buffer[0] = counter;
            apdu.setOutgoingAndSend((short) 0, (short) 1);
            break;
        case INIT:
            apdu.setIncomingAndReceive();
            counter = buffer[ISO7816.OFFSET_CDATA];
            break;
        }
    }
}

经过多天的尝试,我有点绝望,我无法让我全新的 Java Card 工作。当我将卡插入读卡器时,计算机只能识别,而不是卡本身,因为它没有找到驱动程序(我也找不到驱动程序,但我认为让事情正常工作并不重要) .这个任务应该很简单,我只想在真正的 Java Card 上使用一个已经工作的小程序。怎么了?我错过了什么?

最终成功运行 gp -i 命令后,我得到的命令输出如下:gp -visa2 -key 47454D5850524553534F53414D504C45 -unlock -virgin -d -v

C:\JavaCard\GP>gp -visa2 -key 47454D5850524553534F53414D504C45 -unlock -virgin -
d -v
# Detected readers from SunPCSC
[*] OMNIKEY CardMan 3x21 0
SCardConnect("OMNIKEY CardMan 3x21 0", T=*) -> T=0, 3B7D96000080318065B0831111AC
83009000
SCardBeginTransaction("OMNIKEY CardMan 3x21 0")
Reader: OMNIKEY CardMan 3x21 0
ATR: 3B7D96000080318065B0831111AC83009000
More information about your card:
    http://smartcard-atr.appspot.com/parse?ATR=3B7D96000080318065B0831111AC83009
000

A>> T=0 (4+0000) 00A40400 00
A<< (0027+2) (645ms) 6F198408A000000018434D00A50D9F6E061291518101009F6501FF 9000

Auto-detected ISD AID: A000000018434D00
A>> T=0 (4+0008) 80500000 08 0681B19093C4A93B 00
A<< (0028+2) (72ms) 4D00927100004DD4C6C0FF01E87D06549F536080A8D1AB091B6BBE07 900
0
Host challenge: 0681B19093C4A93B
Card challenge: E87D06549F536080
Card reports SCP01 with version 255 keys
Master keys:
Version 0
ENC: Ver:0 ID:0 Type:DES3 Len:16 Value:47454D5850524553534F53414D504C45
MAC: Ver:0 ID:0 Type:DES3 Len:16 Value:47454D5850524553534F53414D504C45
KEK: Ver:0 ID:0 Type:DES3 Len:16 Value:47454D5850524553534F53414D504C45
Diversififed master keys:
Version 0
ENC: Ver:0 ID:0 Type:DES3 Len:16 Value:5B9387DE5E618B12760EBE6037B077AC
MAC: Ver:0 ID:0 Type:DES3 Len:16 Value:5454366589B6AE522F58EE7072C101DF
KEK: Ver:0 ID:0 Type:DES3 Len:16 Value:72590E8782F97E80406E4B66199B7CB2
Derived session keys:
Version 0
ENC: Ver:0 ID:0 Type:DES3 Len:16 Value:87B5171538F81656E88F60D4818CEB8A
MAC: Ver:0 ID:0 Type:DES3 Len:16 Value:E9E45A4046E1316200E9E1787A7E9CD0
KEK: Ver:0 ID:0 Type:DES3 Len:16 Value:72590E8782F97E80406E4B66199B7CB2
Verified card cryptogram: A8D1AB091B6BBE07
Calculated host cryptogram: 8E1CE84781FA24C3
A>> T=0 (4+0016) 84820100 10 8E1CE84781FA24C34BEFC7F70A76E60F
A<< (0000+2) (36ms) 9000
A>> T=0 (4+0008) 84CA00E0 08 E59D6ECDF1B764ED 00
A<< (0020+2) (13ms) E012C00401FF8110C00402FF8110C00403FF8110 9000
Replace: false
PUT KEY:Ver:1 ID:1 Type:DES3 Len:16 Value:404142434445464748494A4B4C4D4E4F
PUT KEY:Ver:1 ID:2 Type:DES3 Len:16 Value:404142434445464748494A4B4C4D4E4F
PUT KEY:Ver:1 ID:3 Type:DES3 Len:16 Value:404142434445464748494A4B4C4D4E4F
A>> T=0 (4+0008) 84CA00E0 08 2B4AD25011601191 00
A<< (0020+2) (13ms) E012C00401FF8110C00402FF8110C00403FF8110 9000
A>> T=0 (4+0075) 84D80081 4B 0180100F8DB2F2600B53F9002C36CB377D55AF038BAF4780100
F8DB2F2600B53F9002C36CB377D55AF038BAF4780100F8DB2F2600B53F9002C36CB377D55AF038BA
F47B387704000A3A1AA
A<< (0000+2) (49ms) 6A80
pro.javacard.gp.GPException: PUT KEY failed SW: 6A80
        at pro.javacard.gp.GlobalPlatform.check(GlobalPlatform.java:1092)
        at pro.javacard.gp.GlobalPlatform.putKeys(GlobalPlatform.java:993)
        at pro.javacard.gp.GPTool.main(GPTool.java:555)

解决方案:此特定金雅拓卡需要新的 GlobalPlatformPro 版本。

列出卡片上的小程序的命令:

gp -visa2 -key 47454D5850524553534F53414D504C45 -l

【问题讨论】:

  • 你有金雅拓开发者套件吗?
  • @Abraham:我不知道,但我听说 JCardManager 不能使用新的开放平台卡,而且我发现 this thread 说它在 Windows 上不能正常工作7 64位,这是我正在使用的操作系统。

标签: eclipse applet smartcard javacard apdu


【解决方案1】:

相互验证是在智能卡上上传和安装小程序的必要步骤(也用于列出已安装的小程序和软件包)。不同的卡使用不同的加密算法来完成这个相互认证过程。看来您的卡使用了 GlobalPlatformPro 不支持的算法。您必须查看卡的数据表以了解您的卡使用哪种算法。

关于GPShell: 卡上有一个名为“安全域”的实体。该实体负责加载、安装和列出小程序。它有一个 AID,您必须通过 Select APDU 命令选择它。 list.txt 脚本中有一个 AID,您必须将其替换为您卡的 SD 的 AID。
关于司机警报:没关系!当我将卡插入读卡器时,我有相同的弹出警报,但一切正常。

最后,请不要尝试以这种方式测试其他工具!连续10次相互认证失败,使卡被锁定。(不再可用)。

【讨论】:

  • GlobalPlatformPro 错误消息指出 GPKey 目前仅支持 DES 和 AES 密钥。在密码算法部分下的数据表中,您可以找到:对称:3DES(ECB,CBC),AES(128、192、256位),也就是说,它看起来支持AES密钥,所以我还是不明白。至少现在我知道没有卡驱动程序应该没问题。谢谢!
  • @bp14 将gp -i 的输出添加到您的问题可能会帮助观众帮助您。
  • 我用gp -d -v -i 命令的输出更新了问题。
  • @bp14 正如我在gp -i -d -v 的输出中看到的,您卡的ISD 的AID 是A000000018434D00
  • 必须替换list.txt中的上述AID。如果您的阅读器不是双界面阅读器,则无需在脚本中指定它。在连接了两个不同的阅读器或您连接的阅读器是双阅读器并且工具的默认阅读器不是您想要的阅读器的情况下,指定阅读器是必要的。
【解决方案2】:

GlobalPlatformPro README 有一个很好的(隐藏得很好?)提示:

为使用 VISA2 多样化的卡设置默认 40..4F 密钥 使用金雅拓卡上著名的母钥匙:

gp -visa2 -key 47454D5850524553534F53414D504C45 -unlock

但请记住,您需要了解密钥材料。提示仅适用于知名的公开案例。

【讨论】:

  • 我试过了,但很遗憾它不起作用。我收到相同的错误消息,GPKey 目前仅支持 DES 和 AES 密钥...在数据表中明确指出它支持这些:对称:3DES(ECB、CBC)、AES(128、192、256 位),所以我不明白。
  • 当您在软件中看到异常时,自然会提出错误请求。根据 GP 规范,使用的密钥类型 (81) 是保留的,因此需要引入特定于卡的 hack。您的卡是从哪里获得的,是否带有密钥信息?
  • 请从 Git 尝试更新版本的 GPPro。 github.com/martinpaljak/GlobalPlatformPro/commit/…
  • 确实,这是最后一次提交修复的回归(也是金雅拓的一个奇怪之处)。去获取新版本:github.com/martinpaljak/GlobalPlatformPro/releases/tag/v0.3.4
  • 您的卡使用visa2多样化,主密钥(可能)是47454D5850524553534F53414D504C45您不必解锁(更改密钥),您可以轻松继续使用默认的金雅拓主密钥。 gp -visa2 -key 47454D5850524553534F53414D504C45 -l
猜你喜欢
  • 2013-06-23
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 2011-01-05
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多