3. Parametri di Intestazione
- Parametri di Intestazione
La struttura di COSE è stata progettata per avere due contenitori (bucket) di informazioni che non sono considerati parte del payload stesso, ma sono utilizzati per contenere informazioni su contenuto, algoritmi, chiavi o suggerimenti di valutazione per l'elaborazione del livello. Questi due contenitori sono disponibili per l'uso in tutte le strutture tranne che per le chiavi. Sebbene questi contenitori siano presenti, potrebbero non essere sempre utilizzabili in tutte le istanze. Ad esempio, mentre il contenitore protetto è definito come parte della struttura del destinatario, alcuni degli algoritmi utilizzati per le strutture del destinatario non prevedono dati autenticati. Se questo è il caso, il contenitore protetto viene lasciato vuoto.
Entrambi i contenitori sono implementati come mappe CBOR. La chiave della mappa è un "etichetta" (label) (Sezione 1.5). La parte del valore dipende dalla definizione dell'etichetta. Entrambe le mappe utilizzano lo stesso set di coppie etichetta/valore. I valori interi e stringa di testo per le etichette sono stati divisi in diverse sezioni, tra cui un intervallo standard, un intervallo per uso privato e un intervallo che dipende dall'algoritmo selezionato. Le etichette definite si possono trovare nel registro IANA "COSE Header Parameters" (Sezione 11.1).
I due contenitori sono:
protected (protetto): Contiene parametri sul livello corrente che sono crittograficamente protetti. Questo contenitore DEVE essere vuoto se non deve essere incluso in un calcolo crittografico. Questo contenitore è codificato nel messaggio come un oggetto binario. Questo valore è ottenuto mediante la codifica CBOR della mappa protetta e il suo avvolgimento in un oggetto bstr. I mittenti DOVREBBERO codificare una mappa di lunghezza zero come una stringa di byte di lunghezza zero piuttosto che come una mappa di lunghezza zero (codificata come h'a0'). La codifica della stringa di byte di lunghezza zero è preferita, perché è sia più breve che la versione utilizzata nelle strutture di serializzazione per il calcolo crittografico. I destinatari DEVONO accettare sia una stringa di byte di lunghezza zero che una mappa di lunghezza zero codificata in una stringa di byte.
Avvolgere la codifica con una stringa di byte consente di trasportare la mappa protetta con una maggiore probabilità che non venga alterata accidentalmente durante il transito. (Intermediari che si comportano male potrebbero decodificare e ricodificare, ma ciò comporterà un fallimento della verifica a meno che la stringa di byte ricodificata non sia identica alla stringa di byte decodificata.) Ciò evita il problema che tutte le parti debbano essere in grado di eseguire una codifica canonica comune della mappa per l'input alle operazioni crittografiche.
unprotected (non protetto): Contiene parametri sul livello corrente che non sono crittograficamente protetti.
Solo i parametri di intestazione che riguardano il livello corrente devono essere posizionati a quel livello. Come esempio di ciò, il parametro di intestazione "content type" descrive il contenuto del messaggio trasportato nel messaggio. Come tale, questo parametro di intestazione è posizionato solo nel livello del contenuto e non è posizionato nei livelli del destinatario o della firma. In linea di principio, si dovrebbe essere in grado di elaborare qualsiasi livello dato senza riferimento a nessun altro livello. Ad eccezione della struttura COSE_Sign, gli unici dati che devono attraversare i livelli sono la chiave crittografica.
I contenitori sono presenti in tutti gli oggetti di sicurezza definiti in questo documento. I campi, in ordine, sono il contenitore "protetto" (come tipo CBOR "bstr") e poi il contenitore "non protetto" (come tipo CBOR "map"). La presenza di entrambi i contenitori è obbligatoria. I parametri di intestazione che vanno nei contenitori provengono dal registro IANA "COSE Header Parameters" (Sezione 11.1). Alcuni parametri di intestazione sono definiti nella sezione successiva.
Le etichette in ciascuna delle mappe DEVONO essere uniche. Durante l'elaborazione dei messaggi, se un'etichetta appare più volte, il messaggio DEVE essere rifiutato come malformato. Le applicazioni DOVREBBERO verificare che la stessa etichetta non compaia sia nei parametri di intestazione protetti che non protetti. Se il messaggio non viene rifiutato come malformato, gli attributi DEVONO essere ottenuti dal contenitore protetto, e solo se un attributo non viene trovato nel contenitore protetto, tale attributo può essere ottenuto dal contenitore non protetto.
Il seguente frammento CDDL rappresenta i due contenitori di parametri di intestazione. Un gruppo "Headers" è definito in CDDL che rappresenta i due contenitori in cui sono posizionati gli attributi. Questo gruppo viene utilizzato per fornire questi due campi in modo coerente in tutte le posizioni. È definito anche un tipo che rappresenta la mappa dei parametri di intestazione comuni.
Headers = (
protected : empty_or_serialized_map,
unprotected : header_map
)
header_map = {
Generic_Headers,
* label => values
}
empty_or_serialized_map = bstr .cbor header_map / bstr .size 0
3.1. Parametri di Intestazione COSE Comuni
Questa sezione definisce un set di parametri di intestazione comuni. Un riepilogo di questi parametri di intestazione si trova nella Tabella 3. Questa tabella deve essere consultata per determinare il valore dell'etichetta e il tipo del valore.
Il set di parametri di intestazione definiti in questa sezione è il seguente:
alg: Questo parametro di intestazione è utilizzato per indicare l'algoritmo utilizzato per l'elaborazione di sicurezza. Questo parametro di intestazione DEVE essere autenticato laddove esiste la capacità di farlo. Questo supporto è fornito da algoritmi o costruzioni AEAD (ad esempio, COSE_Sign e COSE_Mac0). Questa autenticazione può essere effettuata posizionando il parametro di intestazione nel contenitore dei parametri di intestazione protetti o come parte dei dati forniti esternamente (Sezione 4.3). Il valore è tratto dal registro "COSE Algorithms" (vedere [COSE.Algorithms]).
crit: Questo parametro di intestazione è utilizzato per indicare quali parametri di intestazione protetti un'applicazione che sta elaborando un messaggio è tenuta a comprendere. I parametri di intestazione definiti in questo documento non devono essere inclusi, in quanto dovrebbero essere compresi da tutte le implementazioni. Inoltre, il parametro di intestazione "counter signature" (etichetta 7) definito da [RFC8152] deve essere compreso dalle nuove implementazioni, per rimanere compatibile con i mittenti che aderiscono a quel documento e presumono che tutte le implementazioni lo comprenderanno. Quando presente, il parametro di intestazione "crit" DEVE essere posizionato nel contenitore dei parametri di intestazione protetti. L'array DEVE avere almeno un valore al suo interno.
Non tutte le etichette dei parametri di intestazione devono essere incluse nel parametro di intestazione "crit". Le regole per decidere quali parametri di intestazione sono posizionati nell'array sono:
* Le etichette intere nell'intervallo da 0 a 7 DOVREBBERO essere omesse.
* Le etichette intere nell'intervallo da -1 a -128 possono essere omesse. Gli algoritmi possono assegnare etichette in questo intervallo in cui la capacità di elaborare il contenuto dell'etichetta è considerata fondamentale per l'implementazione dell'algoritmo. Gli algoritmi possono assegnare etichette al di fuori di questo intervallo e includerle nel parametro di intestazione "crit" quando la capacità di elaborare il contenuto dell'etichetta non è considerata una funzionalità fondamentale dell'algoritmo ma deve essere compresa per elaborare correttamente questa istanza. Le etichette intere nell'intervallo da -129 a -65536 DOVREBBERO essere incluse, in quanto si tratterebbe di parametri di intestazione meno comuni che potrebbero non essere generalmente supportati.
* Le etichette per i parametri di intestazione richiesti per un'applicazione POSSONO essere omesse. Le applicazioni dovrebbero avere una dichiarazione che dichiara se l'etichetta può essere omessa o meno.
I parametri di intestazione indicati da "crit" possono essere elaborati dal codice della libreria di sicurezza o da un'applicazione che utilizza una libreria di sicurezza; l'unico requisito è che il parametro di intestazione venga elaborato. Se l'elenco dei valori "crit" include un'etichetta per la quale il parametro di intestazione non è nel contenitore dei parametri di intestazione protetti, questo è un errore fatale nell'elaborazione del messaggio.
content type: Questo parametro di intestazione è utilizzato per indicare il tipo di contenuto dei dati nel campo "payload" o "ciphertext". Gli interi provengono dalla tabella del registro IANA "CoAP Content-Formats" [COAP.Formats]. I valori di testo seguono la sintassi di "<type-name>/<subtype-name>", dove <type-name> e <subtype-name> sono definiti nella Sezione 4.2 di [RFC6838]. Gli spazi iniziali e finali non sono consentiti. I valori del tipo di contenuto testuale, insieme ai parametri e ai sottoparametri, possono essere localizzati utilizzando il registro IANA "Media Types". Le applicazioni DOVREBBERO fornire questo parametro di intestazione se la struttura del contenuto è potenzialmente ambigua.
kid: Questo parametro di intestazione identifica un pezzo di dati che può essere utilizzato come input per trovare la chiave crittografica necessaria. Il valore di questo parametro di intestazione può essere abbinato al membro "kid" in una struttura COSE_Key. Altri metodi di distribuzione delle chiavi possono definire un campo equivalente da abbinare. Le applicazioni NON DEVONO presumere che i valori "kid" siano unici. Potrebbe esserci più di una chiave con lo stesso valore "kid", quindi tutte le chiavi associate a questo "kid" potrebbero dover essere controllate. La struttura interna dei valori "kid" non è definita e non può essere affidata dalle applicazioni. I valori dell'identificatore della chiave sono suggerimenti su quale chiave utilizzare. Questo non è un campo critico per la sicurezza. Per questo motivo, può essere posizionato nel contenitore dei parametri di intestazione non protetti.
IV: Questo parametro di intestazione contiene il valore del vettore di inizializzazione (IV). Per alcuni algoritmi di crittografia simmetrica, questo può essere indicato come un nonce. L'IV può essere posizionato nel contenitore non protetto, poiché per gli algoritmi AE e AEAD, la modifica dell'IV causerà il fallimento della decrittazione.
Partial IV: Questo parametro di intestazione contiene una parte del valore IV. Quando si utilizza la struttura COSE_Encrypt0, una parte dell'IV può essere parte del contesto associato alla chiave (Context IV), mentre una parte può essere modificata con ogni messaggio (Partial IV). Questo campo viene utilizzato per trasportare un valore che fa sì che l'IV venga modificato per ogni messaggio. Il Partial IV può essere posizionato nel contenitore non protetto, poiché la modifica del valore farà sì che la decrittazione produca testo in chiaro che è facilmente rilevabile come confuso. I parametri di intestazione "Initialization Vector" e "Partial Initialization Vector" NON DEVONO essere entrambi presenti nello stesso livello di sicurezza.
L'IV del messaggio viene generato dai seguenti passaggi:
1. Riempire a sinistra il Partial IV con zeri fino alla lunghezza dell'IV (determinata dall'algoritmo).
2. XOR il Partial IV riempito con il Context IV.
+=========+=======+========+=====================+==================+ | Name | Label | Value | Value Registry | Description | | | | Type | | | +=========+=======+========+=====================+==================+ | alg | 1 | int / | COSE Algorithms | Cryptographic | | | | tstr | registry | algorithm to use | +---------+-------+--------+---------------------+------------------+ | crit | 2 | [+ | COSE Header | Critical header | | | | label] | Parameters | parameters to be | | | | | registry | understood | +---------+-------+--------+---------------------+------------------+ | content | 3 | tstr / | CoAP Content- | Content type of | | type | | uint | Formats or Media | the payload | | | | | Types registries | | +---------+-------+--------+---------------------+------------------+ | kid | 4 | bstr | | Key identifier | +---------+-------+--------+---------------------+------------------+ | IV | 5 | bstr | | Full | | | | | | Initialization | | | | | | Vector | +---------+-------+--------+---------------------+------------------+ | Partial | 6 | bstr | | Partial | | IV | | | | Initialization | | | | | | Vector | +---------+-------+--------+---------------------+------------------+
Tabella 3: Parametri di Intestazione Comuni
Il frammento CDDL che rappresenta il set di parametri di intestazione definiti in questa sezione è fornito di seguito. Ciascuno dei parametri di intestazione è etichettato come opzionale, perché non è necessario che siano in ogni mappa; i parametri di intestazione richiesti in mappe specifiche sono discussi sopra.
Generic_Headers = ( ? 1 => int / tstr, ; algorithm identifier ? 2 => [+label], ; criticality ? 3 => tstr / int, ; content type ? 4 => bstr, ; key identifier ? ( 5 => bstr // ; IV 6 => bstr ) ; Partial IV )