メインコンテンツまでスキップ

付録 B. キータグ計算

本付録は、キータグ(key tag)の計算方法を記述する。キータグは、与えられた DNSKEY リソースレコードを含む DNSKEY RRset の中からレコードを効率的に選択するために使用される。DNSKEY リソースレコードの RDATA 内のキータグフィールドは、RDATA の符号なし 16 ビット整数である。キータグの値は、DNSKEY リソースレコードの所有者名(owner name)およびアルゴリズム(algorithm)とともに、DNSKEY RR の選択に使用される。

キータグは、[RFC2535] 第 3.2.1 節で示されたアルゴリズムと等価な、以下の疑似コードに従って計算 MUST である。同じキータグ値を生成するあらゆる等価なアルゴリズムによって生成してもよい。

     ;;
;; "key" には、フラグ(Flags)、プロトコル(Protocol)、
;; アルゴリズム(Algorithm)、公開鍵(Public Key)の順で
;; 並んだ DNSKEY リソースレコードの RDATA 部分が含まれるとする。
;;
;; "keytag" は符号なし整数であるとする。
;;
;; キータグを計算するアルゴリズムは以下のとおり:
;;

Keytag = 0

IF (DNSKEY アルゴリズムが RSASHA1 または RSASHA1-NSEC3-SHA1 である) THEN
Keytag = Key の最上位バイトの上位 8 ビット(most significant 8 bits)

ELSE
Key の各オクテット(octet) "i" (0 から数え、ネットワークバイト順 Network Byte Order)について:
i が奇数なら、Keytag = Keytag + (i と Key[i] の積)(符号なし 16 ビット計算)
i が偶数なら、Keytag = Keytag + Key[i]

Key の長さが奇数の場合、上記のとおり Keytag に第 0 オクテット(すなわち Key[0])を加算

Keytag = (Keytag AND 0xFFFF) + (Keytag >> 16)
Keytag = (Keytag AND 0xFFFF) + (Keytag >> 16)
Keytag = Keytag AND 0xFFFF

END IF

上記疑似コードにおいて、DNSKEY アルゴリズムが RSASHA1 または RSASHA1-NSEC3-SHA1 の場合のみ例外である。これらのアルゴリズムについては、キータグはキー(公開鍵素材)の最上位オクテットの値に設定 MUST である。この例外により、これらのアルゴリズムのキータグの分布品質が向上する。

注:計算は符号なし 16 ビット整数上で行われるため、上記のいずれの加算もラップアラウンド(wrap around)する可能性がある。実装は、疑似コードに示すとおり、計算過程において加算のオーバーフローを符号なし 16 ビット整数の法演算(modulo 2^16)で処理 MUST である。

B.1. 計算例​

参考として、具体的なキータグ計算の例を示す。以下の DNSKEY リソースレコード(ゾーンファイル表記)を考える。

example.com. 3600 IN DNSKEY 257 3 5 (
AwEAAc……(完全な鍵素材は省略)
) ; key id = 12345

このレコードの完全な RDATA(フラグ=257、プロトコル=3、アルゴリズム=5、およびそれに続く公開鍵オクテット)に上記アルゴリズムを適用して得られるキータグは 12345 となる。この値は、dnssec-keygen などのツールが報告する key id と一致するはずである。

説明:本例はキータグアルゴリズムの構造を実演するために示したものである。実際の運用では、標準的な DNSSEC ツールを用いてキータグ値を生成および検証すること。


関連章ナビゲーション: