Шрифт:
u_int8_t sadb_sa_encrypt; /* алгоритм шифрования, см. табл. 19.5 */
u_int32_t sadb_sa_flags; /* флаги */
};
Таблица 19.4. Использование расширений
Состояние SA | Описание | Возможность использования |
---|---|---|
SADB_SASTATE_LARVAL | В процессе создания | Нет |
SADB_SASTATE_MATURE | Полностью сформированное | Да |
SADB_SASTATE_DYING | Превышено гибкое ограничение на время жизни | Да |
SADB_SASTATE_DEAD | Превышено жесткое ограничение на время жизни | Нет |
Таблица 19.5. Алгоритмы аутентификации и шифрования
Алгоритм | Описание | Ссылка |
---|---|---|
SADB_AALG_NONE | Без аутентификации | |
SADB_AALG_MD5HMAC | HMAC-MD5-96 | RFC 2403 |
SADB_AALG_SHA1HMAC | HMAC-SHA-1-96 | RFC 2404 |
SADB_EALG_NONE | Без шифрования | |
SADB_EALG_DESCBC | DES-CBC | RFC 2405 |
SADB_EALG_3DESCBC | 3DES-CBC | RFC 1851 |
SADB_EALG_NULL | NULL | RFC 2410 |
Поле
sadb_sa_spi
содержит индекс параметров безопасности( security parameters index, SPI). Это значение вместе с адресом получателя и используемым протоколом (например, IPSec АН) уникально идентифицирует соответствующее соглашение о безопасности. При получении пакета значение SPI используется для поиска соглашения, относящегося к пакету. При отправке пакета значение помещается в него для использования получателем. Никаких иных значений SPI не имеет, поэтому назначаться индекс может последовательно, в случайном порядке или с использованием метода, рекомендуемого собеседником. Поле sadb_sa_replay
задает размер окна защиты от повторов. Поскольку статические соглашения о защите не дают возможности задействовать эту защиту, мы устанавливаем поле равным нулю. Значение поля sadb_sa_state
меняется в зависимости от состояния динамически создаваемых соглашений о безопасности (см. табл. 19.4). Создаваемые вручную соглашения существуют исключительно в состоянии SADB_SASTATE_MATURE
. С другими состояниями мы встретимся в разделе 19.5. Поля
sadb_sa_auth
и sadb_sa_encrypt
определяют алгоритмы аутентификации и шифрования для данного соглашения. Возможные значения этих полей перечислены в табл. 19.5. Единственное значение поля sadb_sa_flags
определено в POSIX как константа SADB_SAFLAGS_PFS
. Этот флаг требует совершенной безопасности пересылки( perfect forward security), которая состоит в том утверждении, что значение ключа не должно зависеть от предыдущих подключений или какого-либо главного ключа. Флаг используется при запросе ключей у приложения, заведующего ими, но не при создании статических соглашений. Следующее обязательное расширение команды
SADB_ADD
должно содержать адреса отправителя и получателя, задаваемые константами SADB_EXT_ADDRESS_SRC
и SADB_EXT_ADDRESS_DST
. При необходимости может быть указан адрес прокси-сервера SADB_EXT_ADDRESS_PROXY
. Подробнее об обработке адресов прокси-серверов вы можете прочесть в RFC 2367 [73]. Адреса задаются в структуре sadb_address
, представленной в листинге 19.4. Поле sadb_address_exttype
определяет тип адреса (отправителя, получателя или прокси-сервера). Поле sadb_address_proto
позволяет выбрать протокол IP или произвольный протокол (значение 0). Поле sadb_address_prefixlen
описывает значимый префикс адреса. Это позволяет использовать одно соглашение для множества адресов. За структурой sadb_address
следует структура sockaddr
соответствующего семейства (например, sockaddr_in
или sockaddr_in6
). Номер порта из структуры sockaddr
используется только в том случае, если поле sadb_address_proto
задает протокол, поддерживающий номера портов (например, IPPROTO_TCP
). Листинг 19.4. Структура sadb_address
struct sadb_address {
u_int16_t sadb_address_len; /* длина расширения с адресом / 8 */
u_int16_t sadb_address_exttype; /* SADB_EXT_ADDRESS_{SRC,DST,PROXY} */
u_int8_t sadb_address_proto; /* протокол IP или 0 (любой) */
u_int8_t sadb_address_prefixlen; /* # значащих битов адреса */
u_int16_t sadb_address_reserved; /* зарезервирован для послед. использования */
};
/* далее следует структура sockaddr соответствующего семейства */
Завершают список обязательных расширений сообщения
SADB_ADD
ключи аутентификации и шифрования — расширения SADB_EXT_KEY_AUTH
и SADB_EXT_KEY_ENCRYPT
, описываемые структурой sadb_key
(листинг 19.5). Поле sadb_key_exttype
определяет тип ключа (ключ аутентификации или шифрования), поле sadb_key_bits
задает длину ключа в битах, а сам ключ следует за структурой sadb_key
. Листинг 19.5. Структура sadb_key
struct sadb_key {
u_int16_t sadb_key_len; /* длина расширения с ключом / 8 */
u_int16_t sadb_key_exttype; /* SADB_EXT_KEY_{AUTH,ENCRYPT} */
u_int16_t sadb_key_bits; /* # битов в ключе */
u_int16_t sadb_key_reserved; /* зарезервировано для расширения */