2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 * @file resource_decryption.cpp
18 * @author Soyoung Kim (sy037.kim@samsung.com)
20 * @brief Implementation file for resource decryption
23 #include <dpl/encryption/resource_decryption.h>
27 #include <dpl/log/log.h>
28 #include <dpl/exception.h>
30 #include <FBaseByteBuffer.h>
31 #include <security/FSecCrypto_TrustZoneService.h>
37 namespace WRTDecryptor {
38 ResourceDecryptor::ResourceDecryptor() :
41 LogDebug("Started Decryption");
44 ResourceDecryptor::ResourceDecryptor(std::string userKey)
46 LogDebug("Finished Decryption");
47 SetDecryptionKey(userKey);
50 ResourceDecryptor::~ResourceDecryptor()
53 void ResourceDecryptor::SetDecryptionKey(std::string userKey)
55 if (userKey.empty()) {
59 char* pKey = GetDeviceUniqueKey(const_cast<char*>(userKey.c_str()),
60 userKey.size(), KEY_SIZE);
62 unsigned char *key = reinterpret_cast<unsigned char*>(pKey);
64 if (0 > AES_set_decrypt_key(key, BITS_SIZE, &m_decKey)) {
65 ThrowMsg(ResourceDecryptor::Exception::GetDecKeyFailed,
66 "Failed to create decryption key");
70 AES_KEY* ResourceDecryptor::GetDecryptionKey()
75 void ResourceDecryptor::GetDecryptedChunk(unsigned char*
77 unsigned char* decBuf,
82 ThrowMsg(ResourceDecryptor::Exception::EncryptionFailed,
83 "Failed to Get Decryption Chunk");
85 unsigned char ivec[16] = { 0, };
87 AES_cbc_encrypt(inBuf, decBuf, inBufSize, &m_decKey, ivec, AES_DECRYPT);
88 LogDebug("Success decryption");
91 int ResourceDecryptor::DecryptChunkByTrustZone(
92 std::string pkgid, const unsigned char* inBuffer,
95 using namespace Tizen::Base;
97 const byte *b_pkgid = reinterpret_cast<const byte*>(pkgid.c_str());
99 appInfo.Construct(pkgid.length());
100 appInfo.SetArray(b_pkgid, 0, pkgid.length());
103 Tizen::Security::Crypto::_TrustZoneService* pInstance;
104 pInstance = Tizen::Security::Crypto::_TrustZoneService::GetInstance();
107 pBuf.Construct(inBufSize);
108 const byte *pByte = reinterpret_cast<const byte*>(inBuffer);
109 pBuf.SetArray(pByte, 0, inBufSize);
112 ByteBuffer *getBuffer = pInstance->_TrustZoneService::DecryptN(appInfo, pBuf);
114 m_getBuffer = reinterpret_cast<void*>(getBuffer);
115 return getBuffer->GetRemaining();
118 void ResourceDecryptor::getDecryptStringByTrustZone(unsigned char *decBuffer)
120 using namespace Tizen::Base;
121 LogDebug("Get decrypted string");
122 ByteBuffer *buffer = reinterpret_cast<ByteBuffer*>(m_getBuffer);
123 memcpy(decBuffer, buffer->GetPointer(), buffer->GetRemaining());
127 } //namespace WRTDecryptor