wim/WimClient/src/WimCertConverter.cpp
changeset 0 164170e6151a
equal deleted inserted replaced
-1:000000000000 0:164170e6151a
       
     1 /*
       
     2 * Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "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".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  API which handles certificate related operatons
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 #include "WimCertMgmt.h"
       
    21 #include "WimCertConverter.h"
       
    22 #include "WimTrace.h"
       
    23 #include "WimCertInfo.h"
       
    24 #include "Wimi.h"   
       
    25 #include <cctcertinfo.h>
       
    26 
       
    27 
       
    28 
       
    29 // -----------------------------------------------------------------------------
       
    30 // CWimCertConverter::CWimCertConverter()
       
    31 // Default constructor
       
    32 // -----------------------------------------------------------------------------
       
    33 CWimCertConverter::CWimCertConverter( MCTToken& aToken ): 
       
    34 CActive( EPriorityStandard ), iToken( aToken )
       
    35     {
       
    36     }
       
    37 
       
    38 // -----------------------------------------------------------------------------
       
    39 // CWimCertConverter::NewL()
       
    40 // Symbian 2nd phase constructor can leave.
       
    41 // -----------------------------------------------------------------------------
       
    42 EXPORT_C CWimCertConverter* CWimCertConverter::NewL( MCTToken& aToken )
       
    43     {
       
    44     CWimCertConverter* self = new( ELeave ) CWimCertConverter( aToken );
       
    45     CleanupStack::PushL( self );
       
    46     self->ConstructL();
       
    47     CleanupStack::Pop( self ); //self
       
    48     return self;
       
    49     }
       
    50 
       
    51 // -----------------------------------------------------------------------------
       
    52 // CWimCertConverter::ConstructL()
       
    53 // Second phase
       
    54 // -----------------------------------------------------------------------------
       
    55 void CWimCertConverter::ConstructL()
       
    56     {
       
    57     CActiveScheduler::Add( this );
       
    58     iConnectionHandle = RWimCertMgmt::ClientSessionL();           
       
    59     _WIMTRACE ( _L( "CWimCertConverter::ConstructL() completed" ) );
       
    60     }
       
    61 
       
    62 // -----------------------------------------------------------------------------
       
    63 // CWimCertConverter::Restore()
       
    64 // Returns CCTCertInfo objects in array
       
    65 // -----------------------------------------------------------------------------
       
    66 EXPORT_C void CWimCertConverter::Restore( RPointerArray<CWimCertInfo>& aArray, 
       
    67                                           TRequestStatus& aStatus )
       
    68     {
       
    69     _WIMTRACE ( _L( "CWimCertConverter::Restore" ) );
       
    70     iClientStatus = &aStatus;
       
    71     aStatus = KRequestPending;
       
    72     iArray = &aArray;
       
    73     iPhase = EListCertsFromWim;
       
    74     SignalOwnStatusAndComplete();
       
    75     }
       
    76 
       
    77 
       
    78 // -----------------------------------------------------------------------------
       
    79 // CWimCertConverter::CancelRestore()
       
    80 // Cancels outgoing Restore operation. Sets an internal flag to true. 
       
    81 // After necessary cleanup, caller is signalled with KErrCancel 
       
    82 // -error code.
       
    83 // -----------------------------------------------------------------------------
       
    84 EXPORT_C void CWimCertConverter::CancelRestore()
       
    85     {
       
    86     _WIMTRACE ( _L( "CWimCertConverter::CancelRestore" ) );
       
    87     Cancel(); 
       
    88     }
       
    89 
       
    90 // -----------------------------------------------------------------------------
       
    91 // CWimCertConverter::RetrieveCertByIndexL()
       
    92 // Retrieves the actual certificate.
       
    93 // -----------------------------------------------------------------------------
       
    94 
       
    95 EXPORT_C void CWimCertConverter::RetrieveCertByIndexL( const TInt aIndex,
       
    96                                                     TDes8& aEncodedCert, 
       
    97                                                     TRequestStatus& aStatus )
       
    98     {
       
    99     _WIMTRACE ( _L( "CWimCertConverter::RetrieveCertByIndexL" ) );
       
   100     //Check that index is valid
       
   101     __ASSERT_ALWAYS( aIndex <= iArraySize && iCertRefLst,
       
   102         User::Leave( KErrArgument )  );
       
   103     iClientStatus = &aStatus;
       
   104     iCertRetrieveIndex = aIndex;
       
   105     iEncodedCert = &aEncodedCert;
       
   106     aStatus = KRequestPending;
       
   107     iPhase = ERetrieveCertificate;
       
   108     SignalOwnStatusAndComplete();
       
   109     }
       
   110 
       
   111 
       
   112 // -----------------------------------------------------------------------------
       
   113 // CWimCertConverter::CancelRetrieve()
       
   114 // Cancels an ongoing Retrieve operation.
       
   115 // If retrieve is cancelled, then operation is completed with 
       
   116 // KErrCancel -error code.
       
   117 // -----------------------------------------------------------------------------
       
   118 EXPORT_C void CWimCertConverter::CancelRetrieve()
       
   119     {
       
   120     _WIMTRACE ( _L( "CWimCertConverter::CancelRetrieve" ) );
       
   121     Cancel();
       
   122     }
       
   123 
       
   124 
       
   125 // -----------------------------------------------------------------------------
       
   126 // CWimCertConverter::AddCertificate()
       
   127 // Adds a certificate to the store.
       
   128 // -----------------------------------------------------------------------------
       
   129 //
       
   130 EXPORT_C void CWimCertConverter::AddCertificate( const TDesC& aLabel, 
       
   131                               const TCertificateFormat aFormat, 
       
   132                               const TCertificateOwnerType aCertificateOwnerType,
       
   133                               const TKeyIdentifier& aSubjectKeyId,
       
   134                               const TKeyIdentifier& aIssuerKeyId,
       
   135                               const TDesC8& aCert,
       
   136                               TRequestStatus& aStatus )
       
   137     {
       
   138     _WIMTRACE ( _L( "CWimCertConverter::AddCertificate()" ) );        
       
   139     iClientStatus = &aStatus;
       
   140     aStatus = KRequestPending;
       
   141     TBool paramErr = EFalse;
       
   142     //First convert format 
       
   143     switch ( aFormat )
       
   144         {
       
   145         case EX509Certificate:
       
   146             {
       
   147             iParam.iFormat = EWimX509Certificate; 
       
   148             break;
       
   149             }
       
   150         case EWTLSCertificate:
       
   151             {
       
   152             iParam.iFormat = EWimWTLSCertificate;
       
   153             break;
       
   154             }
       
   155         case EX968Certificate:
       
   156             {
       
   157             paramErr = ETrue; 
       
   158             break;
       
   159             }
       
   160         case EUnknownCertificate:
       
   161             {
       
   162             paramErr = ETrue;
       
   163             break;
       
   164             }
       
   165         case EX509CertificateUrl:
       
   166             {
       
   167             iParam.iFormat = EWimCertificateURL;
       
   168             break;
       
   169             }
       
   170         case EWTLSCertificateUrl:
       
   171             {
       
   172             iParam.iFormat = EWimCertificateURL; 
       
   173             break;
       
   174             }
       
   175         case EX968CertificateUrl:
       
   176             {
       
   177             paramErr = ETrue; 
       
   178             break;
       
   179             }
       
   180         default:
       
   181             {
       
   182             paramErr = ETrue;
       
   183             break;
       
   184             }
       
   185             
       
   186         }
       
   187     
       
   188     //Then convert owner type    
       
   189     switch ( aCertificateOwnerType )
       
   190         {
       
   191         case ECACertificate:
       
   192             {
       
   193             iParam.iUsage = EWimCertTypeCA;
       
   194             break;
       
   195             }
       
   196         case EUserCertificate:
       
   197             {
       
   198             iParam.iUsage = EWimCertTypePersonal; 
       
   199             break;
       
   200             }
       
   201         case EPeerCertificate:
       
   202             {
       
   203             paramErr = ETrue;
       
   204             break;
       
   205             }   
       
   206         default:
       
   207             {
       
   208             paramErr = ETrue;
       
   209             break;
       
   210             }
       
   211             
       
   212         }
       
   213     if ( paramErr )
       
   214         {
       
   215         User::RequestComplete( iClientStatus, KErrNotSupported );
       
   216         return;
       
   217         }
       
   218 
       
   219     TRAPD( err, AllocMemoryForAddCertL( aLabel, 
       
   220                                         aIssuerKeyId, 
       
   221                                         aSubjectKeyId, 
       
   222                                         aCert ) );
       
   223     
       
   224     if ( err != KErrNone ) // is everything ok?
       
   225         {
       
   226         DeallocCertHBufs();         //No.
       
   227         _WIMTRACE ( _L( "CWimCertConverter::AddCertificate error = %d" ) );
       
   228         User::RequestComplete( iClientStatus, err );    
       
   229         }
       
   230     else
       
   231         {
       
   232         iPhase = EAddCertificate;
       
   233         SignalOwnStatusAndComplete(); //Yes.
       
   234         }
       
   235     }
       
   236 
       
   237 // -----------------------------------------------------------------------------
       
   238 // CWimCertConverter::CancelAddCertificate()
       
   239 // Cancels an ongoing certificate add operation.
       
   240 // If add operation is cancelled, then operation is completed with 
       
   241 // KErrCancel -error code.
       
   242 // -----------------------------------------------------------------------------
       
   243 EXPORT_C void CWimCertConverter::CancelAddCertificate()
       
   244     {
       
   245     _WIMTRACE ( _L( "CWimCertConverter::CancelAddCertificate()" ) );
       
   246     Cancel();
       
   247     }
       
   248 
       
   249 // -----------------------------------------------------------------------------
       
   250 // CWimCertConverter::RemoveL()
       
   251 // Removes a certificate from WIM
       
   252 // -----------------------------------------------------------------------------
       
   253 EXPORT_C void CWimCertConverter::RemoveL( const TInt aIndex, 
       
   254                                          TRequestStatus& aStatus )
       
   255     {
       
   256     _WIMTRACE ( _L( "CWimCertConverter::RemoveL()" ) );
       
   257     //Check that index is valid
       
   258     __ASSERT_ALWAYS( aIndex <= iArraySize && iCertRefLst, 
       
   259         User::Leave( KErrArgument )  );    
       
   260     iClientStatus = &aStatus;
       
   261     iCertRetrieveIndex = aIndex;
       
   262     aStatus = KRequestPending;
       
   263     iPhase = ERemove;
       
   264     SignalOwnStatusAndComplete();
       
   265     }
       
   266 
       
   267 // -----------------------------------------------------------------------------
       
   268 // CWimCertConverter::CancelRemove()
       
   269 // Cancels outgoing certificate remove operation. 
       
   270 // -----------------------------------------------------------------------------
       
   271 EXPORT_C void CWimCertConverter::CancelRemove()
       
   272     {
       
   273     _WIMTRACE ( _L( "CWimCertConverter::CancelRemove()" ) );
       
   274     Cancel();
       
   275     }
       
   276 
       
   277 
       
   278 // -----------------------------------------------------------------------------
       
   279 // CWimCertConverter::AllocMemoryForAddCertL()
       
   280 // Allocates memory for member variables, which are needed when adding
       
   281 // a certificate asynchronously to WIM.
       
   282 // -----------------------------------------------------------------------------
       
   283 void CWimCertConverter::AllocMemoryForAddCertL( const TDesC& aLabel, 
       
   284                                       const TKeyIdentifier& aIssuerKeyId, 
       
   285                                       const TKeyIdentifier& aSubjectKeyId, 
       
   286                                       const TDesC8& aCert )
       
   287     {
       
   288     _WIMTRACE ( _L( "CWimCertConverter::AllocMemoryForAddCertL()" ) );
       
   289     iCertHBufOne = aCert.AllocL(); //certificate
       
   290     iCertHBufOnePtr = new( ELeave ) TPtr8( iCertHBufOne->Des() );
       
   291 
       
   292     iCertHBufTwo = aIssuerKeyId.AllocL(); //IssuerKeyId
       
   293     iCertHBufTwoPtr = new( ELeave ) TPtr8( iCertHBufTwo->Des() );
       
   294     iParam.iCaId.Copy( iCertHBufTwoPtr->Ptr(), iCertHBufTwoPtr->Length() );
       
   295 
       
   296     iCertHBufThree = aSubjectKeyId.AllocL(); //SubjectKeyId
       
   297     iCertHBufThreePtr = new( ELeave ) TPtr8( iCertHBufThree->Des() );
       
   298     iParam.iKeyId.Copy( iCertHBufThreePtr->Ptr(), iCertHBufThreePtr->Length() );
       
   299 
       
   300     TBuf8<KLabelLen>buf;
       
   301     buf.Copy( aLabel );
       
   302     buf.ZeroTerminate();
       
   303     iCertHBufFour = buf.AllocL();           //label
       
   304     iCertHBufFourPtr = new( ELeave ) TPtr8( iCertHBufFour->Des() );
       
   305     iParam.iLabel.Copy( iCertHBufFourPtr->Ptr(), iCertHBufFourPtr->Length() );
       
   306     }
       
   307 
       
   308 
       
   309 
       
   310 // -----------------------------------------------------------------------------
       
   311 // CWimCertConverter::SignalOwnStatusAndComplete()       
       
   312 // Sets own iStatus to KRequestPending, and signals it 
       
   313 // with User::RequestComplete() -request. This gives chance 
       
   314 // active scheduler to run other active objects. After a quick
       
   315 // visit in active scheduler, signal returns to RunL() and starts next
       
   316 // phase of operation. 
       
   317 // @return void
       
   318 // -----------------------------------------------------------------------------
       
   319 void CWimCertConverter::SignalOwnStatusAndComplete()
       
   320     {
       
   321     _WIMTRACE ( _L( "CWimCertConverter::SignalOwnStatusAndComplete()" ) );
       
   322     iStatus = KRequestPending;
       
   323     SetActive();
       
   324     TRequestStatus* status = &iStatus;
       
   325     User::RequestComplete( status, KErrNone );
       
   326     }
       
   327     
       
   328 // -----------------------------------------------------------------------------
       
   329 // CWimCertConverter::~CWimCertConverter()
       
   330 // Allocated memory is released.
       
   331 // -----------------------------------------------------------------------------
       
   332 EXPORT_C CWimCertConverter::~CWimCertConverter()
       
   333     {
       
   334     _WIMTRACE ( _L( "CWimCertConverter::~CWimCertConverter()" ) );
       
   335     Cancel();
       
   336     if( iConnectionHandle )
       
   337         {
       
   338         iConnectionHandle->DeallocWimCertPckgBuf();
       
   339         iConnectionHandle->DeallocCertAddParametersPckgBuf();
       
   340         iConnectionHandle->DeallocRemoveCertPckgBuf();
       
   341         iConnectionHandle->DeallocGetExtrasPckgBuf();
       
   342         iConnectionHandle->Close();
       
   343         delete iConnectionHandle;
       
   344         }
       
   345     
       
   346     DeallocWimCertInfo();
       
   347     DeallocCertHBufs();
       
   348     DeallocReferences();
       
   349     delete iTrustedUsages;
       
   350     delete iTrustedUsagesPtr;
       
   351     delete iKeyIdBuf;
       
   352     delete iKeyIdPointer;
       
   353 
       
   354     }
       
   355 
       
   356 // -----------------------------------------------------------------------------
       
   357 // CWimCertConverter::RunL()
       
   358 // This has eight different phases which are explained here:
       
   359 // 1. EListCertsFromWim:Allocate member variables for arrays usage. 
       
   360 //    Array is passed as an argument to server and it is filled with 
       
   361 //    certificate information found from WIM.
       
   362 // 2. ECreateNewCertObjects: New certificate objects are created based on 
       
   363 //    received information on step one. A little bit of conversion is 
       
   364 //    required. Objects are inserted to an array.
       
   365 // 3. ERetrieveCertificate:Allocate member variables for struct, 
       
   366 //    which is used to fetch certificate details
       
   367 // 4. ERetrievingCompleted: Check cancellation. If not cancelled,
       
   368 //    copy information to caller's buffer. 
       
   369 // 5. EAddCertificate: Adds certificate to WIM.
       
   370 // 6. EAddCertificateCompleted: Certificate is added successfully. Deallocate
       
   371 //                              variables and complete request.
       
   372 // 7. ERemove: Before removing, we will check for cancellation. After that
       
   373 //    cancellation is too late.
       
   374 // 8. ERemoveCompleted: Removal operation completed ok. Deallocte variables and
       
   375 //    complete request
       
   376 // 9. EGetCertExtras: Extra data is fetched and async. waiter needs to be 
       
   377 //    stopped
       
   378 // -----------------------------------------------------------------------------
       
   379 void CWimCertConverter::RunL()
       
   380     {
       
   381     _WIMTRACE3( _L( "CWimCertConverter::RunL()|iPhase=%d, iStatus = %d" ), iPhase, iStatus.Int() );
       
   382     //Check for error
       
   383     if( iStatus.Int() != KErrNone )
       
   384         {
       
   385         //failed to retrieve certificate
       
   386         if ( iPhase == ERetrievingCompleted )
       
   387             {
       
   388              iConnectionHandle->DeallocWimCertPckgBuf();
       
   389              DeallocCertHBufs();
       
   390              _WIMTRACE2 ( _L( "CWimCertConverter::RunL() failed to retrieve \
       
   391                  certificate, ERROR = %d" ),iStatus.Int() );
       
   392             }
       
   393         //failed to add certificate
       
   394         else if ( iPhase == EAddCertificateCompleted )
       
   395             {
       
   396             //If user has tried to cancel at this stage, ignore flag.
       
   397             iConnectionHandle->DeallocCertAddParametersPckgBuf();
       
   398             DeallocCertHBufs();
       
   399              _WIMTRACE2 ( _L( "CWimCertConverter::RunL() failed to add \
       
   400                  certificate, ERROR = %d" ),iStatus.Int() );
       
   401             }
       
   402         //failed to remove certificate
       
   403         else if ( iPhase == ERemoveCompleted )
       
   404             {
       
   405             //If user has tried to cancel at this stage, ignore flag.
       
   406             iConnectionHandle->DeallocRemoveCertPckgBuf();
       
   407              _WIMTRACE2 ( _L( "CWimCertConverter::RunL() failed to remove \
       
   408                  certificate, ERROR = %d" ), iStatus.Int() );
       
   409             }
       
   410         User::RequestComplete( iClientStatus, iStatus.Int() );
       
   411         }
       
   412     else
       
   413         {
       
   414         switch( iPhase )
       
   415             {
       
   416             case EListCertsFromWim: //get certificates from WIM.
       
   417                 {                  
       
   418                 if ( iArraySize ) //Delete previous preferences. 
       
   419                     {           //User might added or removed a certificate. 
       
   420                     DeallocWimCertInfo();
       
   421                     DeallocReferences();
       
   422                     }
       
   423             
       
   424                 //Ok ready to begin. First get Cert count
       
   425                 iCertCount = iConnectionHandle->CertCount( EWimEntryTypeAll ); 
       
   426                 _WIMTRACE2 ( _L( "CWimCertConverter::RunL() \
       
   427                     certCount =%d" ),iCertCount );
       
   428                 if ( !iCertCount )  
       
   429                     {
       
   430                     User::RequestComplete( iClientStatus, KErrNotFound );
       
   431                     }
       
   432                 else
       
   433                     {
       
   434                     iCertRefLst = new( ELeave ) TCertificateAddress[iCertCount];
       
   435 
       
   436                     //Creates new array according to certificate count
       
   437                     iCertInfoArr  = new( ELeave ) TWimCertInfo[iCertCount];
       
   438             
       
   439                     AllocWimCertInfoL( iCertInfoArr, iCertCount );
       
   440                     iStatus = KRequestPending;
       
   441                     iConnectionHandle->CertRefLst( iCertRefLst, 
       
   442                                           iCertInfoArr, 
       
   443                                           iCertCount, 
       
   444                                           EWimEntryTypeAll, 
       
   445                                           iStatus );
       
   446                     iPhase = ECreateNewCertObjects;
       
   447                     iIndex = 0;
       
   448                     SetActive();    
       
   449                     _WIMTRACE ( _L( "CWimCertConverter::RunL() \
       
   450                         GetCertRefLst" ) );
       
   451                     }
       
   452                 break;
       
   453                 }
       
   454             case ECreateNewCertObjects: //Certificates fetched, 
       
   455                 { 
       
   456                 CreateNewCertObjectsL();//create new cert-objects
       
   457                 break;
       
   458                 }
       
   459             case EGetTrustedUsages:
       
   460                 {
       
   461                 GetTrustedUsagesL();
       
   462                 break;
       
   463                 }
       
   464             case ETrustedUsagesDone:
       
   465                 {
       
   466                 TrustedUsagesDoneL();
       
   467                 break;
       
   468                 }
       
   469             case ECertObjectsDone: 
       
   470                 {
       
   471                 User::RequestComplete( iClientStatus, KErrNone );    
       
   472                 _WIMTRACE ( _L( "CWimCertConverter::RunL() \
       
   473                     ECertObjectsDone" ) );
       
   474                 break;
       
   475                 }
       
   476             case ERetrieveCertificate: //Get Cert details from WIM
       
   477                 {
       
   478                 AllocMemoryForCertDetailsL();
       
   479                 iConnectionHandle->CertDetailsL( 
       
   480                             iCertRefLst[iCertRetrieveIndex], 
       
   481                             iWimCertDetails, 
       
   482                             iStatus );
       
   483                 iPhase = ERetrievingCompleted;
       
   484                 SetActive();
       
   485                 _WIMTRACE ( _L( "CWimCertConverter::RunL() \
       
   486                     ERetrieveCertificate" ) );
       
   487                 break;
       
   488                 }
       
   489             case ERetrievingCompleted: //Cert details fetched, check errors &                         
       
   490                 {                      //cancellations & complete request                   
       
   491                 //copy cert details to iEncodedCert -buffer,
       
   492                 //which points to received aEncoded -cert buffer.
       
   493                 CopyRetrievedCertData();
       
   494                 iConnectionHandle->DeallocWimCertPckgBuf();                
       
   495                 DeallocCertHBufs();
       
   496                 User::RequestComplete( iClientStatus, KErrNone );
       
   497                 _WIMTRACE ( _L( "CWimCertConverter::RunL() \
       
   498                     ERetrievingCompleted" ) );
       
   499                 break;
       
   500                 }
       
   501             case EAddCertificate: //Add a certificate
       
   502                 {
       
   503                 iConnectionHandle->StoreCertificateL( *iCertHBufOnePtr, 
       
   504                                                 iParam, 
       
   505                                                 EWimCertLocationWIMCard, 
       
   506                                                 iStatus );  
       
   507                 iPhase = EAddCertificateCompleted;
       
   508                 SetActive();   
       
   509                 _WIMTRACE ( _L( "CWimCertConverter::RunL() \
       
   510                     EAddCertificate" ) );                    
       
   511                 break;
       
   512                 }
       
   513             case EAddCertificateCompleted: //certificate added 
       
   514                 {
       
   515                 iConnectionHandle->DeallocCertAddParametersPckgBuf();
       
   516                 DeallocCertHBufs();
       
   517                 User::RequestComplete( iClientStatus, KErrNone );
       
   518                 _WIMTRACE ( _L( "CWimCertConverter::RunL() \
       
   519                         EAddCertificateCompleted" ) );                    
       
   520                 break;
       
   521                 }
       
   522             case ERemove:                //remove certificate
       
   523                 {
       
   524                 iWimCertRemoveAddr.iCertAddr = 
       
   525                                 iCertRefLst[iCertRetrieveIndex];
       
   526                 iWimCertRemoveAddr.iLocation = EWimCertLocationWIMCard;
       
   527                 iConnectionHandle->RemoveL( iWimCertRemoveAddr, iStatus );
       
   528                 iPhase = ERemoveCompleted;
       
   529                 SetActive();
       
   530                 _WIMTRACE ( _L( "CWimCertConverter::RunL() \
       
   531                     ERemove" ) );                    
       
   532 
       
   533                 break;
       
   534                 }  
       
   535             case ERemoveCompleted:      //certificate removed. 
       
   536                 {
       
   537                 iConnectionHandle->DeallocRemoveCertPckgBuf();
       
   538                 User::RequestComplete( iClientStatus, KErrNone );
       
   539                 _WIMTRACE ( _L( "CWimCertConverter::RunL() \
       
   540                         ERemoveCompleted" ) ); 
       
   541                 break;
       
   542                 }
       
   543             default:
       
   544                 {
       
   545                 User::RequestComplete( iClientStatus, KErrNotSupported );
       
   546                 break;
       
   547                 }
       
   548                 
       
   549             }
       
   550         }
       
   551     }
       
   552 
       
   553 
       
   554 // -----------------------------------------------------------------------------
       
   555 // CWimCertConverter::CreateNewCertObjectsL()
       
   556 // Creates new certificate objects which can be returned to the caller.
       
   557 // -----------------------------------------------------------------------------
       
   558 void CWimCertConverter::CreateNewCertObjectsL()
       
   559     {
       
   560     _WIMTRACE ( _L( "CWimCertConverter::CreateNewCertObjectsL()" ) );
       
   561 
       
   562     HBufC16* label16 = NULL;
       
   563     HBufC8* hash8 = NULL;
       
   564 
       
   565     if ( iIndex < iCertCount )
       
   566         {
       
   567         TCertificateOwnerType certificateType;
       
   568         if ( iCertInfoArr[iIndex].iUsage == 0 )
       
   569             {
       
   570             certificateType = EUserCertificate; // 0 == User
       
   571             }
       
   572         else
       
   573             {
       
   574             certificateType = ECACertificate;   // 1 == CA
       
   575             }
       
   576                         
       
   577         label16 = HBufC16::NewLC( iCertInfoArr[iIndex].iLabel.Length() );
       
   578         label16->Des().Copy( iCertInfoArr[iIndex].iLabel );
       
   579             
       
   580         hash8 = HBufC8::NewLC( iCertInfoArr[iIndex].iIssuerHash.Length() );
       
   581         hash8->Des().Copy( iCertInfoArr[iIndex].iIssuerHash );
       
   582         // Convert type 
       
   583         TCertificateFormat format;
       
   584         format = GetCertFormatByIndex( iIndex );
       
   585         //Create key indentifiers
       
   586         TKeyIdentifier subjectKeyId;
       
   587         TKeyIdentifier issuerKeyId;
       
   588         //needs these for CCTCertInfo object -creation
       
   589         subjectKeyId = iCertInfoArr[iIndex].iKeyId;
       
   590         issuerKeyId  = iCertInfoArr[iIndex].iCAId;
       
   591         //Create CCTCertInfo object. 
       
   592         if ( iCertInfoArr[iIndex].iIssuerHash.Length() > 0 )
       
   593             {
       
   594             /**
       
   595             * Certificate modification is not supported in 3.0, 
       
   596             * the iCertInfoArr[iIndex].iModifiable will be replaced 
       
   597             * by EFalse. 
       
   598             * In the future, when modification is supported, it will be 
       
   599             * change back.
       
   600             */
       
   601             iCertInfoArr[iIndex].iModifiable = EFalse;
       
   602             iCert = CCTCertInfo::NewL( label16->Des(), 
       
   603                                       format, 
       
   604                                       certificateType,
       
   605                                       iCertInfoArr[iIndex].iCertlen, 
       
   606                                       &subjectKeyId, 
       
   607                                       &issuerKeyId, 
       
   608                                       iToken, 
       
   609                                       iIndex,
       
   610                                       iCertInfoArr[iIndex].iModifiable,
       
   611                                       hash8 );
       
   612             }
       
   613         else
       
   614             {
       
   615             /**
       
   616             * Same reason as mentioned above
       
   617             */
       
   618             iCertInfoArr[iIndex].iModifiable = EFalse;
       
   619             iCert = CCTCertInfo::NewL( label16->Des(), 
       
   620                                       format, 
       
   621                                       certificateType,
       
   622                                       iCertInfoArr[iIndex].iCertlen, 
       
   623                                       &subjectKeyId, 
       
   624                                       &issuerKeyId, 
       
   625                                       iToken, 
       
   626                                       iIndex,
       
   627                                       iCertInfoArr[iIndex].iModifiable );
       
   628             }
       
   629 
       
   630         CleanupStack::PopAndDestroy( hash8 ); 
       
   631         CleanupStack::PopAndDestroy( label16 );
       
   632 
       
   633         iOids = new( ELeave ) RArray<HBufC*>();
       
   634         //Check whether certificate has extra data. Certificate type must be
       
   635         // X509
       
   636         if ( iCertInfoArr[iIndex].iCDFRefs &&
       
   637              iCertInfoArr[iIndex].iType == WIMI_CT_X509 )
       
   638             {  
       
   639             iPhase = EGetTrustedUsages;
       
   640             }
       
   641         else
       
   642             {
       
   643             CreateNewWimCertObjectL();
       
   644             }
       
   645         }
       
   646     else
       
   647         {
       
   648         DeallocWimCertInfo(); 
       
   649         iPhase = ECertObjectsDone;
       
   650         }
       
   651     SignalOwnStatusAndComplete();
       
   652     }
       
   653 
       
   654 // -----------------------------------------------------------------------------
       
   655 // CWimCertConverter::CreateNewWimCertObjectL()
       
   656 // 
       
   657 // -----------------------------------------------------------------------------
       
   658 void CWimCertConverter::CreateNewWimCertObjectL()
       
   659     {
       
   660     _WIMTRACE ( _L( "CWimCertConverter::CreateNewWimCertObjectL()" ) );
       
   661 
       
   662     iCertInfo = CWimCertInfo::NewL( iCert, //CCTCertInfo object
       
   663                                     iCert->SubjectKeyId(), //key hash
       
   664                                     *iOids, 
       
   665                                     iCertInfoArr[iIndex].iCDFRefs );
       
   666     
       
   667     delete iOids;
       
   668     iOids = NULL;
       
   669 
       
   670     //Append WimCertInfo -object to array. Ownership to iArray here.
       
   671     User::LeaveIfError( iArray->Append( iCertInfo ) );
       
   672 
       
   673     iPhase = ECreateNewCertObjects;
       
   674     iIndex++;
       
   675     }
       
   676         
       
   677 // -----------------------------------------------------------------------------
       
   678 // CWimCertConverter::GetTrustedUsagesL
       
   679 // Get trusted usages (OIDs) of a current certificate, which is pointed out 
       
   680 // by a index
       
   681 // -----------------------------------------------------------------------------
       
   682 void CWimCertConverter::GetTrustedUsagesL()
       
   683     {
       
   684     _WIMTRACE ( _L( "CWimCertConverter::GetTrustedUsagesL() | Begin" ) );
       
   685 
       
   686     delete iTrustedUsages;
       
   687     iTrustedUsages = NULL;
       
   688     delete iTrustedUsagesPtr;
       
   689     iTrustedUsagesPtr = NULL;
       
   690     //Allocate variables for trusted usage fetching
       
   691     iTrustedUsages = HBufC::NewL( iCertInfoArr[iIndex].iTrustedUsageLength );
       
   692     iTrustedUsagesPtr = new( ELeave ) TPtr( iTrustedUsages->Des() );
       
   693 
       
   694     iCertExtrasInfo.iTrustedUsage = iTrustedUsagesPtr;
       
   695     iPhase = ETrustedUsagesDone;
       
   696 
       
   697     delete iKeyIdBuf;
       
   698     iKeyIdBuf = NULL;
       
   699     delete iKeyIdPointer;
       
   700     iKeyIdPointer = NULL;
       
   701     // Take a copy of key identifier
       
   702     iKeyIdBuf = iCertInfoArr[iIndex].iKeyId.AllocL();
       
   703     iKeyIdPointer = new( ELeave ) TPtr8( iKeyIdBuf->Des() );
       
   704 
       
   705     iConnectionHandle->GetCertExtrasL( iKeyIdPointer,
       
   706                                        iCertExtrasInfo,
       
   707                                        iCertInfoArr[iIndex].iUsage,
       
   708                                        iStatus );
       
   709     SetActive();
       
   710     _WIMTRACE ( _L( "CWimCertConverter::GetTrustedUsagesL() | End" ) );
       
   711     }
       
   712 
       
   713 // -----------------------------------------------------------------------------
       
   714 // CWimCertConverter::TrustedUsagesDoneL()
       
   715 // -----------------------------------------------------------------------------
       
   716 void CWimCertConverter::TrustedUsagesDoneL()
       
   717     {
       
   718     _WIMTRACE ( _L( "CWimCertConverter::TrustedUsagesDoneL()" ) );
       
   719     if ( iStatus.Int() == KErrNone )
       
   720         {
       
   721         //Parse oids and put them to an array
       
   722         TLex16 lex( *iTrustedUsages );
       
   723         TPtrC16 lexToken;
       
   724         for ( TBool extrasDone = EFalse; extrasDone == EFalse; )
       
   725             {
       
   726             lexToken.Set( lex.NextToken() );
       
   727             if ( lexToken.Length() )
       
   728                 {
       
   729                 HBufC* oid = lexToken.AllocLC();
       
   730                 User::LeaveIfError( iOids->Append( oid ) );
       
   731                 CleanupStack::Pop( oid ); //oid
       
   732                 }
       
   733             else
       
   734                 {
       
   735                 extrasDone = ETrue;
       
   736                 }
       
   737             }
       
   738         CreateNewWimCertObjectL();
       
   739         SignalOwnStatusAndComplete();
       
   740         }
       
   741     else
       
   742         {
       
   743         User::RequestComplete( iClientStatus, iStatus.Int() );
       
   744         }
       
   745 
       
   746     iConnectionHandle->DeallocGetExtrasPckgBuf();
       
   747     }
       
   748 
       
   749 // -----------------------------------------------------------------------------
       
   750 // CWimCertConverter::GetCertFormatByIndex()
       
   751 // Returns certificate format according to received index
       
   752 // -----------------------------------------------------------------------------
       
   753 TCertificateFormat CWimCertConverter::GetCertFormatByIndex( TInt aIndex )
       
   754     {
       
   755     _WIMTRACE ( _L( "CWimCertConverter::GetCertFormatByIndex()" ) );
       
   756 
       
   757     // Convert type 
       
   758     TCertificateFormat format;
       
   759     switch ( iCertInfoArr[aIndex].iType )
       
   760         {
       
   761         case WIMI_CT_WTLS: 
       
   762             {
       
   763             format = EWTLSCertificate;
       
   764             break;
       
   765             }
       
   766         case WIMI_CT_X509: 
       
   767             {
       
   768             format = EX509Certificate;
       
   769             break;
       
   770             }
       
   771         case WIMI_CT_X968: 
       
   772             {
       
   773             format = EX968Certificate;
       
   774             break;
       
   775             }
       
   776         case WIMI_CT_URL: 
       
   777             {
       
   778             format = EX509CertificateUrl;
       
   779             break;
       
   780             }
       
   781         default:
       
   782             {
       
   783             format = EUnknownCertificate;
       
   784             break;
       
   785             }         
       
   786         }
       
   787     return format;
       
   788     }
       
   789 
       
   790 // -----------------------------------------------------------------------------
       
   791 // CWimCertConverter::DoCancel()
       
   792 // Deallocates member variables and completes client status with
       
   793 // KErrCancel error code.
       
   794 // -----------------------------------------------------------------------------
       
   795 void CWimCertConverter::DoCancel()
       
   796     {
       
   797     _WIMTRACE ( _L( "CWimCertConverter::DoCancel()" ) );
       
   798     if ( iConnectionHandle && iPhase == ERetrievingCompleted )
       
   799         {
       
   800         iConnectionHandle->DeallocWimCertPckgBuf();
       
   801         }
       
   802     else if ( iConnectionHandle && iPhase == EAddCertificateCompleted ) 
       
   803         {
       
   804         iConnectionHandle->DeallocCertAddParametersPckgBuf();
       
   805         }
       
   806     else if ( iConnectionHandle && iPhase == ERemoveCompleted ) 
       
   807         {
       
   808         iConnectionHandle->DeallocRemoveCertPckgBuf();
       
   809         }
       
   810     else if ( iConnectionHandle && iPhase == ETrustedUsagesDone ) 
       
   811         {
       
   812         iConnectionHandle->DeallocGetExtrasPckgBuf();
       
   813         }
       
   814 
       
   815     if ( iPhase == EGetTrustedUsages || iPhase == ETrustedUsagesDone )
       
   816         {
       
   817         iCert->Release();
       
   818         }
       
   819 
       
   820     DeallocWimCertInfo();
       
   821     DeallocCertHBufs();
       
   822     DeallocReferences();
       
   823     User::RequestComplete( iClientStatus, KErrCancel );
       
   824     }
       
   825 
       
   826 // -----------------------------------------------------------------------------
       
   827 // CWimCertConverter::RunError() 
       
   828 //                                       
       
   829 // The active scheduler calls this function if this active object's RunL() 
       
   830 // function leaves. This gives this active object the opportunity to perform 
       
   831 // any necessary cleanup.
       
   832 // After array's cleanup, complete request with received error code.
       
   833 // -----------------------------------------------------------------------------
       
   834 TInt CWimCertConverter::RunError( TInt aError )
       
   835     {
       
   836     _WIMTRACE ( _L( "CWimCertConverter::RunError \
       
   837             Error = %d" ) );
       
   838     DeallocWimCertInfo();
       
   839     DeallocCertHBufs();
       
   840     delete iTrustedUsages;
       
   841     iTrustedUsages = NULL;
       
   842     delete iTrustedUsagesPtr;
       
   843     iTrustedUsagesPtr = NULL;
       
   844     delete iKeyIdBuf;
       
   845     iKeyIdBuf = NULL;
       
   846     delete iKeyIdPointer;
       
   847     iKeyIdPointer = NULL;
       
   848 
       
   849     User::RequestComplete( iClientStatus, aError );
       
   850     return KErrNone;
       
   851     }
       
   852 
       
   853 // -----------------------------------------------------------------------------
       
   854 // CWimCertConverter::AllocWimCertInfoL()
       
   855 // Allocates memory for the array which is filled by server.
       
   856 // -----------------------------------------------------------------------------
       
   857 void CWimCertConverter::AllocWimCertInfoL( TWimCertInfo* aWimCertInfoArr, 
       
   858                                            TInt aCount )
       
   859     {
       
   860     _WIMTRACE ( _L( "CWimCertConverter::AllocWimCertInfoL()" ) );
       
   861 
       
   862     TUint8 index;    
       
   863     //These are arrays
       
   864     iLabel = new( ELeave ) PHBufC8[aCount];
       
   865     iKeyId = new( ELeave ) PHBufC8[aCount];
       
   866     iCAId  = new( ELeave ) PHBufC8[aCount];
       
   867     iIssuerHash = new( ELeave ) PHBufC8[aCount];
       
   868 
       
   869     iLabelPtr = new( ELeave ) PTPtr8[aCount];
       
   870     iKeyIdPtr = new( ELeave ) PTPtr8[aCount];
       
   871     iCAIdPtr  = new( ELeave ) PTPtr8[aCount];
       
   872     iIssuerHashPtr = new( ELeave ) PTPtr8[aCount];
       
   873 
       
   874     for ( index = 0; index < aCount ; index++ )
       
   875         {
       
   876         iLabel[index] = HBufC8::NewL( KLabelLen );
       
   877         iKeyId[index] = HBufC8::NewL( KKeyIdLen );
       
   878         iCAId[index]  = HBufC8::NewL( KPkcs15IdLen );
       
   879         iIssuerHash[index] = HBufC8::NewL( KIssuerHash );
       
   880         
       
   881         iLabelPtr[index]  = new( ELeave ) TPtr8( iLabel[index]->Des() );
       
   882         iKeyIdPtr[index]  = new( ELeave ) TPtr8( iKeyId[index]->Des() );
       
   883         iCAIdPtr[index]   = new( ELeave ) TPtr8( iCAId[index]->Des() );
       
   884         iIssuerHashPtr[index] = new( ELeave ) 
       
   885                                 TPtr8( iIssuerHash[index]->Des() );
       
   886 
       
   887         aWimCertInfoArr[index].iLabel.Copy( iLabelPtr[index]->Ptr(),
       
   888                                             iLabelPtr[index]->Length() );
       
   889         aWimCertInfoArr[index].iKeyId.Copy( iKeyIdPtr[index]->Ptr(),
       
   890                                             iKeyIdPtr[index]->Length() );
       
   891         aWimCertInfoArr[index].iCAId.Copy( iCAIdPtr[index]->Ptr(),
       
   892                                            iCAIdPtr[index]->Length() );
       
   893         aWimCertInfoArr[index].iIssuerHash.Copy(
       
   894             iIssuerHashPtr[index]->Ptr(), iIssuerHashPtr[index]->Length() );
       
   895         }
       
   896     iArraySize = aCount;   
       
   897     }
       
   898 
       
   899  
       
   900 
       
   901 // -----------------------------------------------------------------------------
       
   902 // CWimCertConverter::AllocMemoryForCertDetailsL()
       
   903 // Allocates memory for a struct which is filled by server.
       
   904 // -----------------------------------------------------------------------------     
       
   905 void CWimCertConverter::AllocMemoryForCertDetailsL()
       
   906     {
       
   907     _WIMTRACE ( _L( "CWimCertConverter::AllocMemoryForCertDetailsL()" ) );
       
   908     iCertHBufOne = HBufC8::NewL( iEncodedCert->MaxLength() ); //whole cert
       
   909     iCertHBufOnePtr = new( ELeave ) TPtr8( iCertHBufOne->Des() ); 
       
   910     iWimCertDetails.iCert = iCertHBufOnePtr;
       
   911     }
       
   912 
       
   913 
       
   914 // -----------------------------------------------------------------------------
       
   915 // CWimCertConverter::CopyRetrievedCertData()
       
   916 // Writes data to caller's buffer by using pointer.
       
   917 // -----------------------------------------------------------------------------
       
   918 void CWimCertConverter::CopyRetrievedCertData()
       
   919     {
       
   920     _WIMTRACE ( _L( "CWimCertConverter::CopyRetrievedCertData()" ) );
       
   921     TPtr8 ptr = iCertHBufOne->Des();
       
   922     iEncodedCert->Copy( ptr );
       
   923     }
       
   924 
       
   925 // -----------------------------------------------------------------------------
       
   926 // CWimCertConverter::DeallocCertHBufs()
       
   927 // DeAllocates memory from member variables, which are used
       
   928 // when communicating with WIM.
       
   929 // -----------------------------------------------------------------------------
       
   930 void CWimCertConverter::DeallocCertHBufs()
       
   931     {
       
   932     _WIMTRACE ( _L( "CWimCertConverter::DeallocCertHBufs()" ) ); 
       
   933     if ( iCertHBufOne )
       
   934         {
       
   935         delete iCertHBufOne;
       
   936         delete iCertHBufOnePtr;
       
   937         iCertHBufOne = NULL;
       
   938         iCertHBufOnePtr = NULL;
       
   939         }
       
   940     if ( iCertHBufTwo )
       
   941         {
       
   942         delete iCertHBufTwo;
       
   943         delete iCertHBufTwoPtr;
       
   944         iCertHBufTwo = NULL;
       
   945         iCertHBufTwoPtr = NULL;
       
   946         }
       
   947     if ( iCertHBufThree )
       
   948         {
       
   949         delete iCertHBufThree;
       
   950         delete iCertHBufThreePtr;
       
   951         iCertHBufThree = NULL;
       
   952         iCertHBufThreePtr = NULL;
       
   953         }
       
   954     if ( iCertHBufFour )
       
   955         {
       
   956         delete iCertHBufFour;
       
   957         delete iCertHBufFourPtr;
       
   958         iCertHBufFour = NULL;
       
   959         iCertHBufFourPtr = NULL;
       
   960         }
       
   961     }
       
   962 
       
   963 // -----------------------------------------------------------------------------
       
   964 // CWimCertConverter::DeallocReferences()
       
   965 // Deallocates memory. If user has cancelled initialization process, we need
       
   966 // to dealloc our references to loaded certs. 
       
   967 // -----------------------------------------------------------------------------
       
   968 void CWimCertConverter::DeallocReferences()
       
   969     {
       
   970     _WIMTRACE ( _L( "CWimCertConverter::DeallocReferences()" ) ); 
       
   971     if ( iCertRefLst )
       
   972         {
       
   973         delete[] iCertRefLst;  
       
   974         iCertRefLst = NULL;
       
   975         }
       
   976     if ( iCertInfoArr )
       
   977         {
       
   978         delete[] iCertInfoArr;
       
   979         iCertInfoArr = NULL;
       
   980         }  
       
   981     iArraySize = 0;
       
   982     iArray = NULL;
       
   983     iCertCount = 0;
       
   984     }
       
   985 
       
   986 // -----------------------------------------------------------------------------
       
   987 // CWimCertConverter::DeallocWimCertInfo()
       
   988 // Deallocates memory. If something has leaved during asynchronous request, we 
       
   989 // will deallocate all member data. 
       
   990 // -----------------------------------------------------------------------------
       
   991 void CWimCertConverter::DeallocWimCertInfo()
       
   992     {
       
   993     _WIMTRACE ( _L( "CWimCertConverter::DeallocWimCertInfo()" ) ); 
       
   994     TUint8 index;
       
   995     for ( index = 0; index < iArraySize; index ++ )
       
   996         {
       
   997         if ( iLabel )
       
   998             {
       
   999             delete iLabel[index];
       
  1000             }
       
  1001         if ( iKeyId )
       
  1002             {
       
  1003             delete iKeyId[index];
       
  1004             }
       
  1005         if ( iCAId )
       
  1006             {
       
  1007             delete iCAId[index];
       
  1008             }
       
  1009         if ( iIssuerHash )
       
  1010             {
       
  1011             delete iIssuerHash[index];
       
  1012             }
       
  1013         if ( iLabelPtr )
       
  1014             {
       
  1015             delete iLabelPtr[index];
       
  1016             }
       
  1017         if ( iKeyIdPtr )
       
  1018             {
       
  1019             delete iKeyIdPtr[index];
       
  1020             }
       
  1021         if ( iCAIdPtr )
       
  1022             {
       
  1023             delete iCAIdPtr[index];
       
  1024             }
       
  1025         if ( iIssuerHashPtr )
       
  1026             {
       
  1027             delete iIssuerHashPtr[index];
       
  1028             }
       
  1029         }
       
  1030 
       
  1031     delete[] iLabel;
       
  1032     delete[] iKeyId;
       
  1033     delete[] iCAId;
       
  1034     delete[] iIssuerHash;
       
  1035     delete[] iLabelPtr;
       
  1036     delete[] iKeyIdPtr;
       
  1037     delete[] iCAIdPtr;
       
  1038     delete[] iIssuerHashPtr;
       
  1039     iLabel = NULL;
       
  1040     iKeyId  = NULL;
       
  1041     iCAId = NULL;
       
  1042     iIssuerHash = NULL;
       
  1043     iLabelPtr = NULL;
       
  1044     iKeyIdPtr = NULL;
       
  1045     iCAIdPtr = NULL;
       
  1046     iIssuerHashPtr = NULL;
       
  1047     }