vpnengine/ikev1lib/src/ikev1payload.cpp
changeset 0 33413c0669b9
equal deleted inserted replaced
-1:000000000000 0:33413c0669b9
       
     1 /*
       
     2 * Copyright (c) 2007-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:   CIkev1payload class
       
    15 *
       
    16 */
       
    17 
       
    18 #include "ikev1payload.h"
       
    19 #include "ikev1negotiation.h"
       
    20 #include "ikedebug.h"
       
    21 
       
    22 //
       
    23 //  CIkePayloads
       
    24 //
       
    25 
       
    26 CIkev1Payloads::CIkev1Payloads( CIkev1Negotiation& aNegotiation,
       
    27                                 MIkeDebug& aDebug )
       
    28  : iNegotiation( aNegotiation ),
       
    29    iDebug( aDebug )
       
    30 {	
       
    31 }	
       
    32 
       
    33 
       
    34 CIkev1Payloads::~CIkev1Payloads()
       
    35 {
       
    36 	delete iIds;	
       
    37 	delete iCerts;
       
    38 	delete iCertReqs;
       
    39 	delete iNotifs;
       
    40 	delete iDeletes; 	
       
    41 	delete iVids;
       
    42 	delete iNatDs;
       
    43 	delete iGenPlds;				
       
    44 }
       
    45 
       
    46 
       
    47 CIkev1Payloads* CIkev1Payloads::NewL( const ThdrISAKMP& aHdr,
       
    48                                       CIkev1Negotiation& aNegotiation,
       
    49                                       MIkeDebug& aDebug )
       
    50 {
       
    51 	CIkev1Payloads* Payloads = new (ELeave) CIkev1Payloads( aNegotiation,
       
    52 	                                                        aDebug );
       
    53 	CleanupStack::PushL(Payloads);	
       
    54 
       
    55 	Payloads->iIds      = new (ELeave) CArrayFixFlat<const TIdentISAKMP *>(4);	
       
    56 	Payloads->iCerts    = new (ELeave) CArrayFixFlat<const TCertificateISAKMP *>(4);
       
    57 	Payloads->iCertReqs = new (ELeave) CArrayFixFlat<const TCertificateReqISAKMP *>(4);
       
    58 	Payloads->iNotifs   = new (ELeave) CArrayFixFlat<const TNotificationISAKMP *>(4);
       
    59 	Payloads->iDeletes  = new (ELeave) CArrayFixFlat<const TDeleteISAKMP *>(4);		
       
    60 	Payloads->iVids     = new (ELeave) CArrayFixFlat<const TVendorISAKMP *>(4);
       
    61 	Payloads->iNatDs    = new (ELeave) CArrayFixFlat<const TNATDISAKMP *>(4);
       
    62 	Payloads->iGenPlds  = new (ELeave) CArrayFixFlat<const TPayloadISAKMP *>(4);
       
    63 
       
    64 	if ( !Payloads->ParsePayloadsL(aHdr) )
       
    65 	{
       
    66 	   CleanupStack::PopAndDestroy();		
       
    67 	   Payloads = NULL;
       
    68 	}	 
       
    69 	else CleanupStack::Pop();
       
    70 	
       
    71 	return Payloads;
       
    72 }
       
    73 
       
    74 TBool CIkev1Payloads::ParsePayloadsL(const ThdrISAKMP &aHdr)
       
    75 {
       
    76 
       
    77 	TBool   Status = ETrue;
       
    78 	TUint16 ptype  = aHdr.GetPayload();
       
    79 	const TPayloadISAKMP* payload = (const TPayloadISAKMP*)aHdr.Next();
       
    80 	iPadding = aHdr.GetLength() - sizeof(aHdr);
       
    81 	
       
    82 	while ( ptype != ISAKMP_PAYLOAD_NONE )
       
    83 	{
       
    84 		
       
    85 		if (!iNegotiation.CheckGenericPayloadL(payload))  //Checks the generic payload is OK
       
    86 		{
       
    87 			Status = EFalse;
       
    88 			break;
       
    89 		}
       
    90 
       
    91 		switch (ptype)
       
    92 		{
       
    93 			
       
    94 			case ISAKMP_PAYLOAD_SA: //also includes proposal and transform
       
    95 				DEBUG_LOG(_L("[SA]"));
       
    96 				if ( !iSa )	 // Only one SA payload (The first)	
       
    97 				   iSa = TSAISAKMP::Ptr(payload);
       
    98 				break;
       
    99 
       
   100 			case ISAKMP_PAYLOAD_KE: 
       
   101 				DEBUG_LOG(_L("[KE]"));
       
   102 				if ( !iKe )	 // Only one KE payload (The first)	
       
   103 				   iKe = TKeyISAKMP::Ptr(payload);
       
   104 				break;
       
   105 
       
   106 			case ISAKMP_PAYLOAD_ID: 
       
   107 				DEBUG_LOG(_L("[ID]"));
       
   108 				iIds->AppendL(TIdentISAKMP::Ptr(payload));
       
   109 				break;
       
   110 
       
   111 			case ISAKMP_PAYLOAD_CERT:
       
   112 				DEBUG_LOG(_L("[CERT]"));
       
   113 				iCerts->AppendL(TCertificateISAKMP::Ptr(payload));
       
   114 				break;
       
   115 				
       
   116 			case ISAKMP_PAYLOAD_CR: 
       
   117 				DEBUG_LOG(_L("[CR]"));
       
   118 				iCertReqs->AppendL(TCertificateReqISAKMP::Ptr(payload));
       
   119 				break;
       
   120 
       
   121 			case ISAKMP_PAYLOAD_HASH:
       
   122 				DEBUG_LOG(_L("[HASH]"));
       
   123 				if ( !iHash )	 // Only one HASH payload (The first)	
       
   124 				   iHash = THashISAKMP::Ptr(payload);
       
   125 				break;
       
   126 
       
   127 			case ISAKMP_PAYLOAD_SIG:
       
   128 				DEBUG_LOG(_L("[SIG]"));
       
   129 				if ( !iSign )	 // Only one HASH payload (The first)	
       
   130 				   iSign = TSignatureISAKMP::Ptr(payload);
       
   131 				break;
       
   132 
       
   133 			case ISAKMP_PAYLOAD_NONCE:
       
   134 				DEBUG_LOG(_L("[NONCE]"));
       
   135 				if ( !iNonce )	 // Only one NONCE payload (The first)	
       
   136 				   iNonce = TNonceISAKMP::Ptr(payload);
       
   137 				break;
       
   138 
       
   139 			case ISAKMP_PAYLOAD_NOTIF:
       
   140 				DEBUG_LOG(_L("[NOTIF]"));
       
   141 				iNotifs->AppendL(TNotificationISAKMP::Ptr(payload));						
       
   142 				break;
       
   143 
       
   144 			case ISAKMP_PAYLOAD_D:
       
   145 				DEBUG_LOG(_L("[DELETE]"));
       
   146 				iDeletes->AppendL(TDeleteISAKMP::Ptr(payload));						
       
   147 				break;
       
   148 				
       
   149 			case ISAKMP_PAYLOAD_VID:
       
   150 				DEBUG_LOG(_L("[VID]"));
       
   151 				iVids->AppendL(TVendorISAKMP::Ptr(payload));
       
   152 				break;
       
   153 				
       
   154             //
       
   155 			// Extensions payloads  
       
   156 			//
       
   157 			case ISAKMP_PAYLOAD_ATTRIBUTES:
       
   158 				DEBUG_LOG(_L("[ATTR]"));
       
   159 				if ( !iAttr )	 // Only one ATTR payload (The first)	
       
   160 				   iAttr = TAttributeISAKMP::Ptr(payload);
       
   161 				break;
       
   162 			
       
   163 			case ISAKMP_PAYLOAD_CHRE:
       
   164 				DEBUG_LOG(_L("[CHRE]"));
       
   165 				if ( !iChre )	 // Only one CHRE payload (The first)	
       
   166 			       iChre = TCHREISAKMP::Ptr(payload);
       
   167                 break;
       
   168 
       
   169 			case ISAKMP_INT_NETWORK:
       
   170 				DEBUG_LOG(_L("[IA]"));
       
   171 				if ( !iIaddr )	 // Only one IA payload (The first)	
       
   172 				   iIaddr = TINTNETISAKMP::Ptr(payload);
       
   173 				break;  		
       
   174 				
       
   175 			case IETF_NAT_DISCOVERY:
       
   176 				DEBUG_LOG(_L("[NAT-D]"));
       
   177 				iNatDs->AppendL(TNATDISAKMP::Ptr(payload));
       
   178 				break;
       
   179 				
       
   180 			case IETF_RFC_NAT_DISCOVERY:
       
   181 				DEBUG_LOG(_L("[NAT-D]"));
       
   182 				iNatDs->AppendL(TNATDISAKMP::Ptr(payload));
       
   183 				break;	
       
   184 
       
   185 			case IETF_NAT_ORIG_ADDR:
       
   186 				DEBUG_LOG(_L("[NAT-OA]"));
       
   187 				if ( !iNatOa )	 // Only one NONCE payload (The first)	
       
   188 				   iNatOa = TNATOaISAKMP::Ptr(payload);
       
   189 				break;
       
   190 			
       
   191 			case IETF_RFC_NAT_ORIG_ADDR:
       
   192 				DEBUG_LOG(_L("[NAT-OA]"));
       
   193 				if ( !iNatOa )	 // Only one NONCE payload (The first)	
       
   194 				   iNatOa = TNATOaISAKMP::Ptr(payload);
       
   195 				break;
       
   196 			//
       
   197 			// Unknown payloads are queued into iGenPlds array
       
   198 			//
       
   199 			default: 
       
   200 				DEBUG_LOG1(_L("[PL TYPE (%d)]"),ptype);
       
   201 				iGenPlds->AppendL(payload);												
       
   202 				break;
       
   203 				
       
   204 		}
       
   205 
       
   206 		iPadding -= payload->GetLength(); 
       
   207 		ptype     = payload->GetPayload();
       
   208 		payload   = payload->Next();
       
   209 	}
       
   210 
       
   211 	return Status;
       
   212 }	
       
   213