vpnengine/ikev2lib/src/ikev2ipsecsadata.cpp
changeset 0 33413c0669b9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vpnengine/ikev2lib/src/ikev2ipsecsadata.cpp	Thu Dec 17 09:14:51 2009 +0200
@@ -0,0 +1,107 @@
+/*
+* Copyright (c) 2003-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:  IKEv2 IPsec sa data
+*
+*/
+
+#include "ikev2ipsecsadata.h"
+#include "ikedebug.h"
+#include "ikev2ipsecsarekeydata.h"
+#include "ikecrypto.h"
+#include "ikev2const.h"
+
+TIkeV2IpsecSAData::TIkeV2IpsecSAData(MIkeDebug& aDebug)
+:iSPI_In(0), iSPI_Out(0),
+ iEncrAlg(0), iIntegAlg(0),
+ iSaType(0), iESN(0),
+ iCipherKeyLth(0), iIntegKeyLth(0),
+ iTransport(EFalse), iSrcSpecific(EFalse),
+ iRekeyData(NULL), iKeyMaterial(NULL),
+ iNext(NULL), iDebug(aDebug)
+    {
+    }
+
+
+void TIkeV2IpsecSAData::Copy(const TIkeV2IpsecSAData& aSrc)
+    {
+    Mem::Copy((TUint8*)&iSPI_In, (TUint8*)&aSrc.iSPI_In, sizeof(TIkeV2IpsecSAData));
+    iNext = NULL;           
+    }
+
+/*
+void TIkeV2IpsecSAData::StoreKeyMaterial(HBufC8* aKeyMaterial)
+    {
+    PurgeKeyMaterial();
+    iKeyMaterial = aKeyMaterial;
+    }
+*/
+
+void TIkeV2IpsecSAData::PurgeKeyMaterial()
+    {
+    if ( iKeyMaterial )
+        {   
+        iKeyMaterial->Des().FillZ(); // Wipe out key material data from buffer           
+        delete iKeyMaterial;
+        iKeyMaterial = NULL;
+        }   
+    }
+
+
+void TIkeV2IpsecSAData::DeleteRekeyData()
+    {
+    if ( iRekeyData )
+        {               
+        delete iRekeyData;
+        iRekeyData = NULL;
+        }   
+    }
+
+void TIkeV2IpsecSAData::GenerateIpsecKeysL(const TDesC8& aSKd, 
+                                           const TDesC8& aGPowIr, 
+                                           const TDesC8& aNonceI, 
+                                           const TDesC8& aNonceR,
+                                           TUint16 aPrfAlg)
+{
+    //
+    //  Generate Ipsec keying material.
+    //  Keying material is created as follows:  KEYMAT = prf+(SK_d, Ni | Nr)
+    //  If PFS used Keying material is: KEYMAT = prf+(SK_d, g^ir (new) | Ni | Nr )
+    //
+    HBufC8* s = HBufC8::NewLC(aGPowIr.Length() + aNonceI.Length() + aNonceR.Length());
+    TPtr8 sPtr = s->Des();
+    //
+    //  Append Nonce data into keymaterial work buffer S
+    //   
+    sPtr = aGPowIr;
+    sPtr.Append(aNonceI);
+    sPtr.Append(aNonceR);
+    
+    TInt KeyMatLth = 0;
+    if ( iEncrAlg )
+    {   if ( iCipherKeyLth == 0) 
+           iCipherKeyLth = IkeCrypto::AlgorithmInfo(IKEV2_ENCR, iEncrAlg, NULL);
+        KeyMatLth = 2*iCipherKeyLth; 
+    }   
+    if ( iIntegAlg )
+    {   
+        iIntegKeyLth = IkeCrypto::AlgorithmInfo(IKEV2_INTEG, iIntegAlg, NULL);    
+        KeyMatLth += 2*iIntegKeyLth;
+    }   
+    
+    PurgeKeyMaterial();    
+    iKeyMaterial = IkeCrypto::GenerateKeyingMaterialL(aSKd, *s, KeyMatLth, aPrfAlg);    
+    CleanupStack::PopAndDestroy(s);
+}
+
+