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 IssuerSigData 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.