sl@0: /* sl@0: * Copyright (c) 2007-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: * Implementation of negative step classes for PKCS#10 tests. sl@0: * sl@0: */ sl@0: sl@0: sl@0: #include "tpkcs10negatives.h" sl@0: #include sl@0: #include sl@0: sl@0: // Key label sl@0: _LIT(KKeyLabel, "new pkcs10 neg test key"); sl@0: sl@0: // Panics sl@0: _LIT(KPanicNegativeTests, "PKCS10NegativeTests"); sl@0: TInt EPanicNegInvalidTestData = 1; sl@0: sl@0: // String of 256 characters sl@0: _LIT8(KHugeString, "p000000001p000000002p000000003p000000004p000000005p000000006p000000007" sl@0: "p000000008p000000009p000000010p000000011p000000012p000000013p000000014" sl@0: "p000000015p000000016p000000017p000000018p000000019p000000020p000000021" sl@0: "p000000022p000000023p000000024p000000025p23456"); sl@0: sl@0: sl@0: CPKCS10NegTesterActive::CPKCS10NegTesterActive(CTestExecuteLogger& aLogger) : sl@0: CActive(EPriorityStandard), sl@0: iLogger(aLogger), sl@0: iKeyImportStarted(EFalse) sl@0: { sl@0: CActiveScheduler::Add(this); sl@0: User::LeaveIfError(iFs.Connect()); sl@0: } sl@0: sl@0: CPKCS10NegTesterActive::~CPKCS10NegTesterActive() sl@0: { sl@0: Cancel(); sl@0: delete iKeyData; sl@0: if (iKeyInfo) sl@0: { sl@0: iKeyInfo->Release(); sl@0: } sl@0: delete iKeyStore; sl@0: iFs.Close(); sl@0: } sl@0: sl@0: CCTKeyInfo* CPKCS10NegTesterActive::doImportKeyL(CCertificateRequestStep *aStep) sl@0: { sl@0: INFO_PRINTF1(_L("Active object tester for Key Import")); sl@0: sl@0: iStep = aStep; sl@0: // Initialise Key store sl@0: iKeyStore = CUnifiedKeyStore::NewL(iFs); sl@0: iKeyStore->Initialize(iStatus); sl@0: sl@0: SetActive(); sl@0: CActiveScheduler::Start(); sl@0: sl@0: User::LeaveIfError(iStatus.Int()); sl@0: sl@0: return iKeyInfo; sl@0: } sl@0: sl@0: void CPKCS10NegTesterActive::RunL() sl@0: { sl@0: iError = iStatus.Int(); sl@0: if (iError != KErrNone) sl@0: { sl@0: CActiveScheduler::Stop(); sl@0: } sl@0: sl@0: if (iKeyImportStarted == EFalse) sl@0: { sl@0: INFO_PRINTF1(_L("Importing keys")); sl@0: TFileName filename; sl@0: filename = iStep->iPrivateKey; sl@0: RFile file; sl@0: User::LeaveIfError(file.Open(iFs, filename, EFileRead)); sl@0: CleanupClosePushL(file); sl@0: TInt size; sl@0: User::LeaveIfError(file.Size(size)); sl@0: iKeyData = HBufC8::NewMaxL(size); sl@0: TPtr8 keyPtr = iKeyData->Des(); sl@0: User::LeaveIfError(file.Read(keyPtr)); sl@0: CleanupStack::PopAndDestroy(); // file sl@0: sl@0: TTime start(0.0); sl@0: TTime end(0.0); sl@0: sl@0: // Assumes only one keystore sl@0: ASSERT(iKeyInfo == NULL); sl@0: iKeyStore->ImportKey(0, *iKeyData, EPKCS15UsageSign, KKeyLabel,0, start, end, iKeyInfo, iStatus); sl@0: iKeyImportStarted = ETrue; sl@0: SetActive(); sl@0: } sl@0: else sl@0: { sl@0: // Key import done sl@0: CActiveScheduler::Stop(); sl@0: } sl@0: } sl@0: sl@0: TInt CPKCS10NegTesterActive::RunError(TInt aError) sl@0: { sl@0: iError = aError; sl@0: CActiveScheduler::Stop(); sl@0: return KErrNone; sl@0: } sl@0: sl@0: TVerdict CPKCS10NegPKCS10GenericAttr::doTestStepL() sl@0: { sl@0: // Set it to pass initially sl@0: SetTestStepResult(EPass); sl@0: sl@0: ////////////////////////////////////////////////////////////////////////////// sl@0: // Test for invalid attribute for NewL sl@0: TInt numAttr = iArrayGenAttrOID.Count(); sl@0: __ASSERT_ALWAYS((numAttr > 0), User::Panic(KPanicNegativeTests, EPanicNegInvalidTestData)); sl@0: sl@0: HBufC8 *string = HBufC8::NewMaxLC(iArrayGenAttrValue[0].Length()); sl@0: string->Des().Copy(iArrayGenAttrValue[0]); sl@0: sl@0: CASN1EncOctetString* attrString = CASN1EncOctetString::NewLC(*string); sl@0: sl@0: CPKCS10Attribute *genericAttr = NULL; sl@0: TRAPD(err, genericAttr = CPKCS10Attribute::NewL(iArrayGenAttrOID[0], attrString)); sl@0: CleanupStack::Pop(attrString); sl@0: CleanupStack::PopAndDestroy(string); sl@0: sl@0: if (err != KErrNone) sl@0: { sl@0: delete attrString; sl@0: } sl@0: else sl@0: { sl@0: delete genericAttr; sl@0: } sl@0: sl@0: if (err != KErrBadDescriptor) sl@0: { sl@0: SetTestStepResult(EFail); sl@0: } sl@0: sl@0: ////////////////////////////////////////////////////////////////////////////// sl@0: // Test for NULL value for NewL sl@0: __ASSERT_ALWAYS((numAttr > 1), User::Panic(KPanicNegativeTests, EPanicNegInvalidTestData)); sl@0: sl@0: string = HBufC8::NewMaxLC(iArrayGenAttrValue[1].Length()); sl@0: string->Des().Copy(iArrayGenAttrValue[1]); sl@0: sl@0: if (*string == KNullDesC8) sl@0: { sl@0: attrString = NULL; sl@0: } sl@0: else sl@0: { sl@0: attrString = CASN1EncOctetString::NewLC(*string); sl@0: } sl@0: sl@0: TRAP(err, genericAttr = CPKCS10Attribute::NewL(iArrayGenAttrOID[1], attrString)); sl@0: if (attrString != NULL) sl@0: { sl@0: CleanupStack::Pop(attrString); sl@0: } sl@0: CleanupStack::PopAndDestroy(string); sl@0: sl@0: if (err != KErrNone) sl@0: { sl@0: delete attrString; sl@0: } sl@0: else sl@0: { sl@0: delete genericAttr; sl@0: } sl@0: sl@0: if (err != KErrArgument) sl@0: { sl@0: SetTestStepResult(EFail); sl@0: } sl@0: sl@0: ////////////////////////////////////////////////////////////////////////////// sl@0: // Test for NULL value for AddValueL sl@0: __ASSERT_ALWAYS((numAttr > 2), User::Panic(KPanicNegativeTests, EPanicNegInvalidTestData)); sl@0: string = HBufC8::NewMaxLC(iArrayGenAttrValue[2].Length()); sl@0: string->Des().Copy(iArrayGenAttrValue[2]); sl@0: sl@0: attrString = CASN1EncOctetString::NewLC(*string); sl@0: sl@0: TRAP(err, genericAttr = CPKCS10Attribute::NewL(iArrayGenAttrOID[2], attrString)); sl@0: CleanupStack::Pop(attrString); sl@0: CleanupStack::PopAndDestroy(string); sl@0: sl@0: // Should not be an error sl@0: if (err != KErrNone) sl@0: { sl@0: SetTestStepResult(EFail); sl@0: } sl@0: sl@0: // Try to add a NULL value sl@0: TRAP(err, genericAttr->AddValueL(NULL)); sl@0: delete genericAttr; sl@0: sl@0: // Should return an error sl@0: if (err != KErrArgument) sl@0: { sl@0: SetTestStepResult(EFail); sl@0: } sl@0: sl@0: ////////////////////////////////////////////////////////////////////////////// sl@0: // Test for invalid attribute for ResetL sl@0: string = HBufC8::NewMaxLC(iArrayGenAttrValue[2].Length()); sl@0: string->Des().Copy(iArrayGenAttrValue[2]); sl@0: sl@0: attrString = CASN1EncOctetString::NewLC(*string); sl@0: sl@0: TRAP(err, genericAttr = CPKCS10Attribute::NewL(iArrayGenAttrOID[2], attrString)); sl@0: CleanupStack::Pop(attrString); sl@0: sl@0: // Should not be an error sl@0: if (err != KErrNone) sl@0: { sl@0: SetTestStepResult(EFail); sl@0: } sl@0: sl@0: // Try to reset with an invalid attribute OID sl@0: attrString = CASN1EncOctetString::NewLC(*string); sl@0: TRAP(err, genericAttr->ResetL(KNullDesC, attrString)); sl@0: sl@0: if (err != KErrNone) sl@0: { sl@0: delete attrString; sl@0: } sl@0: sl@0: CleanupStack::Pop(attrString); sl@0: CleanupStack::PopAndDestroy(string); sl@0: delete genericAttr; sl@0: sl@0: // Should return an error sl@0: if (err != KErrBadDescriptor) sl@0: { sl@0: SetTestStepResult(EFail); sl@0: } sl@0: sl@0: ////////////////////////////////////////////////////////////////////////////// sl@0: // Test for NULL value for ResetL sl@0: string = HBufC8::NewMaxLC(iArrayGenAttrValue[2].Length()); sl@0: string->Des().Copy(iArrayGenAttrValue[2]); sl@0: sl@0: attrString = CASN1EncOctetString::NewLC(*string); sl@0: sl@0: TRAP(err, genericAttr = CPKCS10Attribute::NewL(iArrayGenAttrOID[2], attrString)); sl@0: CleanupStack::Pop(attrString); sl@0: CleanupStack::PopAndDestroy(string); sl@0: sl@0: // Should not be an error sl@0: if (err != KErrNone) sl@0: { sl@0: SetTestStepResult(EFail); sl@0: } sl@0: sl@0: // Try to reset with a NULL value sl@0: TRAP(err, genericAttr->ResetL(iArrayGenAttrOID[2], NULL)); sl@0: delete genericAttr; sl@0: sl@0: // Should return an error sl@0: if (err != KErrArgument) sl@0: { sl@0: SetTestStepResult(EFail); sl@0: } sl@0: sl@0: return TestStepResult(); sl@0: } sl@0: sl@0: TVerdict CPKCS10NegPKCS9ChallengePasswordAttr::doTestStepL() sl@0: { sl@0: // Set it to pass initially sl@0: SetTestStepResult(EPass); sl@0: sl@0: ////////////////////////////////////////////////////////////////////////////// sl@0: // Test for empty password for NewL sl@0: HBufC8 *passwordString = HBufC8::NewMaxLC(iChallengePassword.Length()); sl@0: passwordString->Des().Copy(iChallengePassword); sl@0: sl@0: CPKCS9ChallengePasswordAttr *chPasswordAttr = NULL; sl@0: TRAPD(err, chPasswordAttr = CPKCS9ChallengePasswordAttr::NewL(*passwordString)); sl@0: CleanupStack::PopAndDestroy(passwordString); sl@0: sl@0: if (err != KErrArgument) sl@0: { sl@0: SetTestStepResult(EFail); sl@0: } sl@0: sl@0: ////////////////////////////////////////////////////////////////////////////// sl@0: // Test for big password for ResetL sl@0: TRAP(err, chPasswordAttr = CPKCS9ChallengePasswordAttr::NewL(_L8("password"))); sl@0: sl@0: // Should not fail sl@0: if (err != KErrNone) sl@0: { sl@0: SetTestStepResult(EFail); sl@0: } sl@0: sl@0: TRAP(err, chPasswordAttr->ResetL(KHugeString)); sl@0: delete chPasswordAttr; sl@0: sl@0: if (err != KErrArgument) sl@0: { sl@0: SetTestStepResult(EFail); sl@0: } sl@0: sl@0: return TestStepResult(); sl@0: } sl@0: sl@0: TVerdict CPKCS10NegPKCS9ExtensionRequestAttr::doTestStepL() sl@0: { sl@0: // Set it to pass initially sl@0: SetTestStepResult(EPass); sl@0: sl@0: ////////////////////////////////////////////////////////////////////////////// sl@0: // Test for empty attribute OID for NewL sl@0: TInt numAttr = iArrayV3AttrOID.Count(); sl@0: __ASSERT_ALWAYS((numAttr > 0), User::Panic(KPanicNegativeTests, EPanicNegInvalidTestData)); sl@0: sl@0: CX509CertExtension* x509CertExtn = CX509CertExtension::NewL(iArrayV3AttrOID[0], iArrayV3AttrCritical[0], _L8("value")); sl@0: sl@0: CPKCS9ExtensionRequestAttr *chExtReqAttr = NULL; sl@0: TRAPD(err, chExtReqAttr = CPKCS9ExtensionRequestAttr::NewL(*x509CertExtn)); sl@0: sl@0: delete x509CertExtn; sl@0: sl@0: if (err != KErrBadDescriptor) sl@0: { sl@0: SetTestStepResult(EFail); sl@0: } sl@0: sl@0: ////////////////////////////////////////////////////////////////////////////// sl@0: // Test for empty attribute OID for AddExtensionL sl@0: __ASSERT_ALWAYS((numAttr > 1), User::Panic(KPanicNegativeTests, EPanicNegInvalidTestData)); sl@0: sl@0: x509CertExtn = CX509CertExtension::NewLC(iArrayV3AttrOID[1], iArrayV3AttrCritical[1], _L8("value")); sl@0: chExtReqAttr = CPKCS9ExtensionRequestAttr::NewLC(*x509CertExtn); sl@0: sl@0: CX509CertExtension *x509CertExtnNew = CX509CertExtension::NewLC(iArrayV3AttrOID[0], iArrayV3AttrCritical[0], _L8("value")); sl@0: TRAP(err, chExtReqAttr->AddExtensionL(*x509CertExtnNew)); sl@0: sl@0: CleanupStack::PopAndDestroy(3, x509CertExtn); // chExtReqAttr, x509CertExtnNew sl@0: sl@0: if (err != KErrBadDescriptor) sl@0: { sl@0: SetTestStepResult(EFail); sl@0: } sl@0: sl@0: return TestStepResult(); sl@0: } sl@0: sl@0: TVerdict CPKCS10NegPKCS10Attributes::doTestStepL() sl@0: { sl@0: // Set it to pass initially sl@0: SetTestStepResult(EPass); sl@0: sl@0: ////////////////////////////////////////////////////////////////////////////// sl@0: // Test for NULL attribute for AddPKCSAttributeL sl@0: CPKCS10Attributes *attrList = NULL; sl@0: attrList = CPKCS10Attributes::NewLC(); sl@0: TRAPD(err, attrList->AddPKCSAttributeL(NULL)); sl@0: CleanupStack::PopAndDestroy(attrList); sl@0: sl@0: if (err != KErrArgument) sl@0: { sl@0: SetTestStepResult(EFail); sl@0: } sl@0: sl@0: return TestStepResult(); sl@0: } sl@0: sl@0: TVerdict CPKCS10NegPKCS10Request::doTestStepL() sl@0: { sl@0: // Set it to pass initially sl@0: SetTestStepResult(EPass); sl@0: sl@0: ////////////////////////////////////////////////////////////////////////////// sl@0: // Test for invalid DN for NewL sl@0: CActiveScheduler* sch = new(ELeave) CActiveScheduler; sl@0: CActiveScheduler::Install(sch); sl@0: sl@0: // Import the key sl@0: CPKCS10NegTesterActive* activeObj = new (ELeave) CPKCS10NegTesterActive(Logger()); sl@0: CCTKeyInfo *keyInfo = activeObj->doImportKeyL(this); sl@0: sl@0: // Try to generate a cert req sl@0: CX500DistinguishedName* dn = NULL; sl@0: CPKCS10Request* req = NULL; sl@0: TRAPD(err, req = CPKCS10Request::NewL(*dn, *keyInfo)); sl@0: sl@0: if (err != KErrArgument) sl@0: { sl@0: SetTestStepResult(EFail); sl@0: } sl@0: sl@0: ////////////////////////////////////////////////////////////////////////////// sl@0: // Test for EDH for SetDigestAlgL sl@0: CArrayPtrFlat* array = new(ELeave) CArrayPtrFlat(7); sl@0: CleanupStack::PushL(array); sl@0: dn = CX500DistinguishedName::NewL(*array); sl@0: CleanupStack::PushL(dn); sl@0: sl@0: req = CPKCS10Request::NewL(*dn, *keyInfo); sl@0: sl@0: TRAP(err, req->SetDigestAlgL(EDH)); sl@0: sl@0: delete req; sl@0: array->ResetAndDestroy(); sl@0: CleanupStack::PopAndDestroy(2, array); //array, dn sl@0: sl@0: if (err != KErrArgument) sl@0: { sl@0: SetTestStepResult(EFail); sl@0: } sl@0: sl@0: ////////////////////////////////////////////////////////////////////////////// sl@0: // Test for NULL DN for SetDistinguishedNameL sl@0: array = new(ELeave) CArrayPtrFlat(7); sl@0: CleanupStack::PushL(array); sl@0: dn = CX500DistinguishedName::NewL(*array); sl@0: CleanupStack::PushL(dn); sl@0: sl@0: req = CPKCS10Request::NewL(*dn, *keyInfo); sl@0: sl@0: CX500DistinguishedName* nullDN = NULL; sl@0: TRAP(err, req->SetDistinguishedNameL(*nullDN)); sl@0: sl@0: delete req; sl@0: array->ResetAndDestroy(); sl@0: CleanupStack::PopAndDestroy(2, array); //array, dn sl@0: sl@0: if (err != KErrArgument) sl@0: { sl@0: SetTestStepResult(EFail); sl@0: } sl@0: sl@0: ////////////////////////////////////////////////////////////////////////////// sl@0: // Test for NULL for SetKeyInfoL sl@0: array = new(ELeave) CArrayPtrFlat(7); sl@0: CleanupStack::PushL(array); sl@0: dn = CX500DistinguishedName::NewL(*array); sl@0: CleanupStack::PushL(dn); sl@0: sl@0: req = CPKCS10Request::NewL(*dn, *keyInfo); sl@0: sl@0: CCTKeyInfo* nullKeyInfo = NULL; sl@0: TRAP(err, req->SetKeyInfoL(*nullKeyInfo)); sl@0: sl@0: delete req; sl@0: array->ResetAndDestroy(); sl@0: CleanupStack::PopAndDestroy(2, array); //array, dn sl@0: sl@0: if (err != KErrArgument) sl@0: { sl@0: SetTestStepResult(EFail); sl@0: } sl@0: sl@0: delete activeObj; // Will release keyInfo sl@0: delete sch; sl@0: sl@0: return TestStepResult(); sl@0: } sl@0: