ieee802_1x_kay.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /*
  2. * IEEE 802.1X-2010 Key Agree Protocol of PAE state machine
  3. * Copyright (c) 2013, Qualcomm Atheros, Inc.
  4. *
  5. * This software may be distributed under the terms of the BSD license.
  6. * See README for more details.
  7. */
  8. #ifndef IEEE802_1X_KAY_H
  9. #define IEEE802_1X_KAY_H
  10. #include "utils/list.h"
  11. #include "common/defs.h"
  12. #include "common/ieee802_1x_defs.h"
  13. struct macsec_init_params;
  14. struct ieee802_1x_cp_conf;
  15. #define MI_LEN 12
  16. #define MAX_KEY_LEN 32 /* 32 bytes, 256 bits */
  17. #define MAX_CKN_LEN 32 /* 32 bytes, 256 bits */
  18. /* MKA timer, unit: millisecond */
  19. #define MKA_HELLO_TIME 2000
  20. #define MKA_LIFE_TIME 6000
  21. #define MKA_SAK_RETIRE_TIME 3000
  22. struct ieee802_1x_mka_ki {
  23. u8 mi[MI_LEN];
  24. u32 kn;
  25. };
  26. struct ieee802_1x_mka_sci {
  27. u8 addr[ETH_ALEN];
  28. u16 port;
  29. };
  30. struct mka_key {
  31. u8 key[MAX_KEY_LEN];
  32. size_t len;
  33. };
  34. struct mka_key_name {
  35. u8 name[MAX_CKN_LEN];
  36. size_t len;
  37. };
  38. enum mka_created_mode {
  39. PSK,
  40. EAP_EXCHANGE,
  41. DISTRIBUTED,
  42. CACHED,
  43. };
  44. struct ieee802_1x_kay_ctx {
  45. /* pointer to arbitrary upper level context */
  46. void *ctx;
  47. /* abstract wpa driver interface */
  48. int (*macsec_init)(void *ctx, struct macsec_init_params *params);
  49. int (*macsec_deinit)(void *ctx);
  50. int (*enable_protect_frames)(void *ctx, Boolean enabled);
  51. int (*set_replay_protect)(void *ctx, Boolean enabled, u32 window);
  52. int (*set_current_cipher_suite)(void *ctx, const u8 *cs, size_t cs_len);
  53. int (*enable_controlled_port)(void *ctx, Boolean enabled);
  54. int (*get_receive_lowest_pn)(void *ctx, u32 channel, u8 an,
  55. u32 *lowest_pn);
  56. int (*get_transmit_next_pn)(void *ctx, u32 channel, u8 an,
  57. u32 *next_pn);
  58. int (*set_transmit_next_pn)(void *ctx, u32 channel, u8 an, u32 next_pn);
  59. int (*get_available_receive_sc)(void *ctx, u32 *channel);
  60. int (*create_receive_sc)(void *ctx, u32 channel,
  61. struct ieee802_1x_mka_sci *sci,
  62. enum validate_frames vf,
  63. enum confidentiality_offset co);
  64. int (*delete_receive_sc)(void *ctx, u32 channel);
  65. int (*create_receive_sa)(void *ctx, u32 channel, u8 an, u32 lowest_pn,
  66. const u8 *sak);
  67. int (*enable_receive_sa)(void *ctx, u32 channel, u8 an);
  68. int (*disable_receive_sa)(void *ctx, u32 channel, u8 an);
  69. int (*get_available_transmit_sc)(void *ctx, u32 *channel);
  70. int (*create_transmit_sc)(void *ctx, u32 channel,
  71. const struct ieee802_1x_mka_sci *sci,
  72. enum confidentiality_offset co);
  73. int (*delete_transmit_sc)(void *ctx, u32 channel);
  74. int (*create_transmit_sa)(void *ctx, u32 channel, u8 an, u32 next_pn,
  75. Boolean confidentiality, const u8 *sak);
  76. int (*enable_transmit_sa)(void *ctx, u32 channel, u8 an);
  77. int (*disable_transmit_sa)(void *ctx, u32 channel, u8 an);
  78. };
  79. struct ieee802_1x_kay {
  80. Boolean enable;
  81. Boolean active;
  82. Boolean authenticated;
  83. Boolean secured;
  84. Boolean failed;
  85. struct ieee802_1x_mka_sci actor_sci;
  86. u8 actor_priority;
  87. struct ieee802_1x_mka_sci key_server_sci;
  88. u8 key_server_priority;
  89. enum macsec_cap macsec_capable;
  90. Boolean macsec_desired;
  91. Boolean macsec_protect;
  92. Boolean macsec_replay_protect;
  93. u32 macsec_replay_window;
  94. enum validate_frames macsec_validate;
  95. enum confidentiality_offset macsec_confidentiality;
  96. u32 ltx_kn;
  97. u8 ltx_an;
  98. u32 lrx_kn;
  99. u8 lrx_an;
  100. u32 otx_kn;
  101. u8 otx_an;
  102. u32 orx_kn;
  103. u8 orx_an;
  104. /* not defined in IEEE802.1X */
  105. struct ieee802_1x_kay_ctx *ctx;
  106. Boolean is_key_server;
  107. Boolean is_obliged_key_server;
  108. char if_name[IFNAMSIZ];
  109. int macsec_csindex; /* MACsec cipher suite table index */
  110. int mka_algindex; /* MKA alg table index */
  111. u32 dist_kn;
  112. u8 dist_an;
  113. time_t dist_time;
  114. u8 mka_version;
  115. u8 algo_agility[4];
  116. u32 sc_ch;
  117. u32 pn_exhaustion;
  118. Boolean port_enable;
  119. Boolean rx_enable;
  120. Boolean tx_enable;
  121. struct dl_list participant_list;
  122. enum macsec_policy policy;
  123. struct ieee802_1x_cp_sm *cp;
  124. struct l2_packet_data *l2_mka;
  125. enum validate_frames vf;
  126. enum confidentiality_offset co;
  127. };
  128. struct ieee802_1x_kay *
  129. ieee802_1x_kay_init(struct ieee802_1x_kay_ctx *ctx, enum macsec_policy policy,
  130. const char *ifname, const u8 *addr);
  131. void ieee802_1x_kay_deinit(struct ieee802_1x_kay *kay);
  132. struct ieee802_1x_mka_participant *
  133. ieee802_1x_kay_create_mka(struct ieee802_1x_kay *kay,
  134. struct mka_key_name *ckn, struct mka_key *cak,
  135. u32 life, enum mka_created_mode mode,
  136. Boolean is_authenticator);
  137. void ieee802_1x_kay_delete_mka(struct ieee802_1x_kay *kay,
  138. struct mka_key_name *ckn);
  139. void ieee802_1x_kay_mka_participate(struct ieee802_1x_kay *kay,
  140. struct mka_key_name *ckn,
  141. Boolean status);
  142. int ieee802_1x_kay_new_sak(struct ieee802_1x_kay *kay);
  143. int ieee802_1x_kay_change_cipher_suite(struct ieee802_1x_kay *kay,
  144. int cs_index);
  145. int ieee802_1x_kay_set_latest_sa_attr(struct ieee802_1x_kay *kay,
  146. struct ieee802_1x_mka_ki *lki, u8 lan,
  147. Boolean ltx, Boolean lrx);
  148. int ieee802_1x_kay_set_old_sa_attr(struct ieee802_1x_kay *kay,
  149. struct ieee802_1x_mka_ki *oki,
  150. u8 oan, Boolean otx, Boolean orx);
  151. int ieee802_1x_kay_create_sas(struct ieee802_1x_kay *kay,
  152. struct ieee802_1x_mka_ki *lki);
  153. int ieee802_1x_kay_delete_sas(struct ieee802_1x_kay *kay,
  154. struct ieee802_1x_mka_ki *ki);
  155. int ieee802_1x_kay_enable_tx_sas(struct ieee802_1x_kay *kay,
  156. struct ieee802_1x_mka_ki *lki);
  157. int ieee802_1x_kay_enable_rx_sas(struct ieee802_1x_kay *kay,
  158. struct ieee802_1x_mka_ki *lki);
  159. int ieee802_1x_kay_enable_new_info(struct ieee802_1x_kay *kay);
  160. int ieee802_1x_kay_cp_conf(struct ieee802_1x_kay *kay,
  161. struct ieee802_1x_cp_conf *pconf);
  162. #endif /* IEEE802_1X_KAY_H */