如何从智能卡获取 CPLC 数据?
How do I get CPLC data from a smart card?
我在带有智能卡 reader 的 Ubuntu VM 上使用 GPShell(型号为 ACR122)并且我使用了几种不同的 NXP SmartMX 芯片。
使用他们的 Android TagInfo app,当我扫描一个特定的 SmartMX 芯片时,我能够看到 "Card Production Lifecycle Data"。
不过,我也想使用 GPSshell 来获取 CPLC 数据。我认为它是可访问的,因为当我扫描 Android 设备上的标签时我可以看到它。
我有一个名为 connect.txt
的程序,它的内容是这样的:
mode_211
enable_trace
establish_context
card_connect
get_data -identifier 9F7F
card_disconnect
release_context
这是输出:
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)
我正在尝试按照 GPShell docs 执行上述命令 (get_data -identifier 9F7F
),这应该是获取 CPLC 数据的命令。
如何获取CPLC数据?
至于调试,我尝试了一些 GPSshell 附带的示例脚本(例如,选择某个 AID,或列出 AID,尝试使用默认密钥进行身份验证等)。所有命令都给我与上面相同的输出。我还在 Whosebug 上搜索 gpshell
并阅读了大部分 questions/answers,但其中 none 似乎涵盖了我在这里要问的内容(如果需要,我可以提供链接)。谢谢。
简短回答:我必须先 select 一个应用程序,然后在发送 GET DATA
命令之前使用默认密钥进行身份验证。
我最终安装了 GlobalPlatformPro,这是另一个从智能卡获取数据的命令行工具。
我使用 gp -list -d
列出卡上的所有 AID(-d
用于调试以显示正在发送的 APDU)。事实证明该卡正在使用默认密钥 404142434445464748494a4b4c4d4e4f
(在标题 安全通道密钥 .
下的 gpshell docs 中找到
它输出了几个应用程序。我最终需要使用的 AID(在尝试了其中的几个之后)是:
ISD: A000000151000000 (OP_READY)
Privs: SecurityDomain, CardLock, CardTerminate, CardReset, CVMManagement
我将 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
最终输出(使用 GPSshell):
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
我关心的响应是输出的最后一行,即 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
*/
使用 GlobalPlatformPro 的简单 gp -i
将为您提供 human-readable 形式的 CPLC。
我在带有智能卡 reader 的 Ubuntu VM 上使用 GPShell(型号为 ACR122)并且我使用了几种不同的 NXP SmartMX 芯片。
使用他们的 Android TagInfo app,当我扫描一个特定的 SmartMX 芯片时,我能够看到 "Card Production Lifecycle Data"。
不过,我也想使用 GPSshell 来获取 CPLC 数据。我认为它是可访问的,因为当我扫描 Android 设备上的标签时我可以看到它。
我有一个名为 connect.txt
的程序,它的内容是这样的:
mode_211
enable_trace
establish_context
card_connect
get_data -identifier 9F7F
card_disconnect
release_context
这是输出:
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)
我正在尝试按照 GPShell docs 执行上述命令 (get_data -identifier 9F7F
),这应该是获取 CPLC 数据的命令。
如何获取CPLC数据?
至于调试,我尝试了一些 GPSshell 附带的示例脚本(例如,选择某个 AID,或列出 AID,尝试使用默认密钥进行身份验证等)。所有命令都给我与上面相同的输出。我还在 Whosebug 上搜索 gpshell
并阅读了大部分 questions/answers,但其中 none 似乎涵盖了我在这里要问的内容(如果需要,我可以提供链接)。谢谢。
简短回答:我必须先 select 一个应用程序,然后在发送 GET DATA
命令之前使用默认密钥进行身份验证。
我最终安装了 GlobalPlatformPro,这是另一个从智能卡获取数据的命令行工具。
我使用 gp -list -d
列出卡上的所有 AID(-d
用于调试以显示正在发送的 APDU)。事实证明该卡正在使用默认密钥 404142434445464748494a4b4c4d4e4f
(在标题 安全通道密钥 .
它输出了几个应用程序。我最终需要使用的 AID(在尝试了其中的几个之后)是:
ISD: A000000151000000 (OP_READY)
Privs: SecurityDomain, CardLock, CardTerminate, CardReset, CVMManagement
我将 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
最终输出(使用 GPSshell):
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
我关心的响应是输出的最后一行,即 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
*/
使用 GlobalPlatformPro 的简单 gp -i
将为您提供 human-readable 形式的 CPLC。