eapol/eapol_framework/eapol_common/include/eapol_rsna_key_header.h
changeset 0 c8830336c852
child 2 1c7bc153c08e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eapol/eapol_framework/eapol_common/include/eapol_rsna_key_header.h	Thu Dec 17 08:47:43 2009 +0200
@@ -0,0 +1,517 @@
+/*
+* 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.
+*
+*/
+
+
+
+
+#if !defined(_EAPOL_RSNA_KEY_HEADER_H_)
+#define _EAPOL_RSNA_KEY_HEADER_H_
+
+#include "eapol_header.h"
+#include "eap_general_header_base.h"
+#include "eapol_key_header.h"
+#include "eapol_key_types.h"
+#include "eap_am_export.h"
+
+
+//------------------------------------------------------
+
+/// This is base class of EAPOL RSNA key header.
+/**
+ * @code
+ *  0                   1                   2                   3
+ *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ *                                                 +-+-+-+-+-+-+-+-+
+ *                                                 | EAPOL Version |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |  EAPOL Type   |   EAPOL Packet Body Length    | Descriptor Ty.|
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Key Information               | Key Length                    |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Key Replay Counter 8 octets                                   |
+ * +-                                                             -+
+ * |                                                               |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Key Nonce 32 octets                                           |
+ * +-                                                             -+
+ * :                                                               :
+ * +-                                                             -+
+ * |                                                               |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | EAPOL-Key IV 16 octets                                        |
+ * +-                                                             -+
+ * :                                                               :
+ * +-                                                             -+
+ * |                                                               |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Key RSC 8 octets                                              |
+ * +-                                                             -+
+ * |                                                               |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | STA MAC Address 6 octets                                      |
+ * +-                             -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |                               | Reserved                      |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Key MIC 16 octets                                             |
+ * +-                                                             -+
+ * :                                                               :
+ * +-                                                             -+
+ * |                                                               |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Key Data Length (n) 2 octets                                  |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Key Data n octets                                             |
+ * +-                                                             -+
+ * :                                                               :
+ * +-                                                             -+
+ * |                                                               |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * @endcode
+ */
+class EAP_EXPORT eapol_RSNA_key_header_c
+: public eap_general_header_base_c
+{
+private:
+	//--------------------------------------------------
+
+	/// This is pointer to the tools class.
+	abs_eap_am_tools_c * const m_am_tools;
+
+	/// This flag indicates whether the message is RSNA (true) or WPA (false).
+	bool m_is_RSNA_when_true;
+
+	/// This flag indicates whether the message is WPXM (true) or not (false).
+	bool m_is_WPXM_when_true;
+
+	// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+	/// This is enumeration of Key Information bit masks.
+	enum key_information_bit_masks_e
+	{
+		m_key_information_mask_key_descriptor_version  = 0x0007, ///< 3 bits wide
+		m_key_information_mask_key_type                = 0x0008, ///< 1 bits wide
+		m_key_information_mask_reserved_a_RSNA         = 0x0030, ///< 2 bits wide, this is RSNA specific.
+		m_key_information_mask_key_index_WPA           = 0x0030, ///< 2 bits wide, this is WPA specific.
+		m_key_information_mask_install                 = 0x0040, ///< 1 bit  wide
+		m_key_information_mask_key_ack                 = 0x0080, ///< 1 bit  wide
+		m_key_information_mask_key_MIC                 = 0x0100, ///< 1 bit  wide
+		m_key_information_mask_secure                  = 0x0200, ///< 1 bit  wide
+		m_key_information_mask_error                   = 0x0400, ///< 1 bit  wide
+		m_key_information_mask_request                 = 0x0800, ///< 1 bit  wide
+		m_key_information_mask_encrypted_key_data_RSNA = 0x1000, ///< 1 bit  wide, this is RSNA specific.
+		m_key_information_mask_reserved_b_RSNA         = 0xe000, ///< 3 bits wide, this is RSNA specific.
+		m_key_information_mask_reserved_b_WPA          = 0xf000, ///< 4 bits wide, this is WPA specific.
+	};
+
+	/// This is enumeration of Key Information bit masks.
+	enum key_information_bit_shifts_e
+	{
+		m_key_information_mask_key_descriptor_version_shift  =  0,
+		m_key_information_mask_key_type_shift                =  3,
+		m_key_information_mask_reserved_a_shift_RSNA         =  4, // this is RSNA specific.
+		m_key_information_mask_key_index_shift_WPA           =  4, // this is WPA specific.
+		m_key_information_mask_install_shift                 =  6,
+		m_key_information_mask_key_ack_shift                 =  7,
+		m_key_information_mask_key_MIC_shift                 =  8,
+		m_key_information_mask_secure_shift                  =  9,
+		m_key_information_mask_error_shift                   = 10,
+		m_key_information_mask_request_shift                 = 11,		
+		m_key_information_mask_encrypted_key_data_shift_RSNA = 12, // this is RSNA specific.
+		m_key_information_mask_reserved_b_shift_WPA          = 12, // this is WPA specific.
+		m_key_information_mask_reserved_b_shift_RSNA         = 13, // this is RSNA specific.
+	};
+
+	// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+	/// This function sets the Key Information field.
+	EAP_FUNC_IMPORT eap_status_e set_key_information(const u16_t info);
+	
+	//--------------------------------------------------
+public:
+	//--------------------------------------------------
+
+	enum key_descriptor_version_e
+	{
+		m_key_descriptor_version_none = 0,
+		m_key_descriptor_version_1 = 1,
+		m_key_descriptor_version_2 = 2,
+	};
+
+	enum eapol_RSNA_key_header_constants_e
+	{
+		EAPOL_RSNA_KEY_EAPOL_VERSION_SIZE       =   1ul,
+		EAPOL_RSNA_KEY_EAPOL_TYPE_SIZE          =   1ul,
+		EAPOL_RSNA_KEY_EAPOL_BODY_LENGTH_SIZE   =   2ul,
+
+		EAPOL_RSNA_KEY_DESCRIPTOR_TYPE_SIZE     =   1ul,
+		EAPOL_RSNA_KEY_KEY_INFORMATION_SIZE     =   2ul,
+		EAPOL_RSNA_KEY_KEY_LENGTH_SIZE          =   2ul,
+		EAPOL_RSNA_KEY_REPLY_COUNTER_SIZE       =   8ul,
+		EAPOL_RSNA_KEY_NONCE_SIZE               =  32ul,
+		EAPOL_RSNA_EAPOL_KEY_IV_SIZE            =  16ul,
+		EAPOL_RSNA_KEY_RSC_SIZE                 =   8ul,
+		EAPOL_RSNA_KEY_STA_MAC_ADDRESS_SIZE     =   6ul,
+		EAPOL_RSNA_KEY_RESERVED_SIZE            =   2ul,
+		EAPOL_RSNA_KEY_MIC_SIZE                 =  16ul,
+		EAPOL_RSNA_KEY_DATA_LENGTH_SIZE         =   2ul,
+
+		EAPOL_RSNA_KEY_DATA_PMKID_SIZE          =  16ul,
+		EAPOL_RSNA_KEY_DATA_MAXIMUM_RSN_IE_SIZE = 257ul,
+
+		EAPOL_RSNA_EAPOL_KEY_MAXIMUM_SIZE       = 0xffff,
+	};
+
+	//--------------------------------------------------
+protected:
+	//--------------------------------------------------
+
+	enum offsets_e
+	{
+		m_offset_eapol_version            = 0ul,
+		m_offset_eapol_type               = m_offset_eapol_version            + EAPOL_RSNA_KEY_EAPOL_VERSION_SIZE,
+		m_offset_eapol_packet_body_length = m_offset_eapol_type               + EAPOL_RSNA_KEY_EAPOL_TYPE_SIZE,
+		m_offset_key_descriptor_type      = m_offset_eapol_packet_body_length + EAPOL_RSNA_KEY_EAPOL_BODY_LENGTH_SIZE,
+		m_offset_key_information          = m_offset_key_descriptor_type      + EAPOL_RSNA_KEY_DESCRIPTOR_TYPE_SIZE,
+		m_offset_key_length               = m_offset_key_information          + EAPOL_RSNA_KEY_KEY_INFORMATION_SIZE,
+		m_offset_key_replay_counter       = m_offset_key_length               + EAPOL_RSNA_KEY_KEY_LENGTH_SIZE,
+		m_offset_key_NONCE                = m_offset_key_replay_counter       + EAPOL_RSNA_KEY_REPLY_COUNTER_SIZE,
+		m_offset_EAPOL_key_IV             = m_offset_key_NONCE                + EAPOL_RSNA_KEY_NONCE_SIZE,
+		m_offset_key_RSC                  = m_offset_EAPOL_key_IV             + EAPOL_RSNA_EAPOL_KEY_IV_SIZE,
+		m_offset_key_STA_MAC_address      = m_offset_key_RSC                  + EAPOL_RSNA_KEY_RSC_SIZE,
+		m_offset_key_reserved             = m_offset_key_STA_MAC_address      + EAPOL_RSNA_KEY_STA_MAC_ADDRESS_SIZE,
+		m_offset_key_MIC                  = m_offset_key_reserved             + EAPOL_RSNA_KEY_RESERVED_SIZE,
+		m_offset_key_data_length          = m_offset_key_MIC                  + EAPOL_RSNA_KEY_MIC_SIZE,
+		m_offset_key_data                 = m_offset_key_data_length          + EAPOL_RSNA_KEY_DATA_LENGTH_SIZE,
+	};
+
+	//--------------------------------------------------
+public:
+	//--------------------------------------------------
+
+	enum eapol_network_type_e
+	{
+		eapol_network_type_none,
+		eapol_network_type_RSN,
+		eapol_network_type_WPA,
+	};
+
+	enum eapol_RSNA_cipher_e
+	{
+		eapol_RSNA_cipher_none,
+		eapol_RSNA_cipher_CCMP,
+		eapol_RSNA_cipher_TKIP,
+		eapol_RSNA_cipher_WEP_40,
+		eapol_RSNA_cipher_WEP_104,
+		eapol_RSNA_cipher_SMS4,
+	};
+
+	enum eapol_RSNA_cipher_key_length_e
+	{
+		eapol_RSNA_cipher_key_length_none    = 0ul,
+		eapol_RSNA_cipher_key_length_CCMP    = 16ul,
+		eapol_RSNA_cipher_key_length_TKIP    = 32ul,
+		eapol_RSNA_cipher_key_length_WEP_40  = 5ul,
+		eapol_RSNA_cipher_key_length_WEP_104 = 13ul,
+	};
+
+	enum eapol_tkip_mic_failure_type_e
+	{
+		eapol_tkip_mic_failure_type_group_key,
+		eapol_tkip_mic_failure_type_pairwise_key,
+	};
+
+	enum eapol_RSNA_key_type_e
+	{
+		eapol_RSNA_key_type_none,
+		eapol_RSNA_key_type_EAPOL_Key_Confirmation_Key,
+		eapol_RSNA_key_type_EAPOL_Key_Encryption_Key,
+		eapol_RSNA_key_type_Pairwise_Transient_Key,
+		eapol_RSNA_key_type_RN,
+	};
+
+	//--------------------------------------------------
+
+	// 
+	EAP_FUNC_IMPORT virtual ~eapol_RSNA_key_header_c();
+
+	// 
+	EAP_FUNC_IMPORT eapol_RSNA_key_header_c(
+		abs_eap_am_tools_c * const tools,
+		const bool is_RSNA_when_true,
+		const bool is_WPXM_when_true,
+		void * const header_begin,
+		const u32_t header_buffer_length);
+
+	EAP_FUNC_IMPORT eapol_protocol_version_e get_eapol_protocol_version() const;
+
+	EAP_FUNC_IMPORT eapol_packet_type_e get_eapol_packet_type() const;
+
+	/// Function returns pcket body field of EAPOL packet. This field is two octets in length,
+	/// taken to represent an unsigned binary number. The value of this field defines the length
+	/// in octets of the Packet Body field. Value of 0 indicates that there is no Packet Body field present.
+	EAP_FUNC_IMPORT u16_t get_eapol_packet_body_length() const;
+
+	/// This function returns whole length of the EAPOL packet.
+	/// This includes EAPOL header and packet body.
+	EAP_FUNC_IMPORT u16_t get_eapol_packet_length() const;
+
+	EAP_FUNC_IMPORT eapol_key_descriptor_type_e get_key_descriptor_type() const;
+
+	/// Gets the Key Information field.
+	EAP_FUNC_IMPORT u16_t get_key_information() const;
+	
+	/**
+	 * This function returns the Key Descriptor Version bits of Key Information field.
+	 */
+	EAP_FUNC_IMPORT eapol_RSNA_key_header_c::key_descriptor_version_e get_key_information_key_descriptor_version() const;
+
+	/**
+	 * This function returns the Key Type bit of Key Information field.
+	 */
+	EAP_FUNC_IMPORT bool get_key_information_key_type() const;
+
+	/**
+	 * This function returns the Reserved A bits (higher ones) of Key Information field.
+	 * This is RSNA specific.
+	 */
+	EAP_FUNC_IMPORT u8_t get_key_information_reserved_a() const;
+
+	/**
+	 * This function returns the key index bits (higher ones) of Key Information field.
+	 * This is WPA specific.
+	 */
+	EAP_FUNC_IMPORT u8_t get_key_information_key_index() const;
+
+	/**
+	 * This function returns the Install bit of Key Information field.
+	 */
+	EAP_FUNC_IMPORT bool get_key_information_install() const;
+
+	/**
+	 * This function returns the Key Ack bit of Key Information field.
+	 */
+	EAP_FUNC_IMPORT bool get_key_information_key_ack() const;
+
+	/**
+	 * This function returns the Key MIC bit of Key Information field.
+	 */
+	EAP_FUNC_IMPORT bool get_key_information_key_MIC() const;
+
+	/**
+	 * This function returns the Secure bit of Key Information field.
+	 */
+	EAP_FUNC_IMPORT bool get_key_information_secure() const;
+
+	/**
+	 * This function returns the Error bit of Key Information field.
+	 */
+	EAP_FUNC_IMPORT bool get_key_information_error() const;
+
+	/**
+	 * This function returns the Request bit of Key Information field.
+	 */
+	EAP_FUNC_IMPORT bool get_key_information_request() const;
+
+	/**
+	 * This function returns the Encrypted Key Data bit of Key Information field.
+	 */
+	EAP_FUNC_IMPORT bool get_key_information_encrypted_key_data() const;
+
+
+	/**
+	 * This function returns the Reserved B bits (lower ones) of Key Information field.
+	 */
+	EAP_FUNC_IMPORT u8_t get_key_information_reserved_b() const;
+
+	/**
+	 * This function returns the Key Length field of the EAPOL-Key descriptor.
+	 */
+	EAP_FUNC_IMPORT u16_t get_key_length() const;
+	
+	/**
+	 * This function returns the Key Reply Counter field of the EAPOL-Key descriptor.
+	 */
+	EAP_FUNC_IMPORT u64_t get_key_replay_counter() const;
+	
+	EAP_FUNC_IMPORT u8_t * get_key_NONCE() const;
+	
+	EAP_FUNC_IMPORT u8_t * get_EAPOL_key_IV() const;
+
+	EAP_FUNC_IMPORT u8_t * get_key_RSC() const;
+	
+	EAP_FUNC_IMPORT u8_t * get_key_STA_MAC_address() const;
+	
+	EAP_FUNC_IMPORT u8_t * get_key_reserved() const;
+	
+	EAP_FUNC_IMPORT u8_t * get_key_MIC() const;
+	
+	/**
+	 * This function returns the Key Data Length field of the EAPOL-Key descriptor.
+	 */
+	EAP_FUNC_IMPORT u16_t get_key_data_length() const;
+
+	EAP_FUNC_IMPORT u8_t * get_key_data(const u32_t key_length) const;
+
+	EAP_FUNC_IMPORT u8_t * get_key_data_offset(const u32_t offset, const u32_t key_length) const;
+
+	EAP_FUNC_IMPORT static u16_t get_header_length();
+
+	EAP_FUNC_IMPORT eap_status_e set_eapol_protocol_version(const eapol_protocol_version_e version);
+
+	EAP_FUNC_IMPORT eap_status_e set_eapol_packet_type(const eapol_packet_type_e type);
+
+	EAP_FUNC_IMPORT eap_status_e set_eapol_packet_body_length(const u32_t eapol_length);
+
+	EAP_FUNC_IMPORT eap_status_e set_key_descriptor_type(const eapol_key_descriptor_type_e eapol_key_descriptor_type);
+
+	/**
+	 * This function sets the selected bits on.
+	 */
+	EAP_FUNC_IMPORT u16_t set_bits_on(
+		u16_t key_information,
+		const u16_t set_bits,
+		const u32_t mask,
+		const u32_t shift);
+
+	/**
+	 * This function sets the Key Descriptor Version bits of Key Information field.
+	 */
+	EAP_FUNC_IMPORT eap_status_e set_key_information_key_descriptor_version(const u8_t version);
+
+	/**
+	 * This function sets the Key Type bit of Key Information field.
+	 */
+	EAP_FUNC_IMPORT eap_status_e set_key_information_key_type(const bool key_type_bit_on_when_true);
+
+	/**
+	 * This function returns the key index bits (higher ones) of Key Information field.
+	 * This is WPA specific.
+	 */
+	EAP_FUNC_IMPORT eap_status_e set_key_information_key_index(const u8_t key_index);
+
+	/**
+	 * This function sets the Install bit of Key Information field.
+	 */
+	EAP_FUNC_IMPORT eap_status_e set_key_information_install(const bool install_bit_on_when_true);
+
+	/**
+	 * This function sets the Key Ack bit of Key Information field.
+	 */
+	EAP_FUNC_IMPORT eap_status_e set_key_information_key_ack(const bool key_ack_bit_on_when_true);
+
+	/**
+	 * This function sets the Key MIC bit of Key Information field.
+	 */
+	EAP_FUNC_IMPORT eap_status_e set_key_information_key_MIC(const bool key_MIC_bit_on_when_true);
+
+	/**
+	 * This function sets the Secure bit of Key Information field.
+	 */
+	EAP_FUNC_IMPORT eap_status_e set_key_information_secure(const bool secure_bit_on_when_true);
+
+	/**
+	 * This function sets the Error bit of Key Information field.
+	 */
+	EAP_FUNC_IMPORT eap_status_e set_key_information_error(const bool error_bit_on_when_true);
+
+	/**
+	 * This function sets the Request bit of Key Information field.
+	 */
+	EAP_FUNC_IMPORT eap_status_e set_key_information_request(const bool request_bit_is_on_when_true);
+
+	/**
+	 * This function sets the Encrypted Key Data bit of Key Information field.
+	 */
+	EAP_FUNC_IMPORT eap_status_e set_key_information_encrypted_key_data(const bool encrypted_key_data_bit_is_on_when_true);
+
+	/**
+	 * This function sets the Key Length field of the EAPOL-Key descriptor.
+	 */
+	EAP_FUNC_IMPORT eap_status_e set_key_length(const u16_t length);
+	
+	/**
+	 * This function sets the Key Reply Counter field of the EAPOL-Key descriptor.
+	 */
+	EAP_FUNC_IMPORT eap_status_e set_key_replay_counter(const u64_t reply_counter);
+
+	/**
+	 * This function sets the Key Data Length field of the EAPOL-Key descriptor.
+	 */
+	EAP_FUNC_IMPORT eap_status_e set_key_data_length(const u16_t key_data_length);
+
+	/**
+	 * This function zeroes the EAPOL header and EAPOL-Key descriptor header.
+	 */
+	EAP_FUNC_IMPORT eap_status_e zero_EAPOL_header_and_Key_descriptor(
+		abs_eap_am_tools_c * const tools
+		);
+
+	EAP_FUNC_IMPORT eap_status_e zero_key_MIC(
+		abs_eap_am_tools_c * const tools
+		);
+
+	EAP_FUNC_IMPORT eap_status_e zero_key_NONCE(
+		abs_eap_am_tools_c * const tools
+		);
+
+	EAP_FUNC_IMPORT eap_status_e zero_EAPOL_key_IV(
+		abs_eap_am_tools_c * const tools
+		);
+
+	EAP_FUNC_IMPORT eap_status_e zero_key_RSC(
+		abs_eap_am_tools_c * const tools
+		);
+
+	EAP_FUNC_IMPORT eap_status_e zero_key_STA_MAC_address(
+		abs_eap_am_tools_c * const tools
+		);
+
+	EAP_FUNC_IMPORT eap_status_e zero_key_reserved(
+		abs_eap_am_tools_c * const tools
+		);
+
+	EAP_FUNC_IMPORT eap_status_e check_header() const;
+	
+	EAP_FUNC_IMPORT eap_status_e reset_header(
+		const u8_t key_index,
+		const eapol_key_authentication_type_e authentication_type,
+		const eapol_RSNA_cipher_e eapol_pairwise_cipher,
+		const u64_t key_reply_counter,
+		const bool key_type_bit_on_when_true,
+		const bool install_bit_on_when_true,
+		const bool key_ack_bit_on_when_true,
+		const bool key_MIC_bit_on_when_true,
+		const bool secure_bit_on_when_true,
+		const bool error_bit_on_when_true,
+		const bool requst_bit_on_when_true,
+		const bool STAKey_bit_on_when_true,
+		const bool encrypted_key_data_bit_on_when_true,
+		const eapol_protocol_version_e received_eapol_version,
+		const eapol_key_descriptor_type_e received_key_descriptor_type);
+	
+	// 
+	//--------------------------------------------------
+}; // class eapol_RC4_key_header_c
+
+
+#endif //#if !defined(_EAPOL_KEY_H_)
+
+//------------------------------------------------------
+
+
+
+// End.