18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * EAP server/peer: EAP-SAKE shared routines 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2006-2007, 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 EAP_SAKE_COMMON_H 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_COMMON_H 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_VERSION 2 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_SUBTYPE_CHALLENGE 1 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_SUBTYPE_CONFIRM 2 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_SUBTYPE_AUTH_REJECT 3 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_SUBTYPE_IDENTITY 4 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_AT_RAND_S 1 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_AT_RAND_P 2 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_AT_MIC_S 3 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_AT_MIC_P 4 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_AT_SERVERID 5 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_AT_PEERID 6 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_AT_SPI_S 7 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_AT_SPI_P 8 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_AT_ANY_ID_REQ 9 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_AT_PERM_ID_REQ 10 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_AT_ENCR_DATA 128 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_AT_IV 129 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_AT_PADDING 130 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_AT_NEXT_TMPID 131 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_AT_MSK_LIFE 132 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_RAND_LEN 16 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_MIC_LEN 16 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_ROOT_SECRET_LEN 16 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_SMS_LEN 16 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_TEK_AUTH_LEN 16 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_TEK_CIPHER_LEN 16 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_SAKE_TEK_LEN (EAP_SAKE_TEK_AUTH_LEN + EAP_SAKE_TEK_CIPHER_LEN) 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef _MSC_VER 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#pragma pack(push, 1) 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _MSC_VER */ 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct eap_sake_hdr { 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 version; /* EAP_SAKE_VERSION */ 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 session_id; 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 subtype; 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} STRUCT_PACKED; 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef _MSC_VER 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#pragma pack(pop) 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _MSC_VER */ 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct eap_sake_parse_attr { 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *rand_s; 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *rand_p; 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *mic_s; 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *mic_p; 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *serverid; 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t serverid_len; 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *peerid; 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t peerid_len; 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *spi_s; 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t spi_s_len; 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *spi_p; 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t spi_p_len; 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *any_id_req; 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *perm_id_req; 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *encr_data; 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t encr_data_len; 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *iv; 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t iv_len; 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *next_tmpid; 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t next_tmpid_len; 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *msk_life; 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eap_sake_parse_attributes(const u8 *buf, size_t len, 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct eap_sake_parse_attr *attr); 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid eap_sake_derive_keys(const u8 *root_secret_a, const u8 *root_secret_b, 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *rand_s, const u8 *rand_p, 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *tek, u8 *msk, u8 *emsk); 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eap_sake_compute_mic(const u8 *tek_auth, 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *rand_s, const u8 *rand_p, 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *serverid, size_t serverid_len, 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *peerid, size_t peerid_len, 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int peer, const u8 *eap, size_t eap_len, 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *mic_pos, u8 *mic); 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid eap_sake_add_attr(struct wpabuf *buf, u8 type, const u8 *data, 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len); 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* EAP_SAKE_COMMON_H */ 97