mdoc / mDL: ISO 18013-5 モバイル運転免許証
mdoc(Mobile Document)は ISO 18013-5 で定義されたモバイル運転免許証(mDL: mobile Driving License)のフォーマットです。このドキュメントでは、mdoc の仕組みと構造を解説します。
第1部: 概要編
mdoc とは何か?
mdoc は、モバイルデバイスで管理・提示できるデジタル身分証明書のフォーマットです。主に運転免許証のデジタル化(mDL)に使用されますが、他の ID 文書にも適用可能です。
従来の運転免許証:
┌──────────────────────────────── ─────┐
│ プラスチックカード │
│ │
│ [写真] 氏名: 山田太郎 │
│ 生年月日: 1990/1/1 │
│ 住所: 東京都... │
│ 有効期限: 2029/1/1 │
│ │
│ 問題: │
│ - コピー・偽造リスク │
│ - オンラインで使えない │
│ - 全情報を見せる必要がある │
└─────────────────────────────────────┘
mdoc (mDL):
┌─────────────────────────────────────┐
│ スマートフォンアプリ │
│ │
│ [デジタル署名付きデータ] │
│ │
│ メリット: │
│ ✓ 暗号署名で改ざん防止 │
│ ✓ オンライン・オフライン対応 │
│ ✓ 選択的開示(年齢だけ等) │
│ ✓ NFC/BLE で近接提示 │
└─────────────────────────────────────┘
ISO 18013 シリーズ
| 規格 | 内容 |
|---|---|
| ISO 18013-1 | 運転免許証の物理的特性 |
| ISO 18013-2 | 機械可読部分の仕様 |
| ISO 18013-3 | アクセス制御とセキュリティ |
| ISO 18013-5 | モバイル運転免許証(mDL) |
| ISO 18013-7 | オンライン検証 |
第2部: 詳細編
mdoc の基本構造
mdoc は CBOR(Concise Binary Object Representation)でエンコードされます。
mdoc 構造:
┌─────────────────────────────────────────────────────────────┐
│ mdoc │
├─────────────────────────────────────────────────────────────┤
│ docType: "org.iso.18013.5.1.mDL" │
├─────────────────────────────────────────────────────────────┤
│ issuerSigned: │
│ ├── nameSpaces: │
│ │ "org.iso.18013.5.1": [IssuerSignedItem, ...] │
│ │ "org.iso.18013.5.1.aamva": [...] │
│ │ │
│ └── issuerAuth: COSE_Sign1 (発行者の署名) │
├─────────────────────────────────────────────────────────────┤
│ deviceSigned: (オプション) │
│ ├── nameSpaces: { ... } │
│ └── deviceAuth: COSE_Sign1 または COSE_Mac0 │
└─────────────────────────────────────────────────────────────┘
CBOR とは
CBOR は JSON のバイナリ版のようなフォーマットです。
JSON:
{
"name": "John",
"age": 30
}
CBOR (16進数表記):
A2 # map(2)
64 # text(4)
6E616D65 # "name"
64 # text(4)
4A6F686E # "John"
63 # text(3)
616765 # "age"
18 1E # unsigned(30)
| 特徴 | JSON | CBOR |
|---|---|---|
| フォーマット | テキスト | バイナリ |
| サイズ | 大きい | コンパクト |
| パース速度 | 遅い | 速い |
| バイナリデータ | Base64 エンコード必要 | ネイティブサポート |
名前空間とデータ要素
mdoc はデータを名前空間で整理します。
標準名前空間: org.iso.18013.5.1
| データ要素 | 説明 |
|---|---|
family_name | 姓 |
given_name | 名 |
birth_date | 生年月日 |
issue_date | 発行日 |
expiry_date | 有効期限 |
issuing_country | 発行国 |
issuing_authority | 発行機関 |
document_number | 文書番号 |
portrait | 顔写真(バイナリ) |
driving_privileges | 運転区分 |
un_distinguishing_sign | 国際識別記号 |
age_over_18 | 18歳以上か |
age_over_21 | 21歳以上か |
nationality | 国籍 |
resident_address | 住所 |
sex | 性別 |
拡張名前空間
各国・地域で追加の名前空間を定義可能。
米国 (AAMVA):
org.iso.18013.5.1.aamva
- DHS_compliance
- veteran_indicator
- organ_donor
- ...
日本:
org.iso.18013.5.1.jp
- (定義される場合)
IssuerSignedItem
各データ要素は以下の構造で署名されます。
IssuerSignedItem:
┌─────────────────────────────────────┐
│ digestID: 0 │ 識別子
│ random: h'8E4D...2A1F' │ ソルト(16バイト以上)
│ elementIdentifier: "family_name" │ 要素名
│ elementValue: "山田" │ 値
└─────────────────────────────────────┘
選択的開示の仕組み
発行時:
発行者は各 IssuerSignedItem のダイジェスト(ハッシュ)を計算し、
MSO(Mobile Security Object)に含めて署名
MSO.valueDigests:
"org.iso.18013.5.1": {
0: h'A1B2C3...', // family_name のダイジェスト
1: h'D4E5F6...', // given_name のダイジェスト
2: h'789ABC...', // birth_date のダイジェスト
...
}
提示時:
保持者は開示したい IssuerSignedItem のみを送信
検証者はダイジェストを再計算して MSO と照合
例: 年齢確認のみ
送信: IssuerSignedItem(age_over_21: true)
検証: ダイジェストが MSO.valueDigests[X] と一致 → 有効
Mobile Security Object (MSO)
MSO は mdoc の整合性を保証する署名付きオブジェクトです。
MSO 構造:
{
"version": "1.0",
"digestAlgorithm": "SHA-256",
"valueDigests": {
"org.iso.18013.5.1": {
0: h'...', // digestID 0 のダイジェスト
1: h'...', // digestID 1 のダイジェスト
...
}
},
"deviceKeyInfo": {
"deviceKey": {
"kty": "EC2",
"crv": "P-256",
"x": h'...',
"y": h'...'
}
},
"docType": "org.iso.18013.5.1.mDL",
"validityInfo": {
"signed": "2024-01-01T00:00:00Z",
"validFrom": "2024-01-01T00:00:00Z",
"validUntil": "2029-01-01T00:00:00Z"
}
}