diff -r 000000000000 -r 33413c0669b9 vpnengine/ikev1lib/src/ikev1payload.cpp --- /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(4); + Payloads->iCerts = new (ELeave) CArrayFixFlat(4); + Payloads->iCertReqs = new (ELeave) CArrayFixFlat(4); + Payloads->iNotifs = new (ELeave) CArrayFixFlat(4); + Payloads->iDeletes = new (ELeave) CArrayFixFlat(4); + Payloads->iVids = new (ELeave) CArrayFixFlat(4); + Payloads->iNatDs = new (ELeave) CArrayFixFlat(4); + Payloads->iGenPlds = new (ELeave) CArrayFixFlat(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; +} +