18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * WPA Supplicant - PeerKey for Direct Link Setup (DLS)
340b07208ef4402da20a7f666835a62f6ec098e16Dmitry Shmidt * Copyright (c) 2006-2015, Jouni Malinen <j@w1.fi>
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license.
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details.
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef PEERKEY_H
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define PEERKEY_H
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define PEERKEY_MAX_IE_LEN 80
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpa_peerkey {
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_peerkey *next;
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int initiator; /* whether this end was initator for SMK handshake */
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 addr[ETH_ALEN]; /* other end MAC address */
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 inonce[WPA_NONCE_LEN]; /* Initiator Nonce */
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 pnonce[WPA_NONCE_LEN]; /* Peer Nonce */
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 rsnie_i[PEERKEY_MAX_IE_LEN]; /* Initiator RSN IE */
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t rsnie_i_len;
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 rsnie_p[PEERKEY_MAX_IE_LEN]; /* Peer RSN IE */
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t rsnie_p_len;
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 smk[PMK_LEN];
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int smk_complete;
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 smkid[PMKID_LEN];
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u32 lifetime;
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int cipher; /* Selected cipher (WPA_CIPHER_*) */
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 replay_counter[WPA_REPLAY_COUNTER_LEN];
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int replay_counter_set;
3040b07208ef4402da20a7f666835a62f6ec098e16Dmitry Shmidt	int akmp;
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ptk stk, tstk;
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int stk_set, tstk_set;
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_PEERKEY
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint peerkey_verify_eapol_key_mic(struct wpa_sm *sm,
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 struct wpa_peerkey *peerkey,
4140b07208ef4402da20a7f666835a62f6ec098e16Dmitry Shmidt				 struct wpa_eapol_key_192 *key, u16 ver,
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 const u8 *buf, size_t len);
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid peerkey_rx_eapol_4way(struct wpa_sm *sm, struct wpa_peerkey *peerkey,
44c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt			   struct wpa_eapol_key *key, u16 key_info, u16 ver,
45c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt			   const u8 *key_data, size_t key_data_len);
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid peerkey_rx_eapol_smk(struct wpa_sm *sm, const u8 *src_addr,
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  struct wpa_eapol_key *key, size_t extra_len,
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  u16 key_info, u16 ver);
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid peerkey_deinit(struct wpa_sm *sm);
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_PEERKEY */
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpeerkey_verify_eapol_key_mic(struct wpa_sm *sm,
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			     struct wpa_peerkey *peerkey,
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			     struct wpa_eapol_key *key, u16 ver,
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			     const u8 *buf, size_t len)
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpeerkey_rx_eapol_4way(struct wpa_sm *sm, struct wpa_peerkey *peerkey,
64c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt		      struct wpa_eapol_key *key, u16 key_info, u16 ver,
65c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt		      const u8 *key_data, size_t key_data_len)
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpeerkey_rx_eapol_smk(struct wpa_sm *sm, const u8 *src_addr,
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		     struct wpa_eapol_key *key, size_t extra_len,
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		     u16 key_info, u16 ver)
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void peerkey_deinit(struct wpa_sm *sm)
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_PEERKEY */
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* PEERKEY_H */
83