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 |
|