10.1.4.2.2. Emissione della Wallet App e Wallet Unit Attestation

Questa sezione descrive come il Fornitore di Wallet emette una Wallet App Attestation e una Wallet Unit Attestation.

La figura illustra il Diagramma di Sequenza per l'acquisizione della Wallet App e Wallet Unit Attestation.

Fig. 10.4 Diagramma di Sequenza per l'acquisizione della Wallet App e Wallet Unit Attestation.

Passo 1: L'Utente avvia una nuova operazione che richiede l'acquisizione di una Wallet App e Wallet Unit Attestation.

Passi 2-4: L'Istanza del Wallet DEVE:

  1. Verificare l'esistenza delle Cryptographic Hardware Keys. Se non esistono, è necessaria la reinizializzazione dell'Istanza del Wallet (WP_140a).

  2. Generare una coppia di chiavi asimmetriche di credenziale da attestare per la Wallet Unit Attestation (key_pub, key_priv).

  3. Generare una coppia di chiavi asimmetriche effimere per la Wallet App Attestation (ephemeral_key_pub, ephemeral_key_priv), collegando la chiave pubblica all'attestato (WP_026).

  4. Verificare l'appartenenza del Fornitore di Wallet alla federazione e recuperare i suoi metadati (WP_023).

Passi 5-7 (Recupero del Nonce): L'Istanza del Wallet richiede un nonce all'endpoint Endpoint Nonce della Soluzione Wallet del Backend del Fornitore del Wallet (WP_140b). Il nonce deve essere imprevedibile e funge da principale difesa contro gli attacchi di replay.

Il nonce DEVE garantire un utilizzo singolo entro un intervallo di tempo predeterminato.

In caso di richiesta riuscita, il Fornitore di Wallet genera e restituisce il valore del nonce all'Istanza del Wallet.

Passo 8: L'Istanza del Wallet esegue le seguenti azioni (WP_140c):

  • Crea due oggetti JSON, client_data_waa e client_data_wua, ciascuno contenente il nonce e l'impronta digitale (thumbprint) delle rispettive JWK (ephemeral_key_pub, key_pub).

  • Calcola i corrispondenti hash, client_data_hash_waa e client_data_hash_wua, applicando l'algoritmo SHA256 a client_data_waa e client_data_wua.

Di seguito è riportato un esempio non normativo dell'oggetto JSON client_data_waa.

{
  "nonce": "i4ThI2Jhbu81i8mqyWEuDG5t",
  "jwk_thumbprint": "vbeXJksM45xphtANnCiG6mCyuU4jfGNzopGuKvogg9c"
}

Passi 9-12: L'Istanza del Wallet:

  • produce un valore hardware_signature firmando client_data_hash_waa e client_data_hash_wua con la chiave privata dell'Hardware del Wallet, servendo come prova di possesso delle Cryptographic Hardware Keys (WP_140d).

  • richiede al Servizio di Integrità del Dispositivo di creare un valore integrity_assertion collegato al client_data_hash_waa.

  • riceve un valore integrity_assertion firmato per la Wallet App Attestation dal Servizio di Integrità del Dispositivo, autenticato dall'OEM (WP_140e).

Nota

integrity_assertion è un payload personalizzato generato dal Servizio di Integrità del Dispositivo, firmato dall'OEM del dispositivo e codificato in base64 per avere uniformità tra diversi dispositivi.

Nota

Nel caso del sistema operativo Android, il flusso prosegue in base con i Passi 13-16, mentre per il caso di iOS, il flusso prosegue con i Passi 17-20.

Passi 13-16: L'Istanza del Wallet:

  • richiede all'API di Key Attestation di creare un valore key_attestation collegato a client_data_hash_wua.

  • riceve un valore key_attestation firmato dall'API di Key Attestation, autenticato dall'OEM.

  • genera un valore attested_key firmando il key_attestation utilizzando la chiave privata della coppia di chiavi di credenziale generata inizialmente (priv_key).

Passi 17-20: L'Istanza del Wallet:

  • richiede al Servizio di Integrità del Dispositivo di creare un valore integrity_assertion collegato a client_data_hash_wua.

  • riceve un valore integrity_assertion firmato per la Wallet Unit Attestation dal Servizio di Integrità del Dispositivo, autenticato dall'OEM.

  • genera un valore attested_key firmando l'integrity_assertion ottenuto per la Wallet Unit Attestation utilizzando la chiave privata della coppia di chiavi di credenziale generata inizialmente (priv_key).

Passi 21-22 (Richiesta di Emissione della Wallet App e Wallet Unit Attestation): L'Istanza del Wallet:

  • Costruisce la Wallet App e la Wallet Unit Attestation Request sotto forma di JWT. Questo JWT include l'integrity_assertion per la Wallet App Attestation, attested_key, hardware_signature, nonce, hardware_key_tag, cnf e altri parametri relativi alla configurazione (vedi Tabella del Corpo della Richiesta di Wallet App e Wallet Unit Attestation) ed è firmato utilizzando la chiave privata della coppia di chiavi effimere generata inizialmente (WP_140–141).

  • Invia la Wallet App e la Wallet Unit Attestation Request all'endpoint Endpoint di Emissione della Wallet App e Wallet Unit Attestation del Backend del Fornitore del Wallet.

Nota

attested_key contiene un oggetto key_attestation nel caso di Android e un oggetto integrity_assertion nel caso di iOS.

L'Istanza del Wallet DEVE inviare il JWT firmato della Richiesta di Wallet App e Wallet Unit Attestation come parametro assertion nel corpo di una richiesta HTTP all'endpoint Endpoint di Emissione della Wallet App e Wallet Unit Attestation del Fornitore di Wallet (WP_142).

Passi 23-28: Il Backend del Fornitore del Wallet valuta la Richiesta di Wallet App e Wallet Unit Attestation e DEVE eseguire i seguenti controlli (WP_143):

  1. La richiesta DEVE includere tutti i parametri dell'intestazione HTTP richiesti come definito in Richiesta di Emissione della Wallet App e Wallet Unit Attestation (WP_143a).

  2. La firma della Richiesta di Wallet App e Wallet Unit Attestation DEVE essere valida e verificabile utilizzando la jwk fornita (WP_143b).

  3. Il valore nonce DEVE essere stato generato dal Fornitore di Wallet e non essere stato utilizzato in precedenza (WP_143c).

  4. DEVE esistere un'Istanza del Wallet valida e attualmente registrata associata a quella fornita (WP_143d).

  5. La firma del parametro attested_key deve essere prima validata utilizzando la jwk fornita, e il suo valore (key_attestation nel caso di Android o integrity_assertion nel caso di iOS) DEVE essere validato secondo le linee guida del produttore del dispositivo.

  6. Il client_data_waa DEVE essere ricostruito utilizzando il nonce e la chiave pubblica jwk. Il valore del parametro hardware_signature viene quindi convalidato utilizzando la chiave pubblica della Cryptographic Hardware Key registrata associata all'Istanza del Wallet (WP_143e).

  7. L'integrity_assertion DEVE essere convalidato secondo le linee guida del produttore del dispositivo. I controlli specifici eseguiti dal Fornitore di Wallet sono dettagliati nella documentazione del produttore del sistema operativo (WP_143f).

  8. Il dispositivo in uso DEVE essere privo di difetti di sicurezza noti e soddisfare i requisiti minimi di sicurezza definiti dal Fornitore di Wallet.

  9. L'URL nel parametro iss DEVE corrispondere all'identificatore URL del Fornitore di Wallet (WP_143g).

Al completamento con successo di tutte le verifiche, il Fornitore di Wallet emette una Wallet App Attestation valida per meno di 24 ore (WP_144) e una Wallet Unit Attestation valida per almeno un mese.

Passo 29 (Risposta di Emissione della Wallet App e Wallet Unit Attestation): Al completamento con successo, il Fornitore di Wallet DEVE restituire una risposta di conferma utilizzando il codice di stato 200 e il Content-Type application/json, contenente le Wallet App e Wallet Unit Attestations firmate dal Fornitore di Wallet. Il Fornitore di Wallet DEVE restituire la Wallet App Attestation in almeno tre formati: JWT, SD-JWT e mdoc. L'Istanza del Wallet eseguirà quindi la verifica di sicurezza e integrità delle Wallet App e Wallet Unit Attestations ricevute, oltre alla verifica di fiducia del relativo emittente (WP_030–031).

Di seguito è riportato un esempio non normativo della risposta.

HTTP/1.1 200 OK
Content-Type: application/json

{
  "wallet_attestations": [
    "wallet_app_attestations": [
      {
        "format": "jwt",
        "wallet_app_attestation": "ey..."
      },
      {
        "format": "dc+sd-jwt",
        "wallet_app_attestation": "ey..."
      },
      {
        "format": "mso_mdoc",
        "wallet_app_attestation": "omppc3N1ZXJBdXRohEOhASahG...ArQwggKwMIICVqADAgEC"
      }
    ],

    "wallet_unit_attestation": "omppc3N1ZXJBdXRohEOhASahG...ArQwggKwMIICVqADAgEC"
  ]
}