#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"
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)
AppLogTag(OSP_SECURITY_SERVICE, "Leaved.");
}
+
result
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.");
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;
}
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)
{