5. Producing and Consuming JWEs (Produzione e consumo di JWE)
5.1 Message Encryption (Crittografia del messaggio)
Il processo di crittografia del messaggio è il seguente. L'ordine dei passaggi non è significativo nei casi in cui non ci sono dipendenze tra gli input e gli output dei passaggi.
-
Determinare la modalità di gestione delle chiavi impiegata dall'algoritmo utilizzato per determinare il valore della chiave di crittografia del contenuto. (Questo è l'algoritmo registrato nel parametro di intestazione "alg" (algorithm, algoritmo) del JWE risultante.)
-
Quando vengono impiegati il wrapping delle chiavi, la crittografia delle chiavi o l'accordo di chiavi con wrapping delle chiavi, generare un valore CEK casuale. Vedere RFC 4086 [RFC4086] per le considerazioni sulla generazione di valori casuali. La CEK deve (MUST) avere una lunghezza uguale a quella richiesta per l'algoritmo di crittografia del contenuto.
-
Quando vengono impiegati l'accordo di chiavi diretto o l'accordo di chiavi con wrapping delle chiavi, utilizzare l'algoritmo di accordo di chiavi per calcolare il valore della chiave concordata. Quando viene impiegato l'accordo di chiavi diretto, lasciare che la CEK sia la chiave concordata. Quando viene impiegato l'accordo di chiavi con wrapping delle chiavi, la chiave concordata verrà utilizzata per avvolgere la CEK.
-
Quando vengono impiegati il wrapping delle chiavi, la crittografia delle chiavi o l'accordo di chiavi con wrapping delle chiavi, crittografare la CEK per il destinatario e lasciare che il risultato sia la chiave crittografata JWE.
-
Quando vengono impiegati l'accordo di chiavi diretto o la crittografia diretta, lasciare che la chiave crittografata JWE sia la sequenza di ottetti vuota.
-
Quando viene impiegata la crittografia diretta, lasciare che la CEK sia la chiave simmetrica condivisa.
-
Calcolare il valore della chiave codificata BASE64URL(JWE Encrypted Key).
-
Se viene utilizzata la serializzazione JSON JWE, ripetere questo processo (passaggi 1-7) per ogni destinatario.
-
Generare un vettore di inizializzazione JWE casuale della dimensione corretta per l'algoritmo di crittografia del contenuto (se richiesto dall'algoritmo); altrimenti, lasciare che il vettore di inizializzazione JWE sia la sequenza di ottetti vuota.
-
Calcolare il valore del vettore di inizializzazione codificato BASE64URL(JWE Initialization Vector).
-
Se è incluso un parametro "zip", comprimere il testo in chiaro utilizzando l'algoritmo di compressione specificato e lasciare che M sia la sequenza di ottetti che rappresenta il testo in chiaro compresso; altrimenti, lasciare che M sia la sequenza di ottetti che rappresenta il testo in chiaro.
-
Creare l'oggetto o gli oggetti JSON contenenti l'insieme desiderato di parametri di intestazione, che insieme comprendono l'intestazione JOSE: l'intestazione protetta JWE, l'intestazione non protetta condivisa JWE e l'intestazione non protetta per destinatario JWE.
-
Calcolare il valore dell'intestazione protetta codificata BASE64URL(UTF8(JWE Protected Header)). Se l'intestazione protetta JWE non è presente (il che può accadere solo quando si utilizza la serializzazione JSON JWE e non è presente alcun membro "protected"), lasciare che questo valore sia la stringa vuota.
-
Lasciare che il parametro di crittografia dei dati autenticati aggiuntivi sia ASCII(Encoded Protected Header). Tuttavia, se è presente un valore JWE AAD (il che può essere il caso solo quando si utilizza la serializzazione JSON JWE), lasciare invece che il parametro di crittografia dei dati autenticati aggiuntivi sia ASCII(Encoded Protected Header || '.' || BASE64URL(JWE AAD)).
-
Crittografare M utilizzando la CEK, il vettore di inizializzazione JWE e il valore dei dati autenticati aggiuntivi utilizzando l'algoritmo di crittografia del contenuto specificato per creare il valore del testo cifrato JWE e il tag di autenticazione JWE (che è l'output del tag di autenticazione dell'operazione di crittografia).
-
Calcolare il valore del testo cifrato codificato BASE64URL(JWE Ciphertext).
-
Calcolare il valore del tag di autenticazione codificato BASE64URL(JWE Authentication Tag).
-
Se è presente un valore JWE AAD, calcolare il valore AAD codificato BASE64URL(JWE AAD).
-
Creare l'output serializzato desiderato. La serializzazione compatta di questo risultato è la stringa BASE64URL(UTF8(JWE Protected Header)) || '.' || BASE64URL(JWE Encrypted Key) || '.' || BASE64URL(JWE Initialization Vector) || '.' || BASE64URL(JWE Ciphertext) || '.' || BASE64URL(JWE Authentication Tag). La serializzazione JSON JWE è descritta nella sezione 7.2.
5.2 Message Decryption (Decrittografia del messaggio)
Il processo di decrittografia del messaggio è l'inverso del processo di crittografia. L'ordine dei passaggi non è significativo nei casi in cui non ci sono dipendenze tra gli input e gli output dei passaggi. Se uno di questi passaggi fallisce, il contenuto crittografato non può essere validato.
Quando ci sono più destinatari, è una decisione dell'applicazione quale dei contenuti crittografati dei destinatari deve essere validato con successo affinché il JWE sia accettato. In alcuni casi, il contenuto crittografato per tutti i destinatari deve essere validato con successo o il JWE sarà considerato non valido. In altri casi, solo il contenuto crittografato per un singolo destinatario deve essere validato con successo. Tuttavia, in tutti i casi, il contenuto crittografato per almeno un destinatario deve (MUST) essere validato con successo o il JWE deve (MUST) essere considerato non valido.
-
Analizzare la rappresentazione JWE per estrarre i valori serializzati per i componenti JWE. Quando si utilizza la serializzazione compatta JWE, questi componenti sono le rappresentazioni codificate in base64url dell'intestazione protetta JWE, della chiave crittografata JWE, del vettore di inizializzazione JWE, del testo cifrato JWE e del tag di autenticazione JWE, e quando si utilizza la serializzazione JSON JWE, questi componenti includono anche la rappresentazione codificata in base64url del JWE AAD e i valori non codificati dell'intestazione non protetta condivisa JWE e dell'intestazione non protetta per destinatario JWE. Quando si utilizza la serializzazione compatta JWE, l'intestazione protetta JWE, la chiave crittografata JWE, il vettore di inizializzazione JWE, il testo cifrato JWE e il tag di autenticazione JWE sono rappresentati come valori codificati in base64url in quell'ordine, con ciascun valore separato dal successivo da un singolo carattere punto ('.'), risultando in esattamente quattro caratteri punto di delimitazione utilizzati. La serializzazione JSON JWE è descritta nella sezione 7.2.
-
Decodificare in base64url le rappresentazioni codificate dell'intestazione protetta JWE, della chiave crittografata JWE, del vettore di inizializzazione JWE, del testo cifrato JWE, del tag di autenticazione JWE e del JWE AAD, seguendo la restrizione che non sono stati utilizzati interruzioni di riga, spazi bianchi o altri caratteri aggiuntivi.
-
Verificare che la sequenza di ottetti risultante dalla decodifica dell'intestazione protetta JWE codificata sia una rappresentazione codificata in UTF-8 di un oggetto JSON completamente valido conforme a RFC 7159 [RFC7159]; lasciare che l'intestazione protetta JWE sia questo oggetto JSON.
-
Se si utilizza la serializzazione compatta JWE, lasciare che l'intestazione JOSE sia l'intestazione protetta JWE. Altrimenti, quando si utilizza la serializzazione JSON JWE, lasciare che l'intestazione JOSE sia l'unione dei membri dell'intestazione protetta JWE, dell'intestazione non protetta condivisa JWE e della corrispondente intestazione non protetta per destinatario JWE, che devono tutti essere oggetti JSON completamente validi. Durante questo passaggio, verificare che l'intestazione JOSE risultante non contenga nomi di parametri di intestazione duplicati. Quando si utilizza la serializzazione JSON JWE, questa restrizione include che lo stesso nome di parametro di intestazione non deve (MUST NOT) apparire anche in valori di oggetti JSON distinti che insieme comprendono l'intestazione JOSE.
-
Verificare che l'implementazione comprenda e possa elaborare tutti i campi che è tenuta a supportare, sia richiesti da questa specifica, dall'algoritmo utilizzato o dal valore del parametro di intestazione "crit", e che anche i valori di quei parametri siano compresi e supportati.
-
Determinare la modalità di gestione delle chiavi impiegata dall'algoritmo specificato dal parametro di intestazione "alg" (algorithm, algoritmo).
-
Verificare che il JWE utilizzi una chiave nota al destinatario.
-
Quando vengono impiegati l'accordo di chiavi diretto o l'accordo di chiavi con wrapping delle chiavi, utilizzare l'algoritmo di accordo di chiavi per calcolare il valore della chiave concordata. Quando viene impiegato l'accordo di chiavi diretto, lasciare che la CEK sia la chiave concordata. Quando viene impiegato l'accordo di chiavi con wrapping delle chiavi, la chiave concordata verrà utilizzata per decrittografare la chiave crittografata JWE.
-
Quando vengono impiegati il wrapping delle chiavi, la crittografia delle chiavi o l'accordo di chiavi con wrapping delle chiavi, decrittografare la chiave crittografata JWE per produrre la CEK. La CEK deve (MUST) avere una lunghezza uguale a quella richiesta per l'algoritmo di crittografia del contenuto. Si noti che quando ci sono più destinatari, ogni destinatario sarà in grado di decrittografare solo i valori di chiave crittografata JWE che sono stati crittografati per le chiavi in possesso di quel destinatario. È quindi normale essere in grado di decrittografare solo uno dei valori di chiave crittografata JWE per destinatario per ottenere il valore CEK. Vedere anche la sezione 11.5 per le considerazioni sulla sicurezza relative alla mitigazione degli attacchi temporali.
-
Quando vengono impiegati l'accordo di chiavi diretto o la crittografia diretta, verificare che il valore della chiave crittografata JWE sia una sequenza di ottetti vuota.
-
Quando viene impiegata la crittografia diretta, lasciare che la CEK sia la chiave simmetrica condivisa.
-
Registrare se la CEK ha potuto essere determinata con successo per questo destinatario.
-
Se viene utilizzata la serializzazione JSON JWE, ripetere questo processo (passaggi 4-12) per ogni destinatario contenuto nella rappresentazione.
-
Calcolare il valore dell'intestazione protetta codificata BASE64URL(UTF8(JWE Protected Header)). Se l'intestazione protetta JWE non è presente (il che può accadere solo quando si utilizza la serializzazione JSON JWE e non è presente alcun membro "protected"), lasciare che questo valore sia la stringa vuota.
-
Lasciare che il parametro di crittografia dei dati autenticati aggiuntivi sia ASCII(Encoded Protected Header). Tuttavia, se è presente un valore JWE AAD (il che può essere il caso solo quando si utilizza la serializzazione JSON JWE), lasciare invece che il parametro di crittografia dei dati autenticati aggiuntivi sia ASCII(Encoded Protected Header || '.' || BASE64URL(JWE AAD)).
-
Decrittografare il testo cifrato JWE utilizzando la CEK, il vettore di inizializzazione JWE, il valore dei dati autenticati aggiuntivi e il tag di autenticazione JWE (che è l'input del tag di autenticazione per il calcolo) utilizzando l'algoritmo di crittografia del contenuto specificato, restituendo il testo in chiaro decrittografato e validando il tag di autenticazione JWE nel modo specificato per l'algoritmo, rifiutando l'input senza emettere alcun output decrittografato se il tag di autenticazione JWE non è corretto.
-
Se è incluso un parametro "zip", decomprimere il testo in chiaro decrittografato utilizzando l'algoritmo di compressione specificato.
-
Se non ci sono destinatari per i quali tutti i passaggi di decrittografia hanno avuto successo, allora il JWE deve (MUST) essere considerato non valido. Altrimenti, emettere il testo in chiaro. Nel caso della serializzazione JSON JWE, restituire anche un risultato all'applicazione indicando per quale dei destinatari la decrittografia ha avuto successo e fallito.
Infine, si noti che è una decisione dell'applicazione quali algoritmi possono essere utilizzati in un determinato contesto. Anche se un JWE può essere decrittografato con successo, a meno che gli algoritmi utilizzati nel JWE siano accettabili per l'applicazione, dovrebbe (SHOULD) considerare il JWE non valido.
5.3 String Comparison Rules (Regole di confronto delle stringhe)
Le regole di confronto delle stringhe per questa specifica sono le stesse definite nella sezione 5.3 di [JWS].