omadrm/drmengine/roapstorage/src/RoapStorageClient.cpp
changeset 0 95b198f216e5
child 18 8a03a285ab14
equal deleted inserted replaced
-1:000000000000 0:95b198f216e5
       
     1 /*
       
     2 * Copyright (c) 2002-2008 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:  Client Class of ROAP Storage Server
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDE FILES
       
    20 #include <e32std.h>
       
    21 #include <f32file.h>
       
    22 #include <s32file.h>
       
    23 #include <x509cert.h>
       
    24 #include <x509keys.h>
       
    25 #include <asn1dec.h>
       
    26 #include <hash.h>
       
    27 #include <s32mem.h>
       
    28 #include <e32base.h>  // CleanupResetAndDestroyPushL dependencies
       
    29 #include "OmaCrypto.h"
       
    30 #include "RoapStorageClient.h"
       
    31 #include "DRMRIContext.h"
       
    32 #include "DRMDomainContext.h"
       
    33 #include "drmroapclientserver.h"
       
    34 #include "drmrightsclient.h"
       
    35 #include "cleanupresetanddestroy.h" // CleanupResetAndDestroyPushL
       
    36 // LOCAL CONSTANTS AND MACROS
       
    37 
       
    38 LOCAL_C const TInt KMaxMessageSlots = 4;
       
    39 const TInt KMaxElementLength = 327680;
       
    40 
       
    41 // ============================= LOCAL FUNCTIONS ===============================
       
    42 
       
    43 // -----------------------------------------------------------------------------
       
    44 // ArrayToBuffer
       
    45 // Created buffer will contain <amount of elements:int32, data1, data2 ...>
       
    46 // -----------------------------------------------------------------------------
       
    47 //
       
    48 LOCAL_C HBufC8* ArrayToBufferLC( const RPointerArray<HBufC8>& aArray )
       
    49     {
       
    50     HBufC8* buffer = NULL;
       
    51     TInt32 sizeOfElements = 0;
       
    52 
       
    53     for ( TInt i = 0; i < aArray.Count(); i++ )
       
    54         {
       
    55         // sizeof(TInt) is for element length info
       
    56         sizeOfElements += aArray[i]->Length() + sizeof(TInt);
       
    57         }
       
    58 
       
    59     // length of elements + amount of elements
       
    60     sizeOfElements += sizeof(TInt32);
       
    61 
       
    62     buffer = HBufC8::NewMaxLC( sizeOfElements );
       
    63 
       
    64     RMemWriteStream stream( (TAny*)( buffer->Ptr() ), sizeOfElements );
       
    65     CleanupClosePushL( stream );
       
    66 
       
    67     stream.WriteInt32L( aArray.Count() );
       
    68 
       
    69     for ( TInt i = 0; i < aArray.Count(); i++ )
       
    70         {
       
    71         stream << *aArray[i];
       
    72         }
       
    73 
       
    74     CleanupStack::PopAndDestroy( &stream );
       
    75 
       
    76     return buffer;
       
    77     }
       
    78 
       
    79 // -----------------------------------------------------------------------------
       
    80 // BufferToArrayL
       
    81 // Created buffer will contain <amount of elements:int32, element data1, element data2...>
       
    82 // -----------------------------------------------------------------------------
       
    83 //
       
    84 LOCAL_C RPointerArray<HBufC8> BufferToArrayL( TDesC8& aBuffer )
       
    85     {
       
    86     TInt32 count = 0;
       
    87     HBufC8* element = NULL;
       
    88     RPointerArray<HBufC8> array;
       
    89     TInt size = aBuffer.Size();
       
    90     RMemReadStream stream( (TAny*)( aBuffer.Ptr() ), size );
       
    91     CleanupClosePushL( stream );
       
    92 
       
    93     CleanupResetAndDestroyPushL( array );
       
    94 
       
    95     // amount of elements
       
    96     count = stream.ReadInt32L();
       
    97 
       
    98     // for each in RPointerArray
       
    99     for ( TInt i = 0; i < count; i++ )
       
   100         {
       
   101         // Read the element and append it to array
       
   102         element = HBufC8::NewLC( stream, KMaxElementLength );
       
   103         array.AppendL( element );
       
   104         CleanupStack::Pop( element );
       
   105         }
       
   106 
       
   107     CleanupStack::Pop( &array );
       
   108     CleanupStack::PopAndDestroy( &stream );
       
   109 
       
   110     return array;
       
   111     }
       
   112 
       
   113 // ============================ MEMBER FUNCTIONS ===============================
       
   114 
       
   115 // -----------------------------------------------------------------------------
       
   116 // RoapStorageClient::RoapStorageClient
       
   117 // C++ default constructor can NOT contain any code, that
       
   118 // might leave.
       
   119 // -----------------------------------------------------------------------------
       
   120 //
       
   121 EXPORT_C Roap::RRoapStorageClient::RRoapStorageClient()
       
   122     {
       
   123     }
       
   124 
       
   125 // -----------------------------------------------------------------------------
       
   126 // RRoapStorageClient::~RRoapStorageClient()
       
   127 // -----------------------------------------------------------------------------
       
   128 //
       
   129 EXPORT_C Roap::RRoapStorageClient::~RRoapStorageClient()
       
   130     {
       
   131     }
       
   132 
       
   133 // -----------------------------------------------------------------------------
       
   134 // RoapStorageClient::Connect
       
   135 // (other items were commented in a header).
       
   136 // -----------------------------------------------------------------------------
       
   137 //
       
   138 EXPORT_C TInt Roap::RRoapStorageClient::Connect()
       
   139     {
       
   140     TInt ret( KErrNone );
       
   141 
       
   142     const TVersion requiredVersion( Roap::KServerMajorVersion,
       
   143         Roap::KServerMinorVersion, Roap::KServerBuildVersion );
       
   144 
       
   145     RDRMRightsClient::StartServer();
       
   146 
       
   147     ret = CreateSession( KServerName, requiredVersion, KMaxMessageSlots );
       
   148     return ret;
       
   149     }
       
   150 
       
   151 // -----------------------------------------------------------------------------
       
   152 // RoapStorageClient::GetDevicePublicKeyL
       
   153 // -----------------------------------------------------------------------------
       
   154 //
       
   155 EXPORT_C TInt Roap::RRoapStorageClient::GetDevicePublicKeyL(
       
   156     CRSAPublicKey*& aPublicKey )
       
   157     {
       
   158     HBufC8* publicKeyDer( NULL );
       
   159     CX509SubjectPublicKeyInfo* publicKeyInfo( NULL );
       
   160     TX509KeyFactory factory;
       
   161 
       
   162     GetDevicePublicKeyDerL( publicKeyDer );
       
   163     CleanupStack::PushL( publicKeyDer );
       
   164     publicKeyInfo = CX509SubjectPublicKeyInfo::NewLC( *publicKeyDer );
       
   165     aPublicKey = factory.RSAPublicKeyL( publicKeyInfo->KeyData() );
       
   166 
       
   167     CleanupStack::PopAndDestroy( publicKeyInfo );
       
   168     CleanupStack::PopAndDestroy( publicKeyDer );
       
   169     return KErrNone;
       
   170     }
       
   171 
       
   172 // -----------------------------------------------------------------------------
       
   173 // RoapStorageClient::GetDevicePublicKeyDerL
       
   174 // -----------------------------------------------------------------------------
       
   175 //
       
   176 EXPORT_C TInt Roap::RRoapStorageClient::GetDevicePublicKeyDerL(
       
   177     HBufC8*& aPublicKey )
       
   178     {
       
   179     TInt size = 0;
       
   180     TInt error = KErrNone;
       
   181     TPckg<TInt> package( size );
       
   182 
       
   183     error = SendReceive( Roap::EGetPublicKey, TIpcArgs( &package ) );
       
   184 
       
   185     User::LeaveIfError( error );
       
   186 
       
   187     HBufC8* publicKey( HBufC8::NewMaxLC( size ) );
       
   188     TPtr8 objectPkg( const_cast<TUint8*> ( publicKey->Ptr() ), size, size );
       
   189 
       
   190     User::LeaveIfError( SendReceive( Roap::EGetData, TIpcArgs( &objectPkg ) ) );
       
   191 
       
   192     CleanupStack::Pop( publicKey );
       
   193     aPublicKey = publicKey;
       
   194     return KErrNone;
       
   195     }
       
   196 
       
   197 // -----------------------------------------------------------------------------
       
   198 // RoapStorageClient::GetDevicePublicKeyHashL
       
   199 // -----------------------------------------------------------------------------
       
   200 //
       
   201 EXPORT_C TInt Roap::RRoapStorageClient::GetDevicePublicKeyHashL( TDes8& aHash )
       
   202     {
       
   203     CSHA1* hash = NULL;
       
   204     HBufC8* key = NULL;
       
   205 
       
   206     GetDevicePublicKeyDerL( key );
       
   207     CleanupStack::PushL( key );
       
   208     hash = CSHA1::NewL();
       
   209     CleanupStack::PushL( hash );
       
   210     hash->Hash( *key );
       
   211     aHash.Copy( hash->Final() );
       
   212     CleanupStack::PopAndDestroy( hash );
       
   213     CleanupStack::PopAndDestroy( key );
       
   214     return KErrNone;
       
   215     }
       
   216 
       
   217 // -----------------------------------------------------------------------------
       
   218 // RoapStorageClient::GetDeviceCertificateChainL
       
   219 // -----------------------------------------------------------------------------
       
   220 //
       
   221 EXPORT_C TInt Roap::RRoapStorageClient::GetDeviceCertificateChainL(
       
   222     RPointerArray<HBufC8>& aCertChain )
       
   223     {
       
   224     TInt size = 0;
       
   225     TInt error = KErrNone;
       
   226     TPckg<TInt> package( size );
       
   227     HBufC8* certChainBuf = NULL;
       
   228 
       
   229     error = SendReceive( Roap::EGetCertificates, TIpcArgs( &package ) );
       
   230 
       
   231     User::LeaveIfError( error );
       
   232 
       
   233     certChainBuf = HBufC8::NewMaxLC( size );
       
   234     TPtr8 objectPkg( const_cast<TUint8*> ( certChainBuf->Ptr() ), size, size );
       
   235 
       
   236     User::LeaveIfError( SendReceive( Roap::EGetData, TIpcArgs( &objectPkg ) ) );
       
   237 
       
   238     aCertChain = BufferToArrayL( *certChainBuf );
       
   239 
       
   240     CleanupStack::PopAndDestroy( certChainBuf );
       
   241     return KErrNone;
       
   242     }
       
   243 
       
   244 // -----------------------------------------------------------------------------
       
   245 // RoapStorageClient::SignL
       
   246 // -----------------------------------------------------------------------------
       
   247 //
       
   248 EXPORT_C TInt Roap::RRoapStorageClient::SignL(
       
   249     const TDesC8& aHash,
       
   250     HBufC8*& aSignature )
       
   251     {
       
   252     TInt size = 0;
       
   253     TInt error = KErrNone;
       
   254     TPckg<TInt> package( size );
       
   255 
       
   256     if ( aHash.Length() )
       
   257         {
       
   258         error
       
   259             = SendReceive( Roap::ESignMessage, TIpcArgs( &package, &aHash ) );
       
   260 
       
   261         User::LeaveIfError( error );
       
   262 
       
   263         HBufC8* signature( HBufC8::NewMaxLC( size ) );
       
   264         TPtr8
       
   265             objectPkg( const_cast<TUint8*> ( signature->Ptr() ), size, size );
       
   266 
       
   267         User::LeaveIfError( SendReceive( Roap::EGetData,
       
   268             TIpcArgs( &objectPkg ) ) );
       
   269 
       
   270         CleanupStack::Pop( signature );
       
   271         aSignature = signature;
       
   272         return KErrNone;
       
   273         }
       
   274 
       
   275     User::Leave( KErrArgument );
       
   276     return KErrArgument;
       
   277     }
       
   278 
       
   279 // -----------------------------------------------------------------------------
       
   280 // RoapStorageClient::SignL
       
   281 // -----------------------------------------------------------------------------
       
   282 //
       
   283 EXPORT_C TInt Roap::RRoapStorageClient::RsaSignL(
       
   284     const TDesC8& aHash,
       
   285     HBufC8*& aSignature )
       
   286     {
       
   287     TInt size = 0;
       
   288     TInt error = KErrNone;
       
   289     TPckg<TInt> package( size );
       
   290 
       
   291     if ( aHash.Length() )
       
   292         {
       
   293         error = SendReceive( Roap::ERsaSign, TIpcArgs( &package, &aHash ) );
       
   294 
       
   295         User::LeaveIfError( error );
       
   296 
       
   297         HBufC8* signature( HBufC8::NewMaxLC( size ) );
       
   298         TPtr8
       
   299             objectPkg( const_cast<TUint8*> ( signature->Ptr() ), size, size );
       
   300 
       
   301         User::LeaveIfError( SendReceive( Roap::EGetData,
       
   302             TIpcArgs( &objectPkg ) ) );
       
   303 
       
   304         CleanupStack::Pop( signature );
       
   305         aSignature = signature;
       
   306         return KErrNone;
       
   307         }
       
   308 
       
   309     User::Leave( KErrArgument );
       
   310     return KErrArgument;
       
   311     }
       
   312 
       
   313 // -----------------------------------------------------------------------------
       
   314 // RoapStorageClient::VerifyL
       
   315 // -----------------------------------------------------------------------------
       
   316 //
       
   317 EXPORT_C TBool Roap::RRoapStorageClient::VerifyL(
       
   318     const TDesC8& aSignature,
       
   319     const TDesC8& aHash,
       
   320     const RPointerArray<HBufC8>& aCertificateChain )
       
   321     {
       
   322     CRSAPublicKey* publicKey( NULL );
       
   323     TBool r( ETrue );
       
   324     CX509Certificate* cert( NULL );
       
   325     TX509KeyFactory factory;
       
   326 
       
   327     if ( aCertificateChain.Count() <= 0 )
       
   328         {
       
   329         User::Leave( KErrArgument );
       
   330         }
       
   331     cert = CX509Certificate::NewLC( *aCertificateChain[0] );
       
   332     publicKey = factory.RSAPublicKeyL( cert->PublicKey().KeyData() );
       
   333     CleanupStack::PushL( publicKey );
       
   334     r = OmaCrypto::RsaPssVerifyHashL( publicKey, aSignature, aHash );
       
   335     CleanupStack::PopAndDestroy( publicKey );
       
   336     CleanupStack::PopAndDestroy( cert );
       
   337     return r;
       
   338     }
       
   339 
       
   340 // -----------------------------------------------------------------------------
       
   341 // RoapStorageClient::GetRIContextL
       
   342 // -----------------------------------------------------------------------------
       
   343 //
       
   344 EXPORT_C CDRMRIContext* Roap::RRoapStorageClient::GetRIContextL(
       
   345     const TDesC8& aRiID )
       
   346     {
       
   347     TInt error = KErrNone;
       
   348     CDRMRIContext* context( NULL );
       
   349 
       
   350     if ( aRiID.Length() )
       
   351         {
       
   352         TInt size = 0;
       
   353         TPckg<TInt> package( size );
       
   354 
       
   355         error
       
   356             = SendReceive( Roap::EGetRiContext, TIpcArgs( &package, &aRiID ) );
       
   357 
       
   358         if ( error == KErrNotFound )
       
   359             {
       
   360             return NULL;
       
   361             }
       
   362 
       
   363         User::LeaveIfError( error );
       
   364 
       
   365         HBufC8* contextData = HBufC8::NewMaxLC( size );
       
   366 
       
   367         // Package 'object' into TPtr8.
       
   368         TPtr8 objectPkg( const_cast<TUint8*> ( contextData->Ptr() ), size,
       
   369             size );
       
   370 
       
   371         User::LeaveIfError( SendReceive( Roap::EGetData,
       
   372             TIpcArgs( &objectPkg ) ) );
       
   373 
       
   374         context = CDRMRIContext::NewLC();
       
   375 
       
   376         context->ImportL( contextData->Des() );
       
   377 
       
   378         CleanupStack::Pop( context );
       
   379         CleanupStack::PopAndDestroy( contextData );
       
   380         }
       
   381     else
       
   382         {
       
   383         User::Leave( KErrArgument );
       
   384         }
       
   385 
       
   386     return context;
       
   387     }
       
   388 
       
   389 // -----------------------------------------------------------------------------
       
   390 // RoapStorageClient::GetDomainContextL
       
   391 // -----------------------------------------------------------------------------
       
   392 //
       
   393 EXPORT_C CDRMDomainContext* Roap::RRoapStorageClient::GetDomainContextL(
       
   394     const TDesC8& aDomainID )
       
   395     {
       
   396     TInt error = KErrNone;
       
   397     CDRMDomainContext* context( NULL );
       
   398 
       
   399     if ( aDomainID.Length() )
       
   400         {
       
   401         TInt size = 0;
       
   402         TPckg<TInt> package( size );
       
   403 
       
   404         // Call the server. Throw an exception in case of an error.
       
   405         error = SendReceive( Roap::EGetDomainContext, TIpcArgs( &package,
       
   406             &aDomainID ) );
       
   407 
       
   408         if ( error == KErrNotFound )
       
   409             {
       
   410             return NULL;
       
   411             }
       
   412 
       
   413         HBufC8* contextData = HBufC8::NewMaxLC( size );
       
   414 
       
   415         // Package 'object' into TPtr8.
       
   416         TPtr8 objectPkg( const_cast<TUint8*> ( contextData->Ptr() ), size,
       
   417             size );
       
   418 
       
   419         User::LeaveIfError( SendReceive( Roap::EGetData,
       
   420             TIpcArgs( &objectPkg ) ) );
       
   421 
       
   422         context = CDRMDomainContext::NewLC();
       
   423 
       
   424         context->ImportL( contextData->Des() );
       
   425 
       
   426         CleanupStack::Pop( context );
       
   427         CleanupStack::PopAndDestroy( contextData );
       
   428 
       
   429         return context;
       
   430         }
       
   431 
       
   432     User::Leave( KErrArgument );
       
   433 
       
   434     return NULL;
       
   435     }
       
   436 
       
   437 // -----------------------------------------------------------------------------
       
   438 // RRoapStorageClient::AddRIContextL
       
   439 // Add a new RI Context to the ROAP storage
       
   440 // -----------------------------------------------------------------------------
       
   441 //
       
   442 EXPORT_C void Roap::RRoapStorageClient::AddRIContextL(
       
   443     const CDRMRIContext& aRiContext )
       
   444     {
       
   445     HBufC8* contextData = aRiContext.ExportL();
       
   446     TInt size = aRiContext.Size();
       
   447     TPtr8 riContext( NULL, 0 );
       
   448     if ( size )
       
   449         {
       
   450         riContext.Set( const_cast<TUint8*> ( contextData->Ptr() ), size, size );
       
   451 
       
   452         User::LeaveIfError( SendReceive( Roap::EAddRiContext, TIpcArgs(
       
   453             &riContext ) ) );
       
   454         }
       
   455     delete contextData;
       
   456     contextData = NULL;
       
   457     }
       
   458 
       
   459 // -----------------------------------------------------------------------------
       
   460 // RRoapStorageClient::AddDomainContextL
       
   461 // Add a new Domain Context to the ROAP storage
       
   462 // -----------------------------------------------------------------------------
       
   463 //
       
   464 EXPORT_C void Roap::RRoapStorageClient::AddDomainContextL(
       
   465     const CDRMDomainContext& aDomainContext,
       
   466     const RPointerArray<HBufC8>& aMacs,
       
   467     const RPointerArray<HBufC8>& aDomainKeyElements,
       
   468     TKeyTransportScheme& aTransportScheme )
       
   469     {
       
   470     TPckg<TKeyTransportScheme> package( aTransportScheme );
       
   471     HBufC8* contextData = aDomainContext.ExportL();
       
   472     CleanupStack::PushL( contextData );
       
   473     TInt size = aDomainContext.Size();
       
   474     TPtr8 contextPtr( NULL, 0 );
       
   475     TPtr8 domainXmltPtr( 0, 0 );
       
   476     TPtr8 macValuesPtr( 0, 0 );
       
   477     HBufC8* domainXml = NULL;
       
   478     HBufC8* macValues = NULL;
       
   479 
       
   480     domainXml = ArrayToBufferLC( aDomainKeyElements );
       
   481     macValues = ArrayToBufferLC( aMacs );
       
   482 
       
   483     if ( size && domainXml && macValues )
       
   484         {
       
   485         contextPtr.Set( const_cast<TUint8*> ( contextData->Ptr() ), size,
       
   486             size );
       
   487         domainXmltPtr.Set( domainXml->Des() );
       
   488         macValuesPtr.Set( macValues->Des() );
       
   489 
       
   490         User::LeaveIfError( SendReceive( Roap::EAddDomainContext, TIpcArgs(
       
   491             &contextPtr, &package, &macValuesPtr, &domainXmltPtr ) ) );
       
   492         }
       
   493     else
       
   494         {
       
   495         User::Leave( KErrArgument );
       
   496         }
       
   497     CleanupStack::PopAndDestroy( macValues );
       
   498     CleanupStack::PopAndDestroy( domainXml );
       
   499     CleanupStack::PopAndDestroy( contextData );
       
   500     }
       
   501 
       
   502 // -----------------------------------------------------------------------------
       
   503 // RRoapStorageClient::DeleteRiContextL
       
   504 // -----------------------------------------------------------------------------
       
   505 //
       
   506 EXPORT_C void Roap::RRoapStorageClient::DeleteRiContextL( const TDesC8& aRiID )
       
   507     {
       
   508     if ( aRiID.Length() )
       
   509         {
       
   510         User::LeaveIfError( SendReceive( Roap::EDeleteRiContext, TIpcArgs(
       
   511             &aRiID ) ) );
       
   512         return;
       
   513         }
       
   514     User::Leave( KErrArgument );
       
   515     }
       
   516 
       
   517 // -----------------------------------------------------------------------------
       
   518 // RRoapStorageClient::DeleteDomainContextL
       
   519 // -----------------------------------------------------------------------------
       
   520 //
       
   521 EXPORT_C void Roap::RRoapStorageClient::DeleteDomainContextL(
       
   522     const TDesC8& aDomainID )
       
   523     {
       
   524     if ( aDomainID.Length() )
       
   525         {
       
   526         User::LeaveIfError( SendReceive( Roap::EDeleteDomainContext,
       
   527             TIpcArgs( &aDomainID ) ) );
       
   528         return;
       
   529         }
       
   530     User::Leave( KErrArgument );
       
   531     }
       
   532 
       
   533 // -----------------------------------------------------------------------------
       
   534 // RRoapStorageClient::DeleteExpiredRIsL
       
   535 // -----------------------------------------------------------------------------
       
   536 //
       
   537 EXPORT_C void Roap::RRoapStorageClient::DeleteExpiredRIsL( const TTime& aTime )
       
   538     {
       
   539     TPckg<TTime> package( aTime );
       
   540 
       
   541     User::LeaveIfError( SendReceive( Roap::EDeleteExpiredRIs, TIpcArgs(
       
   542         &package ) ) );
       
   543     }
       
   544 
       
   545 // -----------------------------------------------------------------------------
       
   546 // RRoapStorageClient::DeleteExpiredDomainsL
       
   547 // -----------------------------------------------------------------------------
       
   548 //
       
   549 EXPORT_C void Roap::RRoapStorageClient::DeleteExpiredDomainsL(
       
   550     const TTime& aTime )
       
   551     {
       
   552     TPckg<TTime> package( aTime );
       
   553 
       
   554     User::LeaveIfError( SendReceive( Roap::EDeleteExpiredDomains, TIpcArgs(
       
   555         &package ) ) );
       
   556     }
       
   557 
       
   558 // -----------------------------------------------------------------------------
       
   559 // RRoapStorageClient::DeleteExpiredContextsL
       
   560 // -----------------------------------------------------------------------------
       
   561 //
       
   562 EXPORT_C void Roap::RRoapStorageClient::DeleteExpiredContextsL(
       
   563     const TTime& aTime )
       
   564     {
       
   565     TPckg<TTime> package( aTime );
       
   566 
       
   567     User::LeaveIfError( SendReceive( Roap::EDeleteExpired,
       
   568         TIpcArgs( &package ) ) );
       
   569     }
       
   570 
       
   571 // -----------------------------------------------------------------------------
       
   572 // RRoapStorageClient::DeleteAllL
       
   573 // -----------------------------------------------------------------------------
       
   574 //
       
   575 EXPORT_C void Roap::RRoapStorageClient::DeleteAllL()
       
   576     {
       
   577     User::LeaveIfError( SendReceive( Roap::EDeleteAll ) );
       
   578     }
       
   579 
       
   580 // -----------------------------------------------------------------------------
       
   581 // RRoapStorageClient::WhiteListURLExistsL
       
   582 // -----------------------------------------------------------------------------
       
   583 //
       
   584 EXPORT_C TBool Roap::RRoapStorageClient::WhiteListURLExistsL(
       
   585     const TDesC8& aURL, TBool& aFromPreconfiguredWhiteList )
       
   586     {
       
   587     TInt r = KErrArgument;
       
   588 
       
   589     TPckg<TBool> preConfiguredInOutParam( aFromPreconfiguredWhiteList );
       
   590     if ( aURL.Length() )
       
   591         {
       
   592         // Call the server.
       
   593         r = SendReceive( Roap::EWhiteListCheck, TIpcArgs( &aURL,
       
   594             &preConfiguredInOutParam ) );
       
   595         if ( r == KErrNone )
       
   596             {
       
   597             return ETrue;
       
   598             }
       
   599         else if ( r == KErrNotFound )
       
   600             {
       
   601             return EFalse;
       
   602             }
       
   603         }
       
   604     User::LeaveIfError( r );
       
   605     return EFalse;
       
   606     }
       
   607 
       
   608 // -----------------------------------------------------------------------------
       
   609 // RRoapStorageClient::SelectTrustedRootL()
       
   610 // -----------------------------------------------------------------------------
       
   611 //
       
   612 EXPORT_C TInt Roap::RRoapStorageClient::SelectTrustedRootL(
       
   613     const RPointerArray<HBufC8>& aTrustedRoots,
       
   614     TDes8& aSelectedRoot ) const
       
   615     {
       
   616     TInt ret = KErrNone;
       
   617 
       
   618     if ( aTrustedRoots.Count() )
       
   619         {
       
   620         HBufC8* rootsBuf = NULL;
       
   621         rootsBuf = ArrayToBufferLC( aTrustedRoots );
       
   622 
       
   623         ret = SendReceive( Roap::ESelectRoot, TIpcArgs( rootsBuf,
       
   624             &aSelectedRoot ) );
       
   625 
       
   626         CleanupStack::PopAndDestroy( rootsBuf );
       
   627         return ret;
       
   628         }
       
   629 
       
   630     return KErrArgument;
       
   631     }
       
   632 
       
   633 // -----------------------------------------------------------------------------
       
   634 // RRoapStorageClient::SelectTrustedRootL()
       
   635 // -----------------------------------------------------------------------------
       
   636 //
       
   637 EXPORT_C TInt Roap::RRoapStorageClient::SelectTrustedRootL(
       
   638     const TDesC8& aTrustedRoot ) const
       
   639     {
       
   640     TInt ret = KErrNone;
       
   641 
       
   642     if ( aTrustedRoot.Length() > SHA1_HASH )
       
   643         {
       
   644         User::Leave( KErrArgument );
       
   645         }
       
   646 
       
   647     ret = SendReceive( Roap::EActivateRoot, TIpcArgs( &aTrustedRoot ) );
       
   648     return ret;
       
   649     }
       
   650 
       
   651 // -----------------------------------------------------------------------------
       
   652 // RRoapStorageClient::GetTrustedRootsL()
       
   653 // -----------------------------------------------------------------------------
       
   654 //
       
   655 EXPORT_C void Roap::RRoapStorageClient::GetTrustedRootsL(
       
   656     RPointerArray<HBufC8>& aTrustedRoots ) const
       
   657     {
       
   658     TInt size = 0;
       
   659     TPckg<TInt> package( size );
       
   660 
       
   661     User::LeaveIfError( SendReceive( Roap::EGetTrustedRoots, TIpcArgs(
       
   662         &package ) ) );
       
   663 
       
   664     HBufC8* rootsData = HBufC8::NewMaxLC( size );
       
   665 
       
   666     // Package 'object' into TPtr8.
       
   667     TPtr8 objectPkg( const_cast<TUint8*> ( rootsData->Ptr() ), size, size );
       
   668 
       
   669     User::LeaveIfError( SendReceive( Roap::EGetData, TIpcArgs( &objectPkg ) ) );
       
   670 
       
   671     aTrustedRoots = BufferToArrayL( *rootsData );
       
   672 
       
   673     CleanupStack::PopAndDestroy( rootsData );
       
   674     }
       
   675 
       
   676 // -----------------------------------------------------------------------------
       
   677 // RRoapStorageClient::GetTrustedRootL()
       
   678 // -----------------------------------------------------------------------------
       
   679 //
       
   680 EXPORT_C HBufC8* Roap::RRoapStorageClient::GetRootCertificateL(
       
   681     const TDesC& aSubject ) const
       
   682     {
       
   683     TInt error = KErrNone;
       
   684     HBufC8* rootCert = NULL;
       
   685 
       
   686     if ( aSubject.Length() )
       
   687         {
       
   688         TInt size = 0;
       
   689         TPckg<TInt> package( size );
       
   690 
       
   691         error = SendReceive( Roap::EGetRootCert, TIpcArgs( &package,
       
   692             &aSubject ) );
       
   693 
       
   694         if ( error == KErrNotFound )
       
   695             {
       
   696             return NULL;
       
   697             }
       
   698 
       
   699         User::LeaveIfError( error );
       
   700 
       
   701         rootCert = HBufC8::NewMaxLC( size );
       
   702 
       
   703         // Package 'object' into TPtr8.
       
   704         TPtr8 objectPkg( const_cast<TUint8*> ( rootCert->Ptr() ), size, size );
       
   705 
       
   706         User::LeaveIfError( SendReceive( Roap::EGetData,
       
   707             TIpcArgs( &objectPkg ) ) );
       
   708 
       
   709         CleanupStack::Pop( rootCert );
       
   710         return rootCert;
       
   711         }
       
   712 
       
   713     User::Leave( KErrArgument );
       
   714 
       
   715     return NULL;
       
   716     }
       
   717 
       
   718 // -----------------------------------------------------------------------------
       
   719 // RRoapStorageClient::GetMeteringData()
       
   720 // -----------------------------------------------------------------------------
       
   721 //
       
   722 #ifndef RD_DRM_METERING
       
   723 EXPORT_C HBufC8* Roap::RRoapStorageClient::GetMeteringDataL(
       
   724     TDesC8& /*aRiId*/,
       
   725     TDes8& /*aMacKey*/,
       
   726     TDes8& /*aEncKeyHash*/,
       
   727     HBufC8*& /*aEncryptedMekAndMak*/ )
       
   728     {
       
   729     return NULL;
       
   730     }
       
   731 #else
       
   732 EXPORT_C HBufC8* Roap::RRoapStorageClient::GetMeteringDataL(
       
   733     TDesC8& aRiId,
       
   734     TDes8& aMacKey,
       
   735     TDes8& aEncKeyHash,
       
   736     HBufC8*& aEncryptedMekAndMak )
       
   737     {
       
   738     TInt error = KErrNone;
       
   739     HBufC8* meteringData = NULL;
       
   740     HBufC8* csBuffer = NULL;
       
   741 
       
   742     if ( aRiId.Length() )
       
   743         {
       
   744         TInt mekAndMakSize = 0;
       
   745         TInt meteringDataSize = 0;
       
   746         TPckg<TInt> MakMek( mekAndMakSize );
       
   747         TPckg<TInt> dataSize( meteringDataSize );
       
   748 
       
   749         error = SendReceive( Roap::EGetMeteringData, TIpcArgs( &aRiId,
       
   750             &MakMek, &dataSize ) );
       
   751 
       
   752         if ( error == KErrNotFound )
       
   753             {
       
   754             return NULL;
       
   755             }
       
   756 
       
   757         User::LeaveIfError( error );
       
   758 
       
   759         csBuffer = HBufC8::NewMaxLC( OmaCrypto::KMacSize + SHA1_HASH
       
   760             + mekAndMakSize + meteringDataSize );
       
   761 
       
   762         // Package 'object' into TPtr8.
       
   763         TPtr8 objectPkg( const_cast<TUint8*> ( csBuffer->Ptr() ),
       
   764             OmaCrypto::KMacSize + SHA1_HASH + mekAndMakSize
       
   765                 + meteringDataSize, OmaCrypto::KMacSize + SHA1_HASH
       
   766                 + mekAndMakSize + meteringDataSize );
       
   767 
       
   768         User::LeaveIfError( SendReceive( Roap::EGetData,
       
   769             TIpcArgs( &objectPkg ) ) );
       
   770 
       
   771         aMacKey = objectPkg.Mid( 0, OmaCrypto::KMacSize );
       
   772         aEncKeyHash = objectPkg.Mid( OmaCrypto::KMacSize, SHA1_HASH );
       
   773         aEncryptedMekAndMak = objectPkg.Mid( OmaCrypto::KMacSize + SHA1_HASH,
       
   774             mekAndMakSize ).AllocL();
       
   775         meteringData = objectPkg.Mid( OmaCrypto::KMacSize + SHA1_HASH
       
   776             + mekAndMakSize, meteringDataSize ).AllocL();
       
   777         CleanupStack::PopAndDestroy( csBuffer );
       
   778         }
       
   779     else
       
   780         {
       
   781         User::Leave( KErrArgument );
       
   782         }
       
   783     return meteringData;
       
   784     }
       
   785 #endif //RD_DRM_METERING
       
   786 // -----------------------------------------------------------------------------
       
   787 // RRoapStorageClient::DeleteMeteringDataL
       
   788 // -----------------------------------------------------------------------------
       
   789 //
       
   790 #ifndef RD_DRM_METERING
       
   791 EXPORT_C void Roap::RRoapStorageClient::DeleteMeteringDataL(
       
   792     const TDesC8& /*aRiId*/)
       
   793     {
       
   794     return;
       
   795     }
       
   796 #else
       
   797 EXPORT_C void Roap::RRoapStorageClient::DeleteMeteringDataL(
       
   798     const TDesC8& aRiId )
       
   799     {
       
   800     if ( aRiId.Length() )
       
   801         {
       
   802         User::LeaveIfError( SendReceive( Roap::EDeleteMeteringData, TIpcArgs(
       
   803             &aRiId ) ) );
       
   804         }
       
   805     else
       
   806         {
       
   807         User::Leave( KErrArgument );
       
   808         }
       
   809     return;
       
   810     }
       
   811 #endif //RD_DRM_METERING
       
   812 // -----------------------------------------------------------------------------
       
   813 // RRoapStorageClient::GetAllRIContextsL
       
   814 // -----------------------------------------------------------------------------
       
   815 //
       
   816 #ifndef RD_DRM_METERING
       
   817 EXPORT_C void Roap::RRoapStorageClient::GetAllRIContextsL(
       
   818     RPointerArray<Roap::CDRMRIContext>& /*aRiContexts*/)
       
   819     {
       
   820     }
       
   821 #else
       
   822 EXPORT_C void Roap::RRoapStorageClient::GetAllRIContextsL(
       
   823     RPointerArray<CDRMRIContext>& aRiContexts )
       
   824     {
       
   825     TInt error = KErrNone;
       
   826     CDRMRIContext* context = NULL;
       
   827 
       
   828     // Clear whatever is in the list.
       
   829     aRiContexts.ResetAndDestroy();
       
   830 
       
   831     TInt size = 0;
       
   832     TInt blocksize = 0;
       
   833 
       
   834     TPckg<TInt> package( size );
       
   835 
       
   836     error = SendReceive( Roap::ERetrieveAllRIContexts, TIpcArgs( &package ) );
       
   837 
       
   838     // None are found is not an error, but just an empty list.
       
   839     if ( error == KErrNotFound )
       
   840         {
       
   841         return;
       
   842         }
       
   843 
       
   844     // otherwise it is an error.
       
   845     User::LeaveIfError( error );
       
   846 
       
   847     // Get the data block received.
       
   848 
       
   849 
       
   850     HBufC8* contextData = HBufC8::NewMaxLC( size );
       
   851 
       
   852     // Package 'object' into TPtr8.
       
   853     TPtr8 objectPkg( const_cast<TUint8*> ( contextData->Ptr() ), size, size );
       
   854 
       
   855     User::LeaveIfError( SendReceive( Roap::EGetData, TIpcArgs( &objectPkg ) ) );
       
   856 
       
   857     RMemReadStream stream( (TAny*)( objectPkg.Ptr() ), size );
       
   858     CleanupClosePushL( stream );
       
   859 
       
   860     // We have the data, parse it and fill the aRiContexts:
       
   861 
       
   862     blocksize = stream.ReadInt32L();
       
   863 
       
   864     while ( blocksize )
       
   865         {
       
   866         // Create a new context:
       
   867         context = CDRMRIContext::NewLC();
       
   868 
       
   869         // import it from the data block
       
   870         context->InternalizeL( stream );
       
   871 
       
   872         // add it to the pointer array
       
   873         aRiContexts.AppendL( context );
       
   874 
       
   875         // pop it from the cleanup stack
       
   876         CleanupStack::Pop( context ); // context
       
   877 
       
   878 
       
   879         // read the new block size and increment the offset:
       
   880         blocksize = stream.ReadInt32L();
       
   881         }
       
   882 
       
   883     CleanupStack::PopAndDestroy( &stream );
       
   884     CleanupStack::PopAndDestroy( contextData );
       
   885     return;
       
   886     }
       
   887 
       
   888 #endif // RD_DRM_METERING
       
   889 // -----------------------------------------------------------------------------
       
   890 // RRoapStorageClient::UpdateRiContextL
       
   891 // -----------------------------------------------------------------------------
       
   892 //
       
   893 #ifndef RD_DRM_METERING
       
   894 EXPORT_C void Roap::RRoapStorageClient::UpdateRIContextL(
       
   895     const Roap::CDRMRIContext& /*aContext*/)
       
   896     {
       
   897     }
       
   898 #else
       
   899 EXPORT_C void Roap::RRoapStorageClient::UpdateRIContextL(
       
   900     const CDRMRIContext& aContext )
       
   901     {
       
   902     HBufC8* contextData = aContext.ExportL();
       
   903     CleanupStack::PushL( contextData );
       
   904     TInt size = aContext.Size();
       
   905     TPtr8 riContext( NULL, 0 );
       
   906     if ( size )
       
   907         {
       
   908         riContext.Set( const_cast<TUint8*> ( contextData->Ptr() ), size, size );
       
   909 
       
   910         User::LeaveIfError( SendReceive( Roap::EUpdateRIContext, TIpcArgs(
       
   911             &riContext ) ) );
       
   912         }
       
   913     CleanupStack::PopAndDestroy( contextData );
       
   914     }
       
   915 #endif // RD_DRM_METERING
       
   916 
       
   917 // -----------------------------------------------------------------------------
       
   918 // RRoapStorageClient::UpdateDrmTimeL
       
   919 // -----------------------------------------------------------------------------
       
   920 //
       
   921 EXPORT_C TBool Roap::RRoapStorageClient::UpdateDrmTimeL(
       
   922     const RPointerArray<HBufC8>& aCertChain,
       
   923     const RPointerArray<HBufC8>& aOcspResponses,
       
   924     const TDesC8& aNonce )
       
   925     {
       
   926     TBool clockUpdated( EFalse );
       
   927     TPckg<TBool> retParam( clockUpdated );
       
   928     HBufC8* certChain( ArrayToBufferLC( aCertChain ) );
       
   929     HBufC8* ocspResponses( ArrayToBufferLC( aOcspResponses ) );
       
   930     TPtrC8 nonceParam( aNonce );
       
   931     User::LeaveIfError( SendReceive( Roap::EUpdateDrmTime, TIpcArgs(
       
   932         certChain, ocspResponses, &nonceParam, &retParam ) ) );
       
   933     CleanupStack::PopAndDestroy( ocspResponses );
       
   934     CleanupStack::PopAndDestroy( certChain );
       
   935     return clockUpdated;
       
   936     }
       
   937 
       
   938 // -----------------------------------------------------------------------------
       
   939 // RRoapStorageClient::VerifyOcspResponsesL
       
   940 // -----------------------------------------------------------------------------
       
   941 //
       
   942 EXPORT_C TBool Roap::RRoapStorageClient::VerifyOcspResponsesL(
       
   943     const RPointerArray<HBufC8>& aOcspResponses,
       
   944     const TDesC8& aRiCaCert,
       
   945     const RPointerArray<HBufC8>& aCertSerialNums )
       
   946     {
       
   947     TBool ret( EFalse );
       
   948     HBufC8* ocspData( ArrayToBufferLC( aOcspResponses ) );
       
   949     HBufC8* serialNumsData( ArrayToBufferLC( aCertSerialNums ) );
       
   950 
       
   951     TPtrC8 riCaCertParam( aRiCaCert );
       
   952     TPckg<TBool> retParam( ret );
       
   953 
       
   954     User::LeaveIfError( SendReceive( Roap::EVerifyOcspResponses, TIpcArgs(
       
   955         ocspData, &riCaCertParam, serialNumsData, &retParam ) ) );
       
   956 
       
   957     CleanupStack::PopAndDestroy( serialNumsData );
       
   958     CleanupStack::PopAndDestroy( ocspData );
       
   959     return ret;
       
   960     }
       
   961 
       
   962 // -----------------------------------------------------------------------------
       
   963 // RRoapStorageClient::GetOcspResponderIdL
       
   964 // -----------------------------------------------------------------------------
       
   965 //
       
   966 EXPORT_C HBufC8* Roap::RRoapStorageClient::GetOcspResponderIdL(
       
   967     const TDesC8& aRiID )
       
   968     {
       
   969     TPtrC8 riIdParam( aRiID );
       
   970     TInt size( 0 );
       
   971     TPckg<TInt> sizeParam( size );
       
   972 
       
   973     User::LeaveIfError( SendReceive( Roap::EGetOcspResponderId, TIpcArgs(
       
   974         &riIdParam, &sizeParam ) ) );
       
   975 
       
   976     if ( size == 0 )
       
   977         {
       
   978         return NULL;
       
   979         }
       
   980     HBufC8* responderData = HBufC8::NewMaxLC( size );
       
   981 
       
   982     // Package 'object' into TPtr8.
       
   983     TPtr8 objectPkg( responderData->Des() );
       
   984 
       
   985     User::LeaveIfError( SendReceive( Roap::EGetData, TIpcArgs( &objectPkg ) ) );
       
   986 
       
   987     CleanupStack::Pop( responderData );
       
   988     return responderData;
       
   989     }
       
   990 //  End of File