Zum Hauptinhalt springen

6. MAC-Objekte

  1. MAC-Objekte

COSE unterstützt zwei verschiedene MAC-Strukturen. COSE_Mac0 wird verwendet, wenn keine Empfängerstruktur erforderlich ist, da der zu verwendende Schlüssel implizit bekannt ist. COSE_Mac wird in allen anderen Fällen verwendet. Dazu gehören Fälle, in denen mehrere Empfänger erforderlich sind, der Schlüssel unbekannt ist oder ein anderer Empfängeralgorithmus als Direct verwendet wird.

In diesem Abschnitt beschreiben wir die Struktur und die Methoden, die bei der MAC-Authentifizierung in COSE verwendet werden sollen. Dieses Dokument erlaubt die Verwendung aller gleichen Klassen von Empfängeralgorithmen, die auch für die Verschlüsselung zulässig sind.

Es gibt zwei Modi, in denen MAC-Operationen verwendet werden können. Der erste ist lediglich eine Überprüfung, ob der Inhalt seit der Berechnung des MAC nicht geändert wurde. Für diesen Zweck kann jede Klasse von Empfängeralgorithmen verwendet werden. Der zweite Modus besteht darin, sowohl zu überprüfen, ob der Inhalt seit der Berechnung des MAC nicht geändert wurde, als auch den Empfängeralgorithmus zu verwenden, um zu verifizieren, wer ihn gesendet hat. Die Klassen von Empfängeralgorithmen, die dies unterstützen, sind diejenigen, die ein vorab geteiltes Geheimnis (Preshared Secret) verwenden oder eine Static-Static (SS) Schlüsselvereinbarung (ohne den Key-Wrap-Schritt) durchführen. In beiden Fällen kann die Entität, die den Nachrichten-MAC erstellt und gesendet hat, validiert werden. (Dieses Wissen über den Absender setzt voraus, dass nur zwei Parteien beteiligt sind und dass Sie die Nachricht nicht an sich selbst gesendet haben.) Die Ursprungseigenschaft kann mit beiden MAC-Nachrichtenstrukturen erhalten werden.

6.1. MAC-Nachricht mit Empfängern

Eine MAC-Nachricht mit mehreren Empfängern verwendet zwei Strukturen: die in diesem Abschnitt definierte COSE_Mac-Struktur zum Tragen des Inhalts und die COSE_recipient-Struktur (Abschnitt 5.1), um den für die MAC-Berechnung verwendeten Schlüssel zu halten. Beispiele für MAC-Nachrichten finden Sie in Anhang C.5.

Die MAC-Struktur kann je nach Kontext, in dem sie verwendet wird, entweder getaggt oder ungetaggt codiert werden. Eine getaggte COSE_Mac-Struktur wird durch das CBOR-Tag 97 identifiziert. Das CDDL-Fragment, das dies darstellt, ist:

COSE_Mac_Tagged = #6.97(COSE_Mac)

Die COSE_Mac-Struktur ist ein CBOR-Array. Die Felder des Arrays sind in der Reihenfolge:

protected: Dies ist wie in Abschnitt 3 beschrieben.

unprotected: Dies ist wie in Abschnitt 3 beschrieben.

payload: Dieses Feld enthält den serialisierten Inhalt, der mit einem MAC versehen werden soll. Wenn die Payload nicht in der Nachricht vorhanden ist, muss die Anwendung die Payload separat bereitstellen. Die Payload wird in einen bstr eingewickelt, um sicherzustellen, dass sie ohne Änderungen transportiert wird. Wenn die Payload separat transportiert wird (d. h. Detached Content), wird an dieser Stelle ein nil-CBOR-Wert platziert, und es liegt in der Verantwortung der Anwendung, sicherzustellen, dass sie ohne Änderungen transportiert wird.

tag: Dieses Feld enthält den MAC-Wert.

recipients: Dies ist wie in Abschnitt 5.1 beschrieben.

Das CDDL-Fragment, das den obigen Text für COSE_Mac darstellt, folgt.

COSE_Mac = [ Headers, payload : bstr / nil, tag : bstr, recipients : [+COSE_recipient] ]

6.2. MAC-Nachrichten mit implizitem Schlüssel

In diesem Abschnitt beschreiben wir die Struktur und die Methoden, die bei der MAC-Authentifizierung für die Fälle verwendet werden sollen, in denen der Empfänger implizit bekannt ist.

Die MAC-Nachricht verwendet die in diesem Abschnitt definierte COSE_Mac0-Struktur, um den Inhalt zu tragen. Beispiele für MAC-Nachrichten mit einem impliziten Schlüssel finden Sie in Anhang C.6.

Die MAC-Struktur kann je nach Kontext, in dem sie verwendet wird, entweder getaggt oder ungetaggt codiert werden. Eine getaggte COSE_Mac0-Struktur wird durch das CBOR-Tag 17 identifiziert. Das CDDL-Fragment, das dies darstellt, ist:

COSE_Mac0_Tagged = #6.17(COSE_Mac0)

Die COSE_Mac0-Struktur ist ein CBOR-Array. Die Felder des Arrays sind in der Reihenfolge:

protected: Dies ist wie in Abschnitt 3 beschrieben.

unprotected: Dies ist wie in Abschnitt 3 beschrieben.

payload: Dies ist wie in Abschnitt 6.1 beschrieben.

tag: Dieses Feld enthält den MAC-Wert.

Das CDDL-Fragment, das dem obigen Text entspricht, ist:

COSE_Mac0 = [ Headers, payload : bstr / nil, tag : bstr, ]

6.3. So berechnen und verifizieren Sie einen MAC

Um eine konsistente Codierung der zu authentifizierenden Daten zu erhalten, wird die MAC_structure verwendet, um die kanonische Form zu erstellen. Die MAC_structure ist ein CBOR-Array. Die Felder der MAC_structure sind in der Reihenfolge:

  1. Eine Kontexttextzeichenfolge, die die Struktur identifiziert, die codiert wird. Diese Kontexttextzeichenfolge ist "MAC" für die COSE_Mac-Struktur. Diese Kontexttextzeichenfolge ist "MAC0" für die COSE_Mac0-Struktur.

  2. Die geschützten Attribute aus der Körperstruktur. Wenn keine geschützten Attribute vorhanden sind, wird ein bstr der Länge Null verwendet.

  3. Die extern bereitgestellten Daten von der Anwendung, codiert als bstr-Typ. Wenn dieses Feld nicht angegeben ist, ist es standardmäßig eine Bytezeichenfolge der Länge Null. (Siehe Abschnitt 4.3 für Anwendungsleitlinien zum Erstellen dieses Feldes.)

  4. Die mit einem MAC zu versehende Payload, codiert als bstr-Typ. Hier wird die vollständige Payload verwendet, unabhängig davon, wie sie transportiert wird.

Das CDDL-Fragment, das dem obigen Text entspricht, ist:

MAC_structure = [ context : "MAC" / "MAC0", protected : empty_or_serialized_map, external_aad : bstr, payload : bstr ]

Die Schritte zum Berechnen eines MAC sind:

  1. Erstellen Sie eine MAC_structure und füllen Sie sie mit den entsprechenden Feldern.

  2. Erstellen Sie den Wert ToBeMaced, indem Sie die MAC_structure unter Verwendung der in Abschnitt 9 beschriebenen Codierung in eine Bytezeichenfolge codieren.

  3. Rufen Sie den MAC-Erstellungsalgorithmus auf und übergeben Sie K (den zu verwendenden Schlüssel), alg (den Algorithmus zum Erstellen des MAC) und ToBeMaced (den Wert, für den der MAC berechnet werden soll).

  4. Platzieren Sie den resultierenden MAC im Feld "tag" der COSE_Mac- oder COSE_Mac0-Struktur.

  5. Verschlüsseln und codieren Sie für COSE_Mac-Strukturen den MAC-Schlüssel für jeden Empfänger der Nachricht.

Die Schritte zum Verifizieren eines MAC sind:

  1. Erstellen Sie eine MAC_structure und füllen Sie sie mit den entsprechenden Feldern.

  2. Erstellen Sie den Wert ToBeMaced, indem Sie die MAC_structure unter Verwendung der in Abschnitt 9 beschriebenen Codierung in eine Bytezeichenfolge codieren.

  3. Erhalten Sie für COSE_Mac-Strukturen den kryptografischen Schlüssel, indem Sie eine der Empfängerstrukturen decodieren und entschlüsseln.

  4. Rufen Sie den MAC-Erstellungsalgorithmus auf und übergeben Sie K (den zu verwendenden Schlüssel), alg (den Algorithmus zum Erstellen des MAC) und ToBeMaced (den Wert, für den der MAC berechnet werden soll).

  5. Vergleichen Sie den MAC-Wert mit dem Feld "tag" der COSE_Mac- oder COSE_Mac0-Struktur.