2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 // Licensed under the Flora License, Version 1.1 (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://floralicense.org/license/
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.
18 * @file StCertificatePresentationModel.cpp
19 * @brief This is the implementation file for Certificate Presentation Model class.
25 #include "StCertificatePresentationModel.h"
27 using namespace Tizen::Base;
28 using namespace Tizen::Base::Collection;
29 using namespace Tizen::Base::Utility;
30 using namespace Tizen::Io;
31 using namespace Tizen::Security::Cert;
32 using namespace Tizen::System;
34 static const int PUBLIC_KEY_HEX_RIGHT_SHIFT_4 = 4;
35 static const int DEFAULT_COUNT = 1;
37 CertificatePresentationModel* CertificatePresentationModel::__pStCertificatePresentationModelInstance = null;
39 CertificatePresentationModel::CertificatePresentationModel(void)
40 : __pX509CertificateStore(null)
41 , __pICertificatePresentationModelSelector(null)
42 , __pPendingCertificate(null)
43 , __pCertificateList(null)
44 , __pFoundUserCertificateToInstallList(null)
45 , __pPendingUserCertificateToInstallList(null)
49 CertificatePresentationModel::~CertificatePresentationModel(void)
51 ClearPendingCertificate();
52 ClearPendingUserCertificateFileNameToInstall();
53 RemoveCertificateList();
54 RemoveCertificateSelector();
55 RemoveFoundUserCertifiacteToInstallList();
57 delete __pX509CertificateStore;
58 __pX509CertificateStore = null;
62 CertificatePresentationModel::CreateInstance(void)
64 __pStCertificatePresentationModelInstance = new (std::nothrow) CertificatePresentationModel();
65 result r = __pStCertificatePresentationModelInstance->Construct();
68 delete __pStCertificatePresentationModelInstance;
69 __pStCertificatePresentationModelInstance = null;
73 std::atexit(DestroyInstance);
77 CertificatePresentationModel::DestroyInstance(void)
79 delete __pStCertificatePresentationModelInstance;
80 __pStCertificatePresentationModelInstance = null;
83 CertificatePresentationModel*
84 CertificatePresentationModel::GetInstance(void)
86 if (__pStCertificatePresentationModelInstance == null)
91 return __pStCertificatePresentationModelInstance;
95 CertificatePresentationModel::Construct(void)
97 __pX509CertificateStore = new (std::nothrow) X509CertificateStore();
99 if (__pX509CertificateStore == null)
101 AppLogDebug("__pX509CertificateStore is null");
102 delete __pX509CertificateStore;
103 __pX509CertificateStore = null;
111 CertificatePresentationModel::SetCertificateSelector(Tizen::Security::Cert::CertificateType certificateType)
113 if (__pICertificatePresentationModelSelector == null)
115 __pICertificatePresentationModelSelector = new (std::nothrow) ICertificatePresentationModelSelector();
116 if (__pICertificatePresentationModelSelector == null)
118 AppLogDebug("__pICertificatePresentationModelSelector is null");
123 __pICertificatePresentationModelSelector->SetType(certificateType);
125 result r = __pX509CertificateStore->SetCertificateSelector(*__pICertificatePresentationModelSelector);
128 AppLogDebug("SetCertificateSelector failed(%s)", GetErrorMessage(r));
129 RemoveCertificateSelector();
136 CertificatePresentationModel::RemoveCertificateSelector(void)
138 delete __pICertificatePresentationModelSelector;
139 __pICertificatePresentationModelSelector = null;
143 CertificatePresentationModel::UpdateCertificateListFromCertificateStore(void)
145 RemoveCertificateList();
146 SetCertificateSelector(__pICertificatePresentationModelSelector->GetType());
148 __pCertificateList = new (std::nothrow) ArrayListT<Tizen::Security::Cert::ICertificate*>();
149 result r = __pCertificateList->Construct();
152 AppLogDebug("__pCertificateList->Construct failed(%s)", GetErrorMessage(r));
153 delete __pCertificateList;
154 __pCertificateList = null;
159 int storedCertificateCount = 0;
160 r = __pX509CertificateStore->GetCertificateCount(storedCertificateCount);
163 AppLogDebug("GetCertificateCount failed(%s) or GetCertificateCount is zero", GetErrorMessage(r));
164 RemoveCertificateList();
165 delete __pCertificateList;
166 __pCertificateList = null;
169 for (int i = 0; i < storedCertificateCount; i++)
171 ICertificate* pCertificate = __pX509CertificateStore->GetNextCertificateN();
172 if (pCertificate == null)
174 AppLogDebug("GetNextCertificateN is null");
178 __pCertificateList->Add(pCertificate);
181 if (__pCertificateList->GetCount() != storedCertificateCount)
183 AppLogDebug("different between __pCertificateList->GetCount() and storedCertificateCount");
184 RemoveCertificateList();
192 CertificatePresentationModel::RemoveCertificateList(void)
194 if (__pCertificateList != null)
196 __pCertificateList->RemoveAll();
197 delete __pCertificateList;
198 __pCertificateList = null;
202 Tizen::Security::Cert::CertificateType
203 CertificatePresentationModel::GetCertificateSelectorType(void) const
205 return __pICertificatePresentationModelSelector->GetType();
209 CertificatePresentationModel::GetSubjectNameFromCertifcateStore(int i)
211 ICertificate* pICertificate;
212 result r = __pCertificateList->GetAt(i, pICertificate);
214 if (IsFailed(r) || pICertificate == null)
216 AppLogDebug("__pCertificateList->GetAt(%d) failed(%s) or pICertificate is null",i , GetErrorMessage(r));
217 SetLastResult(E_FAILURE);
221 return pICertificate->GetSubject();
224 Tizen::Security::Cert::ICertificate*
225 CertificatePresentationModel::GetCertificateFromCertificateStoreN(int i)
227 ICertificate* pICertificate;
228 result r = __pCertificateList->GetAt(i, pICertificate);
230 if (IsFailed(r) || pICertificate == null)
232 AppLogDebug("__pCertificateList->GetAt(%d) failed(%s) or pICertificate is null", i, GetErrorMessage(r));
236 ByteBuffer* pBuffer = pICertificate->GetEncodedDataN();
237 X509Certificate* pX509Certificate = new (std::nothrow) X509Certificate();
239 r = pX509Certificate->Construct(*pBuffer);
244 AppLogDebug("pCertificate->Construct failed(%s)", GetErrorMessage(r));
245 delete pX509Certificate;
249 return pX509Certificate;
253 CertificatePresentationModel::InitFoundUserCertificateToInstallList(void)
255 if (__pFoundUserCertificateToInstallList != null)
257 AppLogDebug("__pFoundUserCertificateToInstallList is not null");
260 __pFoundUserCertificateToInstallList = new (std::nothrow) ArrayList(SingleObjectDeleter);
261 return __pFoundUserCertificateToInstallList->Construct();
265 CertificatePresentationModel::RemoveFoundUserCertifiacteToInstallList(void)
267 if (__pFoundUserCertificateToInstallList != null)
269 delete __pFoundUserCertificateToInstallList;
270 __pFoundUserCertificateToInstallList = null;
275 CertificatePresentationModel::FindUserCertificateToInstallFromStorage(void)
277 if (__pICertificatePresentationModelSelector == null
278 || __pICertificatePresentationModelSelector->GetType() != USER_CERT)
280 AppLogDebug("selector is null or must be set USER_CERT");
284 RemoveFoundUserCertifiacteToInstallList();
285 InitFoundUserCertificateToInstallList();
287 DirEnumerator *pDirEnum = null;
288 String extrnalStoragePath = Environment::GetExternalStoragePath();
289 result r = dir.Construct(extrnalStoragePath);
292 AppLogDebug("dir.Construct failed(%s)", GetErrorMessage(r));
296 pDirEnum = dir.ReadN();
297 if (pDirEnum == null)
299 AppLogDebug("dir.ReadN is null");
302 while (pDirEnum->MoveNext() == E_SUCCESS)
304 DirEntry dirEntry = pDirEnum->GetCurrentDirEntry();
305 if (dirEntry.IsDirectory() == true)
309 String filePath = extrnalStoragePath + dirEntry.GetName();
310 if (File::GetFileExtension(filePath).Equals(L"p12", false)
311 || File::GetFileExtension(filePath).Equals(L"pfx", false))
313 __pFoundUserCertificateToInstallList->Add(new (std::nothrow) String(dirEntry.GetName()));
322 CertificatePresentationModel::GetFileNameInFoundUserCertificateToInstallListAt(int index)
324 if (__pFoundUserCertificateToInstallList == null)
326 AppLogDebug("__pFoundUserCertificateToInstallList is null");
327 SetLastResult(E_FAILURE);
330 String* certificateFileName = static_cast<String*>(__pFoundUserCertificateToInstallList->GetAt(index));
331 if (certificateFileName == null)
333 AppLogDebug("__pFoundUserCertificateToInstallList->GetAt is null");
334 SetLastResult(E_FAILURE);
338 return String(*certificateFileName);
342 CertificatePresentationModel::GetFoundUserCertificateToInstallListCount(void)
344 if (__pFoundUserCertificateToInstallList == null)
346 AppLogDebug("__pFoundUserCertificateToInstallList is null");
347 SetLastResult(E_FAILURE);
351 return __pFoundUserCertificateToInstallList->GetCount();
355 CertificatePresentationModel::GetCertificateStoreCount(void)
357 if (__pCertificateList == null)
362 return __pCertificateList->GetCount();
366 CertificatePresentationModel::RemoveFromCertificateStore(const Tizen::Security::Cert::ICertificate& certificate)
368 result r = __pX509CertificateStore->Remove(__pICertificatePresentationModelSelector->GetType(), certificate);
371 UpdateCertificateListFromCertificateStore();
378 CertificatePresentationModel::InsertPkcs12FormatIntoCertificateStore(const Tizen::Base::String& filePath, const Tizen::Base::String& password)
380 result r = __pX509CertificateStore->InsertPkcs12(filePath, password);
383 UpdateCertificateListFromCertificateStore();
390 CertificatePresentationModel::PushPendingCertificate(Tizen::Security::Cert::ICertificate& certificate)
392 ByteBuffer* pBuffer = certificate.GetEncodedDataN();
393 X509Certificate* pCertificate = new (std::nothrow) X509Certificate();
395 result r = pCertificate->Construct(*pBuffer);
398 if (IsFailed(r) || IsPendingCertificate() == true)
400 AppLogDebug("pCertificate->Construct failed(%s)", GetErrorMessage(r));
405 __pPendingCertificate = pCertificate;
409 Tizen::Security::Cert::ICertificate*
410 CertificatePresentationModel::PopPendingCertificateN(void)
412 if (IsPendingCertificate() == true)
414 ICertificate* pICertificate = __pPendingCertificate;
415 __pPendingCertificate = null;
417 return pICertificate;
424 CertificatePresentationModel::IsPendingCertificate(void)
426 if (__pPendingCertificate == null)
434 CertificatePresentationModel::ClearPendingCertificate(void)
436 if (IsPendingCertificate() == true)
438 delete __pPendingCertificate;
439 __pPendingCertificate = null;
444 CertificatePresentationModel::IsPendingUserCertificateFileNameToInstall(void)
446 if (__pPendingUserCertificateToInstallList == null)
454 CertificatePresentationModel::PushPendingUserCertificateFileNameToInstall(Tizen::Base::String& filePath)
456 if (IsPendingUserCertificateFileNameToInstall() == true)
458 AppLogDebug("IsPendingUserCertificateToInstall is true");
461 __pPendingUserCertificateToInstallList = new (std::nothrow) String(filePath);
466 CertificatePresentationModel::PopPendingUserCertificateFileNameToInstallN(void)
468 if (IsPendingUserCertificateFileNameToInstall() == true)
470 String* pUserCertificateToInstallList = __pPendingUserCertificateToInstallList;
471 __pPendingUserCertificateToInstallList = null;
472 return pUserCertificateToInstallList;
478 CertificatePresentationModel::ClearPendingUserCertificateFileNameToInstall(void)
480 if (IsPendingUserCertificateFileNameToInstall() == true)
482 delete __pPendingUserCertificateToInstallList;
483 __pPendingUserCertificateToInstallList = null;
487 ICertificatePresentationModelSelector::ICertificatePresentationModelSelector(void)
488 : __currentCertificateType(Tizen::Security::Cert::ROOT_CA)
492 Tizen::Security::Cert::CertificateType
493 ICertificatePresentationModelSelector::GetType(void) const
495 return __currentCertificateType;
499 ICertificatePresentationModelSelector::SetType(const Tizen::Security::Cert::CertificateType certificateType)
501 __currentCertificateType = certificateType;
505 CertificatePresentationModelUtility::GetCommonName(const Tizen::Base::String& source)
507 String isContan(L"CN=");
508 StringTokenizer strTokenizer(source, L"/");
509 while (strTokenizer.HasMoreTokens())
512 result r = strTokenizer.GetNextToken(recipient);
515 AppLogDebug("GetNextToken failed(%s)", GetErrorMessage(r));
519 if (recipient.Contains(isContan))
521 recipient.Remove(0, isContan.GetLength());
526 SetLastResult(E_FAILURE);
531 CertificatePresentationModelUtility::GetOrganisation(const Tizen::Base::String& source)
533 String isContan(L"O=");
534 StringTokenizer strTokenizer(source, L"/");
536 while (strTokenizer.HasMoreTokens())
539 result r = strTokenizer.GetNextToken(recipient);
542 AppLogDebug("GetNextToken failed(%s)", GetErrorMessage(r));
546 if (recipient.Contains(isContan))
548 recipient.Remove(0, isContan.GetLength());
553 SetLastResult(E_FAILURE);
558 CertificatePresentationModelUtility::GetHexPublicKeyString(Tizen::Security::IPublicKey& publicKey)
560 ByteBuffer* pBuffer = publicKey.GetEncodedN();
563 AppLogDebug("GetEncodedN is null");
564 SetLastResult(E_FAILURE);
570 char hexChar[] = "0123456789abcdef";
573 for (int bufferCurrentPos = 0; bufferCurrentPos < pBuffer->GetCapacity(); bufferCurrentPos++)
575 pBuffer->GetByte(bufferCurrentPos, value);
576 hex = (value & 0xF0) >> PUBLIC_KEY_HEX_RIGHT_SHIFT_4;
577 hexString.Append(hexChar[hex]);
580 hexString.Append(hexChar[hex]);
581 hexString.Append(L":");
583 hexString.Remove(hexString.GetLength() - DEFAULT_COUNT, DEFAULT_COUNT);