authenticationservices/authenticationserver/test/tauthkeys/step_encryptkey.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 24 Nov 2009 09:06:03 +0200
changeset 29 ece3df019add
permissions -rw-r--r--
Revision: 200948 Kit: 200948

/*
* 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: 
*
*/


#include <s32file.h>
#include "tauthkeysstep.h"

using namespace AuthServer;

CTStepEncryptKey::CTStepEncryptKey()
	{
	SetTestStepName(KTStepEncryptKey);
	}

TVerdict CTStepEncryptKey::doTestStepL()
	{
	if (TestStepResult() != EPass)
		{
		return TestStepResult();
		}
__UHEAP_MARK;		// Check for memory leaks

    TBool res = ETrue; 
    TBool tmp = ETrue; 
	TInt  err = KErrNone;
 

	_LIT8(KPluginData, "ABCDEFGHIJ");
	_LIT8(KBadPluginData, "KLMNOPQRST");
	_LIT(KPluginName, "PasswordPlugin");

    HBufC* pluginName = HBufC::NewLC(14);
	
	*pluginName = KPluginName;

	CTransientKeyInfo* transInfo =
	  CTransientKeyInfo::NewLC(9999);
	  
	CTransientKey* transient =
		transInfo->CreateTransientKeyL(KPluginData);
	CleanupStack::PushL(transient);

	CProtectionKey* protection =
		CProtectionKey::NewL(8);
	CleanupStack::PushL(protection);
		
	CEncryptedProtectionKey* encrypted =
		transient->EncryptL(*protection);
	
	transInfo->SetEncryptedProtectionKeyL(encrypted);
	
	// try to set another key 
	TRAP(err, transInfo->SetEncryptedProtectionKeyL(encrypted));
	TEST(tmp = (err == KErrAlreadyExists));
	res = tmp && res;
	
	// check the encrypted key is different from the protection key
	TEST(tmp = (encrypted->KeyData() != protection->KeyData()));
	res = tmp && res;
	
	CProtectionKey* decrypted =
		transient->DecryptL(*encrypted);
	CleanupStack::PushL(decrypted);

	// check that the decrypted key is the same as the protection key
	TEST(tmp = (protection->KeyData() == decrypted->KeyData()));
	res = tmp && res;
	
	// check we can't use the wrong plugin data
	CTransientKey* transient2 = 0;
	TRAP(err, transient2 = transInfo->CreateTransientKeyL(KBadPluginData)); 
	TEST(tmp = (err != KErrNone));
	res = tmp && res;

	// avoid set but unused warning...
	if (transient2 == 0) transient2 = 0;
	
	CProtectionKey* client = protection->ClientKeyL(0xabababab);
	CleanupStack::PushL(client);

	CProtectionKey* client2 = protection->ClientKeyL(0xcdcdcdcd);
	CleanupStack::PushL(client2);

	// check protection key is different from the client key 
	TEST(tmp = (protection->KeyData() != client->KeyData()));
	res = tmp && res;
	TEST(tmp = (protection->KeyData().Length() == client->KeyData().Length()));
	res = tmp && res;

	// check two client keys are different 
	TEST(tmp = (client->KeyData() != client2->KeyData()));
	res = tmp && res;
	TEST(tmp = (client->KeyData().Length() == client2->KeyData().Length()));
	res = tmp && res;

	// check key lengths larger than SHA1 output is handled correctly 
	CProtectionKey* protection2 =
		CProtectionKey::NewL(512);
	CleanupStack::PushL(protection2);

	CProtectionKey* client3 = protection2->ClientKeyL(0xcdcdcdcd);
	CleanupStack::PushL(client3);
	
	// check protection key is different from the client key 
	TEST(tmp = (protection2->KeyData() != client3->KeyData()));
	res = tmp && res;
	TEST(tmp = (protection2->KeyData().Length() ==
				client3->KeyData().Length()));
	res = tmp && res;

	// cleanup
	CleanupStack::PopAndDestroy(8, transInfo);
	CleanupStack::PopAndDestroy(pluginName);

	SetTestStepResult(res ? EPass : EFail);
	
__UHEAP_MARKEND;	
	return TestStepResult();
	}