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