使用Global Platform Pro可选择小程序却无法执行指令的问题
问题
我有一个AID为23 03 20 00 00 00的小程序,使用Global Platform Pro(GPP)时可以选中它,但无法运行任何代码。而使用PyAPDU时,我能够正常选择该小程序并执行代码/指令,这表明问题出在GPP的使用方式而非小程序本身。
我执行的步骤:
- 使用命令
gp --install AppletName.cap将小程序安装到卡片上 - 使用命令
gp --apdu 00 A4 04 00 06 23 03 20 00 00 00 --debug选择小程序 - 收到响应
90 00 - 尝试使用命令
gp --apdu 00 14 00 00 --debug执行指令(我的INS字节为11、12、14、15) - 收到响应:
6D 00(无效INS) - 尝试所有其他INS字节,结果相同。
PyAPDU 日志
Connect successful. Send: 00 A4 04 00 06 23 02 20 00 00 00 Recv: 90 00 Time used: 43.000 ms Send: 00 14 00 00 Recv: 90 00 Time used: 3606.000 ms Send: 00 15 00 00 41 Recv: 04 31 A3 4A 4E 32 53 46 73 7F E4 53 40 9C 87 5E 04 BD A0 B6 99 98 45 86 63 5E 29 4B 47 EC 58 08 FD C7 AB 80 8F 3A 1D 46 89 C3 EB D4 C3 6A 9C C6 E6 58 B0 91 FE 16 1C CA 56 B7 C9 D2 DE D1 3D C5 C5 90 00 Time used: 339.000 ms
Global Platform Pro 日志
C:\File Location>gp --apdu 00A4040006230220000000 --debug GlobalPlatformPro v20.01.23-0-g5ad373b Running on Windows 7 6.1 amd64, Java 1.8.0_191 by Oracle Corporation # Detected readers from JNA2PCSC [*] Alcor Micro USB Smart Card Reader 0 [ ] JAVACOS Virtual Contact Reader 0 [ ] JAVACOS Virtual Contactless Reader 1 SCardConnect("Alcor Micro USB Smart Card Reader 0", T=*) -> T=0, 3B69000241434F5 34A76313031 SCardBeginTransaction("Alcor Micro USB Smart Card Reader 0") A>> T=0 (4+0006) 00A40400 06 230220000000 A<< (0000+2) (42ms) 9000 A>> T=0 (4+0000) 00A40400 00 A<< (0094+2) (167ms) 6F5C8408A000000151000000A550734A06072A864886FC6B01600C060A2 A864886FC6B02020201630906072A864886FC6B03640B06092A864886FC6B040255650B06092A864 886FC6B020103660C060A2B060104012A026E01039F6501FF 9000 [TRACE] GPSession - [6F] [TRACE] GPSession - [84] A000000151000000 [TRACE] GPSession - [A5] [TRACE] GPSession - [73] [TRACE] GPSession - [06] 2A864886FC6B01 [TRACE] GPSession - [60] [TRACE] GPSession - [06] 2A864886FC6B02020201 [TRACE] GPSession - [63] [TRACE] GPSession - [06] 2A864886FC6B03 [TRACE] GPSession - [64] [TRACE] GPSession - [06] 2A864886FC6B040255 [TRACE] GPSession - [65] [TRACE] GPSession - [06] 2A864886FC6B020103 [TRACE] GPSession - [66] [TRACE] GPSession - [06] 2B060104012A026E0103 [TRACE] GPSession - [9F65] FF [DEBUG] GPSession - Auto-detected ISD: A000000151000000 SCardEndTransaction("Alcor Micro USB Smart Card Reader 0") SCardDisconnect("Alcor Micro USB Smart Card Reader 0", true) tx:16/rx:98 C:\File Location>gp --apdu 00140000 --debug GlobalPlatformPro v20.01.23-0-g5ad373b Running on Windows 7 6.1 amd64, Java 1.8.0_191 by Oracle Corporation # Detected readers from JNA2PCSC [*] Alcor Micro USB Smart Card Reader 0 [ ] JAVACOS Virtual Contact Reader 0 [ ] JAVACOS Virtual Contactless Reader 1 SCardConnect("Alcor Micro USB Smart Card Reader 0", T=*) -> T=0, 3B69000241434F5 34A76313031 SCardBeginTransaction("Alcor Micro USB Smart Card Reader 0") A>> T=0 (4+0000) 00140000 A<< (0000+2) (25ms) 6D00 A>> T=0 (4+0000) 00A40400 00 A<< (0094+2) (172ms) 6F5C8408A000000151000000A550734A06072A864886FC6B01600C060A2 A864886FC6B02020201630906072A864886FC6B03640B06092A864886FC6B040255650B06092A864 886FC6B020103660C060A2B060104012A026E01039F6501FF 9000 [TRACE] GPSession - [6F] [TRACE] GPSession - [84] A000000151000000 [TRACE] GPSession - [A5] [TRACE] GPSession - [73] [TRACE] GPSession - [06] 2A864886FC6B01 [TRACE] GPSession - [60] [TRACE] GPSession - [06] 2A864886FC6B02020201 [TRACE] GPSession - [63] [TRACE] GPSession - [06] 2A864886FC6B03 [TRACE] GPSession - [64] [TRACE] GPSession - [06] 2A864886FC6B040255 [TRACE] GPSession - [65] [TRACE] GPSession - [06] 2A864886FC6B020103 [TRACE] GPSession - [66] [TRACE] GPSession - [06] 2B060104012A026E0103 [TRACE] GPSession - [9F65] FF [DEBUG] GPSession - Auto-detected ISD: A000000151000000 SCardEndTransaction("Alcor Micro USB Smart Card Reader 0") SCardDisconnect("Alcor Micro USB Smart Card Reader 0", true) tx:9/rx:98
使用这些完全相同的APDU在PyAPDU中可以正常工作,请问我哪里操作错误了?
解答
问题出在Global Platform Pro的--apdu参数工作机制上:每次执行gp --apdu命令都是一个独立的卡片会话。
你执行选择小程序的APDU命令时,确实成功选中了目标小程序,但会话结束后卡片会自动回到默认选中ISD(发行安全域)的状态。当你单独执行业务指令的APDU命令时,这条指令是直接发给ISD的,而ISD并不识别你的小程序定义的INS字节(11、12、14、15),所以返回6D00(无效指令)。
而PyAPDU是在同一个会话中连续执行APDU指令:连接卡片后先选中小程序,接着直接发送业务指令,全程保持会话,所以能正常执行。
解决方法:把选择小程序和执行指令的APDU放在同一个--apdu命令里,用分号分隔,这样GPP会在同一个会话中依次执行这些APDU:
gp --apdu "00 A4 04 00 06 23 03 20 00 00 00;00 14 00 00" --debug
如果需要执行多个指令,继续用分号追加即可,比如:
gp --apdu "00 A4 04 00 06 23 03 20 00 00 00;00 14 00 00;00 15 00 00 41" --debug
内容的提问来源于stack exchange,提问作者LozCodes
相关产品推荐
相关产品推荐

