os/security/crypto/weakcryptospi/test/tpkcs5kdf/tpkcs5kdfmain.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
/*
sl@0
     2
* Copyright (c) 1998-2010 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     3
* All rights reserved.
sl@0
     4
* This component and the accompanying materials are made available
sl@0
     5
* under the terms of the License "Eclipse Public License v1.0"
sl@0
     6
* which accompanies this distribution, and is available
sl@0
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     8
*
sl@0
     9
* Initial Contributors:
sl@0
    10
* Nokia Corporation - initial contribution.
sl@0
    11
*
sl@0
    12
* Contributors:
sl@0
    13
*
sl@0
    14
* Description: 
sl@0
    15
* tpkcs5main.cpp
sl@0
    16
*
sl@0
    17
*/
sl@0
    18
sl@0
    19
sl@0
    20
#include <pkcs5kdf.h>
sl@0
    21
#include <pkcs12kdf.h>
sl@0
    22
#include "t_testhandler.h"
sl@0
    23
#include "t_testsetup.h"
sl@0
    24
#include "tScriptTests.h"
sl@0
    25
#include "tactionderivekey.h"
sl@0
    26
sl@0
    27
LOCAL_D void callExampleL() // initialize and call example code under cleanup stack
sl@0
    28
    {
sl@0
    29
    START_SCRIPT_LIST
sl@0
    30
	SCRIPT_ITEM(CActionDeriveKey,_L8("DeriveKey"))
sl@0
    31
	END_SCRIPT_LIST
sl@0
    32
	
sl@0
    33
	TDriveUnit sysDrive (RFs::GetSystemDrive());
sl@0
    34
	TDriveName sysDriveName (sysDrive.Name());
sl@0
    35
	TBuf<64> scriptFile (sysDriveName);
sl@0
    36
	scriptFile.Append(_L("\\tpkcs5kdf\\tpkcs12kdftests.txt"));
sl@0
    37
	
sl@0
    38
	TBuf<64> logFile (sysDriveName);
sl@0
    39
	logFile.Append(_L("\\tpkcs5kdf\\tpkcs12kdftests.log"));
sl@0
    40
	
sl@0
    41
	CTestSetup::CreateAndRunTestsL(theTestTypes, scriptFile, logFile);
sl@0
    42
    }
sl@0
    43
sl@0
    44
sl@0
    45
GLDEF_C TInt E32Main() // main function called by E32
sl@0
    46
    {
sl@0
    47
	__UHEAP_MARK;
sl@0
    48
	CTrapCleanup* cleanup = CTrapCleanup::New(); // get clean-up stack
sl@0
    49
	
sl@0
    50
	TRAPD(error, callExampleL());
sl@0
    51
	__ASSERT_ALWAYS(!error,User::Panic(_L("tpkcs5"),error));
sl@0
    52
	delete cleanup; // destroy clean-up stack
sl@0
    53
	__UHEAP_MARKEND;
sl@0
    54
	return 0;
sl@0
    55
    }
sl@0
    56
sl@0
    57
// The following code was used to generate test data.  It is left in
sl@0
    58
// the source file because it provides an easy way to generate a large
sl@0
    59
// number of PKCS#12 derived keys if required.
sl@0
    60
sl@0
    61
#if 0
sl@0
    62
sl@0
    63
static void TestPkcs12KdfL();
sl@0
    64
static void TestPasswordL(
sl@0
    65
	TInt aKeyLenInBits, TInt aIterCount, const TDesC8& aSalt,
sl@0
    66
	const TDesC8& aPassword, const TDesC& aPasswordText);
sl@0
    67
static void PrintKey(const TDesC8& aKey);
sl@0
    68
sl@0
    69
static void TestPkcs12KdfL()
sl@0
    70
	{
sl@0
    71
	__UHEAP_MARK;
sl@0
    72
	
sl@0
    73
	const TInt KKeyLenCount = 4;
sl@0
    74
	const TInt KKeyLens[KKeyLenCount] = {40, 128, 168, 368};
sl@0
    75
	
sl@0
    76
	const TInt KIterCount = 8;
sl@0
    77
	const TInt KIterCounts[KIterCount] = {1, 2, 4, 8, 128, 1024, 1536, 2048};
sl@0
    78
	
sl@0
    79
	const TInt KSaltCount = 3;
sl@0
    80
	TPtrC8 salts[KSaltCount];
sl@0
    81
	
sl@0
    82
	const TUint8 KSalt4[4] = {0x53, 0x41, 0x4c, 0x54};
sl@0
    83
	salts[0].Set(KSalt4, 4);
sl@0
    84
	
sl@0
    85
	const TUint8 KSalt20[20] =
sl@0
    86
		{
sl@0
    87
		0x1d, 0x56, 0x50, 0x78,		0xc3, 0x50, 0x6f, 0x89,
sl@0
    88
		0xbd, 0xa7, 0x3b, 0xb6,		0xe3, 0xe5, 0xb8, 0xa3,
sl@0
    89
		0x68, 0x3d, 0xd3, 0x62
sl@0
    90
		};
sl@0
    91
	salts[1].Set(KSalt20, 20);
sl@0
    92
	
sl@0
    93
	const TUint8 KSalt25[25] =
sl@0
    94
		{
sl@0
    95
		0xe2, 0x2c, 0x7b, 0x03,		0x16, 0x3a, 0xe5, 0x47,
sl@0
    96
		0xf8, 0x23, 0x9d, 0xa4,		0x0d, 0x6f, 0x46, 0xd7,
sl@0
    97
		0x9e, 0xa3, 0xc6, 0xff,		0xb3, 0xf0, 0x4e, 0xbe,
sl@0
    98
		0x61
sl@0
    99
		};
sl@0
   100
	salts[2].Set(KSalt25, 25);
sl@0
   101
	
sl@0
   102
	const TInt KPasswordCount = 5;
sl@0
   103
	HBufC8* passwords[KPasswordCount];
sl@0
   104
	TPtrC passwords0[KPasswordCount] =
sl@0
   105
		{
sl@0
   106
		_L("0000"), _L("0001"), _L("PSWD"),
sl@0
   107
		_L("password"), _L("abcdefghijklmnopqrstuvwxyz")
sl@0
   108
		};
sl@0
   109
	for (TInt i = 0; i < KPasswordCount; ++i)
sl@0
   110
		passwords[i] = PKCS12KDF::GeneratePasswordLC(passwords0[i]);
sl@0
   111
sl@0
   112
	for (TInt klenIdx = 0; klenIdx < KKeyLenCount; ++klenIdx)
sl@0
   113
		{
sl@0
   114
		for (TInt iterIdx = 0; iterIdx < KIterCount; ++iterIdx)
sl@0
   115
			{
sl@0
   116
			for (TInt saltIdx = 0; saltIdx < KSaltCount; ++saltIdx)
sl@0
   117
				{
sl@0
   118
				for (TInt pwdIdx = 0; pwdIdx < KPasswordCount; ++pwdIdx)
sl@0
   119
					{
sl@0
   120
					TestPasswordL(KKeyLens[klenIdx], KIterCounts[iterIdx], salts[saltIdx], *passwords[pwdIdx], passwords0[pwdIdx]);
sl@0
   121
					}
sl@0
   122
				}	// for (saltIdx = 0; saltIdx < KSaltCount; ++saltIdx)
sl@0
   123
			}	// for (int iterIdx = 0; iterIdx < KIterCount; ++iterIdx)
sl@0
   124
		}	// for (TInt klenIdx = 0; klenIdx < KKeyLenCount; ++klenIdx)
sl@0
   125
	
sl@0
   126
	CleanupStack::PopAndDestroy(KPasswordCount, passwords[0]);
sl@0
   127
	
sl@0
   128
	__UHEAP_MARKEND;
sl@0
   129
	}
sl@0
   130
sl@0
   131
static void TestPasswordL(
sl@0
   132
	TInt aKeyLenInBits, TInt aIterCount, const TDesC8& aSalt,
sl@0
   133
	const TDesC8& aPassword, const TDesC& aPasswordText)
sl@0
   134
	{
sl@0
   135
	__UHEAP_MARK;
sl@0
   136
	
sl@0
   137
	TBuf8<512> key;
sl@0
   138
	key.SetLength(aKeyLenInBits / 8);
sl@0
   139
sl@0
   140
	RDebug::Print(
sl@0
   141
		_L("\nkey len = %d, iter count = %d, password = \"%S\", salt len = %d"),
sl@0
   142
		aKeyLenInBits, aIterCount, &aPasswordText, aSalt.Length());
sl@0
   143
	PKCS12KDF::DeriveKeyL(key, PKCS12KDF::EIDByteEncryptKey, aPassword, aSalt, aIterCount);
sl@0
   144
	PrintKey(key);
sl@0
   145
	
sl@0
   146
	__UHEAP_MARKEND;
sl@0
   147
	}
sl@0
   148
sl@0
   149
static void PrintKey(const TDesC8& aKey)
sl@0
   150
/**
sl@0
   151
	Print the supplied key in hex byte format, with
sl@0
   152
	16 bytes on each row.
sl@0
   153
	
sl@0
   154
	@param	aKey			Key to print.
sl@0
   155
 */
sl@0
   156
	{
sl@0
   157
	const TInt KBlockSize = 16;
sl@0
   158
	TInt keyLen = aKey.Length();
sl@0
   159
	TInt rowCount = keyLen / KBlockSize;
sl@0
   160
	if ((keyLen % KBlockSize) != 0)
sl@0
   161
		++rowCount;
sl@0
   162
sl@0
   163
	for (TInt row = 0; row < rowCount; ++row)
sl@0
   164
		{
sl@0
   165
		TInt start = row * KBlockSize;
sl@0
   166
		TInt end = Min(start + KBlockSize, keyLen);
sl@0
   167
sl@0
   168
		TBuf<64> line;
sl@0
   169
		line.Format(_L("[%04x]"), start);
sl@0
   170
		for (TInt i = start; i < end; ++i)
sl@0
   171
			line.AppendFormat(_L(" %02x"), aKey[i]);
sl@0
   172
		line.Append('\n');
sl@0
   173
		RDebug::Print(line);
sl@0
   174
		}
sl@0
   175
	}
sl@0
   176
sl@0
   177
#endif	// #if 0
sl@0
   178