Format Objek Terenkripsi

Kredensial Identitas

Perangkat Android menggunakan Identity Credential library untuk mengelola kredensial di perangkat dengan aman. Identity Credential library menawarkan sejumlah fitur keamanan yang harus digunakan oleh penerbit untuk memastikan integrasi mereka dengan Google seaman mungkin.

Nonce Bertanda Tangan

Library Identity Credential menerima "tantangan" (disebut dalam API ini sebagai nonce) saat mengambil sertifikat identitas perangkat, yang dikirim ke penerbit di bagian RegisterDeviceRequest. Nonce ini ditandatangani dan disematkan dalam ekstensi pengesahan perangkat sertifikat identitas. Hal ini memungkinkan penerbit yakin dengan keterkinian sertifikat dan pengesahan, dan bahwa itu tidak diputar ulang oleh server di tengah komunikasi.

Profil Kontrol Akses

Profil kontrol akses adalah cara bagi penerbit untuk menentukan dengan tepat caranya ingin data yang disimpan dalam Identity Credential perlu dilindungi. Tujuan penerbit dapat menentukan apakah otentikasi pengguna diperlukan untuk mengakses data dan berapa lama pengguna harus melakukan otentikasi. Masa depan (bukan saat ini didukung) fitur ini mencakup pembatasan pembaca dapat mengakses elemen data. Detail tentang cara memformat kontrol akses dapat ditemukan dalam format objek {i>Credential<i}.

Bukti Penyediaan

Bukti objek penyediaan adalah cara bagi penerbit untuk mengetahui bahwa kredensial berhasil disimpan dalam Identity Credential. Penerbit harus tidak menerbitkan MSO untuk suatu kredensial sampai mereka menerima dan memverifikasi bukti penyediaan resource. Objek ini didokumentasikan lebih lanjut dalam dokumentasi Identity Credential.

Format Objek

Masing-masing objek ini dienkripsi end-to-end antara perangkat dan penerbit berita. Akibatnya, server Google tidak memiliki kemampuan untuk menormalisasi objek tersebut, dan beberapa dari obyek ini mungkin memiliki format yang berbeda dengan objek API lainnya. Misalnya, Kredensial diformat dalam CBOR, bukan daripada JSON, karena itulah yang diharapkan di level Android.

Kredensial

Kredensial berisi elemen data, dan cara mengaksesnya. Ini berisi dua objek utama, provisionedData dan accessControlProfiles. Tujuan provisionedData berisi semua namespace yang relevan dengan jenis kredensial. Misalnya, untuk SIM seluler, hal ini adalah org.iso.18013.5.1 dan org.aamva.18013.5.1. Entri data dan nilai-nilai di dalam namespace, tentukan profil kontrol akses yang relevan. Ini adalah dilakukan sebagai daftar ID, dengan ID yang sesuai dengan profil kontrol akses di daftar accessControlProfiles. Pada contoh di bawah, [0] di setiap data entri mengacu pada profil kontrol akses dengan id 0, bukan indeks 0.

Di bawah ini adalah contoh item data peta CBOR yang tidak dienkode.

{
  "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
      }
  ]
}

Objek ini kemudian harus dienkode dalam format CBOR, dienkripsi, lalu yang dienkode dengan base64. Jika berada di lingkungan pengujian, dan data tidak dienkripsi, harus dienkode dalam format CBOR, dan kemudian dienkode dengan format base64.

Perhatikan bahwa contoh di atas adalah peta CBOR yang tidak dienkode, bukan JSON. Jika string JSON dienkode ke CBOR, dan tidak akan diurai dengan benar oleh perangkat Android.

Objek Keamanan Seluler

ISO/IEC 18013-5 menentukan Objek Keamanan Seluler (MSO) untuk memastikan mDL data tidak dirusak dan bahwa data itu dikeluarkan oleh otoritas terpercaya.

MSO berisi hal berikut:

  • Nilai ringkasan: Ini adalah nilai unik yang dihasilkan untuk setiap data dalam Kredensial mDL. Mereka digunakan untuk memverifikasi bahwa data belum telah diubah sejak MSO ditandatangani.
  • Kunci perangkat: Ini adalah kunci unik yang dibuat untuk setiap perangkat seluler yang menyimpan Kredensial. Fungsi ini digunakan untuk mengikat MSO ke perangkat dan untuk mencegahnya digunakan di perangkat lain.
  • Informasi validitas: Informasi ini mencakup tanggal mulai dan akhir yang MSO tersebut valid.
  • Tanda tangan IA: Ini adalah tanda tangan digital yang dibuat oleh Otoritas Penerbit (IA) dengan menggunakan kunci pribadinya. Nomor ini digunakan untuk memverifikasi bahwa MSO dikeluarkan oleh otoritas tepercaya.

MSO memiliki struktur CCDL berikut:

   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

Data Auth Statis

Data Static Auth, yang terdiri dari digestIdMapping dan issuerAuth harus dibuat oleh penerbit.

digestIdMapping untuk namespace tertentu terdiri dari array Instance IssuerSignedItem, masing-masing dengan nilai null untuk properti elementValue. Selain itu, issuerAuth dibuat dengan menandatangani MobileSecurityObjectBytes menggunakan 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
   }

Saat memanggil /provisionMobileSecurityObjects endpoint, StaticAuthDataBytes dienkripsi menggunakan HPKE, dan ditransmisikan sebagai bagian dari respons.

Berikut adalah contoh kode untuk membangun MSO dan Data Static Auth.