diff -r 000000000000 -r 33413c0669b9 vpnengine/ikev2lib/src/ikev2ipsecsadata.cpp --- /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); +} + +