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 SysTryCatch(NID_SEC, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
262 pEnum.reset(this->__privilegeList.GetEnumeratorN());
263 SysTryCatch(NID_SEC, r == E_SUCCESS, r = E_SYSTEM, 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;
277 delete pPrivilegeInfo;
282 _PrivilegeInfo::Construct(const _PrivilegeInfo& privilegeInfo)
284 result r = E_SUCCESS;
286 SysTryReturnResult(NID_SEC, privilegeInfo.__appId.GetLength() > 0 && privilegeInfo.__appId.GetLength() == MAX_APP_ID_SIZE, E_INVALID_ARG, "The argument is invalid.");
288 __bitwiseLength = privilegeInfo.__bitwiseLength;
290 __appId = privilegeInfo.__appId;
291 memcpy(__bitwisePrivilege, privilegeInfo.__bitwisePrivilege, __bitwiseLength);
293 __apiVisibility = privilegeInfo.__apiVisibility;
295 __privilegeList.Construct();
297 IEnumerator* pEnum = privilegeInfo.__privilegeList.GetEnumeratorN();
298 while (pEnum->MoveNext() == E_SUCCESS)
300 String* tempString = static_cast< String* >(pEnum->GetCurrent());
301 __privilegeList.Add(new String(*tempString));
309 _PrivilegeInfo::GetAppId(void) const
315 _PrivilegeInfo::GetBitwisePrivilegeN(byte*& pBitwisePrivilege) const
317 byte* pReturn = null;
318 result r = E_SUCCESS;
320 pReturn = (byte*) malloc(sizeof(byte) * MAX_BITWISE_PRIV_SIZE);
321 SysTryReturnResult(NID_SEC, pReturn != null, E_OUT_OF_MEMORY, "Memory allocation is failed.");
322 memcpy(pReturn, __bitwisePrivilege, MAX_BITWISE_PRIV_SIZE);
324 pBitwisePrivilege = pReturn;
330 _PrivilegeInfo::GetEncryptedBitwise(String& encryptedPrivileges) const
332 result r = E_SUCCESS;
334 std::unique_ptr<ISecretKey> pKey(null);
335 std::unique_ptr<ByteBuffer> pEncryptedBitwisePrivilege(null);
336 std::unique_ptr<ByteBuffer> pBitwisePrivilege(null);
338 const byte ivector[_IV_LEN] = { 0x3E, 0xB5, 0x01, 0x45, 0xE4, 0xF8, 0x75, 0x3F, 0x08, 0x9D, 0x9F, 0x57, 0x3B, 0x63, 0xEF, 0x4B};
340 pBitwisePrivilege.reset(new (std::nothrow) ByteBuffer());
341 SysTryReturnResult(NID_SEC, pBitwisePrivilege != null, E_OUT_OF_MEMORY, "Memory allocation is failed.");
343 r = pBitwisePrivilege->Construct(__bitwiseLength);
344 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
346 r = ivByte.Construct(_IV_LEN);
347 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
349 r = ivByte.SetArray(ivector, 0, _IV_LEN);
350 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
353 r = pBitwisePrivilege->SetArray(__bitwisePrivilege, 0, __bitwiseLength);
354 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
355 pBitwisePrivilege->Flip();
357 r = cipherEnc.Construct(L"CBC/128/PKCS7PADDING", CIPHER_ENCRYPT);
358 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
360 pKey.reset(_DeviceKeyGenerator::GenerateDeviceKeyN(_KEY_LEN));
361 SysTryReturnResult(NID_SEC, pKey != null, E_SYSTEM, "An unexpected system error occurred.");
363 r = cipherEnc.SetKey(*(pKey.get()));
364 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
366 r = cipherEnc.SetInitialVector(ivByte);
367 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
369 pEncryptedBitwisePrivilege.reset(cipherEnc.EncryptN(*(pBitwisePrivilege.get())));
370 SysTryReturnResult(NID_SEC, pEncryptedBitwisePrivilege != null, E_SYSTEM, "An unexpected system error occurred.");
372 r = StringUtil::EncodeToBase64String(*(pEncryptedBitwisePrivilege.get()), encryptedPrivileges);
373 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
379 _PrivilegeInfo::GetChecksum(String& checksum) const
381 result r = E_SUCCESS;
382 byte tempChecksumString[MAX_BITWISE_PRIV_SIZE + MAX_APP_ID_SIZE];
386 std::unique_ptr<ISecretKey> pKey(null);
387 std::unique_ptr<IHmac> pHmac(null);
388 std::unique_ptr<ByteBuffer> pChecksumByteBuffer(null);
389 std::unique_ptr<char[]> pAppId(null);
391 pAppId.reset(_StringConverter::CopyToCharArrayN(__appId));
392 SysTryReturnResult(NID_SEC, pAppId != null, E_SYSTEM, "An unexpected system error occurred.");
394 memcpy(tempChecksumString, pAppId.get(), MAX_APP_ID_SIZE);
395 memcpy(tempChecksumString + MAX_APP_ID_SIZE, __bitwisePrivilege, __bitwiseLength);
399 r = input.Construct(MAX_APP_ID_SIZE + __bitwiseLength);
400 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
402 r = input.SetArray(tempChecksumString, 0, MAX_APP_ID_SIZE + __bitwiseLength);
403 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
406 pHmac.reset(new (std::nothrow) Sha1Hmac());
407 SysTryReturnResult(NID_SEC, pHmac != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed.");
409 pKey.reset(_DeviceKeyGenerator::GenerateDeviceKeyN(_KEY_LEN));
410 SysTryReturnResult(NID_SEC, pKey != null, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
412 r = pHmac->SetKey(*(pKey.get()));
413 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
415 pChecksumByteBuffer.reset(pHmac->GetHmacN(input));
416 SysTryReturnResult(NID_SEC, pChecksumByteBuffer != null, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
418 r = StringUtil::EncodeToBase64String(*(pChecksumByteBuffer.get()), checksum);
419 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "[E_SYSTEM] An unexpected system error occurred.");
425 _PrivilegeInfo::HasPrivilege(_Privilege privilege) const
428 int targetIndex = static_cast< int >(privilege) / _BITS_IN_BYTE;
429 byte privilegeBit = (byte) (static_cast< int >(privilege) % _BITS_IN_BYTE);
430 byte bitwiseTargetPrivilege = 0;
431 byte tempBitwisePrivilege = 0;
433 if (__apiVisibility != _API_VISIBILITY_NONE) // To be removed
435 if (visibilityLevelListTable[privilege][_PRV_API_VER_2_0] > __apiVisibility)
437 SysLog(NID_SEC, "Result : FALSE [Visibility]");
442 bitwiseTargetPrivilege = bitwiseTargetPrivilege | (1 << privilegeBit);
443 tempBitwisePrivilege = __bitwisePrivilege[targetIndex] & bitwiseTargetPrivilege;
445 if (bitwiseTargetPrivilege == tempBitwisePrivilege)
447 SysLog(NID_SEC, "Result : TRUE");
452 SysLogException(NID_SEC, E_PRIVILEGE_DENIED, "Result : FALSE [%ls, %ls]", __appId.GetPointer(), privilegeListTable[privilege].privilegeString);
459 _PrivilegeInfo::HasPrivilegeEx(_Privilege privilege) const
462 int targetIndex = static_cast< int >(privilege) / _BITS_IN_BYTE;
463 byte privilegeBit = (byte) (static_cast< int >(privilege) % _BITS_IN_BYTE);
464 byte bitwiseTargetPrivilege = 0;
465 byte tempBitwisePrivilege = 0;
467 if (__apiVisibility != _API_VISIBILITY_NONE) // To be removed
469 if (visibilityLevelListTable[privilege][_PRV_API_VER_2_0] > __apiVisibility)
475 bitwiseTargetPrivilege = bitwiseTargetPrivilege | (1 << privilegeBit);
476 tempBitwisePrivilege = __bitwisePrivilege[targetIndex] & bitwiseTargetPrivilege;
478 if (bitwiseTargetPrivilege == tempBitwisePrivilege)
480 SysLog(NID_SEC, "Result : TRUE");
488 _PrivilegeInfo::HasPrivilege(const String& privilege) const
491 bool validStringFlag = false;
492 int privilegeEnum = -1;
495 String privilegeURI = L"http://tizen.org/privilege/";
496 String privilegeSubString;
497 String privilegeSubStringURI;
498 privilege.SubString(0, privilegeURI.GetLength(), privilegeSubStringURI);
500 if (privilegeSubStringURI.Equals(privilegeURI, true))
502 privilege.SubString(privilegeURI.GetLength(), privilege.GetLength() - privilegeURI.GetLength(), privilegeSubString);
503 for (index = 0; index < _MAX_PRIVILEGE_ENUM; index++)
505 if (wcscmp(privilegeListTable[index].privilegeString, privilegeSubString.GetPointer()) == 0)
507 validStringFlag = true;
508 privilegeEnum = index;
516 ret = HasPrivilege(privilegeListTable[index].privilege);
521 ret = __privilegeList.Contains(privilege);
524 SysLog(NID_SEC, "Result : TRUE");
528 SysLogException(NID_SEC, E_PRIVILEGE_DENIED, "Result : FALSE [%ls, %ls]", __appId.GetPointer(), privilege.GetPointer());
536 _PrivilegeInfo::VerifyIntegrity(const AppId& appId, const byte* targetBitwisePrivilege, const Tizen::Base::String& storedChecksum, int length)
538 result r = E_SUCCESS;
539 bool verifyResult = false;
540 byte tempChecksumString[MAX_BITWISE_PRIV_SIZE + MAX_APP_ID_SIZE];
541 String base64EncodedChecksum;
543 std::unique_ptr<IHash> pHash(null);
544 std::unique_ptr<ByteBuffer> pChecksumByteBuffer(null);
545 std::unique_ptr<char> pAppId(null);
547 SysTryReturnResult(NID_SEC, length <= MAX_BITWISE_PRIV_SIZE, E_INVALID_ARG, "The privilege information of %ls is invalid.", appId.GetPointer());
549 pAppId.reset(_StringConverter::CopyToCharArrayN(appId));
550 SysTryReturnResult(NID_SEC, pAppId != null, E_SYSTEM, "An unexpected system error occurred.");
552 memcpy(tempChecksumString, pAppId.get(), MAX_APP_ID_SIZE);
553 memcpy(tempChecksumString + MAX_APP_ID_SIZE, targetBitwisePrivilege, length);
557 r = input.Construct(MAX_APP_ID_SIZE + length);
558 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
560 r = input.SetArray(tempChecksumString, 0, MAX_APP_ID_SIZE + length);
561 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
564 pHash.reset(new (std::nothrow) Sha1Hash());
565 SysTryReturnResult(NID_SEC, pHash != null, E_OUT_OF_MEMORY, "Memory allocation is failed.");
567 pChecksumByteBuffer.reset(pHash->GetHashN(input));
568 SysTryReturnResult(NID_SEC, pChecksumByteBuffer != null, E_SYSTEM, "An unexpected system error occurred.");
570 r = StringUtil::EncodeToBase64String(*(pChecksumByteBuffer.get()), base64EncodedChecksum);
571 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
573 verifyResult = storedChecksum.Equals(base64EncodedChecksum, true);
574 if (verifyResult != true)
583 _PrivilegeInfo::VerifyIntegrityEx(const AppId& appId, const byte* targetBitwisePrivilege, const Tizen::Base::String& storedChecksum, int length)
585 result r = E_SUCCESS;
586 bool verifyResult = false;
587 byte tempChecksumString[MAX_BITWISE_PRIV_SIZE + MAX_APP_ID_SIZE];
588 String base64EncodedChecksum;
591 std::unique_ptr<IHmac> pHmac(null);
592 std::unique_ptr<ByteBuffer> pChecksumByteBuffer(null);
593 std::unique_ptr<ISecretKey> pKey(null);
594 std::unique_ptr<char[]> pAppId(null);
596 SysTryReturnResult(NID_SEC, length <= MAX_BITWISE_PRIV_SIZE, E_INVALID_ARG, "The privilege information of [%ls] is invalid.", appId.GetPointer());
598 pAppId.reset(_StringConverter::CopyToCharArrayN(appId));
599 SysTryReturnResult(NID_SEC, pAppId != null, E_SYSTEM, "An unexpected system error occurred.");
601 memcpy(tempChecksumString, pAppId.get(), MAX_APP_ID_SIZE);
602 memcpy(tempChecksumString + MAX_APP_ID_SIZE, targetBitwisePrivilege, length);
606 r = input.Construct(MAX_APP_ID_SIZE + length);
607 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
609 r = input.SetArray(tempChecksumString, 0, MAX_APP_ID_SIZE + length);
610 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
613 pHmac.reset(new (std::nothrow) Sha1Hmac());
614 SysTryReturnResult(NID_SEC, pHmac != null, E_OUT_OF_MEMORY, "Memory allocation is failed.");
616 pKey.reset(_DeviceKeyGenerator::GenerateDeviceKeyN(_KEY_LEN));
617 SysTryReturnResult(NID_SEC, pKey != null, E_SYSTEM, "An unexpected system error occurred.");
619 r = pHmac->SetKey(*(pKey.get()));
620 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
622 pChecksumByteBuffer.reset(pHmac->GetHmacN(input));
623 SysTryReturnResult(NID_SEC, pChecksumByteBuffer != null, E_SYSTEM, "An unexpected system error occurred.");
625 r = StringUtil::EncodeToBase64String(*(pChecksumByteBuffer.get()), base64EncodedChecksum);
626 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
628 verifyResult = storedChecksum.Equals(base64EncodedChecksum, true);
629 if (verifyResult != true)
638 _PrivilegeInfo::VerifyIntegrity(const AppId& appId, const byte* targetBitwisePrivilege, const Tizen::Base::String& storedChecksum, int length, int visibility, const Tizen::Base::String& storedVisibilityChecksum)
640 result r = E_SUCCESS;
641 bool verifyResult = false;
642 byte tempChecksumString[MAX_BITWISE_PRIV_SIZE + MAX_APP_ID_SIZE];
643 byte tempVisibilityChecksumString[sizeof(int) + MAX_APP_ID_SIZE];
644 String base64EncodedChecksum;
645 String base64EncodedVisibilityChecksum;
648 ByteBuffer visibilityInput;
649 std::unique_ptr<IHmac> pHmac(null);
650 std::unique_ptr<ByteBuffer> pChecksumByteBuffer(null);
651 std::unique_ptr<ByteBuffer> pVisibilityChecksumByteBuffer(null);
652 std::unique_ptr<ISecretKey> pKey(null);
653 std::unique_ptr<char[]> pAppId(null);
655 SysTryReturnResult(NID_SEC, length <= MAX_BITWISE_PRIV_SIZE, E_INVALID_ARG, "The privilege information of [%ls] is invalid.", appId.GetPointer());
657 pAppId.reset(_StringConverter::CopyToCharArrayN(appId));
658 SysTryReturnResult(NID_SEC, pAppId != null, E_SYSTEM, "An unexpected system error occurred.");
660 memcpy(tempChecksumString, pAppId.get(), MAX_APP_ID_SIZE);
661 memcpy(tempChecksumString + MAX_APP_ID_SIZE, targetBitwisePrivilege, length);
663 memcpy(tempVisibilityChecksumString, pAppId.get(), MAX_APP_ID_SIZE);
664 memcpy(tempVisibilityChecksumString + MAX_APP_ID_SIZE, (byte*)(&visibility), sizeof(int));
668 r = input.Construct(MAX_APP_ID_SIZE + length);
669 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
671 r = input.SetArray(tempChecksumString, 0, MAX_APP_ID_SIZE + length);
672 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
675 r = visibilityInput.Construct(MAX_APP_ID_SIZE + sizeof(int));
676 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
678 r = visibilityInput.SetArray(tempVisibilityChecksumString, 0, MAX_APP_ID_SIZE + sizeof(int));
679 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
680 visibilityInput.Flip();
682 pHmac.reset(new (std::nothrow) Sha1Hmac());
683 SysTryReturnResult(NID_SEC, pHmac != null, E_OUT_OF_MEMORY, "Memory allocation is failed.");
685 pKey.reset(_DeviceKeyGenerator::GenerateDeviceKeyN(_KEY_LEN));
686 SysTryReturnResult(NID_SEC, pKey != null, E_SYSTEM, "An unexpected system error occurred.");
688 r = pHmac->SetKey(*(pKey.get()));
689 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
691 pChecksumByteBuffer.reset(pHmac->GetHmacN(input));
692 SysTryReturnResult(NID_SEC, pChecksumByteBuffer != null, E_SYSTEM, "An unexpected system error occurred.");
694 r = StringUtil::EncodeToBase64String(*(pChecksumByteBuffer.get()), base64EncodedChecksum);
695 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
697 verifyResult = storedChecksum.Equals(base64EncodedChecksum, true);
698 if (verifyResult != true)
703 pVisibilityChecksumByteBuffer.reset(pHmac->GetHmacN(visibilityInput));
704 SysTryReturnResult(NID_SEC, pChecksumByteBuffer != null, E_SYSTEM, "An unexpected system error occurred.");
706 r = StringUtil::EncodeToBase64String(*(pVisibilityChecksumByteBuffer.get()), base64EncodedVisibilityChecksum);
707 SysTryReturnResult(NID_SEC, r == E_SUCCESS, E_SYSTEM, "An unexpected system error occurred.");
709 verifyResult = storedVisibilityChecksum.Equals(base64EncodedVisibilityChecksum, true);
710 if (verifyResult != true)