Online Store

uFCoder ライブラリの機械読み取り可能な渡航文書 (MRTD) のサポート

紹介 #

ICAO仕様に準拠したeパスポートを含む、機械可読渡航文書(MRTD)に埋め込まれたNFCタグからのデータグループの読み取りのサポートがuFCoderライブラリに実装されました。

この実装では、NFC チップ アクセスの基本アクセス制御 (BAC) メカニズムがサポートされています。 BAC は、MRTD に埋め込まれた NFC タグを使用して、認証とセキュリティで保護された暗号化通信チャネルを有効にします。 BACは、3DESアルゴリズムを使用した対称暗号化のみに基づいており 、ICAO 9303、パート11に従って実装されています。

ICAO は 国際民間航空機関 (https://www.icao.int) を表します。 ICAO 9303 仕様は、eパスポートを含む MRTD を標準化しています。 ICAO Doc 9303シリーズ全体は 、https://www.icao.int/publications/pages/publication.aspx?docnum=9303Webの場所で見つけることができます。

MRTD の基本アクセス制御は、バージョン 5.0.12 以降の uFCoder ライブラリでサポートされています。

最初にMRTDに埋め込まれたNFCタグを認証するには、ドキュメント番号、ドキュメントホルダーの生年月日、およびドキュメントの有効期限を関数MRTD_MRZDataToMRZProtoKey()に渡して、他の必要なセキュリティキーの派生元となる「プロトタイプキー」を取得する必要があります。 「プロトキー」(文書番号、文書所有者の生年月日、文書の有効期限)を取得するために必要なすべてのデータは、機械可読ゾーン(MRZ)でエンコードされているため、ライブラリにはMRTD_MRZDataToMRZProtoKey()の代わりに呼び出すことができるMRTD_MRZSubjacentToMRZProtoKey()関数があります。 この関数は、ドキュメント MRZ のサブジャセント行を含む null で終わる文字列を受け入れます。以下のスクリーンショットは、関数 MRTD_MRZSubjacentToMRZProtoKey() にパラメーターとして渡す必要があるコンテンツがマークされたサブジャセント行を持つ MRZ の例を示しています。

eパスポートMRZ

MRTD サポート ライブラリ関数 #

MRTD_MRZDataToMRZProtoKey #

機能の説明

以降の手順で必要な MRZ Proto Key を取得するには、この関数を呼び出して、ドキュメント番号、ドキュメント所有者の生年月日、ドキュメントの有効期限を含む null で終わる文字列を渡します。 関数が正常に実行されると、MRZ Proto Key は 25 バイト配列mrz_proto_keyに格納されます。

関数宣言 (C 言語)

UFR_STATUS MRTD_MRZDataToMRZProtoKey(定数文字*doc_number,

定数文字 *date_of_birth,

定数文字 *date_of_expiry,

uint8_t mrz_proto_key[25])。

パラメーター

doc_number 正確に 9 文字のドキュメント番号を含む null で終わる文字列へのポインター。
date_of_birth "YYMMDD" 形式の生年月日を表す正確に 6 文字を含む null で終わる文字列へのポインター。
date_of_expiry "YYMMDD" 形式の有効期限を表す正確に 6 文字を含む null で終わる文字列へのポインター。
mrz_proto_key このバイト配列には、関数が正常に実行された後に計算されたMRZプロトキーが含まれます。 この配列は、この関数を呼び出す前に少なくとも 25 バイトを割り当てておく必要があります。

 

MRTD_MRZSubjacentToMRZProtoKey #

機能の説明

後続の手順で必要な MRZ Proto キーを取得するには、TD3 MRZ 形式 (合計 88 文字長) の場合、この関数を呼び出して、MRZ サブジャセント行を含む null で終わる文字列を渡します。 eMRTD ドキュメントに出力される TD3 MRZ 形式の例を次に示します。

P<UTOERIKSSON<<Anna<MARIA<<<<<<<<<<<<<<<<<<<

L898902C36UTO7408122F1204159ZE184226B<<<<<10

この関数は、MRZ サブジャセント行を含む null で終わる文字列、つまり "L898902C36UTO7408122F1204159ZE184226B<<<<<10" へのポインターを受け取る必要があります。

関数宣言 (C 言語)

UFR_STATUS MRTD_MRZSubjacentToMRZProtoKey(const char *mrz, uint8_t mrz_proto_key[25]);

パラメーター  
ティッカー MRZ データを含む null で終わる文字列へのポインター。 ICAO Doc 9303-10によると、TD1、TD2、またはTD3形式の3つのMRZデータ形式があります。 TD1 には正確に 90 文字、TD2 には正確に 72 文字、TD3 には正確に 88 文字が含まれます。
mrz_proto_key このバイト配列には、関数が正常に実行された後に計算されたMRZプロトキーが含まれます。 この配列は、この関数を呼び出す前に少なくとも 25 バイトを割り当てている必要があります。

MRTDAppSelectAndAuthenticateBac #

機能の説明

この関数を使用して、BAC を使用して eMRTD NFC タグを認証します。 この関数は、通信用のセキュリティで保護されたチャネルを確立します。 セキュリティ チャネルは、 send_sequence_cnt パラメーターを使用して維持されます。 チャネルセッションキーは、 ksenc (暗号化用) と ksmac (MAC の計算用) です。

関数宣言 (C 言語)

UFR_STATUS MRTDAppSelectAndAuthenticateBac(const uint8_t mrz_proto_key[25], uint8_t ksenc[16],

uint8_t ksmac[16]、

uint64_t *send_sequence_cnt);

パラメーター

mrz_proto_key MRTD_MRZDataToMRZProtoKey() または MRTD_MRZSubjacentToMRZProtoKey() 関数の以前の呼び出しを使用して取得された MRZ プロトキー
クセンク この配列は、この関数を呼び出す前に少なくとも 16 バイトを割り当てている必要があります。この配列には、関数が正常に実行された後のセッション暗号化キーが含まれます
クスマック この配列は、この関数をcalliする前に少なくとも16バイトを割り当てている必要があります。この配列には、関数が正常に実行された後にMACを計算するためのセッションキーが含まれます。
send_sequence_cnt この関数が正常に実行されたら、この 64 ビット値へのポインターを保存し、MRTDFileReadBacToHeap() や eMRTD を読み取るための他の関数を呼び出すたびに転送する必要があります。

MRTDファイル読み取りバックトヒープ #

機能の説明

この関数を使用して、eMRTD NFC タグからファイルを読み取ります。 この関数は、以前に呼び出されたセキュリティチャネルが正常に確立された後にのみ呼び出すことができます。

MRTDAppSelectAndAuthenticateBac() 関数。 セッションキーksencとksmac、およびパラメータsend_sequence_cntは、以前に呼び出された

MRTDAppSelectAndAuthenticateBac() 関数。 この関数が正常に呼び出されると、*output は、file_index パラメーターで指定された eMRTD ファイルから読み取られたファイル データを指します。 データが格納されるバッファは、関数の実行中にメモリヒープに自動的に割り当てられます。 割り当てられるデータの最大量は 32 KB です。 使用後に割り当てられたデータをクリーンアップする(つまり、標準のC関数であるfree()を呼び出すことによって)プログラマーの責任があります。

関数宣言 (C 言語)

UFR_STATUS MRTDファイルReadBacToHeap(const uint8_t *file_index,

uint8_t **出力、

uint32_t *output_length、

const uint8_t ksenc[16],

const uint8_t ksmac[16],

パラメーター

file_index

eMRTD から読み取るファイルを指定するパラメーター。 これは、eMRTD ファイルを指定する正確に 2 バイトを含むバイト配列へのポインターです。これらの 2 バイトはファイル識別 (FID) であり、FID のリストがあります。

EF.COM = {0x01, 0x1E}
エフ。DG1 = {0x01, 0x01}
エフ。DG2 = {0x01, 0x02}
エフ。DG3 = {0x01, 0x03}
エフ。DG4 = {0x01, 0x04}
エフ。DG5 = {0x01, 0x05}
エフ。DG6 = {0x01, 0x06}
エフ。DG7 = {0x01, 0x07}
エフ。DG8 = {0x01, 0x08}
エフ。DG9 = {0x01, 0x09}
エフ。DG10 = {0x01, 0x0A}
エフ。DG11 = {0x01, 0x0B}
エフ。DG12 = {0x01, 0x0C}
エフ。DG13 = {0x01, 0x0D}
エフ。DG14 = {0x01, 0x0E}
エフ。DG15 = {0x01, 0x0F}
エフ。DG16 = {0x01, 0x10}
エフ。SOD = {0x01, 0x1D}

*アウトプット この関数が正常に呼び出されると、このポインターは、file_index パラメーターで指定された eMRTD ファイルから読み取られたファイル データを指します。 データが格納されるバッファは、関数の実行中に自動的に割り当てられます。 割り当てられるデータの最大量は 32 KB です。 使用後に割り当てられたデータをクリーンアップする(つまり、標準のC関数であるfree()を呼び出すことによって)プログラマーの責任があります。
output_length この関数が正常に呼び出された後、このポインターは、file_index パラメーターで指定された eMRTD ファイルから読み取られたファイル データのサイズを指します。
クセンク MRTDAppSelectAndAuthenticateBac() 関数の以前の呼び出しを使用して取得されたセッション暗号化キー。
クスマック MRTDAppSelectAndAuthenticateBac() 関数の以前の呼び出しを使用して取得した MAC を計算するためのセッション キー。
send_sequence_cnt このポインターは、以前に
初期化された 64 ビット値を指す必要があります。
MRTDAppSelectAndAuthenticateBac() 関数の呼び出しに成功しました。 この 64 ビット値へのポインターは、この関数や eMRTD の読み取りに使用される他の関数への後続の呼び出しごとに保存および転送する必要があります。

uint64_t *send_sequence_cnt);

 

eパスポートのMRTDの例 #

この例は、次の場所からダウンロードできます。

https://www.d-logic.com/code/nfc-rfid-reader-sdk/ufr-examples-ePassport_mrtd.git

または、以下を使用して Eclipse CDT プロジェクト全体のクローンを作成します。

git clone — 再帰的な https://www.d-logic.com/code/nfc-rfid-reader-sdk/ufr-examples-ePassport_mrtd.git

コマンドを実行します。

クイック実行のみが必要な場合は、プロジェクトをダウンロードし、適切なフォルダーからバイナリ実行可能ファイルを起動します。

  • 32 ビット Windows の場合は、win32_releaserun_me.cmd を起動します
  • 64 ビット Windows の場合は、win64_releaserun_me.cmd を起動します
  • 32ビットLinuxの場合はlinux32_release/ePassport_mrtdを起動します
  • 64ビットLinuxの場合は、linux64_release/ePassport_mrtdを起動します。

ソフトウェアの例では、uFRリーダーデバイスをPCに接続して構成する必要があります。 uFR リーダーを使用する他のアプリケーションまたはサービスをコンピューターで実行しないでください。 「eパスポートMRTDの例」が正常に開始されると、ソフトウェアは以下に示すようにメインの多くを起動します。

電子パスポートリーダーMRTD NFC

<">ここで、画面上のアプリケーションの使用方法に記載されている「M」または「P」オプションのいずれかを選択する必要があります。

「M」オプションを選択した場合は、テキストが表示されます。

'P<XXX姓<<名<<<<<<<<<<<<<<<<<<<<<' の下にあるサブジャセント MRZ 行を入力することを選択しました。

サブジャセント MRZ 行を入力します。 サブジャセント MRZ 行の長さは 44 文字でなければなりません。

したがって、サブジャセントMRZ行を入力します。 サブジャセントMRZ行の例は、最初の画像で確認できます。

それ以外の場合、「P」オプションを選択すると、テキストが表示されます。

ドキュメント番号、生年月日、有効期限を個別に入力することを選択しました。

伝票番号を入力します。 ドキュメント番号は 9 文字の長さにする必要があります。

_________ …

生年月日を入力します。 日付形式は YYMMDD でなければなりません。

______ …

有効期限を入力します。 日付形式は YYMMDD でなければなりません。

______ …

したがって、適切な形式でデータを入力します。

有効なデータを入力すると、アプリケーションは次のメッセージで通知します。

MRZ プロトタイプキーが正常に設定されました。

——————————————————————-

このメッセージの後、以前に入力したデータが属するePassportに埋め込まれたNFCタグの読み取り操作を続行できます。

これで、パスポートをuFRリーダーフィールドに入力できます。 通信が成功すると、リーダーフィールドにNFCタグに関する基本情報が表示されます。 たとえば、次のようになります。

——————————————————————-

タグの種類: DL_GENERIC_ISO14443_4, sak = 0x??, uid[4] = ??:??:????

——————————————————————-

この例の SAK と UID はマスクされており、任意の値を持つことができます。eパスポートは常にタグタイプと同様に認識DL_GENERIC_ISO14443_4。

これで、アプリケーションの読み取りオプションを選択できます。

'C' – このオプションは、eパスポートから共通データ (EF.COM 基本ファイル) を読み込みます。 読み取りが成功すると、データが解析され、次の形式で表示されます。

EF.COM 正常に読み取られました。 ファイルの長さは??バイト

生データ: 60 xx xx xx xx

EF.COM 生データの解析:

LDSバージョンは01.07です

ユニコードのバージョンは04.00.00です

既存のデータグループリスト:

見つかった: EF.DG1

見つかった: EF.DG2

見つかった: EF.DG3

見つかった: EF.DG14

——————————————————————-

この例の生データはマスクされており、任意の値を持つことができます。 生データタグのみが存在し、常に同じ(0x60)になります。 自分のドキュメントを読むと、実際の生データがここに表示されます。 LDSバージョンとUNICODEバージョンの詳細については 、ICAO 9303、パート10のドキュメントを参照してください。

LDS および UNICODE のバージョンの後には、eパスポートに含まれるデータグループリストが続きます。 DG1 と DG2 のみが必須です。 他のすべてのデータ グループは、特定の MRTD に存在することも、存在しないこともできます。

'S' – このオプションは、ドキュメント セキュリティ オブジェクト (EF.SOエレメンタリーファイル)をクリックし、プロンプトが表示されたときに入力する必要のあるパスと名前をバイナリファイルに保存します。 文書セキュリティー・オブジェクトには、標準 PKCS#7CMS形式のデジタル署名が含まれています。 EFの存在。したがって、MRTDは必須です。

D

'1'– このオプションは EF を読み取ります。DG1 を解析し、生データと解析済みデータを次の形式で表示します。

エフ。DG1 が正常に読み取られました。 ファイルの長さは??バイト

生データ:

61 xx xx xx xx xx

  1. xx xx xx xx  

EFの単純な解析。DG1 生データ:

文書コード:P(電子パスポート)

発行国または組織: ???

所有者の名前:姓FIRST_NAME

書類番号: ?????????

国籍:。。。

生年月日: ??.??.????.

性:。。。。

有効期限 (dd.MM.yyyy.): ??.??.????.

オプションのデータ: ??????????????

——————————————————————-

この例の生データはマスクされており、任意の値を持つことができます。 生データタグのみが存在し、常に同じ(0x61)になります。 自分のドキュメントを読むと、実際の生データがここに表示されます。

'2' – このオプションは EF を読み取ります。DG2を選択し、プロンプトが表示されたときに入力する必要があるパスと名前をバイナリファイルに保存します。 エフ。DG2にはドキュメントホルダーの顔画像が含まれており、必須です。 エフ。顔画像の横にあるDG2には、生体認証の顔の特徴も含まれている可能性があります。 EF についての詳細。DG2コンテンツは 、ICAO 9303、パート10ドキュメントで読むことができます。

'I' – このオプションは EF を読み取ります。DG2 に。 この場合、顔画像のみが MRTD ファイルから抽出され、入力したパスと名前がファイルに保存されます。 画像形式が自動的に検出され、それに従ってファイル拡張子が設定されます。 このコンテキストでは、JPEGまたはJP2(つまり.jpeg 2000)の2つの画像ファイル形式が定義されています。

'D' – このオプションは、基本データグループ (EF.DG) ファイルを MRTD から取得し、プロンプトが表示されたときに入力する必要があるパスと名前をバイナリ ファイルに保存します。 このオプションを選択すると、EF の入力を求められます。DGインデックス。 インデックスの範囲は 1 から 16 です (例: EF.EF の場合は DG1 および 14。DG14)。 読み取る基本ファイルは、EF.COM データグループリストにリストされている必要があります。

一部のオプションの基本ファイル、特に生体認証データを含むファイルの読み取りには、このドキュメントの範囲外の特別なセキュリティメカニズムが必要です。

「eパスポートMRTDの例」の現在のバージョンは1.0で、uFCoderライブラリバージョン5.0.12およびuFRファームウェアバージョン5.0.22に依存します。