diff -r 000000000000 -r e35f40988205 xmlsecurityengine/xmlseccertman/src/xmlsecmsymbiancertchain.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xmlsecurityengine/xmlseccertman/src/xmlsecmsymbiancertchain.cpp Thu Dec 17 09:29:21 2009 +0200 @@ -0,0 +1,202 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: An XmlSec interface to the Symbian Unified Certificate Store +* +*/ + +#include "xmlsecmsymbiancertchain.h" + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CSymbianCertChain::CSymbianCertChain() +: CActive( EPriorityStandard ), + iCertChain( NULL ), + iValidationResult( NULL ), + iState( EUnitialized ) + { + } + +// --------------------------------------------------------------------------- +// Second phase constructor +// --------------------------------------------------------------------------- +// +void CSymbianCertChain::ConstructL() + { + User::LeaveIfError(iFs.Connect()); + CActiveScheduler::Add(this); + } + +// --------------------------------------------------------------------------- +// Two phase constructor +// --------------------------------------------------------------------------- +// +EXPORT_C CSymbianCertChain* CSymbianCertChain::NewL() + { + CSymbianCertChain* self = new( ELeave ) CSymbianCertChain; + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(self); + + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +EXPORT_C CSymbianCertChain::~CSymbianCertChain() + { + Cancel(); + + if (iCertChain) + { + delete iCertChain; + } + + if (iValidationResult) + { + delete iValidationResult; + } + + iFs.Close(); + } + +// ----------------------------------------------------------------------------- +// RunL +// Handles an active object's request completion event. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSymbianCertChain::RunL() + { + TInt errorCode = iStatus.Int(); + if ( errorCode ) + { + User::Leave(errorCode); + } + + switch(iState) + { + case EValidate: + CActiveScheduler::Stop(); + break; + default: + break; + + } + } + +// ----------------------------------------------------------------------------- +// DoCancel +// This function is called as part of the active object's Cancel(). +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSymbianCertChain::DoCancel() + { + } + +// ----------------------------------------------------------------------------- +// CSymbianCertStore::RunError +// Handles Leaves from RunL function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CSymbianCertChain::RunError(TInt aError) + { + iError=aError; + CActiveScheduler::Stop(); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// InitializeL +// Creates the CPKIXCertChain +// ----------------------------------------------------------------------------- +// +EXPORT_C void CSymbianCertChain::InitializeL( + TUint8 *aEncodedCerts, // One or more concatenated DER encoded X.509 certificates + TUint aEncodedCertsLen, // Length of the DER encoded X.509 certificates + const RPointerArray< CX509Certificate > &aRootCerts) // An array of certificates which the chain will treat as candidate root certificates + { + + TPtrC8 certPtr(aEncodedCerts, aEncodedCertsLen); + + if (iCertChain) + { + delete iCertChain; + iCertChain = NULL; + } + + iCertChain = CPKIXCertChain::NewL(iFs, certPtr, aRootCerts); + } + +// ----------------------------------------------------------------------------- +// ValidateL +// Validate the certificate +// ----------------------------------------------------------------------------- +// +EXPORT_C void CSymbianCertChain::ValidateL() + { + // iValidationResult will contain the result of the validation + __ASSERT_ALWAYS(iCertChain, User::Leave(KErrGeneral)); + + if (iValidationResult) + { + delete iValidationResult; + iValidationResult = NULL; + } + + TTime validationTime; + validationTime.HomeTime(); + + iValidationResult = CPKIXValidationResult::NewL(); + + iCertChain->ValidateL(*iValidationResult, validationTime, iStatus); + + iState = EValidate; + SetActive(); + } + +// ----------------------------------------------------------------------------- +// GetValidateResult +// Get the result of the validation +// Returns: EValidatedOK (0) if validation succeeds +// -1 if no result can be fetched +// enum TValidationError if validation fails +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CSymbianCertChain::GetValidateResult() + { + // iValidationResult contains the result of the validation + if (!iValidationResult) + return -1; + + return iValidationResult->Error().iReason; + + } + +// ----------------------------------------------------------------------------- +// GetError +// Get the error flag +// Returns: error code +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CSymbianCertChain::GetError() + { + return iError; + }