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