--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/inc/drmrightsdb.h Thu Dec 17 08:52:27 2009 +0200
@@ -0,0 +1,682 @@
+/*
+* Copyright (c) 2003 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: Interface for the DRM Rights database
+*
+*/
+
+
+#ifndef DRMRIGHTSDB_H
+#define DRMRIGHTSDB_H
+
+// INCLUDES
+
+#include <e32base.h>
+#include <s32mem.h>
+#include "DRMBackupInterface.h"
+#include "DRMTypes.h"
+
+// CONSTANTS
+
+// Directory for temp files
+_LIT( KDRMDbTempPath, "c:\\system\\temp\\" );
+
+// The primary database temp file
+_LIT( KDRMDbTempFileName, "c:\\private\\101F51F2\\RightsServer.tmp" );
+
+// These are internally defined in the DRM Authenticated API
+// If they change they should be also changed here
+_LIT8( KFLKString, "flk:" );
+LOCAL_C const TInt KFLKStringLength = 4;
+
+_LIT8( KCIDString, "cid:" );
+LOCAL_C const TInt KCIDStringLength = 4;
+
+
+// MACROS
+
+// DATA TYPES
+
+// FORWARD DECLARATIONS
+class CDRMPermission;
+class RFs;
+class CMD5;
+class RReadStream;
+class RWriteStream;
+class CLogFile;
+class CDRMRightsCleaner;
+class CDRMRightsServer;
+class CDcfRep;
+
+// FUNCTION PROTOTYPES
+
+// CLASS DECLARATION
+
+/**
+* CDRMRightsDB implements the rights database required by DRM Engine
+*
+* @lib RightsServer.dll
+* @since 2.5
+*/
+
+NONSHARABLE_CLASS( CDRMRightsDB ) : public CBase ,
+ public MDRMBackupInterface
+ {
+ public: // Constructors and destructor
+
+ /**
+ * NewLC
+ *
+ * Creates an instance of the CDRMRightDB class and returns a pointer
+ * to it The function leaves the object into the cleanup stack
+ *
+ * @since 3.0
+ * @param aFs : Open file server session
+ * @param aDatabasePath : full pathname of the database path
+ * @param aKey : content encryption key 16 bytes in length.
+ * @param aImei: device serial number (used for UDT)
+ * @return Functional CDRMRightsDB object, Function leaves if an error
+ * occurs.
+ */
+ static CDRMRightsDB* NewLC( RFs& aFs,
+ const TDesC& aDatabasePath,
+ const TDesC8& aKey,
+ const TDesC& aImei );
+
+ /**
+ * NewL
+ *
+ * Creates an instance of the CDRMRightDB class and returns a pointer
+ * to it
+ *
+ * @since 3.0
+ * @param aFs : Open file server session
+ * @param aDatabasePath : full pathname of the database path
+ * @param aKey : content encryption key 16 bytes in length.
+ * @param aImei: device serial number (used for UDT)
+ * @return Functional CDRMRightsDB object, Function leaves if an error
+ * occurs.
+ */
+ static CDRMRightsDB* NewL( RFs& aFs,
+ const TDesC& aDatabasePath,
+ const TDesC8& aKey,
+ const TDesC& aImei );
+
+ /**
+ * Destructor
+ */
+ virtual ~CDRMRightsDB();
+
+ public: // New functions
+
+ /**
+ * GetDBEntryByContentIDL
+ *
+ * Gets all rights objects connected to aContentID and inserts them into
+ * the pointer array aRightsList
+ *
+ * @since 2.5
+ * @param aContentID : content identifier
+ * @param aRightsList : pointer array of the rights object to be filled
+ * @return none , Function leaves if an error occurs
+ */
+ void GetDBEntryByContentIDL( const TDesC8& aContentID,
+ RPointerArray<CDRMPermission>& aRightsList);
+
+ /**
+ * GetDBEntryByContentIDL
+ *
+ * Gets the rights object connected to aContentID with the unique
+ * identifier aUniqueID and returns a pointer to it, caller must free
+ * the memory of the pointer
+ *
+ * @since 2.5
+ * @param aContentID : content identifier
+ * @param aUniqueID : unique identifier of the rights object
+ * @return CDRMPermission pointer, Function leaves if an error occurs
+ */
+ CDRMPermission* GetDBEntryByContentIDL( const TDesC8& aContentID,
+ const TDRMUniqueID aUniqueID );
+
+ /**
+ * AddDBEntryL
+ *
+ * Adds a new entry to the database connected with aContentID.
+ *
+ * @since 2.5
+ * @param aContentID : content identifier
+ * @param aRightsObject : the rights object to be added, all fields but
+ * the unique identifier must be set that need to
+ * be set
+ * @param aEncryptionKey : the 16 byte key used to decrypt content
+ * @param aUniqueID : the unique id of the added rights object, in/out
+ * parameter The function will try to use aUniqueID
+ * as the unique id if it is not possible or
+ * aUniqueID is 0 a new random unique id will be
+ * generated
+ * @return None, Function leaves if an error occurs
+ */
+ void AddDBEntryL( const TDesC8& aContentID,
+ CDRMPermission& aRightsObject,
+ const TDesC8& aEncryptionKey,
+ TDRMUniqueID& aUniqueID );
+
+ /**
+ * DeleteDBEntryL
+ *
+ * Deletes an entry from the database connected to aContentID with unique
+ * identifier aUniqueID
+ *
+ * @since 2.5
+ * @param aContentID : content identifier
+ * @param aUniqueID : unique identifier of the rights object
+ * @return None, Function leaves if an error occurs
+ */
+ void DeleteDBEntryL( const TDesC8& aContentID,
+ const TDRMUniqueID aUniqueID );
+
+ /**
+ * DeleteDBEntryL
+ *
+ * Deletes all entries from the database connected to aContentID
+ *
+ * @since 2.5
+ * @param aContentID : content identifier
+ * @return None, Function leaves if an error occurs
+ */
+ void DeleteDBEntryL( const TDesC8& aContentID );
+
+ /**
+ * UpdateDBEntryL
+ *
+ * Updates an entry from the database connected to aContentID with
+ * unique identifier aUniqueID
+ *
+ * @since 2.5
+ * @param aContentID : content identifier
+ * @param aRightsObject : the updated rights object
+ * @return None, Function leaves if an error occurs
+ */
+ void UpdateDBEntryL( const TDesC8& aContentID,
+ const CDRMPermission& aRightsObject);
+
+ /**
+ * ExportContentIDListL
+ *
+ * Exports a list of content id:s to a file
+ *
+ * @since 2.5
+ * @param aTempFile : return param full pathname of the temporary file
+ * to use
+ * @return None, Function leaves if an error occurs
+ */
+ void ExportContentIDListL( TFileName& aTempFile );
+
+ /**
+ * BackupDBL
+ *
+ * Backups the database to aBackupDBFile and creates the warranty
+ * transfer file aWTFile and encrypts it with the aKey
+ *
+ * @since 2.5
+ * @param aWTFile : full pathname of the warranty transfer file
+ * @param aEncryptionKey : 16 byte encryption key
+ * @return None, Function leaves if an error occurs
+ */
+/* void BackupDBL( const TDesC& aWTFile,
+ const TDesC8& aEncryptionKey );
+*/
+ /**
+ * MergeDBL
+ *
+ * Merges the backup database into the current database
+ *
+ * @since 2.5
+ * @return None, Function leaves if an error occurs
+ */
+// void MergeDBL();
+
+ /**
+ * GetDecryptionKey
+ *
+ * Returns the decryption key for rights object connected to aContentID
+ *
+ * @since 2.5
+ * @param aContentID content ID
+ * @return HBufC8 pointer or NULL if failed
+ */
+ HBufC8* GetDecryptionKeyL( const TDesC8& aContentID );
+
+ /**
+ * DeleteDBL
+ *
+ * Deletes the rights database file and creates an empty file in it's
+ * place
+ *
+ * @since 2.5
+ * @return can leave with a symbian error code
+ */
+ void DeleteDBL( void );
+
+ /**
+ * GetAmountOfRightsObjects
+ *
+ * Returns the amount of unique content id's from in the rights database
+ *
+ * @since 2.5
+ * @return the amount of rights objects in the database
+ */
+ TInt32 GetAmountOfRightsObjectsL();
+
+
+ /**
+ * AddDomainROL
+ *
+ * Adds a domain rights object just the XML representation
+ *
+ * @since 3.0
+ * @param aRoId : The Rights object identifier of the RO
+ * @param aXmlData : The Xml data to be saved
+ * @return can leave with symbian on error code
+ */
+ void AddDomainROL( const TDesC8& aRoId, const TDesC8& aXmlData );
+
+ /**
+ * GetDomainROL
+ *
+ * Gets a domain rights object just the XML representation
+ *
+ * @since 3.0
+ * @param aRoId : The Rights object identifier of the RO
+ * @return Domain RO Xml representation or NULL
+ * can leave with symbian on error code
+ */
+ HBufC8* GetDomainROL( const TDesC8& aRoId );
+
+ /**
+ * DeleteDomainROL
+ *
+ * Deletes a domain rights objects XML representation
+ *
+ * @since 3.0
+ * @param aRoId : The Rights object identifier of the RO
+ * @return can leave with symbian on error code
+ */
+ void DeleteDomainROL( const TDesC8& aRoId );
+
+ /**
+ * DeleteExpiredPermissionsL
+ *
+ * Delete expired permissions.
+ *
+ * @since 3.0
+ * @param aTime : current time
+ * @param aStatus : request status for the asynchronous requrest
+ * @return CDRMRightsCleaner object which is used to control the
+ * expired permissions deletion process
+ */
+ CDRMRightsCleaner* DeleteExpiredPermissionsL( const TTime& aTime,
+ TRequestStatus& aStatus );
+
+ /**
+ * NameContentL
+ *
+ * Give a name to the content, if the name is empty the content name
+ * will be cleared
+ *
+ * @since 3.0
+ * @param aContentId : content identifier
+ * @param aName : the name for the content
+ * @return None
+ * @leave Leaves with KErrNotFound if the content doesn't exist
+ */
+ void NameContentL( const TDesC8& aContentId,
+ const TDesC& aName );
+
+ /**
+ * ContentNameL
+ *
+ * Returns a pointer to the name of the content and leaves it in the
+ * cleanup stack
+ *
+ * @since 3.0
+ * @param aContentId : content identifier
+ * @return the name of the content in a HBufC*
+ * @leave Leaves with KErrNotFound if the content doesn't exist
+ */
+ HBufC* ContentNameLC( const TDesC8& aContentID );
+
+ /**
+ * DeleteExpiredL
+ *
+ * Delete expired from the current file store
+ *
+ * @since 3.0
+ * @param aFileName : name of the permission file store
+ * @param aTime : current time.
+ * @return TBool : ETrue if the file can be deleted
+ * EFalse if the file can't be deleted
+ */
+ TBool DeleteExpiredL( const TFileName& aFileName,
+ const TTime& aTime );
+
+ /**
+ * GetUdtDataL
+ *
+ * Gets the udt data from a restore file if it exists
+ * if not it leaves with KErrNotFound
+ *
+ * @since 3.0
+ * @param aStream : the stream to write to
+ * @return HBufC8* with the UDT data encrypted with the udt public key
+ * @leave Can leave with a Symbian OS error code
+ */
+ HBufC8* GetUdtDataLC();
+
+ /**
+ * InitiateUdtL
+ *
+ * Initiates the User Data Transfer
+ *
+ * @since 3.0
+ * @param aKey : the key used to encrypt the data encrypted with
+ * the device public key
+ * @return none
+ * @leave Can leave with a Symbian OS error code
+ */
+ void InitiateUdtL( const TDesC8& aKey );
+
+ /**
+ * CleanUdtData
+ *
+ * Deletes the restore file if it exists
+ *
+ * @since 3.0
+ * @return None
+ */
+ void CleanUdtData();
+
+ /**
+ * GetContentIDListL
+ *
+ * Get a list of all the content id's in the database
+ *
+ * @since 2.5
+ * @param aArray : The pointer array has all the content id's
+ * that have been added to the rights database
+ * @return None, Function leaves if an error occurs
+ */
+ void GetContentIDListL( RPointerArray<HBufC8>& aArray );
+
+ /**
+ * SetAuthenticationSeedL
+ *
+ * Set the authentication seed for a content ID
+ *
+ * @since 3.0
+ * @param aContentId : content identifier
+ * @param aSeed : value for the seed
+ * @return None
+ * @leave Leaves with KErrNotFound if the content doesn't exist
+ */
+ void SetAuthenticationSeedL( const TDesC8& aContentId,
+ const TDesC8& aSeed );
+
+ /**
+ * GetAuthenticationSeedL
+ *
+ * Get the authentication seed for a content ID
+ *
+ * @since 3.0
+ * @param aContentId : content identifier
+ * @return value for the seed
+ * @leave Leaves with KErrNotFound if the content doesn't exist
+ */
+ HBufC8* GetAuthenticationSeedL( const TDesC8& aContentID );
+
+ // test function
+ void CreateDummyUDTFileL();
+
+ public: // Inherited from MDRMBackupInterface
+
+ /**
+ * BackupContentToFileL
+ *
+ * Backups content to file in encrypted format
+ *
+ * @since 3.0
+ * @param aBackupFile : File handle to the backup file
+ * @param aEncryptionKey : the key to use to encrypt the backup file
+ * @leave Symbian OS error code if an error occurs
+ */
+ virtual void BackupContentToFileL( RFile& aBackupFile,
+ const TDesC8& aEncryptionKey,
+ const TInt aMode = KDRMNormalBackup );
+
+ /**
+ * RestoreContentFromFileL
+ *
+ * Restores the content file from encrypted format
+ *
+ * @since 3.0
+ * @param aBackupFile : File handle to backup file
+ * @param aEncryptionKey : the key to use to encrypt the backup file
+ * @leave Symbian OS error code if an error occurs
+ */
+ virtual void RestoreContentFromFileL( RFile& aBackupFile,
+ const TDesC8& aEncryptionKey,
+ const TInt aMode = KDRMNormalBackup );
+
+
+ /**
+ * Updating
+ *
+ * Returns the ETrue if the database is being updated
+ *
+ * @since 3.0
+ * @param aStream : the stream to write to
+ * @return ETrue if files are currently modified in the DB
+ */
+ TBool Updating();
+
+ /**
+ * MarkAsCorrupted
+ *
+ * Marks the rights database as corrupted, to be deleted on reboot
+ *
+ * @since 3.0
+ */
+ void MarkAsCorrupted();
+
+ private:
+ /**
+ * Default Constructor - First phase. Prevented.
+ */
+ CDRMRightsDB();
+
+ /**
+ * Default Constructor - First phase.
+ */
+ CDRMRightsDB( RFs& aFs );
+
+ /**
+ * ConstructL
+ *
+ * Second phase constructor
+ *
+ * @since 2.5
+ * @param aDatabasePath : full pathname of the database
+ * @param aKey : database encryption key
+ * @param aImei: device serial number (used for UDT)
+ * @return Leaves if an error occurs
+ */
+ void ConstructL( const TDesC& aDatabasePath,
+ const TDesC8& aKey,
+ const TDesC& aImei );
+
+ /**
+ * Assignment operator - Prevented
+ */
+ CDRMRightsDB& operator =( const CDRMRightsDB& );
+
+ /**
+ * Copy constructor - Prevented
+ */
+ CDRMRightsDB( const CDRMRightsDB& );
+
+
+ /**
+ * InitializeDatabaseL
+ *
+ * Initializes the database for usage
+ *
+ * @since 2.5
+ * @return Leaves if an error occurs.
+ */
+ void InitializeDatabaseL( void );
+
+ /**
+ * HashContentID
+ *
+ * Fills the aRightsObject with the correct data from aData and checks if the
+ * rights object can be restored or not.
+ *
+ * @since 3.0
+ * @param aHashKey : hashed key, out parameter
+ * @param aContentID : the content id to be hashed
+ * @return None
+ */
+ void HashContentID( TPtrC8& aHashKey, const TDesC8& aContentID );
+
+
+ /**
+ * GetRightsFileNameL
+ *
+ * Gets the whole path of the permissions file
+ *
+ * @since 3.0
+ * @param aContentID : the content id to look for
+ * @param aPath : return parameter for the filename
+ * @return None, leaves with SymbianOS error code or DRMCommon error
+ * code if an error occurs
+ */
+ void GetRightsFileNameL(
+ const TDesC8& aContentID,
+ TFileName& aPath);
+
+ /**
+ * GetXMLFileNameL
+ *
+ * Gets the whole path of the domain rights object XML representation
+ *
+ * @since 3.0
+ * @param aRoID : the rights object id to look for
+ * @param aPath : return parameter for the filename
+ * @return None, leaves with SymbianOS error code or DRMCommon error
+ * code if an error occurs
+ */
+ void GetXMLFileNameL(
+ const TDesC8& aRoID,
+ TFileName& aPath);
+
+ /**
+ * ModifyKey
+ *
+ * Encrypts or decrypts the key
+ *
+ * @since 3.0
+ * @param aKey : the key to be encrypted or decrypted
+ * @return None
+ */
+ void ModifyKey( TDesC8& aKey );
+
+ /**
+ * AddUDTDataL
+ *
+ * Adds user data transfer data to the header part of the backup
+ * file
+ *
+ * @since 3.0
+ * @param aStream : the stream to write to
+ * @return None
+ * @leave Can leave with a Symbian OS error code
+ */
+ void AddUDTDataL( RWriteStream& aStream );
+
+ // Helper function to do encryption to the stream
+ void WriteEncryptedStreamL( RWriteStream& aStream,
+ const TDesC8& aMessageData,
+ TDes8& aIv,
+ TDes8& aRemainder,
+ HBufC8*& aEncryptionBuffer,
+ TInt& aBytesWritten );
+
+ // Helper function to do encryption to the stream
+ void FinalizeEncryptedStreamL( RWriteStream& aStream,
+ TDes8& aIv,
+ TDes8& aRemainder,
+ HBufC8*& aEncryptionBuffer,
+ TInt& aBytesWritten );
+
+ // Aes encryption
+ void EncryptL( const TDesC8& aIv,
+ TPtr8& aData,
+ TBool aAddPadding );
+
+ void DecryptL( const TDesC8& aIv,
+ TPtr8& aData,
+ TBool aRemovePadding,
+ const TDesC8& aEncryptionKey );
+
+ void CheckPaddingL( const TDesC8& aData );
+
+ // Helper function to read and decrypt data and reserve memory
+ // for it if needed
+ void ReadDataL( RFile& aStream,
+ TDes8& aEncIV,
+ TPtr8& aReadData,
+ HBufC8*& aDataBuffer,
+ TInt& dataLeft,
+ TInt size,
+ TBool aStart,
+ const TDesC8& aEncryptionKey );
+
+ // check if the file can be deleted:
+ void CheckCleanup( const TDesC& aFileName );
+
+ private:
+ // fileserver session
+ RFs& iFileServer;
+
+ // rights database file, fileserver subsession
+ HBufC* iDbPath;
+
+ // The md5 hash algorithm implementation
+ CMD5 *iHasher;
+
+ // The Rights database key
+ HBufC8* iKey;
+
+ // mem stream for restore
+ RMemReadStream iMemStream;
+
+ // device serial number (used for UDT)
+ HBufC* iImei;
+
+ // Time stamp of the last update operation
+ TTime iLastUpdate;
+ };
+
+#endif // DRMRIGHTSDB_H
+
+// End of File