Update contrib.
2 * Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
4 * This component and the accompanying materials are made available
5 * under the terms of the License "Eclipse Public License v1.0"
6 * which accompanies this distribution, and is available
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
9 * Initial Contributors:
10 * Nokia Corporation - initial contribution.
15 * Test program for PKCS8 Encoding
33 #include <asymmetrickeys.h>
35 #include <securityerr.h>
37 #include "pkcs8tester.h"
39 const TInt KErrEmptyKeyFile = -99990;
42 * Extracts the nPos command line argument.
44 HBufC* Pkcs8Utils::GetArgumentL(TInt nPos)
46 HBufC *argv = HBufC::NewLC(User::CommandLineLength());
47 TPtr cmd(argv->Des());
48 User::CommandLine(cmd);
51 // finds nth parameter
52 while(nPos && !arguments.Eos())
54 TPtrC token = arguments.NextToken();
55 if(token.Length() > 0)
62 TPtrC testfile(arguments.NextToken());
64 if(testfile.Length() > 0)
65 result = testfile.AllocL();
68 // no parameter found, but must return something so..
70 result = HBufC::NewL(0);
72 CleanupStack::PopAndDestroy(argv);
77 CDecPKCS8Data* Pkcs8Utils::getPkcsDataL(TDesC& fileName)
79 // First import a PKCS8 private key from file
81 CleanupClosePushL(fs);
82 User::LeaveIfError(fs.Connect());
85 CleanupClosePushL(file);
86 TInt r = file.Open(fs, fileName, EFileRead);
87 User::LeaveIfError(r);
90 User::LeaveIfError(file.Size(fileSize));
94 User::Leave(KErrEmptyKeyFile);
97 HBufC8* buf = HBufC8::NewMaxLC(fileSize);
98 TPtr8 data(buf->Des());
100 User::LeaveIfError(file.Read(data, fileSize));
102 CDecPKCS8Data* decoded = TASN1DecPKCS8::DecodeDERL(buf->Des());
104 CleanupStack::PopAndDestroy(buf);
105 CleanupStack::PopAndDestroy(&file);
106 CleanupStack::PopAndDestroy(&fs);
107 //CleanupStack::PopAndDestroy(fileName);
112 void Pkcs8Utils::WriteSequenceL(const TDesC& fn, CASN1EncSequence& seq)
114 HBufC8* seqBufc = HBufC8::NewLC(seq.LengthDER());
115 TPtr8 seqBuf(seqBufc->Des());
116 seqBuf.SetLength(seq.LengthDER());
119 seq.WriteDERL(seqBuf, pos);
123 CleanupClosePushL(fs2);
124 User::LeaveIfError(fs2.Connect());
127 CleanupClosePushL(file2);
128 TRAPD(err, file2.Create(fs2, fn, EFileRead));
129 if (err==KErrNotFound)
131 User::LeaveIfError(err);
135 RFileWriteStream writer;
138 User::LeaveIfError(writer.Open(fs2, fn, EFileWrite));
140 writer.WriteL(seqBuf);
143 CleanupStack::PopAndDestroy(4, seqBufc);
148 LOCAL_D void DoTestsDSAEncryptedL(CDecPKCS8Data& decoded)
150 CPKCS8KeyPairDSA* keypair = static_cast<CPKCS8KeyPairDSA*>(decoded.KeyPairData());
152 const CDSAPrivateKey& priv = keypair->PrivateKey();
154 TPBPassword pass(_L(""));
156 CSystemRandom* rand = CSystemRandom::NewLC();
157 HBufC8* saltc = HBufC8::NewMaxLC(16);
158 TPtr8 salt(saltc->Des());
160 TRAPD(err, rand->GenerateBytesL(salt));
161 if((err != KErrNone) && (err != KErrNotSecure))
164 HBufC8* ivc = HBufC8::NewMaxLC(8);
166 TPtr8 iv(ivc->Des());
168 //rand->GenerateBytesL(iv);
170 CPBEncryptParms* params = CPBEncryptParms::NewLC(ECipher3DES_CBC, salt, iv, 2048);
171 CPBEncryptElement* encryptElement = CPBEncryptElement::NewLC(pass, *params);
172 CPBEncryptor* encryptor = encryptElement->NewEncryptLC();
174 CASN1EncSequence* seq = TASN1EncPKCS8::EncodeEncryptedL(priv, *encryptor, *params);
176 CleanupStack::PopAndDestroy(encryptor);
177 CleanupStack::PopAndDestroy(encryptElement);
178 CleanupStack::PopAndDestroy(params);
179 CleanupStack::PopAndDestroy(ivc);
180 CleanupStack::PopAndDestroy(saltc);
181 CleanupStack::PopAndDestroy(rand);
183 CleanupStack::PushL(seq);
184 _LIT(fn, "ExportedDSA_Encrypted.txt");
185 Pkcs8Utils::WriteSequenceL(fn, *seq);
186 CleanupStack::PopAndDestroy(seq);
190 LOCAL_D void DoTestsDSAL(CDecPKCS8Data& decoded)
192 CPKCS8KeyPairDSA* keypair = static_cast<CPKCS8KeyPairDSA*>(decoded.KeyPairData());
194 const CDSAPrivateKey& priv = keypair->PrivateKey();
197 CASN1EncSequence* seq = TASN1EncPKCS8::EncodeL(priv);
199 CleanupStack::PushL(seq);
200 Pkcs8Utils::WriteSequenceL(_L("ExportedDSA.txt"), *seq);
201 CleanupStack::PopAndDestroy(seq);
204 LOCAL_D void DoTestsRSAL(CDecPKCS8Data& decoded)
206 CPKCS8KeyPairRSA* keypair = static_cast<CPKCS8KeyPairRSA*>(decoded.KeyPairData());
208 const CRSAPrivateKeyCRT& priv = static_cast<const CRSAPrivateKeyCRT&>(keypair->PrivateKey());
210 const CRSAPublicKey& pub = keypair->PublicKey();
213 CASN1EncSequence* seq = TASN1EncPKCS8::EncodeL(priv, pub);
215 CleanupStack::PushL(seq);
216 Pkcs8Utils::WriteSequenceL(_L("ExportedRSA.txt"), *seq);
217 CleanupStack::PopAndDestroy(seq);
221 LOCAL_D void DoTestsRSAEncryptedL(CDecPKCS8Data& decoded)
223 CPKCS8KeyPairRSA* keypair = static_cast<CPKCS8KeyPairRSA*>(decoded.KeyPairData());
225 const CRSAPrivateKeyCRT& priv = static_cast<const CRSAPrivateKeyCRT&>(keypair->PrivateKey());
226 const CRSAPublicKey& pub = keypair->PublicKey();
228 TPBPassword pass(_L(""));
230 CSystemRandom* rand = CSystemRandom::NewLC();
231 HBufC8* saltc = HBufC8::NewMaxLC(16);
232 TPtr8 salt(saltc->Des());
234 TRAPD(err, rand->GenerateBytesL(salt));
235 if((err != KErrNone) && (err != KErrNotSecure))
238 HBufC8* ivc = HBufC8::NewMaxLC(8);
240 TPtr8 iv(ivc->Des());
242 TRAP(err, rand->GenerateBytesL(iv));
243 if((err != KErrNone) && (err != KErrNotSecure))
246 CPBEncryptParms* params = CPBEncryptParms::NewLC(ECipher3DES_CBC, salt, iv, 2048);
247 CPBEncryptElement* encryptElement = CPBEncryptElement::NewLC(pass, *params);
248 CPBEncryptor* encryptor = encryptElement->NewEncryptLC();
250 CASN1EncSequence* seq = TASN1EncPKCS8::EncodeEncryptedL(priv, pub, *encryptor, *params);
252 CleanupStack::PopAndDestroy(encryptor);
253 CleanupStack::PopAndDestroy(encryptElement);
254 CleanupStack::PopAndDestroy(params);
255 CleanupStack::PopAndDestroy(ivc);
256 CleanupStack::PopAndDestroy(saltc);
257 CleanupStack::PopAndDestroy(rand);
259 CleanupStack::PushL(seq);
260 _LIT(fn, "ExportedRSA_Encrypted.txt");
261 Pkcs8Utils::WriteSequenceL(fn, *seq);
262 CleanupStack::PopAndDestroy(seq);
267 * 1st parameter dsa cleartext key
268 * 2nd parameter dsa encrypted key
269 * 3rd parameter rsa cleartext key
270 * 4th parameter rsa encrypted key
272 LOCAL_D void DoTestsL()
274 HBufC* fileName = Pkcs8Utils::GetArgumentL(0);
275 CleanupStack::PushL(fileName);
277 CDecPKCS8Data* decoded = Pkcs8Utils::getPkcsDataL(*fileName);
278 CleanupStack::PopAndDestroy(fileName);
280 CleanupStack::PushL(decoded);
281 DoTestsDSAL(*decoded);
283 DoTestsDSAEncryptedL(*decoded);
284 CleanupStack::PopAndDestroy(decoded);
286 fileName = Pkcs8Utils::GetArgumentL(1);
287 CleanupStack::PushL(fileName);
289 decoded = Pkcs8Utils::getPkcsDataL(*fileName);
290 CleanupStack::PopAndDestroy(fileName);
292 CleanupStack::PushL(decoded);
293 DoTestsRSAL(*decoded);
295 DoTestsRSAEncryptedL(*decoded);
296 CleanupStack::PopAndDestroy(decoded);
299 LOCAL_C void ProcessL()
301 HBufC* arg = Pkcs8Utils::GetArgumentL(0);
302 _LIT(attr, "-attribute");
303 if (arg->Find(attr)!=KErrNotFound)
305 TRAPD(err, GenerateAndSaveL(*Pkcs8Utils::GetArgumentL(1), *Pkcs8Utils::GetArgumentL(2)));
309 TRAPD(err, DoTestsL());
317 * Command line parameters are
318 * [0] -attribute [1] pkcs8 original file name [2] output file name
322 GLDEF_C TInt E32Main() // main function called by E32
325 CTrapCleanup* cleanup=CTrapCleanup::New(); // get clean-up stack
327 TRAPD(err, ProcessL());
329 delete cleanup; // destroy clean-up stack
331 return 0; // and return