UNIX: разработка сетевых приложений
Шрифт:
/* далее следует список алгоритмов */
struct sadb_alg {
u_int8_t sadb_alg_id; /* идентификатор алгоритма из табл. 19.5 */
u_int8_t sadb_alg_ivlen; /* длина IV или нуль */
u_int16_t sadb_alg_minbits; /* минимальная длина ключа */
u_int16_t sadb_alg_maxbits; /* максимальная длина ключа */
u_int16_t sadb_alg_reserved; /* зарезервировано для расширения
в будущем */
};
После заголовка
sadb_supported
следует по одной структуре sadb_alg
для каждого алгоритма, поддерживаемого системой. На рис. 19.1 представлен возможный ответ на сообщение, регистрирующее обработчик SA типа SADB_SATYPE_ESP
. Рис. 19.1. Данные, возвращаемые ядром в ответ на команду SADB_REGISTER
Программа, представленная в листинге 19.9, просто регистрируется в ядре в качестве обработчика заданного механизма безопасности и выводит ответ ядра, содержащий список поддерживаемых алгоритмов.
Листинг 19.9. Регистрация демона-обработчика
//key/register.c
1 void
2 sadb_register(int type)
3 {
4 int s;
5 char buf[4096]; /* XXX */
6 struct sadb_msg msg;
7 int goteof;
8 int mypid;
9 s = Socket(PF_KEY, SOCK_RAW, PF_KEY_V2);
10 mypid = getpid;
11 /* формирование и отправка запроса SADB_REGISTER */
12 bzero(&msg, sizeof(msg));
13 msg.sadb_msg_version = PF_KEY_V2;
14 msg.sadb_msg_type = SADB_REGISTER;
15 msg.sadb_msg_satype = type;
16 msg.sadb_msg_len = sizeof(msg) / 8;
17 msg.sadb_msg_pid = mypid;
18 printf("Sending register message:\n");
19 print_sadb_msg(&msg, sizeof(msg));
20 Write(s, &msg, sizeof(msg));
21 printf("\nReply returned:\n");
22 /* Чтение и вывод ответа SADB_REGISTER, игнорирование всех прочих
сообщений */
23 for (;;) {
24 int msglen;
25 struct sadb_msg *msgp;
26 msglen = Read(s, &buf, sizeof(buf));
27 msgp = (struct sadb_msg*)&buf;
28 if (msgp->sadb_msg_pid == mypid &&
29 msgp->sadb_msg_type == SADB_REGISTER) {
30 print_sadb_msg(msgp, msglen);
31 break;
32 }
33 }
34 close(s);
35 }
Открытие
сокета PF_KEY
1-9
Мы открываем сокет PF_KEY. Сохранение PID
10
Поскольку ядро будет адресовать нам свои сообщения по идентификатору процесса, нам необходимо сохранить его, чтобы иметь возможность впоследствии отбирать интересующие нас сообщения. Создание сообщения SADB_REGISTER
11-17
Подобно SADB_DUMP
, сообщение SADB_REGISTER
не требует никаких расширений. Мы обнуляем сообщение, после чего заполняем интересующие нас поля структуры. Вывод и отправка сообщения
18-20
Мы отображаем подготовленное сообщение на экране при помощи функции print_sadb_msg
, после чего записываем сообщение в сокет. Ожидание ответа
23-30
Мы считываем сообщения из сокета, ожидая ответа на наше сообщение о регистрации. Ответ адресован по идентификатору процесса и представляет собой сообщение SADB_REGISTER
. Он содержит список поддерживаемых алгоритмов, который выводится нашей функцией print_sadb_msg
. Пример
Мы запускаем программу
register
в системе, поддерживающей на несколько протоколов больше, чем описано в RFC 2367.
macosx % register -t ah
Sending register message:
SADB Message Register, errno 0, satype IPsec AH, seq 0, pid 20746
Reply returned:
SADB Message Register, errno 0, satype IPsec AH, seq 0, pid 20746
Supported authentication algorithms:
HMAC-MD5 ivlen 0 bits 128-128
HMAC-SHA-1 ivlen 0 bits 160-160
Keyed MD5 ivlen 0 bits 128-128
Keyed SHA-1 ivlen 0 bits 160-160
Null ivlen 0 bits 0-2048
SHA2-256 ivlen 0 bits 256-256
SHA2-384 ivlen 0 bits 384-384
SHA2-512 ivlen 0 bits 512-512
Supported encryption algorithms:
DES-CBC ivlen 8 bits 64-64
3DES-CBC ivlen 8 bits 192-192
Null ivlen 0 bits 0-2048
Blowfish-CBC ivlen 8 bits 40-448
Поделиться с друзьями: