authenticationservices/authenticationserver/source/common/protectionkey.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 01 Apr 2010 00:24:41 +0300
branchRCL_3
changeset 50 d07aa956024a
parent 19 ece3df019add
permissions -rw-r--r--
Revision: 201013 Kit: 201013

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