commondrm/drmencryptor/src/DrmBb5KeyStorage.cpp
branchRCL_3
changeset 27 1481bf457703
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commondrm/drmencryptor/src/DrmBb5KeyStorage.cpp	Wed Sep 01 12:21:16 2010 +0100
@@ -0,0 +1,239 @@
+/*
+* Copyright (c) 2003-2009 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:
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32std.h>
+#include <f32file.h>
+#include <flogger.h>
+#include <x509cert.h>
+#include <symmetric.h>
+#include <asymmetric.h>
+
+#ifdef RD_MULTIPLE_DRIVE
+#include <driveinfo.h>
+#endif
+
+#include "DrmKeyStorage.h"
+
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// Test logging macros
+
+#ifdef RD_MULTIPLE_DRIVE
+_LIT(KFullLogDir, "%c:\\logs\\drm\\");
+#else
+_LIT(KFullLogDir, "c:\\logs\\drm\\");
+#endif
+
+_LIT(KLogDir, "drm");
+_LIT(KLogName, "DrmEncryptorBb5KeyStorage.log");
+
+#define TEST_STEP(string) \
+    GBb5Log.WriteFormat(_L("Next Test: %S"), &string);
+
+#define CHECK(condition) \
+    if (!condition) GBb5Log.WriteFormat(_L("FAIL: line %d"), __LINE__);
+
+// MODULE DATA STRUCTURES
+
+RFs GBb5Fs;
+RFileLogger GBb5Log;
+
+// STATIC TEST CONTENT AND RIGHTS OBJECTS
+
+// LOCAL FUNCTION PROTOTYPES
+
+// ==================== LOCAL FUNCTIONS ====================
+
+HBufC8* I2OSPL(
+    RInteger& aInt)
+    {
+    HBufC8* r = aInt.BufferLC();
+    CleanupStack::Pop(r);
+    return r;
+    }
+
+RInteger OS2IPL(
+    const TDesC8& aOctetStream)
+    {
+    RInteger r;
+    TInt i;
+
+    r = RInteger::NewL(0);
+    for (i = 0; i < aOctetStream.Length(); i++)
+        {
+        r *= 256;
+        r += aOctetStream[i];
+        }
+    return r;
+    }
+
+HBufC8* RsaEncryptL(
+    CRSAPublicKey* aKey,
+    const TDesC8& aInput)
+    {
+    RInteger result;
+    RInteger input;
+    HBufC8* output;
+
+    input = OS2IPL(aInput);
+    CleanupClosePushL(input);
+    result = TInteger::ModularExponentiateL(input, aKey->E(), aKey->N());
+    CleanupClosePushL(result);
+    output = I2OSPL(result);
+    CleanupStack::PopAndDestroy(2); // result, input
+    return output;
+    }
+
+LOCAL_C TUint MDrmKeyStorage_GetCertificateChainL()
+    {
+    MDrmKeyStorage* storage = NULL;
+    RPointerArray<HBufC8> chain;
+    TInt i;
+    TUint result = NULL;
+
+    GBb5Log.WriteFormat(_L("MDrmKeyStorage_GetCertificateChainL -> DrmKeyStorageNewL"));
+    TRAPD(err,storage = DrmKeyStorageNewL());
+    if (err != KErrNone)
+        {
+            result = err;
+        }
+
+    GBb5Log.WriteFormat(_L("MDrmKeyStorage_GetCertificateChainL -> SelectDefaultRootL"));
+    storage->SelectDefaultRootL();
+
+    GBb5Log.WriteFormat(_L("MDrmKeyStorage_GetCertificateChainL -> GetCertificateChainL"));
+    storage->GetCertificateChainL(chain);
+
+    for (i = 0; i < chain.Count(); i++)
+        {
+        GBb5Log.WriteFormat(_L("Certificate %d:"), i);
+        GBb5Log.HexDump(_S(""), _S(""), chain[i]->Ptr(), chain[i]->Length());
+        }
+    chain.ResetAndDestroy();
+    chain.Close();
+    delete storage;
+    return result;
+    }
+
+LOCAL_C TUint MDrmKeyStorage_DecryptL()
+    {
+    MDrmKeyStorage* storage = NULL;
+    RPointerArray<HBufC8> chain;
+    CRSAPublicKey* key = NULL;
+    CX509Certificate* cert = NULL;
+    TX509KeyFactory factory;
+    TBuf8<128> data;
+    HBufC8* encData;
+    HBufC8* decData;
+    TUint result = KErrNone;
+
+
+    GBb5Log.WriteFormat(_L("MDrmKeyStorage_Decrypt"));
+    storage = DrmKeyStorageNewL();
+    storage->SelectDefaultRootL();
+    storage->GetCertificateChainL(chain);
+    cert = CX509Certificate::NewL(*chain[0]);
+    chain.ResetAndDestroy();
+    chain.Close();
+    key = factory.RSAPublicKeyL(cert->PublicKey().KeyData());
+    data.SetLength(128);
+    data.Fill(1);
+    GBb5Log.WriteFormat(_L("data:"));
+    GBb5Log.HexDump(_S(""), _S(""), &data[0], sizeof(data));
+
+    encData = RsaEncryptL(key, data);
+    GBb5Log.WriteFormat(_L("encrypted data:"));
+    GBb5Log.HexDump(_S(""), _S(""), encData->Ptr(), encData->Length());
+
+    decData = storage->RsaDecryptL(*encData);
+    GBb5Log.WriteFormat(_L("decrypted data :"));
+    GBb5Log.HexDump(_S(""), _S(""), decData->Ptr(), decData->Length());
+
+    delete cert;
+    delete key;
+    delete storage;
+    return result;
+    }
+
+// ==================== TEST FUNCTIONS =====================
+
+
+
+TUint Bb5KeyStorage()
+    {
+    TUint result = 0;
+    TInt catchy = 0;
+    result = GBb5Fs.Connect();
+    if( result != KErrNone )
+        {
+        return result;
+        }
+
+#ifndef RD_MULTIPLE_DRIVE
+
+    GBb5Fs.MkDirAll(KFullLogDir);
+
+#else //RD_MULTIPLE_DRIVE
+
+    TInt driveNumber( -1 );
+    TChar driveLetter;
+    DriveInfo::GetDefaultDrive( DriveInfo::EDefaultSystem, driveNumber );
+    GBb5Fs.DriveToChar( driveNumber, driveLetter );
+
+    TFileName fullLogDir;
+    fullLogDir.Format( KFullLogDir, (TUint)driveLetter );
+
+    GBb5Fs.MkDirAll(fullLogDir);
+
+#endif
+
+    result = GBb5Log.Connect();
+    if( result != KErrNone )
+        {
+        GBb5Fs.Close();
+        return result;
+        }
+    GBb5Log.CreateLog(KLogDir, KLogName, EFileLoggingModeOverwrite);
+    GBb5Log.Write(_L("Start %D"));
+
+    TRAPD(err,result = MDrmKeyStorage_GetCertificateChainL());
+    CHECK(err == KErrNone);
+    if (err ==KErrNone)
+        {
+        TRAP(catchy, result = MDrmKeyStorage_DecryptL());
+        if( catchy )
+            {
+            result = catchy;
+            }
+        }
+    CHECK(err == KErrNone);
+    GBb5Log.CloseLog();
+    GBb5Fs.Close();
+    return result;
+    }
+