了解主机卡仿真和 APDU 背后的代码
Understanding the code behind Host Card Emulation and APDUs
我刚刚开始制作一个使用主机卡仿真 (HCE) 的应用程序,并且我已经完成了各种零碎的工作。我需要应用程序让 phone 像卡片一样工作,而另一个 phone 像 NFC reader 一样工作并扫描它,反之亦然,以便交换非常小的信息 - 一个身份证号。
我已经完成了一些功能单元,例如 ProcessCommandApdu 和定义 AID,但我并不真正理解它是如何工作的。
到目前为止,这是我的代码...
@TargetApi(19)
public class MainActivity 扩展了 HostApduService {
@Override
public void onDeactivated(int reason) {
}
@Override
public byte[] processCommandApdu(byte[] commandApdu, Bundle extras) {
String inboundApduDescription;
byte[] responseApdu;
if (Arrays.equals(AID_SELECT_APDU, commandApdu)) {
inboundApduDescription = "Application selected";
Log.i("HCEDEMO", inboundApduDescription);
byte[] answer = new byte[2];
answer[0] = (byte) 0x90;
answer[1] = (byte) 0x00;
responseApdu = answer;
return responseApdu;
}
return commandApdu;
}
private static final byte[] AID_SELECT_APDU = {
(byte) 0x00,
(byte) 0xA4,
(byte) 0x04,
(byte) 0x00,
(byte) 0x07,
(byte) 0xF0, (byte) 0x39, (byte) 0x41, (byte) 0x48, (byte) 0x14, (byte) 0x81, (byte) 0x00,
(byte) 0x00
};
public static void main(String[] args) throws UnsupportedEncodingException {
TerminalFactory terminalFactory = TerminalFactory.getDefault();
try {
for (CardTerminal terminal : terminalFactory.terminals().list()) {
System.out.println(terminal.getName());
try {
Card card = terminal.connect("*");
CardChannel channel = card.getBasicChannel();
System.out.println("SelectAID ");
CommandAPDU command = new CommandAPDU(SelectAID);
ResponseAPDU response = channel.transmit(command);
byte recv[] = response.getBytes();
for (int i = 0; i < recv.length; i++) {
System.out.print(String.format("%02X", recv[i]));
}
System.out.println("");
}
catch (CardException e){}
}
}
catch(CardException e){
}
}
}
public class ReaderActivity {
public static byte[] SelectAID = new byte[]{(byte) 0x00, (byte) 0xA4, (byte) 0x04, (byte) 0x00,
(byte) 0x07,
(byte) 0xF0, (byte) 0x39, (byte) 0x41, (byte) 0x48, (byte) 0x14, (byte) 0x81, (byte) 0x00, (byte)
0x00
};
}
字节代表什么0x00、0xA4 以及如何通过 APDU 传达我自己的信息(ID 号)?
我还需要补充什么吗?
我的代码基于以下教程 https://www.slideshare.net/ChienMingChou/hce-tutorialv-v1
APDU 在 ISO 7816 标准的第 4 部分中指定 - 在那里您可以找到每个字节代表什么(class 字节、操作代码、参数字节等)。 0xA4
例如表示 SELECT command
.
我的建议是转至 GlobalPlatform website 并下载卡规范 - 您必须注册,但它是免费的。该卡规范的第 11 章包含大量有关 APDU 编码的信息、最有趣的 APDU 命令和管理卡的响应等。这将帮助您入门并让您了解可以为您的应用程序设计哪些 APDU 命令。
我刚刚开始制作一个使用主机卡仿真 (HCE) 的应用程序,并且我已经完成了各种零碎的工作。我需要应用程序让 phone 像卡片一样工作,而另一个 phone 像 NFC reader 一样工作并扫描它,反之亦然,以便交换非常小的信息 - 一个身份证号。
我已经完成了一些功能单元,例如 ProcessCommandApdu 和定义 AID,但我并不真正理解它是如何工作的。
到目前为止,这是我的代码...
@TargetApi(19) public class MainActivity 扩展了 HostApduService {
@Override
public void onDeactivated(int reason) {
}
@Override
public byte[] processCommandApdu(byte[] commandApdu, Bundle extras) {
String inboundApduDescription;
byte[] responseApdu;
if (Arrays.equals(AID_SELECT_APDU, commandApdu)) {
inboundApduDescription = "Application selected";
Log.i("HCEDEMO", inboundApduDescription);
byte[] answer = new byte[2];
answer[0] = (byte) 0x90;
answer[1] = (byte) 0x00;
responseApdu = answer;
return responseApdu;
}
return commandApdu;
}
private static final byte[] AID_SELECT_APDU = {
(byte) 0x00,
(byte) 0xA4,
(byte) 0x04,
(byte) 0x00,
(byte) 0x07,
(byte) 0xF0, (byte) 0x39, (byte) 0x41, (byte) 0x48, (byte) 0x14, (byte) 0x81, (byte) 0x00,
(byte) 0x00
};
public static void main(String[] args) throws UnsupportedEncodingException {
TerminalFactory terminalFactory = TerminalFactory.getDefault();
try {
for (CardTerminal terminal : terminalFactory.terminals().list()) {
System.out.println(terminal.getName());
try {
Card card = terminal.connect("*");
CardChannel channel = card.getBasicChannel();
System.out.println("SelectAID ");
CommandAPDU command = new CommandAPDU(SelectAID);
ResponseAPDU response = channel.transmit(command);
byte recv[] = response.getBytes();
for (int i = 0; i < recv.length; i++) {
System.out.print(String.format("%02X", recv[i]));
}
System.out.println("");
}
catch (CardException e){}
}
}
catch(CardException e){
}
}
}
public class ReaderActivity {
public static byte[] SelectAID = new byte[]{(byte) 0x00, (byte) 0xA4, (byte) 0x04, (byte) 0x00,
(byte) 0x07,
(byte) 0xF0, (byte) 0x39, (byte) 0x41, (byte) 0x48, (byte) 0x14, (byte) 0x81, (byte) 0x00, (byte)
0x00
};
}
字节代表什么0x00、0xA4 以及如何通过 APDU 传达我自己的信息(ID 号)?
我还需要补充什么吗?
我的代码基于以下教程 https://www.slideshare.net/ChienMingChou/hce-tutorialv-v1
APDU 在 ISO 7816 标准的第 4 部分中指定 - 在那里您可以找到每个字节代表什么(class 字节、操作代码、参数字节等)。 0xA4
例如表示 SELECT command
.
我的建议是转至 GlobalPlatform website 并下载卡规范 - 您必须注册,但它是免费的。该卡规范的第 11 章包含大量有关 APDU 编码的信息、最有趣的 APDU 命令和管理卡的响应等。这将帮助您入门并让您了解可以为您的应用程序设计哪些 APDU 命令。