--- /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;
+}
+