eap_pwd_common.h revision 1f69aa52ea2e0a73ac502565df8c666ee49cab6a
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * EAP server/peer: EAP-pwd shared definitions 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2009, Dan Harkins <dharkins@lounge.org> 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 58d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This program is free software; you can redistribute it and/or modify 68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * it under the terms of the BSD license. 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Alternatively, this software may be distributed under the terms of the 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * GNU General Public License version 2 as published by the Free Software 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Foundation. 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * See README and COPYING for more details. 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef EAP_PWD_COMMON_H 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PWD_COMMON_H 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <openssl/bn.h> 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <openssl/sha.h> 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <openssl/ec.h> 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <openssl/evp.h> 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <openssl/hmac.h> 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * definition of a finite cyclic group 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * TODO: support one based on a prime field 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef struct group_definition_ { 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u16 group_num; 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt EC_GROUP *group; 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt EC_POINT *pwe; 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt BIGNUM *order; 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt BIGNUM *prime; 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} EAP_PWD_group; 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * EAP-pwd header, included on all payloads 381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * L(1 bit) | M(1 bit) | exch(6 bits) | total_length(if L is set) 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PWD_OPCODE_ID_EXCH 1 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PWD_OPCODE_COMMIT_EXCH 2 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PWD_OPCODE_CONFIRM_EXCH 3 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PWD_GET_LENGTH_BIT(x) ((x)->lm_exch & 0x80) 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PWD_SET_LENGTH_BIT(x) ((x)->lm_exch |= 0x80) 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PWD_GET_MORE_BIT(x) ((x)->lm_exch & 0x40) 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PWD_SET_MORE_BIT(x) ((x)->lm_exch |= 0x40) 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PWD_GET_EXCHANGE(x) ((x)->lm_exch & 0x3f) 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PWD_SET_EXCHANGE(x,y) ((x)->lm_exch |= (y)) 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* EAP-pwd-ID payload */ 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct eap_pwd_id { 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt be16 group_num; 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 random_function; 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PWD_DEFAULT_RAND_FUNC 1 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 prf; 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PWD_DEFAULT_PRF 1 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 token[4]; 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 prep; 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PWD_PREP_NONE 0 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PWD_PREP_MS 1 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 identity[0]; /* length inferred from payload */ 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} STRUCT_PACKED; 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* common routines */ 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint compute_password_element(EAP_PWD_group *, u16, u8 *, int, u8 *, int, u8 *, 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int, u8 *); 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint compute_keys(EAP_PWD_group *, BN_CTX *, BIGNUM *, BIGNUM *, BIGNUM *, 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *, u8 *, u32 *, u8 *, u8 *); 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid H_Init(HMAC_CTX *); 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid H_Update(HMAC_CTX *, const u8 *, int); 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid H_Final(HMAC_CTX *, u8 *); 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* EAP_PWD_COMMON_H */ 75