UNIX: разработка сетевых приложений
Часть 215 из 399 Информация о книге
Листинг 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(листинг 19.5). Полеsadb_keyопределяет тип ключа (ключ аутентификации или шифрования), поле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; /* зарезервировано для расширения */};/* далее следуют данные о самом ключе */Программа, добавляющая статическую запись в базу данных безопасности, представлена в листинге 19.6.
Листинг 19.6. Программа, использующая команду SADB_ADD
//key/add с33 void34 sadb_add(struct sockaddr *src, struct sockaddr *dst, int type, int alg,35 int spi, int keybits, unsigned char *keydata)36 {37 int s;38 char buf[4096], *p; /* XXX */39 struct sadb_msg *msg;40 struct sadb_sa *saext;41 struct sadb_address *addrext;42 struct sadb_key *keyext;43 int len;44 int mypid;45 s = Socket(PF_KEY, SOCK_RAW, PF_KEY_V2);46 mypid = getpid();47 /* Формирование и запись запроса SADB_ADD */48 bzero(&buf, sizeof(buf));49 p = buf;50 msg = (struct sadb_msg*)p;51 msg->sadb_msg_version = PF_KEY_V2;52 msg->sadb_msg_type = SADB_ADD;53 msg->sadb_msg_satype = type;54 msg->sadb_msg_pid = getpid();55 len = sizeof(*msg);56 p += sizeof(*msg);57 saext = (struct sadb_sa*)p;58 saext->sadb_sa_len = sizeof(*saext) / 8;59 saext->sadb_sa_exttype = SADB_EXT_SA;60 saext->sadb_sa_spi = htonl(spi);61 saext->sadb_sa_replay = 0; /* статические ключи не защищают от повтора */62 saext->sadb_sa_state = SADB_SASTATE_MATURE;63 saext->sadb_sa_auth = alg;64 saext->sadb_sa_encrypt = SADB_EALG_NONE;65 saext->sadb_sa_flags = 0;66 len += saext->sadb_sa_len * 8;67 p += saext->sadb_sa_len * 8;68 addrext = (struct sadb_address*)p;69 addrext->sadb_address_len = (sizeof(*addrext) + salen(src) + 7) / 8;70 addrext->sadb_address_exttype = SADB_EXT_ADDRESS_SRC;71 addrext->sadb_address_proto = 0; /* any protocol */72 addrext->sadb_address_prefixlen = prefix_all(src);73 addrext->sadb_address_reserved = 0;74 memcpy(addrext + 1, src, salen(src));75 len += addrext->sadb_address_len * 8,76 p += addrext->sadb_address_len * 8;77 addrext = (struct sadb_address*)p;78 addrext->sadb_address_len = (sizeof(*addrext) + salen(dst) + 7) / 8;79 addrext->sadb_address_exttype = SADB_EXT_ADDRESS_DST;80 addrext->sadb_address_proto = 0; /* any protocol */81 addrext->sadb_address_prefixlen = prefix_all(dst);82 addrext->sadb_address_reserved = 0;83 memcpy(addrext + 1, dst, salen(dst));84 len += addrext->sadb_address_len * 8;85 p += addrext->sadb_address_len * 8;86 keyext = (struct sadb_key*)p;87 /* обеспечивает выравнивание */88 keyext->sadb_key_len = (sizeof(*keyext) + (keybits / 8) + 7) / 8;89 keyext->sadb_key_exttype = SADB_EXT_KEY_AUTH;90 keyext->sadb_key_bits = keybits;91 keyext->sadb_key_reserved = 0;