Чтение онлайн

ЖАНРЫ

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

Поделиться с друзьями: