omadrm/drmengine/roapstorage/src/RoapStorageClientStub.cpp
changeset 0 95b198f216e5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/omadrm/drmengine/roapstorage/src/RoapStorageClientStub.cpp	Thu Dec 17 08:52:27 2009 +0200
@@ -0,0 +1,489 @@
+/*
+* Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  ?Description
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32std.h>
+#include <f32file.h>
+#include <s32file.h>
+#include <x509cert.h>
+#include <x509keys.h>
+#include <asn1dec.h>
+#include <hash.h>
+
+#ifdef RD_MULTIPLE_DRIVE
+#include <DriveInfo.h>
+#endif
+
+#include "OmaCrypto.h"
+#include "RoapStorageClient.h"
+
+using namespace Roap;
+
+// EXTERNAL DATA STRUCTURES
+//extern  ?external_data;
+
+// EXTERNAL FUNCTION PROTOTYPES  
+//extern ?external_function( ?arg_type,?arg_type );
+
+// CONSTANTS
+//const ?type ?constant_var = ?constant;
+
+// MACROS
+//#define ?macro ?macro_def
+
+// LOCAL CONSTANTS AND MACROS
+//const ?type ?constant_var = ?constant;
+//#define ?macro_name ?macro_def
+
+#ifdef RD_MULTIPLE_DRIVE
+_LIT(KCertChainDir, "%c:\\drm\\PKI\\");
+_LIT(KSigningCertPrefix, "SigningCert");
+_LIT(KDeviceCertFileName, "%c:\\drm\\PKI\\DeviceCert.der");
+_LIT(KDevicePrivateKeyFileName, "%c:\\drm\\PKI\\DevicePrivateKey.der");
+#else
+_LIT(KCertChainDir, "c:\\drm\\PKI\\");
+_LIT(KSigningCertPrefix, "SigningCert");
+_LIT(KDeviceCertFileName, "c:\\drm\\PKI\\DeviceCert.der");
+_LIT(KDevicePrivateKeyFileName, "c:\\drm\\PKI\\DevicePrivateKey.der");
+#endif
+
+
+// MODULE DATA STRUCTURES
+//enum ?declaration
+//typedef ?declaration
+
+// LOCAL FUNCTION PROTOTYPES
+LOCAL_C void ReadFileL(
+    HBufC8*& aContent,
+    const TDesC& aName);
+
+// FORWARD DECLARATIONS
+//class ?FORWARD_CLASSNAME;
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// ?function_name ?description.
+// ?description
+// Returns: ?value_1: ?description
+//          ?value_n: ?description_line1
+//                    ?description_line2
+// -----------------------------------------------------------------------------
+//
+LOCAL_C void ReadFileL(
+    HBufC8*& aContent,
+    const TDesC& aName)
+	{	
+	TInt size = 0;
+	RFile file;
+	RFs fs;
+
+    User::LeaveIfError(fs.Connect());
+    CleanupClosePushL(fs);
+	User::LeaveIfError(file.Open(fs, aName, EFileRead));
+    CleanupClosePushL(file);
+    User::LeaveIfError(file.Size(size));
+    aContent = HBufC8::NewLC(size);
+    TPtr8 ptr(aContent->Des());
+    User::LeaveIfError(file.Read(ptr, size));
+	CleanupStack::Pop(); //aContent
+	CleanupStack::PopAndDestroy(2); // file, fs
+	}
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// RoapStorageClient::RoapStorageClient
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+RRoapStorageClient::RRoapStorageClient()
+    {
+    }
+
+// Destructor
+RRoapStorageClient::~RRoapStorageClient()
+    {
+    
+    }
+
+// -----------------------------------------------------------------------------
+// RoapStorageClient::?member_function
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt RRoapStorageClient::Connect(void)
+    {
+    return KErrNone;
+    }
+
+TInt RRoapStorageClient::GetDeviceCertificateL(
+    HBufC8*& aCert)
+    {
+    
+#ifndef RD_MULTIPLE_DRIVE
+
+    ReadFileL(aCert, KDeviceCertFileName);
+    
+#else //RD_MULTIPLE_DRIVE
+    
+    RFs fs;
+    TInt driveNumber( -1 );
+    TChar driveLetter;
+    DriveInfo::GetDefaultDrive( DriveInfo::EDefaultSystem, driveNumber );
+	
+	User::LeaveIfError( fs.Connect() );
+	fs.DriveToChar( driveNumber, driveLetter );
+    fs.Close();
+    
+	TFileName deviceCertFileName;
+	deviceCertFileName.Format( KDeviceCertFileName, (TUint)driveLetter );
+    
+    ReadFileL(aCert, deviceCertFileName);
+    
+#endif
+    
+    return KErrNone;
+    }
+
+TInt RRoapStorageClient::GetDevicePublicKeyL(
+    CRSAPublicKey*& aPublicKey)
+    {
+    HBufC8* certData;
+    CX509Certificate* cert;
+    TX509KeyFactory factory;
+    
+#ifndef RD_MULTIPLE_DRIVE
+
+    ReadFileL(certData, KDeviceCertFileName);
+    
+#else //RD_MULTIPLE_DRIVE
+    
+    RFs fs;
+    TInt driveNumber( -1 );
+    TChar driveLetter;
+    DriveInfo::GetDefaultDrive( DriveInfo::EDefaultSystem, driveNumber );
+	
+	User::LeaveIfError( fs.Connect() );
+	fs.DriveToChar( driveNumber, driveLetter );
+    fs.Close();
+    
+	TFileName deviceCertFileName;
+	deviceCertFileName.Format( KDeviceCertFileName, (TUint)driveLetter );
+    
+    ReadFileL(certData, deviceCertFileName);
+    
+#endif
+    
+    CleanupStack::PushL(certData);
+    cert = CX509Certificate::NewLC(*certData);
+    aPublicKey = factory.RSAPublicKeyL(cert->PublicKey().KeyData());
+    CleanupStack::PopAndDestroy(2); // cert, certData
+    return KErrNone;
+    }
+    
+TInt RRoapStorageClient::GetDevicePublicKeyDerL(
+    HBufC8*& aPublicKey)
+    {
+    HBufC8* certData;
+    CX509Certificate* cert;
+    
+#ifndef RD_MULTIPLE_DRIVE
+
+    ReadFileL(certData, KDeviceCertFileName);
+    
+#else //RD_MULTIPLE_DRIVE
+    
+    RFs fs;
+    TInt driveNumber( -1 );
+    TChar driveLetter;
+    DriveInfo::GetDefaultDrive( DriveInfo::EDefaultSystem, driveNumber );
+	
+	User::LeaveIfError( fs.Connect() );
+	fs.DriveToChar( driveNumber, driveLetter );
+    fs.Close();
+    
+	TFileName deviceCertFileName;
+	deviceCertFileName.Format( KDeviceCertFileName, (TUint)driveLetter );
+    
+    ReadFileL(certData, deviceCertFileName);
+    
+#endif
+     
+    CleanupStack::PushL(certData);
+    cert = CX509Certificate::NewLC(*certData);
+    aPublicKey = cert->PublicKey().KeyData().AllocL();
+    CleanupStack::PopAndDestroy(2); // cert, certData
+    return KErrNone;
+    }
+
+TInt RRoapStorageClient::GetDevicePublicKeyHashL(
+    TDes8& aHash)
+    {
+    CSHA1* hash = NULL;
+    HBufC8* key = NULL;
+    
+    GetDevicePublicKeyDerL(key);
+    CleanupStack::PushL(key);
+    hash = CSHA1::NewL();
+    CleanupStack::PushL(hash);
+    hash->Hash(*key);
+    aHash.Copy(hash->Final());
+    CleanupStack::PopAndDestroy(2); // hash, key
+    return KErrNone;
+    }
+
+TInt RRoapStorageClient::GetDevicePrivateKeyL(
+    CRSAPrivateKey*& aKey)
+    {
+    HBufC8* raw = NULL;
+	TASN1DecInteger encInt;
+    TInt pos = 0;
+    
+#ifndef RD_MULTIPLE_DRIVE
+
+    ReadFileL(raw, KDevicePrivateKeyFileName);
+    
+#else //RD_MULTIPLE_DRIVE
+    
+    RFs fs;
+    TInt driveNumber( -1 );
+    TChar driveLetter;
+    DriveInfo::GetDefaultDrive( DriveInfo::EDefaultSystem, driveNumber );
+	
+	User::LeaveIfError( fs.Connect() );
+	fs.DriveToChar( driveNumber, driveLetter );
+    fs.Close();
+    
+	TFileName devicePrivateKeyFileName;
+	devicePrivateKeyFileName.Format( 
+	                    KDevicePrivateKeyFileName, (TUint)driveLetter );
+    
+    ReadFileL(raw, devicePrivateKeyFileName);
+    
+#endif
+    
+    CleanupStack::PushL(raw);
+
+	TASN1DecGeneric gen(*raw);
+	gen.InitL();
+	pos += gen.LengthDERHeader();
+	if (gen.Tag() != EASN1Sequence)
+        {
+		User::Leave(KErrArgument);
+        }
+
+    encInt.DecodeDERShortL(*raw, pos); // version
+	RInteger modulus = encInt.DecodeDERLongL(*raw, pos);
+    CleanupStack::PushL(modulus);
+	RInteger publicExponent = encInt.DecodeDERLongL(*raw, pos);
+    CleanupStack::PushL(publicExponent);
+	RInteger privateExponent = encInt.DecodeDERLongL(*raw, pos);
+    CleanupStack::PushL(privateExponent);
+
+	aKey = CRSAPrivateKeyStandard::NewL(modulus, privateExponent);
+
+    CleanupStack::Pop(); // privateExponent
+    CleanupStack::PopAndDestroy();// publicExponent
+    CleanupStack::Pop(); // modulus
+    CleanupStack::PopAndDestroy(); // raw
+
+    return KErrNone;
+    }
+
+TInt RRoapStorageClient::GetDeviceCertificateChainL(
+    RPointerArray<HBufC8>& aCertChain)
+    {
+    RFs fs;
+    RFile file;
+    TFileName fileName;
+    CDir* dir;
+    HBufC8* cert;
+    TInt size;
+    TPtr8 ptr(0, 0);
+    TInt itemsToPop = 0;
+    TInt i;
+    TEntry entry;
+
+    CleanupClosePushL(aCertChain);
+    User::LeaveIfError(fs.Connect());
+    CleanupClosePushL(fs);
+    
+#ifndef RD_MULTIPLE_DRIVE
+
+    User::LeaveIfError(fs.GetDir(KCertChainDir, KEntryAttMatchMask,
+        ESortByName, dir));
+    User::LeaveIfError(fs.SetSessionPath(KCertChainDir));
+    
+#else //RD_MULTIPLE_DRIVE
+    
+    TInt driveNumber( -1 );
+    TChar driveLetter;
+    DriveInfo::GetDefaultDrive( DriveInfo::EDefaultSystem, driveNumber );
+	fs.DriveToChar( driveNumber, driveLetter );
+    
+	TFileName certChainDir;
+	certChainDir.Format( KCertChainDir, (TUint)driveLetter );
+    
+    User::LeaveIfError(fs.GetDir(certChainDir, KEntryAttMatchMask,
+        ESortByName, dir));
+    User::LeaveIfError(fs.SetSessionPath(certChainDir));
+    
+#endif
+    
+    CleanupStack::PushL(dir);
+    GetDeviceCertificateL(cert);
+    CleanupStack::PushL(cert);
+    User::LeaveIfError(aCertChain.Append(cert));
+    itemsToPop++;
+    for (i = 0; i < dir->Count(); i++)
+        {
+        entry = (*dir)[i];
+        if (entry.iName.Left(KSigningCertPrefix().Length()).CompareF(
+            KSigningCertPrefix) == 0)
+            {
+            User::LeaveIfError(file.Open(fs, entry.iName, EFileRead));
+            CleanupClosePushL(file);
+            User::LeaveIfError(file.Size(size));
+            cert = HBufC8::NewMax(size);
+            ptr.Set(cert->Des());
+            CleanupStack::PushL(cert);
+            User::LeaveIfError(aCertChain.Append(cert));
+            itemsToPop++;
+            User::LeaveIfError(file.Read(ptr));
+            CleanupStack::Pop(); // cert
+            CleanupStack::PopAndDestroy(); // file
+            CleanupStack::PushL(cert);
+            }
+        }
+    CleanupStack::Pop(itemsToPop); // cert
+    CleanupStack::PopAndDestroy(2); // fs, dir
+    CleanupStack::Pop(); // aCertChain
+    return KErrNone;
+    }
+
+TInt RRoapStorageClient::SignL(
+    const TDesC8& aHash,
+    HBufC8*& aSignature)
+    {
+    CRSAPrivateKey* privateKey = NULL;
+    
+    GetDevicePrivateKeyL(privateKey);
+    CleanupStack::PushL(privateKey);
+    aSignature = OmaCrypto::RsaPssSignHashL(privateKey, aHash);
+    CleanupStack::PopAndDestroy(); // privateKey
+    return KErrNone;
+    }
+
+TBool RRoapStorageClient::VerifyL(
+    const TDesC8& aSignature,
+    const TDesC8& aHash)
+    {
+    CRSAPublicKey* publicKey = NULL;
+    TBool r = ETrue;
+    
+    GetDevicePublicKeyL(publicKey);
+    CleanupStack::PushL(publicKey);
+    r = OmaCrypto::RsaPssVerifyHashL(publicKey, aSignature, aHash);
+    CleanupStack::PopAndDestroy(); // privateKey
+    return r;
+    }
+
+// -----------------------------------------------------------------------------
+// RoapStorageClient::GetRIContextL
+// -----------------------------------------------------------------------------
+//    
+CDRMRIContext* RRoapStorageClient::GetRIContextL( const TDesC8& aRiID )
+    {    
+    return NULL;
+    }
+ 
+    
+// -----------------------------------------------------------------------------
+// RoapStorageClient::GetDomainContextL
+// -----------------------------------------------------------------------------
+//    
+CDRMDomainContext* RRoapStorageClient::GetDomainContextL( const TDesC8& aDomainID )
+    {    
+    return NULL;
+    }
+    
+// -----------------------------------------------------------------------------
+// RRoapStorageClient::AddRIContextL
+// Add a new RI Context to the ROAP storage
+// -----------------------------------------------------------------------------
+//
+void RRoapStorageClient::AddRIContextL( const CDRMRIContext& aRiContext )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// RRoapStorageClient::AddDomainContextL
+// Add a new RI Context to the ROAP storage
+// -----------------------------------------------------------------------------
+//
+void RRoapStorageClient::AddDomainContextL( const CDRMDomainContext& aDomainContext,
+                                            TKeyTransportScheme& aTransportScheme )
+    {
+    }
+    
+// -----------------------------------------------------------------------------
+// RRoapStorageClient::DeleteRiContextL
+// -----------------------------------------------------------------------------
+//    
+void RRoapStorageClient::DeleteRiContextL( const TDesC8& aRiID )
+    {
+    }
+    
+// -----------------------------------------------------------------------------
+// RRoapStorageClient::DeleteDomainContextL
+// -----------------------------------------------------------------------------
+//    
+void RRoapStorageClient::DeleteDomainContextL( const TDesC8& aDomainID )
+    {
+    }
+    
+// -----------------------------------------------------------------------------
+// RRoapStorageClient::DeleteExpiredRIsL
+// -----------------------------------------------------------------------------
+//    
+void RRoapStorageClient::DeleteExpiredRIsL( const TTime& aTime )
+    {
+    }
+    
+    
+// -----------------------------------------------------------------------------
+// RRoapStorageClient::DeleteExpiredDomainsL
+// -----------------------------------------------------------------------------
+//    
+void RRoapStorageClient::DeleteExpiredDomainsL( const TTime& aTime )
+    {
+    }
+    
+// -----------------------------------------------------------------------------
+// RRoapStorageClient::WhiteListURLExistsL
+// -----------------------------------------------------------------------------
+//    
+TBool RRoapStorageClient::WhiteListURLExistsL( const TDesC8& aURL )
+    {
+    return EFalse;
+    }         
+
+//  End of File