Skip to main content

附录B. Key Tag计算 (Key Tag Calculation)

RRSIG和DS资源记录类型中的Key Tag字段提供了一种有效选择公钥的机制。在大多数情况下,所有者名称、算法和key tag的组合可以有效地标识DNSKEY记录。RRSIG和DS资源记录都有相应的DNSKEY记录。RRSIG和DS记录中的Key Tag字段可用于在有多个候选DNSKEY RR可用时帮助有效选择相应的DNSKEY RR。

但是,必须注意的是,key tag不是唯一标识符。理论上两个不同的DNSKEY RR可能具有相同的所有者名称、相同的算法和相同的key tag。key tag用于限制可能的候选密钥,但它不能唯一标识DNSKEY记录。实现禁止 (MUST NOT) 假设key tag唯一标识DNSKEY RR。

除算法1 (请参见附录B.1了解算法1的key tag定义) 外,所有DNSKEY算法类型的key tag都相同。key tag算法是将DNSKEY RDATA的线格式分解为2个八位字节组的总和。首先,RDATA (线格式) 被视为一系列2个八位字节组。然后将这些组加在一起,忽略任何进位位。

以ANSI C函数形式给出的key tag算法的参考实现如下,使用DNSKEY RR的RDATA部分作为输入。没有必要逐字使用以下参考代码,但Key Tag的数值必须 (MUST) 与参考实现为相同输入生成的数值相同。

请注意,用于计算Key Tag的算法几乎但不完全与许多其他互联网协议中使用的熟悉的反码校验和相同。必须 (MUST) 使用此处描述的算法而不是反码校验和来计算Key Tag。

以下ANSI C参考实现计算Key Tag的值。此参考实现适用于除算法1之外的所有算法类型 (参见附录B.1)。输入是DNSKEY RR的RDATA部分的线格式。代码为了清晰而编写,而不是为了效率。

/*
* 假设int至少为16位。
* key tag的第一个八位字节是返回值的最高8位;
* key tag的第二个八位字节是返回值的最低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 (RSA/MD5) 的Key Tag (Key Tag for Algorithm 1 (RSA/MD5))

算法1 (RSA/MD5) 的key tag的定义与所有其他算法的key tag不同,出于历史原因。对于算法为1的DNSKEY RR,key tag定义为公钥模数的最低24位中的最高16位 (换句话说,公钥模数的倒数第4个和倒数第3个八位字节)。

请注意,不推荐 (NOT RECOMMENDED) 使用算法1。


相关章节导航: