2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FSec_PrivilegeManagerInfo.cpp
20 * @brief This is the implementation for the Privilege Information class.
23 #include <unique_ptr.h>
25 #include <FBaseSysLog.h>
26 #include <FBase_StringConverter.h>
27 #include <FBaseString.h>
28 #include <FAppPkg_PackageInfoImpl.h>
29 #include <FSecCryptoAesCipher.h>
30 #include <FSecCryptoSha1Hmac.h>
31 #include <FSecCryptoSha1Hash.h>
32 #include <FBaseColArrayList.h>
34 #include "FSec_DeviceKeyGenerator.h"
35 #include "FSec_PrivilegeInfo.h"
37 using namespace Tizen::App;
38 using namespace Tizen::App::Package;
39 using namespace Tizen::Base;
40 using namespace Tizen::Base::Collection;
41 using namespace Tizen::Base::Utility;
42 using namespace Tizen::Security::Crypto;
43 using namespace Tizen::Text;
45 namespace Tizen { namespace Security
48 _PrivilegeInfo::_PrivilegeInfo(void)
50 memset(__bitwisePrivilege, 0, MAX_BITWISE_PRIV_SIZE);
55 _PrivilegeInfo::~_PrivilegeInfo(void)
57 __privilegeList.RemoveAll(true);
61 _PrivilegeInfo::Construct(const AppId& appId, const byte* pBitwisePrivilege, const ArrayList* pPrivilegeList)
65 SysTryReturnResult(NID_SEC, (pBitwisePrivilege != null), E_INVALID_ARG, "One of the argument is invalid.");
66 SysTryReturnResult(NID_SEC,
67 appId.GetLength() > 0 && appId.GetLength() == MAX_APP_ID_SIZE, E_INVALID_ARG,
68 "One of the argument is invalid.");
70 // Set base length of privilege information to max
71 __bitwiseLength = MAX_BITWISE_PRIV_SIZE;
74 memcpy(__bitwisePrivilege, pBitwisePrivilege, __bitwiseLength);
77 std::unique_ptr<IEnumerator> pEnum(null);
78 r = __privilegeList.Construct();
79 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
81 pEnum.reset(pPrivilegeList->GetEnumeratorN());
82 SysTryReturnResult(NID_SEC, pEnum != null, E_SYSTEM, "An unexpected system error occurred.");
84 while (pEnum->MoveNext() == E_SUCCESS)
86 String* tempString = static_cast< String* >(pEnum->GetCurrent());
87 __privilegeList.Add(new String(*tempString));
94 _PrivilegeInfo::Construct(const AppId& appId, const String& encryptedPrivileges, const String& checksum, const ArrayList* pPrivilegeList)
97 byte* pDecrytpedBitwisePrivilege = null;
99 std::unique_ptr<ByteBuffer> pBitwisePrivilege(null);
100 _PackageInfoImpl infoImpl;
102 SysTryReturnResult(NID_SEC,
103 appId.GetLength() > 0 && appId.GetLength() == MAX_APP_ID_SIZE, E_INVALID_ARG,
104 "One of the argument is invalid.");
105 SysTryReturnResult(NID_SEC, encryptedPrivileges.GetLength() > 0, E_INVALID_ARG, "One of the argument is invalid.");
106 SysTryReturnResult(NID_SEC, checksum.GetLength() > 0, E_INVALID_ARG, "One of the argument is invalid.");
108 pBitwisePrivilege.reset(StringUtil::DecodeBase64StringN(encryptedPrivileges));
109 SysTryReturnResult(NID_SEC, pBitwisePrivilege != null, E_SYSTEM, "An unexpected system error occurred.");
111 pDecrytpedBitwisePrivilege = const_cast <byte*>(pBitwisePrivilege->GetPointer());
112 SysTryReturnResult(NID_SEC, pDecrytpedBitwisePrivilege != null, E_SYSTEM, "An unexpected system error occurred.");
114 r = VerifyIntegrity(appId, pDecrytpedBitwisePrivilege, checksum, pBitwisePrivilege->GetLimit());
115 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_INVALID_ARG, "The checksum is abnormal.");
117 // Set base length of privilege information
118 __bitwiseLength = pBitwisePrivilege->GetLimit();
120 memcpy(__bitwisePrivilege, pDecrytpedBitwisePrivilege, __bitwiseLength);
123 r = infoImpl.Construct(appId);
124 if (r == E_APP_NOT_INSTALLED)
126 SysLogException(NID_SEC, E_DATA_NOT_FOUND, "[E_DATA_NOT_FOUND] The package information does not exist.");
127 return E_DATA_NOT_FOUND;
129 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
131 __apiVisibility = infoImpl.GetApiVisibility();
132 SysTryReturnResult(NID_SEC, __apiVisibility >= 0, E_SYSTEM, "An unexpected system error occurred.");
134 std::unique_ptr<IEnumerator> pEnum(null);
135 r = __privilegeList.Construct();
136 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
138 pEnum.reset(pPrivilegeList->GetEnumeratorN());
139 SysTryReturnResult(NID_SEC, pEnum != null, E_SYSTEM, "An unexpected system error occurred.");
141 while (pEnum->MoveNext() == E_SUCCESS)
143 String* tempString = static_cast< String* >(pEnum->GetCurrent());
144 __privilegeList.Add(new String(*tempString));
151 _PrivilegeInfo::Construct(const AppId& appId, const String& encryptedPrivileges, const String& checksum, const String& encryptedVisibiliity, const String& visibilityChecksum, const ArrayList* pPrivilegeList)
153 result r = E_SUCCESS;
154 byte* pDecrytpedBitwisePrivilege = null;
158 std::unique_ptr<ISecretKey> pKey(null);
159 std::unique_ptr<ByteBuffer> pEncryptedBitwisePrivilege(null);
160 std::unique_ptr<ByteBuffer> pBitwisePrivilege(null);
161 std::unique_ptr<ByteBuffer> pEncryptedVisibility(null);
162 std::unique_ptr<ByteBuffer> pVisibility(null);
164 _PackageInfoImpl infoImpl;
165 const byte ivector[_IV_LEN] =
167 0x3E, 0xB5, 0x01, 0x45, 0xE4, 0xF8, 0x75, 0x3F,
168 0x08, 0x9D, 0x9F, 0x57, 0x3B, 0x63, 0xEF, 0x4B
171 SysTryReturnResult(NID_SEC,
172 appId.GetLength() > 0 && appId.GetLength() == MAX_APP_ID_SIZE, E_INVALID_ARG,
173 "One of the argument is invalid.");
174 SysTryReturnResult(NID_SEC, encryptedPrivileges.GetLength() > 0, E_INVALID_ARG, "One of the argument is invalid.");
175 SysTryReturnResult(NID_SEC, checksum.GetLength() > 0, E_INVALID_ARG, "One of the argument is invalid.");
177 pEncryptedBitwisePrivilege.reset(StringUtil::DecodeBase64StringN(encryptedPrivileges));
178 SysTryReturnResult(NID_SEC, pEncryptedBitwisePrivilege != null, E_SYSTEM, "An unexpected system error occurred.");
180 pEncryptedVisibility.reset(StringUtil::DecodeBase64StringN(encryptedVisibiliity));
181 SysTryReturnResult(NID_SEC, pEncryptedVisibility != null, E_SYSTEM, "An unexpected system error occurred.");
183 r = ivByte.Construct(_IV_LEN);
184 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
186 r = ivByte.SetArray(ivector, 0, _IV_LEN);
187 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
190 r = cipherDec.Construct(L"CBC/128/PKCS7PADDING", CIPHER_DECRYPT);
191 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
193 pKey.reset(_DeviceKeyGenerator::GenerateDeviceKeyN(_KEY_LEN));
194 SysTryReturnResult(NID_SEC, pKey != null, E_SYSTEM, "An unexpected system error occurred.");
196 r = cipherDec.SetKey(*pKey.get());
197 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
199 r = cipherDec.SetInitialVector(ivByte);
200 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
202 pBitwisePrivilege.reset(cipherDec.DecryptN(*pEncryptedBitwisePrivilege.get()));
203 SysTryReturnResult(NID_SEC, pBitwisePrivilege != null, E_SYSTEM, "An unexpected system error occurred.");
205 pVisibility.reset(cipherDec.DecryptN(*pEncryptedVisibility.get()));
206 SysTryReturnResult(NID_SEC, pBitwisePrivilege != null, E_SYSTEM, "An unexpected system error occurred.");
208 pDecrytpedBitwisePrivilege = const_cast <byte*>(pBitwisePrivilege->GetPointer());
209 SysTryReturnResult(NID_SEC, pDecrytpedBitwisePrivilege != null, E_SYSTEM, "An unexpected system error occurred.");
211 visibility = static_cast<int>(*(pVisibility->GetPointer()));
213 r = VerifyIntegrity(appId, pDecrytpedBitwisePrivilege, checksum, pBitwisePrivilege->GetLimit(), visibility, visibilityChecksum);
214 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_INVALID_ARG, "The checksum is abnormal.");
216 // Set base length of privilege information
217 __bitwiseLength = pBitwisePrivilege->GetLimit();
219 memcpy(__bitwisePrivilege, pDecrytpedBitwisePrivilege, __bitwiseLength);
222 __apiVisibility = visibility;
224 std::unique_ptr<IEnumerator> pEnum(null);
225 r = __privilegeList.Construct();
226 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
228 pEnum.reset(pPrivilegeList->GetEnumeratorN());
229 SysTryReturnResult(NID_SEC, pEnum != null, E_SYSTEM, "An unexpected system error occurred.");
231 while (pEnum->MoveNext() == E_SUCCESS)
233 String* tempString = static_cast< String* >(pEnum->GetCurrent());
234 __privilegeList.Add(new String(*tempString));
242 _PrivilegeInfo::CloneN(void) const
244 _PrivilegeInfo* pPrivilegeInfo = null;
245 result r = E_SUCCESS;
249 pPrivilegeInfo = new (std::nothrow) _PrivilegeInfo();
250 SysTryReturn(NID_SEC, pPrivilegeInfo != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
252 pPrivilegeInfo->__bitwiseLength = this->__bitwiseLength;
254 pPrivilegeInfo->__appId.Clear();
255 pPrivilegeInfo->__appId.Append(this->__appId);
256 memcpy(pPrivilegeInfo->__bitwisePrivilege, this->__bitwisePrivilege, pPrivilegeInfo->__bitwiseLength);
258 std::unique_ptr<IEnumerator> pEnum(null);
259 r = pPrivilegeInfo->__privilegeList.Construct();
260 SysTryReturn(NID_SEC, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
262 pEnum.reset(this->__privilegeList.GetEnumeratorN());
263 SysTryReturn(NID_SEC, pEnum != null, null, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
265 while (pEnum->MoveNext() == E_SUCCESS)
267 String* tempString = static_cast< String* >(pEnum->GetCurrent());
268 pPrivilegeInfo->__privilegeList.Add(new String(*tempString));
271 return pPrivilegeInfo;
275 _PrivilegeInfo::Construct(const _PrivilegeInfo& privilegeInfo)
277 result r = E_SUCCESS;
279 SysTryReturnResult(NID_SEC, privilegeInfo.__appId.GetLength() > 0 && privilegeInfo.__appId.GetLength() == MAX_APP_ID_SIZE, E_INVALID_ARG, "The argument is invalid.");
281 __bitwiseLength = privilegeInfo.__bitwiseLength;
283 __appId = privilegeInfo.__appId;
284 memcpy(__bitwisePrivilege, privilegeInfo.__bitwisePrivilege, __bitwiseLength);
286 __apiVisibility = privilegeInfo.__apiVisibility;
288 __privilegeList.Construct();
290 IEnumerator* pEnum = privilegeInfo.__privilegeList.GetEnumeratorN();
291 while (pEnum->MoveNext() == E_SUCCESS)
293 String* tempString = static_cast< String* >(pEnum->GetCurrent());
294 __privilegeList.Add(new String(*tempString));
302 _PrivilegeInfo::GetAppId(void) const
308 _PrivilegeInfo::GetBitwisePrivilegeN(byte*& pBitwisePrivilege) const
310 byte* pReturn = null;
311 result r = E_SUCCESS;
313 pReturn = (byte*) malloc(sizeof(byte) * MAX_BITWISE_PRIV_SIZE);
314 SysTryReturnResult(NID_SEC, pReturn != null, E_OUT_OF_MEMORY, "Memory allocation is failed.");
315 memcpy(pReturn, __bitwisePrivilege, MAX_BITWISE_PRIV_SIZE);
317 pBitwisePrivilege = pReturn;
323 _PrivilegeInfo::GetEncryptedBitwise(String& encryptedPrivileges) const
325 result r = E_SUCCESS;
327 std::unique_ptr<ISecretKey> pKey(null);
328 std::unique_ptr<ByteBuffer> pEncryptedBitwisePrivilege(null);
329 std::unique_ptr<ByteBuffer> pBitwisePrivilege(null);
331 const byte ivector[_IV_LEN] = { 0x3E, 0xB5, 0x01, 0x45, 0xE4, 0xF8, 0x75, 0x3F, 0x08, 0x9D, 0x9F, 0x57, 0x3B, 0x63, 0xEF, 0x4B};
333 pBitwisePrivilege.reset(new (std::nothrow) ByteBuffer());
334 SysTryReturnResult(NID_SEC, pBitwisePrivilege != null, E_OUT_OF_MEMORY, "Memory allocation is failed.");
336 r = pBitwisePrivilege->Construct(__bitwiseLength);
337 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
339 r = ivByte.Construct(_IV_LEN);
340 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
342 r = ivByte.SetArray(ivector, 0, _IV_LEN);
343 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
346 r = pBitwisePrivilege->SetArray(__bitwisePrivilege, 0, __bitwiseLength);
347 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
348 pBitwisePrivilege->Flip();
350 r = cipherEnc.Construct(L"CBC/128/PKCS7PADDING", CIPHER_ENCRYPT);
351 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
353 pKey.reset(_DeviceKeyGenerator::GenerateDeviceKeyN(_KEY_LEN));
354 SysTryReturnResult(NID_SEC, pKey != null, E_SYSTEM, "An unexpected system error occurred.");
356 r = cipherEnc.SetKey(*(pKey.get()));
357 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
359 r = cipherEnc.SetInitialVector(ivByte);
360 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
362 pEncryptedBitwisePrivilege.reset(cipherEnc.EncryptN(*(pBitwisePrivilege.get())));
363 SysTryReturnResult(NID_SEC, pEncryptedBitwisePrivilege != null, E_SYSTEM, "An unexpected system error occurred.");
365 r = StringUtil::EncodeToBase64String(*(pEncryptedBitwisePrivilege.get()), encryptedPrivileges);
366 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
372 _PrivilegeInfo::GetChecksum(String& checksum) const
374 result r = E_SUCCESS;
375 byte tempChecksumString[MAX_BITWISE_PRIV_SIZE + MAX_APP_ID_SIZE];
379 std::unique_ptr<ISecretKey> pKey(null);
380 std::unique_ptr<IHmac> pHmac(null);
381 std::unique_ptr<ByteBuffer> pChecksumByteBuffer(null);
382 std::unique_ptr<char[]> pAppId(null);
384 pAppId.reset(_StringConverter::CopyToCharArrayN(__appId));
385 SysTryReturnResult(NID_SEC, pAppId != null, E_SYSTEM, "An unexpected system error occurred.");
387 memcpy(tempChecksumString, pAppId.get(), MAX_APP_ID_SIZE);
388 memcpy(tempChecksumString + MAX_APP_ID_SIZE, __bitwisePrivilege, __bitwiseLength);
392 r = input.Construct(MAX_APP_ID_SIZE + __bitwiseLength);
393 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
395 r = input.SetArray(tempChecksumString, 0, MAX_APP_ID_SIZE + __bitwiseLength);
396 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
399 pHmac.reset(new (std::nothrow) Sha1Hmac());
400 SysTryReturnResult(NID_SEC, pHmac != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
402 pKey.reset(_DeviceKeyGenerator::GenerateDeviceKeyN(_KEY_LEN));
403 SysTryReturnResult(NID_SEC, pKey != null, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
405 r = pHmac->SetKey(*(pKey.get()));
406 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
408 pChecksumByteBuffer.reset(pHmac->GetHmacN(input));
409 SysTryReturnResult(NID_SEC, pChecksumByteBuffer != null, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
411 r = StringUtil::EncodeToBase64String(*(pChecksumByteBuffer.get()), checksum);
412 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
418 _PrivilegeInfo::HasPrivilege(_Privilege privilege) const
421 int targetIndex = static_cast< int >(privilege) / _BITS_IN_BYTE;
422 byte privilegeBit = (byte) (static_cast< int >(privilege) % _BITS_IN_BYTE);
423 byte bitwiseTargetPrivilege = 0;
424 byte tempBitwisePrivilege = 0;
426 if (__apiVisibility != _API_VISIBILITY_NONE) // To be removed
428 if (visibilityLevelListTable[privilege][_PRV_API_VER_2_0] > __apiVisibility)
430 SysLog(NID_SEC, "Result : FALSE [Visibility]");
435 bitwiseTargetPrivilege = bitwiseTargetPrivilege | (1 << privilegeBit);
436 tempBitwisePrivilege = __bitwisePrivilege[targetIndex] & bitwiseTargetPrivilege;
438 if (bitwiseTargetPrivilege == tempBitwisePrivilege)
440 SysLog(NID_SEC, "Result : TRUE");
445 SysLogException(NID_SEC, E_PRIVILEGE_DENIED, "Result : FALSE [%ls, %ls]", __appId.GetPointer(), privilegeListTable[privilege].privilegeString);
452 _PrivilegeInfo::HasPrivilegeEx(_Privilege privilege) const
455 int targetIndex = static_cast< int >(privilege) / _BITS_IN_BYTE;
456 byte privilegeBit = (byte) (static_cast< int >(privilege) % _BITS_IN_BYTE);
457 byte bitwiseTargetPrivilege = 0;
458 byte tempBitwisePrivilege = 0;
460 if (__apiVisibility != _API_VISIBILITY_NONE) // To be removed
462 if (visibilityLevelListTable[privilege][_PRV_API_VER_2_0] > __apiVisibility)
468 bitwiseTargetPrivilege = bitwiseTargetPrivilege | (1 << privilegeBit);
469 tempBitwisePrivilege = __bitwisePrivilege[targetIndex] & bitwiseTargetPrivilege;
471 if (bitwiseTargetPrivilege == tempBitwisePrivilege)
473 SysLog(NID_SEC, "Result : TRUE");
481 _PrivilegeInfo::HasPrivilege(const String& privilege) const
484 bool validStringFlag = false;
485 int privilegeEnum = -1;
488 String privilegeURI = L"http://tizen.org/privilege/";
489 String privilegeSubString;
490 String privilegeSubStringURI;
491 privilege.SubString(0, privilegeURI.GetLength(), privilegeSubStringURI);
493 if (privilegeSubStringURI.Equals(privilegeURI, true))
495 privilege.SubString(privilegeURI.GetLength(), privilege.GetLength() - privilegeURI.GetLength(), privilegeSubString);
496 for (index = 0; index < _MAX_PRIVILEGE_ENUM; index++)
498 if (wcscmp(privilegeListTable[index].privilegeString, privilegeSubString.GetPointer()) == 0)
500 validStringFlag = true;
501 privilegeEnum = index;
509 ret = HasPrivilege(privilegeListTable[index].privilege);
514 ret = __privilegeList.Contains(privilege);
517 SysLog(NID_SEC, "Result : TRUE");
521 SysLogException(NID_SEC, E_PRIVILEGE_DENIED, "Result : FALSE [%ls, %ls]", __appId.GetPointer(), privilege.GetPointer());
529 _PrivilegeInfo::VerifyIntegrity(const AppId& appId, const byte* targetBitwisePrivilege, const Tizen::Base::String& storedChecksum, int length)
531 result r = E_SUCCESS;
532 bool verifyResult = false;
533 byte tempChecksumString[MAX_BITWISE_PRIV_SIZE + MAX_APP_ID_SIZE];
534 String base64EncodedChecksum;
536 std::unique_ptr<IHash> pHash(null);
537 std::unique_ptr<ByteBuffer> pChecksumByteBuffer(null);
538 std::unique_ptr<char> pAppId(null);
540 SysTryReturnResult(NID_SEC, length <= MAX_BITWISE_PRIV_SIZE, E_INVALID_ARG, "The privilege information of %ls is invalid.", appId.GetPointer());
542 pAppId.reset(_StringConverter::CopyToCharArrayN(appId));
543 SysTryReturnResult(NID_SEC, pAppId != null, E_SYSTEM, "An unexpected system error occurred.");
545 memcpy(tempChecksumString, pAppId.get(), MAX_APP_ID_SIZE);
546 memcpy(tempChecksumString + MAX_APP_ID_SIZE, targetBitwisePrivilege, length);
550 r = input.Construct(MAX_APP_ID_SIZE + length);
551 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
553 r = input.SetArray(tempChecksumString, 0, MAX_APP_ID_SIZE + length);
554 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
557 pHash.reset(new (std::nothrow) Sha1Hash());
558 SysTryReturnResult(NID_SEC, pHash != null, E_OUT_OF_MEMORY, "Memory allocation is failed.");
560 pChecksumByteBuffer.reset(pHash->GetHashN(input));
561 SysTryReturnResult(NID_SEC, pChecksumByteBuffer != null, E_SYSTEM, "An unexpected system error occurred.");
563 r = StringUtil::EncodeToBase64String(*(pChecksumByteBuffer.get()), base64EncodedChecksum);
564 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
566 verifyResult = storedChecksum.Equals(base64EncodedChecksum, true);
567 if (verifyResult != true)
576 _PrivilegeInfo::VerifyIntegrityEx(const AppId& appId, const byte* targetBitwisePrivilege, const Tizen::Base::String& storedChecksum, int length)
578 result r = E_SUCCESS;
579 bool verifyResult = false;
580 byte tempChecksumString[MAX_BITWISE_PRIV_SIZE + MAX_APP_ID_SIZE];
581 String base64EncodedChecksum;
584 std::unique_ptr<IHmac> pHmac(null);
585 std::unique_ptr<ByteBuffer> pChecksumByteBuffer(null);
586 std::unique_ptr<ISecretKey> pKey(null);
587 std::unique_ptr<char[]> pAppId(null);
589 SysTryReturnResult(NID_SEC, length <= MAX_BITWISE_PRIV_SIZE, E_INVALID_ARG, "The privilege information of [%ls] is invalid.", appId.GetPointer());
591 pAppId.reset(_StringConverter::CopyToCharArrayN(appId));
592 SysTryReturnResult(NID_SEC, pAppId != null, E_SYSTEM, "An unexpected system error occurred.");
594 memcpy(tempChecksumString, pAppId.get(), MAX_APP_ID_SIZE);
595 memcpy(tempChecksumString + MAX_APP_ID_SIZE, targetBitwisePrivilege, length);
599 r = input.Construct(MAX_APP_ID_SIZE + length);
600 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
602 r = input.SetArray(tempChecksumString, 0, MAX_APP_ID_SIZE + length);
603 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
606 pHmac.reset(new (std::nothrow) Sha1Hmac());
607 SysTryReturnResult(NID_SEC, pHmac != null, E_OUT_OF_MEMORY, "Memory allocation is failed.");
609 pKey.reset(_DeviceKeyGenerator::GenerateDeviceKeyN(_KEY_LEN));
610 SysTryReturnResult(NID_SEC, pKey != null, E_SYSTEM, "An unexpected system error occurred.");
612 r = pHmac->SetKey(*(pKey.get()));
613 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
615 pChecksumByteBuffer.reset(pHmac->GetHmacN(input));
616 SysTryReturnResult(NID_SEC, pChecksumByteBuffer != null, E_SYSTEM, "An unexpected system error occurred.");
618 r = StringUtil::EncodeToBase64String(*(pChecksumByteBuffer.get()), base64EncodedChecksum);
619 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
621 verifyResult = storedChecksum.Equals(base64EncodedChecksum, true);
622 if (verifyResult != true)
631 _PrivilegeInfo::VerifyIntegrity(const AppId& appId, const byte* targetBitwisePrivilege, const Tizen::Base::String& storedChecksum, int length, int visibility, const Tizen::Base::String& storedVisibilityChecksum)
633 result r = E_SUCCESS;
634 bool verifyResult = false;
635 byte tempChecksumString[MAX_BITWISE_PRIV_SIZE + MAX_APP_ID_SIZE];
636 byte tempVisibilityChecksumString[sizeof(int) + MAX_APP_ID_SIZE];
637 String base64EncodedChecksum;
638 String base64EncodedVisibilityChecksum;
641 ByteBuffer visibilityInput;
642 std::unique_ptr<IHmac> pHmac(null);
643 std::unique_ptr<ByteBuffer> pChecksumByteBuffer(null);
644 std::unique_ptr<ByteBuffer> pVisibilityChecksumByteBuffer(null);
645 std::unique_ptr<ISecretKey> pKey(null);
646 std::unique_ptr<char[]> pAppId(null);
648 SysTryReturnResult(NID_SEC, length <= MAX_BITWISE_PRIV_SIZE, E_INVALID_ARG, "The privilege information of [%ls] is invalid.", appId.GetPointer());
650 pAppId.reset(_StringConverter::CopyToCharArrayN(appId));
651 SysTryReturnResult(NID_SEC, pAppId != null, E_SYSTEM, "An unexpected system error occurred.");
653 memcpy(tempChecksumString, pAppId.get(), MAX_APP_ID_SIZE);
654 memcpy(tempChecksumString + MAX_APP_ID_SIZE, targetBitwisePrivilege, length);
656 memcpy(tempVisibilityChecksumString, pAppId.get(), MAX_APP_ID_SIZE);
657 memcpy(tempVisibilityChecksumString + MAX_APP_ID_SIZE, (byte*)(&visibility), sizeof(int));
661 r = input.Construct(MAX_APP_ID_SIZE + length);
662 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
664 r = input.SetArray(tempChecksumString, 0, MAX_APP_ID_SIZE + length);
665 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
668 r = visibilityInput.Construct(MAX_APP_ID_SIZE + sizeof(int));
669 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
671 r = visibilityInput.SetArray(tempVisibilityChecksumString, 0, MAX_APP_ID_SIZE + sizeof(int));
672 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
673 visibilityInput.Flip();
675 pHmac.reset(new (std::nothrow) Sha1Hmac());
676 SysTryReturnResult(NID_SEC, pHmac != null, E_OUT_OF_MEMORY, "Memory allocation is failed.");
678 pKey.reset(_DeviceKeyGenerator::GenerateDeviceKeyN(_KEY_LEN));
679 SysTryReturnResult(NID_SEC, pKey != null, E_SYSTEM, "An unexpected system error occurred.");
681 r = pHmac->SetKey(*(pKey.get()));
682 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
684 pChecksumByteBuffer.reset(pHmac->GetHmacN(input));
685 SysTryReturnResult(NID_SEC, pChecksumByteBuffer != null, E_SYSTEM, "An unexpected system error occurred.");
687 r = StringUtil::EncodeToBase64String(*(pChecksumByteBuffer.get()), base64EncodedChecksum);
688 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
690 verifyResult = storedChecksum.Equals(base64EncodedChecksum, true);
691 if (verifyResult != true)
696 pVisibilityChecksumByteBuffer.reset(pHmac->GetHmacN(visibilityInput));
697 SysTryReturnResult(NID_SEC, pChecksumByteBuffer != null, E_SYSTEM, "An unexpected system error occurred.");
699 r = StringUtil::EncodeToBase64String(*(pVisibilityChecksumByteBuffer.get()), base64EncodedVisibilityChecksum);
700 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
702 verifyResult = storedVisibilityChecksum.Equals(base64EncodedVisibilityChecksum, true);
703 if (verifyResult != true)