Annexe B. Calcul de l'étiquette de clé (Key Tag Calculation)
Le champ Key Tag dans les types d'enregistrements de ressources RRSIG et DS fournit un mécanisme pour sélectionner efficacement une clé publique. Dans la plupart des cas, la combinaison du nom de propriétaire, de l'algorithme et de l'étiquette de clé peut identifier efficacement l'enregistrement DNSKEY. Les enregistrements de ressources RRSIG et DS ont tous deux des enregistrements DNSKEY correspondants. Le champ Key Tag dans les enregistrements RRSIG et DS peut être utilisé pour aider à sélectionner efficacement le RR DNSKEY correspondant lorsque plus d'un RR DNSKEY candidat est disponible.
Cependant, il est essentiel de noter que l'étiquette de clé n'est pas un identifiant unique. Il est possible pour deux RR DNSKEY distincts d'avoir le même nom de propriétaire, le même algorithme et la même étiquette de clé. L'étiquette de clé est utilisée pour limiter les clés candidates possibles, mais elle n'identifie pas de manière unique un enregistrement DNSKEY. Les implémentations NE DOIVENT PAS supposer que l'étiquette de clé identifie de manière unique un RR DNSKEY.
L'étiquette de clé est la même pour tous les types d'algorithmes DNSKEY sauf l'algorithme 1 (voir l'annexe B.1 pour la définition de l'étiquette de clé pour l'algorithme 1). L'algorithme d'étiquette de clé est la somme du format de transmission du RDATA DNSKEY divisé en groupes de 2 octets. Tout d'abord, le RDATA (en format de transmission) est traité comme une série de groupes de 2 octets. Ces groupes sont ensuite additionnés, en ignorant les bits de retenue.
Une implémentation de référence de l'algorithme d'étiquette de clé, sous la forme d'une fonction C ANSI, est donnée ci-dessous, en utilisant la partie RDATA du RR DNSKEY comme entrée. Il n'est pas nécessaire d'utiliser ce code de référence tel quel, mais la valeur numérique du Key Tag DOIT être identique à la valeur générée par l'implémentation de référence pour la même entrée.
Notez que l'algorithme utilisé pour calculer le Key Tag est presque mais pas tout à fait la somme de contrôle en complément à un (one's complement checksum) utilisée dans de nombreux autres protocoles Internet. L'algorithme décrit ici DOIT être utilisé plutôt que la somme de contrôle en complément à un pour calculer le Key Tag.
L'implémentation de référence C ANSI suivante calcule la valeur d'un Key Tag. Cette implémentation de référence s'applique à tous les types d'algorithmes sauf l'algorithme 1 (voir l'annexe B.1). L'entrée est le format de transmission de la partie RDATA du RR DNSKEY. Le code est écrit pour la clarté, pas pour l'efficacité.
/*
* Suppose que int fait au moins 16 bits.
* Le premier octet de l'étiquette de clé est les 8 bits
* les plus significatifs de la valeur de retour ;
* Le deuxième octet de l'étiquette de clé est les 8 bits
* les moins significatifs de la valeur de retour.
*/
unsigned int
keytag (
unsigned char key[], /* la partie RDATA du RR DNSKEY */
unsigned int keysize /* le RDLENGTH */
)
{
unsigned long ac; /* supposé être de 32 bits ou plus */
int i; /* indice de boucle */
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. Étiquette de clé pour l'algorithme 1 (Key Tag for Algorithm 1 (RSA/MD5))
L'étiquette de clé pour l'algorithme 1 (RSA/MD5) est définie différemment de l'étiquette de clé pour tous les autres algorithmes, pour des raisons historiques. Pour un RR DNSKEY avec l'algorithme 1, l'étiquette de clé est définie comme étant les 16 bits les plus significatifs des 24 bits les moins significatifs du modulus de clé publique (en d'autres termes, les 4ème et 5ème derniers octets du modulus de clé publique).
Notez que l'utilisation de l'algorithme 1 N'EST PAS RECOMMANDÉE.
Navigation des chapitres connexes :