6. Oggetti MAC
- Oggetti MAC
COSE supporta due diverse strutture MAC. COSE_Mac0 viene utilizzato quando non è necessaria una struttura destinatario perché la chiave da utilizzare è nota implicitamente. COSE_Mac viene utilizzato in tutti gli altri casi. Questi includono un requisito per più destinatari, la chiave sconosciuta o un algoritmo destinatario diverso da quello diretto.
In questa sezione, descriviamo la struttura e i metodi da utilizzare quando si esegue l'autenticazione MAC in COSE. Questo documento consente l'uso di tutte le stesse classi di algoritmi destinatario consentite per la crittografia.
Ci sono due modalità in cui possono essere utilizzate le operazioni MAC. La prima è solo un controllo che il contenuto non sia stato modificato da quando è stato calcolato il MAC. Qualsiasi classe di algoritmo destinatario può essere utilizzata a questo scopo. La seconda modalità consiste sia nel verificare che il contenuto non sia stato modificato da quando è stato calcolato il MAC, sia nell'utilizzare l'algoritmo destinatario per verificare chi lo ha inviato. Le classi di algoritmi destinatario che supportano questo sono quelle che utilizzano un segreto precondiviso o eseguono un accordo di chiave Statico-Statico (SS) (senza il passaggio di avvolgimento della chiave). In entrambi questi casi, l'entità che ha creato e inviato il messaggio MAC può essere convalidata. (Questa conoscenza del mittente presuppone che ci siano solo due parti coinvolte e che non si sia inviato il messaggio a se stessi.) La proprietà di origine può essere ottenuta con entrambe le strutture di messaggi MAC.
6.1. Messaggio MAC con Destinatari
Un messaggio MAC a più destinatari utilizza due strutture: la struttura COSE_Mac definita in questa sezione per trasportare il corpo e la struttura COSE_recipient (Sezione 5.1) per contenere la chiave utilizzata per il calcolo del MAC. Esempi di messaggi MAC possono essere trovati nell'Appendice C.5.
La struttura MAC può essere codificata come taggata o non taggata a seconda del contesto in cui verrà utilizzata. Una struttura COSE_Mac taggata è identificata dal tag CBOR 97. Il frammento CDDL che rappresenta questo è:
COSE_Mac_Tagged = #6.97(COSE_Mac)
La struttura COSE_Mac è un array CBOR. I campi dell'array, in ordine, sono:
protected: Questo è come descritto nella Sezione 3.
unprotected: Questo è come descritto nella Sezione 3.
payload: Questo campo contiene il contenuto serializzato da sottoporre a MAC. Se il payload non è presente nel messaggio, l'applicazione è tenuta a fornire il payload separatamente. Il payload è avvolto in un bstr per garantire che venga trasportato senza modifiche. Se il payload viene trasportato separatamente (cioè, contenuto distaccato), allora un valore nil CBOR viene posizionato in questa posizione, ed è responsabilità dell'applicazione garantire che venga trasportato senza modifiche.
tag: Questo campo contiene il valore MAC.
recipients: Questo è come descritto nella Sezione 5.1.
Il frammento CDDL che rappresenta il testo sopra per COSE_Mac segue.
COSE_Mac = [ Headers, payload : bstr / nil, tag : bstr, recipients : [+COSE_recipient] ]
6.2. Messaggi MAC con Chiave Implicita
In questa sezione, descriviamo la struttura e i metodi da utilizzare quando si esegue l'autenticazione MAC per quei casi in cui il destinatario è implicitamente noto.
Il messaggio MAC utilizza la struttura COSE_Mac0 definita in questa sezione per trasportare il corpo. Esempi di messaggi MAC con una chiave implicita possono essere trovati nell'Appendice C.6.
La struttura MAC può essere codificata come taggata o non taggata, a seconda del contesto in cui verrà utilizzata. Una struttura COSE_Mac0 taggata è identificata dal tag CBOR 17. Il frammento CDDL che rappresenta questo è:
COSE_Mac0_Tagged = #6.17(COSE_Mac0)
La struttura COSE_Mac0 è un array CBOR. I campi dell'array, in ordine, sono:
protected: Questo è come descritto nella Sezione 3.
unprotected: Questo è come descritto nella Sezione 3.
payload: Questo è come descritto nella Sezione 6.1.
tag: Questo campo contiene il valore MAC.
Il frammento CDDL che corrisponde al testo sopra è:
COSE_Mac0 = [ Headers, payload : bstr / nil, tag : bstr, ]
6.3. Come Calcolare e Verificare un MAC
Per ottenere una codifica coerente dei dati da autenticare, la MAC_structure viene utilizzata per creare la forma canonica. La MAC_structure è un array CBOR. I campi della MAC_structure, in ordine, sono:
-
Una stringa di testo di contesto che identifica la struttura che viene codificata. Questa stringa di testo di contesto è "MAC" per la struttura COSE_Mac. Questa stringa di testo di contesto è "MAC0" per la struttura COSE_Mac0.
-
Gli attributi protetti dalla struttura del corpo. Se non ci sono attributi protetti, viene utilizzato un bstr di lunghezza zero.
-
I dati forniti esternamente dall'applicazione, codificati come tipo bstr. Se questo campo non viene fornito, il valore predefinito è una stringa di byte di lunghezza zero. (Vedere la Sezione 4.3 per la guida all'applicazione sulla costruzione di questo campo.)
-
Il payload da sottoporre a MAC, codificato in un tipo bstr. Qui viene utilizzato il payload completo, indipendentemente da come viene trasportato.
Il frammento CDDL che corrisponde al testo sopra è:
MAC_structure = [ context : "MAC" / "MAC0", protected : empty_or_serialized_map, external_aad : bstr, payload : bstr ]
I passaggi per calcolare un MAC sono:
-
Creare una MAC_structure e popolarla con i campi appropriati.
-
Creare il valore ToBeMaced codificando la MAC_structure in una stringa di byte, utilizzando la codifica descritta nella Sezione 9.
-
Chiamare l'algoritmo di creazione MAC, passando K (la chiave da utilizzare), alg (l'algoritmo con cui eseguire il MAC) e ToBeMaced (il valore su cui calcolare il MAC).
-
Posizionare il MAC risultante nel campo "tag" della struttura COSE_Mac o COSE_Mac0.
-
Per le strutture COSE_Mac, crittografare e codificare la chiave MAC per ogni destinatario del messaggio.
I passaggi per verificare un MAC sono:
-
Creare una MAC_structure e popolarla con i campi appropriati.
-
Creare il valore ToBeMaced codificando la MAC_structure in una stringa di byte, utilizzando la codifica descritta nella Sezione 9.
-
Per le strutture COSE_Mac, ottenere la chiave crittografica decodificando e decifrando una delle strutture destinatario.
-
Chiamare l'algoritmo di creazione MAC, passando K (la chiave da utilizzare), alg (l'algoritmo con cui eseguire il MAC) e ToBeMaced (il valore su cui calcolare il MAC).
-
Confrontare il valore MAC con il campo "tag" della struttura COSE_Mac o COSE_Mac0.