vpnengine/ikev1lib/inc/ikev1payloads.h
changeset 0 33413c0669b9
equal deleted inserted replaced
-1:000000000000 0:33413c0669b9
       
     1 /*
       
     2 * Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: IKEv1 payload handling.
       
    15 *
       
    16 */
       
    17 
       
    18 #ifndef IKEV1PAYLOADS_H
       
    19 #define IKEV1PAYLOADS_H
       
    20 
       
    21 #include <e32math.h>
       
    22 #include "ikemsgheader.h"
       
    23 #include "ikev1isakmpct.h"
       
    24 
       
    25 //
       
    26 // GENERIC PAYLOAD HEADER
       
    27 //
       
    28 class TPayloadISAKMP
       
    29     {
       
    30 public:
       
    31     TPayloadISAKMP() {u.iData32[0] = 0; }
       
    32     inline TUint8 GetPayload() const;
       
    33     inline void SetPayload(TUint8 aPayload);
       
    34     inline TUint16 GetLength() const;
       
    35     inline void SetLength(TUint16 aLength);
       
    36     inline TUint8 GetReserved() const;
       
    37     inline void SetReserved(TUint8 aVal);
       
    38     inline const TUint8 *SpecificData() const   
       
    39         { return (TUint8 *)((char *)this + sizeof(*this)); } //returns a * to the specific data of this payload
       
    40     inline const TUint SpecificDataLen() const  
       
    41         { return (GetLength() - sizeof(*this)); } //returns a * to the specific data of this payload
       
    42     inline const TPayloadISAKMP *Next() const
       
    43         { return (TPayloadISAKMP *)((char *)this + GetLength()); } 
       
    44 
       
    45 private:
       
    46     union
       
    47         {
       
    48         TUint32 iData32[1];
       
    49         TUint16 iData16[2];
       
    50         TUint8  iData8[4];
       
    51         } u;
       
    52     };
       
    53 inline TUint8 TPayloadISAKMP::GetPayload() const { return u.iData8[0]; }
       
    54 inline void TPayloadISAKMP::SetPayload(TUint8 aPayload) { u.iData8[0] = aPayload; }
       
    55 inline TUint16 TPayloadISAKMP::GetLength() const { return (TUint16)GET16(&u.iData8[2]); }
       
    56 inline void TPayloadISAKMP::SetLength(TUint16 aLength) { PUT16(&u.iData8[2], aLength); }
       
    57 inline TUint8 TPayloadISAKMP::GetReserved() const { return u.iData8[1]; }
       
    58 inline void TPayloadISAKMP::SetReserved(TUint8 aVal) { u.iData8[1] = aVal; }
       
    59 
       
    60 //
       
    61 // SA PAYLOAD
       
    62 //
       
    63 
       
    64 
       
    65 class TProposalISAKMP;
       
    66 
       
    67 //Plus Variable field (Labeled Domain Identifier) from IPSEC DOI (included in length if present)
       
    68 //use TSAPayloadISAKMP to decodify its values;
       
    69 
       
    70 class TSAPayloadISAKMP
       
    71 {
       
    72 	public: 
       
    73 		inline TSAPayloadISAKMP() {iReserved=0;}
       
    74 
       
    75 	public:
       
    76 		inline TUint16 GetLength() const { return (TUint16)GET16(&iLength); }
       
    77 		inline void SetLength(TUint16 aLength) { PUT16(iLength, aLength); }
       
    78 		inline TUint16 GetReserved() const { return iReserved; }    //No need to swap because always 0
       
    79 		inline const TSAPayloadISAKMP *Next() const //next payload
       
    80 				{ return (TSAPayloadISAKMP *)((TUint8 *)this + GetLength()); } 
       
    81 		inline const TUint32 *Data() const
       
    82 				{ return (TUint32 *)(this + sizeof(*this)); } //returns the address of the data field
       
    83 
       
    84 	private:
       
    85 		TUint16 iLength;
       
    86 		TUint16 iReserved;
       
    87 };
       
    88 //followed by a variable size field of the length indicated
       
    89 
       
    90 class TSAISAKMP : public TPayloadISAKMP
       
    91 {
       
    92 public:
       
    93     inline TUint32 Size() const { return sizeof(TSAISAKMP); }   //sizeof OK because aligned
       
    94     inline TUint32 GetDOI() const { return GET32(&iDOI); }
       
    95     inline void SetDOI(TUint32 aDOI) { PUT32(&iDOI, aDOI); }
       
    96     inline TUint32 GetSIT() const { return GET32(&iSIT); }
       
    97     inline void SetSIT(TUint32 aSIT) { PUT32(&iSIT, aSIT); }
       
    98     inline TUint GetSITLength() const
       
    99 	{
       
   100 		if ( GetDOI() == IPSEC_DOI)    //IPSEC DOI has SPI of size 4 octets
       
   101 			return 4;
       
   102 		return 0;
       
   103 	}
       
   104     inline TBool HasLDId() const
       
   105 	{
       
   106 		TUint32 sit=(IPSEC_SIT_SECRECY | IPSEC_SIT_INTEGRITY);
       
   107 		if ((GetDOI()==IPSEC_DOI) && (GetSIT() & sit))
       
   108 			return ETrue;   //DOI and (SECRECY or INTEGRITY) supported
       
   109 
       
   110 		return EFalse;
       
   111 	}
       
   112     static inline TSAISAKMP *Ptr(const TPayloadISAKMP *aPayload)
       
   113         { return (TSAISAKMP *)aPayload; }
       
   114     inline TUint32 *Data() const
       
   115         { return (TUint32 *)(this + sizeof(*this)); } //returns the address of the data field following the header
       
   116     TPayloadISAKMP* Payload() const
       
   117 	{
       
   118 		TUint size= sizeof(*this);  //fixed size
       
   119 		if (!HasLDId())
       
   120 			return (TPayloadISAKMP *) ((TUint8*)this + size);
       
   121 		size += 4;  //Labeled Domain Identifier payload size
       
   122 		TUint32 *d=Data();
       
   123 		TSAPayloadISAKMP *p = (TSAPayloadISAKMP *)++d;
       
   124 		TInt32 res;
       
   125 
       
   126 		for (TInt i=0; i < 4; i++)
       
   127 		{
       
   128 			if (i % 2==0)   //Fields 1 and 3 in bytes
       
   129 				Math::Int(res, p->GetLength() / 4);
       
   130 			else    //Fields 2, 4 in bits
       
   131 				Math::Int(res, p->GetLength() / 32);
       
   132 
       
   133 			size += res+1;
       
   134 		}
       
   135 
       
   136 		return (TPayloadISAKMP *) ((TUint8 *)this + size);
       
   137 	}
       
   138 
       
   139     TUint32 iDOI;
       
   140     TUint32 iSIT;
       
   141 };
       
   142 
       
   143 class TTransformISAKMP;
       
   144 class TProposalISAKMP : public TPayloadISAKMP
       
   145     {
       
   146 public:
       
   147     inline TUint32 Size() const { return sizeof(TProposalISAKMP); }//sizeof OK because aligned
       
   148     inline TUint8 GetNum() const { return iNum; };
       
   149     inline void SetNum(TUint8 aPayload) { iNum = aPayload; };
       
   150     inline TUint8 GetProtocol() const { return iProtocol; };
       
   151     inline void SetProtocol(TUint8 aPayload) { iProtocol = aPayload; };
       
   152     inline TUint8 GetSPISize() const { return iSPISize; };
       
   153     inline void SetSPISize(TUint8 aPayload) { iSPISize = aPayload; };
       
   154     inline TUint8 GetNumTrans() const { return iNumTrans; };
       
   155     inline void SetNumTrans(TUint8 aPayload) { iNumTrans = aPayload; };
       
   156     //inline TUint32 GetSPI() const { return iSPI; };
       
   157     //inline void SetSPI(TUint32 aSPI) { iSPI = aSPI; };
       
   158     static inline TProposalISAKMP *Ptr(const TPayloadISAKMP *aPayload)
       
   159         { return (TProposalISAKMP *)aPayload; }
       
   160     inline const TPayloadISAKMP* Payload() const    //next payload (transform)
       
   161         { return (TPayloadISAKMP*)((TUint8*)this + sizeof(*this) + GetSPISize()); } 
       
   162     inline const TUint8 *SPI() {return (const TUint8 *)((TUint8*)this + sizeof(*this));} //* to the SPI
       
   163     //void String(TDes &aStr) const;
       
   164 
       
   165 //private:
       
   166     TUint8 iNum;        //Proposal Number
       
   167     TUint8 iProtocol;   //Protocol ID for the current negotiation PROTO_ISAKMP, PROTO_IPSEC_AH, PROTO_IPSEC_ESP, ...
       
   168     TUint8 iSPISize;    //size in octets. For ISAKMP should be from 0 to 16. If >0 SPI ignored
       
   169     TUint8 iNumTrans;   //Num of transformations
       
   170     //TUint32 iSPI;     //Variable size (depends on protocol). No Padding.
       
   171     };
       
   172 
       
   173 
       
   174 class TDataISAKMP;
       
   175 class TTransformISAKMP : public TPayloadISAKMP
       
   176     {
       
   177 public:
       
   178     inline TTransformISAKMP() {iReserved=0;}
       
   179 public:
       
   180     inline TUint32 Size() const { return sizeof(TTransformISAKMP); }    //sizeof OK because aligned
       
   181     inline TUint8 GetNum() const { return iNum; };
       
   182     inline void SetNum(TUint8 aPayload) { iNum = aPayload; };
       
   183     inline TUint8 GetID() const { return iID; };
       
   184     inline void SetID(TUint8 aPayload) { iID = aPayload; };
       
   185     inline TUint16 GetReserved() const { return (TUint16)GET16(&iReserved); };
       
   186     static inline TTransformISAKMP *Ptr(const TPayloadISAKMP *aPayload)
       
   187         { return (TTransformISAKMP *)aPayload; }
       
   188     inline TDataISAKMP *SAAttrib() const {return (TDataISAKMP *)((TUint8*)this + sizeof(*this)); } //* to SA attributes
       
   189     //void String(TDes &aStr) const;
       
   190 
       
   191 //private:
       
   192     //TPayloadISAKMP iHdr;  //Generic part
       
   193     TUint8 iNum;        //Transform Number
       
   194     TUint8 iID;         //Transform ID for the current negotiation AH, ESP, OSPF, TLS, ...
       
   195     TUint16 iReserved;  //always set to 0
       
   196 };
       
   197 
       
   198 
       
   199 
       
   200 class TKeyISAKMP : public TPayloadISAKMP
       
   201 {
       
   202 public:
       
   203     static inline TKeyISAKMP *Ptr(const TPayloadISAKMP *aPayload)
       
   204         { return (TKeyISAKMP *)aPayload; }
       
   205     //void String(TDes &aStr) const;
       
   206     inline TUint8 *KeyData() const {return ((TUint8*)this + sizeof(*this)); } //* to keyData
       
   207 
       
   208 };
       
   209 
       
   210 
       
   211 //would require a few modifications for DOI != IPSECDOI
       
   212 class TIdentISAKMP : public TPayloadISAKMP
       
   213 {
       
   214 public:
       
   215     inline TUint8 GetIDType() const { return iIDType; }
       
   216     inline void SetIDType(TUint8 aIDType) { iIDType=aIDType; }
       
   217     //IPSEC DOI Specific routines
       
   218     inline TUint8 GetProtocol() const { return iProtocolID; }
       
   219     inline void SetProtocol(TUint8 aProtocolID) { iProtocolID = aProtocolID; };
       
   220     inline TUint16 GetPort() const { return (TUint16)GET16(&iPort); }
       
   221     inline void SetPort(TUint16 aPort) { PUT16(&iPort, aPort); }
       
   222     //
       
   223     static inline TIdentISAKMP *Ptr(const TPayloadISAKMP *aPayload)
       
   224         { return (TIdentISAKMP *)aPayload; }
       
   225     //TBool String(TDes &aStr,TUint aLength) const;
       
   226     inline TUint8 *IDData() const {return ((TUint8*)this + sizeof(*this)); } //* to identity data
       
   227     inline TUint16 IDDataLen() const {return (TUint16)(GetLength() - sizeof(*this)); } //Length of the payload data
       
   228 public:
       
   229     TUint8 iIDType;
       
   230     //IPSEC DOI Specific fields
       
   231     TUint8 iProtocolID;
       
   232     TUint16 iPort;
       
   233 
       
   234 };
       
   235 
       
   236 
       
   237 
       
   238 //Used for certificate 
       
   239 //WARNING:Do not use sizeof this class, better Size because size of returns aligned size and not the real.
       
   240 class TCertificateISAKMP: public TPayloadISAKMP
       
   241 {
       
   242 public:
       
   243     inline TUint8 GetEncoding() const { return iEncoding; }
       
   244     inline void SetEncoding(TUint8 aEncoding) { iEncoding = aEncoding; }
       
   245     static inline TUint16 Size() {return (sizeof(TPayloadISAKMP) + sizeof(TUint8));}    //TUint8 is iEncoding
       
   246     inline TUint16 CertDataLen() const {return (TUint16)(GetLength()-Size()); } //* to certificate data
       
   247     inline TUint8 *CertData() const {return ((TUint8*)this + Size()); } 
       
   248     //+1 for iEncoding.Cannot use sizeof(*this) because is not aligned and returns 8 instead of 5
       
   249 
       
   250     static inline TCertificateISAKMP *Ptr(const TPayloadISAKMP *aPayload)
       
   251         { return (TCertificateISAKMP *)aPayload; }
       
   252 	
       
   253     TUint8 iEncoding;       // Certificate Encoding
       
   254 
       
   255 };
       
   256 
       
   257 
       
   258                   
       
   259 //Used for certificate Request payloads
       
   260 class TCertificateReqISAKMP : public TPayloadISAKMP
       
   261 {
       
   262 public:
       
   263     inline TUint8 GetEncoding() const { return iEncoding; }
       
   264     inline void SetEncoding(TUint8 aEncoding) { iEncoding= aEncoding; }
       
   265     static inline TUint16 Size() {return (sizeof(TPayloadISAKMP) + sizeof(TUint8));}    //TUint8 is iEncoding
       
   266     static inline TCertificateReqISAKMP *Ptr(const TPayloadISAKMP *aPayload)
       
   267         { return (TCertificateReqISAKMP *)aPayload; }
       
   268     inline TUint16 CertReqDataLen() const {return (TUint16)(GetLength() - Size()); } //* to certificate data
       
   269     inline TUint8 *CertReqData() const {return ((TUint8*)this + Size()); }
       
   270 	
       
   271     TUint8 iEncoding;       // Certificate Encoding
       
   272 
       
   273 };
       
   274 
       
   275 class THashISAKMP : public TPayloadISAKMP
       
   276 {
       
   277 public:
       
   278     static inline THashISAKMP *Ptr(const TPayloadISAKMP *aPayload)
       
   279         { return (THashISAKMP *)aPayload; }
       
   280     inline TUint8 *Data() const {return ((TUint8*)this + sizeof(*this)); } //pointer to hash data
       
   281     inline TUint16 DataLen() const {return (TUint16)(GetLength() - sizeof(*this)); } //pointer to hash data
       
   282     //TBool String(TDes &aStr,TUint aLength) const;
       
   283 };
       
   284 
       
   285 
       
   286 class TSignatureISAKMP : public TPayloadISAKMP
       
   287 {
       
   288 public:
       
   289     static inline TSignatureISAKMP *Ptr(const TPayloadISAKMP *aPayload)
       
   290         { return (TSignatureISAKMP *)aPayload; }
       
   291     inline TUint16 GetDataLength() const    //Length of the data part in bytes
       
   292     { return (TUint16)(GetLength() - sizeof(*this));}
       
   293     inline TUint8 *SigData() const {return ((TUint8*)this + sizeof(*this)); } //pointer to signature data
       
   294 
       
   295 };
       
   296 
       
   297 class TNonceISAKMP : public TPayloadISAKMP
       
   298 {
       
   299 public:
       
   300     static inline TNonceISAKMP *Ptr(const TPayloadISAKMP *aPayload)
       
   301         { return (TNonceISAKMP *)aPayload; }
       
   302 
       
   303     inline TUint8 *NonceData() const {return ((TUint8*)this + sizeof(*this)); } //* to Nonce Data
       
   304     inline TUint16 NonceDataLen() const {return (TUint16)(GetLength() -  sizeof(*this)); } //* to Nonce Data
       
   305 };
       
   306 
       
   307 
       
   308 
       
   309 class TNotificationISAKMP : public TPayloadISAKMP
       
   310 {
       
   311 public:
       
   312     inline TUint32 GetDOI() const { return GET32(&iDOI); };
       
   313     inline void SetDOI(TUint32 aDOI) { PUT32(&iDOI, aDOI); };
       
   314     inline TUint8 GetProtocol() const { return iProtocol; };
       
   315     inline void SetProtocol(TUint8 aPayload) { iProtocol = aPayload; };
       
   316     inline TUint8 GetSPISize() const { return iSPISize; };
       
   317     inline void SetSPISize(TUint8 aPayload) { iSPISize = aPayload; };
       
   318     inline TUint16 GetMsgType() const { return (TUint16)GET16(&iMsgType); };
       
   319     inline void SetMsgType(TUint16 aMsgType) { PUT16(&iMsgType, aMsgType); };
       
   320     inline TUint8 *GetSPI() const { return ((TUint8*)this + sizeof(*this)); };  //returns the SPI Data
       
   321     inline TUint8 *GetNotifData() const { return ((TUint8*)this + sizeof(*this) + iSPISize); }; //returns the Notification Data
       
   322     inline TUint16 GetNotifDataSize() const { return (TUint16)(GetLength() - (sizeof(*this) + iSPISize)); };//returns the Notification Data Length
       
   323 
       
   324     static inline TNotificationISAKMP *Ptr(const TPayloadISAKMP *aPayload)
       
   325         { return (TNotificationISAKMP *)aPayload; }
       
   326 	
       
   327     TUint32 iDOI;       //Domain Of Interpretation
       
   328     TUint8 iProtocol;   //Protocol ID for the current notification
       
   329     TUint8 iSPISize;    //size in octets. For ISAKMP should be from 0 to 16. If >0 SPI ignored
       
   330     TUint16 iMsgType;   //Notify msg type. See constants.
       
   331     //Plus the variable fields SPI and Notification Data (both included in length)
       
   332 private:
       
   333     inline void MsgTypeToStr(TDes &aBuf, TUint16 aMsgType) const
       
   334 	{
       
   335 #ifdef _DEBUG
       
   336 		switch (aMsgType)
       
   337 		{
       
   338 		//NOTIFY MESSAGES - ERROR TYPES 
       
   339 			case  INVALID_PAYLOAD_TYPE: 
       
   340 				aBuf = _L("INVALID_PAYLOAD_TYPE");
       
   341 				break;
       
   342 			case  DOI_NOT_SUPPORTED: 
       
   343 				aBuf = _L("DOI_NOT_SUPPORTED");
       
   344 				break;
       
   345 			case  SITUATION_NOT_SUPPORTED: 
       
   346 				aBuf = _L("SITUATION_NOT_SUPPORTED");
       
   347 				break;
       
   348 			case  INVALID_COOKIE: 
       
   349 				aBuf = _L("INVALID_COOKIE");
       
   350 				break;
       
   351 			case  INVALID_MAJOR_VERSION: 
       
   352 				aBuf = _L("INVALID_MAJOR_VERSION");
       
   353 				break;
       
   354 			case  INVALID_MINOR_VERSION: 
       
   355 				aBuf = _L("INVALID_MINOR_VERSION");
       
   356 				break;
       
   357 			case  INVALID_EXCHANGE_TYPE: 
       
   358 				aBuf = _L("INVALID_EXCHANGE_TYPE");
       
   359 				break;
       
   360 			case  INVALID_FLAGS: 
       
   361 				aBuf = _L("INVALID_FLAGS");
       
   362 				break;
       
   363 			case  INVALID_MESSAGE_ID: 
       
   364 				aBuf = _L("INVALID_MESSAGE_ID");
       
   365 				break;
       
   366 			case  INVALID_PROTOCOL_ID: 
       
   367 				aBuf = _L("INVALID_PROTOCOL_ID");
       
   368 				break;
       
   369 			case  INVALID_SPI: 
       
   370 				aBuf = _L("INVALID_SPI");
       
   371 				break;
       
   372 			case  INVALID_TRANSFORM_ID: 
       
   373 				aBuf = _L("INVALID_SPI");
       
   374 				break;
       
   375 			case  ATTRIBUTES_NOT_SUPPORTED: 
       
   376 				aBuf = _L("ATTRIBUTES_NOT_SUPPORTED");
       
   377 				break;
       
   378 			case  NO_PROPOSAL_CHOSEN: 
       
   379 				aBuf = _L("NO_PROPOSAL_CHOSEN");
       
   380 				break;
       
   381 			case  BAD_PROPOSAL_SYNTAX: 
       
   382 				aBuf = _L("BAD_PROPOSAL_CHOSEN");
       
   383 				break;
       
   384 			case  PAYLOAD_MALFORMED: 
       
   385 				aBuf = _L("PAYLOAD_MALFORMED");
       
   386 				break;
       
   387 			case  INVALID_KEY_INFORMATION: 
       
   388 				aBuf = _L("INVALID_KEY_INFORMATION");
       
   389 				break;
       
   390 			case  INVALID_ID_INFORMATION: 
       
   391 				aBuf = _L("INVALID_ID_INFORMATION");
       
   392 				break;
       
   393 			case  INVALID_CERT_ENCODING: 
       
   394 				aBuf = _L("INVALID_CERT_ENCODING");
       
   395 				break;
       
   396 			case  INVALID_CERTIFICATE: 
       
   397 				aBuf = _L("INVALID_CERTIFICATE");
       
   398 				break;
       
   399 			case  CERT_TYPE_UNSUPPORTED: 
       
   400 				aBuf = _L("CERT_TYPE_UNSUPPORTED");
       
   401 				break;
       
   402 			case  INVALID_CERT_AUTHORITY: 
       
   403 				aBuf = _L("INVALID_CERT_AUTHORITY");
       
   404 				break;
       
   405 			case  INVALID_HASH_INFORMATION: 
       
   406 				aBuf = _L("INVALID_HASH_INFORMATION");
       
   407 				break;
       
   408 			case  AUTHENTICATION_FAILED: 
       
   409 				aBuf = _L("AUTHENTICATION_FAILED");
       
   410 				break;
       
   411 			case  INVALID_SIGNATURE: 
       
   412 				aBuf = _L("INVALID_SIGNATURE");
       
   413 				break;
       
   414 			case  ADDRESS_NOTIFICATION: 
       
   415 				aBuf = _L("ADDRESS_NOTIFICATION");
       
   416 				break;
       
   417 			case  NOTIFY_SA_LIFETIME: 
       
   418 				aBuf = _L("NOTIFY_SA_LIFETIME");
       
   419 				break;
       
   420 			case  CERTIFICATE_UNAVAILABLE: 
       
   421 				aBuf = _L("CERTIFICATE_UNAVAILABLE");
       
   422 				break;
       
   423 			case  UNSUPPORTED_EXCHANGE_TYPE: 
       
   424 				aBuf = _L("UNSUPPORTED_EXCHANGE_TYPE");
       
   425 				break;
       
   426 			case  UNEQUAL_PAYLOAD_LENGTHS: 
       
   427 				aBuf = _L("UNEQUAL_PAYLOAD_LENGTHS");
       
   428 				break;
       
   429 			case  CONNECTED: 
       
   430 				aBuf = _L("CONNECTED");
       
   431 				break;
       
   432 			default:
       
   433 				if ((aMsgType>30) && (aMsgType < 8192))
       
   434 					aBuf.Format(_L("ERROR RESERVED Future Use (%d)"),aMsgType);
       
   435 				else if ((aMsgType>8191) && (aMsgType < 16384))
       
   436 					aBuf.Format(_L("ERROR Private Use (%d)"),aMsgType);
       
   437 				else if (((aMsgType>16384) && (aMsgType < 24576)) || ((aMsgType>40959) && (aMsgType < 65536)))
       
   438 					aBuf.Format(_L("STATUS RESERVED Future Use (%d)"),aMsgType);
       
   439 				else if ((aMsgType>24575) && (aMsgType < 32768))
       
   440 					aBuf.Format(_L("STATUS DOI Specific (%d)"),aMsgType);
       
   441 				else if ((aMsgType>32767) && (aMsgType < 40959))
       
   442 					aBuf.Format(_L("STATUS Private Use (%d)"),aMsgType);
       
   443 				else
       
   444 					aBuf.Format(_L("UNKNOWN ERROR (%d)"),aMsgType);
       
   445 		}
       
   446 #else
       
   447 		(void)aBuf;
       
   448 		(void)aMsgType;
       
   449 #endif      
       
   450 	}
       
   451 			
       
   452     inline void ProtocolToStr(TDes& aBuf, TUint16 aProtocol) const
       
   453 	{		
       
   454 #ifdef _DEBUG
       
   455 
       
   456 	switch (aProtocol)
       
   457 	{
       
   458 		//Protocol number for IPSEC DOI (=1)
       
   459 		case PROTO_ISAKMP: 
       
   460 			aBuf = _L("PROTO_ISAKMP");
       
   461 			break;
       
   462 		case PROTO_IPSEC_AH: 
       
   463 			aBuf = _L("PROTO_IPSEC_AH");
       
   464 			break;
       
   465 		case PROTO_IPSEC_ESP: 
       
   466 			aBuf = _L("PROTO_IPSEC_ESP");
       
   467 			break;
       
   468 		case PROTO_IPCOMP: 
       
   469 			aBuf = _L("PROTO_IPCOMP");
       
   470 			break;
       
   471 		default:
       
   472 			aBuf.Format(_L("Unknown (%d) "),aProtocol);
       
   473 	}
       
   474 #else
       
   475 	(void)aBuf;
       
   476 	(void)aProtocol;
       
   477 #endif  
       
   478 	}
       
   479 			
       
   480     
       
   481 };
       
   482 
       
   483 class TDeleteISAKMP : public TPayloadISAKMP
       
   484 {
       
   485 public:
       
   486     inline TUint32 DOI() const { return GET32(&iDOI); };
       
   487     inline void SetDOI(TUint32 aDOI) { PUT32(&iDOI, aDOI); };
       
   488     inline TUint8 Protocol() const { return iProtocol; };
       
   489     inline void SetProtocol(TUint8 aPayload) { iProtocol = aPayload; };
       
   490     inline TUint8 SPISize() const { return iSPISize; };
       
   491     inline void SetSPISize(TUint8 aPayload) { iSPISize = aPayload; };
       
   492     inline TUint16 NumSPI() const { return (TUint16)GET16(&iNumSPI); };
       
   493     inline void SetNumSPI(TUint16 aNumSPI) { PUT16(&iNumSPI, aNumSPI); };
       
   494 
       
   495     static inline TDeleteISAKMP *Ptr(const TPayloadISAKMP *aPayload)
       
   496         { return (TDeleteISAKMP *)aPayload; }
       
   497     inline TUint8 *SPIList() const {return ((TUint8*)this + sizeof(*this)); } //* to Vendor ID Data
       
   498     inline TUint8 *SPI(TUint i) const {return ((TUint8*)this + sizeof(*this) + i * SPISize()); } //i-th SPI
       
   499     inline void String(TDes &aStr) const
       
   500 	{
       
   501 #ifdef _DEBUG
       
   502 		aStr.Append(_L(" Delete payload "));
       
   503 		aStr.AppendFormat(_L(" DOI= %u"), DOI());   
       
   504 		aStr.AppendFormat(_L(" Prot=%u "), Protocol());
       
   505 		aStr.AppendFormat(_L(" SPIsize= %u"), SPISize());
       
   506 		aStr.AppendFormat(_L(" #SPI=%u "), NumSPI());
       
   507 	//2 variable size fields
       
   508 
       
   509 	//TUint8 *p=((TUint8 *)Payload());
       
   510 		TUint8 *p;
       
   511 		for (TInt i=0; i < NumSPI(); i++)
       
   512 		{
       
   513 			aStr.AppendFormat(_L(" #SPI(%d)="),i);
       
   514 			p=SPI(i);
       
   515 			for (TUint j=0 ; j < SPISize() ; j++)
       
   516 			{
       
   517 				if (j%4==0)
       
   518 					aStr.AppendFormat(_L(" "));
       
   519 				aStr.AppendFormat(_L("%02.2x"), p[j]);  //not sure SPI
       
   520 			}
       
   521 		}
       
   522 #else
       
   523 		(void)aStr;		
       
   524 #endif
       
   525 	}
       
   526 
       
   527     TUint32 iDOI;       //Domain Of Interpretation
       
   528     TUint8 iProtocol;   //Protocol ID for the current notification
       
   529     TUint8 iSPISize;    //size in octets. For ISAKMP should be from 0 to 16. If >0 SPI ignored
       
   530     TUint16 iNumSPI;    //# of SPIs to be deleted
       
   531     //Plus iNumSPI variable fields SPI
       
   532 };
       
   533 
       
   534 
       
   535 class TVendorISAKMP : public TPayloadISAKMP
       
   536 {
       
   537 public:
       
   538     static inline TVendorISAKMP *Ptr(const TPayloadISAKMP *aPayload)
       
   539         { return (TVendorISAKMP *)aPayload; }
       
   540     inline TUint8 *VIDData() const {return ((TUint8*)this + sizeof(*this)); } //* to Vendor ID Data
       
   541 
       
   542 };
       
   543 
       
   544 class TCHREISAKMP : public TPayloadISAKMP
       
   545 {
       
   546 public:
       
   547     static inline TCHREISAKMP *Ptr(const TPayloadISAKMP *aPayload)
       
   548         { return (TCHREISAKMP *)aPayload; }
       
   549     inline TUint16 GetLAMtype() const { return (TUint16)GET16(&iLAMType); }
       
   550     inline void SetLAMtype(TUint16 aLength) { PUT16(&iLAMType, aLength); }  
       
   551     inline TUint16 GetCHREReserved() const { return iReserved; }
       
   552     inline void SetCHREReserved() { iReserved = 0; }        
       
   553     inline TDataISAKMP *CHREAttrib() const {return (TDataISAKMP *)((TUint8*)this + sizeof(*this)); } //* to CHRE attributes 
       
   554     //void String(TDes &aStr) const;
       
   555     TUint16 iLAMType;   //LAM type          
       
   556     TUint16 iReserved;  //reserved must be zero
       
   557 };
       
   558 
       
   559 class TINTNETISAKMP : public TPayloadISAKMP
       
   560 {
       
   561 public:
       
   562     static inline TINTNETISAKMP *Ptr(const TPayloadISAKMP *aPayload)
       
   563         { return (TINTNETISAKMP *)aPayload; }
       
   564     inline TDataISAKMP *INTNETAttrib() const {return (TDataISAKMP *)((TUint8*)this + sizeof(*this)); } //* to INTNET attributes 
       
   565     //void String(TDes &aStr) const;
       
   566 };
       
   567 
       
   568 class TNATDISAKMP : public TPayloadISAKMP
       
   569 {
       
   570 public:
       
   571     static inline TNATDISAKMP *Ptr(const TPayloadISAKMP *aPayload)
       
   572         { return (TNATDISAKMP *)aPayload; }
       
   573     inline TUint8 *HashData() const {return ((TUint8*)this + sizeof(*this)); } //* to NAT D hash data
       
   574     inline TUint32 HashLth() const {return (GetLength() - sizeof(*this)); };
       
   575 };
       
   576 
       
   577 
       
   578 class TNATOaISAKMP : public TPayloadISAKMP
       
   579 {
       
   580 public:
       
   581     inline TUint8 GetIDType() const { return iIDType; }
       
   582     inline void SetIDType(TUint8 aIDType) { iIDType=aIDType; }
       
   583     inline void SetReservedFields() { iReserved8=0; PUT16(iReserved16, 0); }    
       
   584     //
       
   585     static inline TNATOaISAKMP *Ptr(const TPayloadISAKMP *aPayload)
       
   586         { return (TNATOaISAKMP *)aPayload; }
       
   587 
       
   588     inline TUint8 *OAData() const {return ((TUint8*)this + sizeof(*this)); } //* to identity data
       
   589     inline TUint16 OADDataLen() const {return (TUint16)(GetLength() - sizeof(*this)); } //Length of the payload data
       
   590 public:
       
   591     TUint8  iIDType;
       
   592     //IPSEC DOI Specific fields
       
   593     TUint8  iReserved8;
       
   594     TUint16 iReserved16;
       
   595 
       
   596 };
       
   597 
       
   598 class TAttributeISAKMP : public TPayloadISAKMP
       
   599 {
       
   600 public:
       
   601     inline TUint8 CfgMsgType() const { return iCfgMsgType; }
       
   602     inline void SetCfgMsgType(TUint8 aMsgType) { iCfgMsgType=aMsgType; }
       
   603     inline void SetReservedField() { iReserved8=0;}
       
   604     inline TUint16 Identifier() const { return (TUint16)GET16(&iIdentifier);}
       
   605     inline void SetIdentifier(TUint16 aIdentifier) { PUT16(&iIdentifier, aIdentifier); } 
       
   606     //
       
   607     static inline TAttributeISAKMP *Ptr(const TPayloadISAKMP *aPayload)
       
   608         { return (TAttributeISAKMP *)aPayload; }
       
   609     inline TDataISAKMP *AttrData() const {return (TDataISAKMP *)((TUint8*)this + sizeof(*this)); } //* to attribute data
       
   610     inline TInt AttrDataLen() const {return (TInt)(GetLength() - sizeof(*this)); } //Length of the payload data
       
   611 public:
       
   612     TUint8  iCfgMsgType;
       
   613     TUint8  iReserved8;
       
   614     TUint16 iIdentifier;
       
   615 
       
   616 };
       
   617 
       
   618 
       
   619 //
       
   620 // DATA ATTRIBUTES
       
   621 //
       
   622 class TDataISAKMP
       
   623     {
       
   624 public:
       
   625     TDataISAKMP(){u.iData32[0] = 0;}
       
   626     inline TBool IsBasic() const {return ((u.iData8[0] & 0x80) != 0);} //return if basic attrib or variable
       
   627     inline void SetBasic(TBool aIsBasic)
       
   628 	{
       
   629 		if (aIsBasic)
       
   630 			 u.iData8[0] |= 0x80;
       
   631 		else u.iData8[0] &= 0x7F;
       
   632 	}
       
   633     inline TUint16 Type() const	{ return (TUint16)(GET16(&u.iData16[0]) & (TUint16)0x7FFF);} 
       
   634     inline void SetType(TUint16 aType)
       
   635 	{
       
   636 		u.iData8[1] = (TUint8)(aType & 0x00ff);
       
   637 		u.iData8[0] &= 0x80;
       
   638 		u.iData8[0] |= ((TUint8)(aType >> 8)) & 0x7F;
       
   639 	}
       
   640     inline TUint16 Length() const
       
   641 	{ 
       
   642 		if (!IsBasic()) 
       
   643 		   return (TUint16)GET16(&u.iData16[1]);
       
   644 		return 0;   //No length needed		
       
   645 	}
       
   646     inline void SetLength(TUint16 aLength) { if (!IsBasic()) PUT16(&u.iData16[1], aLength); }
       
   647     inline TUint16 Value() const
       
   648 	{ 
       
   649 		if (IsBasic()) 
       
   650 			return  (TUint16)GET16(&u.iData16[1]);
       
   651 		return 0;
       
   652 	}
       
   653     inline void SetValue(TUint16 aValue) { if (IsBasic()) PUT16(&u.iData16[1], aValue);}
       
   654     inline TUint8 *VarValue()  const
       
   655 	{
       
   656 		if (!IsBasic()) 
       
   657 			return ((TUint8*)this + sizeof(*this));
       
   658 		return NULL;
       
   659 	}
       
   660     inline TUint Size() { return (sizeof(*this) + Length());}   //return attr header full size
       
   661     inline TDataISAKMP *Next() {return (TDataISAKMP *)((TUint8*)this + sizeof(*this) + Length());}  //next attribute
       
   662 public:
       
   663     union
       
   664         {
       
   665         TUint32 iData32[1];
       
   666         TUint16 iData16[2];
       
   667         TUint8  iData8[4];
       
   668         } u;
       
   669     };
       
   670 //Plus Length() bytes if variable attrib;
       
   671 
       
   672 //
       
   673 // TLastIKEMsg
       
   674 // This class is used to detect possible IKE message retransmission from peer.
       
   675 // The following information is stored to object data in consturctor:
       
   676 //  -- IKE message length (octets iData8[0], iData8[1] and iData8[2])
       
   677 //  -- Next payload code (iData8[3])
       
   678 //  -- IP checksum over entire IKE message (iData32[1])
       
   679 //
       
   680 class TLastIKEMsg
       
   681     {
       
   682 public:
       
   683     inline TLastIKEMsg() { u.iData32[0] = 0; u.iData32[1] = 0;}
       
   684     inline TLastIKEMsg(const ThdrISAKMP& aHdr)
       
   685 	{
       
   686 		u.iData32[0] = aHdr.GetLength();
       
   687 		TUint16 *End = (TUint16*)((TUint8*)&aHdr + (u.iData32[0] & 0xfffffffe));
       
   688 		TUint16 *Ptr = (TUint16*)&aHdr;
       
   689 		u.iData8[3]  = aHdr.GetPayload(); // MUST NOT be stored before length value !
       
   690 		TUint32 sum  = 0;   
       
   691 		while ( Ptr < End ) sum += *Ptr++;
       
   692 		u.iData32[1] = sum;
       
   693 	}
       
   694     inline TBool IsUninitialized()
       
   695             {
       
   696             if (u.iData32[0] == 0 && u.iData32[1] == 0)
       
   697                 return ETrue;
       
   698             return EFalse;
       
   699             }
       
   700     inline void Store(TLastIKEMsg& aRef)
       
   701             { aRef.u.iData32[0] = u.iData32[0];  aRef.u.iData32[1] = u.iData32[1]; }    
       
   702     inline TBool IsReTransmit(TLastIKEMsg& aRef)
       
   703             { return ((u.iData32[0] == aRef.u.iData32[0]) && (u.iData32[1] == aRef.u.iData32[1]));}
       
   704 private:	
       
   705     union
       
   706         {
       
   707         TUint32 iData32[2];
       
   708         TUint8  iData8[8];
       
   709         } u;
       
   710     };
       
   711 
       
   712 
       
   713 #endif // IKEV1PAYLOADS_H