Online Store

مكتبة uFCoder دعم وثائق السفر المقروءة آليا (MRTD)

مقدمة #

تم تنفيذ دعم قراءة مجموعات البيانات من علامة NFC المضمنة في وثائق السفر المقروءة آليا (MRTDs) ، بما في ذلك جوازات السفر الإلكترونية التي تتوافق مع مواصفات منظمة الطيران المدني الدولي ، في مكتبة uFCoder.

يدعم التنفيذ آلية التحكم في الوصول الأساسي (BAC) للوصول إلى شريحة NFC. يتيح BAC المصادقة وقناة اتصال تشفير آمنة مع علامة NFC مضمنة في MRTD. يعتمد BAC بحتة على التشفير المتماثل باستخدام خوارزمية 3DES ويتم تنفيذه وفقا لمنظمة الطيران المدني الدولي 9303 ، الجزء 11.

ICAO لتقف علي منظمة الطيران المدني الدولي (https://www.icao.int). مواصفات ICAO 9303 توحيد MRTEDs ، بما في ذلك جوازات السفر الإلكترونية. يمكنك العثور على سلسلة ICAO Doc 9303 بأكملها على موقع الويب الخاص https://www.icao.int/publications/pages/publication.aspx?docnum=9303.

يتم دعم التحكم في الوصول الأساسي MRTDs في مكتبة uFCoder من الإصدار 5.0.12.

من أجل المصادقة على علامة NFC المضمنة في MRTD أولا ، يجب عليك تمرير رقم المستند وتاريخ ميلاد حامل المستند وتاريخ انتهاء صلاحية المستند ليعمل MRTD_MRZDataToMRZProtoKey() من أجل الحصول على "مفتاح proto" الذي سيتم اشتقاق مفاتيح الأمان الضرورية الأخرى منه. يتم ترميز جميع البيانات اللازمة للحصول على "مفتاح أولي" (رقم المستند وتاريخ ميلاد حامل المستند وتاريخ انتهاء صلاحية المستند) في منطقة القراءة الآلية (MRZ) بحيث تحتوي المكتبة على وظيفة MRTD_MRZSubjacentToMRZProtoKey () والتي يمكن استدعاؤها بدلا من MRTD_MRZDataToMRZProtoKey(). تقبل هذه الدالة سلسلة منتهية فارغة تحتوي على صف subjacent من المستند MRZ.تعرض لقطة الشاشة أدناه مثالا على MRZ مع صف subjacent ملحوظ وهو المحتوى الذي يجب عليك تمريره كمعلمة لتعمل MRTD_MRZSubjacentToMRZProtoKey().

جواز السفر الإلكتروني MRZ

وظائف مكتبة دعم MRTD #

MRTD_MRZDataToMRZProtoKey #

وصف الوظيفة

من أجل الحصول على MRZ Proto Key المطلوب في الخطوات اللاحقة ، يمكنك استدعاء هذه الوظيفة وتمريرها سلاسل فارغة تحتوي على رقم المستند وتاريخ ميلاد حامل المستند وتاريخ انتهاء صلاحية المستند. بعد تنفيذ الوظيفة بنجاح ، سيتم تخزين MRZ Proto Key في صفيف mrz_proto_key 25 بايت.

إعلان وظيفة (لغة C)

UFR_STATUS MRTD_MRZDataToMRZProtoKey (const char *doc_number ،

كونست شار *date_of_birth,

const char *date_of_expiry,

uint8_t mrz_proto_key[25]) ؛

معلمات

doc_number المؤشر إلى سلسلة منتهية فارغة تحتوي على رقم مستند مكون من 9 أحرف بالضبط.
date_of_birth المؤشر إلى سلسلة منتهية فارغة تحتوي بالضبط على 6 أحرف تمثل تاريخ الميلاد بتنسيق "YYMMDD".
date_of_expiry المؤشر إلى سلسلة منتهية فارغة تحتوي بالضبط على 6 أحرف تمثل تاريخ انتهاء الصلاحية بتنسيق "YYMMDD".
mrz_proto_key ستحتوي صفيف البايت هذا على مفتاح MRZ الأولي المحسوب بعد تنفيذ الوظيفة بنجاح. يجب أن يكون هذا الصفيف قد خصص 25 بايت على الأقل قبل استدعاء هذه الوظيفة.

 

MRTD_MRZSubjacentToMRZProtoKey #

وصف الوظيفة

من أجل الحصول على MRZ Proto Key المطلوب في الخطوات اللاحقة ، في حالة تنسيق TD3 MRZ (88 حرفا بالكامل) ، يمكنك استدعاء هذه الوظيفة وتمريرها سلسلة منتهية فارغة تحتوي على صف MRZ subjacent. مثال على تنسيق TD3 MRZ المطبوع على مستند eMRTD يبدو كما يلي:

P<UTOERIKSSON<<ANNA<MARIA<<<<<<<<<<<<<<<<<<<

L898902C36UTO7408122F1204159ZE184226B<<<<<10

يجب أن تتلقى هذه الوظيفة مؤشرا إلى سلسلة منتهية فارغة تحتوي على صف MRZ subjacent ، أي "L898902C36UTO7408122F1204159ZE184226B<<<<<10".

إعلان الوظيفة (لغة C)

UFR_STATUS MRTD_MRZSubjacentToMRZProtoKey (كونست شار * MRZ ، uint8_t mrz_proto_key[25]) ؛

معلمات  
مرز المؤشر إلى سلسلة منتهية فارغة تحتوي على بيانات MRZ. وفقا ل ICAO Doc 9303-10 ، حيث يحتوي على ثلاثة تنسيقات بيانات MRZ: تنسيقات TD1 أو TD2 أو TD3. يحتوي TD1 على 90 حرفا بالضبط ، ويحتوي TD2 على 72 حرفا بالضبط ويحتوي TD3 على 88 حرفا بالضبط.
mrz_proto_key ستحتوي صفيف البايت هذا على مفتاح MRZ الأولي المحسوب بعد تنفيذ الوظيفة بنجاح. يجب أن يكون هذا الصفيف قد خصص 25 بايت على الأقل قبل استدعاء هذه الوظيفة.

MRTDAppSelectAndAuthenticateBac #

وصف الوظيفة

استخدم هذه الوظيفة للمصادقة على علامة eMRTD NFC باستخدام BAC. تنشئ هذه الوظيفة قناة آمنة للاتصال. يتم الحفاظ على قناة الأمان باستخدام المعلمة send_sequence_cnt . مفاتيح جلسة القناة هي ksenc (للتشفير) و ksmac (لحساب MAC).

إعلان الوظيفة (لغة C)

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

uint8_t كسماك[16] ،

uint64_t * send_sequence_cnt) ؛

معلمات

mrz_proto_key تم الحصول على مفتاح MRZ الأولي باستخدام المكالمة السابقة إلى وظيفة MRTD_MRZDataToMRZProtoKey() أو MRTD_MRZSubjacentToMRZProtoKey()
كسنك يجب أن يكون هذا الصفيف قد خصص 16 بايت على الأقل قبل استدعاء هذه الوظيفة.ستحتوي هذه المصفوفة على مفتاح تشفير الجلسة بعد تنفيذ الوظيفة بنجاح
كسماك يجب أن تكون هذه المصفوفة قد خصصت 16 بايت على الأقل قبل calli هذه الوظيفة.ستحتوي هذه المصفوفة على مفتاح جلسة لحساب MAC بعد تنفيذ الوظيفة بنجاح.
send_sequence_cnt بعد التنفيذ الناجح لهذه الدالة، يجب حفظ المؤشر إلى قيمة 64 بت هذه وإعادة توجيهه عند كل استدعاء لاحق إلى MRTDFileReadBacToHeap() و/أو وظائف أخرى لقراءة eMRTD

MRTDFileReadBacToHeap #

وصف الوظيفة

استخدم هذه الوظيفة لقراءة الملفات من علامة eMRTD NFC. يمكنك استدعاء هذه الوظيفة فقط بعد إنشاء قناة أمان بنجاح بواسطة ما تم استدعاؤه مسبقا

MRTDAppSelectAndAuthenticateBac() وظيفة. يتم الحصول على مفاتيح الجلسة ksenc و ksmac ، وكذلك send_sequence_cnt المعلمات من قبل ما يسمى سابقا

MRTDAppSelectAndAuthenticateBac() وظيفة. بعد الاستدعاء الناجح لهذه الوظيفة ، يشير * الإخراج إلى بيانات الملف المقروءة من ملف eMRTD المحدد بواسطة المعلمة file_index. يتم تخصيص المخزن المؤقت ، الذي يتم تخزين البيانات فيه ، تلقائيا على كومة الذاكرة المؤقتة أثناء تنفيذ الوظيفة. يمكن أن يكون الحد الأقصى لمقدار البيانات المخصصة 32 كيلوبايت. هناك مسؤولية المبرمج لتنظيف البيانات المخصصة (أي عن طريق استدعاء free() ، وظيفة C القياسية) بعد الاستخدام.

إعلان الوظيفة (لغة C)

UFR_STATUS MRTDFileReadBacToHeap(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.هذان البايتان هما تعريف الملف (FID) وهناك قائمة ب FIDs:

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}

*الناتج بعد الاستدعاء الناجح لهذه الدالة، يشير هذا المؤشر إلى بيانات الملف المقروءة من ملف eMRTD المحدد بواسطة المعلمة file_index. يتم تخصيص المخزن المؤقت ، الذي يتم تخزين البيانات فيه ، تلقائيا أثناء تنفيذ الوظيفة. يمكن أن يكون الحد الأقصى لمقدار البيانات المخصصة 32 كيلوبايت. هناك مسؤولية المبرمج لتنظيف البيانات المخصصة (أي عن طريق استدعاء free() ، وظيفة C القياسية) بعد الاستخدام.
output_length بعد الاستدعاء الناجح لهذه الدالة، يشير هذا المؤشر إلى حجم بيانات الملف المقروءة من ملف eMRTD المحدد بواسطة المعلمة file_index.
كسنك تم الحصول على مفتاح تشفير الجلسة باستخدام استدعاء مسبق إلى وظيفة MRTDAppSelectAndAuthenticateBac().
كسماك مفتاح الجلسة لحساب MAC المكتسب باستخدام استدعاء مسبق لوظيفة MRTDAppSelectAndAuthenticateBac().
send_sequence_cnt يجب أن يشير هذا المؤشر إلى قيمة 64 بت تمت تهيئتها بواسطة
مكالمة ناجحة إلى وظيفة MRTDAppSelectAndAuthenticateBac() . يجب حفظ المؤشر إلى قيمة 64 بت هذه وإعادة توجيهه عند كل استدعاء لاحق لهذه الوظيفة و / أو الوظائف الأخرى المستخدمة لقراءة eMRTD.

uint64_t * send_sequence_cnt) ؛

 

مثال على جواز السفر الإلكتروني MRTD #

يمكنك تنزيل هذا المثال من:

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

أو استنساخ مشروع Eclipse CDT بأكمله باستخدام:

استنساخ git – https://www.d-logic.com/code/nfc-rfid-reader-sdk/ufr-examples-ePassport_mrtd.git العودية

الامر.

إذا كنت تريد التشغيل السريع فقط ، فقم بتنزيل المشروع وابدأ الملف التنفيذي الثنائي من المجلد المناسب:

  • للحصول على ويندوز 32 بت بدء تشغيل win32_releaserun_me.cmd
  • للحصول على ويندوز 64 بت بدء تشغيل win64_releaserun_me.cmd
  • لبدء تشغيل Linux 32 بت linux32_release/ePassport_mrtd
  • لبدء تشغيل Linux 64 بت linux64_release/ePassport_mrtd.

يتطلب مثال البرنامج توصيل جهاز قارئ uFR وتكوينه بجهاز الكمبيوتر. يجب ألا يتم تشغيل أي تطبيق أو خدمة أخرى تستخدم قارئ uFR على الكمبيوتر. بعد البداية الناجحة ل "ePassport MRTD Example" ، يبدأ البرنامج الرئيسي كما هو موضح أدناه.

قارئ جواز السفر الإلكتروني MRTD NFC

<">الآن ، يجب عليك اختيار أحد خيارين" M "أو" P "كما هو مذكور في تعليمات استخدام التطبيق على الشاشة.

إذا اخترت الخيار "M" ، فستتم مطالبتك بنص:

لقد اخترت إدخال صف MRZ الفرعي الموجود ضمن "P<XXXSURNAME<<FIRSTNAME<<<<<<<<<<<<<<<<<<<<<":

أدخل صف MRZ المجاور. يجب أن يتكون صف MRZ الفرعي من 44 حرفا.

حتى أدخل صف MRZ subjacent. مثال على صف MRZ subjacent يمكن أن نرى في الصورة الأولى.

بخلاف ذلك ، إذا اخترت الخيار "P" ، فستتم مطالبتك بنص:

لقد اخترت إدخال رقم المستند وتاريخ الميلاد وتاريخ انتهاء الصلاحية بشكل منفصل:

أدخل رقم المستند. يجب أن يتكون رقم المستند من 9 أحرف.

_________ …

أدخل تاريخ الميلاد. يجب أن يكون تنسيق التاريخ YYMMDD.

______ …

أدخل تاريخ انتهاء الصلاحية. يجب أن يكون تنسيق التاريخ YYMMDD.

______ …

لذا أدخل البيانات بالتنسيق المناسب.

بعد إدخال البيانات الصحيحة ، سيبلغك التطبيق برسالة:

تم تعيين مفتاح MRZ الأولي بنجاح.

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

بعد هذه الرسالة ، يمكنك متابعة عمليات القراءة على علامة NFC المضمنة في جواز السفر الإلكتروني الذي تنتمي إليه البيانات التي أدخلتها مسبقا.

الآن يمكنك وضع جواز السفر في حقل قارئ uFR. عند إنشاء اتصال ناجح ، ستحصل على معلومات أساسية حول علامة NFC في حقل القارئ. علي سبيل المثال:

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

نوع العلامة: DL_GENERIC_ISO14443_4 ، ساك = 0x??, uid[4] = ??:??:????

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

SAK و UID في هذا المثال ملثمان ويمكن أن يكون لهما أي قيمة تعسفية. سيتم دائما التعرف على جوازات السفر الإلكترونية مثل نوع العلامة DL_GENERIC_ISO14443_4.

الآن يمكنك اختيار خيارات قراءة التطبيق:

"C" – يقرأ هذا الخيار البيانات الشائعة (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 قائمة مجموعات البيانات التي يحتوي عليها جواز السفر الإلكتروني. فقط DG1 و DG2 إلزاميان. يمكن أن تكون جميع مجموعات البيانات الأخرى إما موجودة أو غير موجودة في MRTD معين.

'S' – يقرأ هذا الخيار كائن أمان المستند (EF. SO elementary file) ويحفظه في الملف الثنائي الذي يجب عليك إدخاله عند المطالبة. يحتوي كائن أمان المستند على توقيع رقمي بتنسيق PKCS#7CMSالقياسي. وجود EF. لذلك على MRTD إلزامي.

د

'1'– يقرأ هذا الخيار EF. DG1 ، قم بتحليلها وعرض البيانات الأولية والمحللة بالتنسيق التالي:

إي أف. تمت قراءة DG1 بنجاح. طول الملف هو ؟؟ بايت

البيانات الأولية:

61 xx xx xx

  1. xx xx xx xx xx  

تحليل بسيط ل EF. البيانات الأولية DG1:

رمز الوثيقة: P (جواز السفر الإلكتروني)

الدولة أو المنظمة المصدرة: ???

اسم حاملها: اللقب FIRST_NAME

رقم الوثيقة: ?????????

جنسية:؟؟؟

تاريخ الميلاد (اليوم.شهر.سنة): ??.??.????.

جنس:؟؟؟؟

تاريخ انتهاء الصلاحية (اليوم.شهر.سنة): ??.??.????.

البيانات الاختيارية: ??????????????

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

البيانات الأولية في هذا المثال مقنعة ويمكن أن يكون لها أي قيمة تعسفية. كانت علامة البيانات الأولية فقط موجودة وستكون دائما هي نفسها (0x61). عندما تقرأ المستند الخاص بك ، ستحصل على بياناته الأولية الفعلية هنا.

"2" – يقرأ هذا الخيار EF. DG2 وحفظه في الملف الثنائي الذي المسار والاسم الذي يجب عليك إدخاله عند المطالبة. إي أف. يحتوي DG2 على صورة وجه حامل المستندات وهو إلزامي. إي أف. يمكن أن يحتوي DG2 بجانب صورة الوجه على ميزات الوجه البيومترية أيضا. المزيد عن إي أف. محتوى DG2 يمكنك قراءته في وثيقة ICAO 9303 ، الجزء 10.

"أنا" – يقرأ هذا الخيار EF. DG2 إلى. في هذه الحالة ، يتم استخراج صورة الوجه فقط من ملف MRTD وحفظها في الملف الذي المسار والاسم الذي أدخلته. يتم اكتشاف تنسيق الصورة تلقائيا ويتم تعيين امتداد الملف وفقا له. هناك نوعان من تنسيقات ملفات الصور الممكنة المحددة لهذا السياق: JPEG أو JP2 (أي .jpeg 2000).

"D" – يقرأ هذا الخيار أيا من مجموعة البيانات الأولية (EF. DG) من MRTD ويحفظه في الملف الثنائي الذي المسار والاسم الذي يجب عليك إدخاله عند المطالبة. بعد اختيار هذا الخيار، ستتم مطالبتك باختيار EF. مؤشر DG. يمكن أن يكون المؤشر من النطاق 1 إلى 16 (على سبيل المثال 1 ل EF. DG1 و 14 ل EF. DG14). يجب إدراج الملف الأولي الذي تريد قراءته في قائمة مجموعات البيانات EF.COM.

تتطلب قراءة بعض الملفات الأولية الاختيارية ، خاصة تلك التي تحتوي على بيانات بيومترية ، آليات أمان خاصة خارج نطاق هذا المستند.

الإصدار الحالي من "ePassport MRTD Example" هو 1.0 ويعتمد على إصدار مكتبة uFCoder 5.0.12 وإصدار البرنامج الثابت uFR 5.0.22.