Appendice B. Calcolo del Key Tag (Key Tag Calculation)
Il campo Key Tag nei tipi di record di risorse RRSIG e DS fornisce un meccanismo per selezionare efficientemente una chiave pubblica. Nella maggior parte dei casi, la combinazione di nome del proprietario, algoritmo e key tag può identificare efficientemente il record DNSKEY. Sia i record di risorse RRSIG che DS hanno record DNSKEY corrispondenti. Il campo Key Tag nei record RRSIG e DS può essere utilizzato per aiutare a selezionare efficientemente il RR DNSKEY corrispondente quando è disponibile più di un RR DNSKEY candidato.
Tuttavia, è essenziale notare che il key tag non è un identificatore univoco. È possibile che due RR DNSKEY distinti abbiano lo stesso nome del proprietario, lo stesso algoritmo e lo stesso key tag. Il key tag viene utilizzato per limitare le possibili chiavi candidate, ma non identifica univocamente un record DNSKEY. Le implementazioni NON DEVONO presumere che il key tag identifichi univocamente un RR DNSKEY.
Il key tag è lo stesso per tutti i tipi di algoritmo DNSKEY eccetto l'algoritmo 1 (vedere Appendice B.1 per la definizione del key tag per l'algoritmo 1). L'algoritmo key tag è la somma del formato wire del RDATA DNSKEY suddiviso in gruppi di 2 ottetti. Prima, il RDATA (in formato wire) viene trattato come una serie di gruppi di 2 ottetti. Questi gruppi vengono quindi sommati, ignorando eventuali bit di riporto.
Un'implementazione di riferimento dell'algoritmo key tag, nella forma di una funzione C ANSI, è data di seguito, utilizzando la porzione RDATA del RR DNSKEY come input. Non è necessario utilizzare questo codice di riferimento alla lettera, ma il valore numerico del Key Tag DEVE essere identico al valore generato dall'implementazione di riferimento per lo stesso input.
Si noti che l'algoritmo utilizzato per calcolare il Key Tag è quasi ma non esattamente il checksum del complemento a uno (one's complement checksum) utilizzato in molti altri protocolli Internet. L'algoritmo descritto qui DEVE essere utilizzato piuttosto che il checksum del complemento a uno per calcolare il Key Tag.
La seguente implementazione di riferimento C ANSI calcola il valore di un Key Tag. Questa implementazione di riferimento si applica a tutti i tipi di algoritmo eccetto l'algoritmo 1 (vedere Appendice B.1). L'input è il formato wire della porzione RDATA del RR DNSKEY. Il codice è scritto per chiarezza, non per efficienza.
/*
* Presume che int sia almeno 16 bit.
* Il primo ottetto del key tag è gli 8 bit
* più significativi del valore di ritorno;
* Il secondo ottetto del key tag è gli 8 bit
* meno significativi del valore di ritorno.
*/
unsigned int
keytag (
unsigned char key[], /* la parte RDATA del RR DNSKEY */
unsigned int keysize /* il RDLENGTH */
)
{
unsigned long ac; /* presunto essere 32 bit o più grande */
int i; /* indice del ciclo */
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 per l'algoritmo 1 (Key Tag for Algorithm 1 (RSA/MD5))
Il key tag per l'algoritmo 1 (RSA/MD5) è definito diversamente dal key tag per tutti gli altri algoritmi, per ragioni storiche. Per un RR DNSKEY con algoritmo 1, il key tag è definito come i 16 bit più significativi dei 24 bit meno significativi nel modulo della chiave pubblica (in altre parole, il 4° e il 5° ottetto dalla fine del modulo della chiave pubblica).
Si noti che l'uso dell'algoritmo 1 NON È RACCOMANDATO.
Navigazione dei capitoli correlati: