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 FIo_SecureIoUtil.cpp
20 * @brief This is the implementation file for the %_SecureIoUilt class.
26 #include <sys/types.h>
33 #include <unique_ptr.h>
35 #include <FBaseString.h>
37 #include <FBaseResult.h>
38 #include <FSecSecretKey.h>
39 #include <FSecSecretKeyGenerator.h>
40 #include <FSecCryptoSha1Hash.h>
41 #include <FSecCryptoAesCipher.h>
43 #include <FBase_NativeError.h>
44 #include <FBaseSysLog.h>
45 #include <FBase_StringConverter.h>
46 #include <FIo_SecureIoUtil.h>
47 #include <FIo_FileUtil.h>
48 #include <FApp_AppInfo.h>
51 using namespace Tizen::Base;
52 using namespace Tizen::Security;
53 using namespace Tizen::Security::Crypto;
54 using namespace Tizen::App;
56 namespace Tizen { namespace Io
59 static const int SECURE_IO_4_BITS = 4;
60 static const int SECURE_IO_8_BITS = 8;
61 static const int SECURE_IO_3_BYTES = 3;
62 static const int SECURE_IO_4_BYTES = 4;
63 static const int SECURE_IO_5_BYTES = 5;
64 static const int SECURE_IO_8_BYTES = 8;
65 static const int SECURE_IO_9_BYTES = 9;
66 static const int SECURE_IO_HEX_0F = 0x0f;
67 static const int SECURE_IO_HEX_FC = 0xfc;
68 static const int SECURE_IO_HEX_FD = 0xfd;
69 static const int SECURE_IO_HEX_FE = 0xfe;
70 static const int SECURE_IO_HEX_FF = 0xff;
71 static const int DATABASE_KEY_LENGTH = 16;
72 static const int AES_KEY_LENGTH = 16;
74 const char SECURE_FILE_HEADER_STRING[] = {0x74, 0x69, 0x7a, 0x65, 0x6e, 0x20, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x66, 0x69, 0x6c, 0x65};
75 const char SECURE_REG_HEADER_STRING[] = {0x74, 0x69, 0x7a, 0x65, 0x6e, 0x20, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79};
76 static const wchar_t* _CIPHER_INFORMATION = L"CBC/128/NOPADDING";
79 _SecureIoUtil::GetSecureKeyN(const ByteBuffer* pUserKey)
83 unique_ptr< Tizen::Base::ByteBuffer > pKey(new (std::nothrow) ByteBuffer());
84 SysTryReturn(NID_IO, pKey != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
86 r = pKey->Construct(AES_KEY_LENGTH);
87 SysTryReturn(NID_IO, !IsFailed(r), null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
89 if (pUserKey->GetRemaining() >= AES_KEY_LENGTH)
91 r = pKey->SetArray(pUserKey->GetPointer(), 0, AES_KEY_LENGTH);
92 SysTryReturn(NID_IO, !IsFailed(r), null, r, "[%s] Propagated.", GetErrorMessage(r));
98 int tempLength = pUserKey->GetRemaining();
99 int loopCount = AES_KEY_LENGTH / tempLength;
101 for(int i = 0; i < loopCount; i++)
104 r = pKey->SetArray(pUserKey->GetPointer(), 0, tempLength);
105 SysTryReturn(NID_IO, !IsFailed(r), null, r, "[%s] Propagated.", GetErrorMessage(r));
109 if (AES_KEY_LENGTH % tempLength)
111 r = pKey->SetArray(pUserKey->GetPointer(), 0, (AES_KEY_LENGTH % tempLength));
112 SysTryReturn(NID_IO, !IsFailed(r), null, r, "[%s] Propagated.", GetErrorMessage(r));
122 return pKey.release();
126 _SecureIoUtil::DoCipherAesN(const String transformation, const ByteBuffer& input, const ByteBuffer& key, CipherOperation encMode)
128 result r = E_SUCCESS;
131 SecretKeyGenerator secKeyGenerator;
133 static byte ivArray[] = {0x3E, 0xB5, 0x01, 0x45, 0xE4, 0xF8, 0x75, 0x3F, 0x08, 0x9D, 0x9F, 0x57, 0x3B, 0x63, 0xEF, 0x4B };
135 r = aesCipher.Construct(transformation, encMode);
136 SysTryReturn(NID_IO, !IsFailed(r), null, r, "[%s] Propagated.", GetErrorMessage(r));
138 r = ivBuffer.Construct(sizeof(ivArray));
139 SysTryReturn(NID_IO, !IsFailed(r), null, r, "[%s] Propagated.", GetErrorMessage(r));
141 r = ivBuffer.SetArray(ivArray, 0, sizeof(ivArray));
142 SysTryReturn(NID_IO, !IsFailed(r), null, r, "[%s] Propagated.", GetErrorMessage(r));
146 r = aesCipher.SetInitialVector(ivBuffer);
147 SysTryReturn(NID_IO, !IsFailed(r), null, r, "[%s] Propagated.", GetErrorMessage(r));
149 r = secKeyGenerator.Construct(key);
150 SysTryReturn(NID_IO, !IsFailed(r), null, r, "[%s] Propagated.", GetErrorMessage(r));
152 unique_ptr< ISecretKey > pKey(reinterpret_cast< ISecretKey* >(secKeyGenerator.GenerateKeyN()));
153 SysTryReturn(NID_IO, pKey != null, null, GetLastResult(), "[%s] Failed to generate key.", GetErrorMessage(GetLastResult()));
155 r = aesCipher.SetKey(*pKey.get());
156 SysTryReturn(NID_IO, !IsFailed(r), null, r, "[%s] Failed to set secret key.", GetErrorMessage(r));
158 unique_ptr< ByteBuffer > pOutBuf(null);
160 if (encMode == CIPHER_ENCRYPT)
162 pOutBuf = unique_ptr< ByteBuffer >(aesCipher.EncryptN(input));
166 pOutBuf = unique_ptr< ByteBuffer >(aesCipher.DecryptN(input));
169 SysTryReturn(NID_IO, pOutBuf != null, null, GetLastResult(), "[%s] Failed to decrypt data.", GetErrorMessage(GetLastResult()));
171 SetLastResult(E_SUCCESS);
172 return pOutBuf.release();
176 _SecureIoUtil::IsEndOfFile(_NormalFile* pNormalFile)
178 result r = E_SUCCESS;
181 int current = pNormalFile->Tell();
182 SysTryReturn(NID_IO, current != -1, false, GetLastResult(), "[%s] Failed to tell in file.", GetErrorMessage(GetLastResult()));
184 int ret = pNormalFile->Read(&flag, 1); //ignore ret as we are only looking for EOF.
185 if (GetLastResult() == E_END_OF_FILE && ret == 0)
190 r = pNormalFile->Seek(FILESEEKPOSITION_BEGIN, current);
191 SysTryReturn(NID_IO, !IsFailed(r), false, r, "[%s] Failed to seek in file.", GetErrorMessage(r));
197 _SecureIoUtil::InsertSecureFileHeader(_NormalFile* pNormalFile)
199 result r = E_SUCCESS;
201 byte secureHeader[SECURE_FILE_HEADER_SIZE_V1];
202 byte reservedValue[SECURE_IO_STATIC_BIN_LEN] = {0xCA, 0xFE, 0xBE, 0xBE, 0xDA, 0xEF, 0xEB, 0xEB};
205 r = pNormalFile->Seek(FILESEEKPOSITION_BEGIN, 0);
206 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to seek in file.", GetErrorMessage(r));
208 ret = pNormalFile->Read(secureHeader, SECURE_FILE_HEADER_SIZE_V1);
209 if (ret < SECURE_FILE_HEADER_SIZE_V1)
213 if (ret == 0 && IsEndOfFile(pNormalFile)) //is true
215 memcpy(secureHeader, SECURE_FILE_HEADER_STRING, SECURE_FILE_HEADER_STRING_SIZE);
216 memcpy(secureHeader + SECURE_FILE_HEADER_STRING_SIZE, reservedValue, SECURE_IO_STATIC_BIN_LEN);
217 secureHeader[SECURE_FILE_HEADER_STRING_SIZE + SECURE_IO_STATIC_BIN_LEN] = SECURE_IO_2_BYTES;
218 secureHeader[SECURE_FILE_HEADER_STRING_SIZE + SECURE_IO_STATIC_BIN_LEN + SECURE_IO_FLAG_SIZE] = 0;
219 memset(secureHeader + SECURE_FILE_HEADER_STRING_SIZE + SECURE_IO_STATIC_BIN_LEN + SECURE_IO_FLAG_SIZE + SECURE_IO_INDEX_SIZE, 0, SECURE_IO_LOF_SIZE);
220 memset(secureHeader + SECURE_FILE_HEADER_STRING_SIZE + SECURE_IO_STATIC_BIN_LEN + SECURE_IO_FLAG_SIZE + SECURE_IO_INDEX_SIZE + SECURE_IO_LOF_SIZE, 0, SECURE_IO_LOF_SIZE);
222 r = pNormalFile->Write(secureHeader, SECURE_FILE_HEADER_SIZE_V1);
223 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] [%s] Failed to write in file.", GetErrorMessage(r));
228 SysLog(NID_IO, "[%s] Failed to read data from file.", GetErrorMessage(r));
230 } //Else it means that header is already written
236 _SecureIoUtil::SaveLengthOfFile(_NormalFile* pNormalFile)
238 result r = E_SUCCESS;
240 byte lengthOfFile[SECURE_IO_LOF_SIZE] = {0, 0, 0, 0};
243 r = pNormalFile->Seek(FILESEEKPOSITION_END, 0);
244 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to seek in file.", GetErrorMessage(r));
246 length = pNormalFile->Tell();
247 SysTryReturn(NID_IO, length != -1, GetLastResult(), GetLastResult(), "[%s] Failed to tell in file.", GetErrorMessage(GetLastResult()));
249 r = pNormalFile->Seek(FILESEEKPOSITION_BEGIN, SECURE_FILE_HEADER_STRING_SIZE + SECURE_IO_10_BYTES);
250 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to seek in file.", GetErrorMessage(r));
252 if (sizeof(length) != SECURE_IO_LOF_SIZE)
254 memcpy(lengthOfFile + SECURE_IO_LOF_SIZE - sizeof(length), &length, sizeof(length));
258 memcpy(lengthOfFile, &length, SECURE_IO_LOF_SIZE);
261 r = pNormalFile->Write(lengthOfFile, SECURE_IO_LOF_SIZE);
262 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to write in file.", GetErrorMessage(r));
268 _SecureIoUtil::SelectCipherBlock(_NormalFile* pNormalFile, long virtualFilePointer, int* pPosition)
270 result r = E_SUCCESS;
274 long blockDataSize = 0;
275 byte secureHeader[SECURE_FILE_HEADER_SIZE_V1] = {0, };
276 byte blockHeader[CIPHER_BLOCK_HEADER_SIZE] = {0, 0, 0};
277 byte* pBlockDataCur = null;
280 r = pNormalFile->Seek(FILESEEKPOSITION_BEGIN, 0);
283 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to seek in file.", GetErrorMessage(r));
285 ret = pNormalFile->Read(secureHeader, SECURE_FILE_HEADER_SIZE_V1);
286 if (ret < SECURE_FILE_HEADER_SIZE_V1)
290 if (ret == 0 && IsEndOfFile(pNormalFile))
295 SysLog(NID_IO, "[%s] Failed to read data from file.", GetErrorMessage(r));
299 //read 1byte to check padding size
302 r = pNormalFile->Seek(FILESEEKPOSITION_BEGIN, count * (CIPHER_BLOCK_SIZE + CIPHER_BLOCK_HEADER_SIZE) + SECURE_FILE_HEADER_SIZE_V1);
303 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to seek in file.", GetErrorMessage(r));
305 ret = pNormalFile->Read(blockHeader, CIPHER_BLOCK_HEADER_SIZE);
306 if (ret < CIPHER_BLOCK_HEADER_SIZE) //less data read
310 if (ret == 0 && IsEndOfFile(pNormalFile))
315 SysLog(NID_IO, "[%s] Failed to read data from file", GetErrorMessage(r));
321 pBlockDataCur = (byte*) (&blockDataSize);
322 *pBlockDataCur = blockHeader[SECURE_IO_2_BYTES];
323 *(pBlockDataCur + 1) = blockHeader[1];
324 *(pBlockDataCur + SECURE_IO_2_BYTES) = blockHeader[0];
326 if (virtualFilePointer <= dataSize + blockDataSize)
328 *pPosition = virtualFilePointer - dataSize;
329 if (*pPosition == CIPHER_BLOCK_SIZE)
331 r = pNormalFile->Seek(FILESEEKPOSITION_CURRENT, CIPHER_BLOCK_SIZE);
336 r = pNormalFile->Seek(FILESEEKPOSITION_CURRENT, -CIPHER_BLOCK_HEADER_SIZE);
340 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to seek in file.", GetErrorMessage(r));
345 dataSize = dataSize + blockDataSize;
355 _SecureIoUtil::DetectNewLine(byte* pData, int readSize, int preReadSize, int* pTerminationCur, int* newLineSize)
361 for (count = preReadSize; count < readSize; count++)
363 if (pData[count] == '\r' && pData[count + 1] == '\n')
365 *pTerminationCur = count;
366 *newLineSize = SECURE_IO_2_BYTES;
370 if (pData[count] == '\n')
372 *pTerminationCur = count;
382 _SecureIoUtil::MakeCipherBlock(byte* pData, int dataSize, byte** ppEncryptedData, int* pEncryptedDataSize, const ByteBuffer& key)
384 result r = E_SUCCESS;
386 int lastDataSize = 0;
389 byte* pTempRealloc = null;
390 byte* pTempEncryptedData = null;
393 SysTryReturnResult(NID_SEC, dataSize > 0, E_INVALID_ARG, "Input data is not valid.");
396 *pEncryptedDataSize = 0;
398 blockCount = dataSize / CIPHER_BLOCK_SIZE;
399 lastDataSize = dataSize % CIPHER_BLOCK_SIZE;
400 if (lastDataSize != 0)
402 blockCount = blockCount + 1;
406 lastDataSize = CIPHER_BLOCK_SIZE;
409 for (int i = 0; i < blockCount; i++)
411 if (i == blockCount - 1)
413 tempSize = lastDataSize;
417 tempSize = CIPHER_BLOCK_SIZE;
420 inputSize = tempSize;
422 if (tempSize % ONE_BLOCK_SIZE != 0)
424 tempSize = (tempSize / ONE_BLOCK_SIZE) * ONE_BLOCK_SIZE + ONE_BLOCK_SIZE;
427 r = input.Construct(tempSize);
428 SysTryCatch(NID_IO, !IsFailed(r), , r, "[%s] Propagated.", GetErrorMessage(r));
430 r = input.SetArray((byte*) (pData + i * CIPHER_BLOCK_SIZE), 0, inputSize);
431 SysTryCatch(NID_IO, !IsFailed(r), , r, "[%s] Propagated.", GetErrorMessage(r));
433 if (inputSize < tempSize)
435 unique_ptr< char[] > pFill(new (std::nothrow) char[tempSize - inputSize]);
436 SysTryCatch(NID_IO, pFill != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
438 memset(pFill.get(), 0, tempSize - inputSize);
440 r = input.SetArray(reinterpret_cast< byte* >(pFill.get()), 0, tempSize - inputSize);
441 SysTryCatch(NID_IO, !IsFailed(r), , r, "[%s] Propagated.", GetErrorMessage(r));
447 unique_ptr< ByteBuffer > pEncryptedBuffer(DoCipherAesN(_CIPHER_INFORMATION, input, key, CIPHER_ENCRYPT));
448 SysTryCatch(NID_IO, pEncryptedBuffer != null, r = E_IO, E_IO, "[E_IO] Failed to encrypt data.");
450 pTempEncryptedData = const_cast< byte* >(pEncryptedBuffer->GetPointer());
451 SysTryCatch(NID_IO, pTempEncryptedData != null, , r, "[%s] Failed to get encrypted data.", GetErrorMessage(r));
453 pTempRealloc = (byte*) new (std::nothrow) byte[*pEncryptedDataSize + tempSize + CIPHER_BLOCK_HEADER_SIZE];
454 SysTryCatch(NID_IO, pTempRealloc != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
456 if (*ppEncryptedData)
458 memcpy(pTempRealloc, *ppEncryptedData, *pEncryptedDataSize);
460 delete[]* ppEncryptedData;
461 *ppEncryptedData = null;
464 *ppEncryptedData = pTempRealloc;
466 if (i == blockCount - 1)
469 *(*ppEncryptedData + i * (CIPHER_BLOCK_SIZE + CIPHER_BLOCK_HEADER_SIZE) + SECURE_IO_2_BYTES) \
470 = (byte) (lastDataSize & SECURE_IO_HEX_FF);
471 *(*ppEncryptedData + i * (CIPHER_BLOCK_SIZE + CIPHER_BLOCK_HEADER_SIZE) + 1) \
472 = (byte) ((lastDataSize >> SECURE_IO_8_BITS) & SECURE_IO_HEX_FF);
473 *(*ppEncryptedData + i * (CIPHER_BLOCK_SIZE + CIPHER_BLOCK_HEADER_SIZE)) \
474 = (byte) ((lastDataSize >> (SECURE_IO_8_BITS * SECURE_IO_2_BYTES)) & SECURE_IO_HEX_FF);
478 *(*ppEncryptedData + i * (CIPHER_BLOCK_SIZE + CIPHER_BLOCK_HEADER_SIZE) + SECURE_IO_2_BYTES) \
479 = (byte) (CIPHER_BLOCK_SIZE & SECURE_IO_HEX_FF);
480 *(*ppEncryptedData + i * (CIPHER_BLOCK_SIZE + CIPHER_BLOCK_HEADER_SIZE) + 1) \
481 = (byte) ((CIPHER_BLOCK_SIZE >> SECURE_IO_8_BITS) & SECURE_IO_HEX_FF);
482 *(*ppEncryptedData + i * (CIPHER_BLOCK_SIZE + CIPHER_BLOCK_HEADER_SIZE)) \
483 = (byte) ((CIPHER_BLOCK_SIZE >> (SECURE_IO_8_BITS * SECURE_IO_2_BYTES)) & SECURE_IO_HEX_FF);
486 memcpy(*ppEncryptedData + i * (CIPHER_BLOCK_SIZE + CIPHER_BLOCK_HEADER_SIZE) + CIPHER_BLOCK_HEADER_SIZE, pTempEncryptedData, tempSize);
487 *pEncryptedDataSize = *pEncryptedDataSize + tempSize + CIPHER_BLOCK_HEADER_SIZE;
494 *pEncryptedDataSize = 0;
495 delete[]* ppEncryptedData;
496 *ppEncryptedData = null;
503 _SecureIoUtil::WriteDataInCipherBlock(_NormalFile* pNormalFile, int dataPosition, bool eofSet, int dataSize, byte* pData, const ByteBuffer& key)
505 result r = E_SUCCESS;
506 int availableSize = 0;
507 int encryptedDataSize = 0;
509 long blockDataSize = 0;
510 long tempBlockDataSize = 0;
511 bool isFirstBlockSet = false;
512 byte* pBlockDataCur = null;
513 byte* pCipherBlockData = null;
514 byte* pDataPos = null;
515 byte blockHeader[CIPHER_BLOCK_HEADER_SIZE] = {0, 0, 0};
523 if (eofSet != false && dataPosition == 0)
525 r = MakeCipherBlock(pDataPos, dataSize, &pCipherBlockData, &encryptedDataSize, key);
526 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to make cipher block for file.", GetErrorMessage(r));
528 unique_ptr< byte[] > pEncryptedBlockData(pCipherBlockData);
529 pCipherBlockData = null;
531 SysTryReturn(NID_IO, pEncryptedBlockData != null, r, r, "[%s] Failed to make cipher block for file.", GetErrorMessage(r));
533 r = pNormalFile->Write(pEncryptedBlockData.get(), encryptedDataSize);
534 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to make cipher block for file.", GetErrorMessage(r));
539 ret = pNormalFile->Read(blockHeader, CIPHER_BLOCK_HEADER_SIZE);
540 if (ret < CIPHER_BLOCK_HEADER_SIZE)
544 if (ret == 0 && IsEndOfFile(pNormalFile))
549 SysLog(NID_IO, "[%s] Failed to read data from file.", GetErrorMessage(r));
554 pBlockDataCur = (byte*) (&blockDataSize);
555 *pBlockDataCur = blockHeader[SECURE_IO_2_BYTES];
556 *(pBlockDataCur + 1) = blockHeader[1];
557 *(pBlockDataCur + SECURE_IO_2_BYTES) = blockHeader[0];
559 unique_ptr< byte[] > pTempEncryptedData(new (std::nothrow) byte[CIPHER_BLOCK_SIZE]);
560 SysTryReturnResult(NID_IO, pTempEncryptedData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
562 memset(pTempEncryptedData.get(), 0, CIPHER_BLOCK_SIZE);
564 if (blockDataSize % ONE_BLOCK_SIZE != 0)
566 tempBlockDataSize = blockDataSize + ONE_BLOCK_SIZE - blockDataSize % ONE_BLOCK_SIZE;
570 tempBlockDataSize = blockDataSize;
573 ret = pNormalFile->Read(pTempEncryptedData.get(), tempBlockDataSize);
574 if (ret < tempBlockDataSize)
578 if (ret == 0 && IsEndOfFile(pNormalFile))
583 SysLog(NID_IO, "[%s] Failed to read data from file.", GetErrorMessage(r));
587 r = input.Construct(tempBlockDataSize);
588 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
590 r = input.SetArray(pTempEncryptedData.get(), 0, tempBlockDataSize);
592 pTempEncryptedData.reset(null);
594 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
598 unique_ptr< ByteBuffer > pDecryptedBuffer(DoCipherAesN(_CIPHER_INFORMATION, input, key, CIPHER_DECRYPT));
599 SysTryReturn(NID_IO, pDecryptedBuffer != null, E_IO, E_IO, "[E_IO] Failed to encrypt data.");
601 unique_ptr< byte[] > pDecryptedBlockData(new (std::nothrow) byte[tempBlockDataSize]);
602 SysTryReturnResult(NID_IO, pDecryptedBlockData != null, E_OUT_OF_MEMORY, "The memory is insufficient");
604 r = pDecryptedBuffer->GetArray(reinterpret_cast< byte* >(pDecryptedBlockData.get()), 0, tempBlockDataSize);
605 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to get decrypted buffer.", GetErrorMessage(r));
607 pDecryptedBuffer->Flip();
609 pDecryptedBuffer.reset(null);
611 if (isFirstBlockSet == false)
613 availableSize = CIPHER_BLOCK_SIZE - dataPosition;
614 if (availableSize >= dataSize)
616 if (tempBlockDataSize < dataPosition + dataSize)
618 unique_ptr< byte[] > pTempRealloc(new (std::nothrow) byte[dataPosition + dataSize]);
619 SysTryReturnResult(NID_IO, pTempRealloc != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
621 memcpy(pTempRealloc.get(), pDecryptedBlockData.get(), tempBlockDataSize);
623 pDecryptedBlockData.reset(null);
624 pDecryptedBlockData = move(pTempRealloc);
627 memcpy(reinterpret_cast< byte* >(pDecryptedBlockData.get()) + dataPosition, pDataPos, dataSize);
629 if (blockDataSize < dataPosition + dataSize)
631 r = MakeCipherBlock(pDecryptedBlockData.get(), dataPosition + dataSize, &pCipherBlockData, &encryptedDataSize, key);
635 r = MakeCipherBlock(pDecryptedBlockData.get(), blockDataSize, &pCipherBlockData, &encryptedDataSize, key);
638 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to make cipher block for file.", GetErrorMessage(r));
640 unique_ptr< byte[] > pEncryptedBlockData(pCipherBlockData);
641 pCipherBlockData = null;
643 SysTryReturn(NID_IO, pEncryptedBlockData != null, r, r, "[%s] Failed to make cipher block for file.", GetErrorMessage(r));
645 r = pNormalFile->Seek(FILESEEKPOSITION_CURRENT, -(tempBlockDataSize + CIPHER_BLOCK_HEADER_SIZE));
646 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to seek in file.", GetErrorMessage(r));
648 r = pNormalFile->Write(pEncryptedBlockData.get(), encryptedDataSize);
649 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to write in file.", GetErrorMessage(r));
654 else //(availableSize < dataSize)
656 if (tempBlockDataSize < dataPosition + availableSize)
658 unique_ptr< byte[] > pTempRelloc(new (std::nothrow) byte[dataPosition + availableSize]);
659 SysTryReturnResult(NID_IO, pTempRelloc != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
661 memcpy(pTempRelloc.get(), pDecryptedBlockData.get(), tempBlockDataSize);
663 pDecryptedBlockData.reset(null);
664 pDecryptedBlockData = move(pTempRelloc);
667 memcpy(reinterpret_cast< byte* >(pDecryptedBlockData.get()) + dataPosition, pDataPos, availableSize);
669 pDataPos = pDataPos + availableSize;
670 dataSize = dataSize - availableSize;
672 r = MakeCipherBlock(pDecryptedBlockData.get(), CIPHER_BLOCK_SIZE, &pCipherBlockData, &encryptedDataSize, key);
673 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to make cipher block for file.", GetErrorMessage(r));
675 unique_ptr< byte[] > pEncryptedBlockData(pCipherBlockData);
676 pCipherBlockData = null;
677 SysTryReturn(NID_IO, pEncryptedBlockData != null, r, r, "[%s] Failed to make cipher block for file.", GetErrorMessage(r));
679 r = pNormalFile->Seek(FILESEEKPOSITION_CURRENT, -(tempBlockDataSize + CIPHER_BLOCK_HEADER_SIZE));
680 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to seek in file.", GetErrorMessage(r));
682 r = pNormalFile->Write(pEncryptedBlockData.get(), encryptedDataSize);
683 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to write in file.", GetErrorMessage(r));
689 isFirstBlockSet = true;
693 availableSize = CIPHER_BLOCK_SIZE;
694 if (availableSize >= dataSize)
696 if (tempBlockDataSize < dataSize)
698 unique_ptr< byte[] > pTempRelloc(new (std::nothrow) byte[dataSize]);
699 SysTryReturnResult(NID_IO, pTempRelloc != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
701 memcpy(pTempRelloc.get(), pDecryptedBlockData.get(), tempBlockDataSize);
703 pDecryptedBlockData.reset(null);
704 pDecryptedBlockData = move(pTempRelloc);
707 memcpy(pDecryptedBlockData.get(), pDataPos, dataSize);
709 if (blockDataSize < dataPosition + dataSize)
711 r = MakeCipherBlock(pDecryptedBlockData.get(), dataSize, &pCipherBlockData, &encryptedDataSize, key);
715 r = MakeCipherBlock(pDecryptedBlockData.get(), blockDataSize, &pCipherBlockData, &encryptedDataSize, key);
718 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to make cipher block for file.", GetErrorMessage(r));
720 unique_ptr< byte[] > pEncryptedBlockData(pCipherBlockData);
721 pCipherBlockData = null;
723 SysTryReturn(NID_IO, pEncryptedBlockData != null, r, r, "[%s] Failed to make cipher block for file.", GetErrorMessage(r));
725 r = pNormalFile->Seek(FILESEEKPOSITION_CURRENT, -(tempBlockDataSize + CIPHER_BLOCK_HEADER_SIZE));
726 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to seek in file.", GetErrorMessage(r));
728 r = pNormalFile->Write(pEncryptedBlockData.get(), encryptedDataSize);
729 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to write in file.", GetErrorMessage(r));
733 else //availableSize < dataSize
735 if (tempBlockDataSize < availableSize)
737 unique_ptr< byte[] > pTempRelloc(new (std::nothrow) byte[availableSize]);
738 SysTryReturnResult(NID_IO, pTempRelloc != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
740 memcpy(pTempRelloc.get(), pDecryptedBlockData.get(), tempBlockDataSize);
742 pDecryptedBlockData.reset(null);
743 pDecryptedBlockData = move(pTempRelloc);
746 memcpy(pDecryptedBlockData.get(), pDataPos, availableSize);
748 pDataPos = pDataPos + availableSize;
749 dataSize = dataSize - availableSize;
751 r = MakeCipherBlock(pDecryptedBlockData.get(), CIPHER_BLOCK_SIZE, &pCipherBlockData, &encryptedDataSize, key);
752 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to make cipher block for file.", GetErrorMessage(r));
754 unique_ptr< byte[] > pEncryptedBlockData(pCipherBlockData);
755 pCipherBlockData = null;
757 SysTryReturn(NID_IO, pEncryptedBlockData != null, r, r, "[%s] Failed to make cipher block for file.", GetErrorMessage(r));
759 r = pNormalFile->Seek(FILESEEKPOSITION_CURRENT, -(tempBlockDataSize + CIPHER_BLOCK_HEADER_SIZE));
760 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to seek in file.", GetErrorMessage(r));
762 r = pNormalFile->Write(pEncryptedBlockData.get(), encryptedDataSize);
763 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to write in file.", GetErrorMessage(r));
770 eofSet = IsEndOfFile(pNormalFile);
777 _SecureIoUtil::ReadDataFromCipherBlock(_NormalFile* pNormalFile, int dataPosition, int bufferSize, byte* pData, _DataFormat dataMode, int* readItems, const ByteBuffer& key)
779 result r = E_SUCCESS;
782 int terminationCur = 0;
786 long blockDataSize = 0;
787 long tempBlockDataSize = 0;
788 byte* pBlockDataCur = null;
789 byte* pDecryptedBlockData = null;
790 byte blockHeader[CIPHER_BLOCK_HEADER_SIZE] = {0, 0, 0};
794 ret = pNormalFile->Read(blockHeader, CIPHER_BLOCK_HEADER_SIZE);
795 if (ret < CIPHER_BLOCK_HEADER_SIZE)
799 if (ret == 0 && IsEndOfFile(pNormalFile))
804 SysLog(NID_IO, "[%s] Failed to read data from file.", GetErrorMessage(r));
809 pBlockDataCur = (byte*) (&blockDataSize);
810 *pBlockDataCur = blockHeader[SECURE_IO_2_BYTES];
811 *(pBlockDataCur + 1) = blockHeader[1];
812 *(pBlockDataCur + SECURE_IO_2_BYTES) = blockHeader[0];
814 unique_ptr< byte[] > pBlockData(new (std::nothrow) byte[CIPHER_BLOCK_SIZE]);
815 SysTryReturnResult(NID_IO, pBlockData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
817 memset(pBlockData.get(), 0, CIPHER_BLOCK_SIZE);
819 if (blockDataSize % ONE_BLOCK_SIZE != 0)
821 tempBlockDataSize = blockDataSize + ONE_BLOCK_SIZE - blockDataSize % ONE_BLOCK_SIZE;
825 tempBlockDataSize = blockDataSize;
828 ret = pNormalFile->Read(pBlockData.get(), tempBlockDataSize);
829 if (ret < tempBlockDataSize)
833 if (ret == 0 && IsEndOfFile(pNormalFile))
838 SysLog(NID_IO, "[%s] Failed to read data from file.", GetErrorMessage(r));
842 readingSize = blockDataSize - dataPosition;
843 SysTryReturn(NID_IO, readingSize != 0, r = E_END_OF_FILE, r, "[%s] Failed to get positive value of readingSize.", GetErrorMessage(r));
845 r = input.Construct(tempBlockDataSize);
846 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
848 r = input.SetArray(pBlockData.get(), 0, tempBlockDataSize);
849 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
853 unique_ptr< ByteBuffer > pDecryptedBuffer(DoCipherAesN(_CIPHER_INFORMATION, input, key, CIPHER_DECRYPT));
854 SysTryReturn(NID_IO, pDecryptedBuffer != null, E_IO, E_IO, "[E_IO] Failed to encrypt data.");
856 pDecryptedBlockData = const_cast< byte* >(pDecryptedBuffer->GetPointer());
857 SysTryReturn(NID_IO, pDecryptedBlockData, r, r, "[%s] Failed to get encrypted data.", GetErrorMessage(r));
859 unique_ptr< byte[] > pTemp(new (std::nothrow) byte[readingSize]);
860 SysTryReturnResult(NID_IO, pTemp != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
862 memcpy(pTemp.get(), pDecryptedBlockData + dataPosition, readingSize);
864 pDecryptedBuffer.reset(null);
868 eofSet = IsEndOfFile(pNormalFile);
870 if (dataMode == DATA_FORMAT_BYTE && (readingSize >= bufferSize))
872 memcpy(pData, pTemp.get(), bufferSize);
873 *readItems = bufferSize;
876 else if (dataMode == DATA_FORMAT_STRING && ((readingSize >= bufferSize) || DetectNewLine(pTemp.get(), readingSize, tempSize, &terminationCur, &newLineSize)))
878 if (terminationCur != 0)
880 memcpy(pData, pTemp.get(), terminationCur);
881 *(pData + terminationCur) = '\n';
882 *readItems = terminationCur + newLineSize;
886 memcpy(pData, pTemp.get(), bufferSize);
887 *readItems = bufferSize;
891 else if (eofSet && (readingSize < bufferSize))
893 memcpy(pData, pTemp.get(), readingSize);
894 *readItems = readingSize;
899 ret = pNormalFile->Read(blockHeader, CIPHER_BLOCK_HEADER_SIZE);
900 if (ret < CIPHER_BLOCK_HEADER_SIZE)
904 if (ret == 0 && IsEndOfFile(pNormalFile))
910 SysLog(NID_IO, "[%s] Failed to read data from file.", GetErrorMessage(r));
915 pBlockDataCur = (byte*) (&blockDataSize);
916 *pBlockDataCur = blockHeader[SECURE_IO_2_BYTES];
917 *(pBlockDataCur + 1) = blockHeader[1];
918 *(pBlockDataCur + SECURE_IO_2_BYTES) = blockHeader[0];
920 memset(pBlockData.get(), 0, CIPHER_BLOCK_SIZE);
922 if (blockDataSize % ONE_BLOCK_SIZE != 0)
924 tempBlockDataSize = blockDataSize + ONE_BLOCK_SIZE - blockDataSize % ONE_BLOCK_SIZE;
928 tempBlockDataSize = blockDataSize;
931 ret = pNormalFile->Read(pBlockData.get(), tempBlockDataSize);
932 if (ret < tempBlockDataSize)
936 if (ret == 0 && IsEndOfFile(pNormalFile))
941 SysLog(NID_IO, "[%s] Failed to read data from file.", GetErrorMessage(r));
945 r = input.Construct(tempBlockDataSize);
946 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
948 r = input.SetArray(pBlockData.get(), 0, tempBlockDataSize);
949 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
953 unique_ptr< ByteBuffer > pDecryptedNextBuffer(DoCipherAesN(_CIPHER_INFORMATION, input, key, CIPHER_DECRYPT));
954 SysTryReturn(NID_IO, pDecryptedNextBuffer != null, E_IO, E_IO, "[E_IO] Failed to encrypt data.");
956 pDecryptedBlockData = const_cast< byte* >(pDecryptedNextBuffer->GetPointer());
957 SysTryReturn(NID_IO, pDecryptedBlockData != null, r, r, "[%s] Failed to get encrypted data.", GetErrorMessage(r));
959 tempSize = readingSize;
960 readingSize = readingSize + blockDataSize;
962 unique_ptr< byte[] > pTempRealloc(new (std::nothrow) byte[readingSize]);
963 SysTryReturnResult(NID_IO, pTempRealloc != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
965 memcpy(pTempRealloc.get(), pTemp.get(), tempSize);
968 pTemp = move(pTempRealloc);
970 memcpy(reinterpret_cast< byte* >(pTemp.get()) + tempSize, pDecryptedBlockData, blockDataSize);
979 _SecureIoUtil::GetDataLengh(_NormalFile* pNormalFile, long int* dataLength)
981 result r = E_SUCCESS;
983 long blockDataSize = 0;
984 byte* pBlockDataCur = null;
985 byte secureHeader[SECURE_FILE_HEADER_SIZE_V1];
986 byte blockHeader[CIPHER_BLOCK_HEADER_SIZE] = {0, 0, 0};
991 r = pNormalFile->Seek(FILESEEKPOSITION_BEGIN, 0);
992 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to seek in file.", GetErrorMessage(r));
994 ret = pNormalFile->Read(secureHeader, SECURE_FILE_HEADER_SIZE_V1);
995 if (ret < SECURE_FILE_HEADER_SIZE_V1)
999 if (ret == 0 && IsEndOfFile(pNormalFile))
1004 SysLog(NID_IO, "[%s] Failed to seek in file", GetErrorMessage(r));
1009 ret = pNormalFile->Read(blockHeader, CIPHER_BLOCK_HEADER_SIZE);
1010 if (ret < CIPHER_BLOCK_HEADER_SIZE)
1012 r = GetLastResult();
1014 if (ret == 0 && IsEndOfFile(pNormalFile))
1020 SysLog(NID_IO, "[%s] Failed to read data from file.", GetErrorMessage(r));
1025 pBlockDataCur = (byte*) (&blockDataSize);
1026 *pBlockDataCur = blockHeader[SECURE_IO_2_BYTES];
1027 *(pBlockDataCur + 1) = blockHeader[1];
1028 *(pBlockDataCur + SECURE_IO_2_BYTES) = blockHeader[0];
1029 *dataLength = *dataLength + blockDataSize;
1031 if (blockDataSize % ONE_BLOCK_SIZE != 0)
1033 r = pNormalFile->Seek(FILESEEKPOSITION_CURRENT, blockDataSize + ONE_BLOCK_SIZE - blockDataSize % ONE_BLOCK_SIZE);
1037 r = pNormalFile->Seek(FILESEEKPOSITION_CURRENT, blockDataSize);
1040 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to seek in file.", GetErrorMessage(r));
1044 return pNormalFile->Seek(FILESEEKPOSITION_END, 0);
1048 _SecureIoUtil::CheckSecureFileHeader(const Tizen::Base::String& filePath, const ByteBuffer* pSecretKey)
1050 result r = E_SUCCESS;
1052 _NormalFile normalFile;
1053 byte secureFileHeader[SECURE_FILE_HEADER_SIZE_V1];
1054 byte reservedValue[SECURE_IO_STATIC_BIN_LEN] = {0xCA, 0xFE, 0xBE, 0xBE, 0xDA, 0xEF, 0xEB, 0xEB};
1058 r = normalFile.Construct(filePath, "r");
1059 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to call constuct.", GetErrorMessage(r));
1061 ret = normalFile.Read(secureFileHeader, SECURE_FILE_HEADER_SIZE_V1);
1062 if (ret < SECURE_FILE_HEADER_SIZE_V1)
1064 r = GetLastResult();
1065 if (IsEndOfFile(&normalFile))
1067 if (ret && pSecretKey)
1069 return E_INVALID_ARG;
1079 //check if the file is encrypted file. (in normal and secure mode)
1080 ret = memcmp(secureFileHeader, SECURE_FILE_HEADER_STRING, SECURE_FILE_HEADER_STRING_SIZE);
1081 ret |= memcmp(secureFileHeader + SECURE_FILE_HEADER_STRING_SIZE, reservedValue, SECURE_IO_STATIC_BIN_LEN);
1083 SysTryReturnResult(NID_IO, !(ret && pSecretKey), E_INVALID_ARG, "Failed to match secure header in file.");
1089 _SecureIoUtil::SetRegistryFlag(void* pFileSecure, _FlagState flag)
1091 result r = E_SUCCESS;
1094 byte currentFlag = 0;
1095 _FileImpl* pFile = (_FileImpl*) pFileSecure;
1098 current = pFile->Tell();
1099 SysTryReturn(NID_IO, current != -1, GetLastResult(), GetLastResult(), "[%s] Tell file has failed.", GetErrorMessage(GetLastResult()));
1101 r = pFile->Seek(FILESEEKPOSITION_BEGIN, SECURE_REG_HEADER_STRING_SIZE + SECURE_IO_STATIC_BIN_LEN);
1102 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to seek in file.", GetErrorMessage(r));
1104 readItems = pFile->Read(¤tFlag, 1);
1105 SysTryReturn(NID_IO, readItems == 1, r = E_INVALID_STATE, E_INVALID_STATE, "[E_INVALID_STATE] Tell file has failed.");
1107 if (flag == FLAG_STATE_CVF)
1109 currentFlag = currentFlag | SECURE_IO_2_BYTES;
1110 currentFlag = currentFlag & SECURE_IO_HEX_FE;
1112 else if (flag == FLAG_STATE_CTF)
1114 currentFlag = currentFlag | 1;
1115 currentFlag = currentFlag & SECURE_IO_HEX_FD;
1117 else if (flag == FLAG_STATE_CVF_CTF)
1119 currentFlag = currentFlag | SECURE_IO_3_BYTES;
1121 else if (flag == FLAG_STATE_NONE)
1123 currentFlag = currentFlag & SECURE_IO_HEX_FC;
1127 return E_INVALID_STATE;
1130 r = pFile->Seek(FILESEEKPOSITION_BEGIN, SECURE_REG_HEADER_STRING_SIZE + SECURE_IO_STATIC_BIN_LEN);
1131 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to seek in file.", GetErrorMessage(r));
1133 r = pFile->Write(¤tFlag, 1);
1134 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to write data in file.", GetErrorMessage(r));
1136 r = pFile->Seek(FILESEEKPOSITION_BEGIN, current);
1137 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to seek in file.", GetErrorMessage(r));
1143 _SecureIoUtil::CheckRegistryFlag(byte* pHeader)
1146 byte flag = *(pHeader + SECURE_REG_HEADER_STRING_SIZE + SECURE_IO_STATIC_BIN_LEN);
1148 if (((flag | SECURE_IO_HEX_FD) == SECURE_IO_HEX_FF) && ((flag | SECURE_IO_HEX_FE) != SECURE_IO_HEX_FF))
1150 return FLAG_STATE_CVF;
1152 else if (((flag | SECURE_IO_HEX_FD) != SECURE_IO_HEX_FF) && ((flag | SECURE_IO_HEX_FE) == SECURE_IO_HEX_FF))
1154 return FLAG_STATE_CTF;
1156 else if ((flag | SECURE_IO_HEX_FC) == SECURE_IO_HEX_FF)
1158 return FLAG_STATE_CVF_CTF;
1162 return FLAG_STATE_NONE;
1167 _SecureIoUtil::MakeRegistryReplica(const String fileName, byte* pNameIndex)
1169 result r = E_SUCCESS;
1171 int nameIndex = *pNameIndex;
1176 SysTryReturn(NID_IO, nameIndex <= SECURE_IO_HEX_64, replicaName, E_INVALID_ARG, "[E_INVALID_ARG] Index number is too big.");
1180 replicaName = fileName + L".rpa ";
1181 if (!File::IsFileExist(replicaName))
1188 replicaName = fileName + L"_";
1189 replicaName.Append((int) nameIndex);
1190 replicaName.Append(L".rpa");
1192 if (!File::IsFileExist(replicaName))
1201 *pNameIndex = nameIndex;
1203 if (_FileImpl::IsFileExist(fileName))
1205 r = _FileImpl::Copy(fileName, replicaName, true);
1206 SysTryReturn(NID_IO, !IsFailed(r), replicaName, r, "[%s] Failed to copy file.", GetErrorMessage(r));
1210 // open registry replica file
1212 r = fileImpl.Construct(replicaName, "w", false, null);
1213 SysTryReturn(NID_IO, !IsFailed(r), replicaName, r, "[%s] Failed to create empty file.", GetErrorMessage(r));
1221 _SecureIoUtil::DeleteRegistryReplica(byte* pHeader, const String fileName)
1223 result r = E_SUCCESS;
1225 byte nameIndex = *(pHeader + SECURE_REG_HEADER_STRING_SIZE + SECURE_IO_9_BYTES);
1229 SysTryReturnResult(NID_IO, nameIndex <= SECURE_IO_HEX_64, E_INVALID_ARG, "Index number is too big.");
1233 replicaName = fileName + L".rpa ";
1237 replicaName = fileName + L"_";
1238 replicaName.Append((int) nameIndex);
1239 replicaName.Append(L".rpa");
1242 _FileImpl::Remove(replicaName);
1248 _SecureIoUtil::LoadRegistryReplica(byte** pHeader, int* pHeaderLen, const String fileName)
1250 result r = E_SUCCESS;
1253 char indexStr[MAX_BLOCK_INDEX_LEN];
1256 _FileImpl replicaFile;
1259 memset(indexStr, 0, MAX_BLOCK_INDEX_LEN);
1260 nameIndex = *(*pHeader + SECURE_REG_HEADER_STRING_SIZE + SECURE_IO_9_BYTES);
1266 SysTryReturnResult(NID_IO, nameIndex <= SECURE_IO_HEX_64, E_INVALID_ARG, "Index number is too big.");
1270 replicaName = fileName + L".rpa ";
1274 replicaName = fileName + L"_";
1275 replicaName.Append((int) nameIndex);
1276 replicaName.Append(L".rpa");
1279 if (Tizen::Io::_FileImpl::IsFileExist(replicaName))
1281 r = replicaFile.Construct(replicaName, "r", false, null);
1282 SysTryCatch(NID_IO, !IsFailed(r), , r, "[%s] Constructing the file has failed.", GetErrorMessage(r));
1284 r = replicaFile.Seek(FILESEEKPOSITION_END, 0);
1285 SysTryCatch(NID_IO, !IsFailed(r), , r, "[%s] Failed to seek in file.", GetErrorMessage(r));
1287 length = replicaFile.Tell();
1290 *pHeader = new (std::nothrow) byte[length];
1291 SysTryCatch(NID_IO, *pHeader != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
1292 *pHeaderLen = length;
1294 r = replicaFile.Seek(FILESEEKPOSITION_BEGIN, 0);
1295 SysTryCatch(NID_IO, !IsFailed(r), , r, "[%s] Failed to seek in file.", GetErrorMessage(r));
1297 readItems = replicaFile.Read(*pHeader, length);
1298 SysTryCatch(NID_IO, readItems >= length, r = GetLastResult(), GetLastResult(), "[%s] Failed to read data from file.", GetErrorMessage(GetLastResult()));
1315 _SecureIoUtil::CheckSecureRegistryHeader(byte** pHeader, int* pHeaderLen, const String strFilePathPath, bool secureMode)
1317 result r = E_SUCCESS;
1321 _FlagState flag = FLAG_STATE_NONE;
1322 byte reservedValue[SECURE_IO_STATIC_BIN_LEN] = {0xCA, 0xFE, 0xBE, 0xBE, 0xDA, 0xEF, 0xEB, 0xEB};
1323 byte* pSecureRegistryHeader = *pHeader;
1326 //check if the registry is encrypted . (in normal and secure mode)
1327 ret = memcmp(pSecureRegistryHeader, SECURE_REG_HEADER_STRING, SECURE_REG_HEADER_STRING_SIZE);
1328 ret |= memcmp(pSecureRegistryHeader + SECURE_REG_HEADER_STRING_SIZE, reservedValue, SECURE_IO_STATIC_BIN_LEN);
1329 SysTryReturnResult(NID_IO, !(ret && secureMode == true), E_INVALID_ARG, "Failed to match secure header in file.");
1333 flag = CheckRegistryFlag(pSecureRegistryHeader);
1335 if (_FileImpl::IsFileExist(strFilePathPath) && !_SecureIoUtil::IsEmpty(strFilePathPath))
1337 r = fileImpl.Construct(strFilePathPath, "a+", false, null);
1338 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Constructing the file has failed.", GetErrorMessage(r));
1340 if (flag == FLAG_STATE_CVF_CTF)
1342 r = DeleteRegistryReplica(pSecureRegistryHeader, strFilePathPath);
1343 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to delete registry replica.", GetErrorMessage(r));
1345 r = SetRegistryFlag(&fileImpl, FLAG_STATE_CVF);
1346 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to set registry flags.", GetErrorMessage(r));
1349 else if (flag == FLAG_STATE_CTF)
1351 r = LoadRegistryReplica(pHeader, &readLen, strFilePathPath);
1352 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to load registry replica.", GetErrorMessage(r));
1354 SysTryReturn(NID_IO, *pHeader, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] Failed to read secure registry file header.");
1356 pSecureRegistryHeader = *pHeader;
1357 *pHeaderLen = readLen;
1359 r = DeleteRegistryReplica(pSecureRegistryHeader, strFilePathPath);
1360 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to delete registry replica.", GetErrorMessage(r));
1362 r = SetRegistryFlag(&fileImpl, FLAG_STATE_CVF);
1363 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to set registry flags.", GetErrorMessage(r));
1365 else if (flag == FLAG_STATE_CVF)
1371 r = E_INVALID_STATE;
1380 _SecureIoUtil::CheckFlag(_NormalFile* pNormalFile, _FlagState* pFlag)
1382 result r = E_SUCCESS;
1387 r = pNormalFile->Seek(FILESEEKPOSITION_BEGIN, SECURE_FILE_HEADER_STRING_SIZE + SECURE_IO_STATIC_BIN_LEN);
1392 ret = pNormalFile->Read(&flag, SECURE_IO_FLAG_SIZE);
1396 r = GetLastResult();
1397 SysTryReturnResult(NID_IO, !(ret == 0 && r == E_END_OF_FILE), E_INVALID_ARG, "Failed to read secure file header.");
1399 r = GetLastResult();
1401 if (ret == 0 && IsEndOfFile(pNormalFile))
1406 SysLog(NID_IO, "[%s] Failed to read data from file.", GetErrorMessage(r));
1411 if (((flag | SECURE_IO_HEX_FD) == SECURE_IO_HEX_FF) && ((flag | SECURE_IO_HEX_FE) != SECURE_IO_HEX_FF))
1413 *pFlag = FLAG_STATE_CVF;
1415 else if (((flag | SECURE_IO_HEX_FD) != SECURE_IO_HEX_FF) && ((flag | SECURE_IO_HEX_FE) == SECURE_IO_HEX_FF))
1417 *pFlag = FLAG_STATE_CTF;
1419 else if ((flag | SECURE_IO_HEX_FC) == SECURE_IO_HEX_FF)
1421 *pFlag = FLAG_STATE_CVF_CTF;
1425 *pFlag = FLAG_STATE_NONE;
1432 _SecureIoUtil::SetFlag(_NormalFile* pNormalFile, _FlagState flag)
1434 result r = E_SUCCESS;
1437 byte currentFlag = 0;
1440 current = pNormalFile->Tell();
1443 r = GetLastResult();
1444 SysLog(NID_IO, "[%s] Failed to tell in file", GetErrorMessage(r));
1448 r = pNormalFile->Seek(FILESEEKPOSITION_BEGIN, SECURE_FILE_HEADER_STRING_SIZE + SECURE_IO_STATIC_BIN_LEN);
1449 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to seek in file", GetErrorMessage(r));
1451 readItems = pNormalFile->Read(¤tFlag, SECURE_IO_FLAG_SIZE);
1454 r = GetLastResult();
1456 if (readItems == 0 && IsEndOfFile(pNormalFile))
1461 SysLog(NID_IO, "[%s] Failed to read data from file.", GetErrorMessage(r));
1465 if (flag == FLAG_STATE_CVF)
1467 currentFlag = currentFlag | SECURE_IO_2_BYTES;
1468 currentFlag = currentFlag & SECURE_IO_HEX_FE;
1470 else if (flag == FLAG_STATE_CTF)
1472 currentFlag = currentFlag | 1;
1473 currentFlag = currentFlag & SECURE_IO_HEX_FD;
1475 else if (flag == FLAG_STATE_CVF_CTF)
1477 currentFlag = currentFlag | SECURE_IO_3_BYTES;
1479 else if (flag == FLAG_STATE_NONE)
1481 currentFlag = currentFlag & SECURE_IO_HEX_FC;
1485 SysAssert(false); // should not happen!
1487 r = pNormalFile->Seek(FILESEEKPOSITION_BEGIN, SECURE_FILE_HEADER_STRING_SIZE + SECURE_IO_STATIC_BIN_LEN);
1488 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to seek in file", GetErrorMessage(r));
1490 r = pNormalFile->Write(¤tFlag, SECURE_IO_FLAG_SIZE);
1491 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to write in file", GetErrorMessage(r));
1493 r = pNormalFile->Seek(FILESEEKPOSITION_BEGIN, current);
1494 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to seek in file", GetErrorMessage(r));
1500 _SecureIoUtil::DeleteBlockReplica(_NormalFile* pNormalFile, const String filePath)
1502 result r = E_SUCCESS;
1508 r = pNormalFile->Seek(FILESEEKPOSITION_BEGIN, SECURE_FILE_HEADER_STRING_SIZE + SECURE_IO_9_BYTES);
1509 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to seek in file", GetErrorMessage(r));
1511 readItems = pNormalFile->Read(&nameIndex, SECURE_IO_INDEX_SIZE);
1514 r = GetLastResult();
1516 if (readItems == 0 && IsEndOfFile(pNormalFile))
1521 SysLog(NID_IO, "[%s] Failed to read data from file.", GetErrorMessage(r));
1525 SysTryReturnResult(NID_IO, nameIndex <= SECURE_IO_HEX_64, E_INVALID_ARG, "Index number is too big.");
1529 replicaName = filePath + L".rpa ";
1533 replicaName = filePath + L"_";
1534 replicaName.Append((int) nameIndex);
1535 replicaName.Append(L".rpa");
1538 _FileImpl::Remove(replicaName);
1544 _SecureIoUtil::RestoreCorruptBlock(_NormalFile* pNormalFile, String fileName)
1546 result r = E_SUCCESS;
1547 String blockName = null;
1549 byte blockHeader[CIPHER_BLOCK_HEADER_SIZE] = {0, 0, 0};
1550 byte* pBlockDataCur = null;
1551 _NormalFile replicaFile;
1552 int startBlockNum = 0;
1558 r = pNormalFile->Seek(FILESEEKPOSITION_BEGIN, SECURE_FILE_HEADER_STRING_SIZE + SECURE_IO_9_BYTES);
1559 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to seek in file", GetErrorMessage(r));
1561 readItems = pNormalFile->Read(&nameIndex, SECURE_IO_INDEX_SIZE); // read index of temporary block name
1562 if (readItems < SECURE_IO_INDEX_SIZE)
1564 r = GetLastResult();
1566 if (readItems == 0 && IsEndOfFile(pNormalFile))
1571 SysLog(NID_IO, "[%s] Failed to read data from file.", GetErrorMessage(r));
1575 readItems = pNormalFile->Read(&dataLen, SECURE_IO_LOF_SIZE);
1576 if (readItems < SECURE_IO_LOF_SIZE)
1578 r = GetLastResult();
1580 if (readItems == 0 && IsEndOfFile(pNormalFile))
1585 SysLog(NID_IO, "[%s] Failed to read data from file.", GetErrorMessage(r));
1589 SysTryReturnResult(NID_IO, nameIndex < SECURE_IO_HEX_64, E_INVALID_ARG, "Index number is too big.");
1593 blockName = fileName + L".rpa ";
1597 blockName = fileName + L"_";
1598 blockName.Append((int) nameIndex);
1599 blockName.Append(L".rpa");
1602 if (_FileUtil::IsFileExist(blockName))
1604 r = replicaFile.Construct(blockName, "r");
1605 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to conctruct replica file.", GetErrorMessage(r));
1607 readItems = replicaFile.Read(blockHeader, CIPHER_BLOCK_HEADER_SIZE); //Read start block number (3bytes)
1608 if (readItems < CIPHER_BLOCK_HEADER_SIZE)
1610 r = GetLastResult();
1612 if (readItems == 0 && IsEndOfFile(pNormalFile))
1617 SysLog(NID_IO, "[%s] Failed to read data from file.", GetErrorMessage(r));
1621 pBlockDataCur = (byte*) (&startBlockNum);
1622 *pBlockDataCur = blockHeader[SECURE_IO_2_BYTES];
1623 *(pBlockDataCur + 1) = blockHeader[1];
1624 *(pBlockDataCur + SECURE_IO_2_BYTES) = blockHeader[0];
1626 r = replicaFile.Seek(FILESEEKPOSITION_END, 0);
1627 fileLength = replicaFile.Tell();
1628 SysTryReturn(NID_IO, fileLength != -1, GetLastResult(), GetLastResult(), "[%s] Failed to tell in file.", GetErrorMessage(GetLastResult()));
1630 r = replicaFile.Seek(FILESEEKPOSITION_BEGIN, CIPHER_BLOCK_HEADER_SIZE);
1631 unique_ptr< byte[] > pBlock(new (std::nothrow) byte[fileLength - CIPHER_BLOCK_HEADER_SIZE]);
1632 SysTryReturnResult(NID_IO, pBlock != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
1634 memset(pBlock.get(), 0, fileLength - CIPHER_BLOCK_HEADER_SIZE);
1636 readItems = replicaFile.Read(pBlock.get(), fileLength - CIPHER_BLOCK_HEADER_SIZE);
1637 if (readItems < (fileLength - CIPHER_BLOCK_HEADER_SIZE))
1639 r = GetLastResult();
1641 if (readItems == 0 && IsEndOfFile(pNormalFile))
1646 SysLog(NID_IO, "[%s] Failed to read data from file.", GetErrorMessage(r));
1650 r = pNormalFile->Seek(FILESEEKPOSITION_BEGIN, SECURE_FILE_HEADER_SIZE_V1 + (CIPHER_BLOCK_SIZE + CIPHER_BLOCK_HEADER_SIZE) * startBlockNum);
1652 r = pNormalFile->Write(pBlock.get(), fileLength - CIPHER_BLOCK_HEADER_SIZE);
1653 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to write in file.", GetErrorMessage(r));
1657 r = pNormalFile->Truncate(dataLen);
1658 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to truncate in file.", GetErrorMessage(r));
1664 _SecureIoUtil::MakeCipherBlockReplica(_NormalFile* pNormalFile, const String filePath, int dataPosition, int dataSize)
1666 result r = E_SUCCESS;
1667 int totalDataSize = 0;
1671 int startBlockNum = 0;
1673 long blockDataSize = 0;
1674 bool isEndOfBlock = false;
1676 byte* pBlockDataCur = null;
1677 byte blockHeader[CIPHER_BLOCK_HEADER_SIZE] = {0, 0, 0};
1679 _NormalFile tempBlockFile;
1681 totalDataSize = dataPosition + dataSize;
1684 headPos = pNormalFile->Tell();
1685 SysTryReturn(NID_IO, headPos != -1, GetLastResult(), GetLastResult(), "[%s] Failed to tell in file.", GetErrorMessage(GetLastResult()));
1687 ret = pNormalFile->Read(blockHeader, CIPHER_BLOCK_HEADER_SIZE);
1688 if (ret < CIPHER_BLOCK_HEADER_SIZE)
1690 r = GetLastResult();
1692 if (ret == 0 && IsEndOfFile(pNormalFile))
1697 SysLog(NID_IO, "[%s] Failed to read data from file.", GetErrorMessage(r));
1704 pBlockDataCur = (byte*) (&blockDataSize);
1705 *pBlockDataCur = blockHeader[SECURE_IO_2_BYTES];
1706 *(pBlockDataCur + 1) = blockHeader[1];
1707 *(pBlockDataCur + SECURE_IO_2_BYTES) = blockHeader[0];
1708 blockSize = blockSize + blockDataSize;
1710 if (blockSize >= totalDataSize)
1712 isEndOfBlock = true;
1715 if (blockDataSize % ONE_BLOCK_SIZE != 0)
1717 r = pNormalFile->Seek(FILESEEKPOSITION_CURRENT, blockDataSize + ONE_BLOCK_SIZE - blockDataSize % ONE_BLOCK_SIZE);
1721 r = pNormalFile->Seek(FILESEEKPOSITION_CURRENT, blockDataSize);
1724 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to seek in file.", GetErrorMessage(r));
1731 if (IsEndOfFile(pNormalFile))
1736 ret = pNormalFile->Read(blockHeader, CIPHER_BLOCK_HEADER_SIZE);
1737 if (ret < CIPHER_BLOCK_HEADER_SIZE)
1739 r = GetLastResult();
1741 if (ret == 0 && IsEndOfFile(pNormalFile))
1746 SysLog(NID_IO, "[%s] Failed to read data from file.", GetErrorMessage(r));
1752 tailPos = pNormalFile->Tell();
1753 SysTryReturn(NID_IO, tailPos != -1, GetLastResult(), GetLastResult(), "[%s] Failed to tell in file.", GetErrorMessage(GetLastResult()));
1755 startBlockNum = (headPos - SECURE_FILE_HEADER_SIZE_V1) / (CIPHER_BLOCK_SIZE + CIPHER_BLOCK_HEADER_SIZE);
1757 r = pNormalFile->Seek(FILESEEKPOSITION_BEGIN, headPos);
1758 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to seek in file.", GetErrorMessage(r));
1760 unique_ptr< byte[] > pBlockReplica(new (std::nothrow) byte[tailPos - headPos + CIPHER_BLOCK_HEADER_SIZE]);
1761 SysTryReturnResult(NID_IO, pBlockReplica != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
1763 *(reinterpret_cast< byte* >(pBlockReplica.get()) + SECURE_IO_2_BYTES) = (byte) (startBlockNum & SECURE_IO_HEX_FF);
1764 *(reinterpret_cast< byte* >(pBlockReplica.get()) + 1) = (byte) ((startBlockNum >> SECURE_IO_8_BITS) & SECURE_IO_HEX_FF);
1765 *(reinterpret_cast< byte* >(pBlockReplica.get())) = (byte) ((startBlockNum >> (SECURE_IO_8_BITS * SECURE_IO_2_BYTES)) & SECURE_IO_HEX_FF);
1767 ret = pNormalFile->Read(reinterpret_cast< byte* >(pBlockReplica.get()) + CIPHER_BLOCK_HEADER_SIZE, tailPos - headPos);
1768 if (ret < (tailPos - headPos))
1770 r = GetLastResult();
1772 if (ret == 0 && IsEndOfFile(pNormalFile))
1777 SysLog(NID_IO, "[%s] Failed to read data from file.", GetErrorMessage(r));
1783 SysTryReturnResult(NID_IO, nameIndex <= SECURE_IO_HEX_64, E_INVALID_ARG, "Index number is too big.");
1787 replicaName = filePath + L".rpa ";
1788 if (!File::IsFileExist(replicaName))
1795 replicaName = filePath + L"_";
1796 replicaName.Append((int) nameIndex);
1797 replicaName.Append(L".rpa");
1799 if (!File::IsFileExist(replicaName))
1807 r = tempBlockFile.Construct(replicaName, "w");
1808 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to call construct.", GetErrorMessage(r));
1810 r = tempBlockFile.Write(pBlockReplica.get(), tailPos - headPos + CIPHER_BLOCK_HEADER_SIZE);
1811 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to write in file.", GetErrorMessage(r));
1813 r = pNormalFile->Seek(FILESEEKPOSITION_BEGIN, 25);
1814 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to seek in file.", GetErrorMessage(r));
1816 r = pNormalFile->Write(&nameIndex, 1);
1817 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to write in file.", GetErrorMessage(r));
1819 r = pNormalFile->Seek(FILESEEKPOSITION_BEGIN, headPos);
1820 SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Failed to seek in file.", GetErrorMessage(r));
1826 _SecureIoUtil::IsNormalDatabase(_DatabaseMode mode)
1829 if (mode == DATABASE_MODE_NORMAL)
1837 _SecureIoUtil::IsSecureDatabase(_DatabaseMode mode)
1840 if (mode == DATABASE_MODE_SECURE)
1848 _SecureIoUtil::GetDatabaseMode(char* pStrPhysicalDbPath)
1850 result r = E_SUCCESS;
1852 unsigned long readBytes = 0;
1853 char buffer[SQLITE_HEADER_SIZE] = {0, };
1854 char magicNum1[SECURE_IO_MAGIC_NUMBER_SIZE] = {0xCA, 0xFE, 0xBE, 0xBE};
1855 char magicNum2[SECURE_IO_MAGIC_NUMBER_SIZE] = {0xDA, 0xEF, 0xEF, 0xEB};
1856 _NormalFile normalFile;
1860 r = normalFile.Construct(pStrPhysicalDbPath, "r");
1861 SysTryReturn(NID_IO, !IsFailed(r), DATABASE_MODE_ERROR, r, "[%s] Failed to open file (%s) in read mode", GetErrorMessage(r), pStrPhysicalDbPath);
1863 r = normalFile.Seek(FILESEEKPOSITION_END, 0);
1864 SysTryReturn(NID_IO, !IsFailed(r), DATABASE_MODE_ERROR, r, "[%s] Failed to seek in file.", GetErrorMessage(r));
1866 fileLength = normalFile.Tell();
1867 if (fileLength <= 0)
1869 return DATABASE_MODE_NONE;
1872 r = normalFile.Seek(FILESEEKPOSITION_BEGIN, 0);
1873 SysTryReturn(NID_IO, !IsFailed(r), DATABASE_MODE_ERROR, r, "[%s] Failed to seek in file.", GetErrorMessage(r));
1875 readBytes = normalFile.Read(buffer, SQLITE_HEADER_SIZE);
1876 r = GetLastResult();
1877 SysTryReturn(NID_IO, readBytes > 0, DATABASE_MODE_ERROR, r, "[%s] File is not opened for reading or else failed to read data from file.", GetErrorMessage(r));
1879 if (!strncmp(buffer, "SQLite format 3", SQLITE_FORMAT_STR_SIZE))
1881 return DATABASE_MODE_NORMAL;
1883 else if (!memcmp((void*) buffer, magicNum1, SECURE_IO_MAGIC_NUMBER_SIZE) && !memcmp((void*) (buffer + SECURE_IO_12_BYTES), magicNum2, SECURE_IO_MAGIC_NUMBER_SIZE))
1885 return DATABASE_MODE_SECURE;
1888 return DATABASE_MODE_ERROR;
1892 _SecureIoUtil::GenerateDatabaseKeyN(const Tizen::Base::ByteBuffer* pUserKey)
1897 byte* pDbKey = null;
1901 unique_ptr< ByteBuffer > pKeyBuffer(GetSecureKeyN(pUserKey));
1903 SysTryReturn(NID_IO, pKeyBuffer != null, null, E_INVALID_ARG, "[E_INVALID_ARG] Failed to generate secure key.");
1905 pKey = const_cast< byte* >(pKeyBuffer->GetPointer());
1907 pDbKey = new (std::nothrow) byte[DATABASE_KEY_LENGTH * SECURE_IO_2_BYTES + 1];
1908 SysTryReturn(NID_IO, pDbKey != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
1910 memset(pDbKey, 0, DATABASE_KEY_LENGTH * SECURE_IO_2_BYTES + 1);
1912 for (int i = 0; i < DATABASE_KEY_LENGTH; i++)
1914 lowByte = pKey[i] & SECURE_IO_HEX_0F;
1915 highByte = (pKey[i] >> SECURE_IO_4_BITS) & SECURE_IO_HEX_0F;
1916 if (lowByte <= SECURE_IO_9_BYTES)
1918 pDbKey[i * SECURE_IO_2_BYTES + 1] = lowByte + '0';
1922 pDbKey[i * SECURE_IO_2_BYTES + 1] = lowByte - SECURE_IO_10_BYTES + 'A';
1925 if (highByte <= SECURE_IO_9_BYTES)
1927 pDbKey[i * SECURE_IO_2_BYTES] = highByte + '0';
1931 pDbKey[i * SECURE_IO_2_BYTES] = highByte - SECURE_IO_10_BYTES + 'A';
1939 _SecureIoUtil::IsEmpty(const String& filePath)
1941 result r = E_SUCCESS;
1942 FileAttributes attribute;
1945 r = File::GetAttributes(filePath, attribute);
1952 if (attribute.GetFileSize() == 0)