IC運転免許証に格納されたデータを紹介してみる

# はじめに

唐突ですが、持ってますか？　**運転免許証**。

<div><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204326/442033be-98c9-ea64-334c-e55749df16af.png" alt="警察庁の運転免許証のサンプル画像" width=60%/></div>

警察庁が公開している[運転免許統計](https://www.npa.go.jp/publications/statistics/koutsuu/menkyo.html)を見る限り、だいたい3人に2人が有効な免許証を保有しているのではないかと思います。
実際あると便利ですよね。自動車等を運転できるようになるのは勿論のこと、身分証明書としても便利に使えるので、身分証目的で取得したという人もいるかもしれません。

そんな便利な免許証ですが、その中にどんなデータが格納されているのか知っている人は、果たしてどれだけいるでしょうか？
券面に書かれている内容からある程度の予想はできると思いますが、仕様書まで読んだことがある人はほとんどいないのではないでしょうか？

と言うことで、この記事では運転免許証のICチップの中にはいったいどんなデータが格納されているのか、2018/12/21現在における仕様書の内容をベースに**ふわっと**紹介します。

なお、ICチップを搭載していない古い運転免許証に関しては、全く考慮していません。
また、運転免許証から各種論理ファイルの内容を読み出すまでに関しても一切触れないので、あらかじめご了承ください。

(ちなみに上記の画像は警察庁のページから拝借してきた画像を加工したものです。)


# 仕様書はどこにあるのか

**警察庁**によって、普通にネット上に公開されています。「[運転免許証 仕様](https://www.google.co.jp/search?q=運転免許証+仕様)」とでもググればすぐに見つかるかと思います。

2018/12/21現在では、「[運転免許証及び運転免許証作成システム等の仕様の改正について](https://www.npa.go.jp/pdc/notification/koutuu/menkyo/menkyo20160715.pdf)」というPDFファイルが見つかり、その中に「運転免許証及び運転免許証作成システム等仕様書」が含まれています。
ちなみに仕様書のバージョンは007となっていました。

上記の仕様書を含む諸々の通知が掲載されているのは、警察庁ホームページの[警察庁の施策を示す通達(交通局)](http://www.npa.go.jp/laws/notification/koutuu.html)です。運転免許証に関連する通知は[運転免許課](http://www.npa.go.jp/laws/notification/koutuu.html#menkyo)にあります。

※追記
2019/04/03にバージョン008の仕様書が公開されたのにあわせ、上記はリンク切れとなったようです。
最新版の仕様書は以下となります。
[運転免許証及び運転免許証作成システム等の仕様の改正について (V8)](https://www.npa.go.jp/laws/notification/koutuu/menkyo/menkyo20190403_070.pdf)

※追記2(2020/12/03)
旧姓併記に伴い、2019/11/28に仕様の一部改正が行われたようです。
[運転免許証及び運転免許証作成システム等の仕様の一部改正について](http://www.npa.go.jp/laws/notification/koutuu/menkyo/menkyo20191128_r174.pdf)

※追記3(2021/08/03)
2021/06/30にバージョン009の仕様書が公開されたのにあわせ、008の仕様書と「一部改正について」へのリンクは無効になってしまったようです。
最新の009の仕様書は以下となります。
[運転免許証及び運転免許証作成システム等の仕様の改正について (V9)](https://www.npa.go.jp/laws/notification/koutuu/menkyo/menkyo20210630_150.pdf)

なお、2019/11/28の一部改正に記載されていた旧姓併記に関する記述は009の仕様書に取り込まれていました。別紙2の10ページ目の「チ 旧姓を使用した氏名の取り扱い」からページの終わりまでが一部改正から取り込まれた内容です。他に008からの大きな変更はありませんでした。


# ファイルの構成

IC運転免許証の中には、以下のような構成の論理ファイルが入っています。
「:」以降にはファイルの内容を記載しています。

MF
 ├── DF1
 │　　 ├── EF01: [記載事項(本籍除く)](#記載事項本籍除く)
 │　　 ├── EF02: [記載事項(本籍)](#記載事項本籍)
 │　　 ├── EF03: [外字](#外字)
 │　　 ├── EF04: [記載事項変更等(本籍除く)](#記載事項変更等本籍除く)
 │　　 ├── EF05: [記載事項変更(外字)](#記載事項変更外字)
 │　　 ├── EF06: [記載事項変更(本籍)](#記載事項変更本籍)
 │　　 └── EF07: [電子署名](#電子署名)
 ├── DF2
 │　　 └── EF01: [写真](#写真)
 ├── DF3
 │　　 └── EF01: RFU (reserved for future use)
 ├── EF01: [共通データ要素](#共通データ要素)
 ├── EF02: [PIN設定](#暗証番号pin設定)
 ├── IEF01: [暗証番号1(PIN 1)](#暗証番号1pin-1)
 └── IEF02: [暗証番号2(PIN 2)](#暗証番号2pin-2)

**MF**と**DF**は、Windowsのファイルシステムで例えると、それぞれ「ルートフォルダ」と「フォルダ」、**EF**および**IEF**は「ファイル」のようなものだと思ってください(Linux界隈の人は「フォルダ」を「ディレクトリ」に読み替えてください)。
そのため、上記のようにMFやDFの下にEFやIEFがあるような構成を取ることができます。


# ファイルのデータ構造

EF01やEF02といった各ファイルの中には、**タグフィールド(T)**、**長さフィールド(L)**、**値フィールド(V)**の3つで構成される**基本符号化TLV(BER-TLV)フォーマット**のデータ(以降「TLVデータ」)が1つ以上並んでいます。

<TABLE>
<TH COLSPAN=3>TLVデータ1</TH><TH COLSPAN=3>TLVデータ2</TH><TH COLSPAN=3>TLVデータ3</TH><TH>・・・</TH>
<TR><TD>T</TD><TD>L</TD><TD>V</TD><TD>T</TD><TD>L</TD><TD>V</TD><TD>T</TD><TD>L</TD><TD>V</TD><TD>・・・</TD></TR>
</TABLE>


各フィールドに関しては後述しますが、値フィールドの長さに応じて各フィールドの長さは以下のように変化します。

(A) 値フィールドの長さが0～127バイトである場合

| タグフィールド | 長さフィールド | 値フィールド |
|:------------:|:-------------:|:-----------:|
| 1バイト       | 1バイト       | 0～127バイト |


(B) 値フィールドの長さが128～65535バイトである場合

| タグフィールド  | 長さフィールド | 値フィールド     |
|:--------------:|:-------------:|:---------------:|
| 1または2バイト  | 3バイト       | 128～65535バイト |


## タグフィールドとは

タグフィールドには、対応する[値フィールド](#値フィールドとは)にどういったデータが格納されているのかを知るための値が入っています。要はラベルのようなものだと考えてください。
基本的には16進数で"01"～"FE"となる1バイトの値が入っていますが、[MF/DF2/EF01(写真)](#写真)の場合のみ"5F40"という2バイトの値が入っています。

例えば、「記載事項(本籍除く)」のデータが入っている[MF/DF1/EF01](#記載事項本籍除く)で、あるTLVデータのタグフィールドの値が"12"であれば、対応する値フィールドには氏名が入っていると判断できます。

タグフィールドと値フィールドの内容の対応関係に関しては、[仕様書](#仕様書はどこにあるのか)に記載されています。


## 長さフィールドとは

長さフィールドは、後述の[値フィールド](#値フィールドとは)の長さを示します。
[仕様書](#仕様書はどこにあるのか)では、上述の(A)のように値フィールドが0～127バイトの場合、b8(最上位ビット)を0とし、続くb7～b1で0～127の整数を符号化(上位先順)するよう定められています。

| b8 |   b7   |   b6   |   b5   |   b4   |   b3   |   b2   |   b1   |
|:--:|:------:|:------:|:------:|:------:|:------:|:------:|:------:|
| 0  | 0 or 1 | 0 or 1 | 0 or 1 | 0 or 1 | 0 or 1 | 0 or 1 | 0 or 1 | 

例えば、値フィールドの長さが100のとき、長さフィールドは16進数で"64"となる1バイトの値になります。

また(B)のように値フィールドが128～65535バイトの場合、長さフィールドは3バイトとなり、この内の第1バイトを16進数で"82"とし、残りの2バイトで65535までの値を表現します。

<TABLE>
<TH>第1バイト</TH><TH>　第2バイト</TH><TH>　第3バイト</TH>
<TR><TD>"82"(固定値)</TD><TD COLSPAN=2>16ビットで65535までの値を表現</TD></TR>
</TABLE>

例えば、値フィールドの長さが256のとき、16進数で"820100"となる3バイトの値になります。

長さフィールドの最上位ビットを見ることで、(A)と(B)のどちらのパターンか判別することができます。


## 値フィールドとは

値フィールドは、名前の通り値が入ったフィールドです。
長さフィールドの値が"00"、すなわち値フィールドの長さが0の時、値フィールドは存在せず、長さフィールドのすぐ後に、次のTLVデータのタグフィールドが来ることになります。

値フィールドに何のデータが格納されているかは、[タグフィールド](#タグフィールドとは)の値を見ればわかります。

値がどのように符号化されているかは値フィールドによって異なります。各値フィールドの符号化方式に関しては[仕様書](#仕様書はどこにあるのか)をご参照ください。


# 各ファイルの内容

各ファイルにどのような情報がどのように格納されているのか紹介します。
「記載事項(本籍除く)」や「JIS X 0208 制定年番号」のようなファイルやデータの内容を示す単語は、[仕様書](#仕様書はどこにあるのか)そのままの表現としていますのでご理解ください。

分かりやすくするため、タグフィールドを<font color="Blue">青色</font>、長さフィールドを<font color="Red">赤色</font>、値フィールドを<font color="Green">緑色</font>とした、16進数で表現することとします。また、「"」で囲まれた数値は16進数表記とします。

**なお、以降で登場するTLVデータの具体例のうち、氏名や生年月日のような個人情報に関連するものは実際のデータを参考に作成した架空のデータとなっています。**


## 記載事項(本籍除く)

MF/DF1/EF01には**記載事項(本籍除く)**が格納されています。
具体的には、氏名や生年月日、住所と言った一般的な個人情報や、「免許証の色区分(優良・新規・その他)」や「免許の条件１」、「免許の年月日(普通)」と言った運転免許証ならではの情報が格納されています。

[タグフィールド](#タグフィールドとは)と[値フィールド](#値フィールドとは)の対応関係は以下の通りです。"34"～"3F"はRFUとなっています。

|タグ|データ内容||タグ|データ内容|
|:-:|:-----:|:-:|:-:|:-:|
|"11"|JIS X 0208 制定年番号||"22"|免許の年月日(二・小・原)|
|"12"|氏名||"23"|免許の年月日(他)|
|"13"|呼び名(カナ)||"24"|免許の年月日(二種)|
|"14"|通称名||"25"|免許の年月日(大型)|
|"15"|統一氏名(カナ)||"26"|免許の年月日(普通)|
|"16"|生年月日||"27"|免許の年月日(大特)|
|"17"|住所||"28"|免許の年月日(大自二)|
|"18"|交付年月日||"29"|免許の年月日(普自二)|
|"19"|照会番号||"2A"|免許の年月日(小特)|
|"1A"|免許証の色区分(優良・新規・その他)||"2B"|免許の年月日(原付)|
|"1B"|有効期間の末日||"2C"|免許の年月日(け引)|
|"1C"|免許の条件１||"2D"|免許の年月日(大二)|
|"1D"|免許の条件２||"2E"|免許の年月日(普二)|
|"1E"|免許の条件３||"2F"|免許の年月日(大特二)|
|"1F"|免許の条件４||"30"|免許の年月日(け引二)|
|"20"|公安委員会名||"31"|免許の年月日(中型)|
|"21"|免許証の番号||"32"|免許の年月日(中二)|
||||"33"|免許の年月日(準中型)|

実際にどう言った値が格納されているのか、TLVデータの具体例を交えていくつか紹介します。


### JIS X 0208 制定年番号

<font color="Blue">11</font><font color="Red">01</font><font color="Green">78</font>

<font color="Blue">"11"</font>は**JIS X 0208 制定年番号**であることを、<font color="Red">"01"</font>は値フィールドの長さが1であることを示しています。

値フィールドは符号化時に参照したJIS X 0208の制定年下2桁を示しています。例えば1983年の場合、"83"となります。
なお、仕様書には以下のようにあります。

- ただし、JIS C 6226は、“78”とする。

以上のことから、例のように"78"とある場合は、MF/DF1/EF01の他のデータでJIS X 0208で符号化されたと仕様書にあるものは、厳密には1978年に制定されたJIS C 6226を参照して符号化されたもの判断することができます。

ただし、以降ではJIS C 6226を参照して符号化されたと判断できる場合でも単に「JIS X 0208」と記載しますのでご了承ください。


### 氏名

<font color="Blue">12</font><font color="Red">0A</font><font color="Green">3B33FFF1212142404F3A</font>

<font color="Blue">"12"</font>は**氏名**であることを、<font color="Red">"0A"</font>は値フィールドの長さが10であることを示しています。

値フィールドを**JIS X 0208**に基づいて変換していくと、以下のようになります。

| "3B33" | "FFF1"                  | "2121"     | "4240" | "4F3A" |
|:------:|:-----------------------:|:----------:|:------:|:------:|
| 山     | JIS X 0208には存在しない | 全角スペース | 太     | 郎     |

表にもあるように、"FFF1"はJIS X 0208に存在しません。
これは"FFF1"がJIS X 0208の文字コードではなく、**外字**が使用されていることを示す値であるためです。(外字に関しては[後述](#外字とは)をご参照ください。)
"FFF1"を正しく変換して表示するためには、MF/DF1/EF03に格納されている外字1のデータを画像にデコードして表示する必要がありますが、ここでは「(外字1)」とすることにします。

結果、このTLVデータからは「山(外字1)　太郎」という氏名を得ることができます。


### 生年月日

<font color="Blue">16</font><font color="Red">07</font><font color="Green">33353030363031</font>

<font color="Blue">"16"</font>は**生年月日**であることを、<font color="Red">"07"</font>は値フィールドの長さが7であることを示しています。

値フィールドを**JIS X 0201**に基づいて変換していくと、以下のようになります。

|"33"|"35"|"30"|"30"|"36"|"30"|"31"|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
| 3  | 5  | 0  | 0  | 6  | 0  | 1  |

これらの数値は順に元号1桁、年2桁、月2桁、日2桁を表しています。
元号の数値は明治=1、大正=2、昭和=3、平成=4と定められています。

結果、「昭和50年06月01日」という生年月日を得ることができます。

(2019/12/13追記)
バージョン008の仕様書によるとで令和=5と定められたようです。


### 免許の条件１

<font color="Blue">1C</font><font color="Red">06</font><font color="Green">346336404579</font>

<font color="Blue">"1C"</font>は**免許の条件１**であることを、<font color="Red">"06"</font>は値フィールドの長さが6であることを示しています。
(「免許の条件」は運転免許証表面の「免許の条件等」の右に書いてあるアレです。IC運転免許証には、「免許の条件１」～「免許の条件４」の4つまで記入できるようになっているようです。)

値フィールドを**JIS X 0208**に基づいて変換していくと、以下のようになります。

| "3463" | "3640" | "4579" |
|:------:|:------:|:------:|
| 眼     | 鏡     | 等     |

結果、「眼鏡等」という免許の条件１を読み取ることができます。


### 免許の年月日(普通)

<font color="Blue">26</font><font color="Red">07</font><font color="Green">34323030343031</font>

<font color="Blue">"26"</font>は**免許の年月日(普通)**であることを、<font color="Red">"07"</font>は値フィールドの長さが7であることを示しています。

値フィールドを**JIS X 0201**に基づいて変換していくと、以下のようになります。

|"34"|"32"|"30"|"30"|"34"|"30"|"31"|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
| 4  | 2  | 0  | 0  | 4  | 0  | 1  |

冒頭の4は平成を意味するので、「平成20年04月01日」という普通自動車免許の取得年月日を得ることができます。


### 免許の年月日(大特)

<font color="Blue">27</font><font color="Red">07</font><font color="Green">34303030303030</font>

<font color="Blue">"27"</font>は**免許の年月日(大特)**であることを、<font color="Red">"07"</font>は値フィールドの長さが7であることを示しています。

値フィールドを**JIS X 0201**に基づいて変換していくと、以下のようになります。

|"34"|"30"|"30"|"30"|"30"|"30"|"30"|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
| 4  | 0  | 0  | 0  | 0  | 0  | 0  |

冒頭の4は平成を意味するので、「平成00年00月00日」という大型特殊自動車免許の取得年月日を得ることができます。この値は大型特殊自動車免許を保有していないことを意味します。


## 記載事項(本籍)

MF/DF1/EF02には**記載事項(本籍)**が格納されています。
具体的には、本籍のみが格納されています。

[タグフィールド](#タグフィールドとは)と[値フィールド](#値フィールドとは)の対応関係は以下の通りです。


|タグ|データ内容|
|:-:|:-----:|
|"41"|本籍  |

実際にどう言った値が格納されているのか、TLVデータの具体例を交えて紹介します。


### 本籍

<font color="Blue">41</font><font color="Red">1E</font><font color="Green">456C357E455440694265454436683262242C34582332215D2331215D2332</font>

<font color="Blue">"41"</font>は**本籍**であることを、<font color="Red">"1E"</font>は値フィールドの長さが30であることを示しています。

値フィールドを**JIS X 0208**に基づいて変換していくと、以下のようになります。

| "456C" | "357E" | "4554" | "4069" | "4265" | "4544" | "3668" | "3262" | "242C" | "3458" | "2332" | "215D" | "2331" | "215D" | "2332" |
|:------:|:------:|:------:|:------:|:------:|:------:|:------:|:------:|:------:|:------:|:------:|:------:|:------:|:------:|:------:|
| 東     | 京      | 都     | 千     | 代      | 田     | 区      | 霞     | が     | 関      | ２     | －      | １      | －     | ２      |

結果、「東京都千代田区霞が関２－１－２」という本籍を得ることができます。ちなみにこの住所は警察庁も入居している中央合同庁舎第2号館のものです。


## 外字

MF/DF1/EF03には**外字**が格納されています。
具体的には、**JIS X 0208**で規定されていない文字のBitMapデータをエンコードしたものが格納されています。外字1と外字2の、最大2つのデータを格納できるようです。

[タグフィールド](#タグフィールドとは)と[値フィールド](#値フィールドとは)の対応関係は以下の通りです。

|タグ|データ内容          |
|:--:|:-------------:|
|"48"|「文字構成」+「外字1」|
|"49"|「文字構成」+「外字2」|

「文字構成」は外字のドット数を示す1バイトの値です。"50"であれば外字の大きさは50x50となります。80x80ではないのでご注意ください。
この1バイトの値と外字のBitMapデータをエンコードしたものが連結された値が[値フィールド](#値フィールドとは)に格納されています。

どういった文字が外字として免許証に格納されるのかについては、[後述](#外字とは)をご参照ください。
エンコード方法等の詳細に関しては、[仕様書](#仕様書はどこにあるのか)をご参照ください。

ちょうど私の運転免許証でも外字が使用されていたため、そのTLVデータを具体例として記載しておきます。


### 外字1

<font color="Blue">48</font><font color="Red">5E</font><font color="Green">509133D7939FAA3CB5A7F4FE1793828983CD9FFC75D1E4487FED3D756BFEE17F6D05FDBA38BFF84FFBD27FCB8657FFF9117FFFFFCC67AFFDA7FF887FFAFFCD8BFFD7FFFFFFFFFFFFF88FFF1FFF32336788D3F11FFFE4505BC3C1E3001001</font>

<font color="Blue">"48"</font>は**外字1**であることを、<font color="Red">"5E"</font>は値フィールドの長さが94であることを示しています。

これを頑張ってデコードすれば「﨑(たつさき)」のビットマップデータを取得できるはずです。(私は自力でデコードしたことありませんが。)

単純にどういった画像がエンコードされているか確認するだけであれば、私が上記の値フィールドをチマチマ加工してTIFFファイルとし、それを更に適当なツールでPNGに変換したものを以下に用意したのでご利用ください。

<!--
![tatsusaki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204326/fb6545cd-6e17-5731-5fd8-bfd468d4a3e2.png)
-->

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204326/fb6545cd-6e17-5731-5fd8-bfd468d4a3e2.png" width=20%>

ちなみに、変換前のTIFFファイルは以下になります。
TIFFファイルに対応した画像ビューア等であれば画像を表示できるはずです。

<!-- 
![tatsusaki.tif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204326/06e267b0-c461-5c54-06b8-d938ed157bb9.tiff)
 -->

[TIFFファイル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204326/06e267b0-c461-5c54-06b8-d938ed157bb9.tiff)


## 記載事項変更等(本籍除く)

MF/DF1/EF04には**記載事項変更等(本籍除く)**が格納されています。
具体的には、「新住所」や「新氏名」といった運転免許証裏面の備考欄に書かれている情報が記載されています。
(ファイルには格納されているが、備考欄には記載されてない情報もあるかもしれません。)

[タグフィールド](#タグフィールドとは)と[値フィールド](#値フィールドとは)の対応関係は以下の通りです。

|タグ        |データ内容 |
|:--------:|:------:|
|"50"      |追記の有無|
|"51"～"5F"|「JIS X 0208 制定年番号」+「(元号)YYMMDD」+「住所地公安委員会名」|
|"60"～"67"|「JIS X 0208 制定年番号」+「(元号)YYMMDD」+「新氏名」+「住所地公安委員会名」|
|"68"～"6F"|「JIS X 0208 制定年番号」+「(元号)YYMMDD」+「新呼び名」+「住所地公安委員会名」|
|"70"～"77"|「JIS X 0208 制定年番号」+「(元号)YYMMDD」+「新住所」+「住所地公安委員会名」|
|"78"～"7F"|「JIS X 0208 制定年番号」+「(元号)YYMMDD」+「新条件」+「住所地公安委員会名」|
|"80"～"87"|「JIS X 0208 制定年番号」+「(元号)YYMMDD」+「条件解除」+「住所地公安委員会名」|
|"88"～"8F"|「JIS X 0208 制定年番号」+「(元号)YYMMDD」+「備考」+「住所地公安委員会名」|
|"90"～"97"|「JIS X 0208 制定年番号」+「(元号)YYMMDD」+「予備」+「住所地公安委員会名」|

実際にどう言った値が格納されているのか、TLVデータの具体例を交えていくつか紹介します。


### 追記の有無

<font color="Blue">50</font><font color="Red">01</font><font color="Green">11</font>

これは**追記の有無**を表すデータです。
値フィールドの値が"11"である場合、MF/DF1/EF04には「新氏名」や「新住所」といった何らかの情報が追記されているものと判断できます。


### 新住所

<font color="Blue">70</font><font color="Red">37</font><font color="Green">782334233323302330233123302331456C357E455440694265454436683262242C34582332215D2331215D2332456C357E455438783042</font>

<font color="Blue">"70"</font>は**新住所**であることを、<font color="Red">"37"</font>は値フィールドの長さが55であることを示しています。

値フィールドですが、最初の1バイトは記載事項(本籍除く)の[JIS X 0208 制定年番号](#jis-x-0208-制定年番号)と同様に、符号化する際に参照したJIS X 0208制定年下2桁を示しているため、具体的な新住所の情報は2バイト目から記載されています。

値フィールドの第2バイト以降の内容をJIS X 0208に基づいて変換すると以下のようになります。

*４３００１０１東京都千代田区霞が関２－１－２東京都公安*

内容としては、順に**変更年月日**(7字)、新住所、**公安委員会名**(5字)となっています。

変更年月日は記載事項(本籍除く)の[生年月日](#生年月日)同様のルールとなっており、この例の場合は平成30年01月01日となります。

公安委員会名はデータの追記を行った公安委員会の名前を5字で表したもので、例えば東京都公安委員会であれば「東京都公安」となる模様です。
(「神奈川県」のように4字の都道府県の場合にどうなるかは把握していません。)

知人の運転免許証裏面の備考欄を拝見したところ「東京都公安」と印字される代わりに、「東京公委」とスタンプを押されていました。


## 記載事項変更(外字)

MF/DF1/EF05には**記載事項変更(外字)**が格納されています。
具体的には、[MF/DF1/EF03(外字)](#外字)と同様に外字データが格納されています。

[MF/DF1/EF03](#外字)には最大2つの外字データを格納できるようになっていますが、それでは足りない場合にこのファイルに外字データを格納するようです(外字3～外字7の最大5つ)。

[タグフィールド](#タグフィールドとは)と[値フィールド](#値フィールドとは)の対応関係は以下の通りです。

|タグ|データ内容          |
|:--:|:-------------:|
|"A0"|追記の有無|
|"A1"|「文字構成」+「外字3」|
|"A2"|「文字構成」+「外字4」|
|"A3"|「文字構成」+「外字5」|
|"A4"|「文字構成」+「外字6」|
|"A5"|「文字構成」+「外字7」|


## 記載事項変更(本籍)

MF/DF1/EF06には**記載事項変更等(本籍)**が格納されています。
具体的には、新本籍が記載されています。

[タグフィールド](#タグフィールドとは)と[値フィールド](#値フィールドとは)の対応関係は以下の通りです。

|タグ        |データ内容 |
|:--------:|:------:|
|"AA"      |追記の有無|
|"AB"～"AF"|「JIS X 0208 制定年番号」+「(元号)YYMMDD」+「本籍」+「住所地公安委員会名」|

実際にどう言った値が格納されているのか、TLVデータの具体例を交えて紹介します。


### 追記の有無

<font color="Blue">AA</font><font color="Red">01</font><font color="Green">11</font>

これは**追記の有無**を表すデータです。
値フィールドの値が"11"である場合、MF/DF1/EF06には「新本籍」が追記されているものと判断できます。


### 新本籍

<font color="Blue">AB</font><font color="Red">37</font><font color="Green">782334233323302330233123302331456C357E455440694265454436683262242C34582332215D2331215D2332456C357E455438783042</font>

<font color="Blue">"AB"</font>は**新本籍**であることを、<font color="Red">"37"</font>は値フィールドの長さが55であることを示しています。

値フィールドの第2バイト以降の内容を**JIS X 0208**に基づいて変換すると以下のようになります。

*４３００１０１東京都千代田区霞が関２－１－２東京都公安*


## 電子署名

MF/DF1/EF07には**電子署名**が格納されています。
具体的には、電子署名、シリアル番号、発行者名、主体者名、主体者鍵識別子が記載されています。

[タグフィールド](#タグフィールドとは)と[値フィールド](#値フィールドとは)の対応関係は以下の通りです。

|タグ        |データ内容 |
|:--------:|:------:|
|"B1"      |電子署名|
|"B2"      |シリアル番号|
|"B3"      |(RFU)|
|"B4"      |発行者名|
|"B5"      |主体者名|
|"B6"      |主体者鍵識別子|

実際にどう言った値が格納されているのか、TLVデータの具体例を交えていくつか紹介します。


### 発行者名

<font color="Blue">B4</font><font color="Red">48</font><font color="Green">6F753D4E5041204943444C20526F6F742043412C6F753D4E6174696F6E616C20506F6C696365204167656E63792C6F3D4A6170616E65736520476F7665726E6D656E742C633D4A50</font>

<font color="Blue">"B4"</font>は**発行者名**であることを、<font color="Red">"48"</font>は値フィールドの長さが72であることを示しています。

値フィールドの内容を**JIS X 0201**に基づいて変換すると以下のようになります。

*ou=NPA ICDL Root CA,ou=National Police Agency,o=Japanese Government,c=JP*


### 主体者名

<font color="Blue">B5</font><font color="Red">74</font><font color="Green">636E3D546F6B796F204D5053432C6F753D507265666563747572616C205075626C69632053616665747920436F6D6D697373696F6E7320666F72204943444C2C6F753D4E6174696F6E616C20506F6C696365204167656E63792C6F3D4A6170616E65736520476F7665726E6D656E742C633D4A50</font>

<font color="Blue">"B5"</font>は**主体者名**であることを、<font color="Red">"74"</font>は値フィールドの長さが116であることを示しています。

値フィールドの内容を**JIS X 0201**に基づいて変換すると以下のようになります。

*cn=Tokyo MPSC,ou=Prefectural Public Safety Commissions for ICDL,ou=National Police Agency,o=Japanese Government,c=JP*

ちなみに、石川県で取得した免許証の場合は以下のような文字列が格納されていました。

*cn=Ishikawa PPSC,ou=Prefectural Public Safety Commissions for ICDL,ou=National Police Agency,o=Japanese Government,c=JP*


## 写真

MF/DF2/EF01には**写真**が格納されています。
具体的には運転免許証表面に印刷されている顔写真が、**JPEG2000**のフォーマットで格納されています。
ただし、運転免許証の顔写真がカラー写真であるのに対し、格納されている画像は色が着いていないモノクロの画像となっているようです。

[タグフィールド](#タグフィールドとは)と[値フィールド](#値フィールドとは)の対応関係は以下の通りです。

|タグ     |データ内容 |
|:------:|:------:|
|"5F40"  |写真|

このファイルのみ、TLVデータのタグフィールドが"5F40"という2バイトの値になります。


## 共通データ要素

MF/EF01には**共通データ要素**が格納されています。
具体的には、カード発行者データと発効前データが格納されています。

[タグフィールド](#タグフィールドとは)と[値フィールド](#値フィールドとは)の対応関係は以下の通りです。

|タグ     |データ内容 |
|:------:|:------:|
|"45"  |カード発行者データ|
|"46"  |発行前データ|

実際にどう言った値が格納されているのか、TLVデータの具体例を交えて紹介します。


### カード発行者データ

<font color="Blue">45</font><font color="Red">0B</font><font color="Green">3030362016060120210701</font>

<font color="Blue">"45"</font>は**カード発行者データ**であることを、<font color="Red">"0B"</font>は値フィールドの長さが11であることを示しています。

値フィールドの内容は、順に**仕様書バージョン番号**(3バイト)、**交付年月日**(4バイト)、**有効期限**の末日(4バイト)となっています。

仕様書バージョン番号は**JIS X 0201**で符号化されています。

交付年月日および有効期限の末日は4バイトで西暦を表したもので、例えば"20181220"の場合、2018年12月20日となります。

以上のことから、例の場合は仕様書バージョンが006、交付年月日が2016年06月01日、有効期限の末日が2021年07月01日とわかります。


## 暗証番号(PIN)設定

MF/EF02には以下のような**暗証番号(PIN)設定**が格納されています。

<font color="Blue">05</font><font color="Red">01</font><font color="Green">01</font>

<font color="Blue">"05"</font>は暗証番号(PIN)設定であることを、<font color="Red">"01"</font>は値フィールドの長さが1であることを示しています。

値フィールドの値が上記の例のように<font color="Green">"01"</font>であれば暗証番号(PIN)が設定されていることを、<font color="Green">"00"</font>であれば暗証番号(PIN)が設定されていないことを示します。

噂によると、免許の発行時に暗証番号の登録を行わないという選択肢が取れるようなので、その設定を記録するためのファイルと思われます。


## 暗証番号1(PIN 1)

MF/IEF01には**暗証番号1(PIN 1)**が格納されています。
PIN 1は4桁の数字です。
運転免許証の交付を受けた後に変更することはできません。
(暗証番号を忘れた場合、警察署へ行けば暗証番号を教えて貰えますが、暗証番号をリセットすることはできないようです。)


### 補足

[暗証番号(PIN)設定](#暗証番号pin設定)に暗証番号を設定しない旨が記載された免許証の場合、任意の暗証番号の代わりにデフォルトPINの「****」が記録されているようです。

手元に暗証番号が未設定の免許証がないので実際に試したわけではないのですが、このような免許証の場合、暗証番号として「****」が使える旨が仕様書には記載されています。

そのため、公的機関以外ではまともにデータを読み出せないような免許証を発行して欲しい場合は、暗証番号の設定を行わないのではなく、その場で適当な乱数でも設定し、すぐに忘れるのが良いのではないかと思います。


## 暗証番号2(PIN 2)

MF/IEF02には**暗証番号2(PIN 2)**が格納されています。
詳細は[暗証番号1(PIN 1)](#暗証番号1pin-1)と同じです。


# 外字とは

仕様書において、外字は以下のように定義されています。

- JIS X 0208に規定されていない文字であり、かつ、DF1/EF03 又は DF1/EF05 において定義された文字

例えば、名前や住所等に「﨑(たつさき)」のようなJIS X 0208で規定されていない文字が含まれていて、その文字の画像データがMF/DF1/EF03またはMF/DF1/EF05に格納されていれば、その文字は外字です。

氏名等の文字列を構成する各文字は、基本的にJIS X 0208で符号化された形で格納されていますが、外字が含まれる場合は代わりにどの外字画像データに対応しているかを示す値("FFF1"～"FFF7")が格納されます。(例: MF/DF1/EF01の[氏名](#氏名))
このような外字を含んだ文字列を正しく表示する場合、"FFF1"のような値の箇所で対応する外字画像データをデコードした画像を表示する必要があります。

イメージとしては以下のような感じです。(「﨑(たつさき)」は画像です。)

| "3B33" | "FFF1"                  | "2121"     | "4240" | "4F3A" |
|:------:|:-----------------------:|:----------:|:------:|:------:|
| 山     | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204326/fb6545cd-6e17-5731-5fd8-bfd468d4a3e2.png" width="16em" align="middle" margin="0" padding="0"> | 全角スペース | 太     | 郎     |


なお、格納できるのは[MF/DF1/EF03](#外字)と[MF/DF1/EF05](#記載事項変更外字)で合わせて最大7字のため、氏名や住所等に多くのJIS X 0208規定外の文字が使われている場合は、JIS X 0208規定外の文字であっても運転免許証に画像データが格納されていない可能性があります。
この場合、その文字は画像の存在しない**欠字**として扱われ、"FFFA"が使用されるようです。


# 文字の符号化

これまでしれっと登場していた[**JIS X 0201**](https://ja.wikipedia.org/wiki/JIS_X_0201)や[**JIS X 0208**](https://ja.wikipedia.org/wiki/JIS_X_0208)ですが、一応説明しておきます。


## JIS X 0201

[JIS X 0201](https://ja.wikipedia.org/wiki/JIS_X_0201)は規格名称を「**7ビット及び8ビットの情報交換用符号化文字集合**」と言います。
この規格の中には、0～9の数字やa～z及びA～Zのアルファベット、「*」や「?」のような記号と8ビット(1バイト)の値との対応関係が含まれます。
運転免許証内のデータのうち数字やアルファベット、記号のみで表現されるようなデータは、この対応関係を用いて各文字に一対一で対応する1バイトの値を並べたものを格納しています。


## JIS X 0208

[JIS X 0208](https://ja.wikipedia.org/wiki/JIS_X_0208)は規格名称を「**7ビット及び8ビットの2バイト情報交換用符号化漢字集合**」と言います。
この規格の中には、規定された漢字集合(**漢字以外に平仮名やカタカナ、数字等を含みます**)と2バイトの値との対応関係が含まれます。
運転免許証内のデータのうち、JIS X 0208で規定された漢字集合に含まれる文字で表現されるようなデータは、この対応関係を用いて各文字に一対一で対応する2バイトの値を並べたものを格納しています。
(この漢字集合に含まれない文字は外字や欠字として扱われます。)


# 所感

個人情報に﨑(たつさき)が含まれていることが役に立つ日が来ようとは、思ってもみませんでした。


# 参考文献

https://www.npa.go.jp/policies/application/license_renewal/index.html
https://www.npa.go.jp/pdc/notification/koutuu/menkyo/menkyo20160715.pdf  (リンク切れ)
https://www.npa.go.jp/laws/notification/koutuu/menkyo/menkyo20190403_070.pdf (リンク切れ)
https://www.npa.go.jp/laws/notification/koutuu/menkyo/menkyo20210630_150.pdf
http://eternalwindows.jp/security/scard/scard08.html
https://ja.wikipedia.org/wiki/JIS_X_0201
https://ja.wikipedia.org/wiki/JIS_X_0208
https://ja.wikipedia.org/wiki/JIS%E6%BC%A2%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89
http://www.asahi-net.or.jp/~EK5Y-NSMR/ref-ascii.htm
http://www.asahi-net.or.jp/~ax2s-kmtn/ref/jisx0208.html#level1
http://www.snap-tck.com/room03/c02/cg/cg05_01.html


# 似たような記事

良ければこちらもどうぞ。

- [在留カード等に格納されたデータを紹介してみる](https://qiita.com/ikazayim/items/0afe13e618f91fe1d4db)
- [ICパスポートに格納されたデータを紹介してみる](https://qiita.com/ikazayim/items/dea2ac2aabedd96535ce)