xref: /dflybsd-src/contrib/wpa_supplicant/src/eap_common/eap_teap_common.h (revision 3a84a4273475ed07d0ab1c2dfeffdfedef35d9cd)
1*a1157835SDaniel Fojt /*
2*a1157835SDaniel Fojt  * EAP-TEAP definitions (RFC 7170)
3*a1157835SDaniel Fojt  * Copyright (c) 2004-2019, Jouni Malinen <j@w1.fi>
4*a1157835SDaniel Fojt  *
5*a1157835SDaniel Fojt  * This software may be distributed under the terms of the BSD license.
6*a1157835SDaniel Fojt  * See README for more details.
7*a1157835SDaniel Fojt  */
8*a1157835SDaniel Fojt 
9*a1157835SDaniel Fojt #ifndef EAP_TEAP_H
10*a1157835SDaniel Fojt #define EAP_TEAP_H
11*a1157835SDaniel Fojt 
12*a1157835SDaniel Fojt #define EAP_TEAP_VERSION 1
13*a1157835SDaniel Fojt #define EAP_TEAP_KEY_LEN 64
14*a1157835SDaniel Fojt #define EAP_TEAP_IMCK_LEN 60
15*a1157835SDaniel Fojt #define EAP_TEAP_SIMCK_LEN 40
16*a1157835SDaniel Fojt #define EAP_TEAP_CMK_LEN 20
17*a1157835SDaniel Fojt #define EAP_TEAP_COMPOUND_MAC_LEN 20
18*a1157835SDaniel Fojt #define EAP_TEAP_NONCE_LEN 32
19*a1157835SDaniel Fojt 
20*a1157835SDaniel Fojt #define TEAP_TLS_EXPORTER_LABEL_SKS "EXPORTER: teap session key seed"
21*a1157835SDaniel Fojt 
22*a1157835SDaniel Fojt #define TLS_EXT_PAC_OPAQUE 35
23*a1157835SDaniel Fojt 
24*a1157835SDaniel Fojt /*
25*a1157835SDaniel Fojt  * RFC 7170: Section 4.2.12.1 - Formats for PAC Attributes
26*a1157835SDaniel Fojt  * Note: bit 0x8000 (Mandatory) and bit 0x4000 (Reserved) are also defined
27*a1157835SDaniel Fojt  * in the general TLV format (Section 4.2.1).
28*a1157835SDaniel Fojt  */
29*a1157835SDaniel Fojt #define PAC_TYPE_PAC_KEY 1
30*a1157835SDaniel Fojt #define PAC_TYPE_PAC_OPAQUE 2
31*a1157835SDaniel Fojt #define PAC_TYPE_CRED_LIFETIME 3
32*a1157835SDaniel Fojt #define PAC_TYPE_A_ID 4
33*a1157835SDaniel Fojt #define PAC_TYPE_I_ID 5
34*a1157835SDaniel Fojt /* 6 - Reserved */
35*a1157835SDaniel Fojt #define PAC_TYPE_A_ID_INFO 7
36*a1157835SDaniel Fojt #define PAC_TYPE_PAC_ACKNOWLEDGEMENT 8
37*a1157835SDaniel Fojt #define PAC_TYPE_PAC_INFO 9
38*a1157835SDaniel Fojt #define PAC_TYPE_PAC_TYPE 10
39*a1157835SDaniel Fojt 
40*a1157835SDaniel Fojt #ifdef _MSC_VER
41*a1157835SDaniel Fojt #pragma pack(push, 1)
42*a1157835SDaniel Fojt #endif /* _MSC_VER */
43*a1157835SDaniel Fojt 
44*a1157835SDaniel Fojt struct pac_attr_hdr {
45*a1157835SDaniel Fojt 	be16 type;
46*a1157835SDaniel Fojt 	be16 len;
47*a1157835SDaniel Fojt } STRUCT_PACKED;
48*a1157835SDaniel Fojt 
49*a1157835SDaniel Fojt struct teap_tlv_hdr {
50*a1157835SDaniel Fojt 	be16 tlv_type;
51*a1157835SDaniel Fojt 	be16 length;
52*a1157835SDaniel Fojt } STRUCT_PACKED;
53*a1157835SDaniel Fojt 
54*a1157835SDaniel Fojt /* Result TLV and Intermediate-Result TLV */
55*a1157835SDaniel Fojt struct teap_tlv_result {
56*a1157835SDaniel Fojt 	be16 tlv_type;
57*a1157835SDaniel Fojt 	be16 length;
58*a1157835SDaniel Fojt 	be16 status;
59*a1157835SDaniel Fojt 	/* for Intermediate-Result TLV, followed by optional TLVs */
60*a1157835SDaniel Fojt } STRUCT_PACKED;
61*a1157835SDaniel Fojt 
62*a1157835SDaniel Fojt struct teap_tlv_nak {
63*a1157835SDaniel Fojt 	be16 tlv_type;
64*a1157835SDaniel Fojt 	be16 length;
65*a1157835SDaniel Fojt 	be32 vendor_id;
66*a1157835SDaniel Fojt 	be16 nak_type;
67*a1157835SDaniel Fojt 	/* followed by optional TLVs */
68*a1157835SDaniel Fojt } STRUCT_PACKED;
69*a1157835SDaniel Fojt 
70*a1157835SDaniel Fojt struct teap_tlv_crypto_binding {
71*a1157835SDaniel Fojt 	be16 tlv_type; /* TLV Type[14b] and M/R flags */
72*a1157835SDaniel Fojt 	be16 length;
73*a1157835SDaniel Fojt 	u8 reserved;
74*a1157835SDaniel Fojt 	u8 version;
75*a1157835SDaniel Fojt 	u8 received_version;
76*a1157835SDaniel Fojt 	u8 subtype; /* Flags[4b] and Sub-Type[4b] */
77*a1157835SDaniel Fojt 	u8 nonce[EAP_TEAP_NONCE_LEN];
78*a1157835SDaniel Fojt 	u8 emsk_compound_mac[EAP_TEAP_COMPOUND_MAC_LEN];
79*a1157835SDaniel Fojt 	u8 msk_compound_mac[EAP_TEAP_COMPOUND_MAC_LEN];
80*a1157835SDaniel Fojt } STRUCT_PACKED;
81*a1157835SDaniel Fojt 
82*a1157835SDaniel Fojt struct teap_tlv_request_action {
83*a1157835SDaniel Fojt 	be16 tlv_type;
84*a1157835SDaniel Fojt 	be16 length;
85*a1157835SDaniel Fojt 	u8 status;
86*a1157835SDaniel Fojt 	u8 action;
87*a1157835SDaniel Fojt 	/* followed by optional TLVs */
88*a1157835SDaniel Fojt } STRUCT_PACKED;
89*a1157835SDaniel Fojt 
90*a1157835SDaniel Fojt enum teap_request_action {
91*a1157835SDaniel Fojt 	TEAP_REQUEST_ACTION_PROCESS_TLV = 1,
92*a1157835SDaniel Fojt 	TEAP_REQUEST_ACTION_NEGOTIATE_EAP = 2,
93*a1157835SDaniel Fojt };
94*a1157835SDaniel Fojt 
95*a1157835SDaniel Fojt /* PAC TLV with PAC-Acknowledgement TLV attribute */
96*a1157835SDaniel Fojt struct teap_tlv_pac_ack {
97*a1157835SDaniel Fojt 	be16 tlv_type;
98*a1157835SDaniel Fojt 	be16 length;
99*a1157835SDaniel Fojt 	be16 pac_type;
100*a1157835SDaniel Fojt 	be16 pac_len;
101*a1157835SDaniel Fojt 	be16 result;
102*a1157835SDaniel Fojt } STRUCT_PACKED;
103*a1157835SDaniel Fojt 
104*a1157835SDaniel Fojt struct teap_attr_pac_type {
105*a1157835SDaniel Fojt 	be16 type; /* PAC_TYPE_PAC_TYPE */
106*a1157835SDaniel Fojt 	be16 length; /* 2 */
107*a1157835SDaniel Fojt 	be16 pac_type;
108*a1157835SDaniel Fojt } STRUCT_PACKED;
109*a1157835SDaniel Fojt 
110*a1157835SDaniel Fojt #ifdef _MSC_VER
111*a1157835SDaniel Fojt #pragma pack(pop)
112*a1157835SDaniel Fojt #endif /* _MSC_VER */
113*a1157835SDaniel Fojt 
114*a1157835SDaniel Fojt #define TEAP_CRYPTO_BINDING_SUBTYPE_REQUEST 0
115*a1157835SDaniel Fojt #define TEAP_CRYPTO_BINDING_SUBTYPE_RESPONSE 1
116*a1157835SDaniel Fojt 
117*a1157835SDaniel Fojt #define TEAP_CRYPTO_BINDING_EMSK_CMAC 1
118*a1157835SDaniel Fojt #define TEAP_CRYPTO_BINDING_MSK_CMAC 2
119*a1157835SDaniel Fojt #define TEAP_CRYPTO_BINDING_EMSK_AND_MSK_CMAC 3
120*a1157835SDaniel Fojt 
121*a1157835SDaniel Fojt 
122*a1157835SDaniel Fojt #define EAP_TEAP_PAC_KEY_LEN 48
123*a1157835SDaniel Fojt 
124*a1157835SDaniel Fojt /* RFC 7170: 4.2.12.6 PAC-Type TLV */
125*a1157835SDaniel Fojt #define PAC_TYPE_TUNNEL_PAC 1
126*a1157835SDaniel Fojt 
127*a1157835SDaniel Fojt 
128*a1157835SDaniel Fojt /* RFC 7170, 4.2.1: General TLV Format */
129*a1157835SDaniel Fojt enum teap_tlv_types {
130*a1157835SDaniel Fojt 	TEAP_TLV_AUTHORITY_ID = 1,
131*a1157835SDaniel Fojt 	TEAP_TLV_IDENTITY_TYPE = 2,
132*a1157835SDaniel Fojt 	TEAP_TLV_RESULT = 3,
133*a1157835SDaniel Fojt 	TEAP_TLV_NAK = 4,
134*a1157835SDaniel Fojt 	TEAP_TLV_ERROR = 5,
135*a1157835SDaniel Fojt 	TEAP_TLV_CHANNEL_BINDING = 6,
136*a1157835SDaniel Fojt 	TEAP_TLV_VENDOR_SPECIFIC = 7,
137*a1157835SDaniel Fojt 	TEAP_TLV_REQUEST_ACTION = 8,
138*a1157835SDaniel Fojt 	TEAP_TLV_EAP_PAYLOAD = 9,
139*a1157835SDaniel Fojt 	TEAP_TLV_INTERMEDIATE_RESULT = 10,
140*a1157835SDaniel Fojt 	TEAP_TLV_PAC = 11,
141*a1157835SDaniel Fojt 	TEAP_TLV_CRYPTO_BINDING = 12,
142*a1157835SDaniel Fojt 	TEAP_TLV_BASIC_PASSWORD_AUTH_REQ = 13,
143*a1157835SDaniel Fojt 	TEAP_TLV_BASIC_PASSWORD_AUTH_RESP = 14,
144*a1157835SDaniel Fojt 	TEAP_TLV_PKCS7 = 15,
145*a1157835SDaniel Fojt 	TEAP_TLV_PKCS10 = 16,
146*a1157835SDaniel Fojt 	TEAP_TLV_TRUSTED_SERVER_ROOT = 17,
147*a1157835SDaniel Fojt };
148*a1157835SDaniel Fojt 
149*a1157835SDaniel Fojt enum teap_tlv_result_status {
150*a1157835SDaniel Fojt 	TEAP_STATUS_SUCCESS = 1,
151*a1157835SDaniel Fojt 	TEAP_STATUS_FAILURE = 2
152*a1157835SDaniel Fojt };
153*a1157835SDaniel Fojt 
154*a1157835SDaniel Fojt #define TEAP_TLV_MANDATORY 0x8000
155*a1157835SDaniel Fojt #define TEAP_TLV_TYPE_MASK 0x3fff
156*a1157835SDaniel Fojt 
157*a1157835SDaniel Fojt /* RFC 7170, 4.2.6: Error TLV */
158*a1157835SDaniel Fojt enum teap_error_codes {
159*a1157835SDaniel Fojt 	TEAP_ERROR_INNER_METHOD = 1001,
160*a1157835SDaniel Fojt 	TEAP_ERROR_UNSPEC_AUTH_INFRA_PROBLEM = 1002,
161*a1157835SDaniel Fojt 	TEAP_ERROR_UNSPEC_AUTHENTICATION_FAILURE = 1003,
162*a1157835SDaniel Fojt 	TEAP_ERROR_UNSPEC_AUTHORIZATION_FAILURE = 1004,
163*a1157835SDaniel Fojt 	TEAP_ERROR_USER_ACCOUNT_CRED_UNAVAILABLE = 1005,
164*a1157835SDaniel Fojt 	TEAP_ERROR_USER_ACCOUNT_EXPIRED = 1006,
165*a1157835SDaniel Fojt 	TEAP_ERROR_USER_ACCOUNT_LOCKED_TRY_AGAIN_LATER = 1007,
166*a1157835SDaniel Fojt 	TEAP_ERROR_USER_ACCOUNT_LOCKED_ADMIN_REQ = 1008,
167*a1157835SDaniel Fojt 	TEAP_ERROR_TUNNEL_COMPROMISE_ERROR = 2001,
168*a1157835SDaniel Fojt 	TEAP_ERROR_UNEXPECTED_TLVS_EXCHANGED = 2002,
169*a1157835SDaniel Fojt };
170*a1157835SDaniel Fojt 
171*a1157835SDaniel Fojt struct wpabuf;
172*a1157835SDaniel Fojt struct tls_connection;
173*a1157835SDaniel Fojt 
174*a1157835SDaniel Fojt struct eap_teap_tlv_parse {
175*a1157835SDaniel Fojt 	u8 *eap_payload_tlv;
176*a1157835SDaniel Fojt 	size_t eap_payload_tlv_len;
177*a1157835SDaniel Fojt 	struct teap_tlv_crypto_binding *crypto_binding;
178*a1157835SDaniel Fojt 	size_t crypto_binding_len;
179*a1157835SDaniel Fojt 	int iresult;
180*a1157835SDaniel Fojt 	int result;
181*a1157835SDaniel Fojt 	u8 *nak;
182*a1157835SDaniel Fojt 	size_t nak_len;
183*a1157835SDaniel Fojt 	u8 request_action;
184*a1157835SDaniel Fojt 	u8 request_action_status;
185*a1157835SDaniel Fojt 	u8 *pac;
186*a1157835SDaniel Fojt 	size_t pac_len;
187*a1157835SDaniel Fojt 	u8 *basic_auth_req;
188*a1157835SDaniel Fojt 	size_t basic_auth_req_len;
189*a1157835SDaniel Fojt 	u8 *basic_auth_resp;
190*a1157835SDaniel Fojt 	size_t basic_auth_resp_len;
191*a1157835SDaniel Fojt };
192*a1157835SDaniel Fojt 
193*a1157835SDaniel Fojt void eap_teap_put_tlv_hdr(struct wpabuf *buf, u16 type, u16 len);
194*a1157835SDaniel Fojt void eap_teap_put_tlv(struct wpabuf *buf, u16 type, const void *data, u16 len);
195*a1157835SDaniel Fojt void eap_teap_put_tlv_buf(struct wpabuf *buf, u16 type,
196*a1157835SDaniel Fojt 			  const struct wpabuf *data);
197*a1157835SDaniel Fojt struct wpabuf * eap_teap_tlv_eap_payload(struct wpabuf *buf);
198*a1157835SDaniel Fojt int eap_teap_derive_eap_msk(const u8 *simck, u8 *msk);
199*a1157835SDaniel Fojt int eap_teap_derive_eap_emsk(const u8 *simck, u8 *emsk);
200*a1157835SDaniel Fojt int eap_teap_derive_cmk_basic_pw_auth(const u8 *s_imck_msk, u8 *cmk);
201*a1157835SDaniel Fojt int eap_teap_derive_imck(const u8 *prev_s_imck_msk, const u8 *prev_s_imck_emsk,
202*a1157835SDaniel Fojt 			 const u8 *msk, size_t msk_len,
203*a1157835SDaniel Fojt 			 const u8 *emsk, size_t emsk_len,
204*a1157835SDaniel Fojt 			 u8 *s_imck_msk, u8 *cmk_msk,
205*a1157835SDaniel Fojt 			 u8 *s_imck_emsk, u8 *cmk_emsk);
206*a1157835SDaniel Fojt int eap_teap_compound_mac(u16 tls_cs, const struct teap_tlv_crypto_binding *cb,
207*a1157835SDaniel Fojt 			  const struct wpabuf *server_outer_tlvs,
208*a1157835SDaniel Fojt 			  const struct wpabuf *peer_outer_tlvs,
209*a1157835SDaniel Fojt 			  const u8 *cmk, u8 *compound_mac);
210*a1157835SDaniel Fojt int eap_teap_parse_tlv(struct eap_teap_tlv_parse *tlv,
211*a1157835SDaniel Fojt 		       int tlv_type, u8 *pos, size_t len);
212*a1157835SDaniel Fojt const char * eap_teap_tlv_type_str(enum teap_tlv_types type);
213*a1157835SDaniel Fojt struct wpabuf * eap_teap_tlv_result(int status, int intermediate);
214*a1157835SDaniel Fojt struct wpabuf * eap_teap_tlv_error(enum teap_error_codes error);
215*a1157835SDaniel Fojt int eap_teap_allowed_anon_prov_phase2_method(u8 type);
216*a1157835SDaniel Fojt int eap_teap_allowed_anon_prov_cipher_suite(u16 cs);
217*a1157835SDaniel Fojt 
218*a1157835SDaniel Fojt #endif /* EAP_TEAP_H */
219