我通过Eclipse制作了流行的"Hello World"javacard代码的.cap文件
现在我想通过GPShell和ACR38智能卡读卡器将它加载到真正的javacard中.
问题:我需要任何密钥才能在卡中加载.cap文件吗?我的意思是,我应该在将我的小程序上传到卡中之前进行身份验证,还是不是必需的?我认为认证是非常重要的.在没有身份验证的情况下上传.cap是不合理的.但我不知道,如何进行身份验证.问题:这有什么问题?
C:\Users\ghasemi>java -jar e:\gpj\gpj.jar -load e:\helloWorld.cap -install
Found terminals: [PC/SC terminal ACS CCID USB Reader 0]
javax.smartcardio.CardException: connect() failed
at sun.security.smartcardio.TerminalImpl.connect(Unknown Source)
at net.sourceforge.gpj.cardservices.GlobalPlatformService.main(Unknown S
ource)
Caused by: sun.security.smartcardio.PCSCException: SCARD_E_SHARING_VIOLATION
at sun.security.smartcardio.PCSC.SCardConnect(Native Method)
at sun.security.smartcardio.CardImpl.<init>(Unknown Source)
... 2 more
Found card in terminal: ACS CCID USB Reader 0
java.lang.NullPointerException
at net.sourceforge.gpj.cardservices.GlobalPlatformService.main(Unknown S
ource)
C:\Users\ghasemi>java -jar e:\gpj\gpj.jar -load e:\helloWorld.cap -install
Found terminals: [PC/SC terminal ACS CCID USB Reader 0]
Found card in terminal: ACS CCID USB Reader 0 …Run Code Online (Sandbox Code Playgroud) 我的问题是,是否可以从applet本身的代码中锁定applet作为从代码中检测到的操作的对策.
显而易见的选择是使用GPSystem.lockCard();并且它有效,但是我想知道是否可以仅锁定applet.此外,我可以从相关安全域的经过身份验证的会话中锁定applet本身.但它是否可以从applet代码本身.看来,考虑到GPSystem.setCardContentState();使用的方法GPSystem.APPLICATION_LOCKED,所以我也测试了但是它不起作用.
重读GP卡规范说明2.2 PDF:
开放应拒绝任何转换请求从锁定生命周期状态;
在我的Eclipse中,JavaDoc说:
开放应拒绝任何转换请求到的生命周期状态已锁定
这里发生了什么?
我有一张带有以下ATR的智能卡:
ATR = 3B 9E 94 80 1F 42 80 31 00 73 BE 21 10 66 54 59 53 04 4C 25 CF.
根据atr-parse.appspot.com的输出,我发现它是MCI(伊朗移动通信公司)的SIM卡.
这些是我从历史字节获得的信息:
(紧凑型TLV数据对象)
标签:3,Len:1(卡服务数据字节)
卡服务数据字节:0
EF.DIR和EF.ATR访问服务:通过GET RECORD(s)命令
卡与MF
标签:7,Len:3(卡片功能)
选择方法:190
支持记录号码
支持短EF标识符
隐式DF选择
按文件标识符选择DF
通过路径选择DF
DF选择全DF名称
数据编码字节:33
写功能的行为:专有
BER-TLV标记字段的第一个字节的值'FF':有效
四重奏数据单位:1
命令链,长度字段和逻辑通道:16
逻辑频道号码分配:由卡
最大逻辑通道数:1
标签:6,Len:6(发布前数据)
数据:54 59 53 04 4C 25"TYS.L%"
如上所述,提到该卡有一个MF.
问题是我对这张卡无能为力.在第一步中,我想列出其内容.我看了TS 11.11,TS 102.221,TS 131.102和TS 151.011规范.
据我所知,从上面的文件中,卡的系统文件包括Master File其AID 3F00 …
您可能知道,Gloabal Platform Card Specification定义了一个名为Get Data的命令,用于从智能卡中检索一些信息.
GlobalPlatformPro是与智能卡通信的流行工具之一.当我使用此工具列出卡上已安装的小程序时,我有以下输出:
D:\3-TestTools\SmartCard>GP -list -d -v -i
//Useless Info Censored
ATR: 3B6800000073C84012009000
//Select APDU Command
A>> T=0 (4+0000) 00A40400 00
A<< (0018+2) (48ms) 6F108408A000000003000000A5049F6501FF 9000
***** Card info:
A>> T=0 (4+0000) 80CA9F7F 00
A<< (0045+2) (65ms) 9F7F2A4250010C425102902610116000099A5A0AF9425211694253117E00000000000000000000000000000000 9000
Card CPLC:
ICFabricator: 4250
ICType: 010C
OperatingSystemID: 4251
OperatingSystemReleaseDate: 0290
OperatingSystemReleaseLevel: 2610
ICFabricationDate: 1160
ICSerialNumber: 00099A5A
ICBatchIdentifier: 0AF9
ICModuleFabricator: 4252
ICModulePackagingDate: 1169
ICCManufacturer: 4253
ICEmbeddingDate: 117E
ICPrePersonalizer: 0000
ICPrePersonalizationEquipmentDate: 0000
ICPrePersonalizationEquipmentID: …Run Code Online (Sandbox Code Playgroud) 在初始化更新命令的响应字段中,密钥分散数据(其包含制造ID和安全域AID的最后两个字节)被返回到Off Card实体.
我想知道这些数据的用途是什么?
我在某地读到,这个密钥多样化数据用于推断Off Card端的基本密钥.我不知道这是对还是错.
如果它是正确的,那么如何使用这种多样化数据在卡片末端导出基本密钥?
请提供你的建议!!
我开始使用GlobalPlatfrom Card规范,我无法弄清楚GLobalPlatform functinalify如何来到JavaCard.是否有任何小程序应安装到卡中以使此卡与GP兼容?或者在制造期间将GP功能作为JRE扩展提供给卡?或者甚至可以使非GP兼容卡与GP兼容?
我想以一种方式编写我的小程序,使其 APDU 命令和状态字在我的卡和我的读卡器之间的传输通道中不清楚。我的意思是我不想将 APDU 命令和响应发送为第三方的纯文本。
我想我有两个选择:
SELECTAPDU 命令冲突,并且卡的 SDSELECT错误地将其识别为命令。那正确吗?它的图表:

它的图表:

有没有其他办法?
似乎第一个解决方案还不够好,因为:
我对吗?
现在,假设我想确保我的小程序仅适用于使用安全通道传输的 APDU 命令。我想我又有两个选择:
将卡置于SECURED状态。由于用户在这种状态下无法使用纯文本 APDU 命令与卡通信(对吗?),因此他必须使用安全通道将命令发送到我的小程序。对?如果不正确,是否有任何方法可以强制 SD 仅使用安全通道?
将卡保持在它所处的任何生命周期(例如 OP_READY),但相反,在接收任何 APDU 命令时,检查CLA部分以查看它是否是安全传输的!(这可能吗?CLA来自安全通道的部分 APDU 命令和其他命令之间有什么区别吗?我说得对吗?)
有没有其他办法?
最后是主要问题:
如何使用 SD 与我的小程序进行安全通信?因为我认为我必须使用 GlobalPlatform 类(我是吗?),所以我查看了它的 API-s。我getSecureChannel在名为org.globalplatform.GPSystem. 我的方式正确吗?我必须使用这种方法吗?
我知道回答这个问题可能太长了,但我相信它不仅为我,也为其他未来的观众澄清了很多问题。
我很感激任何机构为我解决了这个问题。
一个示例小程序更可观。
当我们在兼容Java卡3.0的卡中运行Web服务器时,我们如何请求该服务器,或者更确切地说我们请求该服务器的IP地址.还有更多的Android应用程序请求并从服务器获得响应,如果是这样我们怎么能这样做?
在成功安装(和删除)同一个小程序两次后,我无法再在我的 Java 卡上安装小程序。
设置涉及:
一般卡信息:
$ 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) 我有一个包含 SSD(补充安全域)的 Javacard,我想删除它。通常,当我想从我的卡中删除小程序或包时,我会在成功的相互验证过程后发送以下DELETE APDU命令(不需要 MAC 或数据字段加密,对于DELETE APDU命令就足够了):Security Level == 0
--> 80 E4 00 00 LC 4F <AID Len> <AID>
<-- 90 00
Run Code Online (Sandbox Code Playgroud)
上面的命令适用于普通小程序。但是当我将我的SSD的AID放入其中时,该卡以69 85个状态字响应,这意味着“不满足使用条件”。.
由于在我的卡中启用了委托管理功能,并且 ISD 中加载了公共令牌密钥和收据密钥,我认为上述错误可能是由于未在DELETE APDU命令中使用删除令牌。所以我计算了删除令牌如下:
DeleteToken = RSA_Sign("00 00 LC 4F <SSD AID Len> <SSD AID>", TokenPrivateKey)
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用以下命令删除 SSD:
--> 80 E4 00 00 <LC+Len(DeleteToken)> 4F <SSD AID Len> <SSD …Run Code Online (Sandbox Code Playgroud)