sl@0: /* sl@0: * Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of the License "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: sl@0: * sl@0: */ sl@0: sl@0: sl@0: #include sl@0: #include "t_keystore_actions.h" sl@0: #include "t_keystore_defs.h" sl@0: #include "t_input.h" sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC)) sl@0: #include sl@0: #include "cryptoasymmetriccipherapi.h" sl@0: #include "cryptosignatureapi.h" sl@0: #include sl@0: #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC && SYMBIAN_ENABLE_SDP_ECC sl@0: sl@0: /*static*/ CTestAction* COpenKey::NewL(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec) sl@0: { sl@0: CTestAction* self = COpenKey::NewLC(aFs, aConsole, aOut, aTestActionSpec); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: /*static*/ CTestAction* COpenKey::NewLC(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec) sl@0: { sl@0: COpenKey* self = new (ELeave) COpenKey(aFs, aConsole, aOut); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aTestActionSpec); sl@0: return self; sl@0: } sl@0: sl@0: COpenKey::~COpenKey() sl@0: { sl@0: #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC)) sl@0: delete iSigner; sl@0: delete iDecrypt; sl@0: #endif sl@0: iKeys.Close(); sl@0: } sl@0: sl@0: void COpenKey::PerformAction(TRequestStatus& aStatus) sl@0: { sl@0: switch (iState) sl@0: { sl@0: case EListKeysPreOpen: sl@0: {// Currently uses the first store, change to check the script for a specific store sl@0: CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore); sl@0: ASSERT(keyStore); // Flag it up sl@0: if (keyStore) sl@0: keyStore->List(iKeys, iFilter, aStatus); sl@0: sl@0: iState = EOpenKey; sl@0: } sl@0: break; sl@0: sl@0: case EOpenKey: sl@0: { sl@0: CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore); sl@0: ASSERT(keyStore); // Flag it up sl@0: sl@0: TInt keyCount = iKeys.Count(); sl@0: TInt i; sl@0: sl@0: for (i = 0; i < keyCount; i++) sl@0: { sl@0: CCTKeyInfo* keyInfo = iKeys[i]; sl@0: sl@0: if (keyInfo->Label() == *iLabel) sl@0: { sl@0: switch (iType) sl@0: { sl@0: case ERSASign: sl@0: keyStore->Open(*keyInfo, iRSASigner, aStatus); sl@0: break; sl@0: case EDSASign: sl@0: keyStore->Open(*keyInfo, iDSASigner, aStatus); sl@0: break; sl@0: case EDecrypt: sl@0: keyStore->Open(*keyInfo, iDecryptor, aStatus); sl@0: break; sl@0: case EDH: sl@0: keyStore->Open(*keyInfo, iDH, aStatus); sl@0: break; sl@0: #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC)) sl@0: case EECC: sl@0: { sl@0: ASSERT(iHardwareType); sl@0: if(iOperationType == ESigning) sl@0: { sl@0: keyStore->Open(keyInfo->Handle(),iSigner,aStatus); sl@0: } sl@0: if(iOperationType == EDecryption) sl@0: { sl@0: keyStore->Open(keyInfo->Handle(),iDecrypt,aStatus); sl@0: } sl@0: break; sl@0: } sl@0: #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC sl@0: } sl@0: break; sl@0: } sl@0: } sl@0: if (i == keyCount) sl@0: { sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, KErrNotFound); sl@0: } sl@0: sl@0: iState = EFinished; sl@0: sl@0: } sl@0: break; sl@0: sl@0: case EFinished: sl@0: { sl@0: TInt completionCode = aStatus.Int(); sl@0: HBufC* label = 0; sl@0: iKeys.Close(); sl@0: if (aStatus.Int() == KErrNone) sl@0: { sl@0: switch (iType) sl@0: { sl@0: case ERSASign: sl@0: if (iRSASigner) sl@0: { sl@0: label = iRSASigner->Label().AllocLC(); sl@0: iRSASigner->Release(); sl@0: } sl@0: break; sl@0: case EDSASign: sl@0: if (iDSASigner) sl@0: { sl@0: label = iDSASigner->Label().AllocLC(); sl@0: iDSASigner->Release(); sl@0: } sl@0: break; sl@0: case EDecrypt: sl@0: if (iDecryptor) sl@0: { sl@0: label = iDecryptor->Label().AllocLC(); sl@0: iDecryptor->Release(); sl@0: } sl@0: case EDH: sl@0: if (iDH) sl@0: { sl@0: label = iDH->Label().AllocLC(); sl@0: iDH->Release(); sl@0: } sl@0: break; sl@0: #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC)) sl@0: case EECC: sl@0: { sl@0: ASSERT(iHardwareType); sl@0: if(iOperationType == ESigning && iSigner == NULL sl@0: || iOperationType == EDecryption && iDecrypt == NULL) sl@0: { sl@0: completionCode = KErrGeneral; sl@0: } sl@0: break; sl@0: } sl@0: #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC sl@0: } // switch sl@0: #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC)) sl@0: if(iHardwareType == 0) sl@0: #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC sl@0: { sl@0: if (*label != *iLabel) sl@0: aStatus = KErrBadName; sl@0: CleanupStack::PopAndDestroy(label); sl@0: } sl@0: } sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, completionCode); sl@0: sl@0: if (aStatus.Int()==iExpectedResult) sl@0: { sl@0: iResult = ETrue; sl@0: } sl@0: else sl@0: { sl@0: iResult = EFalse; sl@0: } sl@0: sl@0: iActionState = EPostrequisite; sl@0: } sl@0: break; sl@0: default: sl@0: ASSERT(EFalse); sl@0: } sl@0: sl@0: } sl@0: sl@0: void COpenKey::PerformCancel() sl@0: { sl@0: CUnifiedKeyStore* keystore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore); sl@0: ASSERT(keystore); sl@0: sl@0: switch (iState) sl@0: { sl@0: case EOpenKey: sl@0: keystore->CancelList(); sl@0: break; sl@0: sl@0: case EFinished: sl@0: keystore->CancelOpen(); sl@0: break; sl@0: sl@0: default: sl@0: break; sl@0: } sl@0: } sl@0: sl@0: void COpenKey::Reset() sl@0: { sl@0: iState = EListKeysPreOpen; sl@0: iKeys.Close(); sl@0: if (iRSASigner) sl@0: { sl@0: iRSASigner->Release(); sl@0: iRSASigner = NULL; sl@0: } sl@0: if (iDSASigner) sl@0: { sl@0: iDSASigner->Release(); sl@0: iDSASigner = NULL; sl@0: } sl@0: if (iDecryptor) sl@0: { sl@0: iDecryptor->Release(); sl@0: iDecryptor = NULL; sl@0: } sl@0: if (iDH) sl@0: { sl@0: iDH->Release(); sl@0: iDH = NULL; sl@0: } sl@0: #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC)) sl@0: delete iSigner; sl@0: iSigner = NULL; sl@0: delete iDecrypt; sl@0: iDecrypt = NULL; sl@0: #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC sl@0: } sl@0: sl@0: void COpenKey::DoReportAction() sl@0: { sl@0: _LIT(KDeleting, "Opening..."); sl@0: iOut.writeString(KDeleting); sl@0: iOut.writeNewLine(); sl@0: } sl@0: sl@0: void COpenKey::DoCheckResult(TInt aError) sl@0: { sl@0: if (iFinished) sl@0: { sl@0: TBuf<256> buf; sl@0: if (aError == KErrNone) sl@0: { sl@0: _LIT(KSuccessful, "Key open success\n"); sl@0: buf.Format(KSuccessful); sl@0: iConsole.Write(buf); sl@0: iOut.writeString(buf); sl@0: iOut.writeNewLine(); sl@0: } sl@0: else sl@0: { sl@0: if (aError!=iExpectedResult) sl@0: { sl@0: _LIT(KFailed, "!!!Key open failure %d!!!\n"); sl@0: buf.Format(KFailed, aError); sl@0: iConsole.Write(buf); sl@0: iOut.writeString(buf); sl@0: } sl@0: else sl@0: { sl@0: _LIT(KFailed, "Key open failed, but expected\n"); sl@0: iConsole.Write(KFailed); sl@0: iOut.writeString(KFailed); sl@0: } sl@0: sl@0: iOut.writeNewLine(); sl@0: } sl@0: } sl@0: } sl@0: sl@0: COpenKey::COpenKey(RFs& aFs, CConsoleBase& aConsole, Output& aOut) sl@0: : CKeyStoreTestAction(aFs, aConsole, aOut) sl@0: {} sl@0: sl@0: void COpenKey::ConstructL(const TTestActionSpec& aTestActionSpec) sl@0: { sl@0: CKeyStoreTestAction::ConstructL(aTestActionSpec); sl@0: sl@0: #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC)) sl@0: TInt pos = 0, err = 0; sl@0: TPtrC8 operationType = Input::ParseElement(aTestActionSpec.iActionBody, KOperationTypeStart, KOperationTypeEnd, pos, err); sl@0: if(operationType.Compare(_L8("sign")) == 0) sl@0: { sl@0: iOperationType = ESigning; sl@0: } sl@0: else if (operationType.Compare(_L8("decrypt")) == 0) sl@0: { sl@0: iOperationType = EDecryption; sl@0: } sl@0: #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC sl@0: sl@0: iState = EListKeysPreOpen; sl@0: sl@0: } sl@0: sl@0: //////////////////////////////////// sl@0: // CSign sl@0: //////////////////////////////////// sl@0: /*static*/ CTestAction* CSign::NewL(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec) sl@0: { sl@0: CTestAction* self = CSign::NewLC(aFs, aConsole, aOut, aTestActionSpec); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: /*static*/ CTestAction* CSign::NewLC(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec) sl@0: { sl@0: CSign* self = new (ELeave) CSign(aFs, aConsole, aOut); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aTestActionSpec); sl@0: return self; sl@0: } sl@0: sl@0: CSign::~CSign() sl@0: { sl@0: iKeys.Close(); sl@0: delete iReadText; sl@0: delete iExportedPublicKey; sl@0: delete iRSASignature; sl@0: delete iDSASignature; sl@0: delete iHash; sl@0: #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC)) sl@0: delete iSigner; sl@0: delete iSpiSignature; sl@0: #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC sl@0: } sl@0: sl@0: void CSign::PerformAction(TRequestStatus& aStatus) sl@0: { sl@0: // Jump straight to final state if an error occured sl@0: if (aStatus.Int()!=KErrNone) sl@0: { sl@0: iState=EFinished; sl@0: } sl@0: sl@0: switch (iState) sl@0: { sl@0: case EListKeysPreOpen: sl@0: { sl@0: CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore); sl@0: ASSERT(keyStore); // Flag it up sl@0: if (keyStore) sl@0: keyStore->List(iKeys, iFilter, aStatus); sl@0: iState = EOpenKey; sl@0: sl@0: } sl@0: break; sl@0: sl@0: case EOpenKey: sl@0: { sl@0: CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore); sl@0: ASSERT(keyStore); // Flag it up sl@0: TInt keyCount = iKeys.Count(); sl@0: sl@0: TInt i; sl@0: for (i = 0; i < keyCount; i++) sl@0: { sl@0: CCTKeyInfo* keyInfo = iKeys[i]; sl@0: sl@0: if (keyInfo->Label() == *iLabel) sl@0: { sl@0: switch (iType) sl@0: { sl@0: case ERSASign: sl@0: keyStore->Open(*keyInfo, iRSASigner, aStatus); sl@0: break; sl@0: case EDSASign: sl@0: keyStore->Open(*keyInfo, iDSASigner, aStatus); sl@0: break; sl@0: case EDH: sl@0: case EDecrypt: sl@0: break; // Nothing to do, for the compiler sl@0: sl@0: #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC)) sl@0: case EECC: sl@0: { sl@0: iTokenHandle = keyInfo->Handle(); sl@0: if(iHardwareType == 0) sl@0: { sl@0: keyStore->Open(iTokenHandle, iSigner, aStatus); sl@0: } sl@0: else sl@0: { sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, KErrNone); sl@0: } sl@0: } sl@0: break; sl@0: #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC sl@0: } sl@0: } // if sl@0: if (i == keyCount) sl@0: { sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, KErrNotFound); sl@0: } sl@0: }// for sl@0: iState = ESign; sl@0: sl@0: } sl@0: break; sl@0: sl@0: case ESign: sl@0: { sl@0: switch (iType) sl@0: { sl@0: case ERSASign: sl@0: { sl@0: if (iHash) sl@0: { sl@0: if (iFailHashDigest) // Don't hash it, fail deliberately sl@0: iRSASigner->Sign(*iReadText,iRSASignature,aStatus); sl@0: else // message gets signed by the keystore sl@0: iRSASigner->SignMessage(*iReadText,iRSASignature,aStatus); sl@0: } sl@0: else sl@0: { sl@0: iRSASigner->Sign(*iReadText,iRSASignature,aStatus); sl@0: } sl@0: } sl@0: break; sl@0: case EDSASign: sl@0: { sl@0: if (iHash) sl@0: { sl@0: if (iFailHashDigest) // Don't hash it, deliberately fail it sl@0: iDSASigner->Sign(*iReadText,iDSASignature,aStatus); sl@0: else // message gets signed by the keystore sl@0: iDSASigner->SignMessage(*iReadText,iDSASignature,aStatus); sl@0: } sl@0: else sl@0: { sl@0: iDSASigner->Sign(*iReadText,iDSASignature,aStatus); sl@0: } sl@0: } sl@0: break; sl@0: #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC)) sl@0: case EECC: sl@0: { sl@0: TRAPD(err, iSpiSignature = CryptoSpi::CCryptoParams::NewL()); sl@0: if(err == KErrNone) sl@0: { sl@0: if(iHardwareType) sl@0: { sl@0: CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore); sl@0: ASSERT(keyStore); // Flag it up sl@0: keyStore->Sign(iTokenHandle, *iReadText, iSpiSignature, aStatus); sl@0: } sl@0: else sl@0: { sl@0: if(iSigner) sl@0: { sl@0: TRAP(err, iSigner->SignL(*iReadText, *iSpiSignature)); sl@0: aStatus = err; sl@0: } sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, aStatus.Int()); sl@0: } sl@0: } sl@0: else sl@0: { sl@0: aStatus = err; sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, aStatus.Int()); sl@0: } sl@0: } sl@0: break; sl@0: #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC sl@0: sl@0: default: sl@0: ASSERT(EFalse); sl@0: } sl@0: iState = EExportPublic; sl@0: } sl@0: break; sl@0: sl@0: sl@0: case EExportPublic: sl@0: { sl@0: CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore); sl@0: ASSERT(keyStore); // Flag it up sl@0: sl@0: TInt keyCount = iKeys.Count(); sl@0: TInt i; sl@0: for (i = 0; i < keyCount; i++) sl@0: { sl@0: CCTKeyInfo* keyInfo = iKeys[i]; sl@0: sl@0: if (keyInfo->Label() == *iLabel) sl@0: { sl@0: iExportHandle = keyInfo->Handle(); sl@0: sl@0: switch (iType) sl@0: { sl@0: case ERSASign: sl@0: keyStore->ExportPublic(iExportHandle, iExportedPublicKey, aStatus); sl@0: break; sl@0: case EDSASign: sl@0: keyStore->ExportPublic(iExportHandle, iExportedPublicKey, aStatus); sl@0: break; sl@0: case EDH: sl@0: case EDecrypt: sl@0: break; // Nothing to do, for the compiler sl@0: #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC)) sl@0: case EECC: sl@0: { sl@0: keyStore->ExportPublic(iExportHandle, iExportedPublicKey, aStatus); sl@0: iState = EVerify; sl@0: } sl@0: break; sl@0: #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC sl@0: } sl@0: break; sl@0: } sl@0: } sl@0: iState = EVerify; sl@0: if (i == keyCount) sl@0: { sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, KErrNotFound); sl@0: } sl@0: } sl@0: break; sl@0: sl@0: case EVerify: sl@0: { sl@0: TInt keyCount = iKeys.Count(); sl@0: TInt i; sl@0: for (i = 0; i < keyCount; i++) sl@0: { sl@0: CCTKeyInfo* keyInfo = iKeys[i]; sl@0: sl@0: if (keyInfo->Label() == *iLabel) sl@0: { sl@0: iExportHandle = keyInfo->Handle(); sl@0: CX509SubjectPublicKeyInfo* ki = NULL; sl@0: #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC)) sl@0: if(iType != EECC) sl@0: #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC sl@0: ki = CX509SubjectPublicKeyInfo::NewLC(*iExportedPublicKey); sl@0: sl@0: switch (iType) sl@0: { sl@0: case ERSASign: sl@0: { sl@0: TX509KeyFactory factory; sl@0: CRSAPublicKey* key = factory.RSAPublicKeyL(ki->KeyData()); sl@0: CleanupStack::PushL(key); sl@0: sl@0: CRSAPKCS1v15Verifier* verifier = NULL; sl@0: sl@0: if (iHash) // Must compare with hash of original data sl@0: { sl@0: verifier = CRSAPKCS1v15Verifier::NewLC(*key); sl@0: iHash->Reset(); sl@0: iVerifyResult = verifier->VerifyL(iHash->Final(*iReadText), *iRSASignature); sl@0: } sl@0: else sl@0: { sl@0: verifier = CRSAPKCS1v15Verifier::NewLC(*key); sl@0: iVerifyResult = verifier->VerifyL(*iReadText, *iRSASignature); sl@0: } sl@0: sl@0: _LIT(KReturned, "Returned... "); sl@0: iOut.writeString(KReturned); sl@0: iOut.writeNewLine(); sl@0: sl@0: CleanupStack::PopAndDestroy(2, key); sl@0: } sl@0: break; sl@0: case EDSASign: sl@0: { sl@0: TX509KeyFactory factory; sl@0: CDSAPublicKey* key = factory.DSAPublicKeyL(ki->EncodedParams(), ki->KeyData()); sl@0: CleanupStack::PushL(key); sl@0: sl@0: CDSAVerifier* verifier = CDSAVerifier::NewLC(*key); sl@0: if (iHash) // Must compare with hash of original value sl@0: { sl@0: iHash->Reset(); sl@0: iVerifyResult = verifier->VerifyL(iHash->Final(*iReadText),*iDSASignature); sl@0: } sl@0: else sl@0: { sl@0: iVerifyResult = verifier->VerifyL(*iReadText,*iDSASignature); sl@0: } sl@0: _LIT(KReturned, "Returned... "); sl@0: iOut.writeString(KReturned); sl@0: iOut.writeNewLine(); sl@0: CleanupStack::PopAndDestroy(verifier); sl@0: CleanupStack::PopAndDestroy(key); sl@0: } sl@0: break; sl@0: sl@0: #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC)) sl@0: case EECC: sl@0: { sl@0: iVerifyResult = EFalse; sl@0: if (iSpiSignature && iSpiSignature->IsPresent(CryptoSpi::KEccKeyTypeUid)) sl@0: { sl@0: TDesC8* actualSignature = NULL; sl@0: TRAPD(err, actualSignature = const_cast(&(iSpiSignature->GetTDesC8L(CryptoSpi::KEccKeyTypeUid)))); sl@0: if(err == KErrNone) sl@0: { sl@0: if(iExportedPublicKey->Des() == *actualSignature) sl@0: { sl@0: iVerifyResult = ETrue; sl@0: } sl@0: } sl@0: else sl@0: { sl@0: aStatus = err; sl@0: } sl@0: } sl@0: _LIT(KReturned, "Returned... "); sl@0: iOut.writeString(KReturned); sl@0: iOut.writeNewLine(); sl@0: } sl@0: break; sl@0: #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC sl@0: default: sl@0: ASSERT(EFalse); sl@0: sl@0: } sl@0: #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC)) sl@0: if(iType != EECC) sl@0: #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC sl@0: CleanupStack::PopAndDestroy(ki); sl@0: } sl@0: } sl@0: sl@0: iState = EFinished; sl@0: TRequestStatus* status = &aStatus; sl@0: if (!iVerifyResult) sl@0: { sl@0: _LIT(KVerifyFail, "**Verify failed**"); sl@0: iOut.writeString(KVerifyFail); sl@0: iOut.writeNewLine(); sl@0: sl@0: // Flat verify failed as KErrGeneral sl@0: if (aStatus.Int() == KErrNone) sl@0: { sl@0: aStatus = KErrGeneral; sl@0: } sl@0: } sl@0: User::RequestComplete(status, aStatus.Int()); sl@0: } sl@0: break; sl@0: sl@0: case EFinished: sl@0: { sl@0: iActionState = EPostrequisite; sl@0: iResult = (aStatus.Int() == iExpectedResult); sl@0: sl@0: if ((aStatus.Int() != KErrNone)&&(aStatus!=KErrNoMemory)) sl@0: { sl@0: _LIT(KExportFail," !Failed when exporting public key! "); sl@0: iOut.writeString(KExportFail); sl@0: } sl@0: sl@0: iKeys.Close(); sl@0: switch (iType) sl@0: { sl@0: case ERSASign: sl@0: if (iRSASigner) sl@0: iRSASigner->Release(); sl@0: break; sl@0: case EDSASign: sl@0: if (iDSASigner) sl@0: iDSASigner->Release(); sl@0: break; sl@0: case EDecrypt: sl@0: if (iDecryptor) sl@0: iDecryptor->Release(); sl@0: case EDH: sl@0: if (iDH) sl@0: iDH->Release(); sl@0: break; sl@0: } sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, aStatus.Int()); sl@0: } sl@0: break; sl@0: default: sl@0: ASSERT(EFalse); sl@0: } sl@0: } sl@0: sl@0: void CSign::PerformCancel() sl@0: { sl@0: CUnifiedKeyStore* keystore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore); sl@0: ASSERT(keystore); sl@0: sl@0: switch (iState) sl@0: { sl@0: case EOpenKey: sl@0: keystore->CancelList(); sl@0: break; sl@0: sl@0: case ESign: sl@0: keystore->CancelOpen(); sl@0: break; sl@0: sl@0: case EExportPublic: sl@0: switch (iType) sl@0: { sl@0: case ERSASign: sl@0: ASSERT(iRSASigner); sl@0: iRSASigner->CancelSign(); sl@0: break; sl@0: sl@0: case EDSASign: sl@0: ASSERT(iDSASigner); sl@0: iDSASigner->CancelSign(); sl@0: break; sl@0: sl@0: default: sl@0: break; sl@0: } sl@0: break; sl@0: sl@0: case EVerify: sl@0: keystore->CancelExportPublic(); sl@0: break; sl@0: sl@0: default: sl@0: break; sl@0: } sl@0: } sl@0: sl@0: void CSign::Reset() sl@0: { sl@0: iState = EListKeysPreOpen; sl@0: iKeys.Close(); sl@0: if (iRSASigner) sl@0: { sl@0: iRSASigner->Release(); sl@0: iRSASigner = NULL; sl@0: } sl@0: if (iDSASigner) sl@0: { sl@0: iDSASigner->Release(); sl@0: iDSASigner = NULL; sl@0: } sl@0: delete iExportedPublicKey; sl@0: iExportedPublicKey = NULL; sl@0: delete iRSASignature; sl@0: iRSASignature = NULL; sl@0: delete iDSASignature; sl@0: iDSASignature = NULL; sl@0: #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC)) sl@0: delete iSigner; sl@0: iSigner = NULL; sl@0: delete iSpiSignature; sl@0: iSpiSignature = NULL; sl@0: #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC sl@0: } sl@0: sl@0: void CSign::DoReportAction() sl@0: { sl@0: _LIT(KSigning, "Signing... "); sl@0: iOut.writeString(KSigning); sl@0: iOut.writeNewLine(); sl@0: } sl@0: sl@0: void CSign::DoCheckResult(TInt aError) sl@0: { sl@0: if (iFinished) sl@0: { sl@0: TBuf<256> buf; sl@0: if (aError == KErrNone) sl@0: { sl@0: iOut.writeNewLine(); sl@0: _LIT(KSuccessful, "Sign success\n"); sl@0: buf.Format(KSuccessful); sl@0: iConsole.Write(buf); sl@0: iOut.writeString(buf); sl@0: iOut.writeNewLine(); sl@0: } sl@0: else sl@0: { sl@0: if (aError!=iExpectedResult) sl@0: { sl@0: _LIT(KFailed, "!!!Sign failure %d!!!\n"); sl@0: buf.Format(KFailed, aError); sl@0: iConsole.Write(buf); sl@0: iOut.writeString(buf); sl@0: } sl@0: else sl@0: { sl@0: _LIT(KFailed, "Sign failed, but expected\n"); sl@0: iConsole.Write(KFailed); sl@0: iOut.writeString(KFailed); sl@0: } sl@0: sl@0: iOut.writeNewLine(); sl@0: } sl@0: } sl@0: } sl@0: sl@0: CSign::CSign(RFs& aFs, CConsoleBase& aConsole, Output& aOut) sl@0: : CKeyStoreTestAction(aFs, aConsole, aOut) sl@0: {} sl@0: sl@0: void CSign::ConstructL(const TTestActionSpec& aTestActionSpec) sl@0: { sl@0: CKeyStoreTestAction::ConstructL(aTestActionSpec); sl@0: sl@0: SetDigestSignL(Input::ParseElement(aTestActionSpec.iActionBody, KSignDigestStart)); sl@0: SetSignText(Input::ParseElement(aTestActionSpec.iActionBody, KTextStart, KTextEnd)); sl@0: sl@0: iFilter.iPolicyFilter = TCTKeyAttributeFilter::EAllKeys; sl@0: sl@0: iState = EListKeysPreOpen; sl@0: sl@0: } sl@0: sl@0: void CSign::SetDigestSignL(const TDesC8& aSignDigestDesc) sl@0: { sl@0: TLex8 lexer(aSignDigestDesc); sl@0: TInt digest = 0; sl@0: lexer.Val(digest); sl@0: sl@0: if (digest > 0) sl@0: iHash = CMessageDigestFactory::NewDigestL(CMessageDigest::ESHA1); sl@0: sl@0: if (digest==2) sl@0: iFailHashDigest = ETrue; sl@0: } sl@0: sl@0: void CSign::SetSignText(const TDesC8& aText) sl@0: { sl@0: iReadText = HBufC8::NewMax(aText.Size()); sl@0: if (iReadText) sl@0: { sl@0: TPtr8 theText(iReadText->Des()); sl@0: theText.FillZ(); sl@0: theText.Copy(aText); sl@0: } sl@0: } sl@0: sl@0: //////////////////////////////////// sl@0: // CDecrypt sl@0: //////////////////////////////////// sl@0: /*static*/ CTestAction* CDecrypt::NewL(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec) sl@0: { sl@0: CTestAction* self = CDecrypt::NewLC(aFs, aConsole, aOut, aTestActionSpec); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: /*static*/ CTestAction* CDecrypt::NewLC(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec) sl@0: { sl@0: CDecrypt* self = new (ELeave) CDecrypt(aFs, aConsole, aOut); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aTestActionSpec); sl@0: return self; sl@0: } sl@0: sl@0: CDecrypt::~CDecrypt() sl@0: { sl@0: iKeys.Close(); sl@0: delete iReadText; sl@0: delete iPlainText; sl@0: delete iPublic; sl@0: #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC)) sl@0: delete iDecrypt; sl@0: #endif sl@0: } sl@0: sl@0: void CDecrypt::PerformAction(TRequestStatus& aStatus) sl@0: { sl@0: // Jump straight to final state if an error occured sl@0: if (aStatus.Int()!=KErrNone) sl@0: { sl@0: iState=EFinished; sl@0: } sl@0: sl@0: switch (iState) sl@0: { sl@0: case EListKeysPreOpen: sl@0: {// Currently uses the first store, change to check the script for a specific store sl@0: CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore); sl@0: ASSERT(keyStore); // Flag it up sl@0: if (keyStore) sl@0: keyStore->List(iKeys, iFilter, aStatus); sl@0: sl@0: iState = EOpenKey; sl@0: } sl@0: break; sl@0: sl@0: case EOpenKey: sl@0: { sl@0: CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore); sl@0: ASSERT(keyStore); // Flag it up sl@0: sl@0: TInt keyCount = iKeys.Count(); sl@0: TInt i; sl@0: for (i = 0; i < keyCount; i++) sl@0: { sl@0: CCTKeyInfo* keyInfo = iKeys[i]; sl@0: sl@0: if (keyInfo->Label() == *iLabel) sl@0: { sl@0: switch(iType) sl@0: { sl@0: #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC)) sl@0: case EECC: sl@0: if(iHardwareType == 0) sl@0: { sl@0: keyStore->Open(keyInfo->Handle(), iDecrypt, aStatus); sl@0: } sl@0: else if(iHardwareType == 1 ) sl@0: { sl@0: /** sl@0: * Call the decrypt of hardware directly. iPlainText sl@0: * would be populated. sl@0: */ sl@0: keyStore->Decrypt(keyInfo->Handle(), *iReadText, iPlainText, aStatus); sl@0: } sl@0: break; sl@0: #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC sl@0: default: sl@0: { sl@0: keyStore->Open(*keyInfo, iDecryptor, aStatus); sl@0: } sl@0: } // switch sl@0: break; sl@0: } // if sl@0: } // for sl@0: sl@0: iState = EExportPublic; sl@0: if (i == keyCount) sl@0: { sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, KErrNotFound); sl@0: } sl@0: } sl@0: break; sl@0: sl@0: case EExportPublic: sl@0: { sl@0: if (aStatus.Int()!=KErrNone) sl@0: { sl@0: _LIT(KSignFail," !Failed when opening! "); sl@0: iOut.writeString(KSignFail); sl@0: iState=EFinished; sl@0: // need to set it to true so that test is true if some error was expected sl@0: iVerifyResult=ETrue; sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, aStatus.Int()); sl@0: break; sl@0: } sl@0: sl@0: CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore); sl@0: ASSERT(keyStore); // Flag it up sl@0: sl@0: TInt keyCount = iKeys.Count(); sl@0: TInt i; sl@0: sl@0: for (i = 0; i < keyCount; i++) sl@0: { sl@0: CCTKeyInfo* keyInfo = iKeys[i]; sl@0: sl@0: if (keyInfo->Label() == *iLabel) sl@0: { sl@0: iExportHandle = keyInfo->Handle(); sl@0: sl@0: keyStore->ExportPublic(iExportHandle, iPublic, aStatus); sl@0: break; sl@0: } sl@0: } sl@0: iState = EDecrypt; sl@0: if (i == keyCount) sl@0: { sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, KErrNotFound); sl@0: } sl@0: } sl@0: break; sl@0: sl@0: case EDecrypt: sl@0: { sl@0: sl@0: if (aStatus.Int()!=KErrNone) sl@0: { sl@0: iState=EFinished; sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, aStatus.Int()); sl@0: break; sl@0: } sl@0: switch(iType) sl@0: { sl@0: #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC)) sl@0: case EECC: sl@0: { sl@0: if(iHardwareType) sl@0: { sl@0: if(*iPlainText == *iPublic) sl@0: { sl@0: aStatus = KErrNone; sl@0: } sl@0: else sl@0: { sl@0: aStatus = KErrGeneral; sl@0: } sl@0: } sl@0: else sl@0: { sl@0: aStatus = KErrGeneral; sl@0: if (iDecrypt) sl@0: { sl@0: HBufC8* decryptedText = NULL; sl@0: TRAPD(err, decryptedText = HBufC8::NewL(iDecrypt->GetMaximumOutputLengthL())); sl@0: sl@0: if (err == KErrNone) sl@0: { sl@0: CleanupStack::PushL(decryptedText); sl@0: TPtr8 decryptedTextPtr = decryptedText->Des(); sl@0: sl@0: TRAP(err, (iDecrypt->ProcessL(*iReadText, decryptedTextPtr))); sl@0: if(err != KErrNone) sl@0: { sl@0: aStatus = err; sl@0: } sl@0: if ((err == KErrNone) && (decryptedTextPtr sl@0: == iPublic->Des())) sl@0: { sl@0: aStatus = KErrNone; sl@0: } sl@0: CleanupStack::PopAndDestroy(decryptedText); sl@0: } sl@0: else sl@0: { sl@0: aStatus = err; sl@0: } sl@0: } sl@0: } sl@0: iState = EFinished; sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, aStatus.Int()); sl@0: } sl@0: break; sl@0: #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC sl@0: default: sl@0: { sl@0: CX509SubjectPublicKeyInfo* ki = sl@0: CX509SubjectPublicKeyInfo::NewLC(*iPublic); sl@0: sl@0: TX509KeyFactory factory; sl@0: CRSAPublicKey* key = factory.RSAPublicKeyL(ki->KeyData()); sl@0: CleanupStack::PushL(key); sl@0: sl@0: // Encrypt with public key sl@0: CRSAPKCS1v15Encryptor* encryptor = CRSAPKCS1v15Encryptor::NewLC(*key); sl@0: HBufC8* cipherText = HBufC8::NewLC(encryptor->MaxOutputLength()); sl@0: TPtr8 cipherTextPtr = cipherText->Des(); sl@0: sl@0: encryptor->EncryptL(*iReadText, cipherTextPtr); sl@0: sl@0: // Now decrypt again sl@0: iPlainText = HBufC8::NewMaxL(100); sl@0: iPlainTextPtr.Set(iPlainText->Des()); sl@0: iDecryptor->Decrypt(*cipherText, iPlainTextPtr, aStatus); sl@0: sl@0: CleanupStack::PopAndDestroy(cipherText); sl@0: CleanupStack::PopAndDestroy(encryptor); sl@0: CleanupStack::PopAndDestroy(key); sl@0: CleanupStack::PopAndDestroy(ki); sl@0: sl@0: iState = EFinished; sl@0: } sl@0: } // switch sl@0: } sl@0: break; sl@0: sl@0: case EFinished: sl@0: { sl@0: #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC)) sl@0: if(iType == EECC) sl@0: { sl@0: iActionState = EPostrequisite; sl@0: iResult = (aStatus.Int() == iExpectedResult); sl@0: sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, aStatus.Int()); sl@0: } sl@0: else sl@0: #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC sl@0: { sl@0: if (aStatus == KErrNone && (!iPlainText || sl@0: *iPlainText != *iReadText)) sl@0: { sl@0: aStatus = KErrGeneral; // Decryption failed sl@0: } sl@0: sl@0: iActionState = EPostrequisite; sl@0: iResult = (aStatus.Int() == iExpectedResult); sl@0: sl@0: if (iDecryptor) sl@0: { sl@0: iDecryptor->Release(); sl@0: } sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, aStatus.Int()); sl@0: } sl@0: } sl@0: break; sl@0: default: sl@0: ASSERT(EFalse); sl@0: } sl@0: sl@0: } sl@0: sl@0: void CDecrypt::PerformCancel() sl@0: { sl@0: CUnifiedKeyStore* keystore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore); sl@0: ASSERT(keystore); sl@0: sl@0: switch (iState) sl@0: { sl@0: case EOpenKey: sl@0: keystore->CancelList(); sl@0: break; sl@0: sl@0: case EExportPublic: sl@0: keystore->CancelOpen(); sl@0: break; sl@0: sl@0: case EDecrypt: sl@0: keystore->CancelExportPublic(); sl@0: break; sl@0: sl@0: case EFinished: sl@0: ASSERT(iDecryptor); sl@0: iDecryptor->CancelDecrypt(); sl@0: break; sl@0: sl@0: default: sl@0: break; sl@0: } sl@0: } sl@0: sl@0: void CDecrypt::Reset() sl@0: { sl@0: iState = EListKeysPreOpen; sl@0: iKeys.Close(); sl@0: if (iDecryptor) sl@0: { sl@0: iDecryptor->Release(); sl@0: iDecryptor = NULL; sl@0: } sl@0: delete iPlainText; sl@0: iPlainText = NULL; sl@0: delete iPublic; sl@0: iPublic = NULL; sl@0: #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC)) sl@0: delete iDecrypt; sl@0: iDecrypt = NULL; sl@0: #endif sl@0: } sl@0: sl@0: void CDecrypt::DoReportAction() sl@0: { sl@0: _LIT(KSigning, "Decrypting... "); sl@0: iOut.writeString(KSigning); sl@0: iOut.writeNewLine(); sl@0: } sl@0: sl@0: void CDecrypt::DoCheckResult(TInt aError) sl@0: { sl@0: if (iFinished) sl@0: { sl@0: TBuf<256> buf; sl@0: if (aError == KErrNone) sl@0: { sl@0: iOut.writeNewLine(); sl@0: _LIT(KSuccessful, "Decrypt success\n"); sl@0: buf.Format(KSuccessful); sl@0: iConsole.Write(buf); sl@0: iOut.writeString(buf); sl@0: iOut.writeNewLine(); sl@0: } sl@0: else sl@0: { sl@0: if (aError!=iExpectedResult) sl@0: { sl@0: _LIT(KFailed, "!!!Decrypt failure %d!!!\n"); sl@0: buf.Format(KFailed, aError); sl@0: iConsole.Write(buf); sl@0: iOut.writeString(buf); sl@0: } sl@0: else sl@0: { sl@0: _LIT(KFailed, "Decrypt failed, but expected\n"); sl@0: iConsole.Write(KFailed); sl@0: iOut.writeString(KFailed); sl@0: } sl@0: sl@0: iOut.writeNewLine(); sl@0: } sl@0: } sl@0: } sl@0: sl@0: CDecrypt::CDecrypt(RFs& aFs, CConsoleBase& aConsole, Output& aOut) sl@0: : CKeyStoreTestAction(aFs, aConsole, aOut), iPlainTextPtr(0,0) sl@0: {} sl@0: sl@0: void CDecrypt::ConstructL(const TTestActionSpec& aTestActionSpec) sl@0: { sl@0: CKeyStoreTestAction::ConstructL(aTestActionSpec); sl@0: sl@0: SetSignText(Input::ParseElement(aTestActionSpec.iActionBody, KTextStart)); sl@0: iFilter.iPolicyFilter = TCTKeyAttributeFilter::EAllKeys; sl@0: sl@0: iState = EListKeysPreOpen; sl@0: } sl@0: sl@0: void CDecrypt::SetSignText(const TDesC8& aText) sl@0: { sl@0: iReadText = HBufC8::NewMax(aText.Size()); sl@0: if (iReadText) sl@0: { sl@0: TPtr8 theText(iReadText->Des()); sl@0: theText.FillZ(); sl@0: theText.Copy(aText); sl@0: } sl@0: } sl@0: sl@0: //////////////////////////////////// sl@0: // CDerive sl@0: //////////////////////////////////// sl@0: sl@0: /*static*/ CTestAction* CDerive::NewL(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec) sl@0: { sl@0: CTestAction* self = CDerive::NewLC(aFs, aConsole, aOut, aTestActionSpec); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: /*static*/ CTestAction* CDerive::NewLC(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec) sl@0: { sl@0: CDerive* self = new (ELeave) CDerive(aFs, aConsole, aOut); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aTestActionSpec); sl@0: return self; sl@0: } sl@0: sl@0: CDerive::~CDerive() sl@0: { sl@0: iKeys.Close(); sl@0: iN.Close(); sl@0: iG.Close(); sl@0: if (iDH) sl@0: { sl@0: iDH->Release(); sl@0: } sl@0: delete iPublicKey; sl@0: delete iOutput; sl@0: delete iRemote; sl@0: } sl@0: sl@0: void CDerive::PerformAction(TRequestStatus& aStatus) sl@0: { sl@0: // Jump straight to final state if an error occured sl@0: if (aStatus.Int()!=KErrNone) sl@0: { sl@0: iState=EFinished; sl@0: } sl@0: sl@0: switch (iState) sl@0: { sl@0: case EListKeysPreOpen: sl@0: { sl@0: CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore); sl@0: ASSERT(keyStore); // Flag it up sl@0: if (keyStore) sl@0: keyStore->List(iKeys, iFilter, aStatus); sl@0: sl@0: iState = EOpenKey; sl@0: } sl@0: break; sl@0: sl@0: case EOpenKey: sl@0: { sl@0: CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore); sl@0: ASSERT(keyStore); // Flag it up sl@0: sl@0: TInt keyCount = iKeys.Count(); sl@0: sl@0: TInt i; sl@0: for (i = 0; i < keyCount; i++) sl@0: { sl@0: CCTKeyInfo* keyInfo = iKeys[i]; sl@0: sl@0: if (keyInfo->Label() == *iLabel) sl@0: { sl@0: keyStore->Open(*keyInfo, iDH, aStatus); sl@0: break; sl@0: } sl@0: } sl@0: iState = EExportPublic; sl@0: if (i == keyCount) sl@0: { sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, KErrNotFound); sl@0: } sl@0: } sl@0: break; sl@0: sl@0: case EExportPublic: sl@0: { sl@0: ASSERT(iDH); sl@0: iDH->PublicKey(iN, iG, iPublicKey, aStatus); sl@0: iState = EDerive; sl@0: } sl@0: break; sl@0: sl@0: case EDerive: sl@0: { sl@0: if (aStatus.Int()!=KErrNone) sl@0: { sl@0: iState=EFinished; sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, aStatus.Int()); sl@0: break; sl@0: } sl@0: sl@0: ASSERT(iPublicKey); sl@0: iDH->Agree(iRemote->PublicKey(), iOutput, aStatus); sl@0: sl@0: iState = EFinished; sl@0: } sl@0: break; sl@0: sl@0: case EFinished: sl@0: { sl@0: if (aStatus.Int()==KErrNone) sl@0: { sl@0: CDH* dh = CDH::NewLC(iRemote->PrivateKey()); sl@0: const HBufC8* output = dh->AgreeL(*iPublicKey); sl@0: CleanupStack::PopAndDestroy(dh); sl@0: sl@0: if (aStatus == KErrNone && (!iOutput || sl@0: *iOutput != *output)) sl@0: { sl@0: aStatus = KErrGeneral; // Agree failed sl@0: } sl@0: sl@0: delete const_cast(output); sl@0: } sl@0: sl@0: iActionState = EPostrequisite; sl@0: iResult = (aStatus.Int() == iExpectedResult); sl@0: sl@0: if (aStatus != KErrNone) sl@0: { sl@0: _LIT(KSignFail," !Failed when agreeing key!"); sl@0: iOut.writeString(KSignFail); sl@0: } sl@0: sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, aStatus.Int()); sl@0: } sl@0: break; sl@0: default: sl@0: ASSERT(EFalse); sl@0: } sl@0: } sl@0: sl@0: void CDerive::PerformCancel() sl@0: { sl@0: CUnifiedKeyStore* keystore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore); sl@0: ASSERT(keystore); sl@0: sl@0: switch (iState) sl@0: { sl@0: case EOpenKey: sl@0: keystore->CancelList(); sl@0: break; sl@0: sl@0: case EExportPublic: sl@0: keystore->CancelOpen(); sl@0: break; sl@0: sl@0: case EDerive: sl@0: keystore->CancelExportPublic(); sl@0: break; sl@0: sl@0: case EFinished: sl@0: ASSERT(iDH); sl@0: iDH->CancelAgreement(); sl@0: break; sl@0: sl@0: default: sl@0: break; sl@0: } sl@0: } sl@0: sl@0: void CDerive::Reset() sl@0: { sl@0: iState = EListKeysPreOpen; sl@0: iKeys.Close(); sl@0: if (iDH) sl@0: { sl@0: iDH->Release(); sl@0: iDH = NULL; sl@0: } sl@0: delete iPublicKey; sl@0: iPublicKey = NULL; sl@0: delete iOutput; sl@0: iOutput = NULL; sl@0: } sl@0: sl@0: void CDerive::DoReportAction() sl@0: { sl@0: _LIT(KSigning, "Deriving key... "); sl@0: iOut.writeString(KSigning); sl@0: iOut.writeNewLine(); sl@0: } sl@0: sl@0: void CDerive::DoCheckResult(TInt aError) sl@0: { sl@0: if (iFinished) sl@0: { sl@0: TBuf<256> buf; sl@0: if (aError == KErrNone) sl@0: { sl@0: iOut.writeNewLine(); sl@0: _LIT(KSuccessful, "Derive success\n"); sl@0: buf.Format(KSuccessful); sl@0: iConsole.Write(buf); sl@0: iOut.writeString(buf); sl@0: iOut.writeNewLine(); sl@0: } sl@0: else sl@0: { sl@0: if (aError!=iExpectedResult) sl@0: { sl@0: _LIT(KFailed, "!!!Derive failure %d!!!\n"); sl@0: buf.Format(KFailed, aError); sl@0: iConsole.Write(buf); sl@0: iOut.writeString(buf); sl@0: } sl@0: else sl@0: { sl@0: _LIT(KFailed, "Derive failed, but expected\n"); sl@0: iConsole.Write(KFailed); sl@0: iOut.writeString(KFailed); sl@0: } sl@0: sl@0: iOut.writeNewLine(); sl@0: } sl@0: } sl@0: } sl@0: sl@0: CDerive::CDerive(RFs& aFs, CConsoleBase& aConsole, Output& aOut) sl@0: : CKeyStoreTestAction(aFs, aConsole, aOut) sl@0: {} sl@0: sl@0: void CDerive::ConstructL(const TTestActionSpec& aTestActionSpec) sl@0: { sl@0: CKeyStoreTestAction::ConstructL(aTestActionSpec); sl@0: sl@0: // Set parameters sl@0: HBufC8* nData = Input::ParseElementHexL(aTestActionSpec.iActionBody, _L8("")); sl@0: CleanupStack::PushL(nData); sl@0: iN = RInteger::NewL(*nData); sl@0: CleanupStack::PopAndDestroy(nData); sl@0: HBufC8* gData = Input::ParseElementHexL(aTestActionSpec.iActionBody, _L8("")); sl@0: CleanupStack::PushL(gData); sl@0: iG = RInteger::NewL(*gData); sl@0: CleanupStack::PopAndDestroy(gData); sl@0: sl@0: // Generate 'remote' key pair sl@0: RInteger n = RInteger::NewL(iN); sl@0: CleanupStack::PushL(n); sl@0: RInteger g = RInteger::NewL(iG); sl@0: CleanupStack::PushL(g); sl@0: iRemote = CDHKeyPair::NewL(n, g); sl@0: CleanupStack::Pop(2); // n, g sl@0: sl@0: iFilter.iPolicyFilter = TCTKeyAttributeFilter::EAllKeys; sl@0: sl@0: iState = EListKeysPreOpen; sl@0: }