前回の変更で、現在製造中の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.
今回のコード変更は、たったこれだけです。
動作確認
ここのところ残念なコーディングミスが立て続いたので、サボりすぎないで動作を確認しておきます。まずは、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になったはずです。