/*
* Copyright (c) 2011 Rustam Kovhaev. All rights reserved.
* Copyright (c) 2021 Eivind Næss. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in
*    the documentation and/or other materials provided with the
*    distribution.
*
* 3. The name(s) of the authors of this software must not be used to
*    endorse or promote products derived from this software without
*    prior written permission.
*
* THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
* THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
* SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/

#ifndef PPP_PEAP_H
#define PPP_PEAP_H

#include "pppdconf.h"

#define PEAP_PHASE_1                    1
#define PEAP_PHASE_2                    2

#define PEAP_HEADERLEN                  6
#define PEAP_FRAGMENT_LENGTH_FIELD      4
#define PEAP_FLAGS_FIELD                1
#define PEAP_FLAGS_ACK                  0

#define PEAP_CAPABILITIES_TYPE          254
#define PEAP_CAPABILITIES_LEN           12

#define PEAP_TLV_TYPE                   12
#define PEAP_TLV_LENGTH_FIELD           56
#define PEAP_TLV_SUBTYPE_REQUEST        0
#define PEAP_TLV_SUBTYPE_RESPONSE       1
#define PEAP_TLV_HEADERLEN              8
#define PEAP_TLV_RESULT_LEN             7
#define PEAP_TLV_LEN                    71

/*
* Microsoft PEAP client/server never exchange
* outer TLVs during PEAP authentication
*/
#define PEAP_TLV_DATA_LEN               61

#define PEAP_TLV_TK_LEN                 60
#define PEAP_TLV_ISK_LEN                32
#define PEAP_TLV_IPMKSEED_LEN           59
#define PEAP_TLV_TEMPKEY_LEN            40
#define PEAP_TLV_IPMK_LEN               40
#define PEAP_TLV_CMK_LEN                20
#define PEAP_TLV_NONCE_LEN              32
#define PEAP_TLV_COMP_MAC_LEN           20
#define PEAP_TLV_CSK_LEN                128
#define PEAP_TLV_TK_SEED_LABEL          "client EAP encryption"
#define PEAP_TLV_IPMK_SEED_LABEL        "Inner Methods Compound Keys"
#define PEAP_TLV_CSK_SEED_LABEL         "Session Key Generating Function"

#define PEAP_S_FLAG_SET                 0x20
#define PEAP_L_FLAG_SET                 0x80
#define PEAP_LM_FLAG_SET                0xC0
#define PEAP_M_FLAG_SET                 0x40
#define PEAP_NO_FLAGS                   0x00

#define EAP_TLS_KEY_LEN                 0x40
#define TLS_RECORD_MAX_SIZE             0x4000

struct peap_state;

/**
* Initialize the PEAP structure
*/
int peap_init(struct peap_state** psm, const char *remote_name);

/**
* Process a PEAP packet
*/
int peap_process(eap_state *esp, u_char id, u_char *inp, int len);

/**
* Clean up the PEAP structure
*/
void peap_finish(struct peap_state **psm);

#endif /* PPP_PEAP_H */