SignatureValidator and RDS feature added.
authorDongeup Ham <dongeup.ham@samsung.com>
Tue, 2 Apr 2013 11:54:58 +0000 (20:54 +0900)
committerDongeup Ham <dongeup.ham@samsung.com>
Tue, 2 Apr 2013 11:54:58 +0000 (20:54 +0900)
Change-Id: Ifb400c7b413c7aeb156f8b392b766c5c1891e8b5
Signed-off-by: Dongeup Ham <dongeup.ham@samsung.com>
.cproject
CMakeLists.txt
inc/InstallerDefs.h
packaging/osp-installer.spec
src/Manager/PermissionManager.cpp
src/Manager/SignatureManager.cpp
src/Manager/SignatureManager.h [changed mode: 0644->0755]
src/Step/SignatureStep.cpp
src/Util/InstallerUtil.cpp

index eec7949..a867f3b 100755 (executable)
--- a/.cproject
+++ b/.cproject
@@ -34,6 +34,7 @@
                                                                </option>
                                                                <option id="gnu.cpp.compiler.option.include.paths.1186289576" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
                                                                        <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/inc}&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/dpl-efl&quot;"/>
                                                                        <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Context}&quot;"/>
                                                                        <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Installer}&quot;"/>
                                                                        <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Manager}&quot;"/>
@@ -43,6 +44,7 @@
                                                                        <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/XmlHandler/Parser}&quot;"/>
                                                                        <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Util}&quot;"/>
                                                                        <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/pkgmgr&quot;"/>
+                                                                       <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/cert-svc&quot;"/>
                                                                        <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/dlog&quot;"/>
                                                                        <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/lib/glib-2.0/include&quot;"/>
                                                                        <listOptionValue builtIn="false" value="&quot;${SBI_SYSROOT}/usr/include/glib-2.0&quot;"/>
                                                                </option>
                                                                <option id="gnu.cpp.link.option.libs.850444138" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" valueType="libs">
                                                                        <listOptionValue builtIn="false" value="pkgmgr_parser"/>
+                                                                       <listOptionValue builtIn="false" value="cert-svc"/>
+                                                                       <listOptionValue builtIn="false" value="cert-svc-vcore"/>
+                                                                       <listOptionValue builtIn="false" value="dpl-efl"/>
                                                                        <listOptionValue builtIn="false" value="dl"/>
                                                                        <listOptionValue builtIn="false" value="app2ext"/>
                                                                        <listOptionValue builtIn="false" value="glib-2.0"/>
index 175a325..a0db9fd 100755 (executable)
@@ -27,6 +27,8 @@ INCLUDE_DIRECTORIES(
        /usr/include/osp/system
        /usr/include/libxml2
        /usr/include/system
+       /usr/include/cert-svc
+       /usr/include/dpl-efl
 )
 
 SET (${this_target}_SOURCE_FILES
@@ -74,10 +76,11 @@ SET (${this_target}_SOURCE_FILES
 ADD_EXECUTABLE (${this_target} ${${this_target}_SOURCE_FILES})
 
 SET(CMAKE_C_FLAGS "${OSP_DEBUG_FLAGS} ${OSP_OPT_FLAGS} ${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} ${OSP_COMPILER_FLAGS}")
-SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
+SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions -fvisibility=hidden")
 SET(CMAKE_CXX_FLAGS "${OSP_DEBUG_FLAGS} ${OSP_OPT_FLAGS} ${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} ${OSP_COMPILER_FLAGS}")
 
 TARGET_LINK_LIBRARIES(${this_target} "-L/usr/lib/osp -losp-appfw -lxml2 -lpkgmgr_installer -lpkgmgr_parser -lglib-2.0 -lapp2ext -ldl" -Wl,--allow-shlib-undefined)
+TARGET_LINK_LIBRARIES(${this_target} "-L/usr/lib -lcert-svc-vcore -ldpl-efl -lcert-svc")
 
 ADD_SUBDIRECTORY(plugin)
 
index 818c618..b52ad1a 100755 (executable)
@@ -23,7 +23,7 @@
 
 #include "InstallerUtil.h"
 
-#define OSP_INSTALLER_VERSION "version=[20130402.1]"
+#define OSP_INSTALLER_VERSION "version=[20130402.2]"
 
 #define DIR_BIN                                L"/bin"
 #define DIR_INFO                       L"/info"
index 524e618..64e2eaa 100755 (executable)
@@ -16,9 +16,13 @@ BuildRequires:  pkgconfig(pkgmgr-info)
 BuildRequires:  pkgconfig(app2sd)
 BuildRequires:  pkgconfig(libwbxml2)
 BuildRequires:  pkgconfig(osp-appfw)
+BuildRequires:  pkgconfig(dpl-efl)
+BuildRequires:  pkgconfig(cert-svc)
+BuildRequires:  pkgconfig(cert-svc-vcore)
 
 BuildRequires:  osp-appfw-internal-devel
 
+
 # runtime requires
 Requires: osp-appfw
 Requires: osp-loader  
index 47a8284..91d7e3e 100755 (executable)
@@ -275,13 +275,25 @@ PermissionManager::CopyForRds(InstallationContext* pContext, IList* pFileList, b
                result r = E_SUCCESS;
                String destDir;
 
-               r = destFile.LastIndexOf(L'/', destFile.GetLength() -1, pos);
-               if (IsFailed(r) == true)
+               if (destFile.EndsWith(L"/") == true)
                {
-                       AppLog("destFile is invalid[%ls]", destFile.GetPointer());
+                       destDir = destFile;
+                       if (File::IsFileExist(destDir) == false)
+                       {
+                               Directory::Create(destDir, true);
+                       }
                        continue;
                }
-               destFile.SubString(0, pos, destDir);
+               else
+               {
+                       r = destFile.LastIndexOf(L'/', destFile.GetLength() -1, pos);
+                       if (IsFailed(r) == true)
+                       {
+                               AppLog("destFile is invalid[%ls]", destFile.GetPointer());
+                               continue;
+                       }
+                       destFile.SubString(0, pos, destDir);
+               }
 
                if (File::IsFileExist(destDir) == false)
                {
index f46ec79..e56a864 100755 (executable)
 
 #include "SignatureManager.h"
 
+#include <vcore/SignatureFinder.h>
+#include <vcore/SignatureData.h>
+#include <vcore/SignatureReader.h>
+#include <vcore/SignatureValidator.h>
+#include <vcore/WrtSignatureValidator.h>
+#include <vcore/VCore.h>
+
 using namespace Tizen::Base;
 using namespace Tizen::Security::Cert;
 using namespace Tizen::Base::Collection;
@@ -411,3 +418,84 @@ SignatureManager::AddAuthorRootCert(X509CertificatePath* pCertPath)
 CATCH:
        return ret;
 }
+
+bool
+SignatureManager::ValidateSignatures()
+{
+       AppLog("ValidateSignatures start >>");
+
+       TryReturn(__pContext, false, "__pContext is null.");
+
+       bool res = false;
+       res = ValidationCore::VCoreInit(
+                       std::string("/usr/share/wrt-engine/fingerprint_list.xml"),
+                       std::string("/usr/share/wrt-engine/fingerprint_list.xsd"),
+                       std::string("/opt/dbspace/.cert_svc_vcore.db"));
+       TryReturn(res, false, "ValidationCore::VCoreInit() is failed.");
+       TryReturn(__pContext->__rootPath.IsEmpty() == false, false, "__pContext->__rootPath is empty.");
+       fprintf(stderr, "  ## sValidationCore::VCoreInit() is done\n");
+
+       std::unique_ptr<char[]> pRootPath(_StringConverter::CopyToCharArrayN(__pContext->__rootPath));
+       TryReturn(pRootPath, false, "__pRootPath is null.");
+
+       std::string rootPath = pRootPath.get();
+       rootPath += "/";
+       AppLog("rootPath=[%s]", rootPath.c_str());
+
+       ValidationCore::SignatureFinder::Result findRes = ValidationCore::SignatureFinder::NO_ERROR;
+       ValidationCore::SignatureFinder signatureFinder(rootPath);
+       ValidationCore::SignatureFileInfoSet signatureFiles;
+
+       findRes = signatureFinder.find(signatureFiles);
+       TryReturn(findRes == ValidationCore::SignatureFinder::NO_ERROR , false, "signatureFinder.find() is failed, findRes=[%d]", (int)findRes);
+
+       fprintf(stderr, "  ## signatureFinder.find() is done\n");
+       ValidationCore::SignatureFileInfoSet::reverse_iterator iter = signatureFiles.rbegin();
+       for (; iter != signatureFiles.rend(); ++iter)
+       {
+               AppLog("SignatureFiles: name=[%s]", iter->getFileName().c_str());
+               AppLog("SignatureFiles: number=[%d]", iter->getFileNumber());
+               ValidationCore::SignatureData data(rootPath + iter->getFileName(), iter->getFileNumber());
+
+               try {
+                       ValidationCore::SignatureReader xml;
+                       xml.initialize(data, "/usr/share/wrt-engine/schema.xsd");
+                       xml.read(data);
+                       AppLog("ValidationCore::SignatureReader() done");
+                       fprintf(stderr, "  ## ValidationCore::SignatureReader() is done\n");
+
+//                     ValidationCore::CertificateList certList = data.getCertList();
+//                     ValidationCore::CertificateList::iterator it = certList.begin();
+//                     ValidationCore::CertificateList::iterator it_end = certList.end();
+//                     for (; it != it_end; it++)
+//                     {
+//                             std::string value = (*it)->getBase64();
+//                             AppLog("cert value=[%s]", value.c_str());
+//                     }
+
+                       ValidationCore::SignatureValidator::Result valRes = ValidationCore::SignatureValidator::SIGNATURE_VALID;
+                       ValidationCore::SignatureValidator::AppType appType = ValidationCore::SignatureValidator::TIZEN;
+                       ValidationCore::SignatureValidator validator(appType, false, false, false);
+
+                       AppLog("validator.check() start >>");
+                       fprintf(stderr, "  ## validator.check() start\n");
+
+                       valRes = validator.check(data, rootPath);
+                       TryReturn(valRes == ValidationCore::SignatureValidator::SIGNATURE_VERIFIED, false, "validator.check() is failed, valRes=[%d]", (int)valRes);
+                       fprintf(stderr, "  ## validator.check() done\n");
+                       AppLog("validator.check() done <<");
+                       fprintf(stderr, "  ## Signature validator.check success, name=[%s], number=[%d]\n", iter->getFileName().c_str(), iter->getFileNumber());
+               }
+               catch (ValidationCore::ParserSchemaException::Base)
+               {
+                       TryReturn(0, false, "ParserSchemaException::Base exception occurred.");
+               }
+               catch (DPL::Exception)
+               {
+                       TryReturn(0, false, "DPL::Exception exception occurred.");
+               }
+       }
+
+       AppLog("ValidateSignatures done successfully <<");
+       return true;
+}
old mode 100644 (file)
new mode 100755 (executable)
index 70fc7c7..81ca1cd
@@ -48,6 +48,7 @@ public:
        bool AddCert();
        bool VerifyChain();
        //bool VerifySignature();
+       bool ValidateSignatures();
 
 private:
        SignatureManager(const SignatureManager& value);
index 96b006a..0d9ac47 100755 (executable)
@@ -122,6 +122,10 @@ SignatureStep::OnStateSignerCert(void)
        ret = __pSignatureManager->SetSignature();
        TryCatch(ret == true, error = INSTALLER_ERROR_SIGNATURE_INVALID, "SetSignature() failed");
 
+       // test for signature validator
+       ret = __pSignatureManager->ValidateSignatures();
+       fprintf(stderr, "  ## __pSignatureManager->ValidateSignatures() result = [%d]\n", ret);
+
 CATCH:
        GoNextState();
        return error;
index 36680f9..9cd9074 100755 (executable)
@@ -725,6 +725,8 @@ InstallerUtil::GetRdsList(const PackageId& packageId, IList* pDeletedList, IList
 
        while (fgets(buffer, sizeof(buffer), fp) != null)
        {
+               bool isMetadata = false;
+
                if (buffer[0] == '#')
                {
                        if (strcasestr(buffer, INSTALLER_RDS_DELETE_STR))
@@ -739,6 +741,8 @@ InstallerUtil::GetRdsList(const PackageId& packageId, IList* pDeletedList, IList
                        {
                                state = INSTALLER_RDS_STATE_MODIFY;
                        }
+
+                       isMetadata = true;
                }
 
                if (state == INSTALLER_RDS_STATE_NONE)
@@ -755,6 +759,9 @@ InstallerUtil::GetRdsList(const PackageId& packageId, IList* pDeletedList, IList
                AppLog(".rds_delta: line(%03d)=[%ls]", line, pStr->GetPointer());
                line++;
 
+               if (isMetadata == true)
+                       continue;
+
                if (state == INSTALLER_RDS_STATE_DELETE)
                {
                        pDeletedList->Add(pStr.release());