gpt4 book ai didi

android - ISO 7816-4 APDU 命令选择文件和写入记录

转载 作者:太空宇宙 更新时间:2023-11-03 12:54:35 25 4
gpt4 key购买 nike

我正在尝试使用 ISO 7816-4 命令在 Android 上的 PN532 和 HCE 之间进行通信,我成功地选择了 AID(一个 DF),但是当我选择该 DF 下的 EF 时(那个 EF 不存在,所以我假定 Select 命令将创建该 EF),然后将记录写入该 EF 但它显示如下:

inList passive target
write: 4A 1 0
read: 4B 1 1 0 4 60 4 8 23 5A 4D 5 75 80 70 2
write: 40 1 0 A4 4 0 7 F0 1 2 3 4 5 6 0
read: 41 0 48 65 6C 6C 6F 20 44 65 73 6B 74 6F 70 21

Successfully hehe

48 65 6C 6C 6F 20 44 65 73 6B 74 6F 70 21 Hello Desktop!
write: 40 1 0 A4 2 C 1 1 0
read: 41 0 48 65 6C 6C 6F 20 44 65 73 6B 74 6F 70 21
Not enough space
write: 40 1 0 D2 0 0 7 42 41 4F 47 49 41 40 0
read: 41 0 4D 65 73 73 61 67 65 20 66 72 6F 6D 20 61 6E 64 72 6F 69 64 3A 20 30
Not enough space
write: 40 1 0 D2 0 2 4 44 4F 41 4E 0
read: 41 0 4D 65 73 73 61 67 65 20 66 72 6F 6D 20 61 6E 64 72 6F 69 64 3A 20 31
Not enough space
write: 40 1 0 B2 0 0 7 42 41 4F 47 49
read: 41 0 4D 65 73 73 61 67 65 20 66 72 6F 6D 20 61 6E 64 72 6F 69 64 3A 20 32
Not enough space
write: 40 1 0 B2 0 2 4 44 4F 41 4E 0
read: 41 0 4D 65 73 73 61 67 65 20 66 72 6F 6D 20 61 6E 64 72 6F 69 64 3A 20 33
Not enough space

我不知道我在这里做错了什么?

在 Android 上,日志是:

04-15 09:36:54.024: D/HostEmulationManager(929): notifyHostEmulationData
04-15 09:36:54.024: W/System.err(17710): [B@41ed5970
04-15 09:36:54.024: I/HCEDEMO(17710): Received: ???????BAOGI
04-15 09:36:54.024: D/HostEmulationManager(929): Sending data
04-15 09:36:54.164: D/BrcmNfcJni(929): RoutingManager::stackCallback: event=0x17
04-15 09:36:54.164: D/BrcmNfcJni(929): RoutingManager::stackCallback: NFA_CE_DATA_EVT; h=0x302; data len=10
04-15 09:36:54.164: D/HostEmulationManager(929): notifyHostEmulationData
04-15 09:36:54.164: W/System.err(17710): [B@41ed5e20
04-15 09:36:54.164: I/HCEDEMO(17710): Received: ?????DOAN??
04-15 09:36:54.174: D/HostEmulationManager(929): Sending data
04-15 09:36:54.885: D/BrcmNfcJni(929): RoutingManager::stackCallback: event=0x19
04-15 09:36:54.885: D/HostEmulationManager(929): notifyHostEmulationDeactivated
04-15 09:36:54.885: I/HCEDEMO(17710): Deactivated: 0
04-15 09:36:54.885: D/HostEmulationManager(929): Unbinding from service ComponentInfo{de.grundid.hcedemo/de.grundid.hcedemo.MyHostApduService}
04-15 09:36:54.895: E/BrcmNfcNfa(929): UICC[0x0] is not activated

显示可以接收到一些数据,但是漏掉了一些我想传的元素,但是,从PN532,我用read records的时候,没有显示这些数据?

最佳答案

Android HCE 模拟智能卡应用程序理解和处理的命令完全取决于您(只要它们被格式化为有效的 ISO 7816-4 APDU)。

在您的情况下,您的 Android HCE 服务显然处理 SELECT(按 DF 名称)APDU,

00 A4 04 00 07 F0010203040506 00

并将此作为回应:

48 65 6C 6C 6F 20 44 65 73 6B 74 6F 70 21 ("Hello Desktop!" when interpreted as ASCII)

(请注意,根据 ISO 7816-4,此响应不是有效的响应 APDU,因为它缺少状态字。)

您发送的下一个命令是无效的 SELECT(通过 EF)命令:

00 A4 02 0C 01 01 00

对于该命令,如果遵循 ISO 7816-4,Lc 应为 2,EF 标识符应由两个字节组成。作为回应,您的 Android HCE 服务再次发送

48 65 6C 6C 6F 20 44 65 73 6B 74 6F 70 21 ("Hello Desktop!" when interpreted as ASCII)

(请注意,根据 ISO 7816-4,此响应不是有效的响应 APDU,因为它缺少状态字。)

所以我猜,您的 Android HCE 服务会执行如下检查:

public byte[] processCommandApdu(byte[] apdu, Bundle extras) {
if (apdu[1] == (byte)0xA4) {
return "Hello Desktop!".getBytes("US-ASCII");
}
}

您发送的下一个命令是格式错误的 WRITE RECORD 命令,它试图在当前选择的文件的第一条记录中写入“BAOGIA@”(格式错误,因为 WRITE RECORD 命令通常没有 Le 字段):

00 D2 00 00 07 42 41 4F 47 49 41 40 00

作为您的 Android HCE 服务发送的响应:

4D 65 73 73 61 67 65 20 66 72 6F 6D 20 61 6E 64 72 6F 69 64 3A 20 30 ("Message from android: 0" when interpreted as ASCII)

(请注意,根据 ISO 7816-4,此响应再次不是有效的响应 APDU,因为它缺少状态字。)

然后您使用不同的记录负载重复 WRITE RECORD 命令,然后发送两个格式错误的 READ RECORD 命令:

00 D2 00 02 04 44 4F 41 4E 00
00 B2 00 00 07 42 41 4F 47 49
00 B2 00 02 04 44 4F 41 4E 00

作为您的 Android HCE 服务发送的响应:

4D 65 73 73 61 67 65 20 66 72 6F 6D 20 61 6E 64 72 6F 69 64 3A 20 xx ("Message from android: X" when interpreted as ASCII)

其中 xx 似乎是一个 ASCII 数字 X,每个接收到的命令都会递增。

所以我猜,您的 Android HCE 服务看起来像这样:

private int mCommandCounter = 0;
public byte[] processCommandApdu(byte[] apdu, Bundle extras) {
String response;
if (apdu[1] == (byte)0xA4) {
response = "Hello Desktop!";
} else {
response = "Message from android: " + Integer.toString(mCommandCounter);
++mCommandCounter;
}
return response.getBytes("US-ASCII");
}

因此,总而言之,您的 Android HCE 服务将理解和处理(或开发它的任何人)实现的那些命令。因此,您可以向 HCE 设备发送哪些命令取决于您。它背后没有文件系统。 ISO 7816-4 仅建议智能卡应用程序的文件系统布局。

关于android - ISO 7816-4 APDU 命令选择文件和写入记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23072215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com