vpnengine/ikev1lib/src/ikev1payload.cpp
changeset 0 33413c0669b9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vpnengine/ikev1lib/src/ikev1payload.cpp	Thu Dec 17 09:14:51 2009 +0200
@@ -0,0 +1,213 @@
+/*
+* Copyright (c) 2007-2009 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:   CIkev1payload class
+*
+*/
+
+#include "ikev1payload.h"
+#include "ikev1negotiation.h"
+#include "ikedebug.h"
+
+//
+//  CIkePayloads
+//
+
+CIkev1Payloads::CIkev1Payloads( CIkev1Negotiation& aNegotiation,
+                                MIkeDebug& aDebug )
+ : iNegotiation( aNegotiation ),
+   iDebug( aDebug )
+{	
+}	
+
+
+CIkev1Payloads::~CIkev1Payloads()
+{
+	delete iIds;	
+	delete iCerts;
+	delete iCertReqs;
+	delete iNotifs;
+	delete iDeletes; 	
+	delete iVids;
+	delete iNatDs;
+	delete iGenPlds;				
+}
+
+
+CIkev1Payloads* CIkev1Payloads::NewL( const ThdrISAKMP& aHdr,
+                                      CIkev1Negotiation& aNegotiation,
+                                      MIkeDebug& aDebug )
+{
+	CIkev1Payloads* Payloads = new (ELeave) CIkev1Payloads( aNegotiation,
+	                                                        aDebug );
+	CleanupStack::PushL(Payloads);	
+
+	Payloads->iIds      = new (ELeave) CArrayFixFlat<const TIdentISAKMP *>(4);	
+	Payloads->iCerts    = new (ELeave) CArrayFixFlat<const TCertificateISAKMP *>(4);
+	Payloads->iCertReqs = new (ELeave) CArrayFixFlat<const TCertificateReqISAKMP *>(4);
+	Payloads->iNotifs   = new (ELeave) CArrayFixFlat<const TNotificationISAKMP *>(4);
+	Payloads->iDeletes  = new (ELeave) CArrayFixFlat<const TDeleteISAKMP *>(4);		
+	Payloads->iVids     = new (ELeave) CArrayFixFlat<const TVendorISAKMP *>(4);
+	Payloads->iNatDs    = new (ELeave) CArrayFixFlat<const TNATDISAKMP *>(4);
+	Payloads->iGenPlds  = new (ELeave) CArrayFixFlat<const TPayloadISAKMP *>(4);
+
+	if ( !Payloads->ParsePayloadsL(aHdr) )
+	{
+	   CleanupStack::PopAndDestroy();		
+	   Payloads = NULL;
+	}	 
+	else CleanupStack::Pop();
+	
+	return Payloads;
+}
+
+TBool CIkev1Payloads::ParsePayloadsL(const ThdrISAKMP &aHdr)
+{
+
+	TBool   Status = ETrue;
+	TUint16 ptype  = aHdr.GetPayload();
+	const TPayloadISAKMP* payload = (const TPayloadISAKMP*)aHdr.Next();
+	iPadding = aHdr.GetLength() - sizeof(aHdr);
+	
+	while ( ptype != ISAKMP_PAYLOAD_NONE )
+	{
+		
+		if (!iNegotiation.CheckGenericPayloadL(payload))  //Checks the generic payload is OK
+		{
+			Status = EFalse;
+			break;
+		}
+
+		switch (ptype)
+		{
+			
+			case ISAKMP_PAYLOAD_SA: //also includes proposal and transform
+				DEBUG_LOG(_L("[SA]"));
+				if ( !iSa )	 // Only one SA payload (The first)	
+				   iSa = TSAISAKMP::Ptr(payload);
+				break;
+
+			case ISAKMP_PAYLOAD_KE: 
+				DEBUG_LOG(_L("[KE]"));
+				if ( !iKe )	 // Only one KE payload (The first)	
+				   iKe = TKeyISAKMP::Ptr(payload);
+				break;
+
+			case ISAKMP_PAYLOAD_ID: 
+				DEBUG_LOG(_L("[ID]"));
+				iIds->AppendL(TIdentISAKMP::Ptr(payload));
+				break;
+
+			case ISAKMP_PAYLOAD_CERT:
+				DEBUG_LOG(_L("[CERT]"));
+				iCerts->AppendL(TCertificateISAKMP::Ptr(payload));
+				break;
+				
+			case ISAKMP_PAYLOAD_CR: 
+				DEBUG_LOG(_L("[CR]"));
+				iCertReqs->AppendL(TCertificateReqISAKMP::Ptr(payload));
+				break;
+
+			case ISAKMP_PAYLOAD_HASH:
+				DEBUG_LOG(_L("[HASH]"));
+				if ( !iHash )	 // Only one HASH payload (The first)	
+				   iHash = THashISAKMP::Ptr(payload);
+				break;
+
+			case ISAKMP_PAYLOAD_SIG:
+				DEBUG_LOG(_L("[SIG]"));
+				if ( !iSign )	 // Only one HASH payload (The first)	
+				   iSign = TSignatureISAKMP::Ptr(payload);
+				break;
+
+			case ISAKMP_PAYLOAD_NONCE:
+				DEBUG_LOG(_L("[NONCE]"));
+				if ( !iNonce )	 // Only one NONCE payload (The first)	
+				   iNonce = TNonceISAKMP::Ptr(payload);
+				break;
+
+			case ISAKMP_PAYLOAD_NOTIF:
+				DEBUG_LOG(_L("[NOTIF]"));
+				iNotifs->AppendL(TNotificationISAKMP::Ptr(payload));						
+				break;
+
+			case ISAKMP_PAYLOAD_D:
+				DEBUG_LOG(_L("[DELETE]"));
+				iDeletes->AppendL(TDeleteISAKMP::Ptr(payload));						
+				break;
+				
+			case ISAKMP_PAYLOAD_VID:
+				DEBUG_LOG(_L("[VID]"));
+				iVids->AppendL(TVendorISAKMP::Ptr(payload));
+				break;
+				
+            //
+			// Extensions payloads  
+			//
+			case ISAKMP_PAYLOAD_ATTRIBUTES:
+				DEBUG_LOG(_L("[ATTR]"));
+				if ( !iAttr )	 // Only one ATTR payload (The first)	
+				   iAttr = TAttributeISAKMP::Ptr(payload);
+				break;
+			
+			case ISAKMP_PAYLOAD_CHRE:
+				DEBUG_LOG(_L("[CHRE]"));
+				if ( !iChre )	 // Only one CHRE payload (The first)	
+			       iChre = TCHREISAKMP::Ptr(payload);
+                break;
+
+			case ISAKMP_INT_NETWORK:
+				DEBUG_LOG(_L("[IA]"));
+				if ( !iIaddr )	 // Only one IA payload (The first)	
+				   iIaddr = TINTNETISAKMP::Ptr(payload);
+				break;  		
+				
+			case IETF_NAT_DISCOVERY:
+				DEBUG_LOG(_L("[NAT-D]"));
+				iNatDs->AppendL(TNATDISAKMP::Ptr(payload));
+				break;
+				
+			case IETF_RFC_NAT_DISCOVERY:
+				DEBUG_LOG(_L("[NAT-D]"));
+				iNatDs->AppendL(TNATDISAKMP::Ptr(payload));
+				break;	
+
+			case IETF_NAT_ORIG_ADDR:
+				DEBUG_LOG(_L("[NAT-OA]"));
+				if ( !iNatOa )	 // Only one NONCE payload (The first)	
+				   iNatOa = TNATOaISAKMP::Ptr(payload);
+				break;
+			
+			case IETF_RFC_NAT_ORIG_ADDR:
+				DEBUG_LOG(_L("[NAT-OA]"));
+				if ( !iNatOa )	 // Only one NONCE payload (The first)	
+				   iNatOa = TNATOaISAKMP::Ptr(payload);
+				break;
+			//
+			// Unknown payloads are queued into iGenPlds array
+			//
+			default: 
+				DEBUG_LOG1(_L("[PL TYPE (%d)]"),ptype);
+				iGenPlds->AppendL(payload);												
+				break;
+				
+		}
+
+		iPadding -= payload->GetLength(); 
+		ptype     = payload->GetPayload();
+		payload   = payload->Next();
+	}
+
+	return Status;
+}	
+