pkiutilities/CTSecurityDialogs/NotifSrc/CTSecurityDialogsAO.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 16:04:40 +0300
branchRCL_3
changeset 21 09b1ac925e3f
parent 20 63339781d179
child 22 03674e5abf46
permissions -rw-r--r--
Revision: 201033 Kit: 201035

/*
* Copyright (c) 2006-2010 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:
*
*/


// INCLUDE FILES
#include "CTSecurityDialogsAO.h"
#include "CTSecurityDialogNotifier.h"
//#include "CTPinQueryDialog.h"
//#include "CTSignTextDialog.h"
//#include "CTSelectCertificateDialog.h"
//#include "CTQueryDialog.h"
//#include "CTPinPinQueryDialog.h"
#include "CTUntrustedCertQuery.h"
//#include "CTInvalidCertNote.h"
#include <PKIDlg.h>
#include <badesca.h>
#include <StringLoader.h>
//#include <aknnotewrappers.h>
#include <unifiedcertstore.h>
#include <unifiedkeystore.h>
#include <mctkeystore.h>
#include <cctcertinfo.h>
#include <DocumentHandler.h>
#include <apmstd.h>
#include <DigSigningNote.h>
//#include <certmanui.rsg>
#include <X509CertNameParser.h>
#include <x509cert.h>
#include <x500dn.h>
#include <hash.h>
#include <x509certext.h>
#include <TrustedSitesStore.h>
#include <mctwritablecertstore.h>
#include <eikenv.h>                         // CEikonEnv
#include <AknUtils.h>                       // AknTextUtils

#include "SecQueryUi.h"                   // needed for password dialog

#include <hbdevicemessageboxsymbian.h>    // needed for Note dialogs    
#include <hbdevicenotificationdialogsymbian.h>

// LOCAL CONSTANTS AND MACROS
const TInt KCertArrayGranularity = 3;
const TInt KMaxLengthTextDetailsBody = 5000;
// CertLabel, Issuer, Owner max visible length
const TInt KMaxLengthTextCertLabelVisible = 200;
// "dd/mm/yyyy0"
const TInt KMaxLengthTextDateString = 20;
// Maximum length of a certificate
const TInt KMaxCertificateLength = 5000;

// Maximum length of key store password
const TInt KMaxKeystorePwLength = 6;

const TInt KMinImportKeyPwLen = 1;

const TInt KMaxCommonNameLength = 64;

const TUid KTrustedServerTokenUid = { 0x101FB66F };
const TUid KDeviceCertStoreTokenUid = { 0x101FB668 };

_LIT( KBlockSeparator, " " );
_LIT( KEnter, "\n" );
_LIT( KEnterEnter, "\n\n" );
_LIT( KKeyStoreEnterPwLabel, "Key store passphrase" );
_LIT( KKeyStoreCreatePwLabel, "New key store passphrase" );
_LIT( KKeyStoreImportKeyLabel, "Passphrase of the imported key file" );
_LIT( KKeyStoreExportKeyLabel, "Passphrase of the exported key file" );
_LIT( KPKCS12TokenLabel, "PKCS12");


// TODO: replace with OST tracing
#ifdef _DEBUG
#include <e32debug.h>
#define TRACE(x)        RDebug::Printf(x)
#define TRACE1(x,y)     RDebug::Printf(x,y)
#else
#define TRACE(x)
#define TRACE1(x,y)
#endif


// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::CCTSecurityDialogsAO
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CCTSecurityDialogsAO::CCTSecurityDialogsAO( CCTSecurityDialogNotifier* aNotifier,
        TBool& aDeleted ) :
    CActive( EPriorityStandard ), iNotifier( aNotifier ),
    iNextStep( EOperationCompleted ), iTrustedSiteCertStore( 0 ),
    iHandleIndex( -1 ), iCertPtr( 0, 0 ), iDeleted( aDeleted )
    {
    CActiveScheduler::Add( this );
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::ConstructL()
    {
    iDeleted = EFalse;
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CCTSecurityDialogsAO* CCTSecurityDialogsAO::NewL( CCTSecurityDialogNotifier* aNotifier,
        TBool& aDeleted )
    {
    CCTSecurityDialogsAO* self = new( ELeave ) CCTSecurityDialogsAO( aNotifier, aDeleted );

    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop();

    return self;
    }


// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::~CCTSecurityDialogsAO
// Destructor
// -----------------------------------------------------------------------------
//
CCTSecurityDialogsAO::~CCTSecurityDialogsAO()
    {
    Cancel();
    delete iText;
    delete iFilter;
    iCertHandleList.Close();
    if ( iCertArray )
        {
        //iCertArray->Reset(); // Should we reset this?
        //delete iCertArray;
        }
    iCertInfos.Close();
    if ( iCertInfo )
        {
        iCertInfo->Release(); // Should we release this?
        }
    iKeyInfos.Close();
    if ( iKeyInfo )
        {
        iKeyInfo->Release(); // Should we release this?
        }

    iServerCerts.ResetAndDestroy();
    delete iCertBuf;
    delete iServerName;
    delete iCertLabel;
    delete iKeyStore;
    delete iCertStore;
    iFs.Close();

    iDeleted = ETrue;
    }


// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::StartLD()
// Handles all the operations calls appropriate handler functionq
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::StartLD(
    const TDesC8& aBuffer,
    TInt aReplySlot,
    const RMessagePtr2& aMessage )
    {
    iOperation = *reinterpret_cast<const TInt *>( aBuffer.Ptr() ) & KSecurityDialogOperationMask;
    iRetry = *reinterpret_cast<const TInt *>( aBuffer.Ptr() ) & EPINValueIncorrect;
    iReplySlot = aReplySlot;
    iMessagePtr = aMessage;

    WIMSECURITYDIALOGS_WRITE_FORMAT( "CCTSecurityDialogsAO::StartLD iOperation=%d", iOperation );
    TRACE1( "CCTSecurityDialogsAO::StartLD iOperation=%d", iOperation );

    MapTlsProviderOperation( iOperation );

    switch ( iOperation )
        {
        case EEnablePIN:  // flow thru
        case EDisablePIN: // flow thru
        case EEnterPIN:
        case EChangePIN:
            {
            TPINInput PINInput = reinterpret_cast<const TPINInput&>( *aBuffer.Ptr() );
            iPIN = PINInput.iPIN;
            DoHandlePinOperationL();
            iStatus = KRequestPending;
            SetActive();
            break;
            }
        case EUnblockPIN:
            {
            TUnblockPINInput unblockPINInput = reinterpret_cast<const TUnblockPINInput&>( *aBuffer.Ptr() );
            iPIN = unblockPINInput.iPIN;
            iUnblockPIN = unblockPINInput.iUnblockPIN;
            DoHandleUnblockPinOperationL();
            iStatus = KRequestPending;
            SetActive();
            break;
            }

        case EPINBlocked:
            {
            TPINInput PINInput = reinterpret_cast<const TPINInput&>( *aBuffer.Ptr() );
            iPIN = PINInput.iPIN;
            DoHandleMessageL( EErrorPinCodeBlocked, iPIN.iPINLabel, iPIN.iTokenLabel, 0, 0 );
            iMessagePtr.Complete( KErrNone );
            break;
            }
        case ETotalBlocked:
            {
            TPINInput PINInput = reinterpret_cast<const TPINInput&>( *aBuffer.Ptr() );
            iPIN = PINInput.iPIN;
            DoHandleMessageL( EErrorPukCodeBlocked, iPIN.iPINLabel, iPIN.iTokenLabel, 0, 0 );
            iMessagePtr.Complete( KErrNone );
            break;
            }
        case ESignText:
        case EUserAuthenticationText:
        case EUserAuthentication:
            {
            iSignInput = reinterpret_cast<const TSignInput&>( *aBuffer.Ptr() );
            DoHandleSignTextL( aBuffer );
            break;
            }
        case ECreateCSR:
            {
            DoHandleCSRL( aBuffer.Mid( sizeof(TInt) ) );
            break;
            }
        case EDeleteCert:
        case ECertDetails:
            {
            DoHandleCertDetailsL( aBuffer.Mid( sizeof(TInt) ) );
            break;
            }
        case ESaveCert:
            {
            DoHandleSaveCertL( aBuffer );
            break;
            }
        case EUnblockPINInClear:
            {
            User::Leave( KErrNotSupported );
            break;
            }
        case EPinCodeBlockedInfo:
            {
            TPtrC8 pinLabelPtr = aBuffer.Mid( sizeof(TInt) + 1 );
            TPINLabel pinLabel;
            pinLabel.Copy( pinLabelPtr );
            HBufC* text = iNotifier->LoadResourceStringLC( iOperation, pinLabel );

            // TODO
            //CCTSignTextDialog::RunDlgLD( R_WIM_UNBLOCK_INFO_DIALOG, *text, iStatus, iRetValue );
            User::Leave( KErrGeneral );

            CleanupStack::PopAndDestroy( text );
            iStatus = KRequestPending;
            SetActive();
            break;
            }
        case EServerAuthenticationFailure:
            {
            DoHandleServerAuthFailL( aBuffer );
            break;
            }
        case MPKIDialog::ESignatureRequested:
            {
            DoHandleMessageL( EInfoSignTextRequested, KNullDesC, KNullDesC, 1, KMaxTInt );
            iRetValue = ETrue;
            HandleResponseAndCompleteL();
            break;
            }
        case MPKIDialog::ESignatureDone:
            {
            DoHandleMessageL( EInfoSignTextDone, KNullDesC, KNullDesC, 1, KMaxTInt );
            iRetValue = ETrue;
            HandleResponseAndCompleteL();
            break;
            }
        case MPKIDialog::ESigningCancelled:
            {
            DoHandleMessageL( EInfoSignTextCancelled, KNullDesC, KNullDesC, 1, KMaxTInt );
            iRetValue = ETrue;
            HandleResponseAndCompleteL();
            break;
            }
        case MPKIDialog::ENoMatchCert:
            {
            DoHandleMessageL( ENoMatchingPersonalCert, KNullDesC, KNullDesC, 1, KMaxTInt );
            break;
            }
        case MPKIDialog::ENoSecurityModule:
            {
            DoHandleMessageL( EErrorWimNotAvailable, KNullDesC, KNullDesC, 1, KMaxTInt );
            iRetValue = ETrue;
            HandleResponseAndCompleteL();
            break;
            }
        case MPKIDialog::EInternalError:
            {
            DoHandleMessageL( EErrorInternal, KNullDesC, KNullDesC, 1, KMaxTInt );
            iRetValue = ETrue;
            HandleResponseAndCompleteL();
            break;
            }
        case ESaveReceipt:
            {
            SaveReceiptL( aBuffer.Mid( sizeof(TInt) ) );
            break;
            }
        default:
            User::Panic( _L("CTestSecDlgNotifier"), 0 );
            break;
        }

    // Note that CCTSecurityDialogsAO::StartLD() must complete the given message and
    // delete itself when ready. However, there may be several steps before it can be
    // deleted. CCTSecurityDialogsAO::HandleResponseAndCompleteL() completes the given
    // message and deletes CCTSecurityDialogsAO object. Hence, every operation handling
    // function called above must call HandleResponseAndCompleteL() when it is ready.
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::DoHandleServerAuthFailL(const TDesC8& aBuffer)
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::DoHandleServerAuthFailL( const TDesC8& aBuffer )
    {
    TRACE( "CCTSecurityDialogsAO::DoHandleServerAuthFailL" );

    CServerAuthenticationFailureInput* srvAuthFail =
        CServerAuthenticationFailureInput::NewLC( aBuffer );
    TPtrC8 cert;
    TPtrC8 serverName;

    srvAuthFail->GetEncodedCert( cert );
    srvAuthFail->GetServerName( serverName );
    iAuthFailReason = srvAuthFail->FailureReason();
    CleanupStack::PopAndDestroy( srvAuthFail );

    iServerName = HBufC::NewL( serverName.Length() );
    iServerName->Des().Copy( serverName );
    iCertLabel = NULL;

    // Site will be checked later. For now it is not trusted
    iTrustedSite = EFalse;

    CX509Certificate* serverCert = CX509Certificate::NewLC( cert );
    const CX500DistinguishedName& dName = serverCert->SubjectName();

    HBufC* commonName = dName.ExtractFieldL( KX520CommonName );
    CleanupStack::PushL( commonName );
    if( commonName != NULL )
        {
        // Check the length of CN. RFC 3280 states
        // that max length of CN is 64.
        if( commonName->Length() <= KMaxCommonNameLength )
            {
            iCertLabel = HBufC::NewL( commonName->Length() );
            iCertLabel->Des().Append( commonName->Des() );
            }
        }
    CleanupStack::PopAndDestroy( commonName );

    if( iCertLabel == NULL )
        {
        // No or invalid commonName. Use domain name as label.
        iCertLabel = HBufC::NewL( iServerName->Length() );
        iCertLabel->Des().Append( iServerName->Des() );
        }

    CleanupStack::PopAndDestroy( serverCert );

    iCertBuf = HBufC8::NewL( cert.Length() );
    *iCertBuf = cert;

    InitCertStoreL();
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::DoHandleCertDetailsL(const TDesC8& aBuffer)
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::DoHandleCertDetailsL( const TDesC8& aBuffer )
    {
    TCTTokenObjectHandle tokenHandle =
        reinterpret_cast<const TCTTokenObjectHandle&>( *aBuffer.Ptr() );

    iTokenHandle.iTokenHandle.iTokenTypeUid = tokenHandle.iTokenHandle.iTokenTypeUid;
    iTokenHandle.iTokenHandle.iTokenId = tokenHandle.iTokenHandle.iTokenId;
    iTokenHandle.iObjectId = tokenHandle.iObjectId;

    InitCertStoreL();
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::DoHandleSaveCertL(const TDesC8& aBuffer)
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::DoHandleSaveCertL( const TDesC8& aBuffer )
    {
    TSaveCertInput saveCertInput =
        reinterpret_cast<const TSaveCertInput&>( *aBuffer.Ptr() );

    TInt start = sizeof( TSaveCertInput );
    delete iCertBuf;
    iCertBuf = NULL;
    iCertBuf = HBufC8::NewL( saveCertInput.iDataSize );
    const TUint8* certPtr = reinterpret_cast<const TUint8*>( aBuffer.Mid(start).Ptr() );
    iCertBuf->Des().Append( certPtr, saveCertInput.iDataSize );
    ShowCertDialogL();
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::DoHandleCSRL(const TDesC8& aBuffer)
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::DoHandleCSRL( const TDesC8& aBuffer )
    {
    WIMSECURITYDIALOGS_ENTERFN("CCTSecurityDialogsAO::DoHandleCSRL");
    TInt length = reinterpret_cast<const TInt&>( *aBuffer.Ptr() );
    TInt start = sizeof( TInt ) + 1;
    iText = HBufC::NewL( length );
    iText->Des().Copy( aBuffer.Mid( start, length ) );

    start = start + length;

    const TUint8* bufferPtr = aBuffer.Ptr();
    bufferPtr += start;

    TCTTokenObjectHandle tokenHandle;
    TCTTokenObjectHandle* tokenHandlePtr = &tokenHandle;
    TUint8* copyPtr = reinterpret_cast< TUint8* >( tokenHandlePtr );
    for( TInt i = 0; i < 12; i++ )
        {
        copyPtr[ i ] = bufferPtr[ i ];
        }

    iTokenHandle.iTokenHandle.iTokenTypeUid = tokenHandle.iTokenHandle.iTokenTypeUid;
    iTokenHandle.iTokenHandle.iTokenId = tokenHandle.iTokenHandle.iTokenId;
    iTokenHandle.iObjectId = tokenHandle.iObjectId;

    InitKeyStoreL();
    iNextStep = EGetKeyInfoByHandle;
    WIMSECURITYDIALOGS_LEAVEFN("CCTSecurityDialogsAO::DoHandleCSRL");
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::DoHandleSignTextL()
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::DoHandleSignTextL( const TDesC8& aBuffer )
    {
    TInt arraySize = sizeof( TCTTokenObjectHandle ) * iSignInput.iCertHandleArrayTotal;
    TInt start = sizeof( TSignInput );
    TInt end = start + arraySize;
    for (; start < end; start+=sizeof( TCTTokenObjectHandle ))
        {
        TCTTokenObjectHandle handle =
            reinterpret_cast<const TCTTokenObjectHandle&>(*aBuffer.Mid(start).Ptr());
        User::LeaveIfError( iCertHandleList.Append( handle ) );
        }
    start = end;
    HBufC* textToSign = NULL;
    if ( iOperation != EUserAuthentication )
        {
        textToSign = HBufC::NewLC( iSignInput.iVariableDataSize / 2 ); // 8 bit -> 16 bit descriptor
        //textToSign->Des().Copy(aBuffer.Mid(start));
        const TUint16* textToSignPtr = reinterpret_cast<const TUint16*>( aBuffer.Mid(start).Ptr() );
        textToSign->Des().Append( textToSignPtr, (iSignInput.iVariableDataSize / 2) );
        }

    if ( iCertHandleList.Count() > 0 )
        {
        iNextStep = EOperationSignTextShown;
        }
    else
        {
        iNextStep = EOperationCompleted;
        iCertHandleList.Close();
        }
    switch( iOperation )
        {
        case EUserAuthenticationText:
            {
            // TODO
            //CCTSignTextDialog::RunDlgLD( R_WIM_USERAUTHTEXT_DIALOG,
            //    *textToSign, iStatus, iRetValue );
            User::Leave( KErrGeneral );
            break;
            }
        case EUserAuthentication:
            {
            DoHandleMessageL( EUserAuthentication, KNullDesC, KNullDesC, 1, KMaxTInt );
            break;
            }
        case ESignText:
            {
            // TODO
            //CCTSignTextDialog::RunDlgLD( R_WIM_SIGNTEXT_DIALOG,*textToSign, iStatus, iRetValue );
            User::Leave( KErrGeneral );
            break;
            }
        default:
            {
            __ASSERT_DEBUG( EFalse,
                _L( "CCTSecurityDialogsAO::DoHandleSignTextL: Invalid operation" ) );
            break;
            }
        }
    iStatus = KRequestPending;
    SetActive();
    if ( iOperation == EUserAuthentication )
        {
        TRequestStatus* status = &iStatus;
        User::RequestComplete( status, KErrNone );
        }
    else
        {
        CleanupStack::PopAndDestroy( textToSign );
        }
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::DoHandleUnblockPinOperationL()
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::DoHandleUnblockPinOperationL()
    {
    if ( iRetry ) // Is this new try?
      {
        // Previous attempt was failed
        DoHandleMessageL( EErrorPukCodeIncorrect, KNullDesC, KNullDesC, 0, 0 );
      }
    // Ask the PUK code
    // The label is iPIN instead of iUnblockPIN, since we need to show to
    // the user which PIN to unblock
    DoHandleMessageL( EEnterPukNR, iPIN.iPINLabel,
        iPIN.iTokenLabel, iUnblockPIN.iMinLength, iUnblockPIN.iMaxLength );
    iNextStep = EEnterNewPIN;
    iMultiLineDlgType = EEnterNewPinNR;
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::DoHandlePinOperationL()
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::DoHandlePinOperationL()
    {
    if ( iRetry ) // Is this new try?
      {
        // Previous attempt was failed
        // incorrect pin code
        DoHandleMessageL( EErrorPinCodeIncorrect, KNullDesC, KNullDesC, 0, 0 );
      }
    // Ask the PIN code or PUK code
    if ( iPIN.iPINLabel == KKeyStoreEnterPwLabel )
        {
        HBufC* header = StringLoader::LoadLC(
            R_QTN_CM_HEADING_PHONE_KEYSTORE, CEikonEnv::Static() );
		iPIN.iMinLength = KMaxKeystorePwLength;
        DoHandleMessageL( EEnterKeyStorePw, KNullDesC, *header,
            iPIN.iMinLength, iPIN.iMaxLength );
        iMultiLineDlgType = EEnterNewKeyStorePw;
        CleanupStack::PopAndDestroy( header );
        RunL();

        }
    else if ( iPIN.iPINLabel == KKeyStoreImportKeyLabel )
        {
        iPIN.iMinLength = KMaxKeystorePwLength;
        DoHandleMessageL( EImportKeyPw, KNullDesC, KNullDesC,
            KMinImportKeyPwLen, iPIN.iMaxLength );
        iMultiLineDlgType = EEnterNewKeyStorePw;
        }
    else if ( iPIN.iPINLabel == KKeyStoreExportKeyLabel )
        {
        DoHandleMultilinePinQueryL( EExportKeyPw );
        iNextStep = EVerifyPINs;
        }
    else if ( iPIN.iPINLabel == KKeyStoreCreatePwLabel )
        {
        iPIN.iMinLength = KMaxKeystorePwLength;
        ShowInformationNoteL(R_QTN_CM_CREATING_KEYSTORE);
        DoHandleMultilinePinQueryL( EEnterNewKeyStorePw );
        iNextStep = EVerifyPINs;
        }
    else if ( iPIN.iTokenLabel == KPKCS12TokenLabel )
        {
        DoHandleMessageL( EEnterPw, iPIN.iPINLabel, KNullDesC,
          iPIN.iMinLength, iPIN.iMaxLength );
        }
    else
        {
        DoHandleMessageL( EEnterPinNR, iPIN.iPINLabel, iPIN.iTokenLabel,
          iPIN.iMinLength, iPIN.iMaxLength );
        iMultiLineDlgType = EEnterNewPinNR;
        }
    if ( EChangePIN == iOperation )
        {
        iNextStep = EEnterNewPIN;
        }
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::DoHandleMultilinePinQueryL()
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::DoHandleMultilinePinQueryL( const TInt& /*aDlgType*/ )
    {
    // TODO
#if 0
    iMultiLineDlgType = aDlgType;
    HBufC* dlgText1 = NULL;
    HBufC* dlgText2 = NULL;
    CCTPinPinQueryDialog* dlg = NULL;
    TDialogType dlgType = ( TDialogType )aDlgType;
    if ( EEnterNewKeyStorePw == dlgType )
        {
/*
        dlgText1 = iNotifier->LoadResourceStringLC( dlgType, KNullDesC );
        dlgText2 = iNotifier->LoadResourceStringLC( EVerifyKeyStorePw, KNullDesC );
        dlg = CCTPinPinQueryDialog::NewL( *dlgText1, *dlgText2, iPINValue2,
            iPINValueVerify, iPIN.iMinLength, iPIN.iMaxLength, iRetValue );16:19:13.812 xti1:MCU_ASCII_PRINTF; channel:0xE0; msg:*PlatSec* ERROR - Capability check failed - Process #tlstest[e8dc94b1]0001 was checked by Thread c32exe.exe[101f7989]0001::ESock_IP and was found to be missing the capabilities: NetworkControl .

        dlg->RunDlgLD( iStatus, R_WIM_PWPW_QUERY_DIALOG );
        CleanupStack::PopAndDestroy( 2, dlgText1 ); // dlgText1, dlgText2
*/
        dlgText1 =  StringLoader::LoadLC( R_QTN_SN_NEW_PHONE_KEYSTORE );
        dlgText2 = StringLoader::LoadLC( R_QTN_WIM_VERIFY_PIN );
        HBufC* message = HBufC::NewLC( KMaxLengthTextCertLabelVisible );
        message->Des().Append(dlgText1->Des());
        message->Des().Append(_L("|"));
        message->Des().Append(dlgText2->Des());
        CSecQueryUi* SecQueryUi = CSecQueryUi::NewL();
        TInt queryAccepted = SecQueryUi->SecQueryDialog(message->Des(), iPINValueVerify,
                                                    iPIN.iMinLength,iPIN.iMaxLength,
                                                    ESecUiAlphaSupported |
                                                    ESecUiCancelSupported |
                                                    ESecUiSecretSupported |
                                                    ESecUiEmergencyNotSupported);
        iRetValue=(queryAccepted==KErrNone);
        if(iRetValue)
            iPINValue2.Copy(iPINValueVerify); // dialog already does not OK with different pin codes
        delete SecQueryUi;
        SecQueryUi=NULL;
        CleanupStack::PopAndDestroy( message );
        CleanupStack::PopAndDestroy( dlgText2 );
        CleanupStack::PopAndDestroy( dlgText1 );
        RunL(); // had to call it this way
        }
    else if ( EExportKeyPw == dlgType )
        {
        dlgText1 = iNotifier->LoadResourceStringLC( dlgType, KNullDesC );
        dlgText2 = iNotifier->LoadResourceStringLC( EVerifyKeyStorePw, KNullDesC );
        dlg = CCTPinPinQueryDialog::NewL( *dlgText1, *dlgText2, iPINValue2,
            iPINValueVerify, iPIN.iMinLength, iPIN.iMaxLength, iRetValue );
        dlg->RunDlgLD( iStatus, R_WIM_PWPW_QUERY_DIALOG );
        CleanupStack::PopAndDestroy( 2, dlgText1 ); // dlgText1, dlgText2
        }
    else // Enter new PIN
        {
        dlgText1 = iNotifier->LoadResourceStringLC( dlgType, iPIN.iPINLabel );
        dlgText2 = iNotifier->LoadResourceStringLC( EVerifyPinNR, iPIN.iPINLabel );
        dlg = CCTPinPinQueryDialog::NewL( *dlgText1, *dlgText2, iPINValue2,
            iPINValueVerify, iPIN.iMinLength, iPIN.iMaxLength, iRetValue );
        dlg->RunDlgLD( iStatus, R_WIM_PINPIN_QUERY_DIALOG );
        CleanupStack::PopAndDestroy( 2, dlgText1 ); // dlgText1, dlgText2
        }
#endif
    User::Leave( KErrGeneral );
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::DoHandleMessageL()
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::DoHandleMessageL(
    const TInt& aDlgType,
    const TDesC& aDynamicText,
    const TDesC& aPinQueryHeading,
    const TInt aMinLength,
    const TInt aMaxLength )
    {
  TDialogType dlgType = ( TDialogType )aDlgType;

  HBufC* dlgText = iNotifier->LoadResourceStringLC( dlgType, aDynamicText, aPinQueryHeading );

  TDialogTypeItem item = iNotifier->GetDialogTypeItem( dlgType );

  //CAknResourceNoteDialog* dlg = NULL;

  TInt resource = 0;

  switch ( item.iNoteType )
        {
        case EInfoNote:
            {
            // TODO
            //dlg = new ( ELeave ) CAknInformationNote( ETrue );
            User::Leave( KErrGeneral );
            break;
            }

        case EErrorNote:
            {
            // TODO
            //dlg = new ( ELeave ) CAknErrorNote( ETrue );
            User::Leave( KErrGeneral );
            break;
            }
        case EConfirmationNote:
            {
            // TODO
            //dlg = new ( ELeave ) CAknConfirmationNote( ETrue );
            User::Leave( KErrGeneral );
            break;
            }
        case EInfoDialog:
            {
            // TODO
            /*
            CCTQueryDialog::RunDlgLD( iStatus,
                                        iRetValue,
                                        *dlgText, item.iSoftKeyResource,
                                        ECTInfoDialog );
            iStatus = KRequestPending;
            SetActive();
            */
            User::Leave( KErrGeneral );
            break;
            }
        case EEnterPwPwDialog:
            {
            // TODO
            /*
            CCTPinPinQueryDialog* dialog =
                CCTPinPinQueryDialog::NewL( *dlgText, *dlgText,
                iPINValue2, iPINValueVerify, aMinLength, aMaxLength, iRetValue );
            dialog->RunDlgLD( iStatus, R_WIM_PWPW_QUERY_DIALOG );
            */
            User::Leave( KErrGeneral );
            break;
            }
        case EEnterPinPinCodeDialog:
            {
            // TODO
            /*
            CCTPinPinQueryDialog* dialog =
                CCTPinPinQueryDialog::NewL( *dlgText, *dlgText,
                iPINValue2, iPINValueVerify, aMinLength, aMaxLength, iRetValue );
            dialog->RunDlgLD( iStatus, R_WIM_PINPIN_QUERY_DIALOG );
            */
            User::Leave( KErrGeneral );
            break;
            }
        case EEnterPwDialog:
        case EEnterPinNRCodeDialog:
        case EVerifyPinNRCodeDialog:
            {
            if ( item.iNoteType == EEnterPwDialog )
                {
                resource = R_WIM_PASSWORD_QUERY_DIALOG;
                }
            else
                {
                resource = R_WIM_PIN_QUERY_DIALOG;
                }

            TPINValue* pinValue = NULL;
            switch ( aDlgType )
                {
                case EEnterPinNR: // fall thru
                case EEnterPukNR:
                case EEnterKeyStorePw:
                case EImportKeyPw:
                    {
                    pinValue = &iPINValue1;
                    break;
                    }
                case EEnterNewPinNR:
                case EEnterNewKeyStorePw:
                case EExportKeyPw:
                    {
                    pinValue = &iPINValue2;
                    break;
                    }
                case EVerifyPinNR:
                    {
                    pinValue = &iPINValueVerify;
                    break;
                    }
                default:
                    {
                    User::Panic(_L("CSecDlgNotifier"), 0);
                    }
                }
               //iPinQueryDialogDeleted = EFalse;
               if(aDlgType!=EEnterKeyStorePw) {
                   // TODO
                   /*
                   CCTPinQueryDialog::RunDlgLD( iStatus,
                                            *dlgText,
                                            *pinValue,
                                            aMinLength,
                                            aMaxLength,
                                            iRetValue,
                                            resource,
                                            iPinQueryDialog,
                                            iPinQueryDialogDeleted );
                    */
                   User::Leave( KErrGeneral );
                   resource = resource;     // avoids compiler warning
                   break;
               }
               else
               {
                iPIN.iMinLength = KMaxKeystorePwLength;
                CSecQueryUi* SecQueryUi = CSecQueryUi::NewL();
                HBufC* header =StringLoader::LoadLC( R_QTN_SN_ENTER_PHONE_KEYSTORE);
                TInt queryAccepted = SecQueryUi->SecQueryDialog(header->Des(), *pinValue,
                                                        aMinLength,aMaxLength,
                                                        ESecUiAlphaSupported |
                                                        ESecUiCancelSupported |
                                                        ESecUiSecretSupported |
                                                        ESecUiEmergencyNotSupported);
                delete SecQueryUi;
                SecQueryUi=NULL;
                iRetValue=(queryAccepted==KErrNone);
                CleanupStack::PopAndDestroy( header );
                break;
               }
            }
    default:
            {
            break;
            }

      }
  // TODO
  /*
  if ( dlg && aDlgType!=EEnterKeyStorePw)
      {

      dlg->ExecuteLD( *dlgText );
      dlg = NULL;
      }
      */
  User::Leave( KErrGeneral );

    CleanupStack::PopAndDestroy( dlgText ); // dlgText
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::RunError(TInt aError)
// ?implementation_description
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TInt CCTSecurityDialogsAO::RunError( TInt aError )
    {
    iMessagePtr.Complete( aError );
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::InitCertStoreL()
// ?implementation_description
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::InitCertStoreL()
    {
    TRACE( "CCTSecurityDialogsAO::InitCertStoreL" );

    switch(iOperation)
        {
        case ESignText:
        case EUserAuthenticationText:
        case EUserAuthentication:
            {
            iNextStep = EOperationRetrieveCertInfos;
            break;
            }
        case EDeleteCert:
        case ECertDetails:
            {
            iNextStep = EGetCertInfo;
            break;
            }
        case EServerAuthenticationFailure:
            {
            iNextStep = EProcessTrustedSite;;
            break;
            }
        default:
            {
            User::Panic( _L("CTestSecDlgNotifier"), 0 );
            }
        }

    if ( iCertStore == NULL )
        {
        TInt err = KErrNone;
        err = iFs.Connect();

        if( err != KErrNone && err != KErrAlreadyExists )
            {
            User::Leave( KErrGeneral );
            }

        iCertStore = CUnifiedCertStore::NewL( iFs, ETrue );
        iCertArray = new (ELeave) CDesCArrayFlat( KCertArrayGranularity );
        iCertStore->Initialize( iStatus );
        iStatus = KRequestPending;
        SetActive();
        }
    else
        {
        iStatus = KRequestPending;
        SetActive();
        TRequestStatus* status = &iStatus;
        User::RequestComplete( status, KErrNone );
        }
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::InitKeyStoreL()
// ?implementation_description
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::InitKeyStoreL()
    {
    if ( NULL == iKeyStore )
        {
        TInt err = KErrNone;
        err  = iFs.Connect();
        if( err != KErrNone && err != KErrAlreadyExists )
            {
            User::Leave( KErrGeneral );
            }

        iKeyStore = CUnifiedKeyStore::NewL( iFs );
        iKeyStore->Initialize( iStatus );
        iStatus = KRequestPending;
        SetActive();
        }
    else
        {
        iStatus = KRequestPending;
        SetActive();
        TRequestStatus* status = &iStatus;
        User::RequestComplete( status, KErrNone );
        }
    }
// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::GetKeyInfosL()
// ?implementation_description
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::GetKeyInfosL()
    {
    if ( NULL == iKeyStore )
        {
        iStatus = KRequestPending;
        SetActive();
        TRequestStatus* status = &iStatus;
        User::RequestComplete( status, KErrNone );
        }
    else
        {
        iStatus = KRequestPending;
        iKeyFilter.iKeyId = iCertInfo->SubjectKeyId();
        iKeyStore->List( iKeyInfos, iKeyFilter, iStatus );
        SetActive();
        }
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::GetKeyInfoByHandleL()
// ?implementation_description
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::GetKeyInfoByHandleL()
    {
    if ( NULL == iKeyStore )
        {
        User::Panic( _L("CCTSecurityDialogsAO::GetKeyInfoByHandleL()"), 0 );
        }
    else
        {
        iStatus = KRequestPending;
        iKeyStore->GetKeyInfo( iTokenHandle, iKeyInfo, iStatus );
        SetActive();
        }
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::RunL()
// ?implementation_description
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::RunL()
    {
    WIMSECURITYDIALOGS_WRITE_FORMAT( "CCTSecurityDialogsAO::RunL, iStatus %d", iStatus.Int() );
    WIMSECURITYDIALOGS_WRITE_FORMAT( "  iNextStep %d", iNextStep );
    TRACE1( "CCTSecurityDialogsAO::RunL, iStatus.Int()=%d", iStatus.Int() );

    if( iStatus != KErrNone )
        {
        User::Leave( iStatus.Int() );
        }

    TRACE1( "CCTSecurityDialogsAO::RunL, iNextStep=%d", iNextStep );
    switch( iNextStep )
      {
      case EOperationCompleted:
        {
        WIMSECURITYDIALOGS_WRITE( "EOperationCompleted" );
        HandleResponseAndCompleteL();
        break;
        }

      case ECheckServerCerts:
        {
        WIMSECURITYDIALOGS_WRITE( "ECheckServerCerts" );

        TBool foundCert( EFalse );

        if( iServerCerts.Count() )
            {
            // Found certificates in the trusted site certificate storage.
            // Compare them with the one received from TlsProvider
            iCertPtr.Set( iCertBuf->Des() );
            CX509Certificate* serverCert = CX509Certificate::NewLC( iCertPtr );

            for( TInt i = 0; i < iServerCerts.Count(); i++ )
                {
                TPtr8 certPtr( iServerCerts[i]->Des() );
                CX509Certificate* cert = CX509Certificate::NewLC( certPtr );
                if( cert->Fingerprint() == serverCert->Fingerprint() )
                    {
                    foundCert = ETrue;
                    }
                CleanupStack::PopAndDestroy( cert );
                }

             CleanupStack::PopAndDestroy( serverCert );

             if( foundCert )
                {
                // Found matching certificate. Complete the operation
                iRetValue = EServerCertAcceptedPermanently;
                iNextStep = EOperationCompleted;
                HandleResponseAndCompleteL();
                }
            }

        if ( !foundCert )
            {
            // Couldn't find matching certificate. Prompt user
            ShowNoTrustDialogL();
            }
        break;
        }

      case EProcessTrustedSite:
        {
        WIMSECURITYDIALOGS_WRITE( "EProcessTrustedSite" );
        TRACE( "CCTSecurityDialogsAO::RunL, EProcessTrustedSite" );

        TInt count = iCertStore->WritableCertStoreCount();
        for( TInt i = 0; i < count; i++ )
            {
            MCTWritableCertStore *certstore = &iCertStore->WritableCertStore( i );
            MCTToken& token = certstore->Token();
            TUid tokenuid = token.Handle().iTokenTypeUid;
            if( tokenuid == KTrustedServerTokenUid )
                {
                iTrustedSiteCertStore = certstore;
                }
            }

        CTrustSitesStore* trustedSitesStore = CTrustSitesStore::NewL();
        CleanupStack::PushL( trustedSitesStore );

        // Find out whether or not site associated with certificate is trusted
        iTrustedSite = trustedSitesStore->IsTrustedSiteL( *iCertBuf, *iServerName );

        if( iTrustedSite )
            {
            TBool allowOutOfDate = trustedSitesStore->IsOutOfDateAllowedL(*iCertBuf, *iServerName);

            if( !allowOutOfDate )
                {
                CX509Certificate* cert = CX509Certificate::NewLC( iCertBuf->Des() );

                const CValidityPeriod& validityPeriod = cert->ValidityPeriod();
                const TTime& startValue = validityPeriod.Start();
                const TTime& finishValue = validityPeriod.Finish();
                TTime current;
                current.UniversalTime();

                // First check certificate validity period
                if ( ( startValue > current ) || ( finishValue < current ) )
                    {
                    iTrustedSite = EFalse;
                    }

                CleanupStack::PopAndDestroy( cert );
                }
            }
        CleanupStack::PopAndDestroy( trustedSitesStore );

        if( iTrustedSite )
            {
            // Site is trusted. Next step is to check that server
            // certificate is in the trusted site certificate storage
            iNextStep = ERetrieveServerCerts;
            iStatus = KRequestPending;
            SetActive();
            TRequestStatus* status = &iStatus;
            User::RequestComplete( status, KErrNone );
            }
         else
            {
            // Site is not trusted. Prompt user
            ShowNoTrustDialogL();
            }

        break;
        }

      case ERetrieveServerCerts:
        {
        WIMSECURITYDIALOGS_WRITE( "ERetrieveServerCerts" );
        if ( iHandleIndex == -1 )
            {
                iFilter = CCertAttributeFilter::NewL();
                iFilter->SetOwnerType( EPeerCertificate );
                if ( iTrustedSiteCertStore )
                    {
                    // Thet the list of all certificates from Trusted site certificate
                    // storage
                    iTrustedSiteCertStore->List( iCertInfos, *iFilter, iStatus );
                    iNextStep = ERetrieveServerCerts;
                    iStatus = KRequestPending;
                    SetActive();
                    ++iHandleIndex;
                    }
                else
                    {
                    // Trusted Site certificate storage doesn't exist
                    // or something went wrong.
                    User::Leave( KErrGeneral );
                    }
            }
        else if ( iHandleIndex < iCertInfos.Count() )
            {
            iStatus = KRequestPending;
            iServerCert = HBufC8::NewL( KMaxCertificateLength );
            iCertPtr.Set( iServerCert->Des() );

            iTrustedSiteCertStore->Retrieve( *(iCertInfos[iHandleIndex]), iCertPtr, iStatus );

            iServerCerts.Append( iServerCert );

            iNextStep = ERetrieveServerCerts;
            SetActive();
            ++iHandleIndex;
            }
        else
            {
            iNextStep = ECheckServerCerts;
            iStatus = KRequestPending;
            SetActive();
            TRequestStatus* status = &iStatus;
            User::RequestComplete( status, KErrNone );
            }
        break;
        }

      case EAddTrustedSite:
          {
          TRACE( "CCTSecurityDialogsAO::RunL, EAddTrustedSite" );
          if( iStatus.Int() == KErrNone )
              {
              //Added server certificate succesfully
              CTrustSitesStore* trustedSitesStore = CTrustSitesStore::NewL();
              CleanupStack::PushL( trustedSitesStore );

              TInt status = trustedSitesStore->AddL( *iCertBuf, *iServerName );

              CleanupStack::PopAndDestroy( trustedSitesStore );
              if( status  == KErrNone )
                  {
                  iRetValue = EServerCertAcceptedPermanently;
                  }
              else
                  {
                  iRetValue = EServerCertNotAccepted;
                  }

              iNextStep = EOperationCompleted;
              HandleResponseAndCompleteL();
              }
          else
              {
              //Adding server certificate failed
              // TODO: unreached code?
              iNextStep = EOperationCompleted;
              iRetValue = EServerCertNotAccepted;
              HandleResponseAndCompleteL();
              }
          break;
          }

      case ESaveServerCert:
          {
          WIMSECURITYDIALOGS_WRITE( "ESaveServerCert" );
          TRACE( "CCTSecurityDialogsAO::RunL, ESaveServerCert" );
          DoHandleSaveServerCertL();
          break;
          }

      case EServerCertCheckUserResp:
          {
          WIMSECURITYDIALOGS_WRITE( "EServerCertCheckUserResp" );
          TRACE( "CCTSecurityDialogsAO::RunL, EServerCertCheckUserResp" );
          if( iRetValue == EServerCertAcceptedPermanently )
              {
              // User accepted to select certificate permanently.
              // First add server certificate
              iNextStep = ESaveServerCert;
              iStatus = KRequestPending;
              SetActive();
              TRequestStatus* status = &iStatus;
              User::RequestComplete( status, KErrNone );
              }
          else
              {
              // User declined or temporarily accepted server certificate
              HandleResponseAndCompleteL();
              }
          break;
          }

      case EOperationSignTextShown:
          {
          if ( iRetValue || iOperation == EUserAuthentication )
              {
              iNextStep = EOperationInitCertStore;
              }
          else
              {
              iNextStep = EOperationCompleted;
              }
          iStatus = KRequestPending;
          SetActive();
          TRequestStatus* status = &iStatus;
          User::RequestComplete( status, KErrNone );
          break;
          }

      case EOperationInitCertStore:
          {
          TInt err = KErrNone;
          err = iFs.Connect();
          if( err != KErrNone && err != KErrAlreadyExists )
             {
             User::Leave( KErrGeneral );
             }

          iCertStore = CUnifiedCertStore::NewL( iFs, EFalse );
          iCertArray = new (ELeave) CDesCArrayFlat( KCertArrayGranularity );
          iCertStore->Initialize( iStatus );
          iStatus = KRequestPending;
          SetActive();
          iNextStep = EOperationRetrieveCertInfos;
          break;
          }

      case EOperationRetrieveCertInfos:
          {
          if ( iCertInfo )
              {
              iCertArray->AppendL( iCertInfo->Label() );
              iCertInfo = NULL;
              }
          if ( iHandleIndex == -1 )
              {
              iFilter = CCertAttributeFilter::NewL();
              iCertStore->List( iCertInfos, *iFilter, iStatus );
              iNextStep = EOperationRetrieveCertInfos;
              iStatus = KRequestPending;
              SetActive();
              ++iHandleIndex;
              }
          else if ( iHandleIndex < iCertHandleList.Count() )
              {
              iStatus = KRequestPending;
              iCertStore->GetCert( iCertInfo, iCertHandleList[iHandleIndex], iStatus );
              ++iHandleIndex;
              iNextStep = EOperationRetrieveCertInfos;
              SetActive();
              }
          else
              {
              iHandleIndex = -1;
              iNextStep = EOperationSelectCert;
              iStatus = KRequestPending;
              SetActive();
              TRequestStatus* status = &iStatus;
              User::RequestComplete( status, KErrNone );
              }
          break;
          }

      case EOperationSelectCert:
          {
          DoHandleSelectCertificateL();
          break;
          }

      case EGetCertInfo:
          {
          iStatus = KRequestPending;
          iCertInfo = NULL;
          iCertStore->GetCert( iCertInfo, iTokenHandle, iStatus );
          iNextStep = EGetCertificate;
          SetActive();
          break;
          }

      case EGetCertificate:
          {
          iStatus = KRequestPending;
          if ( iCertInfo )
              {
              iCertBuf = HBufC8::NewL( KMaxCertificateLength );
              iCertPtr.Set( iCertBuf->Des() );
              iCertStore->Retrieve( *iCertInfo, iCertPtr, iStatus );
              SetActive();
              }
          else
              {
              SetActive();
              TRequestStatus* status = &iStatus;
              User::RequestComplete( status, KErrNone );
              }
          iNextStep = EInitKeyStore;
          break;
          }

      case EInitKeyStore:
          {
          InitKeyStoreL();
          iNextStep = EGetKeyInfos;
          break;
          }

      case EGetKeyInfos:
          {
          GetKeyInfosL();
          iNextStep = EShowCertDialog;
          break;
          }

      case EGetKeyInfoByHandle:
          {
          GetKeyInfoByHandleL();
          iNextStep = EShowCSRDialog;
          break;
          }

      case EShowCSRDialog:
          {
          ShowCSRDialogL();
          iNextStep = EOperationCompleted;
          break;
          }

      case EShowCertDialog:
          {
          ShowCertDialogL();
          iNextStep = EOperationCompleted;
          break;
          }

      /////////////
      // PIN steps
      /////////////
      case EEnterNewPIN:
          {
          if ( iRetValue)
              {
              DoHandleMultilinePinQueryL( iMultiLineDlgType );
              iNextStep = EVerifyPINs;
              iStatus = KRequestPending;
              SetActive();
              }
          else
              {
              iNextStep = EOperationCompleted;
              iPINValue1 = KNullDesC;
              iPINValue2 = KNullDesC;
              HandleResponseAndCompleteL();
              }
          break;
          }

      case EVerifyNewPin:
          {
          if ( iRetValue )
              {
              DoHandleMessageL( EVerifyPinNR, iPIN.iPINLabel, iPIN.iTokenLabel,
                    iPIN.iMinLength, iPIN.iMaxLength );
              iNextStep = EVerifyPINs;
              iStatus = KRequestPending;
              SetActive();
              }
            //Dialog was cancelled by user
          else
              {
              iNextStep = EOperationCompleted;
              iPINValue1 = KNullDesC;
              iPINValue2 = KNullDesC;
              HandleResponseAndCompleteL();
              }
          break;
          }

      case EVerifyPINs:
          {
          VerifyPinsL();
          break;
          }

      default:
          {
          User::Panic( _L("CTestSecDlgNotifier"), 0 );
          }
      }

    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::VerifyPinsL()
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::VerifyPinsL()
    {
    if ( iRetValue )
        {
        if ( iPINValue2 == iPINValueVerify )
            {
            HandleResponseAndCompleteL();
            }
        else
            {
            DoHandleMessageL( EErrorCodesDoNotMatch, KNullDesC, KNullDesC, 0, 0 );
            iNextStep = EVerifyPINs;
            iPINValue2.Zero();
            iPINValueVerify.Zero();
            DoHandleMultilinePinQueryL( iMultiLineDlgType );
            iStatus = KRequestPending;
            SetActive();
            }
        }
    else
        {
        iPINValue1 = KNullDesC;
        iPINValue2 = KNullDesC;
        iNextStep = EOperationCompleted;
        HandleResponseAndCompleteL();
        }
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::DoHandleSelectCertificateL()
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::DoHandleSelectCertificateL()
    {
    TBool foundDevCert = EFalse;

    // Check certificate list to find out if there is certificate from
    // Device Certificate Store.
    for ( TInt ii = 0; ii < iCertHandleList.Count(); ii++)
        {
        TCTTokenObjectHandle handle = iCertHandleList[ii];
        if ( handle.iTokenHandle.iTokenTypeUid == KDeviceCertStoreTokenUid )
            {
            // Found a certificate from Device Certificate Store.
            foundDevCert = ETrue;
            iTokenHandle = handle;
            iRetValue = ETrue;
            iNextStep = EOperationCompleted;
            iStatus = KRequestPending;
            SetActive();
            TRequestStatus* status = &iStatus;
            User::RequestComplete( status, KErrNone );
            break;
            }

        }

    if ( !foundDevCert )
        {
        // No certificate from Device Certificate Store. Prompt user
        // for certificate selection
    /*
        CCTSelectCertificateDialog::RunDlgLD(
            iCertArray, iCertHandleList, iTokenHandle,
            iStatus, iRetValue ); // Takes ownerhip of array

        iNextStep = EOperationCompleted;
        iStatus = KRequestPending;
        SetActive();
    */
        User::Leave( KErrGeneral );     // TODO: to be implemented
        }
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::ShowNoTrustDialogL()
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::ShowNoTrustDialogL()
    {
    TRACE( "CCTSecurityDialogsAO::ShowNoTrustDialogL, begin" );

    // If trusted site certstore open has failed, then it is not possible to save
    // the host name for permanent use. Hence, choice for permanent accept is not
    // displayed if trusted site certstore open has failed. Other restrictions for
    // permanent accept are defined in device dialog (UntrustedCertificateWidget).
    TBool isTrustedSiteCertStoreOpened = ( iTrustedSiteCertStore != NULL );
    CCTUntrustedCertQuery *untrustedCertDlg = CCTUntrustedCertQuery::NewLC(
            iAuthFailReason, *iCertBuf, *iServerName, isTrustedSiteCertStoreOpened );

    CCTUntrustedCertQuery::TResponse response = CCTUntrustedCertQuery::EQueryRejected;
    untrustedCertDlg->ShowQueryAndWaitForResponseL( response );
    switch( response )
        {
        case CCTUntrustedCertQuery::EQueryAccepted:
            iRetValue = EServerCertAcceptedTemporarily;
            break;
        case CCTUntrustedCertQuery::EQueryAcceptedPermanently:
            // TODO: show confirmation note, qtn_httpsec_query_perm_accept_text
            // "Connection to site %U will be made in future without any warnings. Continue?""
            iRetValue = EServerCertAcceptedPermanently;
            break;
        case CCTUntrustedCertQuery::EQueryRejected:
        default:
            iRetValue = EServerCertNotAccepted;
            break;
        }
    CleanupStack::PopAndDestroy( untrustedCertDlg );
    TRACE1( "CCTSecurityDialogsAO::ShowNoTrustDialogL, iRetValue=%d", iRetValue );

    iNextStep = EServerCertCheckUserResp;
    iStatus = KRequestPending;
    TRequestStatus* status = &iStatus;
    User::RequestComplete( status, KErrNone );
    SetActive();
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::ShowCSRDialogL()
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::ShowCSRDialogL()
    {
    HBufC* message = HBufC::NewLC( KMaxLengthTextDetailsBody );
    TPtr messagePtr = message->Des();

    DetailsResourceL( messagePtr, R_QTN_SN_CERT_SIGN_EXPLANATION );

    messagePtr.Append( KEnter );

    //DetailsFieldDynamicL( messagePtr, *iText,
    //    R_TEXT_RESOURCE_DETAILS_VIEW_SUBJECT,
    //    R_TEXT_RESOURCE_VIEW_NO_SUBJECT_DETAILS );

    AddKeyUsageL( messagePtr, iKeyInfo );
    AddKeyAlgorithmL( messagePtr, iKeyInfo );
    AddKeySizeL( messagePtr, iKeyInfo );
    AddKeyLocationL( messagePtr, iKeyInfo );

    // TODO
    //CCTSignTextDialog::RunDlgLD( R_WIM_CSR_DIALOG, *message, iStatus, iRetValue );
    User::Leave( KErrGeneral );
    CleanupStack::PopAndDestroy( message );

    iStatus = KRequestPending;
    SetActive();
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::ShowCertDialogL()
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::ShowCertDialogL()
    {
    CCTKeyInfo* keyInfo = NULL;
    if ( 0 < iKeyInfos.Count() )
        {
        keyInfo = iKeyInfos[0]; // There should be only one keyInfo.
        }
    else if ( iKeyInfo )
        {
        keyInfo = iKeyInfo;
        }
    else
        {
        }

    HBufC* message = NULL;

    if (iOperation == ESaveCert)
        {
        message = MessageQueryCertDetailsL( *iCertBuf, NULL, iSaveCertInput.iCertFormat, NULL );
        }
    else
        {
        message = MessageQueryCertDetailsL( *iCertBuf, iCertInfo, iCertInfo->CertificateFormat(), keyInfo );
        }

    CleanupStack::PushL( message );
    TInt resource = 0;
    switch( iOperation )
        {
        case ECertDetails:
            {
            resource = R_WIM_CERTDETAILS_DIALOG;
            break;
            }
        case ESaveCert:
            {
            resource = R_WIM_SAVE_CERT_DIALOG;
            break;
            }
        case EDeleteCert:
            {
            resource = R_WIM_DELETE_CERT_DIALOG;
            break;
            }
        default:
            {
            User::Panic(_L("CTestSecDlgNotifier"), 0);
            }
        }
    // TODO
    //CCTSignTextDialog::RunDlgLD( resource, *message, iStatus, iRetValue );
    User::Leave( KErrGeneral );
    resource = resource;     // avoids compiler warning
    CleanupStack::PopAndDestroy( message );

    iStatus = KRequestPending;
    SetActive();
    }

// ---------------------------------------------------------
// CCertManUICertificateHelper::MessageQueryViewDetailsL(TInt aIndex)
// Creates the whole of certificate details view
// Appends strings from both resources and CertManAPI to one
// message body text and displays it.
// ---------------------------------------------------------
//
HBufC* CCTSecurityDialogsAO::MessageQueryCertDetailsL(
    const TDesC8& /*aCert*/,
    const CCTCertInfo* /*aCertInfo*/,
    TCertificateFormat /*aCertFormat*/,
    const CCTKeyInfo* /*aKeyInfo*/)
    {
    // Create message buffer
    HBufC* message = HBufC::NewLC( KMaxLengthTextDetailsBody );
/*
    TPtr messagePtr = message->Des();
    // Label
    if ( aCertInfo )
        {
        DetailsFieldDynamicL( messagePtr, aCertInfo->Label(),
            R_TEXT_RESOURCE_DETAILS_VIEW_LABEL,
            R_TEXT_RESOURCE_VIEW_NO_LABEL_DETAILS );
        }

    switch ( aCertFormat )
        {
        case EX509Certificate:
            {
            CX509Certificate* cert = CX509Certificate::NewLC( aCert );
            // Let's append all the fields to the message
            AddSiteL( messagePtr );
            AddIssuerAndSubjectL( messagePtr, *cert );
            if( aKeyInfo )
                {
                AddKeyUsageL( messagePtr, aKeyInfo );
                }
            else
                {
                AddKeyUsageL( messagePtr, *cert );
                }

            AddValidityPeriodL( messagePtr, *cert );
            AddCertLocationL( messagePtr, aCertInfo );
            AddCertFormatL( messagePtr, aCertFormat );
            AddKeyLocationL( messagePtr, aKeyInfo );
            AddCertAlgorithmsL( messagePtr, *cert );
            AddCertSerialNumberL( messagePtr, *cert );
            AddCertFingerprintsL( messagePtr, *cert );
            CleanupStack::PopAndDestroy( cert );
            break;
            }
        case EX509CertificateUrl:
            {
            AddKeyUsageL( messagePtr, aKeyInfo );

            if( aCertInfo )
                {
                DetailsFieldDynamicL( messagePtr, aCertInfo->Label(),
                        R_TEXT_RESOURCE_DETAILS_VIEW_LABEL,
                        R_TEXT_RESOURCE_VIEW_NO_LABEL_DETAILS );
                }
            HBufC* url = HBufC::NewLC( aCert.Length() );
            url->Des().Copy( aCert );
            DetailsFieldDynamicL( messagePtr, *url,
                    R_TEXT_RESOURCE_DETAILS_VIEW_CERTIFICATE_LOCATION,
                    R_TEXT_RESOURCE_DETAILS_VIEW_NOT_DEFINED );
            CleanupStack::PopAndDestroy( url );
            AddCertFormatL( messagePtr, aCertFormat );
            AddKeyLocationL( messagePtr, aKeyInfo );
            break;
            }
        default:
            {
            User::Leave( KErrNotSupported );
            }
        }
*/
    CleanupStack::Pop( message );
    return message;
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::AddIssuerAndSubjectL(...)
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::AddSiteL( TDes& /*aMessage*/ )
    {
/*
    if ( iServerName )
        {
        DetailsFieldDynamicL( aMessage, iServerName->Des(),
            R_QTN_CM_SITE,
            R_TEXT_RESOURCE_DETAILS_VIEW_NOT_DEFINED );
        }
*/
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::AddIssuerAndSubjectL(...)
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::AddIssuerAndSubjectL( TDes& /*aMessage*/, const CX509Certificate& /*aCert*/ )
    {
/*
    HBufC* issuer = NULL;
    HBufC* owner = NULL;
    X509CertNameParser::SubjectFullNameL( aCert, owner );
    CleanupStack::PushL( owner );
    X509CertNameParser::IssuerFullNameL( aCert, issuer );
    CleanupStack::PushL( issuer );

    DetailsFieldDynamicL( aMessage, issuer->Des(),
        R_TEXT_RESOURCE_DETAILS_VIEW_ISSUER,
        R_TEXT_RESOURCE_DETAILS_VIEW_NOT_DEFINED );
    CleanupStack::PopAndDestroy( issuer );   //issuer

    // certificate subject
    DetailsFieldDynamicL( aMessage, owner->Des(),
        R_TEXT_RESOURCE_DETAILS_VIEW_SUBJECT,
        R_TEXT_RESOURCE_VIEW_NO_SUBJECT_DETAILS );
    CleanupStack::PopAndDestroy( owner );   //owner
*/
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::AddKeySizeL(...)
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::AddKeySizeL( TDes& /*aMessage*/, const CCTKeyInfo* /*aKeyInfo*/ )
    {
/*
    TUint keySize = aKeyInfo->Size();

    TBuf<KMaxLengthTextDateString> sizeBuf;
    if ( 0 < keySize )
        {
        sizeBuf.AppendNum( keySize, EDecimal );
        }

    DetailsFieldDynamicL( aMessage, sizeBuf,
        R_QTN_SN_KEY_LENGTH_LABEL,
        R_TEXT_RESOURCE_DETAILS_VIEW_NOT_DEFINED );

    aMessage.Append( KEnterEnter );
*/
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::AddKeyUsageL(...)
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::AddKeyUsageL( TDes& /*aMessage*/, const CCTKeyInfo* /*aKeyInfo*/ )
    {
/*
    if ( aKeyInfo != NULL )
        {
        TKeyUsagePKCS15 keyUsage = aKeyInfo->Usage();

        TInt usage = 0;
        switch( keyUsage )
            {
            case EPKCS15UsageSignSignRecover:
            case EPKCS15UsageSign:
            case EPKCS15UsageSignDecrypt:
                usage = R_TEXT_RESOURCE_DETAILS_VIEW_CLIENT_AUTHENTICATION;
                break;
            case EPKCS15UsageNonRepudiation:
                usage = R_TEXT_RESOURCE_DETAILS_VIEW_DIGITAL_SIGNING;
                break;
            default:
                usage = R_TEXT_RESOURCE_DETAILS_VIEW_NOT_DEFINED;
                break;
            }
        DetailsFieldResourceL( aMessage,
            R_TEXT_RESOURCE_DETAILS_VIEW_KEY_USAGE, usage);
        }
*/
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::AddKeyUsageL(...)
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::AddKeyUsageL( TDes& /*aMessage*/, const CX509Certificate& /*aCert*/ )
    {
/*
  TKeyUsageX509 x509Usage = EX509UsageNone;
  TKeyUsagePKCS15 pkcs15KeyUsage = EPKCS15UsageNone;
  const CX509CertExtension* ext = aCert.Extension(KKeyUsage);
  if ( ext )
      {
      CX509KeyUsageExt* keyUsageExt =
      CX509KeyUsageExt::NewLC(ext->Data());
      if ( keyUsageExt->IsSet( EX509DigitalSignature ) )
          {
          x509Usage |= EX509UsageDigitalSignature;
          }
      if ( keyUsageExt->IsSet( EX509NonRepudiation ) )
          {
          x509Usage |= EX509UsageNonRepudiation;
          }
      if ( keyUsageExt->IsSet( EX509KeyEncipherment ) )
          {
          x509Usage |= EX509UsageKeyEncipherment;
          }
      if ( keyUsageExt->IsSet( EX509DataEncipherment ) )
          {
          x509Usage |= EX509UsageDataEncipherment;
          }
      if ( keyUsageExt->IsSet( EX509KeyAgreement ) )
          {
          x509Usage |= EX509UsageKeyAgreement;
          }
      if ( keyUsageExt->IsSet( EX509KeyCertSign ) )
          {
          x509Usage |= EX509UsageKeyCertSign;
          }
      if ( keyUsageExt->IsSet( EX509CRLSign ) )
          {
          x509Usage |= EX509UsageCRLSign;
          }
      if ( keyUsageExt->IsSet( EX509EncipherOnly ) )
          {
          x509Usage |= EX509UsageEncipherOnly;
          }
      if ( keyUsageExt->IsSet( EX509DecipherOnly ) )
          {
          x509Usage |= EX509UsageDecipherOnly;
          }
      CleanupStack::PopAndDestroy( keyUsageExt );
      }

  pkcs15KeyUsage = KeyUsageX509ToPKCS15Private( x509Usage );

  TInt usage = 0;
  switch( pkcs15KeyUsage )
      {
      case EPKCS15UsageSignSignRecover:
      case EPKCS15UsageSign:
      case EPKCS15UsageSignDecrypt:
          {
          usage = R_TEXT_RESOURCE_DETAILS_VIEW_CLIENT_AUTHENTICATION;
          break;
          }
      case EPKCS15UsageNonRepudiation:
          {
          usage = R_TEXT_RESOURCE_DETAILS_VIEW_DIGITAL_SIGNING;
          break;
          }
      default:
          {
          usage = R_TEXT_RESOURCE_DETAILS_VIEW_NOT_DEFINED;
          break;
          }

      }
   DetailsFieldResourceL( aMessage,
          R_TEXT_RESOURCE_DETAILS_VIEW_KEY_USAGE, usage );
*/
   }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::AddKeyAlgorithmL(...)
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::AddKeyAlgorithmL( TDes& /*aMessage*/, const CCTKeyInfo* /*aKeyInfo*/ )
    {
/*
    TInt algRes = 0;
    switch( aKeyInfo->Algorithm())
        {
        case CKeyInfoBase::ERSA:
            {
            algRes = R_TEXT_RESOURCE_DETAILS_VIEW_ALGORITHM_RSA;
            break;
            }
        case CKeyInfoBase::EDSA:
            {
            algRes = R_TEXT_RESOURCE_DETAILS_VIEW_ALGORITHM_DSA;
            break;
            }
        case CKeyInfoBase::EDH:
            {
            algRes = R_TEXT_RESOURCE_DETAILS_VIEW_ALGORITHM_DH;
            break;
            }
        case CKeyInfoBase::EInvalidAlgorithm:
            {
            algRes = R_TEXT_RESOURCE_DETAILS_VIEW_UNKNOWN;
            break;
            }
        default:
            {
            algRes = R_TEXT_RESOURCE_DETAILS_VIEW_UNKNOWN;
            }
        }
    DetailsFieldResourceL( aMessage,
            R_TEXT_RESOURCE_DETAILS_VIEW_ALGORITHM, algRes);
*/
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::AddCertLocationL(...)
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::AddCertLocationL( TDes& aMessage, const CCTCertInfo* aCertInfo )
    {
    if ( aCertInfo )
        {
        AddLocationInfoL( aMessage, aCertInfo->Token().TokenType().Type(), ETrue );
        }
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::AddKeyLocationL(...)
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::AddKeyLocationL( TDes& aMessage, const CCTKeyInfo* aKeyInfo )
    {
    if ( aKeyInfo )
        {
        AddLocationInfoL( aMessage, aKeyInfo->Token().TokenType().Type(), EFalse );
        }
    }

// ---------------------------------------------------------
// CCTSecurityDialogsAO::SetLocationInfo( (HBufC& aMessage,
//                                               TBool aCertificate,
//                                               TUid* aLocUid)
// Adds certificate/private key's location info to certificate details
// ---------------------------------------------------------
//
void CCTSecurityDialogsAO::AddLocationInfoL(
    TDes& /*aMessage*/, TUid /*aUid*/, TBool /*aCertificate*/ )
    {
/*
    TInt location = 0;
    TInt locationRes =0;

    switch ( aUid.iUid )
        {
        case KFileCertStoreUid:
        case KTokenTypeFileKeystore:
            {
            location = R_TEXT_RESOURCE_DETAILS_VIEW_LOCATION_PHONE_MEMORY;
            break;
            }
        case KWIMCertStoreUid:
            {
            location = R_TEXT_RESOURCE_DETAILS_VIEW_LOCATION_SMART_CARD;
            break;
            }
        default:
            {
            if ( aCertificate )
                {
                location = R_TEXT_RESOURCE_DETAILS_VIEW_NOT_DEFINED;
                }
            else
                {
                location = R_TEXT_RESOURCE_DETAILS_VIEW_NO_PRIVATE_KEY;
                }
            break;
            }
        }

    if ( aCertificate )
        {
        locationRes = R_TEXT_RESOURCE_DETAILS_VIEW_CERTIFICATE_LOCATION;
        }
    else
        {
        locationRes = R_TEXT_RESOURCE_DETAILS_VIEW_PRIVATE_KEY_LOCATION;
        }

    DetailsFieldResourceL( aMessage, locationRes, location );
*/
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::AddValidityPeriodL(...)
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::AddValidityPeriodL(
    TDes& aMessage, const CX509Certificate& aCert )
    {
    TLocale locale;
    TTimeIntervalSeconds offSet = locale.UniversalTimeOffset();
    //DetailsResourceL( aMessage, R_TEXT_RESOURCE_DETAILS_VIEW_VALID_FROM );
    const CValidityPeriod& validityPeriod = aCert.ValidityPeriod();
    TTime startValue = validityPeriod.Start();
    startValue += offSet;
    TBuf<KMaxLengthTextDateString> startString;
    // read format string from AVKON resource
    HBufC* dateFormatString = CEikonEnv::Static()->AllocReadResourceLC(
        R_QTN_DATE_USUAL_WITH_ZERO );
    // format the date to user readable format. The format is locale dependent
    startValue.FormatL( startString, *dateFormatString );
    AknTextUtils::DisplayTextLanguageSpecificNumberConversion( startString );
    CleanupStack::PopAndDestroy(); // dateFormatString
    aMessage.Append( startString );
    aMessage.Append( KEnterEnter );

    //DetailsResourceL( aMessage, R_TEXT_RESOURCE_DETAILS_VIEW_VALID_UNTIL );
    TTime finishValue = validityPeriod.Finish();
    finishValue += offSet;
    TBuf<KMaxLengthTextDateString> finishString;
    // read format string from AVKON resource
    dateFormatString = CEikonEnv::Static()->AllocReadResourceLC(
        R_QTN_DATE_USUAL_WITH_ZERO );
    // format the date to user readable format. The format is locale dependent
    finishValue.FormatL( finishString, *dateFormatString );
    AknTextUtils::DisplayTextLanguageSpecificNumberConversion(finishString);
    CleanupStack::PopAndDestroy(); // dateFormatString
    aMessage.Append( finishString );
    aMessage.Append( KEnterEnter );
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::AddCertFormatL(...)
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::AddCertFormatL( TDes& /*aMessage*/, TCertificateFormat aCertFormat)
    {
    //TInt fieldType = 0;
    switch ( aCertFormat )
        {
        case EX509CertificateUrl:
        case EX509Certificate:
            {
            //fieldType = R_TEXT_RESOURCE_DETAILS_VIEW_CERT_FORMAT_X509;
            break;
            }
        default:
            {
            //fieldType = R_TEXT_RESOURCE_DETAILS_VIEW_NOT_DEFINED;
            break;
            }
        }
    //DetailsFieldResourceL( aMessage,
    //    R_TEXT_RESOURCE_DETAILS_VIEW_CERT_FORMAT, fieldType );
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::AddCertAlgorithmsL(...)
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::AddCertAlgorithmsL( TDes& /*aMessage*/, const CX509Certificate& /*aCert*/ )
    {
/*
    TInt fieldType = 0;
    TInt fieldType2 = 0;
    // digest algorithm
    TAlgorithmId algorithmId =
        aCert.SigningAlgorithm().DigestAlgorithm().Algorithm();
    switch ( algorithmId )
        {
        case EMD2:
            {
            fieldType = R_TEXT_RESOURCE_DETAILS_VIEW_ALGORITHM_MD2;
            break;
            }
        case EMD5:
            {
            fieldType = R_TEXT_RESOURCE_DETAILS_VIEW_ALGORITHM_MD5;
            break;
            }
        case ESHA1:
            {
            fieldType = R_TEXT_RESOURCE_DETAILS_VIEW_ALGORITHM_SHA1;
            break;
            }
        default:
            {
            fieldType = R_TEXT_RESOURCE_DETAILS_VIEW_UNKNOWN;
            break;
            }
        }

    // public-key algorithm
    algorithmId =
        aCert.SigningAlgorithm().AsymmetricAlgorithm().Algorithm();
    switch ( algorithmId )
        {
        case ERSA:
            {
            fieldType2 = R_TEXT_RESOURCE_DETAILS_VIEW_ALGORITHM_RSA;
            break;
            }
        case EDSA:
            {
            fieldType2 = R_TEXT_RESOURCE_DETAILS_VIEW_ALGORITHM_DSA;
            break;
            }
        case EDH:
            {
            fieldType2 = R_TEXT_RESOURCE_DETAILS_VIEW_ALGORITHM_DH;
            break;
            }
        default:
            {
            fieldType2 = R_TEXT_RESOURCE_DETAILS_VIEW_UNKNOWN;
            }
        }

    // If other algorithm is unknown
    if ( fieldType == R_TEXT_RESOURCE_DETAILS_VIEW_UNKNOWN ||
        fieldType2 == R_TEXT_RESOURCE_DETAILS_VIEW_UNKNOWN )
        {
        DetailsFieldResourceL( aMessage,
        R_TEXT_RESOURCE_DETAILS_VIEW_ALGORITHM, R_TEXT_RESOURCE_DETAILS_VIEW_UNKNOWN );
        }
    else // Both are known.
        {
        DetailsResourceL( aMessage, R_TEXT_RESOURCE_DETAILS_VIEW_ALGORITHM);
        HBufC* stringHolder = StringLoader::LoadLC( fieldType );
        aMessage.Append( stringHolder->Des() );
        CleanupStack::PopAndDestroy();
        stringHolder = StringLoader::LoadLC( fieldType2 );
        aMessage.Append( stringHolder->Des() );
        CleanupStack::PopAndDestroy();  // stringHolder
        aMessage.Append( KEnterEnter );
        }
*/
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::AddCertSerialNumberL(...)
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::AddCertSerialNumberL( TDes& /*aMessage*/, const CX509Certificate& /*aCert*/ )
    {
/*
    // certificate serial number
    DetailsResourceL( aMessage, R_TEXT_RESOURCE_DETAILS_VIEW_SERIAL_NUMBER );
    TPtrC8 serialNumber = aCert.SerialNumber();
    TBuf<KMaxLengthTextSerialNumberFormatting> buf2;

    for ( TInt i = 0; i < serialNumber.Length(); i++ )
       {
       buf2.Format( KCertManUIDetailsViewHexFormat, serialNumber[i] );
       aMessage.Append( buf2 );
       }

    aMessage.Append( KEnterEnter );
*/
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::AddCertFingerprintsL(...)
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::AddCertFingerprintsL( TDes& /*aMessage*/, const CX509Certificate& /*aCert*/ )
    {
/*
     // certificate fingerprint SHA-1
    DetailsResourceL( aMessage, R_TEXT_RESOURCE_DETAILS_VIEW_FINGERPRINT );

    TPtrC8 sha1_fingerprint = aCert.Fingerprint();
    DevideToBlocks( sha1_fingerprint, aMessage );

    aMessage.Append( KEnterEnter );

    // certificate fingerprint MD5
    DetailsResourceL( aMessage, R_TEXT_RESOURCE_DETAILS_VIEW_FINGERPRINT_MD5 );

    CMD5* md5 = CMD5::NewL();
    CleanupStack::PushL( md5 );
    TBuf8<20> fingerprint = md5->Hash( aCert.Encoding() );
    CleanupStack::PopAndDestroy( md5 );

    DevideToBlocks( fingerprint, aMessage );
*/
    }

// ---------------------------------------------------------
// CCTSecurityDialogsAO::DevideToBlocks
// ---------------------------------------------------------
//
void CCTSecurityDialogsAO::DevideToBlocks( const TDesC8& aInput, TDes& aOutput )
    {
    const TInt KBlockLength = 2;
    TInt blockIndex = 0;
    for ( TInt j = 0 ; j < aInput.Length() ; j++ )
        {
        if ( blockIndex == KBlockLength )
            {
            aOutput.Append( KBlockSeparator );
            blockIndex = 0;
            }
        aOutput.AppendNumFixedWidthUC( (TUint)(aInput[ j ]), EHex, 2 );
        ++blockIndex;
        }
    }

// ---------------------------------------------------------
// CCTSecurityDialogsAO::DetailsFieldResourceL(
// HBufC& aMessage, TInt aResourceOne, TInt aResourceTwo);
// Appends a field that has two strings from resources
// to the details view message body
// ---------------------------------------------------------
//
void CCTSecurityDialogsAO::DetailsFieldResourceL(
    TDes& aMessage, TInt aResourceOne,
    TInt aResourceTwo )
    {
    DetailsResourceL( aMessage, aResourceOne );
    DetailsResourceL( aMessage, aResourceTwo );
    aMessage.Append( KEnter );
    }

// ---------------------------------------------------------
// CCTSecurityDialogsAO::DetailsFieldDynamicL(HBufC& aMessage, TPtrC aValue,
//                                        TInt aResourceOne, TInt aResourceTwo);
// Appends a field that has string from resources and string from CertManAPI
// to the details view message body
// ---------------------------------------------------------
//
void CCTSecurityDialogsAO::DetailsFieldDynamicL(
    TDes& aMessage,
    const TDesC& aValue,
    TInt aResourceOne,
    TInt aResourceTwo)
    {
    DetailsResourceL( aMessage, aResourceOne );
    DetailsDynamicL( aMessage, aValue, aResourceTwo );
    aMessage.Append( KEnter );
    }

// ---------------------------------------------------------
// CCTSecurityDialogsAO::DetailsResourceL(
// HBufC& aMessage, TInt aResourceOne);
// Reads line from resources
// ---------------------------------------------------------
//
void CCTSecurityDialogsAO::DetailsResourceL(
    TDes& aMessage, TInt aResource)
    {
    HBufC* stringHolder = StringLoader::LoadLC( aResource );
    aMessage.Append( stringHolder->Des() );
    CleanupStack::PopAndDestroy();  // stringHolder
    aMessage.Append( KEnter );
    }

// ---------------------------------------------------------
// CCTSecurityDialogsAO::DetailsDynamicL(
// HBufC& aMessage, TPtrC aValue, TInt aResourceOne)
// Reads dynamic text, if the string is empty
// put a not defined text from the resource in its place
// ---------------------------------------------------------
//
void CCTSecurityDialogsAO::DetailsDynamicL(
    TDes& aMessage, const TDesC& aValue, TInt aResource)
    {
    HBufC* buf = aValue.AllocLC();
    TPtr trimmedValue( buf->Des() );
    trimmedValue.TrimLeft();

    if( trimmedValue.Length() > KMaxLengthTextCertLabelVisible )
        {
        trimmedValue.SetLength( KMaxLengthTextCertLabelVisible - 1 );
        trimmedValue.Append( KTextUtilClipEndChar );
        }

    if( trimmedValue.Length() == 0 )
        {
        DetailsResourceL( aMessage, aResource );
        }
    else
        {
        aMessage.Append( trimmedValue );
        aMessage.Append( KEnter );
        }

    CleanupStack::PopAndDestroy( buf );
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::HandleResponseAndCompleteL()
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::HandleResponseAndCompleteL()
    {
    WIMSECURITYDIALOGS_WRITE_FORMAT( "HandleResponseAndCompleteL: %d", iRetValue );

    MapTlsProviderOperation(iOperation);

    switch (iOperation)
        {
        case EEnablePIN: // flow thru
        case EDisablePIN: // flow thru
        case EEnterPIN:
            {
            TPINValueBuf pinValueBufPtr;
            if ( iPIN.iPINLabel == KKeyStoreCreatePwLabel ||
                iPIN.iPINLabel == KKeyStoreExportKeyLabel )
                {
                pinValueBufPtr = iPINValue2;
                }
            else
                {
                pinValueBufPtr = iPINValue1;
                }
            iMessagePtr.WriteL( iReplySlot, pinValueBufPtr );
            break;
            }

        case EChangePIN:
        case EUnblockPIN:
            {
            TTwoPINOutput twoPINOutput;
            twoPINOutput.iPINValueToCheck = iPINValue1;
            twoPINOutput.iNewPINValue = iPINValue2;
            TTwoPINOutputBuf twoPINOutputBuf( twoPINOutput );
            iMessagePtr.WriteL( iReplySlot, twoPINOutputBuf );
            break;
            }

        case ESignText: // flow thru
        case EUserAuthenticationText: // flow thru
        case EUserAuthentication:
            {
            TCTTokenObjectHandleBuf tokenObjectHandleBuf( iTokenHandle );
            iMessagePtr.WriteL( iReplySlot, tokenObjectHandleBuf );
            break;
            }

        case EServerAuthenticationFailure:
            {
            TServerAuthenticationFailureDialogResult result = EStop;

            if( iRetValue != EServerCertAcceptedPermanently )
                {
                if( iRetValue == EServerCertAcceptedTemporarily )
                    {
                    result = EContinue;
                    }
                else
                    {
                    result = EStop;
                    }
                }
            else
                {
                // User permanently accepted server certificate.
                result = EContinue;
                }

            TServerAuthenticationFailureOutputBuf output( result );
            iMessagePtr.WriteL( iReplySlot, output );
            iMessagePtr.Complete( KErrNone );

            break;
            }

        case EPINBlocked:
        case EUnblockPINInClear:
            {
            User::Leave( KErrNotSupported );
            break;
            }

        case ECreateCSR:
        case ECertDetails:
        case ESaveCert:
        case EDeleteCert:
        case ESaveReceipt:
        case EPinCodeBlockedInfo:
        case MDigSigningNote::ESignatureRequested:
        case MDigSigningNote::ESignatureDone:
        case MDigSigningNote::ESigningCancelled:
        case MDigSigningNote::ENoMatchCert:
        case MDigSigningNote::ENoSecurityModule:
        case MDigSigningNote::EInternalError:
            {
            break; // Complete is enough
            }

        default:
            User::Panic( _L("CTestSecDlgNotifier"), 0 );
        }

    if( iOperation != EServerAuthenticationFailure )
        {
        iMessagePtr.Complete( iRetValue ? KErrNone : KErrCancel );
        }

    delete this;
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::SaveReceiptL()
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::SaveReceiptL( const TDesC8& aBuffer )
    {
    TInt size = reinterpret_cast<const TInt&>( *aBuffer.Ptr() );
    TInt start = sizeof(TInt) + 1;
    HBufC* signedText = HBufC::NewLC( size );
    signedText->Des().Copy( aBuffer.Mid(start) );
    CEikProcess* process = CEikonEnv::Static()->Process();
    CDocumentHandler* docHandler =  CDocumentHandler::NewLC( process );
    _LIT8( KPlainText, "text/plain" );
    TDataType dataType( KPlainText );
    // convert 16->8bits
    HBufC8* content = HBufC8::NewLC( signedText->Length() );
    content->Des().Copy( *signedText );

    docHandler->SaveL( *content,
    dataType,
    KEntryAttNormal);

    CleanupStack::PopAndDestroy( 3, signedText );   // content, docHandler, signedText
    HandleResponseAndCompleteL();
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::DoCancel()
// ?implementation_description
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::DoCancel()
    {
    WIMSECURITYDIALOGS_WRITE( "CCTSecurityDialogsAO::DoCancel" );
    /*
    if( !iPinQueryDialogDeleted )
        {
        delete iPinQueryDialog;
        iPinQueryDialogDeleted = ETrue;
        }
    iPinQueryDialog = NULL;
    */

    // Complete message if it has not been completed earlier.
    if( !iMessagePtr.IsNull() )
        {
        iMessagePtr.Complete( KErrCancel );
        }
    }

// For server authentication failure
// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::CreateMessageLC()
// -----------------------------------------------------------------------------

HBufC* CCTSecurityDialogsAO::CreateMessageL()
    {
    //TPtrC8 certPtrC;
    //iSrvAuthFail->GetEncodedCert(certPtrC);
    return MessageQueryCertDetailsL(
        *iCertBuf, NULL, EX509Certificate, NULL );
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::DoHandleSaveServerCertL()
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::DoHandleSaveServerCertL()
    {
    TRACE( "CCTSecurityDialogsAO::DoHandleSaveServerCertL" );

    if ( iTrustedSiteCertStore )
        {
        iTrustedSiteCertStore->Add( *iCertLabel, EX509Certificate,
            EPeerCertificate, NULL, NULL, *iCertBuf, iStatus );

        // Next step is to update trust site db
        iNextStep = EAddTrustedSite;
        iStatus = KRequestPending;
        SetActive();
        }
    else
        {
        User::Leave( KErrGeneral );
        }
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogsAO::MapTlsProviderOperation()
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogsAO::MapTlsProviderOperation( TUint aOperation )
    {
    switch (aOperation)
        {
        case ESecureConnection:
            {
            iOperation = EUserAuthentication;
            break;
            }
        default:
            break;
        }
    }

void CCTSecurityDialogsAO::ShowInformationNoteL( TInt aResourceID ) const
    {
    HBufC* buffer = CEikonEnv::Static()->AllocReadResourceLC( aResourceID );
    CHbDeviceMessageBoxSymbian* iMessageBox = CHbDeviceMessageBoxSymbian::NewL(CHbDeviceMessageBoxSymbian::EInformation);
    CleanupStack::PushL(iMessageBox);
    iMessageBox->SetTextL(buffer->Des());
    iMessageBox->SetTimeout(6000);
    iMessageBox->ExecL();
    CleanupStack::PopAndDestroy(iMessageBox);
    CleanupStack::PopAndDestroy( buffer );
    }