javatools/certificatesconfigurator/src.s60/main.cpp
branchRCL_3
changeset 14 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/certificatesconfigurator/src.s60/main.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,303 @@
+/*
+* Copyright (c) 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 "trustrootpolicy.h"
+#include <openssl/x509.h>
+#include <openssl/x509v3.h>
+#include <openssl/bio.h>
+#include "javasymbianoslayer.h"
+
+_LIT(KLegacyCertsPath,           "z:\\private\\10203636\\security\\trustroots\\device\\certificates\\");
+_LIT(KOmjCertsPath,              "c:\\private\\200211dc\\security\\trustroots\\device\\certificates\\");
+_LIT8(KOmjCertsPath8,              "c:\\private\\200211dc\\security\\trustroots\\device\\certificates\\");
+_LIT(KOmjCertsTmpPath,              "c:\\private\\200211dc\\security\\trustroots\\device\\certificates\\tmp\\");
+_LIT8(KOmjCertsTmpPath8,              "c:\\private\\200211dc\\security\\trustroots\\device\\certificates\\tmp\\");
+_LIT(KLegacyTrustRootPolicyPath, "z:\\private\\10203636\\security\\midp2_trp.xml");
+_LIT(KLegacyCertsStatesPath,    "c:\\private\\10203636\\security\\trustroots\\device\\state\\");
+_LIT(KOmjCertsStatesPath,       "c:\\private\\200211dc\\security\\trustroots\\device\\state\\");
+
+static bool CertsCopyNeeded()
+{
+    _LIT(KSystemAmsSid, "10203636");
+    return (KOmjCertsPath().Find(KSystemAmsSid) == -1);
+}
+
+static void MoveFileL(const TDesC& oldPath, const TDesC& newPath, RFs& fsSession)
+{
+    CFileMan* fileMan = CFileMan::NewL(fsSession);
+    CleanupStack::PushL(fileMan);
+    fileMan->Move(oldPath, newPath);
+    CleanupStack::PopAndDestroy();
+}
+
+static void RemoveDirL(const TDesC& dirName, RFs& fsSession)
+{
+    CFileMan* fileMan = CFileMan::NewL(fsSession);
+    CleanupStack::PushL(fileMan);
+    fileMan->RmDir(dirName);
+    CleanupStack::PopAndDestroy();
+}
+
+static string GetDomainName(string domainId)
+{
+    string domainName = "";
+    if (domainId == "*MFD*"
+            || domainId == "*MFDU*")
+    {
+        domainName = "Manufacturer";
+    }
+    else if (domainId == "*OPD*"
+             || domainId == "*OPDU*"
+             || domainId == "*ODOPDU*"
+             || domainId == "*ODOPD*")
+    {
+        domainName = "Operator";
+    }
+    else if (domainId == "*TTPD*")
+    {
+        domainName = "IdentifiedThirdParty";
+    }
+    return domainName;
+}
+
+static string GetDomainCategory(string domainId)
+{
+    string domainCategory = "";
+    if (domainId == "*MFD*"
+            || domainId == "*MFDU*")
+    {
+        domainCategory = "MFD";
+    }
+    else if (domainId == "*OPD*"
+             || domainId == "*ODOPD*"
+             || domainId == "*OPDU*"
+             || domainId == "*ODOPDU*")
+    {
+        domainCategory = "OPD";
+    }
+    else if (domainId == "*TTPD*")
+    {
+        domainCategory = "ITPD";
+    }
+    return domainCategory;
+}
+
+static string GetHash(string trustRootPath)
+{
+    /* The length of the MD5 digest (32 digit hexadecimal number) */
+    const int MD5_DIGEST_LEN = 8;
+    char trustRootHash[MD5_DIGEST_LEN + 1];
+    trustRootHash[0] = '\0';
+
+    FILE* trustRootDataFile = fopen(trustRootPath.c_str(), "r");
+    if (trustRootDataFile != NULL)
+    {
+        if (fseek(trustRootDataFile, 0L, SEEK_END) == 0)
+        {
+            long  trustRootDataLen = ftell(trustRootDataFile);
+            if (trustRootDataLen > 0)
+            {
+                if (fseek(trustRootDataFile, 0L, SEEK_SET) == 0)
+                {
+                    char* trustRootData = new char[trustRootDataLen];
+                    if (trustRootData != NULL)
+                    {
+                        fread(trustRootData, sizeof(char), trustRootDataLen, trustRootDataFile);
+                        if (!ferror(trustRootDataFile))
+                        {
+                            BIO*  bio = BIO_new_mem_buf((void *) trustRootData, trustRootDataLen);
+                            if ((bio))
+                            {
+                                BIO_set_close(bio, BIO_CLOSE);
+                                X509* trustRootCert = d2i_X509_bio(bio,NULL);
+                                if (trustRootCert != NULL)
+                                {
+                                    sprintf(trustRootHash,"%08lX",X509_issuer_name_hash(trustRootCert));
+                                    trustRootHash[MD5_DIGEST_LEN] = '\0';
+                                    delete trustRootCert;
+                                    trustRootCert = NULL;
+                                }
+                            }
+                            BIO_free(bio);
+                        }
+                        delete[] trustRootData;
+                    }
+                }
+            }
+        }
+        fclose(trustRootDataFile);
+    }
+    return string(trustRootHash);
+}
+
+static void CopyFilesL(const TDesC& aSource, const TDesC& aDest, RFs& fsSession)
+{
+    // Create file management object
+    CFileMan* fileMan = CFileMan::NewL(fsSession);
+    CleanupStack::PushL(fileMan);
+
+    // Do copy (here synchronously)
+    fileMan->Copy(aSource, aDest, CFileMan::EOverWrite|CFileMan::ERecurse);
+    // clear the read-only attribute
+    _LIT(KWildCards,"*");
+    HBufC* newDir = HBufC::NewLC(aDest.Length() + 1);
+    TPtr ptr = newDir->Des();
+    ptr.Copy(aDest);
+    ptr.Append(KWildCards);
+    fileMan->Attribs(ptr,KEntryAttNormal, KEntryAttReadOnly, TTime(0),CFileMan::ERecurse);
+    CleanupStack::PopAndDestroy(newDir);
+
+    // Clean up
+    CleanupStack::PopAndDestroy();
+}
+
+static void HandleTrustRootsL(const std::vector<TrustRoot>& aConfiguredTrustRoots, RFs& fsSession)
+{
+    string path((const char *)KOmjCertsPath8().Ptr(), KOmjCertsPath8().Length());
+    string tmpPath;
+    if (!CertsCopyNeeded())
+    {
+        tmpPath = path;
+    }
+    else
+    {
+        tmpPath = string((const char *)KOmjCertsTmpPath8().Ptr(), KOmjCertsTmpPath8().Length());
+    }
+    for (int i=0; i<aConfiguredTrustRoots.size(); i++)
+    {
+        TrustRoot trustRoot = aConfiguredTrustRoots[i];
+
+        // check if the corresponding certificate exists
+        string tmpBaseName = tmpPath + trustRoot.iName;
+        string trustRootName = tmpBaseName + ".cer";
+        string rootName = trustRoot.iName + ".cer";
+        FILE* trustRootFile = fopen(trustRootName.c_str(), "r");
+        if (trustRootFile == NULL)
+        {
+            trustRootName.clear();
+            trustRootName = tmpBaseName + ".der";
+            trustRootFile = fopen(trustRootName.c_str(), "r");
+        }
+        if (trustRootFile != NULL)
+        {
+            fclose(trustRootFile);
+            string domainName = GetDomainName(trustRoot.iDomain);
+            if (domainName == "")
+            {
+                continue;
+            }
+            string domainCategory = GetDomainCategory(trustRoot.iDomain);
+            if (domainCategory == "")
+            {
+                continue;
+            }
+            string hash = GetHash(trustRootName);
+            if (hash == "")
+            {
+                continue;
+            }
+            // generate the metadata
+            string baseName = path + trustRoot.iName;
+            FILE * metadataFile = fopen((baseName + ".metadata").c_str(), "w+");
+            if (metadataFile != NULL)
+            {
+                // copy the cert from tmp
+                if (CertsCopyNeeded())
+                {
+                    HBufC* tmp = stringToDes(trustRootName.c_str());
+                    CleanupStack::PushL(tmp);
+                    TPtr ptr = tmp->Des();
+                    MoveFileL(ptr, KOmjCertsPath, fsSession);
+                    CleanupStack::PopAndDestroy(tmp);
+                }
+
+                // generate the metadatafile
+                fprintf(metadataFile, "name=%s\n", domainName.c_str());
+                fprintf(metadataFile, "category=%s\n", domainCategory.c_str());
+                fprintf(metadataFile, "removable=%d\n", (trustRoot.iCanDelete == true));
+                fprintf(metadataFile, "disablable=%d\n", (trustRoot.iCanDisable == true));
+                fprintf(metadataFile, "hash=%s\n", hash.c_str());
+                fclose(metadataFile);
+            }
+        }
+    }
+}
+
+
+static void ConvertTrustRootPolicyL(RFs& fsSession)
+{
+    // read the trust root info
+    CTrustRootPolicy* trustRootPolicy = CTrustRootPolicy::NewL();
+    CleanupStack::PushL(trustRootPolicy);
+    std::vector<TrustRoot> trustRoots;
+    trustRootPolicy->ReadFromFileL(KLegacyTrustRootPolicyPath, trustRoots);
+    CleanupStack::PopAndDestroy(trustRootPolicy);
+
+    // generate trust roots metadata
+    HandleTrustRootsL(trustRoots, fsSession);
+}
+
+static void CleanupL(RFs& fsSession)
+{
+    if (!CertsCopyNeeded())
+    {
+        return;
+    }
+    // delete the tmp directory (together with the leftovers = certificates without metadata)
+    RemoveDirL(KOmjCertsTmpPath, fsSession);
+}
+
+static void CopyCertsL(RFs& fsSession)
+{
+    if (!CertsCopyNeeded())
+    {
+        return;
+    }
+
+    // copy all the files from KLegacyCertsPath to KOmjCertsPath
+    CopyFilesL(KLegacyCertsPath, KOmjCertsTmpPath, fsSession);
+    // copy all the files from KLegacyCertsStatesPath to KOmjCertsStatesPath
+    CopyFilesL(KLegacyCertsStatesPath, KOmjCertsStatesPath, fsSession);
+}
+
+static void DoL()
+{
+    // open file server session
+    RFs fsSession;
+    User::LeaveIfError(fsSession.Connect());
+
+    // copy the certs and state infos from legacy to omj
+    CopyCertsL(fsSession);
+
+    // convert the trust root policy from KLegacyTrustRootPolicyPath to KOmjCertsPath
+    ConvertTrustRootPolicyL(fsSession);
+
+    // cleanup
+    CleanupL(fsSession);
+
+    // close file server session
+    fsSession.Close();
+}
+
+TInt E32Main()
+{
+    //__UHEAP_MARK;
+    CTrapCleanup* cleanupStack = CTrapCleanup::New();
+    TRAPD(error, DoL());
+    delete cleanupStack;
+    //__UHEAP_MARKEND;
+    return error;
+}