ieee802_1x_kay_i.h 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  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_I_H
  9. #define IEEE802_1X_KAY_I_H
  10. #include "utils/list.h"
  11. #include "common/defs.h"
  12. #include "common/ieee802_1x_defs.h"
  13. #define MKA_VERSION_ID 1
  14. /* IEEE Std 802.1X-2010, 11.11.1, Table 11-7 */
  15. enum mka_packet_type {
  16. MKA_BASIC_PARAMETER_SET = MKA_VERSION_ID,
  17. MKA_LIVE_PEER_LIST = 1,
  18. MKA_POTENTIAL_PEER_LIST = 2,
  19. MKA_SAK_USE = 3,
  20. MKA_DISTRIBUTED_SAK = 4,
  21. MKA_DISTRIBUTED_CAK = 5,
  22. MKA_KMD = 6,
  23. MKA_ANNOUNCEMENT = 7,
  24. MKA_ICV_INDICATOR = 255
  25. };
  26. #define ICV_LEN 16 /* 16 bytes */
  27. #define SAK_WRAPPED_LEN 24
  28. /* KN + Wrapper SAK */
  29. #define DEFAULT_DIS_SAK_BODY_LENGTH (SAK_WRAPPED_LEN + 4)
  30. #define MAX_RETRY_CNT 5
  31. struct ieee802_1x_kay;
  32. struct ieee802_1x_mka_peer_id {
  33. u8 mi[MI_LEN];
  34. u32 mn;
  35. };
  36. struct ieee802_1x_kay_peer {
  37. struct ieee802_1x_mka_sci sci;
  38. u8 mi[MI_LEN];
  39. u32 mn;
  40. time_t expire;
  41. Boolean is_key_server;
  42. u8 key_server_priority;
  43. Boolean macsec_desired;
  44. enum macsec_cap macsec_capbility;
  45. Boolean sak_used;
  46. struct dl_list list;
  47. };
  48. struct key_conf {
  49. u8 *key;
  50. struct ieee802_1x_mka_ki ki;
  51. enum confidentiality_offset offset;
  52. u8 an;
  53. Boolean tx;
  54. Boolean rx;
  55. int key_len; /* unit: byte */
  56. };
  57. struct data_key {
  58. u8 *key;
  59. int key_len;
  60. struct ieee802_1x_mka_ki key_identifier;
  61. enum confidentiality_offset confidentiality_offset;
  62. u8 an;
  63. Boolean transmits;
  64. Boolean receives;
  65. struct os_time created_time;
  66. u32 next_pn;
  67. /* not defined data */
  68. Boolean rx_latest;
  69. Boolean tx_latest;
  70. int user; /* FIXME: to indicate if it can be delete safely */
  71. struct dl_list list;
  72. };
  73. /* TransmitSC in IEEE Std 802.1AE-2006, Figure 10-6 */
  74. struct transmit_sc {
  75. struct ieee802_1x_mka_sci sci; /* const SCI sci */
  76. Boolean transmitting; /* bool transmitting (read only) */
  77. struct os_time created_time; /* Time createdTime */
  78. u8 encoding_sa; /* AN encodingSA (read only) */
  79. u8 enciphering_sa; /* AN encipheringSA (read only) */
  80. /* not defined data */
  81. unsigned int channel;
  82. struct dl_list list;
  83. struct dl_list sa_list;
  84. };
  85. /* TransmitSA in IEEE Std 802.1AE-2006, Figure 10-6 */
  86. struct transmit_sa {
  87. Boolean in_use; /* bool inUse (read only) */
  88. u32 next_pn; /* PN nextPN (read only) */
  89. struct os_time created_time; /* Time createdTime */
  90. Boolean enable_transmit; /* bool EnableTransmit */
  91. u8 an;
  92. Boolean confidentiality;
  93. struct data_key *pkey;
  94. struct transmit_sc *sc;
  95. struct dl_list list; /* list entry in struct transmit_sc::sa_list */
  96. };
  97. /* ReceiveSC in IEEE Std 802.1AE-2006, Figure 10-6 */
  98. struct receive_sc {
  99. struct ieee802_1x_mka_sci sci; /* const SCI sci */
  100. Boolean receiving; /* bool receiving (read only) */
  101. struct os_time created_time; /* Time createdTime */
  102. unsigned int channel;
  103. struct dl_list list;
  104. struct dl_list sa_list;
  105. };
  106. /* ReceiveSA in IEEE Std 802.1AE-2006, Figure 10-6 */
  107. struct receive_sa {
  108. Boolean enable_receive; /* bool enableReceive */
  109. Boolean in_use; /* bool inUse (read only) */
  110. u32 next_pn; /* PN nextPN (read only) */
  111. u32 lowest_pn; /* PN lowestPN (read only) */
  112. u8 an;
  113. struct os_time created_time;
  114. struct data_key *pkey;
  115. struct receive_sc *sc; /* list entry in struct receive_sc::sa_list */
  116. struct dl_list list;
  117. };
  118. struct macsec_ciphersuite {
  119. u8 id[CS_ID_LEN];
  120. char name[32];
  121. enum macsec_cap capable;
  122. int sak_len; /* unit: byte */
  123. u32 index;
  124. };
  125. struct mka_alg {
  126. u8 parameter[4];
  127. size_t cak_len;
  128. size_t kek_len;
  129. size_t ick_len;
  130. size_t icv_len;
  131. int (*cak_trfm)(const u8 *msk, const u8 *mac1, const u8 *mac2, u8 *cak);
  132. int (*ckn_trfm)(const u8 *msk, const u8 *mac1, const u8 *mac2,
  133. const u8 *sid, size_t sid_len, u8 *ckn);
  134. int (*kek_trfm)(const u8 *cak, const u8 *ckn, size_t ckn_len, u8 *kek);
  135. int (*ick_trfm)(const u8 *cak, const u8 *ckn, size_t ckn_len, u8 *ick);
  136. int (*icv_hash)(const u8 *ick, const u8 *msg, size_t msg_len, u8 *icv);
  137. int index; /* index for configuring */
  138. };
  139. #define DEFAULT_MKA_ALG_INDEX 0
  140. /* See IEEE Std 802.1X-2010, 9.16 MKA management */
  141. struct ieee802_1x_mka_participant {
  142. /* used for active and potential participant */
  143. struct mka_key_name ckn;
  144. struct mka_key cak;
  145. Boolean cached;
  146. /* used by management to monitor and control activation */
  147. Boolean active;
  148. Boolean participant;
  149. Boolean retain;
  150. enum { DEFAULT, DISABLED, ON_OPER_UP, ALWAYS } activate;
  151. /* used for active participant */
  152. Boolean principal;
  153. struct dl_list live_peers;
  154. struct dl_list potential_peers;
  155. /* not defined in IEEE 802.1X */
  156. struct dl_list list;
  157. struct mka_key kek;
  158. struct mka_key ick;
  159. struct ieee802_1x_mka_ki lki;
  160. u8 lan;
  161. Boolean ltx;
  162. Boolean lrx;
  163. struct ieee802_1x_mka_ki oki;
  164. u8 oan;
  165. Boolean otx;
  166. Boolean orx;
  167. Boolean is_key_server;
  168. Boolean is_obliged_key_server;
  169. Boolean can_be_key_server;
  170. Boolean is_elected;
  171. struct dl_list sak_list;
  172. struct dl_list rxsc_list;
  173. struct transmit_sc *txsc;
  174. u8 mi[MI_LEN];
  175. u32 mn;
  176. struct ieee802_1x_mka_peer_id current_peer_id;
  177. struct ieee802_1x_mka_sci current_peer_sci;
  178. time_t cak_life;
  179. time_t mka_life;
  180. Boolean to_dist_sak;
  181. Boolean to_use_sak;
  182. Boolean new_sak;
  183. Boolean advised_desired;
  184. enum macsec_cap advised_capability;
  185. struct data_key *new_key;
  186. u32 retry_count;
  187. struct ieee802_1x_kay *kay;
  188. };
  189. struct ieee802_1x_mka_hdr {
  190. /* octet 1 */
  191. u32 type:8;
  192. /* octet 2 */
  193. u32 reserve:8;
  194. /* octet 3 */
  195. #if __BYTE_ORDER == __LITTLE_ENDIAN
  196. u32 length:4;
  197. u32 reserve1:4;
  198. #elif __BYTE_ORDER == __BIG_ENDIAN
  199. u32 reserve1:4;
  200. u32 length:4;
  201. #else
  202. #error "Please fix <bits/endian.h>"
  203. #endif
  204. /* octet 4 */
  205. u32 length1:8;
  206. };
  207. #define MKA_HDR_LEN sizeof(struct ieee802_1x_mka_hdr)
  208. struct ieee802_1x_mka_basic_body {
  209. /* octet 1 */
  210. u32 version:8;
  211. /* octet 2 */
  212. u32 priority:8;
  213. /* octet 3 */
  214. #if __BYTE_ORDER == __LITTLE_ENDIAN
  215. u32 length:4;
  216. u32 macsec_capbility:2;
  217. u32 macsec_desired:1;
  218. u32 key_server:1;
  219. #elif __BYTE_ORDER == __BIG_ENDIAN
  220. u32 key_server:1;
  221. u32 macsec_desired:1;
  222. u32 macsec_capbility:2;
  223. u32 length:4;
  224. #endif
  225. /* octet 4 */
  226. u32 length1:8;
  227. struct ieee802_1x_mka_sci actor_sci;
  228. u8 actor_mi[MI_LEN];
  229. u32 actor_mn;
  230. u8 algo_agility[4];
  231. /* followed by CAK Name*/
  232. u8 ckn[0];
  233. };
  234. struct ieee802_1x_mka_peer_body {
  235. /* octet 1 */
  236. u32 type:8;
  237. /* octet 2 */
  238. u32 reserve:8;
  239. /* octet 3 */
  240. #if __BYTE_ORDER == __LITTLE_ENDIAN
  241. u32 length:4;
  242. u32 reserve1:4;
  243. #elif __BYTE_ORDER == __BIG_ENDIAN
  244. u32 reserve1:4;
  245. u32 length:4;
  246. #endif
  247. /* octet 4 */
  248. u32 length1:8;
  249. u8 peer[0];
  250. /* followed by Peers */
  251. };
  252. struct ieee802_1x_mka_sak_use_body {
  253. /* octet 1 */
  254. u32 type:8;
  255. /* octet 2 */
  256. #if __BYTE_ORDER == __LITTLE_ENDIAN
  257. u32 orx:1;
  258. u32 otx:1;
  259. u32 oan:2;
  260. u32 lrx:1;
  261. u32 ltx:1;
  262. u32 lan:2;
  263. #elif __BYTE_ORDER == __BIG_ENDIAN
  264. u32 lan:2;
  265. u32 ltx:1;
  266. u32 lrx:1;
  267. u32 oan:2;
  268. u32 otx:1;
  269. u32 orx:1;
  270. #endif
  271. /* octet 3 */
  272. #if __BYTE_ORDER == __LITTLE_ENDIAN
  273. u32 length:4;
  274. u32 delay_protect:1;
  275. u32 reserve:1;
  276. u32 prx:1;
  277. u32 ptx:1;
  278. #elif __BYTE_ORDER == __BIG_ENDIAN
  279. u32 ptx:1;
  280. u32 prx:1;
  281. u32 reserve:1;
  282. u32 delay_protect:1;
  283. u32 length:4;
  284. #endif
  285. /* octet 4 */
  286. u32 length1:8;
  287. /* octet 5 - 16 */
  288. u8 lsrv_mi[MI_LEN];
  289. /* octet 17 - 20 */
  290. u32 lkn;
  291. /* octet 21 - 24 */
  292. u32 llpn;
  293. /* octet 25 - 36 */
  294. u8 osrv_mi[MI_LEN];
  295. /* octet 37 - 40 */
  296. u32 okn;
  297. /* octet 41 - 44 */
  298. u32 olpn;
  299. };
  300. struct ieee802_1x_mka_dist_sak_body {
  301. /* octet 1 */
  302. u32 type:8;
  303. /* octet 2 */
  304. #if __BYTE_ORDER == __LITTLE_ENDIAN
  305. u32 reserve:4;
  306. u32 confid_offset:2;
  307. u32 dan:2;
  308. #elif __BYTE_ORDER == __BIG_ENDIAN
  309. u32 dan:2;
  310. u32 confid_offset:2;
  311. u32 reserve:4;
  312. #endif
  313. /* octet 3 */
  314. #if __BYTE_ORDER == __LITTLE_ENDIAN
  315. u32 length:4;
  316. u32 reserve1:4;
  317. #elif __BYTE_ORDER == __BIG_ENDIAN
  318. u32 reserve1:4;
  319. u32 length:4;
  320. #endif
  321. /* octet 4 */
  322. u32 length1:8;
  323. /* octet 5 - 8 */
  324. u32 kn;
  325. /* for GCM-AES-128: octet 9-32: SAK
  326. * for other cipher suite: octet 9-16: cipher suite id, octet 17-: SAK
  327. */
  328. u8 sak[0];
  329. };
  330. struct ieee802_1x_mka_icv_body {
  331. /* octet 1 */
  332. u32 type:8;
  333. /* octet 2 */
  334. u32 reserve:8;
  335. /* octet 3 */
  336. #if __BYTE_ORDER == __LITTLE_ENDIAN
  337. u32 length:4;
  338. u32 reserve1:4;
  339. #elif __BYTE_ORDER == __BIG_ENDIAN
  340. u32 reserve1:4;
  341. u32 length:4;
  342. #endif
  343. /* octet 4 */
  344. u32 length1:8;
  345. /* octet 5 - */
  346. u8 icv[0];
  347. };
  348. #endif /* IEEE802_1X_KAY_I_H */