如何从智能卡获取CPLC数据?

Jos*_*eam 3 ubuntu nfc javacard globalplatform gpshell

我在带有智能卡读卡器的Ubuntu VM上使用GPShell(型号为ACR122),我正在使用几种不同的恩智浦SmartMX芯片.

使用他们的Android TagInfo应用程序,当我扫描一个特定的SmartMX芯片时,我能够看到"卡片生产生命周期数据".

但是,我想使用GPShell来获取CPLC数据.我认为它是可访问的,因为我可以在Android设备上扫描标签时看到它.

我有一个名为的程序connect.txt,它有以下内容:

mode_211
enable_trace
establish_context
card_connect
get_data -identifier 9F7F
card_disconnect
release_context
Run Code Online (Sandbox Code Playgroud)

这是输出:

josh@josh-VirtualBox:~/projects/gpshell-test$ gpshell connect.txt
mode_211
enable_trace
establish_context
card_connect
* reader name ACS ACR122U PICC Interface 00 00
get_data -identifier 9F7F
Command --> 80CA9F7F00
Wrapped command --> 80CA9F7F00
Response <-- 
get_data() returns 0x80200000 (Unknown ISO7816 error: 0x0000)
Run Code Online (Sandbox Code Playgroud)

我正在尝试按照上面的命令()的GPShell文档,get_data -identifier 9F7F这应该是获取CPLC数据的命令.

我如何获得CPLC数据?

至于调试,我尝试了一些GPShell附带的示例脚本(例如,选择某个AID,或列出AID,尝试使用默认密钥进行身份验证等).所有命令都给我与上面相同的输出.我也搜索gpshellStackOverflow并阅读大多数问题/答案,但它们似乎都没有覆盖我在这里要求的内容(如果需要,我可以提供链接).谢谢.

Jos*_*eam 5

简短回答:我必须首先选择一个应用程序,然后在发送GET DATA命令之前使用默认密钥进行身份验证.

我最终安装了GlobalPlatformPro,这是另一个从智能卡获取数据的命令行工具.

我曾经gp -list -d列出了卡上的所有AID(-d调试显示正在发送的APDU).事实证明,该卡正在使用默认密钥404142434445464748494a4b4c4d4e4f(位于安全通道密钥标题下的gpshell文档中).

它输出几个应用程序.我最终需要使用的AID(在尝试了几个之后)是:

ISD: A000000151000000 (OP_READY)
     Privs:   SecurityDomain, CardLock, CardTerminate, CardReset, CVMManagement
Run Code Online (Sandbox Code Playgroud)

我将connect.txt程序改为:

mode_211
enable_trace
establish_context
card_connect
select -AID A000000151000000
open_sc -security 1 -keyind 0 -keyver 0 -mac_key 404142434445464748494a4b4c4d4e4f -enc_key 404142434445464748494a4b4c4d4e4f 
get_data -identifier 9f7f
card_disconnect
release_context
Run Code Online (Sandbox Code Playgroud)

最终输出(使用GPShell):

josh@josh-VirtualBox:~/projects/gpshell-test$ gpshell connect.txt
mode_211
enable_trace
establish_context
card_connect
* reader name ACS ACR122U PICC Interface 00 00
select -AID A000000151000000
Command --> 00A4040008A000000151000000
Wrapped command --> 00A4040008A000000151000000
Response <-- 6F648408A000000151000000A5589F6501FF9F6E06479120813B00734906072A864886FC6B01600B06092A864886FC6B020202630906072A864886FC6B03640B06092A864886FC6B040255650B06092B8510864864020103660C060A2B060104012A026E01029000
open_sc -security 1 -keyind 0 -keyver 0 -mac_key 404142434445464748494a4b4c4d4e4f -enc_key 404142434445464748494a4b4c4d4e4f 
Command --> 80CA006600
Wrapped command --> 80CA006600
Response <-- 664B734906072A864886FC6B01600B06092A864886FC6B020202630906072A864886FC6B03640B06092A864886FC6B040255650B06092B8510864864020103660C060A2B060104012A026E01029000
Command --> 80500000082F7E9B47AA9F32E400
Wrapped command --> 80500000082F7E9B47AA9F32E400
Response <-- 0000518900148698000501020008402AF999F42B742FD206C0ECDA169000
Command --> 8482010010DF9FA8285DE2C6747D14AD51EFF92D3C
Wrapped command --> 8482010010DF9FA8285DE2C6747D14AD51EFF92D3C
Response <-- 9000
get_data -identifier 9f7f
Command --> 80CA9F7F00
Wrapped command --> 84CA9F7F08EEAA80A1B0DB13D500
Response <-- REDACTED-CPLC-DATA
REDACTED-CPLC-DATA
card_disconnect
Run Code Online (Sandbox Code Playgroud)

我关心的响应是输出的最后一行,即CPLC数据(编辑).您可以从第128行开始查看globalplatform.h,了解如何解析CPLC:

/**
 * Whole CPLC data from ROM and EEPROM.
 * 9F7F // TAG
 * 2A // Length of data
 * ////////////////Data /////////////
 * 4250 // ic fabricator
 * 3272 // ic type
 * 1291 // os id
 * 6181 // os date
 * 0700 // os level
 * 8039 // fabrication date
 * 0106D0BB // ic serial
 * 1D3C // ic batch
 * 0000 // module fabricator
 * 8148 // packing date
 * 0000// icc manufacturer
 * 8148 // ic embedding date
 * 0000 // pre - personalizer
 * 0000 // IC Pre Personalization Date
 * 00000000 //IC Pre Personalization Equipment Identifier
 * 0000// IC Personalizer
 * 0000 // IC Personalization Date
 * 00000000 // IC Personalization Equipment Identifier
 */
Run Code Online (Sandbox Code Playgroud)

  • 好功夫.您选择的AID是颁发者安全域(ISD),有时也称为卡管理器.这是管理和处理所有Global Platform命令的最顶级applet.实际上,您只能列出所有已安装的AID,因为ISD使用的是默认密钥,因为只有ISD才能列出所有已安装的applet. (3认同)