รูปแบบออบเจ็กต์ที่เข้ารหัส

ข้อมูลประจำตัว

อุปกรณ์ Android จะใช้ข้อมูลเข้าสู่ระบบข้อมูลประจำตัว เพื่อจัดการข้อมูลเข้าสู่ระบบในอุปกรณ์อย่างปลอดภัย ข้อมูลประจำตัว ไลบรารีมีฟีเจอร์ความปลอดภัยหลายอย่างที่ผู้ออกบัตรควรใช้ เพื่อให้แน่ใจว่าการผสานรวมกับ Google นั้นมีความปลอดภัยสูงสุด

Nonce ที่ลงนาม

คลังข้อมูลเข้าสู่ระบบข้อมูลประจำตัวใช้ "คำท้า" (ซึ่งใน API นี้เรียกว่า ค่า Nonce) เมื่อเรียกใบรับรองข้อมูลประจำตัวของอุปกรณ์ โดยส่งไปยังผู้ออกบัตร ใน RegisterDeviceRequest ค่า Nonce นี้มีการลงนามและฝังอยู่ในส่วนขยายเอกสารรับรองของอุปกรณ์ ใบรับรองข้อมูลประจำตัว วิธีนี้ช่วยให้ผู้ออกบัตรมีความเชื่อมั่นในความใหม่ ของใบรับรองและเอกสารรับรอง และเซิร์ฟเวอร์ไม่ได้เล่นซ้ำ ในระหว่างการสื่อสาร

โปรไฟล์การควบคุมการเข้าถึง

โปรไฟล์การควบคุมการเข้าถึงเป็นวิธีสำหรับผู้ออกบัตรในการระบุให้ชัดเจนว่า ต้องการจัดเก็บข้อมูลที่จัดเก็บไว้ในข้อมูลประจำตัวสำหรับป้องกัน ผู้ออกใบรับรองสามารถระบุได้ว่าจำเป็นต้องมีการตรวจสอบสิทธิ์ผู้ใช้เพื่อเข้าถึงข้อมูลหรือไม่ และระยะเวลาที่ผู้ใช้จะตรวจสอบสิทธิ์แล้ว อนาคต (ไม่ใช่ ปัจจุบัน) กรณีการใช้งานของฟีเจอร์นี้รวมถึงการจำกัดผู้อ่าน สามารถเข้าถึงเอลิเมนต์ข้อมูลได้ รายละเอียดเกี่ยวกับวิธีจัดรูปแบบการควบคุมการเข้าถึง โปรไฟล์สามารถพบได้ในรูปแบบออบเจ็กต์ข้อมูลเข้าสู่ระบบ

หลักฐานการจัดสรร

ออบเจ็กต์หลักฐานของการจัดสรรคือวิธีที่ผู้ออกบัตรจะทราบว่า จัดเก็บข้อมูลเข้าสู่ระบบภายในข้อมูลประจำตัวเรียบร้อยแล้ว ผู้ออกบัตรควร ไม่ออก MSO เพื่อขอข้อมูลเข้าสู่ระบบจนกว่าจะได้รับและยืนยันหลักฐานของ การจัดสรร จะมีการระบุออบเจ็กต์นี้เพิ่มเติมในเอกสารประกอบของข้อมูลประจำตัว

รูปแบบวัตถุ

ออบเจ็กต์แต่ละรายการนี้ได้รับการเข้ารหัสจากต้นทางถึงปลายทางระหว่างอุปกรณ์และ ผู้ออกบัตร ดังนั้น เซิร์ฟเวอร์ของ Google ไม่มีความสามารถในการทำให้เป็นมาตรฐาน และออบเจ็กต์บางส่วนเหล่านี้อาจอยู่ในรูปแบบที่ต่างจาก ออบเจ็กต์ API ที่เหลือ เช่น ข้อมูลเข้าสู่ระบบอยู่ในรูปแบบ CBOR แทน JSON กว่า JSON ก็ เป็นไปตามที่คาดไว้ในระดับ Android

ข้อมูลเข้าสู่ระบบ

ข้อมูลเข้าสู่ระบบประกอบด้วยองค์ประกอบข้อมูลและวิธีที่ควรเข้าถึง ทั้งนี้ มีออบเจ็กต์หลัก 2 รายการ ได้แก่ provisionedData และ accessControlProfiles provisionedData มีเนมสเปซทั้งหมดที่เกี่ยวข้องกับแอตทริบิวต์ ซึ่งก็คือ ตัวอย่างเช่น สำหรับใบขับขี่บนอุปกรณ์เคลื่อนที่ จะเป็น org.iso.18013.5.1 และ org.aamva.18013.5.1 รายการและค่าข้อมูล ภายในเนมสเปซจะระบุโปรไฟล์ควบคุมการเข้าถึงที่เกี่ยวข้อง นี่คือ แสดงเป็นรายการรหัส โดยที่รหัสสอดคล้องกับโปรไฟล์ควบคุมการเข้าถึงใน รายการ accessControlProfiles ในตัวอย่างด้านล่าง [0] ในแต่ละข้อมูล รายการหมายถึงโปรไฟล์ควบคุมการเข้าถึงที่มีรหัส 0 ไม่ใช่ดัชนี 0

ด้านล่างเป็นตัวอย่างของรายการข้อมูลแผนที่ CBOR ที่ไม่มีการเข้ารหัส

{
  "provisionedData": {
      "org.iso.18013.5.1": [
          {
              "name": "family_name",
              "value": "Smith",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "given_name",
              "value": "Stewart",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "birth_date",
              "value": {
                  "tag": 1004,
                  "value": "1965-09-01"
              },
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "issue_date",
              "value": {
                  "tag": 1004,
                  "value": "2022-08-01"
              },
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "expiry_date",
              "value": {
                  "tag": 1004,
                  "value": "2027-08-01"
              },
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "issuing_authority",
              "value": "IA",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "issuing_country",
              "value": "US",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "document_number",
              "value": "D04320785",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "portrait",
              "value": {
                  "type": "Buffer",
                  "data": [
                      167,
                      30,
                      148,
                      218,
                      204,
                      75,
                      112,
                      162,
                      138,
                      40,
                      52,
                      63,
                      255
                  ]
              },
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "un_distinguishing_sign",
              "value": "USA",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "driving_privileges",
              "value": [
                  {
                      "expiry_date": {
                          "tag": 1004,
                          "value": "2027-08-01"
                      },
                      "issue_date": {
                          "tag": 1004,
                          "value": "2022-08-01"
                      },
                      "vehicle_category_code": "B"
                  }
              ],
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "sex",
              "value": 1,
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "height",
              "value": 170,
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "weight",
              "value": 79,
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "eye_colour",
              "value": "Blue",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "hair_colour",
              "value": "Gray",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "age_in_years",
              "value": 57,
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "age_over_18",
              "value": true,
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "age_over_21",
              "value": true,
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "resident_address",
              "value": "1600 Amphitheatre Pkwy ",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "issuing_jurisdiction",
              "value": "US-CA",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "resident_city",
              "value": "Mountain View",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "resident_state",
              "value": "CA",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "resident_postal_code",
              "value": "94043",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "resident_country",
              "value": "US",
              "accessControlProfiles": [
                  1
              ]
          }
      ],
      "org.iso.18013.5.1.aamva": [
          {
              "name": "DHS_compliance",
              "value": "F",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "domestic_driving_privileges",
              "value": [
                  {
                      "domestic_vehicle_class": {
                          "domestic_vehicle_class_code": "D",
                          "domestic_vehicle_class_description": "Operator",
                          "expiry_date": {
                              "tag": 1004,
                              "value": "2027-08-01"
                          },
                          "issue_date": {
                              "tag": 1004,
                              "value": "2022-08-01"
                          }
                      },
                      "domestic_vehicle_restrictions": [
                          {
                              "domestic_vehicle_restriction_code": "B",
                              "domestic_vehicle_restriction_description": "Corrective lenses (also automated - vision screening)"
                          }
                      ]
                  }
              ],
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "aamva_version",
              "value": "1",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "family_name_truncation",
              "value": "N",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "given_name_truncation",
              "value": "N",
              "accessControlProfiles": [
                  1
              ]
          },
          {
              "name": "organ_donor",
              "value": true,
              "accessControlProfiles": [
                  1
              ]
          }
      ]
  },
  "accessControlProfiles": [
      {
          "id": 1,
          "userAuthenticationRequired": true,
          "timeoutMillis": 10000
      }
  ]
}

จากนั้นออบเจ็กต์นี้ควรเข้ารหัสในรูปแบบ CBOR จากนั้นเข้ารหัส เข้ารหัส base64 แล้ว หากอยู่ในสภาพแวดล้อมการทดสอบ และข้อมูลไม่ได้เข้ารหัส ควรเข้ารหัสในรูปแบบ CBOR และเข้ารหัส base64

โปรดทราบว่าตัวอย่างด้านบนเป็นแมป CBOR ที่ไม่มีการเข้ารหัส ไม่ใช่ JSON หากสตริง JSON มีการเข้ารหัสเป็น CBOR อุปกรณ์ Android จะไม่ได้รับการแยกวิเคราะห์อย่างถูกต้อง

ออบเจ็กต์การรักษาความปลอดภัยของอุปกรณ์เคลื่อนที่

ISO/IEC 18013-5 จะกำหนด Mobile Security Object (MSO) เพื่อให้แน่ใจว่าใบขับขี่ดิจิทัล (mDL) ข้อมูลดังกล่าวไม่ได้ถูกแก้ไขโดยหน่วยงานที่น่าเชื่อถือ

MSO ประกอบด้วยข้อมูลต่อไปนี้

  • ค่าไดเจสต์: ค่าเหล่านี้คือค่าที่ไม่ซ้ำกันที่สร้างขึ้นสำหรับข้อมูลแต่ละรายการ ในข้อมูลเข้าสู่ระบบใบขับขี่ดิจิทัล และใช้เพื่อยืนยันว่าข้อมูล ถูกเปลี่ยนแปลงนับตั้งแต่ที่ MSO ลงนาม
  • คีย์อุปกรณ์: คีย์ที่ไม่ซ้ำกันที่สร้างขึ้นสำหรับอุปกรณ์เคลื่อนที่แต่ละเครื่อง ที่จัดเก็บเอกสารรับรอง ใช้เพื่อเชื่อมโยง MSO กับอุปกรณ์และ เพื่อป้องกันไม่ให้นำไปใช้ในอุปกรณ์อื่นๆ
  • ข้อมูลระยะเวลาที่ใช้ได้: ประกอบด้วยวันที่เริ่มต้นและวันที่สิ้นสุดซึ่ง MSO ได้ถูกต้อง
  • ลายเซ็น IA: นี่คือลายเซ็นดิจิทัลที่สร้างขึ้น โดยหน่วยงานที่ออกเอกสาร (IA) โดยใช้คีย์ส่วนตัว ซึ่งใช้เพื่อยืนยันว่า MSO ออกโดยหน่วยงานที่เชื่อถือได้

MSO มีโครงสร้าง CCDL ดังต่อไปนี้

   MobileSecurityObjectBytes = #6.24(bstr .cbor MobileSecurityObject)
   MobileSecurityObject = {
      "digestAlgorithm" : tstr,        ; Message digest algorithm used
      "valueDigests" : ValueDigests,   ; Array of digests of all data elements
      "deviceKeyInfo" : DeviceKeyInfo,
      "docType" : tstr,                ; DocType as used in Documents
      "validityInfo" : ValidityInfo
   }
   DeviceKeyInfo = {
      "deviceKey" : DeviceKey
      ? "keyAuthorizations" : KeyAuthorizations,
      ? "keyInfo" : KeyInfo
   }
   DeviceKey = COSE_Key                ; Device key in COSE_Key as defined in RFC 8152
   KeyAuthorizations = {
      ? "nameSpaces" : AuthorizedNameSpaces
      ? "dataElements" : AuthorizedDataElements
   }
   AuthorizedNameSpaces = [+ NameSpace]
   AuthorizedDataElements = {+ NameSpace => DataElementsArray}
   DataElementsArray = [+ DataElementIdentifier]
   KeyInfo = { * int => any}           ; Positive integers are RFU, negative integers may be used for proprietary use
   ValueDigests = {
      "nameSpaces" : NameSpacesDigests
   }
   NameSpacesDigests = {
      + NameSpace => DigestIDs
   }
   DigestIDs = {
      + DigestID => Digest
   }
   ValidityInfo = {
      "signed" : tdate,
      "validFrom" : tdate,
      "validUntil" : tdate,
      ? "expectedUpdate" : tdate
   }
   NameSpace = tstr                    ; NameSpace as used in IssuerSigned
   DigestID = uint                     ; DigestID as used in IssuerSig

ข้อมูลการตรวจสอบสิทธิ์แบบคงที่

ข้อมูลการตรวจสอบสิทธิ์แบบคงที่ ซึ่งประกอบด้วยทั้ง digestIdMapping และ issuerAuth ควรสร้างโดยผู้ออกบัตร

digestIdMapping สำหรับเนมสเปซที่ระบุประกอบด้วยอาร์เรย์ของ อินสแตนซ์ IssuerSignedItem รายการ แต่ละรายการมีค่า Null สำหรับพร็อพเพอร์ตี้ elementValue นอกจากนี้ issuerAuth จะสร้างขึ้นจากการลงชื่อ MobileSecurityObjectBytes โดยใช้ COSE_Sign1

   StaticAuthDataBytes = (bstr .cbor StaticAuthData)
   StaticAuthData = {
      "digestIdMapping" : DigestIdMapping,
      "issuerAuth" : IssuerAuth
   }
   DigestIdMapping = {
      NameSpace => [ + IssuerSignedItemBytes ]
   }
   ; Defined in ISO 18013-5
   ;
   NameSpace = String
   DataElementIdentifier = String
   DigestID = uint
   IssuerAuth = COSE_Sign1 ; The payload is MobileSecurityObjectBytes
   IssuerSignedItemBytes = #6.24(bstr .cbor IssuerSignedItem)
   IssuerSignedItem = {
      "digestID" : uint,                           ; Digest ID for issuer data auth
      "random" : bstr,                             ; Random value for issuer data auth
      "elementIdentifier" : DataElementIdentifier, ; Data element identifier
      "elementValue" : DataElementValue            ; Data element value
   }

เมื่อเรียกใช้ /provisionMobileSecurityObjects ปลายทาง StaticAuthDataBytes ได้รับการเข้ารหัสโดยใช้ HPKE และส่ง เป็นส่วนหนึ่งของการตอบกลับ

ต่อไปนี้คือ ตัวอย่างโค้ด สำหรับการสร้าง MSO และข้อมูลการตรวจสอบสิทธิ์แบบคงที่