cryptoservices/asnpkcs/test/tpkcs8enc/pkcs8Tester.cpp
changeset 0 2c201484c85f
child 8 35751d3474b7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cryptoservices/asnpkcs/test/tpkcs8enc/pkcs8Tester.cpp	Wed Jul 08 11:25:26 2009 +0100
@@ -0,0 +1,329 @@
+/*
+* 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: 
+* Test program for PKCS8 Encoding
+*
+*/
+
+
+
+
+
+/**
+ @file
+*/
+
+#include <e32test.h>
+#include <e32std.h>
+#include <U32STD.H>
+#include <asn1enc.h>
+#include <asnpkcs.h>
+#include <pbe.h>
+#include <pbebase.h>
+#include <pbedata.h>
+#include <random.h>
+#include <asymmetrickeys.h>
+ 
+#include <bigint.h>
+  
+#include "pkcs8tester.h"
+
+const TInt KErrEmptyKeyFile = -99990;
+
+/**
+ * Extracts the nPos command line argument.
+ */
+ HBufC* Pkcs8Utils::GetArgumentL(TInt nPos)
+        {
+		HBufC *argv = HBufC::NewLC(User::CommandLineLength());
+		TPtr cmd(argv->Des());
+		User::CommandLine(cmd);
+        TLex arguments(cmd);
+
+        // finds nth parameter
+        while(nPos && !arguments.Eos())
+                {
+                TPtrC token = arguments.NextToken();
+                if(token.Length() > 0)
+                        nPos--;
+                }
+
+        HBufC* result = NULL;
+        if(!arguments.Eos())
+                {
+                TPtrC testfile(arguments.NextToken());
+
+                if(testfile.Length() > 0)
+                        result = testfile.AllocL();
+                };
+
+        // no parameter found, but must return something so..
+        if(!result)
+                result = HBufC::NewL(0);
+
+        CleanupStack::PopAndDestroy(argv);
+
+        return result;
+        }
+        
+ CDecPKCS8Data* Pkcs8Utils::getPkcsDataL(TDesC& fileName)
+	{
+	// First import a PKCS8 private key from file
+	RFs fs;
+	CleanupClosePushL(fs);
+	User::LeaveIfError(fs.Connect());
+
+	RFile file;
+	CleanupClosePushL(file);	
+	TInt r = file.Open(fs, fileName, EFileRead);
+	User::LeaveIfError(r);
+        
+	TInt fileSize = 0;
+	User::LeaveIfError(file.Size(fileSize));
+
+	if (fileSize <= 0)
+	{
+		User::Leave(KErrEmptyKeyFile);
+	}
+
+	HBufC8* buf = HBufC8::NewMaxLC(fileSize);	
+	TPtr8 data(buf->Des());
+	data.FillZ();
+	User::LeaveIfError(file.Read(data, fileSize));
+        
+	CDecPKCS8Data* decoded = TASN1DecPKCS8::DecodeDERL(buf->Des());	
+
+	CleanupStack::PopAndDestroy(buf);
+	CleanupStack::PopAndDestroy(&file);
+	CleanupStack::PopAndDestroy(&fs);
+	//CleanupStack::PopAndDestroy(fileName);
+	
+	return decoded;
+	}       
+ 
+ void Pkcs8Utils::WriteSequenceL(const TDesC& fn, CASN1EncSequence& seq)
+{
+	HBufC8* seqBufc = HBufC8::NewLC(seq.LengthDER());
+	TPtr8 seqBuf(seqBufc->Des());
+	seqBuf.SetLength(seq.LengthDER());
+	TUint pos = 0;
+	
+	seq.WriteDERL(seqBuf, pos);
+
+
+	RFs fs2;
+	CleanupClosePushL(fs2);
+	User::LeaveIfError(fs2.Connect());
+
+	RFile file2;
+	CleanupClosePushL(file2);	
+	TRAPD(err, file2.Create(fs2, fn, EFileRead));
+	if (err==KErrNotFound) 
+	{
+		User::LeaveIfError(err);
+	}
+	file2.Close();		
+		
+	RFileWriteStream writer;
+	writer.PushL();
+ 
+    	User::LeaveIfError(writer.Open(fs2, fn, EFileWrite));  
+	
+	writer.WriteL(seqBuf);
+	writer.Close();
+
+	CleanupStack::PopAndDestroy(4, seqBufc);		
+}
+
+
+        
+LOCAL_D void DoTestsDSAEncryptedL(CDecPKCS8Data& decoded)
+	{
+	CPKCS8KeyPairDSA* keypair = static_cast<CPKCS8KeyPairDSA*>(decoded.KeyPairData());
+
+	const CDSAPrivateKey& priv = keypair->PrivateKey();
+	
+	TPBPassword pass(_L("")); 
+	
+	CSystemRandom* rand = CSystemRandom::NewLC();
+	HBufC8* saltc = HBufC8::NewMaxLC(16);
+	TPtr8 salt(saltc->Des());
+	salt.FillZ(); 
+	rand->GenerateBytesL(salt);
+
+	HBufC8* ivc = HBufC8::NewMaxLC(8);
+	
+	TPtr8 iv(ivc->Des());
+	iv.FillZ(); 
+	//rand->GenerateBytesL(iv);
+	
+	CPBEncryptParms* params = CPBEncryptParms::NewLC(ECipher3DES_CBC, salt, iv, 2048);
+	CPBEncryptElement* encryptElement = CPBEncryptElement::NewLC(pass, *params);
+	CPBEncryptor* encryptor = encryptElement->NewEncryptLC();
+
+	CASN1EncSequence* seq =  TASN1EncPKCS8::EncodeEncryptedL(priv, *encryptor, *params);
+	
+	CleanupStack::PopAndDestroy(encryptor);
+	CleanupStack::PopAndDestroy(encryptElement);
+	CleanupStack::PopAndDestroy(params);
+	CleanupStack::PopAndDestroy(ivc);
+	CleanupStack::PopAndDestroy(saltc);
+	CleanupStack::PopAndDestroy(rand);	
+
+	CleanupStack::PushL(seq);
+	_LIT(fn, "ExportedDSA_Encrypted.txt");
+	Pkcs8Utils::WriteSequenceL(fn, *seq);
+	CleanupStack::PopAndDestroy(seq);	
+	}
+
+
+LOCAL_D void DoTestsDSAL(CDecPKCS8Data& decoded)
+{
+	CPKCS8KeyPairDSA* keypair = static_cast<CPKCS8KeyPairDSA*>(decoded.KeyPairData());
+
+	const CDSAPrivateKey& priv = keypair->PrivateKey();
+	
+	// Now Export it
+	CASN1EncSequence* seq =  TASN1EncPKCS8::EncodeL(priv);
+
+	CleanupStack::PushL(seq);
+	Pkcs8Utils::WriteSequenceL(_L("ExportedDSA.txt"), *seq);
+	CleanupStack::PopAndDestroy(seq);	
+}
+	
+LOCAL_D void DoTestsRSAL(CDecPKCS8Data& decoded)
+{
+	CPKCS8KeyPairRSA* keypair = static_cast<CPKCS8KeyPairRSA*>(decoded.KeyPairData());
+
+	const CRSAPrivateKeyCRT& priv = static_cast<const CRSAPrivateKeyCRT&>(keypair->PrivateKey());
+
+	const CRSAPublicKey& pub = keypair->PublicKey();
+	
+	// Now Export it
+	CASN1EncSequence* seq =  TASN1EncPKCS8::EncodeL(priv, pub);
+
+	CleanupStack::PushL(seq);
+	Pkcs8Utils::WriteSequenceL(_L("ExportedRSA.txt"), *seq);
+	CleanupStack::PopAndDestroy(seq);	
+}
+
+
+LOCAL_D void DoTestsRSAEncryptedL(CDecPKCS8Data& decoded)
+{
+	CPKCS8KeyPairRSA* keypair = static_cast<CPKCS8KeyPairRSA*>(decoded.KeyPairData());
+
+	const CRSAPrivateKeyCRT& priv = static_cast<const CRSAPrivateKeyCRT&>(keypair->PrivateKey());
+	const CRSAPublicKey& pub = keypair->PublicKey();
+	
+	TPBPassword pass(_L("")); 
+	
+	CSystemRandom* rand = CSystemRandom::NewLC();
+	HBufC8* saltc = HBufC8::NewMaxLC(16);
+	TPtr8 salt(saltc->Des());
+	salt.FillZ(); 
+	rand->GenerateBytesL(salt);
+
+	HBufC8* ivc = HBufC8::NewMaxLC(8);
+	
+	TPtr8 iv(ivc->Des());
+	iv.FillZ(); 
+	rand->GenerateBytesL(iv);
+	
+	CPBEncryptParms* params = CPBEncryptParms::NewLC(ECipher3DES_CBC, salt, iv, 2048);
+	CPBEncryptElement* encryptElement = CPBEncryptElement::NewLC(pass, *params);
+	CPBEncryptor* encryptor = encryptElement->NewEncryptLC();
+
+	CASN1EncSequence* seq =  TASN1EncPKCS8::EncodeEncryptedL(priv, pub, *encryptor, *params);
+	
+	CleanupStack::PopAndDestroy(encryptor);
+	CleanupStack::PopAndDestroy(encryptElement);
+	CleanupStack::PopAndDestroy(params);
+	CleanupStack::PopAndDestroy(ivc);
+	CleanupStack::PopAndDestroy(saltc);
+	CleanupStack::PopAndDestroy(rand);	
+
+	CleanupStack::PushL(seq);
+	_LIT(fn, "ExportedRSA_Encrypted.txt");
+	Pkcs8Utils::WriteSequenceL(fn, *seq);
+	CleanupStack::PopAndDestroy(seq);	
+}
+
+
+/**
+ * 1st parameter dsa cleartext key
+ * 2nd parameter dsa encrypted key
+ * 3rd parameter rsa cleartext key
+ * 4th parameter rsa encrypted key
+ */	
+LOCAL_D void DoTestsL()
+{
+	HBufC* fileName = Pkcs8Utils::GetArgumentL(0);
+	CleanupStack::PushL(fileName);
+	
+	CDecPKCS8Data* decoded = Pkcs8Utils::getPkcsDataL(*fileName);
+	CleanupStack::PopAndDestroy(fileName);	
+
+	CleanupStack::PushL(decoded);
+	DoTestsDSAL(*decoded);
+
+	DoTestsDSAEncryptedL(*decoded);
+	CleanupStack::PopAndDestroy(decoded);	
+
+	 fileName = Pkcs8Utils::GetArgumentL(1);
+	CleanupStack::PushL(fileName);	
+
+	decoded = Pkcs8Utils::getPkcsDataL(*fileName);
+	CleanupStack::PopAndDestroy(fileName);	
+
+	CleanupStack::PushL(decoded);
+	DoTestsRSAL(*decoded);
+
+	DoTestsRSAEncryptedL(*decoded);
+	CleanupStack::PopAndDestroy(decoded);	
+}
+
+LOCAL_C void  ProcessL()
+	{
+	HBufC* arg = Pkcs8Utils::GetArgumentL(0);
+	_LIT(attr, "-attribute");
+	if (arg->Find(attr)!=KErrNotFound)
+		{
+		TRAPD(err, GenerateAndSaveL(*Pkcs8Utils::GetArgumentL(1), *Pkcs8Utils::GetArgumentL(2)));		
+		}
+	else 
+		{
+		TRAPD(err, DoTestsL());		
+		}
+	delete arg;	
+	}
+
+
+
+/**
+* Command line parameters are
+* [0] -attribute [1] pkcs8 original file name [2] output file name
+* or
+* ...
+*/
+GLDEF_C TInt E32Main() // main function called by E32
+    {
+	__UHEAP_MARK;
+	CTrapCleanup* cleanup=CTrapCleanup::New(); // get clean-up stack
+	
+	TRAPD(err, ProcessL());
+	
+	delete cleanup; // destroy clean-up stack
+	__UHEAP_MARKEND;
+	return 0; // and return
+    }