Anhang B. Key Tag-Berechnung (Key Tag Calculation)
Das Key Tag-Feld in den Ressourceneintragstypen RRSIG und DS bietet einen Mechanismus zur effizienten Auswahl eines öffentlichen Schlüssels. In den meisten Fällen kann die Kombination aus Besitzername, Algorithmus und Key Tag den DNSKEY-Eintrag effizient identifizieren. Sowohl die RRSIG- als auch die DS-Ressourceneinträge haben entsprechende DNSKEY-Einträge. Das Key Tag-Feld in den RRSIG- und DS-Einträgen kann verwendet werden, um bei der effizienten Auswahl des entsprechenden DNSKEY RR zu helfen, wenn mehr als ein DNSKEY RR-Kandidat verfügbar ist.
Es ist jedoch wichtig zu beachten, dass das Key Tag kein eindeutiger Identifikator ist. Es ist möglich, dass zwei unterschiedliche DNSKEY RRs denselben Besitzernamen, denselben Algorithmus und dasselbe Key Tag haben. Das Key Tag wird verwendet, um die möglichen Kandidatenschlüssel zu begrenzen, aber es identifiziert einen DNSKEY-Eintrag nicht eindeutig. Implementierungen DÜRFEN NICHT annehmen, dass das Key Tag einen DNSKEY RR eindeutig identifiziert.
Das Key Tag ist für alle DNSKEY-Algorithmustypen gleich, außer für Algorithmus 1 (siehe Anhang B.1 für die Definition des Key Tag für Algorithmus 1). Der Key Tag-Algorithmus ist die Summe des Wire-Formats des DNSKEY RDATA, aufgeteilt in 2-Oktett-Gruppen. Zuerst wird das RDATA (im Wire-Format) als eine Reihe von 2-Oktett-Gruppen behandelt. Diese Gruppen werden dann addiert, wobei Übertragebits ignoriert werden.
Eine Referenzimplementierung des Key Tag-Algorithmus in Form einer ANSI-C-Funktion ist unten angegeben, wobei der RDATA-Teil des DNSKEY RR als Eingabe verwendet wird. Es ist nicht erforderlich, diesen Referenzcode wörtlich zu verwenden, aber der numerische Wert des Key Tag MUSS mit dem von der Referenzimplementierung für dieselbe Eingabe generierten Wert identisch sein.
Beachten Sie, dass der zur Berechnung des Key Tag verwendete Algorithmus fast, aber nicht ganz die Einerkomplement-Prüfsumme (one's complement checksum) ist, die in vielen anderen Internet-Protokollen verwendet wird. Der hier beschriebene Algorithmus MUSS anstelle der Einerkomplement-Prüfsumme zur Berechnung des Key Tag verwendet werden.
Die folgende ANSI-C-Referenzimplementierung berechnet den Wert eines Key Tag. Diese Referenzimplementierung gilt für alle Algorithmustypen außer Algorithmus 1 (siehe Anhang B.1). Die Eingabe ist das Wire-Format des RDATA-Teils des DNSKEY RR. Der Code ist zur Klarheit geschrieben, nicht zur Effizienz.
/*
* Nimmt an, dass int mindestens 16 Bit ist.
* Das erste Oktett des Key Tag ist die
* höchstwertigen 8 Bits des Rückgabewerts;
* Das zweite Oktett des Key Tag ist die
* niedrigstwertigen 8 Bits des Rückgabewerts.
*/
unsigned int
keytag (
unsigned char key[], /* der RDATA-Teil des DNSKEY RR */
unsigned int keysize /* das RDLENGTH */
)
{
unsigned long ac; /* angenommen 32 Bit oder größer */
int i; /* Schleifenindex */
for ( ac = 0, i = 0; i < keysize; ++i )
ac += (i & 1) ? key[i] : key[i] << 8;
ac += (ac >> 16) & 0xFFFF;
return ac & 0xFFFF;
}
B.1. Key Tag für Algorithmus 1 (Key Tag for Algorithm 1 (RSA/MD5))
Das Key Tag für Algorithmus 1 (RSA/MD5) ist aus historischen Gründen anders definiert als das Key Tag für alle anderen Algorithmen. Für einen DNSKEY RR mit Algorithmus 1 ist das Key Tag definiert als die höchstwertigen 16 Bits der niedrigstwertigen 24 Bits im Public Key Modulus (mit anderen Worten, das 4. und 5. Oktett von hinten im Public Key Modulus).
Beachten Sie, dass die Verwendung von Algorithmus 1 NICHT EMPFOHLEN wird.
Navigation verwandter Kapitel: