16d49e1aeSJan Lentfer /* 26d49e1aeSJan Lentfer * EAP server/peer: EAP-SAKE shared routines 3*a1157835SDaniel Fojt * Copyright (c) 2006-2019, Jouni Malinen <j@w1.fi> 46d49e1aeSJan Lentfer * 53ff40c12SJohn Marino * This software may be distributed under the terms of the BSD license. 63ff40c12SJohn Marino * See README for more details. 76d49e1aeSJan Lentfer */ 86d49e1aeSJan Lentfer 96d49e1aeSJan Lentfer #ifndef EAP_SAKE_COMMON_H 106d49e1aeSJan Lentfer #define EAP_SAKE_COMMON_H 116d49e1aeSJan Lentfer 126d49e1aeSJan Lentfer #define EAP_SAKE_VERSION 2 136d49e1aeSJan Lentfer 146d49e1aeSJan Lentfer #define EAP_SAKE_SUBTYPE_CHALLENGE 1 156d49e1aeSJan Lentfer #define EAP_SAKE_SUBTYPE_CONFIRM 2 166d49e1aeSJan Lentfer #define EAP_SAKE_SUBTYPE_AUTH_REJECT 3 176d49e1aeSJan Lentfer #define EAP_SAKE_SUBTYPE_IDENTITY 4 186d49e1aeSJan Lentfer 196d49e1aeSJan Lentfer #define EAP_SAKE_AT_RAND_S 1 206d49e1aeSJan Lentfer #define EAP_SAKE_AT_RAND_P 2 216d49e1aeSJan Lentfer #define EAP_SAKE_AT_MIC_S 3 226d49e1aeSJan Lentfer #define EAP_SAKE_AT_MIC_P 4 236d49e1aeSJan Lentfer #define EAP_SAKE_AT_SERVERID 5 246d49e1aeSJan Lentfer #define EAP_SAKE_AT_PEERID 6 256d49e1aeSJan Lentfer #define EAP_SAKE_AT_SPI_S 7 266d49e1aeSJan Lentfer #define EAP_SAKE_AT_SPI_P 8 276d49e1aeSJan Lentfer #define EAP_SAKE_AT_ANY_ID_REQ 9 286d49e1aeSJan Lentfer #define EAP_SAKE_AT_PERM_ID_REQ 10 296d49e1aeSJan Lentfer #define EAP_SAKE_AT_ENCR_DATA 128 306d49e1aeSJan Lentfer #define EAP_SAKE_AT_IV 129 316d49e1aeSJan Lentfer #define EAP_SAKE_AT_PADDING 130 326d49e1aeSJan Lentfer #define EAP_SAKE_AT_NEXT_TMPID 131 336d49e1aeSJan Lentfer #define EAP_SAKE_AT_MSK_LIFE 132 346d49e1aeSJan Lentfer 356d49e1aeSJan Lentfer #define EAP_SAKE_RAND_LEN 16 366d49e1aeSJan Lentfer #define EAP_SAKE_MIC_LEN 16 376d49e1aeSJan Lentfer #define EAP_SAKE_ROOT_SECRET_LEN 16 386d49e1aeSJan Lentfer #define EAP_SAKE_SMS_LEN 16 396d49e1aeSJan Lentfer #define EAP_SAKE_TEK_AUTH_LEN 16 406d49e1aeSJan Lentfer #define EAP_SAKE_TEK_CIPHER_LEN 16 416d49e1aeSJan Lentfer #define EAP_SAKE_TEK_LEN (EAP_SAKE_TEK_AUTH_LEN + EAP_SAKE_TEK_CIPHER_LEN) 426d49e1aeSJan Lentfer 436d49e1aeSJan Lentfer #ifdef _MSC_VER 446d49e1aeSJan Lentfer #pragma pack(push, 1) 456d49e1aeSJan Lentfer #endif /* _MSC_VER */ 466d49e1aeSJan Lentfer 476d49e1aeSJan Lentfer struct eap_sake_hdr { 486d49e1aeSJan Lentfer u8 version; /* EAP_SAKE_VERSION */ 496d49e1aeSJan Lentfer u8 session_id; 506d49e1aeSJan Lentfer u8 subtype; 516d49e1aeSJan Lentfer } STRUCT_PACKED; 526d49e1aeSJan Lentfer 536d49e1aeSJan Lentfer #ifdef _MSC_VER 546d49e1aeSJan Lentfer #pragma pack(pop) 556d49e1aeSJan Lentfer #endif /* _MSC_VER */ 566d49e1aeSJan Lentfer 576d49e1aeSJan Lentfer 586d49e1aeSJan Lentfer struct eap_sake_parse_attr { 596d49e1aeSJan Lentfer const u8 *rand_s; 606d49e1aeSJan Lentfer const u8 *rand_p; 616d49e1aeSJan Lentfer const u8 *mic_s; 626d49e1aeSJan Lentfer const u8 *mic_p; 636d49e1aeSJan Lentfer const u8 *serverid; 646d49e1aeSJan Lentfer size_t serverid_len; 656d49e1aeSJan Lentfer const u8 *peerid; 666d49e1aeSJan Lentfer size_t peerid_len; 676d49e1aeSJan Lentfer const u8 *spi_s; 686d49e1aeSJan Lentfer size_t spi_s_len; 696d49e1aeSJan Lentfer const u8 *spi_p; 706d49e1aeSJan Lentfer size_t spi_p_len; 716d49e1aeSJan Lentfer const u8 *any_id_req; 726d49e1aeSJan Lentfer const u8 *perm_id_req; 736d49e1aeSJan Lentfer const u8 *encr_data; 746d49e1aeSJan Lentfer size_t encr_data_len; 756d49e1aeSJan Lentfer const u8 *iv; 766d49e1aeSJan Lentfer size_t iv_len; 776d49e1aeSJan Lentfer const u8 *next_tmpid; 786d49e1aeSJan Lentfer size_t next_tmpid_len; 796d49e1aeSJan Lentfer const u8 *msk_life; 806d49e1aeSJan Lentfer }; 816d49e1aeSJan Lentfer 826d49e1aeSJan Lentfer int eap_sake_parse_attributes(const u8 *buf, size_t len, 836d49e1aeSJan Lentfer struct eap_sake_parse_attr *attr); 84*a1157835SDaniel Fojt int eap_sake_derive_keys(const u8 *root_secret_a, const u8 *root_secret_b, 856d49e1aeSJan Lentfer const u8 *rand_s, const u8 *rand_p, 866d49e1aeSJan Lentfer u8 *tek, u8 *msk, u8 *emsk); 876d49e1aeSJan Lentfer int eap_sake_compute_mic(const u8 *tek_auth, 886d49e1aeSJan Lentfer const u8 *rand_s, const u8 *rand_p, 896d49e1aeSJan Lentfer const u8 *serverid, size_t serverid_len, 906d49e1aeSJan Lentfer const u8 *peerid, size_t peerid_len, 916d49e1aeSJan Lentfer int peer, const u8 *eap, size_t eap_len, 926d49e1aeSJan Lentfer const u8 *mic_pos, u8 *mic); 936d49e1aeSJan Lentfer void eap_sake_add_attr(struct wpabuf *buf, u8 type, const u8 *data, 946d49e1aeSJan Lentfer size_t len); 956d49e1aeSJan Lentfer 966d49e1aeSJan Lentfer #endif /* EAP_SAKE_COMMON_H */ 97