--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vpnengine/ikeutils/inc/ikemsgheader.h Thu Dec 17 09:14:51 2009 +0200
@@ -0,0 +1,165 @@
+/*
+* Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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: IKE message header class
+*
+*/
+
+#ifndef _IKE_MSG_HEADER_H_
+#define _IKE_MSG_HEADER_H_
+
+#include <e32base.h>
+
+#define ISAKMP_COOKIE_SIZE 8
+#define IKEV2_SPI_SIZE 8
+typedef TBuf8<ISAKMP_COOKIE_SIZE> TCookie;
+typedef TBuf8<IKEV2_SPI_SIZE> TIkeSPI;
+
+#define ISAKMP_HDR_SIZE sizeof(ThdrISAKMP)
+#define IKEV2_HDR_SIZE sizeof(ThdrISAKMP)
+
+#define IKE_PORT 500
+#define FLOATED_IKE_PORT 4500
+#define NON_ESP_MARKER 0x0
+#define NON_ESP_MARKER_SIZE 4 // Corresponds IPSEC SPI size
+
+//
+// NAT flags
+//
+#define LOCAL_END_NAT 0x1
+#define REMOTE_END_NAT 0x2
+#define MOBIKE_USED 0x4
+
+//
+// These macro definitions takes care of 16- and 32-bit data packing and
+// unpacking.
+// The following assumptions are in use for macros:
+// -- The connection memory is a little-endian configured (= Intel format)
+// -- A macro does always an unconditional conversion for the parameter data
+// PUTxx(d, s) = Source data is supposed to be in "Network order". Data
+// is stored to *p as little-endian.
+// GETxx(s) = Source data is supposed to be in memory as little-endian.
+// Macro return data in "Network order"
+//
+#define PUT16(d, s) \
+ (*(unsigned char*)((unsigned char*)(d)+1)) = (unsigned char)((s) & 0xff);\
+ (*(unsigned char*)(d)) = (unsigned char)(((s) >> 8 ) & 0xff)
+
+#define PUT32(d, s) \
+ (*(unsigned char*)((unsigned char*)(d)+3)) = (unsigned char)((s) & 0xff);\
+ (*(unsigned char*)((unsigned char*)(d)+2)) = (unsigned char)(((s) >> 8 ) & 0xff);\
+ (*(unsigned char*)((unsigned char*)(d)+1)) = (unsigned char)(((s) >> 16) & 0xff);\
+ (*(unsigned char*)(d)) = (unsigned char)(((s) >> 24) & 0xff)
+
+#define GET16(s) \
+ (((unsigned short)(*((unsigned char*)(s)+1))) | \
+ ((unsigned short)(*(unsigned char*)(s)) << 8 ))
+
+#define GET32(s) \
+ (((unsigned int)(*((unsigned char*)(s)+3))) | \
+ (((unsigned int)(*((unsigned char*)(s)+2))) << 8 ) | \
+ (((unsigned int)(*((unsigned char*)(s)+1))) << 16 ) | \
+ ((unsigned int)(*(unsigned char*)(s)) << 24 ))
+
+
+//
+// IKEv2 MESSAGE FIXED HEADER
+// 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
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// ! IKE_SA Initiator's SPI !
+// ! !
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// ! IKE_SA Responder's SPI !
+// ! !
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// ! Next Payload ! MjVer ! MnVer ! Exchange Type ! Flags !
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// ! Message ID !
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// ! Length !
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//
+// IKEv1 MESSAGE FIXED HEADER
+//
+// 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
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// ! Initiator !
+// ! Cookie !
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// ! Responder !
+// ! Cookie !
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// ! Next Payload ! MjVer ! MnVer ! Exchange Type ! Flags !
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// ! Message ID !
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// ! Length !
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//
+class ThdrISAKMP
+{
+public:
+ static inline const ThdrISAKMP* Ptr(const TDes8& aMsg, TInt aOffset) { return (ThdrISAKMP*)(aMsg.Ptr() + aOffset); }
+ static inline const ThdrISAKMP* Ptr(const TDes8& aMsg) { return (ThdrISAKMP*)aMsg.Ptr(); }
+ static inline TInt Size() { return sizeof(ThdrISAKMP); }
+ inline const ThdrISAKMP* GotoOffset(TUint8 aOffset) const { return (const ThdrISAKMP*)((char*)this + aOffset); }
+ inline TUint8* Next() const { return (TUint8*)((char*)this + sizeof(ThdrISAKMP)); }
+ inline TCookie GetCookieI() const
+ { TCookie c;
+ c.Copy(&u.iData8[0],ISAKMP_COOKIE_SIZE);
+ return c;
+ }
+ inline void GetSPI_I(TIkeSPI& aSPI) const { aSPI.Copy(&u.iData8[0], IKEV2_SPI_SIZE); }
+ inline TUint32 GetSPI_I_Low32() const { return GET32(&u.iData32[1]); }
+ inline TUint32 GetNegotiationID_I() const { return GET32(&u.iData32[0]); }
+ inline TCookie GetCookieR() const
+ { TCookie c;
+ c.Copy(&u.iData8[8],ISAKMP_COOKIE_SIZE);
+ return c;
+ }
+ inline void GetSPI_R(TIkeSPI& aSPI) const { aSPI.Copy(&u.iData8[8], IKEV2_SPI_SIZE); }
+ inline TUint32 GetSPI_R_Low32() const { return GET32(&u.iData32[3]); }
+ inline TUint32 GetNegotiationID_R() const { return GET32(&u.iData32[2]); }
+ inline void SetCookieI(const TCookie& aCookie)
+ { Mem::Copy(&u.iData8[0], aCookie.Ptr(), ISAKMP_COOKIE_SIZE); }
+ inline void SetSPI_I(const TIkeSPI& aSPI) {Mem::Copy(&u.iData8[0],aSPI.Ptr(),IKEV2_SPI_SIZE); }
+ inline void SetCookieR(const TCookie& aCookie)
+ { Mem::Copy(&u.iData8[8],aCookie.Ptr(),ISAKMP_COOKIE_SIZE); }
+ inline void SetSPI_R(const TIkeSPI& aSPI) { Mem::Copy(&u.iData8[8],aSPI.Ptr(),IKEV2_SPI_SIZE); }
+ inline TUint8 GetPayload() const { return u.iData8[16]; }
+ inline void SetPayload(TUint8 aPayload) { u.iData8[16] = aPayload; }
+ inline TUint8 GetVersion() const { return u.iData8[17]; }
+ inline TUint8 GetMajorVersion() const { return (TUint8)(u.iData8[17] >> 4); }
+ inline TUint8 GetMinorVersion() const { return (TUint8)(u.iData8[17] & 0xf); }
+ inline void SetVersion(TUint8 aVersion) { u.iData8[17] = aVersion; }
+ inline TUint8 GetExchange() const { return u.iData8[18]; }
+ inline void SetExchange(TUint8 aType) { u.iData8[18] = aType; }
+ inline TUint8 GetFlags() const { return u.iData8[19]; }
+ inline void SetFlags(TUint8 aFlags) { u.iData8[19] = aFlags; }
+ inline TUint32 GetMessageId() const { return GET32(&u.iData32[5]); }
+ inline void SetMessageId(TUint32 aId) { PUT32(&u.iData32[5], aId); }
+ inline TUint32 GetLength() const { return GET32(&u.iData32[6]); }
+ inline void SetLength(TUint32 aLength) { PUT32(&u.iData32[6], aLength); }
+private:
+ union
+ {
+ TUint32 iData32[7];
+ TUint16 iData16[14];
+ TUint8 iData8[28];
+ } u;
+};
+
+
+#endif