From 030759357f01a09f15e703f145f838ce74eefd2e Mon Sep 17 00:00:00 2001 From: Soyoung Kim Date: Mon, 8 Jul 2013 21:23:56 +0900 Subject: [PATCH] Support Tizen app DRM [Issue#] N/A [Problem] N/A [Cause] N/A [Solution] Support Tizen DRM. [SCMRequest] N/A Change-Id: I80177ba3f4ed7cbd2a721519158fce9a7bd8fae8 --- src/jobs/widget_install/widget_unzip.cpp | 94 +++++++++++++++++++++++++++++++- src/jobs/widget_install/widget_unzip.h | 5 +- 2 files changed, 95 insertions(+), 4 deletions(-) diff --git a/src/jobs/widget_install/widget_unzip.cpp b/src/jobs/widget_install/widget_unzip.cpp index df96243..5605ec2 100644 --- a/src/jobs/widget_install/widget_unzip.cpp +++ b/src/jobs/widget_install/widget_unzip.cpp @@ -30,10 +30,13 @@ #include #include #include +#include using namespace WrtDB; namespace { +const char *const DRM_LIB_PATH = "/usr/lib/libdrm-service-core-tizen.so"; + struct PathAndFilePair { std::string path; @@ -145,10 +148,95 @@ void WidgetUnzip::unzipProgress(const std::string &destination) } } -std::string WidgetUnzip::decryptDrmPackage(const std::string &source) +bool WidgetUnzip::isDRMPackage(const std::string &source) +{ + LogDebug("Enter : isDRMPackage()"); + int ret = 0; + void* pHandle = NULL; + char* pErrorMsg = NULL; + int (*drm_oem_sapps_is_drm_file)(const char* pDcfPath, int dcfPathLen); + + pHandle = dlopen(DRM_LIB_PATH, RTLD_LAZY | RTLD_GLOBAL); + if (!pHandle) { + LogError("dlopen failed : " << source << " [" << dlerror() << "]"); + return false; + } + + drm_oem_sapps_is_drm_file = reinterpret_cast + (dlsym(pHandle, "drm_oem_sapps_is_drm_file")); + pErrorMsg = dlerror(); + if ((pErrorMsg != NULL) || (drm_oem_sapps_is_drm_file == NULL)) { + LogError("dlopen failed : " << source << " [" << dlerror() << "]"); + dlclose(pHandle); + return false; + } + + ret = drm_oem_sapps_is_drm_file(source.c_str(), source.length()); + dlclose(pHandle); + if (1 == ret) { + LogInfo(source << " is DRM file"); + return true; + } + LogInfo(source << " isn't DRM file"); + return false; +} + +bool WidgetUnzip::decryptDRMPackage(const std::string &source, const std::string + &decryptedSource) +{ + LogDebug("Enter : decryptDRMPackage()"); + int ret = 0; + void* pHandle = NULL; + char* pErrorMsg = NULL; + int (*drm_oem_sapps_decrypt_package)(const char* pDcfPath, int dcfPathLen, + const char* pDecryptedFile, int decryptedFileLen); + + pHandle = dlopen(DRM_LIB_PATH, RTLD_LAZY | RTLD_GLOBAL); + if (!pHandle) { + LogError("dlopen failed : " << source << " [" << dlerror() << "]"); + return false; + } + + drm_oem_sapps_decrypt_package = reinterpret_cast + (dlsym(pHandle, "drm_oem_sapps_decrypt_package")); + pErrorMsg = dlerror(); + if ((pErrorMsg != NULL) || (drm_oem_sapps_decrypt_package == NULL)) { + LogError("dlopen failed : " << source << " [" << dlerror() << "]"); + dlclose(pHandle); + return false; + } + + ret = drm_oem_sapps_decrypt_package(source.c_str(), source.length(), + decryptedSource.c_str(), decryptedSource.length()); + dlclose(pHandle); + if (1 == ret) { + LogInfo(source << " is decrypted : " << decryptedSource); + return true; + } + return false; +} + +std::string WidgetUnzip::getDecryptedPackage(const std::string &source) { LogInfo("Check DRM..."); - // TODO : check drm + if (isDRMPackage(source)) { + std::string decryptedFile; + size_t found = source.find_last_of(".wgt"); + if (found == std::string::npos) { + decryptedFile += source + "_tmp.wgt"; + } else { + decryptedFile += source.substr(0, source.find_last_not_of(".wgt") + + 1) + "_tmp.wgt"; + } + + LogDebug("decrypted file name : " << decryptedFile); + if (decryptDRMPackage(source, decryptedFile)) { + LogError("Failed decrypt drm file"); + ThrowMsg(Exceptions::DrmDecryptFailed, source); + } + return decryptedFile; + } return source; } @@ -158,7 +246,7 @@ void WidgetUnzip::unzipWgtFile(const std::string &source, const std::string &des std::string wgtFile; Try { - wgtFile = decryptDrmPackage(source); + wgtFile = getDecryptedPackage(source); LogDebug("wgtFile : " << wgtFile); m_zip.reset(new DPL::ZipInput(wgtFile)); diff --git a/src/jobs/widget_install/widget_unzip.h b/src/jobs/widget_install/widget_unzip.h index 77a0b57..25e1293 100644 --- a/src/jobs/widget_install/widget_unzip.h +++ b/src/jobs/widget_install/widget_unzip.h @@ -41,7 +41,10 @@ class WidgetUnzip void unzipProgress(const std::string &destination); void ExtractFile(DPL::ZipInput::File *input, const std::string &destFileName); - std::string decryptDrmPackage(const std::string &source); + bool isDRMPackage(const std::string &source); + bool decryptDRMPackage(const std::string &source, const std::string + &decryptedSource); + std::string getDecryptedPackage(const std::string &source); }; -- 2.7.4