Revert "Implement seperated server-so model"
authorHongbin Min <hb.min@samsung.com>
Mon, 25 Mar 2013 04:23:23 +0000 (13:23 +0900)
committerGerrit Code Review <gerrit2@kim11>
Mon, 25 Mar 2013 04:23:23 +0000 (13:23 +0900)
This reverts commit aadad7b8afc249bfe6a014425fed46ebafc4e2a0

inc/PrivilegeService.h
src/PrivilegeService.cpp

index c6c9607..16b1ad8 100644 (file)
@@ -67,6 +67,10 @@ public:
        bool RetrievePrivilege(Tizen::Base::String* pEncryptedBitwise, Tizen::Base::String* pHmac, Tizen::Base::Collection::ArrayList* pPrivilegeList, result* pRes);
        bool RetrieveVisibility(Tizen::Base::String* pEncryptedVisibility, Tizen::Base::String* pHmac, result* pRes);
 
+       result GenerateVisibilityString(Tizen::App::AppId appId, Tizen::Base::String* pEncryptedVisibility, Tizen::Base::String* pHmac);
+       result GetEncryptedVisibility(int visibility, Tizen::Base::String& encryptedVisibility);
+       result GetChecksum(Tizen::App::AppId appId, int visibility, Tizen::Base::String& checksum);
+
 private:
        Tizen::Io::_IpcServer* __pIpcServer;
 }; // PrivilegeService
index 74f6cc2..92c73af 100644 (file)
 #include <FIo_IIpcServerEventListener.h>
 #include <FIo_IpcCommonDataTypes.h>
 #include <FBaseSysLog.h>
-#include <FSec_PrivilegeManagerServer.h>
+#include <FSec_PrivilegeManager.h>
 #include <FSec_PrivilegeManagerMessage.h>
 #include <FAppPkg_PackageInfoImpl.h>
+#include <FSecCryptoAesCipher.h>
+#include <FSecCryptoSha1Hmac.h>
+#include <FBase_StringConverter.h>
+#include <FBaseInternalTypes.h>
+#include <FSec_DeviceKeyGenerator.h>
 
 #include "PrivilegeService.h"
 
@@ -38,6 +43,8 @@ using namespace Tizen::App::Package;
 using namespace Tizen::Io;
 using namespace Tizen::Base::Collection;
 using namespace Tizen::Security;
+using namespace Tizen::Security::Crypto;
+using namespace Tizen::Base::Utility;
 
 PrivilegeService::PrivilegeService(void)
        : __pIpcServer(null)
@@ -54,6 +61,7 @@ PrivilegeService::~PrivilegeService(void)
        AppLogTag(OSP_SECURITY_SERVICE, "Leaved.");
 }
 
+
 result
 PrivilegeService::Construct(void)
 {
@@ -64,7 +72,7 @@ PrivilegeService::Construct(void)
        __pIpcServer = new (std::nothrow) _IpcServer();
        TryReturnResultTag(OSP_SECURITY_SERVICE, __pIpcServer != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
 
-       r = __pIpcServer->Construct("osp.security.ipcserver.privilegemanager", *this, false);
+       r = __pIpcServer->Construct("osp.security.ipcserver.privilegemanager", *this);
        TryReturnResultTag(OSP_SECURITY_SERVICE, r == E_SUCCESS, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
 
        AppLogTag(OSP_SECURITY_SERVICE, "Leaved.");
@@ -98,10 +106,35 @@ PrivilegeService::OnIpcClientDisconnected(const _IpcServer&server, int clientId)
 bool
 PrivilegeService::RetrievePrivilege(String* pEncryptedBitwise, String* pHmac, ArrayList* pPrivilegeList, result* pRes)
 {
+       String encryptedBitwise;
+       String hmac;
        AppId appId;
+       ArrayList* pPrivilegeStringList = null;
+
        __pIpcServer->GetClientAppId().SubString(0, MAX_APP_ID_SIZE, appId);
 
-       *pRes = _PrivilegeManagerServer::RetrievePrivilege(appId, pEncryptedBitwise, pHmac, pPrivilegeList);
+       *pRes = _PrivilegeManager::RetrieveCipherPrivilegeExN(appId, encryptedBitwise, hmac, pPrivilegeStringList);
+       if (*pRes == E_SUCCESS)
+       {
+               pEncryptedBitwise->Append(encryptedBitwise);
+               pHmac->Append(hmac);
+
+               if (pPrivilegeStringList != null)
+               {
+                       IEnumerator* pEnum = null;
+                       pEnum = pPrivilegeStringList->GetEnumeratorN();
+                       while (pEnum->MoveNext() == E_SUCCESS)
+                       {
+                               String* tempString = static_cast<String*>(pEnum->GetCurrent());
+                               pPrivilegeList->Add(new String(*tempString));
+                       }
+
+                       delete pEnum;
+
+                       pPrivilegeStringList->RemoveAll(true);
+                       delete pPrivilegeStringList;
+               }
+       }
 
        return true;
 }
@@ -109,14 +142,163 @@ PrivilegeService::RetrievePrivilege(String* pEncryptedBitwise, String* pHmac, Ar
 bool
 PrivilegeService::RetrieveVisibility(String* pEncryptedVisibility, String* pHmac, result* pRes)
 {
+       String encryptedVisibility;
+       String hmac;
        AppId appId;
+
        __pIpcServer->GetClientAppId().SubString(0, MAX_APP_ID_SIZE, appId);
 
-       *pRes = _PrivilegeManagerServer::GenerateVisibilityString(appId, pEncryptedVisibility, pHmac);
+       *pRes = GenerateVisibilityString(appId, pEncryptedVisibility, pHmac);
 
        return true;
 }
 
+result
+PrivilegeService::GenerateVisibilityString(AppId appId, String* pEncryptedVisibility, String* pHmac)
+{
+       _PackageInfoImpl infoImpl;
+       result r = E_SUCCESS;
+       int visibility = 0;
+
+       String encryptedVisibility;
+       String checksum;
+
+       r = infoImpl.Construct(appId);
+       if (r == E_PKG_NOT_INSTALLED)
+       {
+               AppLogExceptionTag(OSP_SECURITY_SERVICE, "[E_DATA_NOT_FOUND] The privilege information does not exist.");
+               return E_DATA_NOT_FOUND;
+       }
+       TryReturnTag(OSP_SECURITY_SERVICE, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+
+       visibility = infoImpl.GetApiVisibility();
+       TryReturnTag(OSP_SECURITY_SERVICE, visibility >= 0, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+
+       r = GetEncryptedVisibility(visibility, encryptedVisibility);
+       TryReturnTag(OSP_SECURITY_SERVICE, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+
+       r = GetChecksum(appId, visibility, checksum);
+       TryReturnTag(OSP_SECURITY_SERVICE, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+
+       pEncryptedVisibility->Append(encryptedVisibility);
+       pHmac->Append(checksum);
+
+       return r;
+}
+
+result
+PrivilegeService::GetEncryptedVisibility(int visibility, String& encryptedVisibility)
+{
+       result r = E_SUCCESS;
+       ISecretKey* pKey = null;
+       ByteBuffer ivByte;
+       ByteBuffer* pEncryptedVisibility = null;
+       ByteBuffer* pTempVisibility = null;
+       AesCipher cipherEnc;
+       const byte ivector[_IV_LEN] = { 0x3E, 0xB5, 0x01, 0x45, 0xE4, 0xF8, 0x75, 0x3F, 0x08, 0x9D, 0x9F, 0x57, 0x3B, 0x63, 0xEF, 0x4B};
+
+       pTempVisibility = new (std::nothrow) ByteBuffer();
+       TryReturnTag(OSP_SECURITY_SERVICE, pTempVisibility != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
+
+       r = pTempVisibility->Construct(sizeof(int));
+       TryCatchResultTag(OSP_SECURITY_SERVICE, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+
+       r = ivByte.Construct(_IV_LEN);
+       TryCatchResultTag(OSP_SECURITY_SERVICE, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+
+       r = ivByte.SetArray(ivector, 0, _IV_LEN);
+       TryCatchResultTag(OSP_SECURITY_SERVICE, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+       ivByte.Flip();
+
+       r = pTempVisibility->SetArray((byte*)(&visibility), 0, sizeof(int));
+       TryCatchResultTag(OSP_SECURITY_SERVICE, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+       pTempVisibility->Flip();
+
+       r = cipherEnc.Construct(L"CBC/128/PKCS7PADDING", CIPHER_ENCRYPT);
+       TryCatchResultTag(OSP_SECURITY_SERVICE, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+
+       pKey = _DeviceKeyGenerator::GenerateDeviceKeyN(_KEY_LEN);
+       TryCatchResultTag(OSP_SECURITY_SERVICE, pKey != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+
+       r = cipherEnc.SetKey(*pKey);
+       TryCatchResultTag(OSP_SECURITY_SERVICE, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+
+       r = cipherEnc.SetInitialVector(ivByte);
+       TryCatchResultTag(OSP_SECURITY_SERVICE, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+
+       pEncryptedVisibility = cipherEnc.EncryptN(*pTempVisibility);
+       TryCatchResultTag(OSP_SECURITY_SERVICE, pTempVisibility != null, r = E_SYSTEM, E_SYSTEM,
+                          "[E_SYSTEM] An unexpected system error occurred.");
+
+       r = StringUtil::EncodeToBase64String(*pEncryptedVisibility, encryptedVisibility);
+       TryCatchResultTag(OSP_SECURITY_SERVICE, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+
+       // fall through
+
+CATCH:
+
+       delete pTempVisibility;
+       delete pKey;
+       delete pEncryptedVisibility;
+
+       return r;
+}
+
+result
+PrivilegeService::GetChecksum(AppId appId, int visibility, String& checksum)
+{
+       result r = E_SUCCESS;
+       byte tempChecksumString[sizeof(int) + MAX_APP_ID_SIZE];
+
+       ISecretKey* pKey = null;
+       ByteBuffer ivByte;
+       ByteBuffer input;
+       IHmac* pHmac = null;
+       ByteBuffer* pChecksumByteBuffer = null;
+       char* pAppId = null;
+
+       pAppId = (char*) _StringConverter::CopyToCharArrayN(appId);
+       TryCatchResultTag(OSP_SECURITY_SERVICE, pAppId != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+
+       memcpy(tempChecksumString, pAppId, MAX_APP_ID_SIZE);
+       memcpy(tempChecksumString + MAX_APP_ID_SIZE, (byte*)(&visibility), sizeof(int));
+
+       delete[] pAppId;
+       pAppId = null;
+
+       r = input.Construct(MAX_APP_ID_SIZE + sizeof(int));
+       TryCatchResultTag(OSP_SECURITY_SERVICE, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+
+       r = input.SetArray(tempChecksumString, 0, MAX_APP_ID_SIZE + sizeof(int));
+       TryCatchResultTag(OSP_SECURITY_SERVICE, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+       input.Flip();
+
+       pHmac = new (std::nothrow) Sha1Hmac();
+       TryCatchResultTag(OSP_SECURITY_SERVICE, pHmac != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
+
+       pKey = _DeviceKeyGenerator::GenerateDeviceKeyN(_KEY_LEN);
+       TryCatchResultTag(OSP_SECURITY_SERVICE, pKey != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+
+       r = pHmac->SetKey(*pKey);
+       TryCatchResultTag(OSP_SECURITY_SERVICE, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+
+       pChecksumByteBuffer = pHmac->GetHmacN(input);
+       TryCatchResultTag(OSP_SECURITY_SERVICE, pChecksumByteBuffer != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+
+       r = StringUtil::EncodeToBase64String(*pChecksumByteBuffer, checksum);
+       TryCatchResultTag(OSP_SECURITY_SERVICE, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
+
+       // fall through
+
+CATCH:
+
+       delete pKey;
+       delete pHmac;
+       delete pChecksumByteBuffer;
+
+       return r;
+}
+
 void
 PrivilegeService::OnIpcRequestReceived(_IpcServer& server, const IPC::Message& message)
 {