139beb93cSSam Leffler /* 239beb93cSSam Leffler * EAP server/peer: EAP-SAKE shared routines 3*4bc52338SCy Schubert * Copyright (c) 2006-2019, Jouni Malinen <j@w1.fi> 439beb93cSSam Leffler * 5f05cddf9SRui Paulo * This software may be distributed under the terms of the BSD license. 6f05cddf9SRui Paulo * See README for more details. 739beb93cSSam Leffler */ 839beb93cSSam Leffler 939beb93cSSam Leffler #ifndef EAP_SAKE_COMMON_H 1039beb93cSSam Leffler #define EAP_SAKE_COMMON_H 1139beb93cSSam Leffler 1239beb93cSSam Leffler #define EAP_SAKE_VERSION 2 1339beb93cSSam Leffler 1439beb93cSSam Leffler #define EAP_SAKE_SUBTYPE_CHALLENGE 1 1539beb93cSSam Leffler #define EAP_SAKE_SUBTYPE_CONFIRM 2 1639beb93cSSam Leffler #define EAP_SAKE_SUBTYPE_AUTH_REJECT 3 1739beb93cSSam Leffler #define EAP_SAKE_SUBTYPE_IDENTITY 4 1839beb93cSSam Leffler 1939beb93cSSam Leffler #define EAP_SAKE_AT_RAND_S 1 2039beb93cSSam Leffler #define EAP_SAKE_AT_RAND_P 2 2139beb93cSSam Leffler #define EAP_SAKE_AT_MIC_S 3 2239beb93cSSam Leffler #define EAP_SAKE_AT_MIC_P 4 2339beb93cSSam Leffler #define EAP_SAKE_AT_SERVERID 5 2439beb93cSSam Leffler #define EAP_SAKE_AT_PEERID 6 2539beb93cSSam Leffler #define EAP_SAKE_AT_SPI_S 7 2639beb93cSSam Leffler #define EAP_SAKE_AT_SPI_P 8 2739beb93cSSam Leffler #define EAP_SAKE_AT_ANY_ID_REQ 9 2839beb93cSSam Leffler #define EAP_SAKE_AT_PERM_ID_REQ 10 2939beb93cSSam Leffler #define EAP_SAKE_AT_ENCR_DATA 128 3039beb93cSSam Leffler #define EAP_SAKE_AT_IV 129 3139beb93cSSam Leffler #define EAP_SAKE_AT_PADDING 130 3239beb93cSSam Leffler #define EAP_SAKE_AT_NEXT_TMPID 131 3339beb93cSSam Leffler #define EAP_SAKE_AT_MSK_LIFE 132 3439beb93cSSam Leffler 3539beb93cSSam Leffler #define EAP_SAKE_RAND_LEN 16 3639beb93cSSam Leffler #define EAP_SAKE_MIC_LEN 16 3739beb93cSSam Leffler #define EAP_SAKE_ROOT_SECRET_LEN 16 3839beb93cSSam Leffler #define EAP_SAKE_SMS_LEN 16 3939beb93cSSam Leffler #define EAP_SAKE_TEK_AUTH_LEN 16 4039beb93cSSam Leffler #define EAP_SAKE_TEK_CIPHER_LEN 16 4139beb93cSSam Leffler #define EAP_SAKE_TEK_LEN (EAP_SAKE_TEK_AUTH_LEN + EAP_SAKE_TEK_CIPHER_LEN) 4239beb93cSSam Leffler 4339beb93cSSam Leffler #ifdef _MSC_VER 4439beb93cSSam Leffler #pragma pack(push, 1) 4539beb93cSSam Leffler #endif /* _MSC_VER */ 4639beb93cSSam Leffler 4739beb93cSSam Leffler struct eap_sake_hdr { 4839beb93cSSam Leffler u8 version; /* EAP_SAKE_VERSION */ 4939beb93cSSam Leffler u8 session_id; 5039beb93cSSam Leffler u8 subtype; 5139beb93cSSam Leffler } STRUCT_PACKED; 5239beb93cSSam Leffler 5339beb93cSSam Leffler #ifdef _MSC_VER 5439beb93cSSam Leffler #pragma pack(pop) 5539beb93cSSam Leffler #endif /* _MSC_VER */ 5639beb93cSSam Leffler 5739beb93cSSam Leffler 5839beb93cSSam Leffler struct eap_sake_parse_attr { 5939beb93cSSam Leffler const u8 *rand_s; 6039beb93cSSam Leffler const u8 *rand_p; 6139beb93cSSam Leffler const u8 *mic_s; 6239beb93cSSam Leffler const u8 *mic_p; 6339beb93cSSam Leffler const u8 *serverid; 6439beb93cSSam Leffler size_t serverid_len; 6539beb93cSSam Leffler const u8 *peerid; 6639beb93cSSam Leffler size_t peerid_len; 6739beb93cSSam Leffler const u8 *spi_s; 6839beb93cSSam Leffler size_t spi_s_len; 6939beb93cSSam Leffler const u8 *spi_p; 7039beb93cSSam Leffler size_t spi_p_len; 7139beb93cSSam Leffler const u8 *any_id_req; 7239beb93cSSam Leffler const u8 *perm_id_req; 7339beb93cSSam Leffler const u8 *encr_data; 7439beb93cSSam Leffler size_t encr_data_len; 7539beb93cSSam Leffler const u8 *iv; 7639beb93cSSam Leffler size_t iv_len; 7739beb93cSSam Leffler const u8 *next_tmpid; 7839beb93cSSam Leffler size_t next_tmpid_len; 7939beb93cSSam Leffler const u8 *msk_life; 8039beb93cSSam Leffler }; 8139beb93cSSam Leffler 8239beb93cSSam Leffler int eap_sake_parse_attributes(const u8 *buf, size_t len, 8339beb93cSSam Leffler struct eap_sake_parse_attr *attr); 84*4bc52338SCy Schubert int eap_sake_derive_keys(const u8 *root_secret_a, const u8 *root_secret_b, 8539beb93cSSam Leffler const u8 *rand_s, const u8 *rand_p, 8639beb93cSSam Leffler u8 *tek, u8 *msk, u8 *emsk); 8739beb93cSSam Leffler int eap_sake_compute_mic(const u8 *tek_auth, 8839beb93cSSam Leffler const u8 *rand_s, const u8 *rand_p, 8939beb93cSSam Leffler const u8 *serverid, size_t serverid_len, 9039beb93cSSam Leffler const u8 *peerid, size_t peerid_len, 9139beb93cSSam Leffler int peer, const u8 *eap, size_t eap_len, 9239beb93cSSam Leffler const u8 *mic_pos, u8 *mic); 9339beb93cSSam Leffler void eap_sake_add_attr(struct wpabuf *buf, u8 type, const u8 *data, 9439beb93cSSam Leffler size_t len); 9539beb93cSSam Leffler 9639beb93cSSam Leffler #endif /* EAP_SAKE_COMMON_H */ 97