クマは森で用を足しますか?

アウトプットは重要です。

GET DATA [Refresh tag]の追加

前回の変更で、現在製造中のARA-MがGET DATA [All]コマンドとGET DATA [Next]コマンドをサポートしました。

cheerio-the-bear.hatenablog.com


GET DATAコマンドとしてはもうひとつ、GET DATA [Refresh Tag]コマンドにも対応させます。

GET DATA [Refresh Tag]コマンド

GET DATAコマンドですのでインストラクションコードは'CA'、下表ではクラスバイトを'XX'と表現していますが、Global Platformのコマンドなので実際には最上位ビットを立てます。指定するタグ (P1 + P2) が'DF20'になりました。

CLA INS P1 P2 Le
XX CA DF 20 00

コマンドに対して返送されるのは、下記の11バイト。

|Response-Refresh-Tag-DO|T|DF20            |
|                       |L|08              |
|                       |V|0123456789ABCDEF|

8バイトのデータ部は適当な値で、アクセスルールが更新される際にはこの値も一緒に別の値に変わることが期待されます。Global Platform Secure Element Access Control仕様書では下記のように説明されていますが、今回はアクセスルールの更新までサポートするつもりはないので、ずっと変らずこの値を返すことにします。

The GET DATA [Refresh tag] command shall return a Response-Refresh-Tag-DO containing a refresh tag that indicates whether changes have occurred in the access control data. This refresh tag is an attribute (8-byte random number) of the ARA-M and is newly generated when the ARA-M detects an update of access control data in the Secure Element. The ARA-M shall ensure that the new value is different from the previous one.

今回のコード変更は、たったこれだけです。

github.com

動作確認

ここのところ残念なコーディングミスが立て続いたので、サボりすぎないで動作を確認しておきます。まずは、P3/Leに最大の'00' (256)が指定されるパターン。期待通りに、ステータスワード'6CXX'が返ります。

C-APDU : 81CADF2000
R-APDU + SW : 6C0B
C-APDU : 81CADF200B
R-APDU + SW : DF20080123456789ABCDEF9000

次は、P3/Le値がちょうどResponse-Refresh-Tag-DOのサイズと一致しているパターン。これも大丈夫です。

C-APDU : 81CADF200B
R-APDU + SW : DF20080123456789ABCDEF9000

最後に、Response-Refresh-Tag-DOのサイズよりも要求サイズが小さいパターン。

C-APDU : 81CADF2008
R-APDU + SW : DF200801234567899000

AndroidのSecure Elementアプリケーションは、アクセスルールを読む前にこのコマンドを使い、ルールが更新されたかどうかを確認します。このコマンドをサポートすることで、Secure Elementアプリケーションにアクセスルールを読んでもらえるARA-Mになったはずです。