3

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 から、読み取りレコードを使用すると、これらのデータが表示されませんか?

4

1 に答える 1

6

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 (by EF) コマンドです。

00 A4 02 0C 01 01 00

そのコマンドでは、ISO 7816-4 に従っている場合、Lc は 2 であり、EF 識別子は 2 バイトで構成されている必要があります。それに応じて、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");
    }
}

次に送信するコマンドは、現在選択されているファイルの最初のレコードに「BAOGIA@」を書き込もうとする不正な WRITE RECORD コマンドです (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 コマンドを繰り返し、その後、2 つの不正な形式の 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は、スマートカード アプリケーションのファイル システム レイアウトのみを提案しています。

于 2014-04-15T14:36:00.160 に答える