Я заканчиваю надстройку регистратора доменов для биллинговой системы (которая в данном случае также управляет предоставлением доменов), и последний момент связан с реализацией поддержки DNSSEC.
Биллинговая система отправляет следующие данные, связанные с SAMPLE DNSSEC, в мой плагин PHP:
'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 /
/ /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Приложение Б того же протокола:
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 во входных данных плагина)
- Тип дайджеста (я полагаю, что он называется дайджестАлг во входных данных плагина)
- Дайджест (то же самое, что и дайджест, вероятно)
Другие Необязательные поля: Флаги, Протокол, Алгоритм, Открытый ключ (который является «ключом» в плагине...)
Вот тут-то я и теряюсь... Как мне реализовать указанную выше функцию C в PHP?
- Как создать «DNSKEY RDATA», который представляет собой массив символов
key
? (Я ПРЕДПОЛАГАЮ, что октеты флагов являются значениями по умолчанию, например, 0, 256 или 257, еще не уверен), тогда октет протокола является значением keyAlg 5 в примере, за которым следует октет алгоритма, который всегда равен 3, и, наконец, октет ключа является ключом . Это верное предположение??) - Является ли массив char key[] RDATA двоичным массивом? или символы ascii? (имеется в виду, что после создания мне не нужно сначала преобразовывать его в двоичные биты?)
- Что такое
& 0xFFFF
цель в алгоритме? что такое эквивалент php? Я склонен думать, что это почти то же самое, поскольку PHP основан на синтаксисе C... но без правильных примеров ввода/вывода будет сложно убедиться, что я правильно понял...