1189251Ssam/*
2189251Ssam * EAP server/peer: EAP-SAKE shared routines
3189251Ssam * Copyright (c) 2006-2007, Jouni Malinen <j@w1.fi>
4189251Ssam *
5189251Ssam * This program is free software; you can redistribute it and/or modify
6189251Ssam * it under the terms of the GNU General Public License version 2 as
7189251Ssam * published by the Free Software Foundation.
8189251Ssam *
9189251Ssam * Alternatively, this software may be distributed under the terms of BSD
10189251Ssam * license.
11189251Ssam *
12189251Ssam * See README and COPYING for more details.
13189251Ssam */
14189251Ssam
15189251Ssam#ifndef EAP_SAKE_COMMON_H
16189251Ssam#define EAP_SAKE_COMMON_H
17189251Ssam
18189251Ssam#define EAP_SAKE_VERSION 2
19189251Ssam
20189251Ssam#define EAP_SAKE_SUBTYPE_CHALLENGE 1
21189251Ssam#define EAP_SAKE_SUBTYPE_CONFIRM 2
22189251Ssam#define EAP_SAKE_SUBTYPE_AUTH_REJECT 3
23189251Ssam#define EAP_SAKE_SUBTYPE_IDENTITY 4
24189251Ssam
25189251Ssam#define EAP_SAKE_AT_RAND_S 1
26189251Ssam#define EAP_SAKE_AT_RAND_P 2
27189251Ssam#define EAP_SAKE_AT_MIC_S 3
28189251Ssam#define EAP_SAKE_AT_MIC_P 4
29189251Ssam#define EAP_SAKE_AT_SERVERID 5
30189251Ssam#define EAP_SAKE_AT_PEERID 6
31189251Ssam#define EAP_SAKE_AT_SPI_S 7
32189251Ssam#define EAP_SAKE_AT_SPI_P 8
33189251Ssam#define EAP_SAKE_AT_ANY_ID_REQ 9
34189251Ssam#define EAP_SAKE_AT_PERM_ID_REQ 10
35189251Ssam#define EAP_SAKE_AT_ENCR_DATA 128
36189251Ssam#define EAP_SAKE_AT_IV 129
37189251Ssam#define EAP_SAKE_AT_PADDING 130
38189251Ssam#define EAP_SAKE_AT_NEXT_TMPID 131
39189251Ssam#define EAP_SAKE_AT_MSK_LIFE 132
40189251Ssam
41189251Ssam#define EAP_SAKE_RAND_LEN 16
42189251Ssam#define EAP_SAKE_MIC_LEN 16
43189251Ssam#define EAP_SAKE_ROOT_SECRET_LEN 16
44189251Ssam#define EAP_SAKE_SMS_LEN 16
45189251Ssam#define EAP_SAKE_TEK_AUTH_LEN 16
46189251Ssam#define EAP_SAKE_TEK_CIPHER_LEN 16
47189251Ssam#define EAP_SAKE_TEK_LEN (EAP_SAKE_TEK_AUTH_LEN + EAP_SAKE_TEK_CIPHER_LEN)
48189251Ssam
49189251Ssam#ifdef _MSC_VER
50189251Ssam#pragma pack(push, 1)
51189251Ssam#endif /* _MSC_VER */
52189251Ssam
53189251Ssamstruct eap_sake_hdr {
54189251Ssam	u8 version; /* EAP_SAKE_VERSION */
55189251Ssam	u8 session_id;
56189251Ssam	u8 subtype;
57189251Ssam} STRUCT_PACKED;
58189251Ssam
59189251Ssam#ifdef _MSC_VER
60189251Ssam#pragma pack(pop)
61189251Ssam#endif /* _MSC_VER */
62189251Ssam
63189251Ssam
64189251Ssamstruct eap_sake_parse_attr {
65189251Ssam	const u8 *rand_s;
66189251Ssam	const u8 *rand_p;
67189251Ssam	const u8 *mic_s;
68189251Ssam	const u8 *mic_p;
69189251Ssam	const u8 *serverid;
70189251Ssam	size_t serverid_len;
71189251Ssam	const u8 *peerid;
72189251Ssam	size_t peerid_len;
73189251Ssam	const u8 *spi_s;
74189251Ssam	size_t spi_s_len;
75189251Ssam	const u8 *spi_p;
76189251Ssam	size_t spi_p_len;
77189251Ssam	const u8 *any_id_req;
78189251Ssam	const u8 *perm_id_req;
79189251Ssam	const u8 *encr_data;
80189251Ssam	size_t encr_data_len;
81189251Ssam	const u8 *iv;
82189251Ssam	size_t iv_len;
83189251Ssam	const u8 *next_tmpid;
84189251Ssam	size_t next_tmpid_len;
85189251Ssam	const u8 *msk_life;
86189251Ssam};
87189251Ssam
88189251Ssamint eap_sake_parse_attributes(const u8 *buf, size_t len,
89189251Ssam			      struct eap_sake_parse_attr *attr);
90189251Ssamvoid eap_sake_derive_keys(const u8 *root_secret_a, const u8 *root_secret_b,
91189251Ssam			  const u8 *rand_s, const u8 *rand_p,
92189251Ssam			  u8 *tek, u8 *msk, u8 *emsk);
93189251Ssamint eap_sake_compute_mic(const u8 *tek_auth,
94189251Ssam			 const u8 *rand_s, const u8 *rand_p,
95189251Ssam			 const u8 *serverid, size_t serverid_len,
96189251Ssam			 const u8 *peerid, size_t peerid_len,
97189251Ssam			 int peer, const u8 *eap, size_t eap_len,
98189251Ssam			 const u8 *mic_pos, u8 *mic);
99189251Ssamvoid eap_sake_add_attr(struct wpabuf *buf, u8 type, const u8 *data,
100189251Ssam		       size_t len);
101189251Ssam
102189251Ssam#endif /* EAP_SAKE_COMMON_H */
103