Store distributor2 certificates 45/68645/3
authorSangyoon Jang <s89.jang@samsung.com>
Mon, 9 May 2016 05:49:07 +0000 (14:49 +0900)
committerSangyoon Jang <s89.jang@samsung.com>
Tue, 10 May 2016 11:58:26 +0000 (04:58 -0700)
Change-Id: Ibdc88d3cddc5245f6bd42c47625d478660cb5106
Signed-off-by: Sangyoon Jang <s89.jang@samsung.com>
src/common/certificate_validation.cc
src/common/installer_context.h
src/common/pkgmgr_registration.cc

index 8082235..d0b80dd 100644 (file)
@@ -68,6 +68,25 @@ bool SetDistributorCertificate(ValidationCore::SignatureData data,
   return true;
 }
 
+bool SetDistributor2Certificate(ValidationCore::SignatureData data,
+    common_installer::CertificateInfo* cert_info) {
+  ValidationCore::CertificateList cert_list = data.getCertList();
+  ValidationCore::CertificateList::iterator it = cert_list.begin();
+  if (it == cert_list.end()) {
+    LOG(ERROR) << "No certificates in certificate list";
+    return false;
+  }
+  cert_info->distributor2_certificate.set(*it);
+  ++it;
+  if (it == cert_list.end()) {
+    LOG(ERROR) << "No intermediate certificates in certificate list";
+    return false;
+  }
+  cert_info->distributor2_intermediate_certificate.set(*it);
+  cert_info->distributor2_root_certificate.set(data.getRootCaCertificatePtr());
+  return true;
+}
+
 }  // namespace
 
 namespace common_installer {
@@ -146,8 +165,10 @@ bool ValidateSignatureFile(
         SetPrivilegeLevel(data, level);
         if (!SetDistributorCertificate(data, cert_info))
           return false;
+      } else if (file_info.getFileNumber() == 2) {
+        if (!SetDistributor2Certificate(data, cert_info))
+          return false;
       }
-      // TODO(s89.jang): Set distributor2 certificate
       break;
     default:
       LOG(ERROR) << "signature validation check failed : "
index 2f80477..7b1e5b6 100644 (file)
@@ -88,6 +88,13 @@ class CertificateInfo {
   Property<ValidationCore::CertificatePtr> distributor_intermediate_certificate;
   /** distributor_root_certificate */
   Property<ValidationCore::CertificatePtr> distributor_root_certificate;
+  /** distributor2_certificate */
+  Property<ValidationCore::CertificatePtr> distributor2_certificate;
+  /** distributor2_intermediate_certificate */
+  Property<ValidationCore::CertificatePtr>
+      distributor2_intermediate_certificate;
+  /** distributor2_root_certificate */
+  Property<ValidationCore::CertificatePtr> distributor2_root_certificate;
 };
 
 /**
index 73c1e67..7110f54 100644 (file)
@@ -85,6 +85,38 @@ bool RegisterCertificates(
     }
   }
 
+  const auto& dist2_cert = cert_info.distributor2_certificate.get();
+  if (dist2_cert) {
+    if (pkgmgr_installer_set_cert_value(handle, PM_SET_DISTRIBUTOR2_SIGNER_CERT,
+        const_cast<char*>(dist2_cert->getBase64().c_str())) < 0) {
+      pkgmgr_installer_destroy_certinfo_set_handle(handle);
+      LOG(ERROR) << "pkgmgrInstallerSetCertValue fail";
+      return false;
+    }
+  }
+
+  const auto& dist2_im_cert =
+      cert_info.distributor2_intermediate_certificate.get();
+  if (dist2_im_cert) {
+    if (pkgmgr_installer_set_cert_value(handle,
+        PM_SET_DISTRIBUTOR2_INTERMEDIATE_CERT,
+        const_cast<char*>(dist2_im_cert->getBase64().c_str())) < 0) {
+      pkgmgr_installer_destroy_certinfo_set_handle(handle);
+      LOG(ERROR) << "pkgmgrInstallerSetCertValue fail";
+      return false;
+    }
+  }
+
+  const auto& dist2_root_cert = cert_info.distributor2_root_certificate.get();
+  if (dist2_root_cert) {
+    if (pkgmgr_installer_set_cert_value(handle, PM_SET_DISTRIBUTOR2_ROOT_CERT,
+        const_cast<char*>(dist2_root_cert->getBase64().c_str())) < 0) {
+      pkgmgr_installer_destroy_certinfo_set_handle(handle);
+      LOG(ERROR) << "pkgmgrInstallerSetCertValue fail";
+      return false;
+    }
+  }
+
   if (pkgmgr_installer_save_certinfo(pkgid.c_str(), handle, uid) < 0) {
     pkgmgr_installer_destroy_certinfo_set_handle(handle);
     LOG(ERROR) << "Failed to save certificate information";