Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:

};

/* далее следуют данные о самом ключе */

Программа, добавляющая статическую запись в базу данных безопасности, представлена в листинге 19.6.

Листинг 19.6. Программа, использующая команду SADB_ADD

//key/add с

33 void

34 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 /* обеспечивает выравнивание */

  • Читать дальше
  • 1
  • ...
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: