eapol/eapol_framework/eapol_common/include/isakmp_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/isakmp_header.h	Thu Dec 17 08:47:43 2009 +0200
@@ -0,0 +1,442 @@
+/*
+* 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(_ISAKMP_HEADER_H_)
+#define _ISAKMP_HEADER_H_
+
+#include "eap_am_memory.h"
+#include "sae_cookie.h"
+
+
+enum isakmp_version_value_e
+{
+	isakmp_version_none = 0,
+	isakmp_version_current = ((1 << 4) | (0)),
+};
+
+enum isakmp_exchange_type_value_e
+{
+	isakmp_exchange_type = 240, // This is in private area.
+};
+
+enum isakmp_payload_type_e
+{
+	isakmp_payload_NONE                =   0,
+	isakmp_payload_sa                  =   1,
+	isakmp_payload_proposal            =   2,
+	isakmp_payload_transform           =   3,
+	isakmp_payload_key_exchange        =   4,
+	isakmp_payload_identification      =   5,
+	isakmp_payload_certificate         =   6,
+	isakmp_payload_certificate_request =   7,
+	isakmp_payload_mac                 =   8,
+	isakmp_payload_signature           =   9,
+	isakmp_payload_nonce               =  10,
+	isakmp_payload_notification        =  11,
+	isakmp_payload_delete              =  12,
+	isakmp_payload_vendor_id           =  13,
+	isakmp_payload_EAP                 = 103, // Found from draft-ietf-ipsra-pic-01.txt.
+	isakmp_payload_legacy_mac          = 128, // NOTE this is in private area.
+};
+
+
+enum isakmp_attribute_type_e
+{
+	isakmp_attribute_Encryption_Algorithm               =  1, // B
+	isakmp_attribute_Hash_Algorithm                     =  2, // B
+	isakmp_attribute_Authentication_Method              =  3, // B
+	isakmp_attribute_Group_Description                  =  4, // B
+	isakmp_attribute_Group_Type                         =  5, // B
+	isakmp_attribute_Group_Prime_Irreducible_Polynomial =  6, // V
+	isakmp_attribute_Group_Generator_One                =  7, // V
+	isakmp_attribute_Group_Generator_Two                =  8, // V
+	isakmp_attribute_Group_Curve_A                      =  9, // V
+	isakmp_attribute_Group_Curve_B                      = 10, // V
+	isakmp_attribute_Life_Type                          = 11, // B
+	isakmp_attribute_Life_Duration                      = 12, // V
+	isakmp_attribute_PRF                                = 13, // B
+	isakmp_attribute_Key_Length                         = 14, // B
+	isakmp_attribute_Field_Size                         = 15, // B
+	isakmp_attribute_Group_Order                        = 16, // V
+};
+
+const u32_t ISAKMP_COOKIE_LENGTH = 8u;
+
+
+// 
+class isakmp_generic_payload_header_c
+{
+private:
+	//--------------------------------------------------
+
+	u8_t m_next_payload;
+	u8_t m_reserved;
+	u16_t m_length;
+	// m_length-sizeof(isakmp_generic_payload_header_c) data octets follows isakmp_generic_payload_header_c.
+
+	//--------------------------------------------------
+protected:
+	//--------------------------------------------------
+
+	//--------------------------------------------------
+public:
+	//--------------------------------------------------
+
+	// 
+	~isakmp_generic_payload_header_c()
+	{
+	}
+
+	// 
+	isakmp_generic_payload_header_c()
+	{
+	}
+
+	const isakmp_payload_type_e get_next_payload() const
+	{
+		return (isakmp_payload_type_e)m_next_payload;
+	}
+
+	const u8_t get_reserved() const
+	{
+		return m_reserved;
+	}
+
+	u16_t get_data_length() const
+	{
+		if (eap_ntohs(m_length) > static_cast<u16_t>(sizeof(isakmp_generic_payload_header_c))
+			return eap_ntohs(m_length)-(u16_t)sizeof(isakmp_generic_payload_header_c);
+		else
+			return 0;
+	}
+
+	u16_t get_header_length() const
+	{
+		return sizeof(isakmp_generic_payload_header_c);
+	}
+
+	u8_t * get_data(abs_eap_am_tools_c * const m_am_tools, const u32_t contignuous_bytes) const
+	{
+		if (get_data_length() >= contignuous_bytes
+			&& contignuous_bytes > 0)
+		{
+			return reinterpret_cast<u8_t *>(this+1); // Data begins after the header.
+		}
+		else
+		{
+			EAP_ASSERT_ALWAYS(get_data_length() > 0u);
+		}
+		return 0;
+	}
+
+	isakmp_generic_payload_header_c * const get_next_header() const
+	{
+		return reinterpret_cast<isakmp_generic_payload_header_c *>((reinterpret_cast<u8_t *>(this+1))+get_data_length());
+	}
+
+	void set_next_payload(abs_eap_am_tools_c * const m_am_tools, const isakmp_payload_type_e p_next_payload)
+	{
+		EAP_ASSERT_ALWAYS(p_next_payload == (isakmp_payload_type_e)((u8_t)p_next_payload));
+		m_next_payload = static_cast<u8_t>(p_next_payload;
+	}
+
+	void set_reserved(const u8_t p_reserved)
+	{
+		m_reserved = p_reserved;
+	}
+
+	void set_data_length(const u16_t p_data_length)
+	{
+		m_length = eap_htons(p_data_length+sizeof(isakmp_generic_payload_header_c));
+	}
+
+	void reset_header(abs_eap_am_tools_c * const m_am_tools, const u16_t buffer_length)
+	{
+		set_next_payload(m_am_tools, isakmp_payload_NONE);
+		set_reserved(0u);
+		set_data_length(buffer_length);
+	}
+
+	// 
+	//--------------------------------------------------
+}; // class isakmp_generic_payload_header_c
+
+
+
+// 
+class isakmp_attribute_header_c
+{
+private:
+	//--------------------------------------------------
+
+	u16_t m_type;
+	u16_t m_value_or_length;
+
+	//--------------------------------------------------
+protected:
+	//--------------------------------------------------
+
+	//--------------------------------------------------
+public:
+	//--------------------------------------------------
+
+	// 
+	~isakmp_attribute_header_c()
+	{
+	}
+
+	// 
+	isakmp_attribute_header_c()
+	{
+	}
+
+	const isakmp_attribute_type_e get_type() const
+	{
+		return (isakmp_attribute_type_e)(m_type && 0x7FFF);
+	}
+
+	const u16_t get_value() const
+	{
+		return m_value_or_length;
+	}
+
+
+	bool is_type_fixed() const
+	{
+		if ((m_type & 0x8000) != 0)
+		{
+			return true;
+		}
+		return false;
+	}
+
+	void set_type_fixed(const isakmp_attribute_type_e p_type)
+	{
+		m_type = p_type | 0x8000;
+	}
+
+	void set_type_variable(const isakmp_attribute_type_e p_type)
+	{
+		m_type = p_type | 0x0000;
+	}
+
+	void set_value_or_length(const u16_t p_value)
+	{
+		m_value_or_length = p_value;
+	}
+
+	// 
+	//--------------------------------------------------
+}; // class isakmp_attribute_header_c
+
+
+const u8_t isakmp_flag_server = (1 << 3);
+const u8_t isakmp_mask_server = (~(1 << 3));
+
+
+// 
+class isakmp_header_c
+{
+private:
+	//--------------------------------------------------
+
+	sae_cookie_c m_source_cookie; // m_initiator.
+	sae_cookie_c m_destination_cookie; // m_responder.
+	u8_t m_next_payload;
+	u8_t m_version;
+	u8_t m_exchange_type;
+	u8_t m_flags;
+	u32_t m_sequence_number; //m_message_id.
+	u32_t m_length;
+	// m_length-sizeof(isakmp_header_c) data octets follows isakmp_header_c.
+
+	//--------------------------------------------------
+protected:
+	//--------------------------------------------------
+
+	//--------------------------------------------------
+public:
+	//--------------------------------------------------
+
+	// 
+	~isakmp_header_c()
+	{
+	}
+
+	// 
+	isakmp_header_c()
+	{
+	}
+
+	const isakmp_payload_type_e get_next_payload() const
+	{
+		return (isakmp_payload_type_e)m_next_payload;
+	}
+
+	const isakmp_version_value_e get_version() const
+	{
+		return (const isakmp_version_value_e)m_version;
+	}
+
+	const u8_t get_exchange_type() const
+	{
+		return m_exchange_type;
+	}
+
+	const u8_t get_flags() const
+	{
+		return m_flags;
+	}
+
+	const u32_t get_sequence_number()
+	{
+		return eap_ntohl(m_sequence_number);
+	}
+
+	u32_t get_data_length() const
+	{
+		if (eap_ntohl(m_length) > (u32_t)sizeof(isakmp_header_c))
+			return eap_ntohl(m_length)-(u32_t)sizeof(isakmp_header_c);
+		else
+			return 0;
+	}
+
+	u32_t get_header_length() const
+	{
+		return sizeof(isakmp_header_c);
+	}
+
+	sae_cookie_c *get_source_cookie()
+	{
+		return &m_source_cookie;
+	}
+
+	sae_cookie_c *get_destination_cookie()
+	{
+		return &m_destination_cookie;
+	}
+
+	u8_t * get_data_offset(abs_eap_am_tools_c * const m_am_tools, const u32_t offset, const u32_t contignuous_bytes) const
+	{
+		u32_t data_length = get_data_length();
+		if (data_length >= offset+contignuous_bytes
+			&& contignuous_bytes > 0u)
+		{
+			return ((reinterpret_cast<u8_t *>(this+1))+offset); // Data begins after the header.
+		}
+		else
+		{
+			EAP_ASSERT_ALWAYS(get_data_length() > 0u);
+		}
+		return 0;
+	}
+
+
+	u8_t * get_data(abs_eap_am_tools_c * const m_am_tools, const u32_t contignuous_bytes) const
+	{
+		return get_data_offset(m_am_tools, 0u, contignuous_bytes);
+	}
+
+
+	void set_next_payload(const isakmp_payload_type_e p_next_payload)
+	{
+		m_next_payload = static_cast<u8_t>(p_next_payload;
+	}
+
+	void set_version(const isakmp_version_value_e p_version)
+	{
+		m_version = static_cast<u8_t>(p_version;
+	}
+
+	void set_exchange_type(const u8_t p_exchange_type)
+	{
+		m_exchange_type = p_exchange_type;
+	}
+
+	void set_flags(const u8_t p_flags)
+	{
+		m_flags = p_flags;
+	}
+
+	void set_sequence_number(const u32_t sequence_number)
+	{
+		m_sequence_number = eap_htonl(sequence_number);
+	}
+
+	void set_data_length(const u32_t p_data_length)
+	{
+		m_length = eap_htonl(p_data_length+sizeof(isakmp_header_c));
+	}
+
+	void reset_header(const u32_t buffer_length,
+		const bool is_client_when_true)
+	{
+		set_next_payload(isakmp_payload_NONE);
+		set_version(isakmp_version_current);
+		set_exchange_type(isakmp_exchange_type);
+		if (is_client_when_true == true)
+		{
+			set_flags(0u);
+		}
+		else
+		{
+			set_flags(isakmp_flag_server);
+		}
+		set_sequence_number(0u);
+		set_data_length(buffer_length-sizeof(isakmp_header_c));
+		get_source_cookie()->reset_cookie();
+		get_destination_cookie()->reset_cookie();
+	}
+
+	eap_status_e check_header(const bool is_client_when_true)
+	{
+		if (get_version() != isakmp_version_current)
+		{
+			return eap_status_wrong_isakmp_header_version;
+		}
+		else if (get_exchange_type() != isakmp_exchange_type)
+		{
+			return eap_status_wrong_isakmp_exchange_type;
+		}
+		else if (is_client_when_true == false
+			&& get_flags() != 0u)
+		{
+			return eap_status_wrong_isakmp_flags;
+		}
+		else if (is_client_when_true == true
+			&& get_flags() != isakmp_flag_server)
+		{
+			return eap_status_wrong_isakmp_flags;
+		}
+		return eap_status_ok;
+	}
+
+	// 
+	//--------------------------------------------------
+}; // class isakmp_header_c
+
+
+#endif //#if !defined(_ISAKMP_HEADER_H_)
+
+//--------------------------------------------------
+
+
+
+// End.