--- /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;
+ }