--- a/cryptoservices/filebasedcertificateandkeystores/test/tkeystore/t_open.cpp Tue Jul 21 01:04:32 2009 +0100
+++ b/cryptoservices/filebasedcertificateandkeystores/test/tkeystore/t_open.cpp Thu Sep 10 14:01:51 2009 +0300
@@ -1,1298 +1,1298 @@
-/*
-* Copyright (c) 2003-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 <e32base.h>
-#include "t_keystore_actions.h"
-#include "t_keystore_defs.h"
-#include "t_input.h"
-#include <asn1enc.h>
-#include <asn1dec.h>
-#include <x509cert.h>
-#include <x509keys.h>
-#include <asymmetrickeys.h>
-
-/*static*/ CTestAction* COpenKey::NewL(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
-{
- CTestAction* self = COpenKey::NewLC(aFs, aConsole, aOut, aTestActionSpec);
- CleanupStack::Pop(self);
- return self;
-}
-
-/*static*/ CTestAction* COpenKey::NewLC(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
-{
- COpenKey* self = new (ELeave) COpenKey(aFs, aConsole, aOut);
- CleanupStack::PushL(self);
- self->ConstructL(aTestActionSpec);
- return self;
-}
-
-COpenKey::~COpenKey()
-{
- iKeys.Close();
-}
-
-void COpenKey::PerformAction(TRequestStatus& aStatus)
-{
- switch (iState)
- {
- case EListKeysPreOpen:
- {// Currently uses the first store, change to check the script for a specific store
- CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
- ASSERT(keyStore); // Flag it up
- if (keyStore)
- keyStore->List(iKeys, iFilter, aStatus);
-
- iState = EOpenKey;
- }
- break;
-
- case EOpenKey:
- {
- CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
- ASSERT(keyStore); // Flag it up
-
- TInt keyCount = iKeys.Count();
-
- TInt i;
- for (i = 0; i < keyCount; i++)
- {
- CCTKeyInfo* keyInfo = iKeys[i];
-
- if (keyInfo->Label() == *iLabel)
- {
- switch (iType)
- {
- case ERSASign:
- keyStore->Open(*keyInfo, iRSASigner, aStatus);
- break;
- case EDSASign:
- keyStore->Open(*keyInfo, iDSASigner, aStatus);
- break;
- case EDecrypt:
- keyStore->Open(*keyInfo, iDecryptor, aStatus);
- break;
- case EDH:
- keyStore->Open(*keyInfo, iDH, aStatus);
- break;
- }
- break;
- }
- }
- iState = EFinished;
- if (i == keyCount)
- {
- TRequestStatus* status = &aStatus;
- User::RequestComplete(status, KErrNotFound);
- }
- }
- break;
-
- case EFinished:
- {
- HBufC* label = 0;
- iKeys.Close();
- if (aStatus.Int() == KErrNone)
- {
- switch (iType)
- {
- case ERSASign:
- if (iRSASigner)
- {
- label = iRSASigner->Label().AllocLC();
- iRSASigner->Release();
- }
- break;
- case EDSASign:
- if (iDSASigner)
- {
- label = iDSASigner->Label().AllocLC();
- iDSASigner->Release();
- }
- break;
- case EDecrypt:
- if (iDecryptor)
- {
- label = iDecryptor->Label().AllocLC();
- iDecryptor->Release();
- }
- case EDH:
- if (iDH)
- {
- label = iDH->Label().AllocLC();
- iDH->Release();
- }
- break;
- }
- if (*label != *iLabel)
- aStatus = KErrBadName;
- CleanupStack::PopAndDestroy(label);
- }
- TRequestStatus* status = &aStatus;
- User::RequestComplete(status, aStatus.Int());
- if (aStatus.Int()==iExpectedResult)
- {
- iResult = ETrue;
- }
- else
- {
- iResult = EFalse;
- }
-
- iActionState = EPostrequisite;
- }
- break;
- default:
- ASSERT(EFalse);
- }
-
-}
-
-void COpenKey::PerformCancel()
- {
- CUnifiedKeyStore* keystore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
- ASSERT(keystore);
-
- switch (iState)
- {
- case EOpenKey:
- keystore->CancelList();
- break;
-
- case EFinished:
- keystore->CancelOpen();
- break;
-
- default:
- break;
- }
- }
-
-void COpenKey::Reset()
- {
- iState = EListKeysPreOpen;
- iKeys.Close();
- if (iRSASigner)
- {
- iRSASigner->Release();
- iRSASigner = NULL;
- }
- if (iDSASigner)
- {
- iDSASigner->Release();
- iDSASigner = NULL;
- }
- if (iDecryptor)
- {
- iDecryptor->Release();
- iDecryptor = NULL;
- }
- if (iDH)
- {
- iDH->Release();
- iDH = NULL;
- }
- }
-
-void COpenKey::DoReportAction()
-{
- _LIT(KDeleting, "Opening...");
- iOut.writeString(KDeleting);
- iOut.writeNewLine();
-}
-
-void COpenKey::DoCheckResult(TInt aError)
-{
- if (iFinished)
- {
- TBuf<256> buf;
- if (aError == KErrNone)
- {
- _LIT(KSuccessful, "Key open success\n");
- buf.Format(KSuccessful);
- iConsole.Write(buf);
- iOut.writeString(buf);
- iOut.writeNewLine();
- }
- else
- {
- if (aError!=iExpectedResult)
- {
- _LIT(KFailed, "!!!Key open failure %d!!!\n");
- buf.Format(KFailed, aError);
- iConsole.Write(buf);
- iOut.writeString(buf);
- }
- else
- {
- _LIT(KFailed, "Key open failed, but expected\n");
- iConsole.Write(KFailed);
- iOut.writeString(KFailed);
- }
-
- iOut.writeNewLine();
- }
- }
-}
-
-COpenKey::COpenKey(RFs& aFs, CConsoleBase& aConsole, Output& aOut)
-: CKeyStoreTestAction(aFs, aConsole, aOut)
-{}
-
-void COpenKey::ConstructL(const TTestActionSpec& aTestActionSpec)
- {
- TInt pos = 0, err = 0;
- CKeyStoreTestAction::ConstructL(aTestActionSpec);
- SetKeyType(Input::ParseElement(aTestActionSpec.iActionBody, KOpenStart, KOpenEnd, pos, err));
- iState = EListKeysPreOpen;
-
- }
-void COpenKey::SetKeyType(const TDesC8& aKeyType)
-{
- if (aKeyType.Compare(KAlgRSA)==0)
- {
- iType = ERSASign;
- }
- else if (aKeyType.Compare(KAlgDSA)==0)
- {
- iType = EDSASign;
- }
- else if (aKeyType.Compare(KDecryptUsage)==0)
- {
- iType = EDecrypt;
- }
- else if (aKeyType.Compare(KAlgDH)==0)
- {
- iType = EDH;
- }
-}
-
-
-////////////////////////////////////
-// CSign
-////////////////////////////////////
-/*static*/ CTestAction* CSign::NewL(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
-{
- CTestAction* self = CSign::NewLC(aFs, aConsole, aOut, aTestActionSpec);
- CleanupStack::Pop(self);
- return self;
-}
-
-/*static*/ CTestAction* CSign::NewLC(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
-{
- CSign* self = new (ELeave) CSign(aFs, aConsole, aOut);
- CleanupStack::PushL(self);
- self->ConstructL(aTestActionSpec);
- return self;
-}
-
-CSign::~CSign()
-{
- iKeys.Close();
- delete iReadText;
- delete iExportedPublicKey;
- delete iRSASignature;
- delete iDSASignature;
- delete iHash;
-}
-
-void CSign::PerformAction(TRequestStatus& aStatus)
-{
- // Jump straight to final state if an error occured
- if (aStatus.Int()!=KErrNone)
- {
- iState=EFinished;
- }
-
- switch (iState)
- {
- case EListKeysPreOpen:
- {
- CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
- ASSERT(keyStore); // Flag it up
- if (keyStore)
- keyStore->List(iKeys, iFilter, aStatus);
-
- iState = EOpenKey;
- }
- break;
-
- case EOpenKey:
- {
- CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
- ASSERT(keyStore); // Flag it up
-
- TInt keyCount = iKeys.Count();
-
- TInt i;
- for (i = 0; i < keyCount; i++)
- {
- CCTKeyInfo* keyInfo = iKeys[i];
-
- if (keyInfo->Label() == *iLabel)
- {
- switch (iType)
- {
- case ERSASign:
- keyStore->Open(*keyInfo, iRSASigner, aStatus);
- break;
- case EDSASign:
- keyStore->Open(*keyInfo, iDSASigner, aStatus);
- break;
- case EDH:
- case EDecrypt:
- break; // Nothing to do, for the compiler
- }
- break;
- }
- }
- iState = ESign;
- if (i == keyCount)
- {
- TRequestStatus* status = &aStatus;
- User::RequestComplete(status, KErrNotFound);
- }
- }
- break;
-
- case ESign:
- {
- switch (iType)
- {
- case ERSASign:
- {
- if (iHash)
- {
- if (iFailHashDigest) // Don't hash it, fail deliberately
- iRSASigner->Sign(*iReadText,iRSASignature,aStatus);
- else // message gets signed by the keystore
- iRSASigner->SignMessage(*iReadText,iRSASignature,aStatus);
- }
- else
- {
- iRSASigner->Sign(*iReadText,iRSASignature,aStatus);
- }
- }
- break;
- case EDSASign:
- {
- if (iHash)
- {
- if (iFailHashDigest) // Don't hash it, deliberately fail it
- iDSASigner->Sign(*iReadText,iDSASignature,aStatus);
- else // message gets signed by the keystore
- iDSASigner->SignMessage(*iReadText,iDSASignature,aStatus);
- }
- else
- {
- iDSASigner->Sign(*iReadText,iDSASignature,aStatus);
- }
- }
- break;
- default:
- ASSERT(EFalse);
- }
- iState = EExportPublic;
- }
- break;
-
- case EExportPublic:
- {
- CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
- ASSERT(keyStore); // Flag it up
- TInt keyCount = iKeys.Count();
- TInt i;
- for (i = 0; i < keyCount; i++)
- {
- CCTKeyInfo* keyInfo = iKeys[i];
-
- if (keyInfo->Label() == *iLabel)
- {
- iExportHandle = keyInfo->Handle();
-
- switch (iType)
- {
- case ERSASign:
- keyStore->ExportPublic(iExportHandle, iExportedPublicKey, aStatus);
- break;
- case EDSASign:
- keyStore->ExportPublic(iExportHandle, iExportedPublicKey, aStatus);
- break;
- case EDH:
- case EDecrypt:
- break; // Nothing to do, for the compiler
- }
- break;
- }
- }
- iState = EVerify;
- if (i == keyCount)
- {
- TRequestStatus* status = &aStatus;
- User::RequestComplete(status, KErrNotFound);
- }
- }
- break;
-
- case EVerify:
- {
- TInt keyCount = iKeys.Count();
- TInt i;
- for (i = 0; i < keyCount; i++)
- {
- CCTKeyInfo* keyInfo = iKeys[i];
-
- if (keyInfo->Label() == *iLabel)
- {
- iExportHandle = keyInfo->Handle();
- CX509SubjectPublicKeyInfo* ki =
- CX509SubjectPublicKeyInfo::NewLC(*iExportedPublicKey);
-
- switch (iType)
- {
- case ERSASign:
- {
- TX509KeyFactory factory;
- CRSAPublicKey* key = factory.RSAPublicKeyL(ki->KeyData());
- CleanupStack::PushL(key);
-
- CRSAPKCS1v15Verifier* verifier = NULL;
-
- if (iHash) // Must compare with hash of original data
- {
- verifier = CRSAPKCS1v15Verifier::NewLC(*key);
- iHash->Reset();
- iVerifyResult = verifier->VerifyL(iHash->Final(*iReadText), *iRSASignature);
- }
- else
- {
- verifier = CRSAPKCS1v15Verifier::NewLC(*key);
- iVerifyResult = verifier->VerifyL(*iReadText, *iRSASignature);
- }
-
- _LIT(KReturned, "Returned... ");
- iOut.writeString(KReturned);
- iOut.writeNewLine();
-
- CleanupStack::PopAndDestroy(2, key);
- }
- break;
- case EDSASign:
- {
- TX509KeyFactory factory;
- CDSAPublicKey* key = factory.DSAPublicKeyL(ki->EncodedParams(), ki->KeyData());
- CleanupStack::PushL(key);
-
- CDSAVerifier* verifier = CDSAVerifier::NewLC(*key);
- if (iHash) // Must compare with hash of original value
- {
- iHash->Reset();
- iVerifyResult = verifier->VerifyL(iHash->Final(*iReadText),*iDSASignature);
- }
- else
- {
- iVerifyResult = verifier->VerifyL(*iReadText,*iDSASignature);
- }
- _LIT(KReturned, "Returned... ");
- iOut.writeString(KReturned);
- iOut.writeNewLine();
- CleanupStack::PopAndDestroy(verifier);
- CleanupStack::PopAndDestroy(key);
- }
- break;
- default:
- ASSERT(EFalse);
-
- }
- CleanupStack::PopAndDestroy(ki);
- }
- }
- iState = EFinished;
- TRequestStatus* status = &aStatus;
- if (!iVerifyResult)
- {
- _LIT(KVerifyFail, "**Verify failed**");
- iOut.writeString(KVerifyFail);
- iOut.writeNewLine();
-
- // Flat verify failed as KErrGeneral
- if (aStatus.Int() == KErrNone)
- {
- aStatus = KErrGeneral;
- }
- }
- User::RequestComplete(status, aStatus.Int());
- }
- break;
-
- case EFinished:
- {
- iActionState = EPostrequisite;
- iResult = (aStatus.Int() == iExpectedResult);
-
- if ((aStatus.Int() != KErrNone)&&(aStatus!=KErrNoMemory))
- {
- _LIT(KExportFail," !Failed when exporting public key! ");
- iOut.writeString(KExportFail);
- }
-
- iKeys.Close();
- switch (iType)
- {
- case ERSASign:
- if (iRSASigner)
- iRSASigner->Release();
- break;
- case EDSASign:
- if (iDSASigner)
- iDSASigner->Release();
- break;
- case EDecrypt:
- if (iDecryptor)
- iDecryptor->Release();
- case EDH:
- if (iDH)
- iDH->Release();
- break;
- }
- TRequestStatus* status = &aStatus;
- User::RequestComplete(status, aStatus.Int());
- }
- break;
- default:
- ASSERT(EFalse);
- }
-
-}
-
-void CSign::PerformCancel()
- {
- CUnifiedKeyStore* keystore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
- ASSERT(keystore);
-
- switch (iState)
- {
- case EOpenKey:
- keystore->CancelList();
- break;
-
- case ESign:
- keystore->CancelOpen();
- break;
-
- case EExportPublic:
- switch (iType)
- {
- case ERSASign:
- ASSERT(iRSASigner);
- iRSASigner->CancelSign();
- break;
-
- case EDSASign:
- ASSERT(iDSASigner);
- iDSASigner->CancelSign();
- break;
-
- default:
- break;
- }
- break;
-
- case EVerify:
- keystore->CancelExportPublic();
- break;
-
- default:
- break;
- }
- }
-
-void CSign::Reset()
- {
- iState = EListKeysPreOpen;
- iKeys.Close();
- if (iRSASigner)
- {
- iRSASigner->Release();
- iRSASigner = NULL;
- }
- if (iDSASigner)
- {
- iDSASigner->Release();
- iDSASigner = NULL;
- }
- delete iExportedPublicKey;
- iExportedPublicKey = NULL;
- delete iRSASignature;
- iRSASignature = NULL;
- delete iDSASignature;
- iDSASignature = NULL;
- }
-
-void CSign::DoReportAction()
-{
- _LIT(KSigning, "Signing... ");
- iOut.writeString(KSigning);
- iOut.writeNewLine();
-}
-
-void CSign::DoCheckResult(TInt aError)
-{
- if (iFinished)
- {
- TBuf<256> buf;
- if (aError == KErrNone)
- {
- iOut.writeNewLine();
- _LIT(KSuccessful, "Sign success\n");
- buf.Format(KSuccessful);
- iConsole.Write(buf);
- iOut.writeString(buf);
- iOut.writeNewLine();
- }
- else
- {
- if (aError!=iExpectedResult)
- {
- _LIT(KFailed, "!!!Sign failure %d!!!\n");
- buf.Format(KFailed, aError);
- iConsole.Write(buf);
- iOut.writeString(buf);
- }
- else
- {
- _LIT(KFailed, "Sign failed, but expected\n");
- iConsole.Write(KFailed);
- iOut.writeString(KFailed);
- }
-
- iOut.writeNewLine();
- }
- }
-}
-
-CSign::CSign(RFs& aFs, CConsoleBase& aConsole, Output& aOut)
-: CKeyStoreTestAction(aFs, aConsole, aOut)
-{}
-
-void CSign::ConstructL(const TTestActionSpec& aTestActionSpec)
-{
- CKeyStoreTestAction::ConstructL(aTestActionSpec);
-
- SetKeyType(Input::ParseElement(aTestActionSpec.iActionBody, KOpenStart));
- SetDigestSignL(Input::ParseElement(aTestActionSpec.iActionBody, KSignDigestStart));
- SetSignText(Input::ParseElement(aTestActionSpec.iActionBody, KTextStart, KTextEnd));
-
- iFilter.iPolicyFilter = TCTKeyAttributeFilter::EAllKeys;
-
- iState = EListKeysPreOpen;
-}
-
-
-void CSign::SetKeyType(const TDesC8& aKeyType)
-{
- if (aKeyType.Compare(KAlgRSA)==0)
- {
- iType = ERSASign;
- }
- else if (aKeyType.Compare(KAlgDSA)==0)
- {
- iType = EDSASign;
- }
- else if (aKeyType.Compare(KDecryptUsage)==0)
- {
- iType = EDecrypt;
- }
- else if (aKeyType.Compare(KAlgDH)==0)
- {
- iType = EDH;
- }
-}
-
-void CSign::SetDigestSignL(const TDesC8& aSignDigestDesc)
-{
- TLex8 lexer(aSignDigestDesc);
- TInt digest = 0;
- lexer.Val(digest);
-
- if (digest > 0)
- iHash = CMessageDigestFactory::NewDigestL(CMessageDigest::ESHA1);
-
- if (digest==2)
- iFailHashDigest = ETrue;
-}
-
-void CSign::SetSignText(const TDesC8& aText)
-{
- iReadText = HBufC8::NewMax(aText.Size());
- if (iReadText)
- {
- TPtr8 theText(iReadText->Des());
- theText.FillZ();
- theText.Copy(aText);
- }
-}
-
-////////////////////////////////////
-// CDecrypt
-////////////////////////////////////
-/*static*/ CTestAction* CDecrypt::NewL(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
-{
- CTestAction* self = CDecrypt::NewLC(aFs, aConsole, aOut, aTestActionSpec);
- CleanupStack::Pop(self);
- return self;
-}
-
-/*static*/ CTestAction* CDecrypt::NewLC(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
-{
- CDecrypt* self = new (ELeave) CDecrypt(aFs, aConsole, aOut);
- CleanupStack::PushL(self);
- self->ConstructL(aTestActionSpec);
- return self;
-}
-
-CDecrypt::~CDecrypt()
-{
- iKeys.Close();
- delete iReadText;
- delete iPlainText;
- delete iPublic;
-}
-
-void CDecrypt::PerformAction(TRequestStatus& aStatus)
-{
- // Jump straight to final state if an error occured
- if (aStatus.Int()!=KErrNone)
- {
- iState=EFinished;
- }
-
- switch (iState)
- {
- case EListKeysPreOpen:
- {// Currently uses the first store, change to check the script for a specific store
- CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
- ASSERT(keyStore); // Flag it up
- if (keyStore)
- keyStore->List(iKeys, iFilter, aStatus);
-
- iState = EOpenKey;
- }
- break;
-
- case EOpenKey:
- {
- CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
- ASSERT(keyStore); // Flag it up
-
- TInt keyCount = iKeys.Count();
-
- TInt i;
- for (i = 0; i < keyCount; i++)
- {
- CCTKeyInfo* keyInfo = iKeys[i];
-
- if (keyInfo->Label() == *iLabel)
- {
- keyStore->Open(*keyInfo, iDecryptor, aStatus);
- break;
- }
- }
- iState = EExportPublic;
- if (i == keyCount)
- {
- TRequestStatus* status = &aStatus;
- User::RequestComplete(status, KErrNotFound);
- }
- }
- break;
-
- case EExportPublic:
- {
- if (aStatus.Int()!=KErrNone)
- {
- _LIT(KSignFail," !Failed when opening! ");
- iOut.writeString(KSignFail);
- iState=EFinished;
- // need to set it to true so that test is true if some error was expected
- iVerifyResult=ETrue;
- TRequestStatus* status = &aStatus;
- User::RequestComplete(status, aStatus.Int());
- break;
- }
-
- CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
- ASSERT(keyStore); // Flag it up
-
- TInt keyCount = iKeys.Count();
-
- TInt i;
- for (i = 0; i < keyCount; i++)
- {
- CCTKeyInfo* keyInfo = iKeys[i];
-
- if (keyInfo->Label() == *iLabel)
- {
- iExportHandle = keyInfo->Handle();
-
- keyStore->ExportPublic(iExportHandle, iPublic, aStatus);
- break;
- }
- }
- iState = EDecrypt;
- if (i == keyCount)
- {
- TRequestStatus* status = &aStatus;
- User::RequestComplete(status, KErrNotFound);
- }
- }
- break;
-
- case EDecrypt:
- {
-
- if (aStatus.Int()!=KErrNone)
- {
- iState=EFinished;
- TRequestStatus* status = &aStatus;
- User::RequestComplete(status, aStatus.Int());
- break;
- }
-
- CX509SubjectPublicKeyInfo* ki =
- CX509SubjectPublicKeyInfo::NewLC(*iPublic);
-
- TX509KeyFactory factory;
- CRSAPublicKey* key = factory.RSAPublicKeyL(ki->KeyData());
- CleanupStack::PushL(key);
-
- // Encrypt with public key
- CRSAPKCS1v15Encryptor* encryptor = CRSAPKCS1v15Encryptor::NewLC(*key);
- HBufC8* cipherText = HBufC8::NewLC(encryptor->MaxOutputLength());
- TPtr8 cipherTextPtr = cipherText->Des();
-
- encryptor->EncryptL(*iReadText, cipherTextPtr);
-
- // Now decrypt again
- iPlainText = HBufC8::NewMaxL(100);
- iPlainTextPtr.Set(iPlainText->Des());
- iDecryptor->Decrypt(*cipherText, iPlainTextPtr, aStatus);
-
- CleanupStack::PopAndDestroy(cipherText);
- CleanupStack::PopAndDestroy(encryptor);
- CleanupStack::PopAndDestroy(key);
- CleanupStack::PopAndDestroy(ki);
-
- iState = EFinished;
- }
- break;
-
- case EFinished:
- {
- if (aStatus == KErrNone && (!iPlainText ||
- *iPlainText != *iReadText))
- {
- aStatus = KErrGeneral; // Decryption failed
- }
-
- iActionState = EPostrequisite;
- iResult = (aStatus.Int() == iExpectedResult);
-
- if (iDecryptor)
- {
- iDecryptor->Release();
- }
- TRequestStatus* status = &aStatus;
- User::RequestComplete(status, aStatus.Int());
- }
- break;
- default:
- ASSERT(EFalse);
- }
-
-}
-
-void CDecrypt::PerformCancel()
- {
- CUnifiedKeyStore* keystore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
- ASSERT(keystore);
-
- switch (iState)
- {
- case EOpenKey:
- keystore->CancelList();
- break;
-
- case EExportPublic:
- keystore->CancelOpen();
- break;
-
- case EDecrypt:
- keystore->CancelExportPublic();
- break;
-
- case EFinished:
- ASSERT(iDecryptor);
- iDecryptor->CancelDecrypt();
- break;
-
- default:
- break;
- }
- }
-
-void CDecrypt::Reset()
- {
- iState = EListKeysPreOpen;
- iKeys.Close();
- if (iDecryptor)
- {
- iDecryptor->Release();
- iDecryptor = NULL;
- }
- delete iPlainText;
- iPlainText = NULL;
- delete iPublic;
- iPublic = NULL;
- }
-
-void CDecrypt::DoReportAction()
-{
- _LIT(KSigning, "Decrypting... ");
- iOut.writeString(KSigning);
- iOut.writeNewLine();
-// iOut.writeString(*iReadText);
-// iOut.writeNewLine();
-}
-
-void CDecrypt::DoCheckResult(TInt aError)
-{
- if (iFinished)
- {
- TBuf<256> buf;
- if (aError == KErrNone)
- {
- iOut.writeNewLine();
- _LIT(KSuccessful, "Decrypt success\n");
- buf.Format(KSuccessful);
- iConsole.Write(buf);
- iOut.writeString(buf);
- iOut.writeNewLine();
- }
- else
- {
- if (aError!=iExpectedResult)
- {
- _LIT(KFailed, "!!!Decrypt failure %d!!!\n");
- buf.Format(KFailed, aError);
- iConsole.Write(buf);
- iOut.writeString(buf);
- }
- else
- {
- _LIT(KFailed, "Decrypt failed, but expected\n");
- iConsole.Write(KFailed);
- iOut.writeString(KFailed);
- }
-
- iOut.writeNewLine();
- }
- }
-}
-
-CDecrypt::CDecrypt(RFs& aFs, CConsoleBase& aConsole, Output& aOut)
- : CKeyStoreTestAction(aFs, aConsole, aOut), iPlainTextPtr(0,0)
-{}
-
-void CDecrypt::ConstructL(const TTestActionSpec& aTestActionSpec)
-{
- CKeyStoreTestAction::ConstructL(aTestActionSpec);
-
- SetSignText(Input::ParseElement(aTestActionSpec.iActionBody, KTextStart));
- iFilter.iPolicyFilter = TCTKeyAttributeFilter::EAllKeys;
-
- iState = EListKeysPreOpen;
-}
-
-void CDecrypt::SetSignText(const TDesC8& aText)
-{
- iReadText = HBufC8::NewMax(aText.Size());
- if (iReadText)
- {
- TPtr8 theText(iReadText->Des());
- theText.FillZ();
- theText.Copy(aText);
- }
-}
-
-////////////////////////////////////
-// CDerive
-////////////////////////////////////
-
-/*static*/ CTestAction* CDerive::NewL(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
-{
- CTestAction* self = CDerive::NewLC(aFs, aConsole, aOut, aTestActionSpec);
- CleanupStack::Pop(self);
- return self;
-}
-
-/*static*/ CTestAction* CDerive::NewLC(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
-{
- CDerive* self = new (ELeave) CDerive(aFs, aConsole, aOut);
- CleanupStack::PushL(self);
- self->ConstructL(aTestActionSpec);
- return self;
-}
-
-CDerive::~CDerive()
- {
- iKeys.Close();
- iN.Close();
- iG.Close();
- if (iDH)
- {
- iDH->Release();
- }
- delete iPublicKey;
- delete iOutput;
- delete iRemote;
- }
-
-void CDerive::PerformAction(TRequestStatus& aStatus)
- {
- // Jump straight to final state if an error occured
- if (aStatus.Int()!=KErrNone)
- {
- iState=EFinished;
- }
-
- switch (iState)
- {
- case EListKeysPreOpen:
- {
- CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
- ASSERT(keyStore); // Flag it up
- if (keyStore)
- keyStore->List(iKeys, iFilter, aStatus);
-
- iState = EOpenKey;
- }
- break;
-
- case EOpenKey:
- {
- CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
- ASSERT(keyStore); // Flag it up
-
- TInt keyCount = iKeys.Count();
-
- TInt i;
- for (i = 0; i < keyCount; i++)
- {
- CCTKeyInfo* keyInfo = iKeys[i];
-
- if (keyInfo->Label() == *iLabel)
- {
- keyStore->Open(*keyInfo, iDH, aStatus);
- break;
- }
- }
- iState = EExportPublic;
- if (i == keyCount)
- {
- TRequestStatus* status = &aStatus;
- User::RequestComplete(status, KErrNotFound);
- }
- }
- break;
-
- case EExportPublic:
- {
- ASSERT(iDH);
- iDH->PublicKey(iN, iG, iPublicKey, aStatus);
- iState = EDerive;
- }
- break;
-
- case EDerive:
- {
- if (aStatus.Int()!=KErrNone)
- {
- iState=EFinished;
- TRequestStatus* status = &aStatus;
- User::RequestComplete(status, aStatus.Int());
- break;
- }
-
- ASSERT(iPublicKey);
- iDH->Agree(iRemote->PublicKey(), iOutput, aStatus);
-
- iState = EFinished;
- }
- break;
-
- case EFinished:
- {
- if (aStatus.Int()==KErrNone)
- {
- CDH* dh = CDH::NewLC(iRemote->PrivateKey());
- const HBufC8* output = dh->AgreeL(*iPublicKey);
- CleanupStack::PopAndDestroy(dh);
-
- if (aStatus == KErrNone && (!iOutput ||
- *iOutput != *output))
- {
- aStatus = KErrGeneral; // Agree failed
- }
-
- delete const_cast<HBufC8*>(output);
- }
-
- iActionState = EPostrequisite;
- iResult = (aStatus.Int() == iExpectedResult);
-
- if (aStatus != KErrNone)
- {
- _LIT(KSignFail," !Failed when agreeing key!");
- iOut.writeString(KSignFail);
- }
-
- TRequestStatus* status = &aStatus;
- User::RequestComplete(status, aStatus.Int());
- }
- break;
- default:
- ASSERT(EFalse);
- }
- }
-
-void CDerive::PerformCancel()
- {
- CUnifiedKeyStore* keystore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
- ASSERT(keystore);
-
- switch (iState)
- {
- case EOpenKey:
- keystore->CancelList();
- break;
-
- case EExportPublic:
- keystore->CancelOpen();
- break;
-
- case EDerive:
- keystore->CancelExportPublic();
- break;
-
- case EFinished:
- ASSERT(iDH);
- iDH->CancelAgreement();
- break;
-
- default:
- break;
- }
- }
-
-void CDerive::Reset()
- {
- iState = EListKeysPreOpen;
- iKeys.Close();
- if (iDH)
- {
- iDH->Release();
- iDH = NULL;
- }
- delete iPublicKey;
- iPublicKey = NULL;
- delete iOutput;
- iOutput = NULL;
- }
-
-void CDerive::DoReportAction()
-{
- _LIT(KSigning, "Deriving key... ");
- iOut.writeString(KSigning);
- iOut.writeNewLine();
-}
-
-void CDerive::DoCheckResult(TInt aError)
-{
- if (iFinished)
- {
- TBuf<256> buf;
- if (aError == KErrNone)
- {
- iOut.writeNewLine();
- _LIT(KSuccessful, "Derive success\n");
- buf.Format(KSuccessful);
- iConsole.Write(buf);
- iOut.writeString(buf);
- iOut.writeNewLine();
- }
- else
- {
- if (aError!=iExpectedResult)
- {
- _LIT(KFailed, "!!!Derive failure %d!!!\n");
- buf.Format(KFailed, aError);
- iConsole.Write(buf);
- iOut.writeString(buf);
- }
- else
- {
- _LIT(KFailed, "Derive failed, but expected\n");
- iConsole.Write(KFailed);
- iOut.writeString(KFailed);
- }
-
- iOut.writeNewLine();
- }
- }
-}
-
-CDerive::CDerive(RFs& aFs, CConsoleBase& aConsole, Output& aOut)
- : CKeyStoreTestAction(aFs, aConsole, aOut)
-{}
-
-void CDerive::ConstructL(const TTestActionSpec& aTestActionSpec)
-{
- CKeyStoreTestAction::ConstructL(aTestActionSpec);
-
- // Set parameters
- HBufC8* nData = Input::ParseElementHexL(aTestActionSpec.iActionBody, _L8("<n>"));
- CleanupStack::PushL(nData);
- iN = RInteger::NewL(*nData);
- CleanupStack::PopAndDestroy(nData);
- HBufC8* gData = Input::ParseElementHexL(aTestActionSpec.iActionBody, _L8("<g>"));
- CleanupStack::PushL(gData);
- iG = RInteger::NewL(*gData);
- CleanupStack::PopAndDestroy(gData);
-
- // Generate 'remote' key pair
- RInteger n = RInteger::NewL(iN);
- CleanupStack::PushL(n);
- RInteger g = RInteger::NewL(iG);
- CleanupStack::PushL(g);
- iRemote = CDHKeyPair::NewL(n, g);
- CleanupStack::Pop(2); // n, g
-
- iFilter.iPolicyFilter = TCTKeyAttributeFilter::EAllKeys;
-
- iState = EListKeysPreOpen;
-}
+/*
+* Copyright (c) 2003-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 <e32base.h>
+#include "t_keystore_actions.h"
+#include "t_keystore_defs.h"
+#include "t_input.h"
+#include <asn1enc.h>
+#include <asn1dec.h>
+#include <x509cert.h>
+#include <x509keys.h>
+#include <asymmetrickeys.h>
+
+/*static*/ CTestAction* COpenKey::NewL(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
+{
+ CTestAction* self = COpenKey::NewLC(aFs, aConsole, aOut, aTestActionSpec);
+ CleanupStack::Pop(self);
+ return self;
+}
+
+/*static*/ CTestAction* COpenKey::NewLC(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
+{
+ COpenKey* self = new (ELeave) COpenKey(aFs, aConsole, aOut);
+ CleanupStack::PushL(self);
+ self->ConstructL(aTestActionSpec);
+ return self;
+}
+
+COpenKey::~COpenKey()
+{
+ iKeys.Close();
+}
+
+void COpenKey::PerformAction(TRequestStatus& aStatus)
+{
+ switch (iState)
+ {
+ case EListKeysPreOpen:
+ {// Currently uses the first store, change to check the script for a specific store
+ CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
+ ASSERT(keyStore); // Flag it up
+ if (keyStore)
+ keyStore->List(iKeys, iFilter, aStatus);
+
+ iState = EOpenKey;
+ }
+ break;
+
+ case EOpenKey:
+ {
+ CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
+ ASSERT(keyStore); // Flag it up
+
+ TInt keyCount = iKeys.Count();
+
+ TInt i;
+ for (i = 0; i < keyCount; i++)
+ {
+ CCTKeyInfo* keyInfo = iKeys[i];
+
+ if (keyInfo->Label() == *iLabel)
+ {
+ switch (iType)
+ {
+ case ERSASign:
+ keyStore->Open(*keyInfo, iRSASigner, aStatus);
+ break;
+ case EDSASign:
+ keyStore->Open(*keyInfo, iDSASigner, aStatus);
+ break;
+ case EDecrypt:
+ keyStore->Open(*keyInfo, iDecryptor, aStatus);
+ break;
+ case EDH:
+ keyStore->Open(*keyInfo, iDH, aStatus);
+ break;
+ }
+ break;
+ }
+ }
+ iState = EFinished;
+ if (i == keyCount)
+ {
+ TRequestStatus* status = &aStatus;
+ User::RequestComplete(status, KErrNotFound);
+ }
+ }
+ break;
+
+ case EFinished:
+ {
+ HBufC* label = 0;
+ iKeys.Close();
+ if (aStatus.Int() == KErrNone)
+ {
+ switch (iType)
+ {
+ case ERSASign:
+ if (iRSASigner)
+ {
+ label = iRSASigner->Label().AllocLC();
+ iRSASigner->Release();
+ }
+ break;
+ case EDSASign:
+ if (iDSASigner)
+ {
+ label = iDSASigner->Label().AllocLC();
+ iDSASigner->Release();
+ }
+ break;
+ case EDecrypt:
+ if (iDecryptor)
+ {
+ label = iDecryptor->Label().AllocLC();
+ iDecryptor->Release();
+ }
+ case EDH:
+ if (iDH)
+ {
+ label = iDH->Label().AllocLC();
+ iDH->Release();
+ }
+ break;
+ }
+ if (*label != *iLabel)
+ aStatus = KErrBadName;
+ CleanupStack::PopAndDestroy(label);
+ }
+ TRequestStatus* status = &aStatus;
+ User::RequestComplete(status, aStatus.Int());
+ if (aStatus.Int()==iExpectedResult)
+ {
+ iResult = ETrue;
+ }
+ else
+ {
+ iResult = EFalse;
+ }
+
+ iActionState = EPostrequisite;
+ }
+ break;
+ default:
+ ASSERT(EFalse);
+ }
+
+}
+
+void COpenKey::PerformCancel()
+ {
+ CUnifiedKeyStore* keystore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
+ ASSERT(keystore);
+
+ switch (iState)
+ {
+ case EOpenKey:
+ keystore->CancelList();
+ break;
+
+ case EFinished:
+ keystore->CancelOpen();
+ break;
+
+ default:
+ break;
+ }
+ }
+
+void COpenKey::Reset()
+ {
+ iState = EListKeysPreOpen;
+ iKeys.Close();
+ if (iRSASigner)
+ {
+ iRSASigner->Release();
+ iRSASigner = NULL;
+ }
+ if (iDSASigner)
+ {
+ iDSASigner->Release();
+ iDSASigner = NULL;
+ }
+ if (iDecryptor)
+ {
+ iDecryptor->Release();
+ iDecryptor = NULL;
+ }
+ if (iDH)
+ {
+ iDH->Release();
+ iDH = NULL;
+ }
+ }
+
+void COpenKey::DoReportAction()
+{
+ _LIT(KDeleting, "Opening...");
+ iOut.writeString(KDeleting);
+ iOut.writeNewLine();
+}
+
+void COpenKey::DoCheckResult(TInt aError)
+{
+ if (iFinished)
+ {
+ TBuf<256> buf;
+ if (aError == KErrNone)
+ {
+ _LIT(KSuccessful, "Key open success\n");
+ buf.Format(KSuccessful);
+ iConsole.Write(buf);
+ iOut.writeString(buf);
+ iOut.writeNewLine();
+ }
+ else
+ {
+ if (aError!=iExpectedResult)
+ {
+ _LIT(KFailed, "!!!Key open failure %d!!!\n");
+ buf.Format(KFailed, aError);
+ iConsole.Write(buf);
+ iOut.writeString(buf);
+ }
+ else
+ {
+ _LIT(KFailed, "Key open failed, but expected\n");
+ iConsole.Write(KFailed);
+ iOut.writeString(KFailed);
+ }
+
+ iOut.writeNewLine();
+ }
+ }
+}
+
+COpenKey::COpenKey(RFs& aFs, CConsoleBase& aConsole, Output& aOut)
+: CKeyStoreTestAction(aFs, aConsole, aOut)
+{}
+
+void COpenKey::ConstructL(const TTestActionSpec& aTestActionSpec)
+ {
+ TInt pos = 0, err = 0;
+ CKeyStoreTestAction::ConstructL(aTestActionSpec);
+ SetKeyType(Input::ParseElement(aTestActionSpec.iActionBody, KOpenStart, KOpenEnd, pos, err));
+ iState = EListKeysPreOpen;
+
+ }
+void COpenKey::SetKeyType(const TDesC8& aKeyType)
+{
+ if (aKeyType.Compare(KAlgRSA)==0)
+ {
+ iType = ERSASign;
+ }
+ else if (aKeyType.Compare(KAlgDSA)==0)
+ {
+ iType = EDSASign;
+ }
+ else if (aKeyType.Compare(KDecryptUsage)==0)
+ {
+ iType = EDecrypt;
+ }
+ else if (aKeyType.Compare(KAlgDH)==0)
+ {
+ iType = EDH;
+ }
+}
+
+
+////////////////////////////////////
+// CSign
+////////////////////////////////////
+/*static*/ CTestAction* CSign::NewL(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
+{
+ CTestAction* self = CSign::NewLC(aFs, aConsole, aOut, aTestActionSpec);
+ CleanupStack::Pop(self);
+ return self;
+}
+
+/*static*/ CTestAction* CSign::NewLC(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
+{
+ CSign* self = new (ELeave) CSign(aFs, aConsole, aOut);
+ CleanupStack::PushL(self);
+ self->ConstructL(aTestActionSpec);
+ return self;
+}
+
+CSign::~CSign()
+{
+ iKeys.Close();
+ delete iReadText;
+ delete iExportedPublicKey;
+ delete iRSASignature;
+ delete iDSASignature;
+ delete iHash;
+}
+
+void CSign::PerformAction(TRequestStatus& aStatus)
+{
+ // Jump straight to final state if an error occured
+ if (aStatus.Int()!=KErrNone)
+ {
+ iState=EFinished;
+ }
+
+ switch (iState)
+ {
+ case EListKeysPreOpen:
+ {
+ CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
+ ASSERT(keyStore); // Flag it up
+ if (keyStore)
+ keyStore->List(iKeys, iFilter, aStatus);
+
+ iState = EOpenKey;
+ }
+ break;
+
+ case EOpenKey:
+ {
+ CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
+ ASSERT(keyStore); // Flag it up
+
+ TInt keyCount = iKeys.Count();
+
+ TInt i;
+ for (i = 0; i < keyCount; i++)
+ {
+ CCTKeyInfo* keyInfo = iKeys[i];
+
+ if (keyInfo->Label() == *iLabel)
+ {
+ switch (iType)
+ {
+ case ERSASign:
+ keyStore->Open(*keyInfo, iRSASigner, aStatus);
+ break;
+ case EDSASign:
+ keyStore->Open(*keyInfo, iDSASigner, aStatus);
+ break;
+ case EDH:
+ case EDecrypt:
+ break; // Nothing to do, for the compiler
+ }
+ break;
+ }
+ }
+ iState = ESign;
+ if (i == keyCount)
+ {
+ TRequestStatus* status = &aStatus;
+ User::RequestComplete(status, KErrNotFound);
+ }
+ }
+ break;
+
+ case ESign:
+ {
+ switch (iType)
+ {
+ case ERSASign:
+ {
+ if (iHash)
+ {
+ if (iFailHashDigest) // Don't hash it, fail deliberately
+ iRSASigner->Sign(*iReadText,iRSASignature,aStatus);
+ else // message gets signed by the keystore
+ iRSASigner->SignMessage(*iReadText,iRSASignature,aStatus);
+ }
+ else
+ {
+ iRSASigner->Sign(*iReadText,iRSASignature,aStatus);
+ }
+ }
+ break;
+ case EDSASign:
+ {
+ if (iHash)
+ {
+ if (iFailHashDigest) // Don't hash it, deliberately fail it
+ iDSASigner->Sign(*iReadText,iDSASignature,aStatus);
+ else // message gets signed by the keystore
+ iDSASigner->SignMessage(*iReadText,iDSASignature,aStatus);
+ }
+ else
+ {
+ iDSASigner->Sign(*iReadText,iDSASignature,aStatus);
+ }
+ }
+ break;
+ default:
+ ASSERT(EFalse);
+ }
+ iState = EExportPublic;
+ }
+ break;
+
+ case EExportPublic:
+ {
+ CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
+ ASSERT(keyStore); // Flag it up
+ TInt keyCount = iKeys.Count();
+ TInt i;
+ for (i = 0; i < keyCount; i++)
+ {
+ CCTKeyInfo* keyInfo = iKeys[i];
+
+ if (keyInfo->Label() == *iLabel)
+ {
+ iExportHandle = keyInfo->Handle();
+
+ switch (iType)
+ {
+ case ERSASign:
+ keyStore->ExportPublic(iExportHandle, iExportedPublicKey, aStatus);
+ break;
+ case EDSASign:
+ keyStore->ExportPublic(iExportHandle, iExportedPublicKey, aStatus);
+ break;
+ case EDH:
+ case EDecrypt:
+ break; // Nothing to do, for the compiler
+ }
+ break;
+ }
+ }
+ iState = EVerify;
+ if (i == keyCount)
+ {
+ TRequestStatus* status = &aStatus;
+ User::RequestComplete(status, KErrNotFound);
+ }
+ }
+ break;
+
+ case EVerify:
+ {
+ TInt keyCount = iKeys.Count();
+ TInt i;
+ for (i = 0; i < keyCount; i++)
+ {
+ CCTKeyInfo* keyInfo = iKeys[i];
+
+ if (keyInfo->Label() == *iLabel)
+ {
+ iExportHandle = keyInfo->Handle();
+ CX509SubjectPublicKeyInfo* ki =
+ CX509SubjectPublicKeyInfo::NewLC(*iExportedPublicKey);
+
+ switch (iType)
+ {
+ case ERSASign:
+ {
+ TX509KeyFactory factory;
+ CRSAPublicKey* key = factory.RSAPublicKeyL(ki->KeyData());
+ CleanupStack::PushL(key);
+
+ CRSAPKCS1v15Verifier* verifier = NULL;
+
+ if (iHash) // Must compare with hash of original data
+ {
+ verifier = CRSAPKCS1v15Verifier::NewLC(*key);
+ iHash->Reset();
+ iVerifyResult = verifier->VerifyL(iHash->Final(*iReadText), *iRSASignature);
+ }
+ else
+ {
+ verifier = CRSAPKCS1v15Verifier::NewLC(*key);
+ iVerifyResult = verifier->VerifyL(*iReadText, *iRSASignature);
+ }
+
+ _LIT(KReturned, "Returned... ");
+ iOut.writeString(KReturned);
+ iOut.writeNewLine();
+
+ CleanupStack::PopAndDestroy(2, key);
+ }
+ break;
+ case EDSASign:
+ {
+ TX509KeyFactory factory;
+ CDSAPublicKey* key = factory.DSAPublicKeyL(ki->EncodedParams(), ki->KeyData());
+ CleanupStack::PushL(key);
+
+ CDSAVerifier* verifier = CDSAVerifier::NewLC(*key);
+ if (iHash) // Must compare with hash of original value
+ {
+ iHash->Reset();
+ iVerifyResult = verifier->VerifyL(iHash->Final(*iReadText),*iDSASignature);
+ }
+ else
+ {
+ iVerifyResult = verifier->VerifyL(*iReadText,*iDSASignature);
+ }
+ _LIT(KReturned, "Returned... ");
+ iOut.writeString(KReturned);
+ iOut.writeNewLine();
+ CleanupStack::PopAndDestroy(verifier);
+ CleanupStack::PopAndDestroy(key);
+ }
+ break;
+ default:
+ ASSERT(EFalse);
+
+ }
+ CleanupStack::PopAndDestroy(ki);
+ }
+ }
+ iState = EFinished;
+ TRequestStatus* status = &aStatus;
+ if (!iVerifyResult)
+ {
+ _LIT(KVerifyFail, "**Verify failed**");
+ iOut.writeString(KVerifyFail);
+ iOut.writeNewLine();
+
+ // Flat verify failed as KErrGeneral
+ if (aStatus.Int() == KErrNone)
+ {
+ aStatus = KErrGeneral;
+ }
+ }
+ User::RequestComplete(status, aStatus.Int());
+ }
+ break;
+
+ case EFinished:
+ {
+ iActionState = EPostrequisite;
+ iResult = (aStatus.Int() == iExpectedResult);
+
+ if ((aStatus.Int() != KErrNone)&&(aStatus!=KErrNoMemory))
+ {
+ _LIT(KExportFail," !Failed when exporting public key! ");
+ iOut.writeString(KExportFail);
+ }
+
+ iKeys.Close();
+ switch (iType)
+ {
+ case ERSASign:
+ if (iRSASigner)
+ iRSASigner->Release();
+ break;
+ case EDSASign:
+ if (iDSASigner)
+ iDSASigner->Release();
+ break;
+ case EDecrypt:
+ if (iDecryptor)
+ iDecryptor->Release();
+ case EDH:
+ if (iDH)
+ iDH->Release();
+ break;
+ }
+ TRequestStatus* status = &aStatus;
+ User::RequestComplete(status, aStatus.Int());
+ }
+ break;
+ default:
+ ASSERT(EFalse);
+ }
+
+}
+
+void CSign::PerformCancel()
+ {
+ CUnifiedKeyStore* keystore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
+ ASSERT(keystore);
+
+ switch (iState)
+ {
+ case EOpenKey:
+ keystore->CancelList();
+ break;
+
+ case ESign:
+ keystore->CancelOpen();
+ break;
+
+ case EExportPublic:
+ switch (iType)
+ {
+ case ERSASign:
+ ASSERT(iRSASigner);
+ iRSASigner->CancelSign();
+ break;
+
+ case EDSASign:
+ ASSERT(iDSASigner);
+ iDSASigner->CancelSign();
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ case EVerify:
+ keystore->CancelExportPublic();
+ break;
+
+ default:
+ break;
+ }
+ }
+
+void CSign::Reset()
+ {
+ iState = EListKeysPreOpen;
+ iKeys.Close();
+ if (iRSASigner)
+ {
+ iRSASigner->Release();
+ iRSASigner = NULL;
+ }
+ if (iDSASigner)
+ {
+ iDSASigner->Release();
+ iDSASigner = NULL;
+ }
+ delete iExportedPublicKey;
+ iExportedPublicKey = NULL;
+ delete iRSASignature;
+ iRSASignature = NULL;
+ delete iDSASignature;
+ iDSASignature = NULL;
+ }
+
+void CSign::DoReportAction()
+{
+ _LIT(KSigning, "Signing... ");
+ iOut.writeString(KSigning);
+ iOut.writeNewLine();
+}
+
+void CSign::DoCheckResult(TInt aError)
+{
+ if (iFinished)
+ {
+ TBuf<256> buf;
+ if (aError == KErrNone)
+ {
+ iOut.writeNewLine();
+ _LIT(KSuccessful, "Sign success\n");
+ buf.Format(KSuccessful);
+ iConsole.Write(buf);
+ iOut.writeString(buf);
+ iOut.writeNewLine();
+ }
+ else
+ {
+ if (aError!=iExpectedResult)
+ {
+ _LIT(KFailed, "!!!Sign failure %d!!!\n");
+ buf.Format(KFailed, aError);
+ iConsole.Write(buf);
+ iOut.writeString(buf);
+ }
+ else
+ {
+ _LIT(KFailed, "Sign failed, but expected\n");
+ iConsole.Write(KFailed);
+ iOut.writeString(KFailed);
+ }
+
+ iOut.writeNewLine();
+ }
+ }
+}
+
+CSign::CSign(RFs& aFs, CConsoleBase& aConsole, Output& aOut)
+: CKeyStoreTestAction(aFs, aConsole, aOut)
+{}
+
+void CSign::ConstructL(const TTestActionSpec& aTestActionSpec)
+{
+ CKeyStoreTestAction::ConstructL(aTestActionSpec);
+
+ SetKeyType(Input::ParseElement(aTestActionSpec.iActionBody, KOpenStart));
+ SetDigestSignL(Input::ParseElement(aTestActionSpec.iActionBody, KSignDigestStart));
+ SetSignText(Input::ParseElement(aTestActionSpec.iActionBody, KTextStart, KTextEnd));
+
+ iFilter.iPolicyFilter = TCTKeyAttributeFilter::EAllKeys;
+
+ iState = EListKeysPreOpen;
+}
+
+
+void CSign::SetKeyType(const TDesC8& aKeyType)
+{
+ if (aKeyType.Compare(KAlgRSA)==0)
+ {
+ iType = ERSASign;
+ }
+ else if (aKeyType.Compare(KAlgDSA)==0)
+ {
+ iType = EDSASign;
+ }
+ else if (aKeyType.Compare(KDecryptUsage)==0)
+ {
+ iType = EDecrypt;
+ }
+ else if (aKeyType.Compare(KAlgDH)==0)
+ {
+ iType = EDH;
+ }
+}
+
+void CSign::SetDigestSignL(const TDesC8& aSignDigestDesc)
+{
+ TLex8 lexer(aSignDigestDesc);
+ TInt digest = 0;
+ lexer.Val(digest);
+
+ if (digest > 0)
+ iHash = CMessageDigestFactory::NewDigestL(CMessageDigest::ESHA1);
+
+ if (digest==2)
+ iFailHashDigest = ETrue;
+}
+
+void CSign::SetSignText(const TDesC8& aText)
+{
+ iReadText = HBufC8::NewMax(aText.Size());
+ if (iReadText)
+ {
+ TPtr8 theText(iReadText->Des());
+ theText.FillZ();
+ theText.Copy(aText);
+ }
+}
+
+////////////////////////////////////
+// CDecrypt
+////////////////////////////////////
+/*static*/ CTestAction* CDecrypt::NewL(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
+{
+ CTestAction* self = CDecrypt::NewLC(aFs, aConsole, aOut, aTestActionSpec);
+ CleanupStack::Pop(self);
+ return self;
+}
+
+/*static*/ CTestAction* CDecrypt::NewLC(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
+{
+ CDecrypt* self = new (ELeave) CDecrypt(aFs, aConsole, aOut);
+ CleanupStack::PushL(self);
+ self->ConstructL(aTestActionSpec);
+ return self;
+}
+
+CDecrypt::~CDecrypt()
+{
+ iKeys.Close();
+ delete iReadText;
+ delete iPlainText;
+ delete iPublic;
+}
+
+void CDecrypt::PerformAction(TRequestStatus& aStatus)
+{
+ // Jump straight to final state if an error occured
+ if (aStatus.Int()!=KErrNone)
+ {
+ iState=EFinished;
+ }
+
+ switch (iState)
+ {
+ case EListKeysPreOpen:
+ {// Currently uses the first store, change to check the script for a specific store
+ CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
+ ASSERT(keyStore); // Flag it up
+ if (keyStore)
+ keyStore->List(iKeys, iFilter, aStatus);
+
+ iState = EOpenKey;
+ }
+ break;
+
+ case EOpenKey:
+ {
+ CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
+ ASSERT(keyStore); // Flag it up
+
+ TInt keyCount = iKeys.Count();
+
+ TInt i;
+ for (i = 0; i < keyCount; i++)
+ {
+ CCTKeyInfo* keyInfo = iKeys[i];
+
+ if (keyInfo->Label() == *iLabel)
+ {
+ keyStore->Open(*keyInfo, iDecryptor, aStatus);
+ break;
+ }
+ }
+ iState = EExportPublic;
+ if (i == keyCount)
+ {
+ TRequestStatus* status = &aStatus;
+ User::RequestComplete(status, KErrNotFound);
+ }
+ }
+ break;
+
+ case EExportPublic:
+ {
+ if (aStatus.Int()!=KErrNone)
+ {
+ _LIT(KSignFail," !Failed when opening! ");
+ iOut.writeString(KSignFail);
+ iState=EFinished;
+ // need to set it to true so that test is true if some error was expected
+ iVerifyResult=ETrue;
+ TRequestStatus* status = &aStatus;
+ User::RequestComplete(status, aStatus.Int());
+ break;
+ }
+
+ CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
+ ASSERT(keyStore); // Flag it up
+
+ TInt keyCount = iKeys.Count();
+
+ TInt i;
+ for (i = 0; i < keyCount; i++)
+ {
+ CCTKeyInfo* keyInfo = iKeys[i];
+
+ if (keyInfo->Label() == *iLabel)
+ {
+ iExportHandle = keyInfo->Handle();
+
+ keyStore->ExportPublic(iExportHandle, iPublic, aStatus);
+ break;
+ }
+ }
+ iState = EDecrypt;
+ if (i == keyCount)
+ {
+ TRequestStatus* status = &aStatus;
+ User::RequestComplete(status, KErrNotFound);
+ }
+ }
+ break;
+
+ case EDecrypt:
+ {
+
+ if (aStatus.Int()!=KErrNone)
+ {
+ iState=EFinished;
+ TRequestStatus* status = &aStatus;
+ User::RequestComplete(status, aStatus.Int());
+ break;
+ }
+
+ CX509SubjectPublicKeyInfo* ki =
+ CX509SubjectPublicKeyInfo::NewLC(*iPublic);
+
+ TX509KeyFactory factory;
+ CRSAPublicKey* key = factory.RSAPublicKeyL(ki->KeyData());
+ CleanupStack::PushL(key);
+
+ // Encrypt with public key
+ CRSAPKCS1v15Encryptor* encryptor = CRSAPKCS1v15Encryptor::NewLC(*key);
+ HBufC8* cipherText = HBufC8::NewLC(encryptor->MaxOutputLength());
+ TPtr8 cipherTextPtr = cipherText->Des();
+
+ encryptor->EncryptL(*iReadText, cipherTextPtr);
+
+ // Now decrypt again
+ iPlainText = HBufC8::NewMaxL(100);
+ iPlainTextPtr.Set(iPlainText->Des());
+ iDecryptor->Decrypt(*cipherText, iPlainTextPtr, aStatus);
+
+ CleanupStack::PopAndDestroy(cipherText);
+ CleanupStack::PopAndDestroy(encryptor);
+ CleanupStack::PopAndDestroy(key);
+ CleanupStack::PopAndDestroy(ki);
+
+ iState = EFinished;
+ }
+ break;
+
+ case EFinished:
+ {
+ if (aStatus == KErrNone && (!iPlainText ||
+ *iPlainText != *iReadText))
+ {
+ aStatus = KErrGeneral; // Decryption failed
+ }
+
+ iActionState = EPostrequisite;
+ iResult = (aStatus.Int() == iExpectedResult);
+
+ if (iDecryptor)
+ {
+ iDecryptor->Release();
+ }
+ TRequestStatus* status = &aStatus;
+ User::RequestComplete(status, aStatus.Int());
+ }
+ break;
+ default:
+ ASSERT(EFalse);
+ }
+
+}
+
+void CDecrypt::PerformCancel()
+ {
+ CUnifiedKeyStore* keystore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
+ ASSERT(keystore);
+
+ switch (iState)
+ {
+ case EOpenKey:
+ keystore->CancelList();
+ break;
+
+ case EExportPublic:
+ keystore->CancelOpen();
+ break;
+
+ case EDecrypt:
+ keystore->CancelExportPublic();
+ break;
+
+ case EFinished:
+ ASSERT(iDecryptor);
+ iDecryptor->CancelDecrypt();
+ break;
+
+ default:
+ break;
+ }
+ }
+
+void CDecrypt::Reset()
+ {
+ iState = EListKeysPreOpen;
+ iKeys.Close();
+ if (iDecryptor)
+ {
+ iDecryptor->Release();
+ iDecryptor = NULL;
+ }
+ delete iPlainText;
+ iPlainText = NULL;
+ delete iPublic;
+ iPublic = NULL;
+ }
+
+void CDecrypt::DoReportAction()
+{
+ _LIT(KSigning, "Decrypting... ");
+ iOut.writeString(KSigning);
+ iOut.writeNewLine();
+// iOut.writeString(*iReadText);
+// iOut.writeNewLine();
+}
+
+void CDecrypt::DoCheckResult(TInt aError)
+{
+ if (iFinished)
+ {
+ TBuf<256> buf;
+ if (aError == KErrNone)
+ {
+ iOut.writeNewLine();
+ _LIT(KSuccessful, "Decrypt success\n");
+ buf.Format(KSuccessful);
+ iConsole.Write(buf);
+ iOut.writeString(buf);
+ iOut.writeNewLine();
+ }
+ else
+ {
+ if (aError!=iExpectedResult)
+ {
+ _LIT(KFailed, "!!!Decrypt failure %d!!!\n");
+ buf.Format(KFailed, aError);
+ iConsole.Write(buf);
+ iOut.writeString(buf);
+ }
+ else
+ {
+ _LIT(KFailed, "Decrypt failed, but expected\n");
+ iConsole.Write(KFailed);
+ iOut.writeString(KFailed);
+ }
+
+ iOut.writeNewLine();
+ }
+ }
+}
+
+CDecrypt::CDecrypt(RFs& aFs, CConsoleBase& aConsole, Output& aOut)
+ : CKeyStoreTestAction(aFs, aConsole, aOut), iPlainTextPtr(0,0)
+{}
+
+void CDecrypt::ConstructL(const TTestActionSpec& aTestActionSpec)
+{
+ CKeyStoreTestAction::ConstructL(aTestActionSpec);
+
+ SetSignText(Input::ParseElement(aTestActionSpec.iActionBody, KTextStart));
+ iFilter.iPolicyFilter = TCTKeyAttributeFilter::EAllKeys;
+
+ iState = EListKeysPreOpen;
+}
+
+void CDecrypt::SetSignText(const TDesC8& aText)
+{
+ iReadText = HBufC8::NewMax(aText.Size());
+ if (iReadText)
+ {
+ TPtr8 theText(iReadText->Des());
+ theText.FillZ();
+ theText.Copy(aText);
+ }
+}
+
+////////////////////////////////////
+// CDerive
+////////////////////////////////////
+
+/*static*/ CTestAction* CDerive::NewL(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
+{
+ CTestAction* self = CDerive::NewLC(aFs, aConsole, aOut, aTestActionSpec);
+ CleanupStack::Pop(self);
+ return self;
+}
+
+/*static*/ CTestAction* CDerive::NewLC(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
+{
+ CDerive* self = new (ELeave) CDerive(aFs, aConsole, aOut);
+ CleanupStack::PushL(self);
+ self->ConstructL(aTestActionSpec);
+ return self;
+}
+
+CDerive::~CDerive()
+ {
+ iKeys.Close();
+ iN.Close();
+ iG.Close();
+ if (iDH)
+ {
+ iDH->Release();
+ }
+ delete iPublicKey;
+ delete iOutput;
+ delete iRemote;
+ }
+
+void CDerive::PerformAction(TRequestStatus& aStatus)
+ {
+ // Jump straight to final state if an error occured
+ if (aStatus.Int()!=KErrNone)
+ {
+ iState=EFinished;
+ }
+
+ switch (iState)
+ {
+ case EListKeysPreOpen:
+ {
+ CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
+ ASSERT(keyStore); // Flag it up
+ if (keyStore)
+ keyStore->List(iKeys, iFilter, aStatus);
+
+ iState = EOpenKey;
+ }
+ break;
+
+ case EOpenKey:
+ {
+ CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
+ ASSERT(keyStore); // Flag it up
+
+ TInt keyCount = iKeys.Count();
+
+ TInt i;
+ for (i = 0; i < keyCount; i++)
+ {
+ CCTKeyInfo* keyInfo = iKeys[i];
+
+ if (keyInfo->Label() == *iLabel)
+ {
+ keyStore->Open(*keyInfo, iDH, aStatus);
+ break;
+ }
+ }
+ iState = EExportPublic;
+ if (i == keyCount)
+ {
+ TRequestStatus* status = &aStatus;
+ User::RequestComplete(status, KErrNotFound);
+ }
+ }
+ break;
+
+ case EExportPublic:
+ {
+ ASSERT(iDH);
+ iDH->PublicKey(iN, iG, iPublicKey, aStatus);
+ iState = EDerive;
+ }
+ break;
+
+ case EDerive:
+ {
+ if (aStatus.Int()!=KErrNone)
+ {
+ iState=EFinished;
+ TRequestStatus* status = &aStatus;
+ User::RequestComplete(status, aStatus.Int());
+ break;
+ }
+
+ ASSERT(iPublicKey);
+ iDH->Agree(iRemote->PublicKey(), iOutput, aStatus);
+
+ iState = EFinished;
+ }
+ break;
+
+ case EFinished:
+ {
+ if (aStatus.Int()==KErrNone)
+ {
+ CDH* dh = CDH::NewLC(iRemote->PrivateKey());
+ const HBufC8* output = dh->AgreeL(*iPublicKey);
+ CleanupStack::PopAndDestroy(dh);
+
+ if (aStatus == KErrNone && (!iOutput ||
+ *iOutput != *output))
+ {
+ aStatus = KErrGeneral; // Agree failed
+ }
+
+ delete const_cast<HBufC8*>(output);
+ }
+
+ iActionState = EPostrequisite;
+ iResult = (aStatus.Int() == iExpectedResult);
+
+ if (aStatus != KErrNone)
+ {
+ _LIT(KSignFail," !Failed when agreeing key!");
+ iOut.writeString(KSignFail);
+ }
+
+ TRequestStatus* status = &aStatus;
+ User::RequestComplete(status, aStatus.Int());
+ }
+ break;
+ default:
+ ASSERT(EFalse);
+ }
+ }
+
+void CDerive::PerformCancel()
+ {
+ CUnifiedKeyStore* keystore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
+ ASSERT(keystore);
+
+ switch (iState)
+ {
+ case EOpenKey:
+ keystore->CancelList();
+ break;
+
+ case EExportPublic:
+ keystore->CancelOpen();
+ break;
+
+ case EDerive:
+ keystore->CancelExportPublic();
+ break;
+
+ case EFinished:
+ ASSERT(iDH);
+ iDH->CancelAgreement();
+ break;
+
+ default:
+ break;
+ }
+ }
+
+void CDerive::Reset()
+ {
+ iState = EListKeysPreOpen;
+ iKeys.Close();
+ if (iDH)
+ {
+ iDH->Release();
+ iDH = NULL;
+ }
+ delete iPublicKey;
+ iPublicKey = NULL;
+ delete iOutput;
+ iOutput = NULL;
+ }
+
+void CDerive::DoReportAction()
+{
+ _LIT(KSigning, "Deriving key... ");
+ iOut.writeString(KSigning);
+ iOut.writeNewLine();
+}
+
+void CDerive::DoCheckResult(TInt aError)
+{
+ if (iFinished)
+ {
+ TBuf<256> buf;
+ if (aError == KErrNone)
+ {
+ iOut.writeNewLine();
+ _LIT(KSuccessful, "Derive success\n");
+ buf.Format(KSuccessful);
+ iConsole.Write(buf);
+ iOut.writeString(buf);
+ iOut.writeNewLine();
+ }
+ else
+ {
+ if (aError!=iExpectedResult)
+ {
+ _LIT(KFailed, "!!!Derive failure %d!!!\n");
+ buf.Format(KFailed, aError);
+ iConsole.Write(buf);
+ iOut.writeString(buf);
+ }
+ else
+ {
+ _LIT(KFailed, "Derive failed, but expected\n");
+ iConsole.Write(KFailed);
+ iOut.writeString(KFailed);
+ }
+
+ iOut.writeNewLine();
+ }
+ }
+}
+
+CDerive::CDerive(RFs& aFs, CConsoleBase& aConsole, Output& aOut)
+ : CKeyStoreTestAction(aFs, aConsole, aOut)
+{}
+
+void CDerive::ConstructL(const TTestActionSpec& aTestActionSpec)
+{
+ CKeyStoreTestAction::ConstructL(aTestActionSpec);
+
+ // Set parameters
+ HBufC8* nData = Input::ParseElementHexL(aTestActionSpec.iActionBody, _L8("<n>"));
+ CleanupStack::PushL(nData);
+ iN = RInteger::NewL(*nData);
+ CleanupStack::PopAndDestroy(nData);
+ HBufC8* gData = Input::ParseElementHexL(aTestActionSpec.iActionBody, _L8("<g>"));
+ CleanupStack::PushL(gData);
+ iG = RInteger::NewL(*gData);
+ CleanupStack::PopAndDestroy(gData);
+
+ // Generate 'remote' key pair
+ RInteger n = RInteger::NewL(iN);
+ CleanupStack::PushL(n);
+ RInteger g = RInteger::NewL(iG);
+ CleanupStack::PushL(g);
+ iRemote = CDHKeyPair::NewL(n, g);
+ CleanupStack::Pop(2); // n, g
+
+ iFilter.iPolicyFilter = TCTKeyAttributeFilter::EAllKeys;
+
+ iState = EListKeysPreOpen;
+}