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.
18 * @file SignatureStep.cpp
19 * @brief This is the implementation file for %SignatureStep class.
23 #include <FBase_StringConverter.h>
25 #include "InstallationContext.h"
26 #include "PrivilegeHandler.h"
27 #include "SignatureHandler.h"
28 #include "SignatureStep.h"
30 using namespace Tizen::App;
31 using namespace Tizen::Base;
32 using namespace Tizen::Base::Collection;
33 using namespace Tizen::Io;
35 SignatureStep::SignatureStep(void)
36 :__state(STATE_SIGNER_CERT)
38 ,__pSignatureManager(null)
42 SignatureStep::~SignatureStep(void)
44 delete __pSignatureManager;
48 SignatureStep::Run(InstallationContext* pContext)
50 InstallerError error = INSTALLER_ERROR_NONE;
51 AppLog(" SignatureStep - START");
53 __pContext = pContext;
55 if (__pContext->__isVerificationMode == false)
57 AppLog("no signature file[%ls]", __pContext->GetSignatureXmlPath().GetPointer());
58 return INSTALLER_ERROR_NONE;
65 case STATE_SIGNER_CERT:
66 AppLog("[STATE_SIGNER_CERT]");
67 error = OnStateSignerCert();
70 case STATE_CERT_CHAIN:
71 AppLog("[STATE_CERT_CHAIN]");
72 error = OnStateCertChain();
76 AppLog("[STATE_ROOT_CERT]");
77 error = OnStateRootCert();
81 AppLog("[STATE_DONE]");
82 error = OnStateDone();
89 if (error != INSTALLER_ERROR_NONE)
94 if (__state > STATE_DONE)
96 AppLog(" SignatureStep - END");
105 SignatureStep::GoNextState(void)
111 SignatureStep::OnStateSignerCert(void)
113 InstallerError error = INSTALLER_ERROR_NONE;
116 __pSignatureManager = new (std::nothrow) SignatureManager();
117 TryCatch(__pSignatureManager, error = INSTALLER_ERROR_OUT_OF_MEMORY, "__pSignatureManager is null.");
119 ret = __pSignatureManager->Construct(__pContext);
120 TryCatch(ret == true, error = INSTALLER_ERROR_INTERNAL_STATE, "Construct() failed");
122 ret = __pSignatureManager->SetSignature();
123 TryCatch(ret == true, error = INSTALLER_ERROR_SIGNATURE_INVALID, "SetSignature() failed");
125 // test for signature validator
126 ret = __pSignatureManager->ValidateSignatures();
127 fprintf(stderr, " ## __pSignatureManager->ValidateSignatures() result = [%d]\n", ret);
135 SignatureStep::OnStateCertChain(void)
137 InstallerError error = INSTALLER_ERROR_NONE;
140 ret = __pSignatureManager->AddCert();
141 TryCatch(ret == true, error = INSTALLER_ERROR_CERTIFICATE_CHAIN_VERIFICATION_FAILED, "AddCert(DEVELOPER_ROOT_CERTIFICATE) failed");
143 ret = __pSignatureManager->VerifyChain();
144 if (__pContext->__isPreloaded == true)
146 fprintf(stderr, " ## VerifyChain() result = [%d]\n", ret);
150 TryCatch(ret == true, error = INSTALLER_ERROR_CERTIFICATE_CHAIN_VERIFICATION_FAILED, "VerifyChain() failed");
159 SignatureStep::OnStateRootCert(void)
161 InstallerError error = INSTALLER_ERROR_NONE;
162 result r = E_SUCCESS;
164 String hmacPrivileges;
165 ArrayList stringPrivilegeList;
166 stringPrivilegeList.Construct();
168 const ArrayList* pPrivilegeList = __pContext->GetPrivilegeList();
169 RootCertificateType certType = __pContext->__rootCertType;
170 PackageId packageId = __pContext->__packageId;
171 int apiVisibility = GetApiVisibility(certType);
173 AppLog("PackageId = [%ls], CertType = [%d], ApiVisibility = [%d]", packageId.GetPointer(), certType, apiVisibility);
175 if (pPrivilegeList != null)
177 r = PrivilegeHandler::GenerateCipherPrivilege(packageId, *pPrivilegeList, apiVisibility, privileges, hmacPrivileges, stringPrivilegeList);
178 TryCatch(!IsFailed(r), error = INSTALLER_ERROR_PRIVILEGE_INVALID, "privMgr.GeneratePrivilegeString() failed");
181 __pContext->__privileges = privileges;
182 __pContext->__hmacPrivileges = hmacPrivileges;
183 __pContext->__certType = apiVisibility;
184 __pContext->__pStringPrivilegeList = new ArrayList;
185 __pContext->__pStringPrivilegeList->Construct(stringPrivilegeList);
193 SignatureStep::OnStateDone(void)
195 InstallerError error = INSTALLER_ERROR_NONE;
202 SignatureStep::GetApiVisibility(RootCertificateType certType)
204 int apiVisibility = _API_VISIBILITY_NONE;
206 if (certType == ROOT_CERTIFICATE_PUBLIC)
208 apiVisibility = _API_VISIBILITY_PUBLIC;
210 else if (certType == ROOT_CERTIFICATE_PARTNER)
212 apiVisibility = _API_VISIBILITY_PARTNER;
214 else if (certType == ROOT_CERTIFICATE_PARTNER_OPERATOR)
216 apiVisibility = _API_VISIBILITY_PARTNER_OPERATOR;
218 else if (certType == ROOT_CERTIFICATE_PARTNER_MANUFACTURER)
220 apiVisibility = _API_VISIBILITY_PARTNER_MANUFACTURER;
223 return apiVisibility;