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