我正在为计费系统完成域注册器插件(在这种情况下还管理域配置),最后一点与实现 DNSSEC 支持有关。
计费系统正在向我的 PHP 插件发送以下 SAMPLE DNSSEC 相关数据:
'dnsSecInfo' =>
array (
0 =>
array (
'keyAlg' => 5,
'digestAlg' => 1,
'digest' => '1d181b34061ee98088b7a9e6db6e41a130674df0',
'key' => 'AwEAAaqZeENizOE6uvpDtIfQBB26YebvRdZA/ZjXjKLZdMmMK641sBIvho+yrTveIYclM+8lEVHiq64MY8R2G1IPmKDKXG26rM7NVE0Qx1KL2wRVbRrduRdBmKgJo3XQ3niueviKYXXmeVIO3EhrJsCq272Tm3DaDvng/M7uw1vDnanR2pYNcxI08fZOA6PLGDoUWlDNLGAHHkCvfdWUktVt1DA0GtL/qE/WUgxK6hJyeaXXb0+yq3qCMZh48WgluMFib54D0GN3PI3ZZvBMblAZHmFGqgyVwtPKEimXm/VREe2QtZy3cRgPbfOuiQi8gRhzO+/If8Wi9YnyLovjdsSjRsE=',
),
),
RFC 4034具有以下内容:
2.1. DNSKEY RDATA Wire Format
The RDATA for a DNSKEY RR consists of a 2 octet Flags Field, a 1
octet Protocol Field, a 1 octet Algorithm Field, and the Public Key
Field.
1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Flags | Protocol | Algorithm |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ /
/ Public Key /
/ /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
同一协议的附录 B:
The input is the wire
format of the RDATA portion of the DNSKEY RR.
.....
unsigned int
keytag (
unsigned char key[], /* the RDATA part of the DNSKEY RR */
unsigned int keysize /* the RDLENGTH */
)
{
unsigned long ac; /* assumed to be 32 bits or larger */
int i; /* loop index */
for ( ac = 0, i = 0; i < keysize; ++i )
ac += (i & 1) ? key[i] : key[i] << 8;
ac += (ac >> 16) & 0xFFFF;
return ac & 0xFFFF;
}
注册域名的注册表需要4 个必填字段:
- 钥匙标签
- 算法(被认为等于插件输入中的 keyAlg)
- 摘要类型(我相信它在插件输入中称为 digestAlg)
- 摘要(可能与摘要相同)
其他可选字段是:标志、协议、算法、公钥(在插件中是“密钥”...)
现在这就是我迷路的地方......如何在 PHP 中实现上述 C 函数?
- 如何构造作为
key
字符数组的“DNSKEY RDATA”?(我猜测标志八位字节是默认值,比如 0、256 或 257 还不确定),然后协议八位字节是示例中的 keyAlg 值 5,然后是始终为 3 的算法八位字节,最后 - 关键八位字节是关键. 猜对了吗??) - char key[] 数组 RDATA 是二进制数组吗?还是ASCII字符?(意思是,一旦构建,我不必先将其转换为二进制位?)
- 算法的目的是什么
& 0xFFFF
?什么是 php 等价物?我倾向于认为它几乎相同,因为 PHP 在语法上是基于 C 的......但是如果没有正确的输入/输出示例,将很难确保我正确理解它......