Formati di oggetti criptati

Credenziale identità

I dispositivi Android utilizzano la credenziale di identità libreria per gestire in modo sicuro le credenziali sul dispositivo. Credenziale dell'identità offre una serie di funzionalità di sicurezza che dovrebbero essere utilizzate dall'emittente per assicurare che la loro integrazione con Google sia il più sicura possibile.

Nonce firmato

La raccolta delle credenziali dell'identità accetta una "verifica" (indicato in questa API come nonce) durante il recupero del certificato di identità del dispositivo, inviato all'emittente nella RegisterDeviceRequest. Questo nonce è firmato e incorporato nell'estensione di attestazione del dispositivo certificato di identità. Ciò consente all'emittente di avere fiducia nell'attualità del certificato e dell'attestazione e che non viene riprodotta da un server in mezzo alle comunicazioni.

Profili di controllo dell'accesso

I profili di controllo dell'accesso consentono all'emittente di specificare con precisione in che modo Vuoi che i dati archiviati all'interno della credenziale di identità siano protetti. La l'emittente è in grado di specificare se è necessaria l'autenticazione dell'utente per accedere ai dati e il tempo a disposizione dell'utente per eseguire l'autenticazione. Futuro (non attualmente supportati) di questa funzionalità includono la limitazione dei lettori possano accedere all'elemento dati. Dettagli su come formattare il controllo dell'accesso disponibili nel formato dell'oggetto credenziali.

Prova di provisioning

La prova dell'oggetto di provisioning è un modo per consentire agli emittenti di sapere che la credenziale è stata archiviata correttamente all'interno di Credenziali di identità. Un emittente deve non emettere MSO per una qualifica finché non ricevono e verificano la prova per eseguire il provisioning. Questo oggetto è documentato meglio nella documentazione relativa alle credenziali di identità.

Formati degli oggetti

Ognuno di questi oggetti è protetto con crittografia end-to-end tra il dispositivo e emittente. Di conseguenza, i server di Google non hanno la capacità di normalizzare e alcuni di questi potrebbero avere formati diversi rispetto rimanenti degli oggetti API. Ad esempio, la credenziale è formattata in CBOR rispetto a JSON, che è ciò che ci si aspetta a livello di Android.

Credenziale

La credenziale contiene gli elementi dei dati e la modalità di accesso. it contiene due oggetti principali, provisionedData e accessControlProfiles. La provisionedData contiene tutti gli spazi dei nomi pertinenti a tipo di credenziale. Ad esempio, per la patente di guida su dispositivo mobile, org.iso.18013.5.1 e org.aamva.18013.5.1. Le voci di dati e i valori all'interno degli spazi dei nomi specificano i relativi profili di controllo dell'accesso. Questo è eseguito sotto forma di elenco di ID, dove l'ID corrisponde a un profilo di controllo dell'accesso in nell'elenco accessControlProfiles. Nell'esempio seguente, il valore [0] in ogni dato la voce si riferisce al profilo di controllo dell'accesso con ID 0, non con indice 0.

Di seguito è riportato un esempio di elemento di dati non codificati di una mappa 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
      }
  ]
}

Questo oggetto deve quindi essere codificato nel formato CBOR, criptato e quindi con codifica Base64. Se nell'ambiente di test i dati non vengono criptati, dovrebbe essere codificato nel formato CBOR e poi codificato in Base64.

Tieni presente che l'esempio precedente è una mappa CBOR non codificata, non JSON. Se una stringa JSON è codificata in CBOR, non verrà analizzata correttamente dal dispositivo Android.

Oggetti di sicurezza per dispositivi mobili

ISO/IEC 18013-5 definisce un Mobile Security Object (MSO) per garantire che la patente di guida digitale i dati non siano manomessi e siano stati emessi da un'autorità attendibile.

MSO contiene quanto segue:

  • Valori digest: sono valori univoci generati per ogni dato nella credenziale mDL. Vengono utilizzati per verificare che i dati non siano stati è stato modificato dopo la firma dell'MSO.
  • Chiave dispositivo: si tratta di una chiave univoca generata per ogni dispositivo mobile. in cui è archiviata la credenziale. Viene utilizzato per associare l'MSO al dispositivo e per impedirne l'utilizzo su altri dispositivi.
  • Informazioni sulla validità: includono le date di inizio e di fine per le quali l'MSO sia valido.
  • Firma IA: si tratta di una firma digitale creata dall'autorità di emissione utilizzando la propria chiave privata. Viene utilizzato per verificare che l'MSO sia stato rilasciato da un'autorità attendibile.

L'MSO ha la seguente struttura 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

Dati di autenticazione statici

I dati di autenticazione statici, che comprendono sia digestIdMapping e issuerAuth devono essere creati dall'emittente.

Il parametro digestIdMapping per uno spazio dei nomi specifico è composto da un array di IssuerSignedItem istanze, ciascuna con un valore nullo per la proprietà elementValue. Inoltre, il issuerAuth viene generato MobileSecurityObjectBytes tramite 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
   }

Al momento della chiamata a /provisionMobileSecurityObjects endpoint, StaticAuthDataBytes è criptato tramite HPKE e trasmesso come parte della risposta.

Ecco un esempio di codice per la creazione di MSO e dati di autenticazione statici.