マイナンバーカードから顔写真データを読み込む方法に関する覚書です。
基本4情報の読み込みについては Web で詳しい説明が見つかります。
DFを選択、そのDF内の PINファイルでPIN検証、その後、データを格納したEFファイルを読み込むことでマイナンバーや基本4情報は取得できます。
顔写真データの取得方法は go 言語プログラムが公開されています。
Windows で実行すると複数リーダが見つかったというメッセージが3回ほど繰り返し表示されて、プログラムが終了、顔写真データは取得できませんでした。しかし、そのソースコードを頼りに取得方法がかかれているソースコードをもとに顔写真データは取り込めました。
読み取ったデータ構造を VisualInfo 構造体で定義されている通りに分解していきました。
(myna/libmyna/visual_ap.go)
VisualInfo struct {
Header []byte asn1:"private,tag:33"
Birth string asn1:"private,tag:34"
Sex string asn1:"private,tag:35"
PublicKey []byte asn1:"private,tag:36"
Name []byte asn1:"private,tag:37"
Addr []byte asn1:"private,tag:38"
Photo []byte asn1:"private,tag:39"
Signature []byte asn1:"private,tag:40"
Expire string asn1:"private,tag:41"
Code []byte asn1:"private,tag:42"
}
先頭の5バイトからデータ全体の長さが分かります。これは構造体には含まれません。
ff 20 82 xx yy ( 0x20=32 全データ長 xx * 0xff + yy + xx )
後はレコードマーカとレコード長を頼りに、順番にレコードを取り出します。
データ長は、レコードマーカの次のバイトが 82 であれば、次の2バイトでレコード長をあらわしています。2バイトのBig Endianに1バイト目の値を加算します。 レコード長=xx * 0xff + yy + xx。
レコードの3バイト目が 82 以外であれば、その次のバイトがレコード長です(最大 0x1f )
Header レコード ( 0x21=33 データ長 xx )
df 21 xx
Birthday レコード( 0x22=34 データ長 xx )
df 22 xx
Sexレコード( 0x23=35 データ長 xx )
df 23 xx
PublicKey レコード( 0x24=36 データ長 xx )
df 24 xx
Name
df 25 82 xx yy( 0x25=37 データ長 xx * 0xff + yy + xx )
Addr
df 26 82 xx yy( 0x26=38 データ長 xx * 0xff + yy + xx )
Photo
df 27 82 xx yy( 0x27=39 データ長 xx * 0xff + yy + xx )
df 27が顔写真のレコードのようなので、データを保存すると先頭と末尾が JPEG2000 のタグなっていることが確認できます。
00 00 0c 6a 50 20 20 0d 0a 87 0a
..
ff d9
JPEG2000 対応のソフトでモノクロ写真が表示されました。
基本4情報と顔写真データを読み込む Windows プログラム(バイナリーのみ)を以下サイトで公開しました。