First public contribution.
2 * Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
4 * This component and the accompanying materials are made available
5 * under the terms of the License "Eclipse Public License v1.0"
6 * which accompanies this distribution, and is available
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
9 * Initial Contributors:
10 * Nokia Corporation - initial contribution.
19 #include "CRefSecurityDialog.h"
21 // ----------------------------------------------------------------------------
22 // SecurityDialogFactory
25 EXPORT_C MSecurityDialog* SecurityDialogFactory::CreateL()
27 return CRefSecurityDialog::NewL();
32 // ----------------------------------------------------------------------------
38 CRefSecurityDialog::~CRefSecurityDialog()
43 void CRefSecurityDialog::Release()
49 CRefSecurityDialog* CRefSecurityDialog::NewL()
51 CRefSecurityDialog* self = new (ELeave) CRefSecurityDialog();
52 CleanupStack::PushL( self );
54 CleanupStack::Pop( self );
60 void CRefSecurityDialog::ConstructL()
62 iRequester = CDialogRequester::NewL( *this );
67 void CRefSecurityDialog::EnterPIN( const TPINParams& aPINParams, TBool aRetry,
68 TPINValue& aPINValue, TRequestStatus& aStatus )
70 iClientPINValuePtr = &aPINValue;
71 DoBasicPINOperation( EEnterPIN, aPINParams, aRetry, iPINValueBuf, aStatus );
76 void CRefSecurityDialog::EnablePIN( const TPINParams& aPINParams, TBool aRetry,
77 TPINValue& aPINValue, TRequestStatus& aStatus )
79 iClientPINValuePtr = &aPINValue;
80 DoBasicPINOperation( EEnablePIN, aPINParams, aRetry, iPINValueBuf, aStatus );
85 void CRefSecurityDialog::DisablePIN( const TPINParams& aPINParams, TBool aRetry,
86 TPINValue& aPINValue, TRequestStatus& aStatus )
88 iClientPINValuePtr = &aPINValue;
89 DoBasicPINOperation( EDisablePIN, aPINParams, aRetry, iPINValueBuf, aStatus );
94 void CRefSecurityDialog::ChangePIN( const TPINParams& aPINParams, TBool aRetry,
95 TPINValue& aOldPINValue, TPINValue& aNewPINValue,
96 TRequestStatus& aStatus )
98 iClientPINValuePtr = &aOldPINValue;
99 iClientSecondPINValuePtr = &aNewPINValue;
100 DoBasicPINOperation( EChangePIN, aPINParams, aRetry, iTwoPINOutputBuf, aStatus );
105 void CRefSecurityDialog::UnblockPIN( const TPINParams& aBlockedPINParams,
106 const TPINParams& aUnblockingPINParams, TBool aRetry,
107 TPINValue& aUnblockingPINValue, TPINValue& aNewPINValue,
108 TRequestStatus& aStatus )
110 iCurrentOperation = EUnblockPIN;
111 InitClientStatus( aStatus );
113 TUnblockPINInput unblockPINInput;
114 unblockPINInput.iOperation = EUnblockPIN;
117 unblockPINInput.iOperation |= EPINValueIncorrect;
119 unblockPINInput.iPIN = aBlockedPINParams;
120 unblockPINInput.iUnblockPIN = aUnblockingPINParams;
121 TUnblockPINInputBuf unblockPINInputBuf( unblockPINInput );
122 iUnblockPINInputBuf.Copy( unblockPINInputBuf );
123 iClientPINValuePtr = &aUnblockingPINValue;
124 iClientSecondPINValuePtr = &aNewPINValue;
126 iRequester->RequestDialog( iUnblockPINInputBuf, iTwoPINOutputBuf );
129 void CRefSecurityDialog::UnblockPINInClear( const TPINParams& aBlockedPINParams,
130 const TPINParams& aUnblockingPINParams, TBool aRetry,
131 TUnblockPINValue& aUnblockingPINValue, TPINValue& aNewPINValue,
132 TRequestStatus& aStatus )
134 iCurrentOperation = EUnblockPINInClear;
135 InitClientStatus( aStatus );
137 TUnblockPINInput unblockPINInput;
138 unblockPINInput.iOperation = EUnblockPINInClear;
141 unblockPINInput.iOperation |= EPINValueIncorrect;
143 unblockPINInput.iPIN = aBlockedPINParams;
144 unblockPINInput.iUnblockPIN = aUnblockingPINParams;
145 TUnblockPINInputBuf unblockPINInputBuf( unblockPINInput );
147 iClientUnblockPINValuePtr = &aUnblockingPINValue;
148 iClientSecondPINValuePtr = &aNewPINValue;
149 iUnblockPINInputBuf.Copy( unblockPINInputBuf );
150 iRequester->RequestDialog( iUnblockPINInputBuf, iUnblockPINInClearOutputBuf );
153 void CRefSecurityDialog::Cancel()
155 iRequester->Cancel();
158 User::RequestComplete(iClientStatus, KErrCancel);
162 void CRefSecurityDialog::PINBlocked( const TPINParams& aPINParams,
163 TRequestStatus& aStatus )
165 iCurrentOperation = EPINBlocked;
166 TPckg<TPINValue> pinValueBuf( KNullDesC() );
167 DoBasicPINOperation( EPINBlocked, aPINParams, EFalse, pinValueBuf, aStatus );
171 void CRefSecurityDialog::TotalBlocked( const TPINParams& aPINParams,
172 TRequestStatus& aStatus )
174 iCurrentOperation = ETotalBlocked;
175 TPckg<TPINValue> pinValueBuf( KNullDesC() );
176 DoBasicPINOperation( ETotalBlocked, aPINParams, EFalse, pinValueBuf, aStatus );
181 void CRefSecurityDialog::EstablishSecureConnection( const TDesC8& aCertData,
182 const RArray<TCTTokenObjectHandle>& aCertHandleList,
183 MSecurityDialog::TConnectionType aConnectionType,
184 TBool& aDoClientAuthentication, TCTTokenObjectHandle& aCertHandle,
185 TRequestStatus& aStatus )
187 iCurrentOperation = ESecureConnection;
188 InitClientStatus( aStatus );
190 TInt certDataSize = aCertData.Size();
191 TSignInput signInput;
192 signInput.iOperation = ESecureConnection;
193 signInput.iVariableDataSize = certDataSize;
194 signInput.iCertHandleArrayTotal = aCertHandleList.Count();
195 signInput.iDoClientAuthentication = aDoClientAuthentication;
196 signInput.iConnectionType = aConnectionType;
197 TPckgC<TSignInput> signInputBufPtr( signInput );
198 // iSignInputBuf is persistent because further input processing occurs in the AO before
199 // calling the notifier.
200 iSignInputBuf.Copy( signInputBufPtr );
201 iVariableDataPtr.Set( aCertData );
203 iClientDoClientAuthenticationPtr = &aDoClientAuthentication;
204 iClientCertInfoHandlePtr = &aCertHandle;
206 iRequester->RequestVariableBufferDialog( iSignInputBuf, iVariableDataPtr,
207 aCertHandleList, iCertInfoHandleBuf );
212 void CRefSecurityDialog::SignText( const TDesC& aTextToSign,
213 const RArray<TCTTokenObjectHandle>& aCertHandleList,
214 TCTTokenObjectHandle& aCertHandle,
215 TRequestStatus& aStatus )
217 iCurrentOperation = ESignText;
218 InitClientStatus( aStatus );
220 TInt textSize = aTextToSign.Size();
221 TSignInput signInput;
222 signInput.iOperation = ESignText;
223 signInput.iVariableDataSize = textSize;
224 signInput.iCertHandleArrayTotal = aCertHandleList.Count();
225 TPckgC<TSignInput> signInputBufPtr( signInput );
226 // iSignInputBuf is persistent because further input processing occurs in the AO before
227 // calling the notifier.
228 iSignInputBuf.Copy( signInputBufPtr );
229 const TUint8* textToSignPtr = reinterpret_cast<const TUint8*>( aTextToSign.Ptr() );
230 iVariableDataPtr.Set( textToSignPtr, textSize );
232 iClientCertInfoHandlePtr = &aCertHandle;
234 iRequester->RequestVariableBufferDialog( iSignInputBuf, iVariableDataPtr,
235 aCertHandleList, iCertInfoHandleBuf );
238 void CRefSecurityDialog::ServerAuthenticationFailure(const TDesC8& aServerName,const TValidationError& aFailureReason, const TDesC8& aEncodedCert,TRequestStatus& aStatus )
240 iCurrentOperation = EServerAuthenticationFailure;
241 InitClientStatus( aStatus );
243 CServerAuthenticationFailureInput* serverAuthenticationFailureInput = NULL;
244 TRAPD(err, serverAuthenticationFailureInput = CServerAuthenticationFailureInput::NewL(aServerName, aFailureReason, aEncodedCert));
246 // Ownership of the inputBuffer will pass to the requester.
247 HBufC8* inputBuffer = NULL;
249 TRAP(err, inputBuffer = serverAuthenticationFailureInput->PackBufferL());
251 delete serverAuthenticationFailureInput;
254 iRequester->RequestDialog(inputBuffer, iServerAuthenticationOutputBuf);
259 void CRefSecurityDialog::DoBasicPINOperation( TSecurityDialogOperation aOperation,
260 const TPINParams& aPINParams, TBool aRetry, TDes8& aPINValue,
261 TRequestStatus& aStatus )
263 iCurrentOperation = aOperation;
264 InitClientStatus( aStatus );
266 pinInput.iOperation = aOperation;
269 pinInput.iOperation |= EPINValueIncorrect;
271 pinInput.iPIN = aPINParams;
272 TPINInputBuf pinInputBuf( pinInput );
273 iPINInputBuf.Copy( pinInputBuf );
274 iRequester->RequestDialog( iPINInputBuf, aPINValue );
279 void CRefSecurityDialog::InitClientStatus( TRequestStatus& aStatus )
281 iClientStatus = &aStatus;
282 *iClientStatus = KRequestPending;
287 void CRefSecurityDialog::HandleResponse( TInt aResult )
289 if ( aResult >= KErrNone )
291 switch ( iCurrentOperation )
293 case EServerAuthenticationFailure:
295 TServerAuthenticationFailureDialogResult serverAuthenticationOutput = iServerAuthenticationOutputBuf();
297 if(serverAuthenticationOutput == EContinue)
301 else if(serverAuthenticationOutput == EStop)
307 case ESecureConnection:
309 if ( aResult == KClientAuthenticationRequested )
311 *iClientDoClientAuthenticationPtr = ETrue;
316 *iClientDoClientAuthenticationPtr = EFalse;
318 *iClientCertInfoHandlePtr = iCertInfoHandleBuf();
323 *iClientCertInfoHandlePtr = iCertInfoHandleBuf();
329 *iClientPINValuePtr = iPINValueBuf();
334 TTwoPINOutput& twoPINOutput = iTwoPINOutputBuf();
335 *iClientPINValuePtr = twoPINOutput.iPINValueToCheck;
336 *iClientSecondPINValuePtr = twoPINOutput.iNewPINValue;
340 case EUnblockPINInClear:
342 TUnblockPINInClearOutput& unblockPINOutput = iUnblockPINInClearOutputBuf();
343 *iClientUnblockPINValuePtr = unblockPINOutput.iPINValueToCheck;
344 *iClientSecondPINValuePtr = unblockPINOutput.iNewPINValue;
353 __ASSERT_DEBUG( EFalse, _L( "Invalid operation" ) );
357 User::RequestComplete( iClientStatus, aResult );
362 // ----------------------------------------------------------------------------
366 CDialogRequester::CDialogRequester( CRefSecurityDialog& aSecDialog )
367 : CActive( EPriorityStandard ), iSecDialog( aSecDialog )
369 CActiveScheduler::Add( this );
374 CDialogRequester::~CDialogRequester()
382 CDialogRequester* CDialogRequester::NewL( CRefSecurityDialog& aSecDialog )
384 CDialogRequester* self = new (ELeave) CDialogRequester( aSecDialog );
385 CleanupStack::PushL( self );
387 CleanupStack::Pop( self );
393 void CDialogRequester::ConstructL()
395 User::LeaveIfError( iNotifier.Connect() );
400 void CDialogRequester::RequestDialog( const TDesC8& aData, TDes8& aResponse )
402 iNotifier.StartNotifierAndGetResponse( iStatus, KUidSecurityDialogNotifier,
404 iState = KMakingRequest;
410 void CDialogRequester::DoCancel()
414 iNotifier.CancelNotifier( KUidSecurityDialogNotifier );
419 void CDialogRequester::RequestVariableBufferDialog( const TDesC8& aOperationData,
420 const TDesC8& aVariableData,
421 const RArray<TCTTokenObjectHandle>& aCertHandleList,
424 iOperationDataPtr = &aOperationData;
425 iVariableDataPtr = &aVariableData;
426 iCertHandleListPtr = &aCertHandleList;
427 iResponsePtr = &aResponse;
428 iState = KFillingVariableInputBuffer;
430 // Complete the AO immediately so that buffer processing can occur in RunL().
431 TRequestStatus* statusPtr = &iStatus;
432 User::RequestComplete( statusPtr, KErrNone );
435 void CDialogRequester::RequestDialog(HBufC8* aInputBuffer, TDes8& aResponse)
437 iInputBuffer = aInputBuffer;
438 RequestDialog(*iInputBuffer, aResponse);
442 void CDialogRequester::RunL()
446 case KFillingVariableInputBuffer:
448 TInt operationDataSize = iOperationDataPtr->Size();
449 TInt variableDataSize = iVariableDataPtr->Size();
450 TInt arraySize = sizeof( TCTTokenObjectHandle ) * iCertHandleListPtr->Count();
451 TInt bufferSize = operationDataSize + variableDataSize + arraySize;
452 iInputBuffer = HBufC8::NewL( bufferSize );
453 TPtr8 inputBufferPtr( iInputBuffer->Des() );
454 inputBufferPtr.Append( *iOperationDataPtr );
455 for ( TInt h = 0, total = iCertHandleListPtr->Count(); h < total; ++h )
457 const TCTTokenObjectHandle& certHandle = (*iCertHandleListPtr)[h];
458 TPckgC<TCTTokenObjectHandle> certHandleBuf( certHandle );
459 inputBufferPtr.Append( certHandleBuf );
461 inputBufferPtr.Append( *iVariableDataPtr );
462 RequestDialog( *iInputBuffer, *iResponsePtr );
469 iSecDialog.HandleResponse( iStatus.Int() );
473 __ASSERT_DEBUG( EFalse, _L( "Invalid state" ) );
480 * RunError should only be called if the buffer allocation fails, in which case
481 * let client handle it.
483 TInt CDialogRequester::RunError( TInt aError )
485 iSecDialog.HandleResponse( aError );
489 // ----------------------------------------------------------------------------
490 // CServerAuthenticationFailureInput
493 CServerAuthenticationFailureInput::CServerAuthenticationFailureInput()
498 CServerAuthenticationFailureInput::~CServerAuthenticationFailureInput()
506 CServerAuthenticationFailureInput* CServerAuthenticationFailureInput::NewL(const TDesC8& aServerName,const TValidationError& aFailureReason, const TDesC8& aEncodedCert, const TBool aCreateOwnBuffers)
508 CServerAuthenticationFailureInput* self = CServerAuthenticationFailureInput::NewLC(aServerName, aFailureReason, aEncodedCert, aCreateOwnBuffers);
509 CleanupStack::Pop(self);
513 CServerAuthenticationFailureInput* CServerAuthenticationFailureInput::NewLC(const TDesC8& aServerName,const TValidationError& aFailureReason, const TDesC8& aEncodedCert, const TBool aCreateOwnBuffers)
515 CServerAuthenticationFailureInput* self = new(ELeave) CServerAuthenticationFailureInput();
516 CleanupStack::PushL(self);
517 self->ConstructL(aServerName, aFailureReason, aEncodedCert, aCreateOwnBuffers);
521 EXPORT_C CServerAuthenticationFailureInput* CServerAuthenticationFailureInput::NewL(const TDesC8& aBuffer, const TBool aCreateOwnBuffers)
523 CServerAuthenticationFailureInput* self = CServerAuthenticationFailureInput::NewLC(aBuffer, aCreateOwnBuffers);
524 CleanupStack::Pop(self);
528 EXPORT_C CServerAuthenticationFailureInput* CServerAuthenticationFailureInput::NewLC(const TDesC8& aBuffer, const TBool aCreateOwnBuffers)
530 CServerAuthenticationFailureInput* self = new(ELeave) CServerAuthenticationFailureInput();
531 CleanupStack::PushL(self);
532 self->ConstructL(aBuffer, aCreateOwnBuffers);
536 void CServerAuthenticationFailureInput::ConstructL(const TDesC8& aServerName,const TValidationError& aFailureReason, const TDesC8& aEncodedCert, const TBool aCreateOwnBuffers)
538 iFailureReason = aFailureReason;
540 if (aCreateOwnBuffers)
542 iServerName = aServerName.AllocL();
543 iServerNamePtr.Set(iServerName->Des());
544 iEncodedCert = aEncodedCert.AllocL();
545 iEncodedCertPtr.Set(iEncodedCert->Des());
549 iServerNamePtr.Set(aServerName);
550 iEncodedCertPtr.Set(aEncodedCert);
555 void CServerAuthenticationFailureInput::ConstructL(const TDesC8& aBuffer, const TBool aCreateOwnBuffers)
557 const TServerAuthenticationFailureInput* srvAuthFail =
558 reinterpret_cast<const TServerAuthenticationFailureInput*>
561 const TUint8* binaryDataPtr = aBuffer.Ptr() + sizeof(TServerAuthenticationFailureInput);
563 iFailureReason = srvAuthFail->iFailureReason;
565 if(aCreateOwnBuffers)
567 TPtrC8 dataPtr(binaryDataPtr, srvAuthFail->iServerNameLength);
568 iServerName = dataPtr.AllocL();
569 iServerNamePtr.Set(iServerName->Des());
571 dataPtr.Set(binaryDataPtr + srvAuthFail->iServerNameLength, srvAuthFail->iEncodedCertLength);
572 iEncodedCert = dataPtr.AllocL();
573 iEncodedCertPtr.Set(iEncodedCert->Des());
577 iServerNamePtr.Set(binaryDataPtr, srvAuthFail->iServerNameLength);
578 iEncodedCertPtr.Set(binaryDataPtr + srvAuthFail->iServerNameLength, srvAuthFail->iEncodedCertLength);
583 EXPORT_C TValidationError CServerAuthenticationFailureInput::FailureReason()
585 return iFailureReason;
588 EXPORT_C void CServerAuthenticationFailureInput::GetServerName(TPtrC8& aServerNamePtr)
590 aServerNamePtr.Set(iServerNamePtr);
593 EXPORT_C void CServerAuthenticationFailureInput::GetEncodedCert(TPtrC8& aEncodedCertPtr)
595 aEncodedCertPtr.Set(iEncodedCertPtr);
598 EXPORT_C HBufC8* CServerAuthenticationFailureInput::PackBufferL() const
600 TServerAuthenticationFailureInput serverAuthenticationInput;
601 serverAuthenticationInput.iOperation = EServerAuthenticationFailure;
602 serverAuthenticationInput.iFailureReason = iFailureReason;
603 serverAuthenticationInput.iServerNameLength = iServerNamePtr.Length();
604 serverAuthenticationInput.iEncodedCertLength = iEncodedCertPtr.Length();
606 TServerAuthenticationFailureInputBuf serverAuthenticationInputBuf(serverAuthenticationInput);
608 TInt bufferSize = sizeof(serverAuthenticationInputBuf) + iServerNamePtr.Length() + iEncodedCertPtr.Length();
609 HBufC8* packedBuffer = HBufC8::NewL(bufferSize);
610 TPtr8 packedBufferPtr(packedBuffer->Des());
612 packedBufferPtr.Append(serverAuthenticationInputBuf);
613 packedBufferPtr.Append(iServerNamePtr);
614 packedBufferPtr.Append(iEncodedCertPtr);