/*
* Copyright (c) 2001-2006 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  EAP and WLAN authentication protocols.
*
*/

/*
* %version: %
*/

#if !defined(_ABS_TLS_AM_SERVICES_H_)
#define _ABS_TLS_AM_SERVICES_H_

#include "eap_am_export.h"
#include "eap_array.h"

#if defined(USE_EAP_TLS_SESSION_TICKET)
class tls_extension_c;
#endif // #if defined(USE_EAP_TLS_SESSION_TICKET)

/// This class declares the functions adaptation module of TLS
/// requires from the TLS.
class EAP_EXPORT abs_tls_am_services_c
{
private:
	//--------------------------------------------------

	//--------------------------------------------------
protected:
	//--------------------------------------------------

	//--------------------------------------------------
public:
	//--------------------------------------------------

	/// Destructor does nothing.
	virtual ~abs_tls_am_services_c()
	{
	}

	/// Constructor does nothing.
	abs_tls_am_services_c()
	{
	}

	// This is commented in eap_base_type_c::configure().
	virtual eap_status_e configure() = 0;

	/**
	 * This function completes the asyncronous
	 * tls_am_services_c::query_cipher_suites_and_previous_session() function call.
	 * The list of cipher suites and the list of compression methods are saved.
	 * All pending actions are checked and completed during this call.
	 * The parameter completion_status must be eap_status_ok when query is successfull.
	 */
	virtual eap_status_e complete_query_cipher_suites_and_previous_session(
		const tls_session_type_e session_type,
		EAP_TEMPLATE_CONST eap_array_c<u16_t> * const cipher_suites,
		EAP_TEMPLATE_CONST eap_array_c<u8_t> * const compression_methods,
#if defined(USE_EAP_TLS_SESSION_TICKET)
		EAP_TEMPLATE_CONST eap_array_c<tls_extension_c> * const tls_extensions,
#endif // #if defined(USE_EAP_TLS_SESSION_TICKET)
		const eap_variable_data_c * const resumed_session_id,
		const eap_variable_data_c * const resumed_master_secret,
		const tls_cipher_suites_e resumed_cipher_suite,
		const eap_status_e completion_status) = 0;

	/**
	 * This function completes the asyncronous
	 * tls_am_services_c::select_cipher_suite_and_check_session_id() function call.
	 * The cipher suite, the session id and master secret are saved.
	 * NOTE the the session id and master secret are optional.
	 * Adaptation module can make independent
	 * decision to restore previous session or not. The selected cipher suite must be the same as
	 * was used in resumed session. The resumed cipher suite must be read from database.
	 * All pending actions are checked and completed during this call.
	 * The parameter completion_status must be eap_status_ok when query is successfull.
	 */
	virtual eap_status_e complete_select_cipher_suite_and_check_session_id(
		const tls_session_type_e session_type,
		const u16_t selected_cipher_suite,
		const eap_variable_data_c * const resumed_session_id,
		const eap_variable_data_c * const resumed_master_secret,
#if defined(USE_EAP_TLS_SESSION_TICKET)
		const tls_extension_c * const new_session_ticket_or_null,
#endif // #if defined(USE_EAP_TLS_SESSION_TICKET)
		const eap_status_e completion_status) = 0;

#if defined(USE_EAP_TLS_SESSION_TICKET)
	/**
	 * This function completes the asyncronous
	 * tls_am_services_c::query_new_session_ticket() function call.
	 * The parameter new_session_ticket_or_null is pointer to the
	 * new session ticket or null if new session ticket is omitted.
	 */
	virtual eap_status_e complete_query_new_session_ticket(
		const tls_extension_c * const new_session_ticket_or_null) = 0;
#endif //#if defined(USE_EAP_TLS_SESSION_TICKET)

	/**
	 * This function completes the tls_am_services_c::asyncronous verify_certificate_chain()
	 * function call.
	 * The parameter result must be eap_status_ok when certificate chain is valid.
	 * All pending actions are checked and completed during this call.
	 */
	virtual eap_status_e complete_verify_certificate_chain(
		const eap_status_e result) = 0;

	/**
	 * This function completes the tls_am_services_c::asyncronous
	 * query_certificate_chain() function call.
	 * The parameter certificate_chain is saved.
	 * All pending actions are checked and completed during this call.
	 * The parameter completion_status must be eap_status_ok when query is successfull.
	 */
	virtual eap_status_e complete_query_certificate_chain(
		EAP_TEMPLATE_CONST eap_array_c<eap_variable_data_c> * const certificate_chain,
		const eap_status_e completion_status) = 0;

	/**
	 * This function completes the tls_am_services_c::asyncronous
	 * query_certificate_authorities_and_types() function call.
	 * The parameters authorities and types are saved.
	 * All pending actions are checked and completed during this call.
	 * The parameter completion_status must be eap_status_ok when query is successfull.
	 */
	virtual eap_status_e complete_query_certificate_authorities_and_types(
		EAP_TEMPLATE_CONST eap_array_c<eap_variable_data_c> * const authorities,
		EAP_TEMPLATE_CONST eap_array_c<u8_t> * const types,
		const eap_status_e completion_status) = 0;

	/**
	 * This function completes the tls_am_services_c::asyncronous query_dh_parameters()
	 * function call.
	 * The parameter dhe_prime and dhe_group_generator are saved.
	 * All pending actions are checked and completed during this call.
	 * The parameter completion_status must be eap_status_ok when query is successfull.
	 */
	virtual eap_status_e complete_query_dh_parameters(
		const eap_variable_data_c * const dh_prime,
		const eap_variable_data_c * const dh_group_generator,
		const eap_status_e completion_status) = 0;

	/**
	 * This function completes the asyncronous tls_am_services_c::query_realm() function call.
	 * The parameter realm is saved.
	 * All pending actions are checked and completed during this call.
	 * The parameter completion_status must be eap_status_ok when query is successfull.
	 */
	virtual eap_status_e complete_query_realm(
		const eap_variable_data_c * const realm,
		const eap_status_e completion_status) = 0;

	/**
	 * This function completes the asyncronous tls_am_services_c::rsa_encrypt_with_public_key() function call.
	 * The parameter encrypted_premaster_secret is saved.
	 * All pending actions are checked and completed during this call.
	 * The parameter completion_status must be eap_status_ok when query is successfull.
	 */
	virtual eap_status_e complete_rsa_encrypt_with_public_key(
		const eap_variable_data_c * const encrypted_premaster_secret,
		const eap_status_e completion_status) = 0;

	/**
	 * This function completes the asyncronous tls_am_services_c::rsa_decrypt_with_private_key() function call.
	 * The parameter premaster_secret is saved.
	 * All pending actions are checked and completed during this call.
	 * The parameter completion_status must be eap_status_ok when query is successfull.
	 */
	virtual eap_status_e complete_rsa_decrypt_with_private_key(
		const eap_variable_data_c * const premaster_secret,
		const eap_status_e completion_status) = 0;

	/**
	 * This function completes the asyncronous tls_am_services_c::sign_with_private_key() function call.
	 * The parameter message_hash is saved.
	 * All pending actions are checked and completed during this call.
	 * The parameter completion_status must be eap_status_ok when query is successfull.
	 */
	virtual eap_status_e complete_sign_with_private_key(
		const eap_variable_data_c * const signed_message_hash,
		const eap_status_e completion_status) = 0;

	/**
	 * This function completes the asyncronous tls_am_services_c::verify_with_public_key() function call.
	 * The parameter verify_status must be eap_status_ok when verification is successfull.
	 * All pending actions are checked and completed during this call.
	 */
	virtual eap_status_e complete_verify_with_public_key(
		const eap_status_e verify_status) = 0;

	virtual eap_status_e complete_query_ttls_pap_username_and_password(
		const eap_variable_data_c * const ttls_pap_username,
		const eap_variable_data_c * const ttls_pap_password,
		const eap_status_e query_result) = 0;

	virtual eap_status_e complete_verify_ttls_pap_username_and_password(
		const eap_status_e authentication_result,
		const eap_variable_data_c * const ttls_pap_reply_message) = 0;

	//--------------------------------------------------
}; // class abs_tls_am_services_c

#endif //#if !defined(_ABS_TLS_AM_SERVICES_H_)

//--------------------------------------------------



// End.
