付録 B. Key Tag 計算 (Key Tag Calculation)
RRSIG および DS リソースレコードタイプの Key Tag フィールドは、公開鍵を効率的に選択するメカニズムを提供します。ほとんどの場合、所有者名、アルゴリズム、および Key Tag の組み合わせで DNSKEY レコードを効率的に識別できます。RRSIG と DS リソースレコードの両方には、対応する DNSKEY レコードがあります。複数の候補 DNSKEY RR が利用可能な場合、RRSIG および DS レコードの Key Tag フィールドを使用して、対応する DNSKEY RR を効率的に選択することができます。
ただし、Key Tag は一意の識別子ではないことに注意することが不可欠です。2つの異なる DNSKEY RR が同じ所有者名、同じアルゴリズム、および同じ Key Tag を持つことが可能です。Key Tag は可能な候補鍵を制限するために使用されますが、DNSKEY レコードを一意に識別するわけではありません。実装は、Key Tag が DNSKEY RR を一意に識別すると仮定してはなりません (MUST NOT)。
Key Tag は、アルゴリズム1を除くすべての DNSKEY アルゴリズムタイプで同じです (アルゴリズム1の Key Tag の定義については付録 B.1 を参照)。Key Tag アルゴリズムは、2オクテットグループに分割された DNSKEY RDATA のワイヤ形式の合計です。まず、RDATA (ワイヤ形式) は一連の2オクテットグループとして扱われます。次に、これらのグループを桁上げビットを無視して加算します。
Key Tag アルゴリズムの参照実装を、ANSI C 関数の形式で以下に示します。DNSKEY RR の RDATA 部分を入力として使用します。この参照コードを逐語的に使用する必要はありませんが、Key Tag の数値は、同じ入力に対して参照実装が生成する値と同一でなければなりません (MUST)。
Key Tag を計算するために使用されるアルゴリズムは、他の多くのインターネットプロトコルで使用される1の補数チェックサム (one's complement checksum) とほぼ同じですが、完全に同じではないことに注意してください。Key Tag を計算するには、1の補数チェックサムではなく、ここで説明されているアルゴリズムを使用しなければなりません (MUST)。
以下の ANSI C 参照実装は、Key Tag の値を計算します。この参照実装は、アルゴリズム1を除くすべてのアルゴリズムタイプに適用されます (付録 B.1 を参照)。入力は DNSKEY RR の RDATA 部分のワイヤ形式です。コードは効率性ではなく、明確性のために記述されています。
/*
* int は少なくとも16ビットであると仮定します。
* Key Tag の最初のオクテットは、
* 戻り値の最上位8ビットです。
* Key Tag の2番目のオクテットは、
* 戻り値の最下位8ビットです。
*/
unsigned int
keytag (
unsigned char key[], /* DNSKEY RR の RDATA 部分 */
unsigned int keysize /* RDLENGTH */
)
{
unsigned long ac; /* 32ビット以上であると仮定 */
int i; /* ループインデックス */
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. アルゴリズム1の Key Tag (Key Tag for Algorithm 1 (RSA/MD5))
アルゴリズム1 (RSA/MD5) の Key Tag は、歴史的な理由により、他のすべてのアルゴリズムの Key Tag とは異なる方法で定義されています。アルゴリズム1を持つ DNSKEY RR の場合、Key Tag は公開鍵モジュラス (public key modulus) の最下位24ビットの最上位16ビットとして定義されます (言い換えれば、公開鍵モジュラスの下から4番目と5番目のオクテット)。
アルゴリズム1の使用は推奨されません (NOT RECOMMENDED)。
関連章へのナビゲーション: