--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/authenticationservices/authenticationserver/source/common/protectionkey.cpp Tue Nov 24 09:06:03 2009 +0200
@@ -0,0 +1,164 @@
+/*
+* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:
+* CProtectionKey implementation
+*
+*/
+
+
+/**
+ @file
+*/
+
+#include "authcommon_impl.h"
+#include <hash.h>
+
+using namespace AuthServer;
+
+/**
+ * Generate a new key upon construction
+ * @param aKeySize the length of the key in bits.
+ **/
+EXPORT_C CProtectionKey* CProtectionKey::NewL(TInt aKeySize)
+ {
+ CProtectionKey* key = NewLC(aKeySize);
+ CleanupStack::Pop(key);
+ return key;
+ }
+/**
+ * Generate a new key upon construction
+ * @param aKeySize the length of the key in bits.
+ **/
+EXPORT_C CProtectionKey* CProtectionKey::NewLC(TInt aKeySize)
+ {
+ CProtectionKey* key = new (ELeave) CProtectionKey();
+ CleanupStack::PushL(key);
+ key->ConstructL(aKeySize);
+ return key;
+ }
+
+/**
+ * Creates a new key, passing in the key data. Should
+ * really only be called by a CTransientKey::EncryptL. The new object
+ * assumes ownership of the data.
+ *
+ * @param aKeyData the data to use as the key
+ **/
+EXPORT_C CProtectionKey* CProtectionKey::NewL(HBufC8* aKeyData)
+ {
+ CProtectionKey* key =
+ CProtectionKey::NewLC(aKeyData);
+ CleanupStack::Pop(key);
+ return key;
+ }
+
+/**
+ * Creates a new key, passing in the key data. Should
+ * really only be called by a CTransientKey::EncryptL. The new object
+ * assumes ownership of the data.
+ *
+ * @param aKeyData the data to use as the key
+ **/
+EXPORT_C CProtectionKey* CProtectionKey::NewLC(HBufC8* aKeyData)
+ {
+ CProtectionKey* key = new (ELeave) CProtectionKey();
+ CleanupStack::PushL(key);
+ key->ConstructL(aKeyData);
+ return key;
+ }
+/**
+ * Constructor
+ */
+CProtectionKey::CProtectionKey()
+ {
+ }
+
+/**
+ * Creates a new random key of aKeySize
+ * @param aKeySize the size of the key to generate
+ **/
+void CProtectionKey::ConstructL(TInt aKeySize)
+ {
+ iKeyData = HBufC8::NewMaxL(aKeySize);
+ TPtr8 data = iKeyData->Des();
+ TRandom::RandomL(data);
+ }
+
+/**
+ * Deletes the keydata.
+ **/
+CProtectionKey::~CProtectionKey()
+ {
+ delete iKeyData;
+ }
+
+
+/**
+ * Creates a new protection key generated using a combination of this key
+ * and the client UID. Ownership of the returned object is passed to the
+ * caller.
+ *
+ * @param aClientUid the client uid to use in the generation process.
+ *
+ * @return a new heap allocated protection key
+ **/
+EXPORT_C CProtectionKey* CProtectionKey::ClientKeyL(TInt aClientUid) const
+ {
+ CSHA1* sha1 = CSHA1::NewL();
+ CleanupStack::PushL(sha1);
+
+ TPckg<TIdentityId> idPckg(aClientUid);
+
+ sha1->Update(idPckg);
+ sha1->Update(*iKeyData);
+
+ TInt keyLength = iKeyData->Length();
+
+ HBufC8* newKey = HBufC8::NewLC(keyLength);
+
+ TInt remaining = keyLength;
+ do
+ {
+ newKey->Des().Append(sha1->Hash(idPckg).Left(remaining));
+ remaining = keyLength - newKey->Length();
+ } while ( remaining > 0);
+
+ CProtectionKey* key = NewL(newKey);
+ CleanupStack::Pop(newKey);
+ CleanupStack::PopAndDestroy(sha1);
+ return key;
+ }
+
+/**
+ * Returns a descriptor to the key data for use in encryption and
+ * decryption methods.
+ *
+ * @return a descripter pointing to the key data.
+ **/
+EXPORT_C TPtrC8 CProtectionKey::KeyData() const
+ {
+ return *iKeyData;
+ }
+
+/**
+ * Constructs the key using supplied data.
+ **/
+void CProtectionKey::ConstructL(HBufC8* aKeyData)
+ {
+ __ASSERT_DEBUG(((iKeyData == 0) &&
+ (aKeyData != 0)),
+ User::Leave(KErrArgument));
+ iKeyData = aKeyData;
+ }
+