|
@@ -44,54 +44,65 @@ struct ft_rrb_frame {
|
|
|
#define FT_PACKET_R0KH_R1KH_RESP 0x02
|
|
|
#define FT_PACKET_R0KH_R1KH_PUSH 0x03
|
|
|
|
|
|
-#define FT_R0KH_R1KH_PULL_NONCE_LEN 16
|
|
|
-#define FT_R0KH_R1KH_PULL_DATA_LEN (FT_R0KH_R1KH_PULL_NONCE_LEN + \
|
|
|
- WPA_PMK_NAME_LEN + FT_R1KH_ID_LEN + \
|
|
|
- ETH_ALEN)
|
|
|
-#define FT_R0KH_R1KH_PULL_PAD_LEN ((8 - FT_R0KH_R1KH_PULL_DATA_LEN % 8) % 8)
|
|
|
-
|
|
|
-struct ft_r0kh_r1kh_pull_frame {
|
|
|
- u8 nonce[FT_R0KH_R1KH_PULL_NONCE_LEN];
|
|
|
- u8 pmk_r0_name[WPA_PMK_NAME_LEN];
|
|
|
- u8 r1kh_id[FT_R1KH_ID_LEN];
|
|
|
- u8 s1kh_id[ETH_ALEN];
|
|
|
- u8 pad[FT_R0KH_R1KH_PULL_PAD_LEN]; /* 8-octet boundary for AES block */
|
|
|
- u8 key_wrap_extra[8];
|
|
|
-} STRUCT_PACKED;
|
|
|
+/* packet layout
|
|
|
+ * IEEE 802 extended OUI ethertype frame header
|
|
|
+ * u16 authlen (little endian)
|
|
|
+ * multiple of struct ft_rrb_tlv (authenticated only, length = authlen)
|
|
|
+ * multiple of struct ft_rrb_tlv (AES-SIV encrypted, AES-SIV needs an extra
|
|
|
+ * blocksize length)
|
|
|
+ *
|
|
|
+ * AES-SIV AAD;
|
|
|
+ * source MAC address (6)
|
|
|
+ * authenticated-only TLVs (authlen)
|
|
|
+ * subtype (1; FT_PACKET_*)
|
|
|
+ */
|
|
|
|
|
|
-#define FT_R0KH_R1KH_RESP_DATA_LEN (FT_R0KH_R1KH_PULL_NONCE_LEN + \
|
|
|
- FT_R1KH_ID_LEN + ETH_ALEN + PMK_LEN + \
|
|
|
- WPA_PMK_NAME_LEN + 2)
|
|
|
-#define FT_R0KH_R1KH_RESP_PAD_LEN ((8 - FT_R0KH_R1KH_RESP_DATA_LEN % 8) % 8)
|
|
|
-struct ft_r0kh_r1kh_resp_frame {
|
|
|
- u8 nonce[FT_R0KH_R1KH_PULL_NONCE_LEN]; /* copied from pull */
|
|
|
- u8 r1kh_id[FT_R1KH_ID_LEN]; /* copied from pull */
|
|
|
- u8 s1kh_id[ETH_ALEN]; /* copied from pull */
|
|
|
- u8 pmk_r1[PMK_LEN];
|
|
|
- u8 pmk_r1_name[WPA_PMK_NAME_LEN];
|
|
|
- le16 pairwise;
|
|
|
- u8 pad[FT_R0KH_R1KH_RESP_PAD_LEN]; /* 8-octet boundary for AES block */
|
|
|
- u8 key_wrap_extra[8];
|
|
|
-} STRUCT_PACKED;
|
|
|
+#define FT_RRB_NONCE_LEN 16
|
|
|
+
|
|
|
+#define FT_RRB_LAST_EMPTY 0 /* placeholder or padding */
|
|
|
+
|
|
|
+#define FT_RRB_NONCE 2 /* size FT_RRB_NONCE_LEN */
|
|
|
+#define FT_RRB_TIMESTAMP 3 /* le32 unix seconds */
|
|
|
+
|
|
|
+#define FT_RRB_R0KH_ID 4 /* FT_R0KH_ID_MAX_LEN */
|
|
|
+#define FT_RRB_R1KH_ID 5 /* FT_R1KH_ID_LEN */
|
|
|
+#define FT_RRB_S1KH_ID 6 /* ETH_ALEN */
|
|
|
|
|
|
-#define FT_R0KH_R1KH_PUSH_DATA_LEN (4 + FT_R1KH_ID_LEN + ETH_ALEN + \
|
|
|
- WPA_PMK_NAME_LEN + PMK_LEN + \
|
|
|
- WPA_PMK_NAME_LEN + 2)
|
|
|
-#define FT_R0KH_R1KH_PUSH_PAD_LEN ((8 - FT_R0KH_R1KH_PUSH_DATA_LEN % 8) % 8)
|
|
|
-struct ft_r0kh_r1kh_push_frame {
|
|
|
- /* Encrypted with AES key-wrap */
|
|
|
- u8 timestamp[4]; /* current time in seconds since unix epoch, little
|
|
|
- * endian */
|
|
|
- u8 r1kh_id[FT_R1KH_ID_LEN];
|
|
|
- u8 s1kh_id[ETH_ALEN];
|
|
|
- u8 pmk_r0_name[WPA_PMK_NAME_LEN];
|
|
|
- u8 pmk_r1[PMK_LEN];
|
|
|
- u8 pmk_r1_name[WPA_PMK_NAME_LEN];
|
|
|
- le16 pairwise;
|
|
|
- u8 pad[FT_R0KH_R1KH_PUSH_PAD_LEN]; /* 8-octet boundary for AES block */
|
|
|
- u8 key_wrap_extra[8];
|
|
|
+#define FT_RRB_PMK_R0_NAME 7 /* WPA_PMK_NAME_LEN */
|
|
|
+#define FT_RRB_PMK_R0 8 /* PMK_LEN */
|
|
|
+#define FT_RRB_PMK_R1_NAME 9 /* WPA_PMK_NAME_LEN */
|
|
|
+#define FT_RRB_PMK_R1 10 /* PMK_LEN */
|
|
|
+
|
|
|
+#define FT_RRB_PAIRWISE 11 /* le16 */
|
|
|
+
|
|
|
+struct ft_rrb_tlv {
|
|
|
+ le16 type;
|
|
|
+ le16 len;
|
|
|
+ /* followed by data of length len */
|
|
|
} STRUCT_PACKED;
|
|
|
|
|
|
+/* session TLVs:
|
|
|
+ * required: PMK_R1, PMK_R1_NAME, PAIRWISE
|
|
|
+ *
|
|
|
+ * pull frame TLVs:
|
|
|
+ * auth:
|
|
|
+ * required: NONCE, R0KH_ID, R1KH_ID
|
|
|
+ * encrypted:
|
|
|
+ * required: PMK_R0_NAME, S1KH_ID
|
|
|
+ *
|
|
|
+ * response frame TLVs:
|
|
|
+ * auth:
|
|
|
+ * required: NONCE, R0KH_ID, R1KH_ID
|
|
|
+ * encrypted:
|
|
|
+ * required: S1KH_ID, session TLVs
|
|
|
+ *
|
|
|
+ * push frame TLVs:
|
|
|
+ * auth:
|
|
|
+ * required: TIMESTAMP, R0KH_ID, R1KH_ID
|
|
|
+ * encrypted:
|
|
|
+ * required: S1KH_ID, PMK_R0_NAME, session TLVs
|
|
|
+ */
|
|
|
+
|
|
|
#ifdef _MSC_VER
|
|
|
#pragma pack(pop)
|
|
|
#endif /* _MSC_VER */
|
|
@@ -110,7 +121,7 @@ struct ft_remote_r0kh {
|
|
|
u8 addr[ETH_ALEN];
|
|
|
u8 id[FT_R0KH_ID_MAX_LEN];
|
|
|
size_t id_len;
|
|
|
- u8 key[16];
|
|
|
+ u8 key[32];
|
|
|
};
|
|
|
|
|
|
|
|
@@ -118,7 +129,7 @@ struct ft_remote_r1kh {
|
|
|
struct ft_remote_r1kh *next;
|
|
|
u8 addr[ETH_ALEN];
|
|
|
u8 id[FT_R1KH_ID_LEN];
|
|
|
- u8 key[16];
|
|
|
+ u8 key[32];
|
|
|
};
|
|
|
|
|
|
|