os/security/cryptoservices/filebasedcertificateandkeystores/test/tkeystore/t_open.cpp
First public contribution.
2 * Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
4 * This component and the accompanying materials are made available
5 * under the terms of the License "Eclipse Public License v1.0"
6 * which accompanies this distribution, and is available
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
9 * Initial Contributors:
10 * Nokia Corporation - initial contribution.
20 #include "t_keystore_actions.h"
21 #include "t_keystore_defs.h"
27 #include <asymmetrickeys.h>
29 #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
30 #include <cryptospidef.h>
31 #include "cryptoasymmetriccipherapi.h"
32 #include "cryptosignatureapi.h"
33 #include <cryptospi/cryptoparams.h>
34 #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC && SYMBIAN_ENABLE_SDP_ECC
36 /*static*/ CTestAction* COpenKey::NewL(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
38 CTestAction* self = COpenKey::NewLC(aFs, aConsole, aOut, aTestActionSpec);
39 CleanupStack::Pop(self);
43 /*static*/ CTestAction* COpenKey::NewLC(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
45 COpenKey* self = new (ELeave) COpenKey(aFs, aConsole, aOut);
46 CleanupStack::PushL(self);
47 self->ConstructL(aTestActionSpec);
53 #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
60 void COpenKey::PerformAction(TRequestStatus& aStatus)
64 case EListKeysPreOpen:
65 {// Currently uses the first store, change to check the script for a specific store
66 CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
67 ASSERT(keyStore); // Flag it up
69 keyStore->List(iKeys, iFilter, aStatus);
77 CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
78 ASSERT(keyStore); // Flag it up
80 TInt keyCount = iKeys.Count();
83 for (i = 0; i < keyCount; i++)
85 CCTKeyInfo* keyInfo = iKeys[i];
87 if (keyInfo->Label() == *iLabel)
92 keyStore->Open(*keyInfo, iRSASigner, aStatus);
95 keyStore->Open(*keyInfo, iDSASigner, aStatus);
98 keyStore->Open(*keyInfo, iDecryptor, aStatus);
101 keyStore->Open(*keyInfo, iDH, aStatus);
103 #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
106 ASSERT(iHardwareType);
107 if(iOperationType == ESigning)
109 keyStore->Open(keyInfo->Handle(),iSigner,aStatus);
111 if(iOperationType == EDecryption)
113 keyStore->Open(keyInfo->Handle(),iDecrypt,aStatus);
117 #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
124 TRequestStatus* status = &aStatus;
125 User::RequestComplete(status, KErrNotFound);
135 TInt completionCode = aStatus.Int();
138 if (aStatus.Int() == KErrNone)
145 label = iRSASigner->Label().AllocLC();
146 iRSASigner->Release();
152 label = iDSASigner->Label().AllocLC();
153 iDSASigner->Release();
159 label = iDecryptor->Label().AllocLC();
160 iDecryptor->Release();
165 label = iDH->Label().AllocLC();
169 #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
172 ASSERT(iHardwareType);
173 if(iOperationType == ESigning && iSigner == NULL
174 || iOperationType == EDecryption && iDecrypt == NULL)
176 completionCode = KErrGeneral;
180 #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
182 #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
183 if(iHardwareType == 0)
184 #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
186 if (*label != *iLabel)
187 aStatus = KErrBadName;
188 CleanupStack::PopAndDestroy(label);
191 TRequestStatus* status = &aStatus;
192 User::RequestComplete(status, completionCode);
194 if (aStatus.Int()==iExpectedResult)
203 iActionState = EPostrequisite;
212 void COpenKey::PerformCancel()
214 CUnifiedKeyStore* keystore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
220 keystore->CancelList();
224 keystore->CancelOpen();
232 void COpenKey::Reset()
234 iState = EListKeysPreOpen;
238 iRSASigner->Release();
243 iDSASigner->Release();
248 iDecryptor->Release();
256 #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
261 #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
264 void COpenKey::DoReportAction()
266 _LIT(KDeleting, "Opening...");
267 iOut.writeString(KDeleting);
271 void COpenKey::DoCheckResult(TInt aError)
276 if (aError == KErrNone)
278 _LIT(KSuccessful, "Key open success\n");
279 buf.Format(KSuccessful);
281 iOut.writeString(buf);
286 if (aError!=iExpectedResult)
288 _LIT(KFailed, "!!!Key open failure %d!!!\n");
289 buf.Format(KFailed, aError);
291 iOut.writeString(buf);
295 _LIT(KFailed, "Key open failed, but expected\n");
296 iConsole.Write(KFailed);
297 iOut.writeString(KFailed);
305 COpenKey::COpenKey(RFs& aFs, CConsoleBase& aConsole, Output& aOut)
306 : CKeyStoreTestAction(aFs, aConsole, aOut)
309 void COpenKey::ConstructL(const TTestActionSpec& aTestActionSpec)
311 CKeyStoreTestAction::ConstructL(aTestActionSpec);
313 #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
314 TInt pos = 0, err = 0;
315 TPtrC8 operationType = Input::ParseElement(aTestActionSpec.iActionBody, KOperationTypeStart, KOperationTypeEnd, pos, err);
316 if(operationType.Compare(_L8("sign")) == 0)
318 iOperationType = ESigning;
320 else if (operationType.Compare(_L8("decrypt")) == 0)
322 iOperationType = EDecryption;
324 #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
326 iState = EListKeysPreOpen;
330 ////////////////////////////////////
332 ////////////////////////////////////
333 /*static*/ CTestAction* CSign::NewL(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
335 CTestAction* self = CSign::NewLC(aFs, aConsole, aOut, aTestActionSpec);
336 CleanupStack::Pop(self);
340 /*static*/ CTestAction* CSign::NewLC(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
342 CSign* self = new (ELeave) CSign(aFs, aConsole, aOut);
343 CleanupStack::PushL(self);
344 self->ConstructL(aTestActionSpec);
352 delete iExportedPublicKey;
353 delete iRSASignature;
354 delete iDSASignature;
356 #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
358 delete iSpiSignature;
359 #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
362 void CSign::PerformAction(TRequestStatus& aStatus)
364 // Jump straight to final state if an error occured
365 if (aStatus.Int()!=KErrNone)
372 case EListKeysPreOpen:
374 CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
375 ASSERT(keyStore); // Flag it up
377 keyStore->List(iKeys, iFilter, aStatus);
385 CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
386 ASSERT(keyStore); // Flag it up
387 TInt keyCount = iKeys.Count();
390 for (i = 0; i < keyCount; i++)
392 CCTKeyInfo* keyInfo = iKeys[i];
394 if (keyInfo->Label() == *iLabel)
399 keyStore->Open(*keyInfo, iRSASigner, aStatus);
402 keyStore->Open(*keyInfo, iDSASigner, aStatus);
406 break; // Nothing to do, for the compiler
408 #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
411 iTokenHandle = keyInfo->Handle();
412 if(iHardwareType == 0)
414 keyStore->Open(iTokenHandle, iSigner, aStatus);
418 TRequestStatus* status = &aStatus;
419 User::RequestComplete(status, KErrNone);
423 #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
428 TRequestStatus* status = &aStatus;
429 User::RequestComplete(status, KErrNotFound);
445 if (iFailHashDigest) // Don't hash it, fail deliberately
446 iRSASigner->Sign(*iReadText,iRSASignature,aStatus);
447 else // message gets signed by the keystore
448 iRSASigner->SignMessage(*iReadText,iRSASignature,aStatus);
452 iRSASigner->Sign(*iReadText,iRSASignature,aStatus);
460 if (iFailHashDigest) // Don't hash it, deliberately fail it
461 iDSASigner->Sign(*iReadText,iDSASignature,aStatus);
462 else // message gets signed by the keystore
463 iDSASigner->SignMessage(*iReadText,iDSASignature,aStatus);
467 iDSASigner->Sign(*iReadText,iDSASignature,aStatus);
471 #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
474 TRAPD(err, iSpiSignature = CryptoSpi::CCryptoParams::NewL());
479 CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
480 ASSERT(keyStore); // Flag it up
481 keyStore->Sign(iTokenHandle, *iReadText, iSpiSignature, aStatus);
487 TRAP(err, iSigner->SignL(*iReadText, *iSpiSignature));
490 TRequestStatus* status = &aStatus;
491 User::RequestComplete(status, aStatus.Int());
497 TRequestStatus* status = &aStatus;
498 User::RequestComplete(status, aStatus.Int());
502 #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
507 iState = EExportPublic;
514 CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
515 ASSERT(keyStore); // Flag it up
517 TInt keyCount = iKeys.Count();
519 for (i = 0; i < keyCount; i++)
521 CCTKeyInfo* keyInfo = iKeys[i];
523 if (keyInfo->Label() == *iLabel)
525 iExportHandle = keyInfo->Handle();
530 keyStore->ExportPublic(iExportHandle, iExportedPublicKey, aStatus);
533 keyStore->ExportPublic(iExportHandle, iExportedPublicKey, aStatus);
537 break; // Nothing to do, for the compiler
538 #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
541 keyStore->ExportPublic(iExportHandle, iExportedPublicKey, aStatus);
545 #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
553 TRequestStatus* status = &aStatus;
554 User::RequestComplete(status, KErrNotFound);
561 TInt keyCount = iKeys.Count();
563 for (i = 0; i < keyCount; i++)
565 CCTKeyInfo* keyInfo = iKeys[i];
567 if (keyInfo->Label() == *iLabel)
569 iExportHandle = keyInfo->Handle();
570 CX509SubjectPublicKeyInfo* ki = NULL;
571 #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
573 #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
574 ki = CX509SubjectPublicKeyInfo::NewLC(*iExportedPublicKey);
580 TX509KeyFactory factory;
581 CRSAPublicKey* key = factory.RSAPublicKeyL(ki->KeyData());
582 CleanupStack::PushL(key);
584 CRSAPKCS1v15Verifier* verifier = NULL;
586 if (iHash) // Must compare with hash of original data
588 verifier = CRSAPKCS1v15Verifier::NewLC(*key);
590 iVerifyResult = verifier->VerifyL(iHash->Final(*iReadText), *iRSASignature);
594 verifier = CRSAPKCS1v15Verifier::NewLC(*key);
595 iVerifyResult = verifier->VerifyL(*iReadText, *iRSASignature);
598 _LIT(KReturned, "Returned... ");
599 iOut.writeString(KReturned);
602 CleanupStack::PopAndDestroy(2, key);
607 TX509KeyFactory factory;
608 CDSAPublicKey* key = factory.DSAPublicKeyL(ki->EncodedParams(), ki->KeyData());
609 CleanupStack::PushL(key);
611 CDSAVerifier* verifier = CDSAVerifier::NewLC(*key);
612 if (iHash) // Must compare with hash of original value
615 iVerifyResult = verifier->VerifyL(iHash->Final(*iReadText),*iDSASignature);
619 iVerifyResult = verifier->VerifyL(*iReadText,*iDSASignature);
621 _LIT(KReturned, "Returned... ");
622 iOut.writeString(KReturned);
624 CleanupStack::PopAndDestroy(verifier);
625 CleanupStack::PopAndDestroy(key);
629 #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
632 iVerifyResult = EFalse;
633 if (iSpiSignature && iSpiSignature->IsPresent(CryptoSpi::KEccKeyTypeUid))
635 TDesC8* actualSignature = NULL;
636 TRAPD(err, actualSignature = const_cast<TDesC8*>(&(iSpiSignature->GetTDesC8L(CryptoSpi::KEccKeyTypeUid))));
639 if(iExportedPublicKey->Des() == *actualSignature)
641 iVerifyResult = ETrue;
649 _LIT(KReturned, "Returned... ");
650 iOut.writeString(KReturned);
654 #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
659 #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
661 #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
662 CleanupStack::PopAndDestroy(ki);
667 TRequestStatus* status = &aStatus;
670 _LIT(KVerifyFail, "**Verify failed**");
671 iOut.writeString(KVerifyFail);
674 // Flat verify failed as KErrGeneral
675 if (aStatus.Int() == KErrNone)
677 aStatus = KErrGeneral;
680 User::RequestComplete(status, aStatus.Int());
686 iActionState = EPostrequisite;
687 iResult = (aStatus.Int() == iExpectedResult);
689 if ((aStatus.Int() != KErrNone)&&(aStatus!=KErrNoMemory))
691 _LIT(KExportFail," !Failed when exporting public key! ");
692 iOut.writeString(KExportFail);
700 iRSASigner->Release();
704 iDSASigner->Release();
708 iDecryptor->Release();
714 TRequestStatus* status = &aStatus;
715 User::RequestComplete(status, aStatus.Int());
723 void CSign::PerformCancel()
725 CUnifiedKeyStore* keystore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
731 keystore->CancelList();
735 keystore->CancelOpen();
743 iRSASigner->CancelSign();
748 iDSASigner->CancelSign();
757 keystore->CancelExportPublic();
767 iState = EListKeysPreOpen;
771 iRSASigner->Release();
776 iDSASigner->Release();
779 delete iExportedPublicKey;
780 iExportedPublicKey = NULL;
781 delete iRSASignature;
782 iRSASignature = NULL;
783 delete iDSASignature;
784 iDSASignature = NULL;
785 #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
788 delete iSpiSignature;
789 iSpiSignature = NULL;
790 #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
793 void CSign::DoReportAction()
795 _LIT(KSigning, "Signing... ");
796 iOut.writeString(KSigning);
800 void CSign::DoCheckResult(TInt aError)
805 if (aError == KErrNone)
808 _LIT(KSuccessful, "Sign success\n");
809 buf.Format(KSuccessful);
811 iOut.writeString(buf);
816 if (aError!=iExpectedResult)
818 _LIT(KFailed, "!!!Sign failure %d!!!\n");
819 buf.Format(KFailed, aError);
821 iOut.writeString(buf);
825 _LIT(KFailed, "Sign failed, but expected\n");
826 iConsole.Write(KFailed);
827 iOut.writeString(KFailed);
835 CSign::CSign(RFs& aFs, CConsoleBase& aConsole, Output& aOut)
836 : CKeyStoreTestAction(aFs, aConsole, aOut)
839 void CSign::ConstructL(const TTestActionSpec& aTestActionSpec)
841 CKeyStoreTestAction::ConstructL(aTestActionSpec);
843 SetDigestSignL(Input::ParseElement(aTestActionSpec.iActionBody, KSignDigestStart));
844 SetSignText(Input::ParseElement(aTestActionSpec.iActionBody, KTextStart, KTextEnd));
846 iFilter.iPolicyFilter = TCTKeyAttributeFilter::EAllKeys;
848 iState = EListKeysPreOpen;
852 void CSign::SetDigestSignL(const TDesC8& aSignDigestDesc)
854 TLex8 lexer(aSignDigestDesc);
859 iHash = CMessageDigestFactory::NewDigestL(CMessageDigest::ESHA1);
862 iFailHashDigest = ETrue;
865 void CSign::SetSignText(const TDesC8& aText)
867 iReadText = HBufC8::NewMax(aText.Size());
870 TPtr8 theText(iReadText->Des());
876 ////////////////////////////////////
878 ////////////////////////////////////
879 /*static*/ CTestAction* CDecrypt::NewL(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
881 CTestAction* self = CDecrypt::NewLC(aFs, aConsole, aOut, aTestActionSpec);
882 CleanupStack::Pop(self);
886 /*static*/ CTestAction* CDecrypt::NewLC(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
888 CDecrypt* self = new (ELeave) CDecrypt(aFs, aConsole, aOut);
889 CleanupStack::PushL(self);
890 self->ConstructL(aTestActionSpec);
894 CDecrypt::~CDecrypt()
900 #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
905 void CDecrypt::PerformAction(TRequestStatus& aStatus)
907 // Jump straight to final state if an error occured
908 if (aStatus.Int()!=KErrNone)
915 case EListKeysPreOpen:
916 {// Currently uses the first store, change to check the script for a specific store
917 CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
918 ASSERT(keyStore); // Flag it up
920 keyStore->List(iKeys, iFilter, aStatus);
928 CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
929 ASSERT(keyStore); // Flag it up
931 TInt keyCount = iKeys.Count();
933 for (i = 0; i < keyCount; i++)
935 CCTKeyInfo* keyInfo = iKeys[i];
937 if (keyInfo->Label() == *iLabel)
941 #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
943 if(iHardwareType == 0)
945 keyStore->Open(keyInfo->Handle(), iDecrypt, aStatus);
947 else if(iHardwareType == 1 )
950 * Call the decrypt of hardware directly. iPlainText
951 * would be populated.
953 keyStore->Decrypt(keyInfo->Handle(), *iReadText, iPlainText, aStatus);
956 #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
959 keyStore->Open(*keyInfo, iDecryptor, aStatus);
966 iState = EExportPublic;
969 TRequestStatus* status = &aStatus;
970 User::RequestComplete(status, KErrNotFound);
977 if (aStatus.Int()!=KErrNone)
979 _LIT(KSignFail," !Failed when opening! ");
980 iOut.writeString(KSignFail);
982 // need to set it to true so that test is true if some error was expected
984 TRequestStatus* status = &aStatus;
985 User::RequestComplete(status, aStatus.Int());
989 CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
990 ASSERT(keyStore); // Flag it up
992 TInt keyCount = iKeys.Count();
995 for (i = 0; i < keyCount; i++)
997 CCTKeyInfo* keyInfo = iKeys[i];
999 if (keyInfo->Label() == *iLabel)
1001 iExportHandle = keyInfo->Handle();
1003 keyStore->ExportPublic(iExportHandle, iPublic, aStatus);
1010 TRequestStatus* status = &aStatus;
1011 User::RequestComplete(status, KErrNotFound);
1019 if (aStatus.Int()!=KErrNone)
1022 TRequestStatus* status = &aStatus;
1023 User::RequestComplete(status, aStatus.Int());
1028 #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
1033 if(*iPlainText == *iPublic)
1039 aStatus = KErrGeneral;
1044 aStatus = KErrGeneral;
1047 HBufC8* decryptedText = NULL;
1048 TRAPD(err, decryptedText = HBufC8::NewL(iDecrypt->GetMaximumOutputLengthL()));
1050 if (err == KErrNone)
1052 CleanupStack::PushL(decryptedText);
1053 TPtr8 decryptedTextPtr = decryptedText->Des();
1055 TRAP(err, (iDecrypt->ProcessL(*iReadText, decryptedTextPtr)));
1060 if ((err == KErrNone) && (decryptedTextPtr
1065 CleanupStack::PopAndDestroy(decryptedText);
1074 TRequestStatus* status = &aStatus;
1075 User::RequestComplete(status, aStatus.Int());
1078 #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
1081 CX509SubjectPublicKeyInfo* ki =
1082 CX509SubjectPublicKeyInfo::NewLC(*iPublic);
1084 TX509KeyFactory factory;
1085 CRSAPublicKey* key = factory.RSAPublicKeyL(ki->KeyData());
1086 CleanupStack::PushL(key);
1088 // Encrypt with public key
1089 CRSAPKCS1v15Encryptor* encryptor = CRSAPKCS1v15Encryptor::NewLC(*key);
1090 HBufC8* cipherText = HBufC8::NewLC(encryptor->MaxOutputLength());
1091 TPtr8 cipherTextPtr = cipherText->Des();
1093 encryptor->EncryptL(*iReadText, cipherTextPtr);
1095 // Now decrypt again
1096 iPlainText = HBufC8::NewMaxL(100);
1097 iPlainTextPtr.Set(iPlainText->Des());
1098 iDecryptor->Decrypt(*cipherText, iPlainTextPtr, aStatus);
1100 CleanupStack::PopAndDestroy(cipherText);
1101 CleanupStack::PopAndDestroy(encryptor);
1102 CleanupStack::PopAndDestroy(key);
1103 CleanupStack::PopAndDestroy(ki);
1113 #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
1116 iActionState = EPostrequisite;
1117 iResult = (aStatus.Int() == iExpectedResult);
1119 TRequestStatus* status = &aStatus;
1120 User::RequestComplete(status, aStatus.Int());
1123 #endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
1125 if (aStatus == KErrNone && (!iPlainText ||
1126 *iPlainText != *iReadText))
1128 aStatus = KErrGeneral; // Decryption failed
1131 iActionState = EPostrequisite;
1132 iResult = (aStatus.Int() == iExpectedResult);
1136 iDecryptor->Release();
1138 TRequestStatus* status = &aStatus;
1139 User::RequestComplete(status, aStatus.Int());
1149 void CDecrypt::PerformCancel()
1151 CUnifiedKeyStore* keystore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
1157 keystore->CancelList();
1161 keystore->CancelOpen();
1165 keystore->CancelExportPublic();
1170 iDecryptor->CancelDecrypt();
1178 void CDecrypt::Reset()
1180 iState = EListKeysPreOpen;
1184 iDecryptor->Release();
1191 #if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
1197 void CDecrypt::DoReportAction()
1199 _LIT(KSigning, "Decrypting... ");
1200 iOut.writeString(KSigning);
1201 iOut.writeNewLine();
1204 void CDecrypt::DoCheckResult(TInt aError)
1209 if (aError == KErrNone)
1211 iOut.writeNewLine();
1212 _LIT(KSuccessful, "Decrypt success\n");
1213 buf.Format(KSuccessful);
1214 iConsole.Write(buf);
1215 iOut.writeString(buf);
1216 iOut.writeNewLine();
1220 if (aError!=iExpectedResult)
1222 _LIT(KFailed, "!!!Decrypt failure %d!!!\n");
1223 buf.Format(KFailed, aError);
1224 iConsole.Write(buf);
1225 iOut.writeString(buf);
1229 _LIT(KFailed, "Decrypt failed, but expected\n");
1230 iConsole.Write(KFailed);
1231 iOut.writeString(KFailed);
1234 iOut.writeNewLine();
1239 CDecrypt::CDecrypt(RFs& aFs, CConsoleBase& aConsole, Output& aOut)
1240 : CKeyStoreTestAction(aFs, aConsole, aOut), iPlainTextPtr(0,0)
1243 void CDecrypt::ConstructL(const TTestActionSpec& aTestActionSpec)
1245 CKeyStoreTestAction::ConstructL(aTestActionSpec);
1247 SetSignText(Input::ParseElement(aTestActionSpec.iActionBody, KTextStart));
1248 iFilter.iPolicyFilter = TCTKeyAttributeFilter::EAllKeys;
1250 iState = EListKeysPreOpen;
1253 void CDecrypt::SetSignText(const TDesC8& aText)
1255 iReadText = HBufC8::NewMax(aText.Size());
1258 TPtr8 theText(iReadText->Des());
1260 theText.Copy(aText);
1264 ////////////////////////////////////
1266 ////////////////////////////////////
1268 /*static*/ CTestAction* CDerive::NewL(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
1270 CTestAction* self = CDerive::NewLC(aFs, aConsole, aOut, aTestActionSpec);
1271 CleanupStack::Pop(self);
1275 /*static*/ CTestAction* CDerive::NewLC(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
1277 CDerive* self = new (ELeave) CDerive(aFs, aConsole, aOut);
1278 CleanupStack::PushL(self);
1279 self->ConstructL(aTestActionSpec);
1297 void CDerive::PerformAction(TRequestStatus& aStatus)
1299 // Jump straight to final state if an error occured
1300 if (aStatus.Int()!=KErrNone)
1307 case EListKeysPreOpen:
1309 CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
1310 ASSERT(keyStore); // Flag it up
1312 keyStore->List(iKeys, iFilter, aStatus);
1320 CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
1321 ASSERT(keyStore); // Flag it up
1323 TInt keyCount = iKeys.Count();
1326 for (i = 0; i < keyCount; i++)
1328 CCTKeyInfo* keyInfo = iKeys[i];
1330 if (keyInfo->Label() == *iLabel)
1332 keyStore->Open(*keyInfo, iDH, aStatus);
1336 iState = EExportPublic;
1339 TRequestStatus* status = &aStatus;
1340 User::RequestComplete(status, KErrNotFound);
1348 iDH->PublicKey(iN, iG, iPublicKey, aStatus);
1355 if (aStatus.Int()!=KErrNone)
1358 TRequestStatus* status = &aStatus;
1359 User::RequestComplete(status, aStatus.Int());
1364 iDH->Agree(iRemote->PublicKey(), iOutput, aStatus);
1372 if (aStatus.Int()==KErrNone)
1374 CDH* dh = CDH::NewLC(iRemote->PrivateKey());
1375 const HBufC8* output = dh->AgreeL(*iPublicKey);
1376 CleanupStack::PopAndDestroy(dh);
1378 if (aStatus == KErrNone && (!iOutput ||
1379 *iOutput != *output))
1381 aStatus = KErrGeneral; // Agree failed
1384 delete const_cast<HBufC8*>(output);
1387 iActionState = EPostrequisite;
1388 iResult = (aStatus.Int() == iExpectedResult);
1390 if (aStatus != KErrNone)
1392 _LIT(KSignFail," !Failed when agreeing key!");
1393 iOut.writeString(KSignFail);
1396 TRequestStatus* status = &aStatus;
1397 User::RequestComplete(status, aStatus.Int());
1405 void CDerive::PerformCancel()
1407 CUnifiedKeyStore* keystore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
1413 keystore->CancelList();
1417 keystore->CancelOpen();
1421 keystore->CancelExportPublic();
1426 iDH->CancelAgreement();
1434 void CDerive::Reset()
1436 iState = EListKeysPreOpen;
1449 void CDerive::DoReportAction()
1451 _LIT(KSigning, "Deriving key... ");
1452 iOut.writeString(KSigning);
1453 iOut.writeNewLine();
1456 void CDerive::DoCheckResult(TInt aError)
1461 if (aError == KErrNone)
1463 iOut.writeNewLine();
1464 _LIT(KSuccessful, "Derive success\n");
1465 buf.Format(KSuccessful);
1466 iConsole.Write(buf);
1467 iOut.writeString(buf);
1468 iOut.writeNewLine();
1472 if (aError!=iExpectedResult)
1474 _LIT(KFailed, "!!!Derive failure %d!!!\n");
1475 buf.Format(KFailed, aError);
1476 iConsole.Write(buf);
1477 iOut.writeString(buf);
1481 _LIT(KFailed, "Derive failed, but expected\n");
1482 iConsole.Write(KFailed);
1483 iOut.writeString(KFailed);
1486 iOut.writeNewLine();
1491 CDerive::CDerive(RFs& aFs, CConsoleBase& aConsole, Output& aOut)
1492 : CKeyStoreTestAction(aFs, aConsole, aOut)
1495 void CDerive::ConstructL(const TTestActionSpec& aTestActionSpec)
1497 CKeyStoreTestAction::ConstructL(aTestActionSpec);
1500 HBufC8* nData = Input::ParseElementHexL(aTestActionSpec.iActionBody, _L8("<n>"));
1501 CleanupStack::PushL(nData);
1502 iN = RInteger::NewL(*nData);
1503 CleanupStack::PopAndDestroy(nData);
1504 HBufC8* gData = Input::ParseElementHexL(aTestActionSpec.iActionBody, _L8("<g>"));
1505 CleanupStack::PushL(gData);
1506 iG = RInteger::NewL(*gData);
1507 CleanupStack::PopAndDestroy(gData);
1509 // Generate 'remote' key pair
1510 RInteger n = RInteger::NewL(iN);
1511 CleanupStack::PushL(n);
1512 RInteger g = RInteger::NewL(iG);
1513 CleanupStack::PushL(g);
1514 iRemote = CDHKeyPair::NewL(n, g);
1515 CleanupStack::Pop(2); // n, g
1517 iFilter.iPolicyFilter = TCTKeyAttributeFilter::EAllKeys;
1519 iState = EListKeysPreOpen;