Adjust Pimpl idiom on signature validator 29/51829/1
authorKyungwook Tak <k.tak@samsung.com>
Mon, 16 Nov 2015 11:00:46 +0000 (20:00 +0900)
committerKyungwook Tak <k.tak@samsung.com>
Mon, 16 Nov 2015 11:28:48 +0000 (20:28 +0900)
 * Support expandable error code/string for plugin
 * Plugin is loaded once when SignatureValidator constructed
 * To hide plugin handler and other classes, pimpl idiom applied

Change-Id: I8597e3489f58a042070b409638bc8a2cdcd17b8d
Signed-off-by: Kyungwook Tak <k.tak@samsung.com>
tests/plugin/plugin-sample.cpp
tests/vcore/test-common.cpp
tests/vcore/test-common.h
tests/vcore/test-signature-validator.cpp
vcore/CMakeLists.txt
vcore/vcore/Error.h [new file with mode: 0644]
vcore/vcore/PluginHandler.cpp
vcore/vcore/PluginHandler.h
vcore/vcore/SignatureValidator.cpp
vcore/vcore/SignatureValidator.h
vcore/vcore/ValidatorPluginApi.h

index edf4b65..c5fe108 100644 (file)
@@ -20,6 +20,8 @@
  * @brief       signature validator plugin sample.
  */
 
+#include <string>
+
 #include <dlog.h>
 
 #include <vcore/ValidatorPluginApi.h>
@@ -43,16 +45,22 @@ public:
        Plugin() {}
        virtual ~Plugin() {}
 
-       virtual SignatureValidator::Result step(SignatureValidator::Result result, SignatureData &data);
+       virtual VCerr step(VCerr result, SignatureData &data);
+       virtual std::string errorToString(VCerr code);
 };
 
-SignatureValidator::Result Plugin::step(SignatureValidator::Result result, SignatureData &data)
+VCerr Plugin::step(VCerr result, SignatureData &data)
 {
        (void)data;
        SLOGI("Plugin::Step called!");
        return result;
 }
 
+std::string Plugin::errorToString(VCerr code)
+{
+       return std::string("Plugin errorstring code : ") + std::to_string(code);
+}
+
 } // namespace ValidationCore
 
 PLUGIN_API
index 5c7698b..3ef596b 100644 (file)
 
 #include "test-common.h"
 
-#define SIGNATURE_ERRORDESCRIBE(name) case ValidationCore::SignatureValidator::name: return #name
-const char *validatorErrorToString(ValidationCore::SignatureValidator::Result error)
-{
-       switch (error) {
-               SIGNATURE_ERRORDESCRIBE(SIGNATURE_VALID);
-               SIGNATURE_ERRORDESCRIBE(SIGNATURE_INVALID);
-               SIGNATURE_ERRORDESCRIBE(SIGNATURE_VERIFIED);
-               SIGNATURE_ERRORDESCRIBE(SIGNATURE_DISREGARD);
-               SIGNATURE_ERRORDESCRIBE(SIGNATURE_REVOKED);
-       default:
-               return "Invalid error code.";
-       }
-}
-#undef SIGNATURE_ERRORDESCRIBE
-
 const std::string TestData::widget_path = std::string(TESTAPP_RES_DIR) + "vcore_widget_uncompressed/";
 const std::string TestData::widget_negative_hash_path = std::string(TESTAPP_RES_DIR) + "vcore_widget_uncompressed_negative_hash/";
 const std::string TestData::widget_negative_signature_path = std::string(TESTAPP_RES_DIR) + "vcore_widget_uncompressed_negative_signature/";
index 624eb57..4081830 100644 (file)
 
 #include <string>
 
-#include <vcore/SignatureValidator.h>
-
-const char *validatorErrorToString(ValidationCore::SignatureValidator::Result error);
-
 namespace TestData {
 
 extern const std::string widget_path;
index ba6e85e..7762695 100644 (file)
@@ -15,6 +15,7 @@
  *    limitations under the License.
  */
 #include <string>
+#include <iostream>
 
 #include <dpl/test/test_runner.h>
 #include <vcore/SignatureFinder.h>
@@ -91,26 +92,24 @@ RUNNER_TEST(T0012_signature_validator)
         SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
         "SignatureFinder failed");
 
-    for (SignatureFileInfoSet::reverse_iterator iter = signatureSet.rbegin();
-        iter != signatureSet.rend();
-        ++iter) {
+    for (auto &sig : signatureSet) {
+        SignatureValidator validator(sig);
         SignatureData data;
-        SignatureValidator::Result valResult = SignatureValidator::check(
-                *iter,
+        VCerr result = validator.check(
                 TestData::widget_path,
                 false,
                 true,
                 data);
 
         if (data.isAuthorSignature())
-            RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_DISREGARD,
+            RUNNER_ASSERT_MSG(result == E_SIG_DISREGARDED,
                 "Validation failed");
         else
             if (data.getSignatureNumber() == 1)
-                RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_DISREGARD,
+                RUNNER_ASSERT_MSG(result == E_SIG_DISREGARDED,
                     "Validation failed");
             else
-                RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_VERIFIED,
+                RUNNER_ASSERT_MSG(result == E_SIG_NONE,
                     "Validation failed");
     }
 }
@@ -123,22 +122,20 @@ RUNNER_TEST(T00121_signature_validator_negative_hash_input)
         SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
         "SignatureFinder failed");
 
-    for (SignatureFileInfoSet::reverse_iterator iter = signatureSet.rbegin();
-        iter != signatureSet.rend();
-        ++iter) {
+    for (auto &sig : signatureSet) {
+        SignatureValidator validator(sig);
         SignatureData data;
-        SignatureValidator::Result valResult = SignatureValidator::check(
-                *iter,
+        VCerr result = validator.check(
                 TestData::widget_negative_hash_path,
                 false,
                 true,
                 data);
         if (!data.isAuthorSignature())
-            RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_INVALID,
-                "Wrong input file but success.. Errorcode : " << validatorErrorToString(valResult));
+            RUNNER_ASSERT_MSG(result == E_SIG_INVALID_FORMAT,
+                "Wrong input file but success.. Errorcode : " << validator.errorToString(result));
         else
-            RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_DISREGARD,
-                "Wrong input file but success.. Errorcode : " << validatorErrorToString(valResult));
+            RUNNER_ASSERT_MSG(result == E_SIG_DISREGARDED,
+                "Wrong input file but success.. Errorcode : " << validator.errorToString(result));
     }
 }
 
@@ -150,23 +147,21 @@ RUNNER_TEST(T00122_signature_validator_negative_signature_input)
         SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
         "SignatureFinder failed");
 
-    for (SignatureFileInfoSet::reverse_iterator iter = signatureSet.rbegin();
-        iter != signatureSet.rend();
-        ++iter) {
+    for (auto &sig : signatureSet) {
+        SignatureValidator validator(sig);
         SignatureData data;
-        SignatureValidator::Result valResult = SignatureValidator::check(
-                *iter,
+        VCerr result = validator.check(
                 TestData::widget_negative_signature_path,
                 false,
                 true,
                 data);
 
         if (!data.isAuthorSignature())
-            RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_INVALID,
-                "Wrong input file but success.. Errorcode : " << validatorErrorToString(valResult));
+            RUNNER_ASSERT_MSG(result == E_SIG_INVALID_FORMAT,
+                "Wrong input file but success.. Errorcode : " << validator.errorToString(result));
         else
-            RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_DISREGARD,
-                "Wrong input file but success.. Errorcode : " << validatorErrorToString(valResult));
+            RUNNER_ASSERT_MSG(result == E_SIG_DISREGARDED,
+                "Wrong input file but success.. Errorcode : " << validator.errorToString(result));
     }
 }
 
@@ -178,19 +173,17 @@ RUNNER_TEST(T00123_signature_validator_partner)
         SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
         "SignatureFinder failed");
 
-    for (SignatureFileInfoSet::reverse_iterator iter = signatureSet.rbegin();
-        iter != signatureSet.rend();
-        ++iter) {
+    for (auto &sig : signatureSet) {
+        SignatureValidator validator(sig);
         SignatureData data;
-        SignatureValidator::Result valResult = SignatureValidator::check(
-                *iter,
+        VCerr result = validator.check(
                 TestData::widget_partner_path,
                 false,
                 true,
                 data);
 
-        RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_VERIFIED,
-            "Wrong input file but success.. Errorcode : " << validatorErrorToString(valResult));
+        RUNNER_ASSERT_MSG(result == E_SIG_NONE,
+            "Wrong input file but success.. Errorcode : " << validator.errorToString(result));
         if (!data.isAuthorSignature()) {
             RUNNER_ASSERT_MSG(
                     data.getVisibilityLevel() == CertStoreId::VIS_PARTNER,
@@ -214,26 +207,25 @@ RUNNER_TEST(T0013_signature_validator)
         SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
         "SignatureFinder failed");
 
-    for (SignatureFileInfoSet::reverse_iterator iter = signatureSet.rbegin();
-        iter != signatureSet.rend();
-        ++iter) {
+
+    for (auto &sig : signatureSet) {
+        SignatureValidator validator(sig);
         SignatureData data;
-        SignatureValidator::Result valResult = SignatureValidator::check(
-                *iter,
+        VCerr result = validator.check(
                 TestData::widget_path,
                 false,
                 false,
                 data);
 
         if (data.isAuthorSignature())
-            RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_DISREGARD,
+            RUNNER_ASSERT_MSG(result == E_SIG_DISREGARDED,
                 "Validation failed");
         else
             if (data.getSignatureNumber() == 1)
-                RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_DISREGARD,
+                RUNNER_ASSERT_MSG(result == E_SIG_DISREGARDED,
                         "Validation failed");
             else
-                RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_VERIFIED,
+                RUNNER_ASSERT_MSG(result == E_SIG_NONE,
                         "Validation failed");
     }
 }
@@ -246,23 +238,21 @@ RUNNER_TEST(T00131_signature_validator_negative_hash_input)
         SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
         "SignatureFinder failed");
 
-    for (SignatureFileInfoSet::reverse_iterator iter = signatureSet.rbegin();
-        iter != signatureSet.rend();
-        ++iter) {
+    for (auto &sig : signatureSet) {
+        SignatureValidator validator(sig);
         SignatureData data;
-        SignatureValidator::Result valResult = SignatureValidator::check(
-                *iter,
+        VCerr result = validator.check(
                 TestData::widget_negative_hash_path,
                 false,
                 false,
                 data);
 
         if (!data.isAuthorSignature())
-            RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_INVALID,
-                "Wrong input file but success.. Errorcode : " << validatorErrorToString(valResult));
+            RUNNER_ASSERT_MSG(result == E_SIG_INVALID_FORMAT,
+                "Wrong input file but success.. Errorcode : " << validator.errorToString(result));
         else
-            RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_DISREGARD,
-                "Wrong input file but success.. Errorcode : " << validatorErrorToString(valResult));
+            RUNNER_ASSERT_MSG(result == E_SIG_DISREGARDED,
+                "Wrong input file but success.. Errorcode : " << validator.errorToString(result));
     }
 }
 
@@ -274,23 +264,21 @@ RUNNER_TEST(T00132_signature_validator_negative_signature_input)
         SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
         "SignatureFinder failed");
 
-    for (SignatureFileInfoSet::reverse_iterator iter = signatureSet.rbegin();
-        iter != signatureSet.rend();
-        ++iter) {
+    for (auto &sig : signatureSet) {
+        SignatureValidator validator(sig);
         SignatureData data;
-        SignatureValidator::Result valResult = SignatureValidator::check(
-                *iter,
+        VCerr result = validator.check(
                 TestData::widget_negative_signature_path,
                 false,
                 false,
                 data);
 
         if (!data.isAuthorSignature())
-            RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_INVALID,
-                "Wrong input file but success.. Errorcode : " << validatorErrorToString(valResult));
+            RUNNER_ASSERT_MSG(result == E_SIG_INVALID_FORMAT,
+                "Wrong input file but success.. Errorcode : " << validator.errorToString(result));
         else
-            RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_DISREGARD,
-                "Wrong input file but success.. Errorcode : " << validatorErrorToString(valResult));
+            RUNNER_ASSERT_MSG(result == E_SIG_DISREGARDED,
+                "Wrong input file but success.. Errorcode : " << validator.errorToString(result));
     }
 }
 
@@ -302,19 +290,17 @@ RUNNER_TEST(T00133_signature_validator_partner)
         SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
         "SignatureFinder failed");
 
-    for (SignatureFileInfoSet::reverse_iterator iter = signatureSet.rbegin();
-        iter != signatureSet.rend();
-        ++iter) {
+    for (auto &sig : signatureSet) {
+        SignatureValidator validator(sig);
         SignatureData data;
-        SignatureValidator::Result valResult = SignatureValidator::check(
-                *iter,
+        VCerr result = validator.check(
                 TestData::widget_partner_path,
                 false,
                 false,
                 data);
 
-        RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_VERIFIED,
-            "Wrong input file but success.. Errorcode : " << validatorErrorToString(valResult));
+        RUNNER_ASSERT_MSG(result == E_SIG_NONE,
+            "Wrong input file but success.. Errorcode : " << validator.errorToString(result));
 
         if (!data.isAuthorSignature())
             RUNNER_ASSERT_MSG(data.getVisibilityLevel() == CertStoreId::VIS_PARTNER,
@@ -336,36 +322,26 @@ RUNNER_TEST(T0014_signature_reference)
         SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
         "SignatureFinder failed");
 
-    for (SignatureFileInfoSet::reverse_iterator iter = signatureSet.rbegin();
-        iter != signatureSet.rend();
-        ++iter) {
+
+    for (auto &sig : signatureSet) {
+        SignatureValidator validator(sig);
         SignatureData data;
-        SignatureValidator::Result valResult = SignatureValidator::check(
-                *iter,
+        VCerr result = validator.check(
                 TestData::widget_path,
                 false,
                 false,
                 data);
 
         if (data.isAuthorSignature())
-            RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_DISREGARD,
+            RUNNER_ASSERT_MSG(result == E_SIG_DISREGARDED,
                 "Validation failed");
         else
             if (data.getSignatureNumber() == 1)
-                RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_DISREGARD,
+                RUNNER_ASSERT_MSG(result == E_SIG_DISREGARDED,
                     "Validation failed");
             else
-                RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_VERIFIED,
+                RUNNER_ASSERT_MSG(result == E_SIG_NONE,
                     "Validation failed");
-
-/*
-        ReferenceValidator val(TestData::widget_path);
-        int temp = val.checkReferences(data);
-        RUNNER_ASSERT_MSG(ReferenceValidator::NO_ERROR == temp,
-                "File[" << iter->getFileName()
-                << "] FileNumber[" << iter->getFileNumber()
-                << "] Errorcode : " << refValidatorErrorToString(temp));
-*/
     }
 }
 
@@ -494,14 +470,34 @@ RUNNER_TEST(T00146_signature_reference_encoding_negative)
 */
 
 
-RUNNER_TEST_GROUP_INIT(T0020_Certificate)
+RUNNER_TEST_GROUP_INIT(T0020_SigVal_errorstring)
+
+RUNNER_TEST(T0021)
+{
+    SignatureValidator validator(SignatureFileInfo("test-dummy", 1));
+
+    for (VCerr code = E_SCOPE_FIRST; code >= E_SCOPE_LAST; code--) {
+        std::cout << "E_SIG code["
+            << code << "] : "
+            << validator.errorToString(code) << std::endl;
+    }
+
+    /* print 10 more error code below last in case of plugin err exist */
+    for (VCerr code = E_SCOPE_LAST - 1; code >= E_SCOPE_LAST - 10; code--) {
+        std::cout << "VCerr from plugin["
+            << code << "] : "
+            << validator.errorToString(code) << std::endl;
+    }
+}
+
+RUNNER_TEST_GROUP_INIT(T0030_Certificate)
 
 /*
  * test: class Certificate
  * description: Certificate should parse data passed to object constructor.
  * expected: Getters should be able to return certificate information.
  */
-RUNNER_TEST(T0021_Certificate)
+RUNNER_TEST(T0031_Certificate)
 {
     Certificate cert(TestData::certVerisign, Certificate::FORM_BASE64);
     std::string result;
@@ -525,7 +521,7 @@ RUNNER_TEST(T0021_Certificate)
  * description: Certificate should parse data passed to object constructor.
  * expected: Function fingerprint should return valid fingerprint.
  */
-RUNNER_TEST(T0022_Certificate)
+RUNNER_TEST(T0032_Certificate)
 {
     Certificate cert(TestData::certVerisign, Certificate::FORM_BASE64);
 
@@ -550,7 +546,7 @@ RUNNER_TEST(T0022_Certificate)
  * expected: Function getAlternativeNameDNS should return list of
  * alternativeNames hardcoded in certificate.
  */
-RUNNER_TEST(T0023_Certificate)
+RUNNER_TEST(T0033_Certificate)
 {
     Certificate cert(TestData::certVerisign, Certificate::FORM_BASE64);
 
@@ -571,7 +567,7 @@ RUNNER_TEST(T0023_Certificate)
  * description: Certificate should parse data passed to object constructor.
  * expected: 1st and 2nd certificate should be identified as CA.
  */
-RUNNER_TEST(T0024_Certificate_isCA)
+RUNNER_TEST(T0034_Certificate_isCA)
 {
     Certificate cert1(TestData::googleCA, Certificate::FORM_BASE64);
     RUNNER_ASSERT(cert1.isCA() > 0);
index 8e71a82..00aa7be 100644 (file)
@@ -132,6 +132,7 @@ INSTALL(FILES
     ${VCORE_DIR}/vcore/CertStoreType.h
     ${VCORE_DIR}/vcore/exception.h
     ${VCORE_DIR}/vcore/ValidatorPluginApi.h
+    ${VCORE_DIR}/vcore/Error.h
     DESTINATION ${INCLUDEDIR}/cert-svc/vcore
     )
 
diff --git a/vcore/vcore/Error.h b/vcore/vcore/Error.h
new file mode 100644 (file)
index 0000000..3f79543
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+/*
+ * @file        Error.h
+ * @author      Kyungwook Tak (k.tak@samsung.com)
+ * @version     1.0
+ * @brief       Error codes of signature validator.
+ */
+#pragma once
+
+namespace ValidationCore {
+
+using VCerr = int;
+
+const VCerr E_SIG_NONE           = 0;
+const VCerr E_SIG_INVALID_FORMAT = -1;
+const VCerr E_SIG_INVALID_CERT   = -2;
+const VCerr E_SIG_INVALID_CHAIN  = -3;
+const VCerr E_SIG_INVALID_REF    = -4;
+const VCerr E_SIG_CERT_EXPIRED   = -5;
+const VCerr E_SIG_CERT_NOT_YET   = -6;
+const VCerr E_SIG_DISREGARDED    = -7;
+const VCerr E_SIG_REVOKED        = -8;
+const VCerr E_SIG_PLUGIN         = -9;
+const VCerr E_SIG_OUT_OF_MEM     = -10;
+const VCerr E_SIG_UNKNOWN        = -11;
+
+const VCerr E_SCOPE_FIRST        = E_SIG_INVALID_FORMAT;
+const VCerr E_SCOPE_LAST         = E_SIG_UNKNOWN;
+
+}
index 04c1a95..98aa0b9 100644 (file)
@@ -82,7 +82,7 @@ bool PluginHandler::fail() const
        return m_fail;
 }
 
-SignatureValidator::Result PluginHandler::step(SignatureValidator::Result result, SignatureData &data)
+VCerr PluginHandler::step(VCerr result, SignatureData &data)
 {
        if (!m_plugin) {
                LogError("Plugin is not initialized.");
@@ -92,4 +92,12 @@ SignatureValidator::Result PluginHandler::step(SignatureValidator::Result result
        return m_plugin->step(result, data);
 }
 
+std::string PluginHandler::errorToString(VCerr code)
+{
+       if (!m_plugin)
+               return "Plugin is not initialized";
+
+       return m_plugin->errorToString(code);
+}
+
 } // namespace ValidationCore
index 9754bf0..1b83b02 100644 (file)
  */
 #pragma once
 
+#include <string>
+
 #include <vcore/SignatureData.h>
 #include <vcore/SignatureValidator.h>
 #include <vcore/ValidatorPluginApi.h>
+#include <vcore/Error.h>
 
 namespace ValidationCore {
 
@@ -37,7 +40,8 @@ public:
        virtual ~PluginHandler();
 
        bool fail(void) const;
-       SignatureValidator::Result step(SignatureValidator::Result result, SignatureData &data);
+       VCerr step(VCerr result, SignatureData &data);
+       std::string errorToString(VCerr code);
 
 private:
        void *m_dlhandle;
index 0875661..f899339 100644 (file)
  * @brief       Implementatin of tizen signature validation protocol.
  */
 
+#include <memory>
+#include <string>
+#include <utility>
+
 #include <dpl/log/log.h>
 
 #include <vcore/CertificateCollection.h>
 
 #include <vcore/SignatureValidator.h>
 
+using namespace ValidationCore::CertStoreId;
+
 namespace {
 
-const std::string TOKEN_ROLE_AUTHOR_URI =
-       "http://www.w3.org/ns/widgets-digsig#role-author";
-const std::string TOKEN_ROLE_DISTRIBUTOR_URI =
-       "http://www.w3.org/ns/widgets-digsig#role-distributor";
-const std::string TOKEN_PROFILE_URI =
-       "http://www.w3.org/ns/widgets-digsig#profile";
+const std::string TOKEN_PREFIX          = "http://www.w3.org/ns/widgets-digsig#";
+const std::string TOKEN_ROLE_AUTHOR_URI = TOKEN_PREFIX + "role-author";
+const std::string TOKEN_ROLE_DIST_URI   = TOKEN_PREFIX + "role-distributor";
+const std::string TOKEN_PROFILE_URI     = TOKEN_PREFIX + "profile";
+
+enum class CertTimeStatus : int {
+       VALID,
+       NOT_YET,
+       EXPIRED
+};
 
-static tm _ASN1_GetTimeT(ASN1_TIME *time)
+struct tm _ASN1_GetTimeT(ASN1_TIME *time)
 {
        struct tm t;
-       const charstr = (const char *)time->data;
+       const char *str = (const char *)time->data;
        size_t i = 0;
 
        memset(&t, 0, sizeof(t));
@@ -78,53 +88,7 @@ static tm _ASN1_GetTimeT(ASN1_TIME *time)
        return t;
 }
 
-static bool checkRoleURI(const ValidationCore::SignatureData &data)
-{
-       std::string roleURI = data.getRoleURI();
-
-       if (roleURI.empty()) {
-               LogWarning("URI attribute in Role tag couldn't be empty.");
-               return false;
-       }
-
-       if (roleURI != TOKEN_ROLE_AUTHOR_URI && data.isAuthorSignature()) {
-               LogWarning("URI attribute in Role tag does not "
-                       "match with signature filename.");
-               return false;
-       }
-
-       if (roleURI != TOKEN_ROLE_DISTRIBUTOR_URI && !data.isAuthorSignature()) {
-               LogWarning("URI attribute in Role tag does not "
-                       "match with signature filename.");
-               return false;
-       }
-       return true;
-}
-
-static bool checkProfileURI(const ValidationCore::SignatureData &data)
-{
-       if (TOKEN_PROFILE_URI != data.getProfileURI()) {
-               LogWarning("Profile tag contains unsupported value "
-                       "in URI attribute " << data.getProfileURI());
-               return false;
-       }
-       return true;
-}
-
-static bool checkObjectReferences(const ValidationCore::SignatureData &data)
-{
-       ValidationCore::ObjectList objectList = data.getObjectList();
-       ValidationCore::ObjectList::const_iterator iter;
-       for (iter = objectList.begin(); iter != objectList.end(); ++iter) {
-               if (!data.containObjectReference(*iter)) {
-                       LogWarning("Signature does not contain reference for object " << *iter);
-                       return false;
-               }
-       }
-       return true;
-}
-
-static struct tm getMidTime(const struct tm &tb, const struct tm &ta)
+struct tm getMidTime(const struct tm &tb, const struct tm &ta)
 {
        struct tm tMid;
        memset(&tMid, 0, sizeof(tMid));
@@ -177,215 +141,313 @@ static struct tm getMidTime(const struct tm &tb, const struct tm &ta)
        return tMid;
 }
 
-} // namespace anonymous
+inline CertTimeStatus timeValidation(ASN1_TIME *min, ASN1_TIME *max, time_t *cur)
+{
+       if (X509_cmp_time(min, cur) > 0)
+               return CertTimeStatus::NOT_YET;
+       else if (X509_cmp_time(max, cur) < 0)
+               return CertTimeStatus::EXPIRED;
+       else
+               return CertTimeStatus::VALID;
+}
+
+inline bool isTimeStrict(const Set &stores)
+{
+       return (stores.contains(TIZEN_TEST) || stores.contains(TIZEN_VERIFY))
+               ? true : false;
+}
 
+} // namespace anonymous
 
 
 namespace ValidationCore {
 
-static SignatureValidator::Result additionalCheck(SignatureValidator::Result result, SignatureData &data)
+class SignatureValidator::Impl {
+public:
+       Impl(const SignatureFileInfo &info);
+       virtual ~Impl() {};
+
+       VCerr check(
+               const std::string &contentPath,
+               bool checkOcsp,
+               bool checkReferences,
+               SignatureData &outData);
+
+       VCerr checkList(
+               const std::string &contentPath,
+               const UriList &uriList,
+               bool checkOcsp,
+               bool checkReferences,
+               SignatureData &outData);
+
+       VCerr makeChainBySignature(
+               bool completeWithSystemCert,
+               CertificateList &certList);
+
+       std::string errorToString(VCerr code);
+
+private:
+       VCerr baseCheck(
+               const std::string &contentPath,
+               bool checkOcsp,
+               bool checkReferences);
+
+       VCerr baseCheckList(
+               const std::string &contentPath,
+               const UriList &uriList,
+               bool checkOcsp,
+               bool checkReferences);
+
+       VCerr makeDataBySignature(bool completeWithSystemCert);
+       VCerr additionalCheck(VCerr result);
+
+       VCerr parseSignature(void);
+       VCerr preStep(void);
+       bool checkRoleURI(void);
+       bool checkProfileURI(void);
+       bool checkObjectReferences(void);
+
+       PluginHandler m_pluginHandler;
+       SignatureFileInfo m_fileInfo;
+       XmlSec::XmlSecContext m_context;
+       SignatureData m_data;
+       bool m_disregarded;
+};
+
+
+SignatureValidator::Impl::Impl(const SignatureFileInfo &info)
+       : m_fileInfo(info)
+       , m_disregarded(false)
+{
+}
+
+bool SignatureValidator::Impl::checkRoleURI(void)
+{
+       std::string roleURI = m_data.getRoleURI();
+
+       if (roleURI.empty()) {
+               LogWarning("URI attribute in Role tag couldn't be empty.");
+               return false;
+       }
+
+       if (roleURI != TOKEN_ROLE_AUTHOR_URI && m_data.isAuthorSignature()) {
+               LogWarning("URI attribute in Role tag does not "
+                       "match with signature filename.");
+               return false;
+       }
+
+       if (roleURI != TOKEN_ROLE_DIST_URI && !m_data.isAuthorSignature()) {
+               LogWarning("URI attribute in Role tag does not "
+                       "match with signature filename.");
+               return false;
+       }
+       return true;
+}
+
+
+bool SignatureValidator::Impl::checkProfileURI(void)
+{
+       if (TOKEN_PROFILE_URI != m_data.getProfileURI()) {
+               LogWarning("Profile tag contains unsupported value "
+                       "in URI attribute " << m_data.getProfileURI());
+               return false;
+       }
+       return true;
+}
+
+bool SignatureValidator::Impl::checkObjectReferences(void)
+{
+       for (const auto &object : m_data.getObjectList()) {
+               if (!m_data.containObjectReference(object)) {
+                       LogWarning("Signature does not contain reference for object " << object);
+                       return false;
+               }
+       }
+
+       return true;
+}
+
+VCerr SignatureValidator::Impl::additionalCheck(VCerr result)
 {
        try {
-               PluginHandler handler;
-               if (handler.fail()) {
+               if (m_pluginHandler.fail()) {
                        LogInfo("No validator plugin found. Skip additional check.");
                        return result;
                }
 
-               return handler.step(result, data);
+               return m_pluginHandler.step(result, m_data);
        } catch (...) {
                LogError("Exception in additional check by plugin.");
-               return SignatureValidator::SIGNATURE_INVALID;
+               return E_SIG_PLUGIN;
        }
 }
 
-/*
- *  Parse xml and save info to signature data.
- *
- *  [out] outData  : signature data for validating and will be finally returned to client.
- */
-static int parseSignature(SignatureData &outData)
+VCerr SignatureValidator::Impl::parseSignature(void)
 {
        try {
                SignatureReader xml;
-               xml.initialize(outData, SIGNATURE_SCHEMA_PATH);
-               xml.read(outData);
+               xml.initialize(m_data, SIGNATURE_SCHEMA_PATH);
+               xml.read(m_data);
        } catch (...) {
                LogError("Failed to parse signature file by signature reader.");
-               return -1;
+               return E_SIG_INVALID_FORMAT;
        }
 
-       return 0;
+       return E_SIG_NONE;
 }
 
 /*
  *  Make SignatureData by parsing signature file.
  *  and get certificate chain with attached certificate in signature
  */
-static int makeDataBySignature(
-       const SignatureFileInfo &fileInfo,
-       bool completeWithSystemCert,
-       SignatureData &data)
+VCerr SignatureValidator::Impl::makeDataBySignature(bool completeWithSystemCert)
 {
-       data = SignatureData(fileInfo.getFileName(), fileInfo.getFileNumber());
+       m_data = SignatureData(m_fileInfo.getFileName(), m_fileInfo.getFileNumber());
 
-       if (parseSignature(data)) {
+       if (parseSignature()) {
                LogError("Failed to parse signature.");
-               return -1;
+               return E_SIG_INVALID_FORMAT;
        }
 
-       if (!checkRoleURI(data) || !checkProfileURI(data))
-               return -1;
+       if (!checkRoleURI() || !checkProfileURI())
+               return E_SIG_INVALID_FORMAT;
 
        try {
                CertificateCollection collection;
-               collection.load(data.getCertList());
+               collection.load(m_data.getCertList());
 
                if (!collection.sort() || collection.empty()) {
                        LogError("Certificates do not form valid chain.");
-                       return -1;
+                       return E_SIG_INVALID_CHAIN;
                }
 
                if (completeWithSystemCert && !collection.completeCertificateChain()) {
                        LogError("Failed to complete cert chain with system cert");
-                       return -1;
+                       return E_SIG_INVALID_CHAIN;
                }
 
-               data.setSortedCertificateList(collection.getChain());
-               return 0;
+               m_data.setSortedCertificateList(collection.getChain());
 
        } catch (const CertificateCollection::Exception::Base &e) {
                LogError("CertificateCollection exception : " << e.DumpToString());
-               return -1;
+               return E_SIG_INVALID_CHAIN;
        } catch (const std::exception &e) {
                LogError("std exception occured : " << e.what());
-               return -1;
+               return E_SIG_UNKNOWN;
        } catch (...) {
                LogError("Unknown exception in SignatureValidator::makeChainBySignature");
-               return -1;
+               return E_SIG_UNKNOWN;
        }
+
+       return E_SIG_NONE;
 }
 
-/*
- *  Same logic (check, checkList) is functionalized here.
- *
- *  [in]  fileInfo  : file info of signature to check
- *  [out] disregard : distributor signature disregard flag.
- *  [out] context   : xml sec for validating.
- *  [out] data      : signature data for validationg and will be finally returned to client.
- */
-static SignatureValidator::Result preStep(
-       const SignatureFileInfo &fileInfo,
-       bool &disregard,
-       XmlSec::XmlSecContext &context,
-       SignatureData &data)
+VCerr SignatureValidator::Impl::preStep(void)
 {
-       if (makeDataBySignature(fileInfo, true, data))
-               return SignatureValidator::SIGNATURE_INVALID;
+       VCerr result = makeDataBySignature(true);
+       if (result != E_SIG_NONE)
+               return result;
 
        // Is Root CA certificate trusted?
-       CertStoreId::Set storeIdSet = createCertificateIdentifier().find(data.getCertList().back());
+       Set storeIdSet = createCertificateIdentifier().find(m_data.getCertList().back());
 
        LogDebug("root certificate from " << storeIdSet.typeToString() << " domain");
-       if (data.isAuthorSignature()) {
-               if (!storeIdSet.contains(CertStoreId::TIZEN_DEVELOPER)) {
-                       LogWarning("author-signature.xml has got unrecognized Root CA "
-                               "certificate. Signature will be disregarded.");
-                       disregard = true;
+       if (m_data.isAuthorSignature()) {
+               if (!storeIdSet.contains(TIZEN_DEVELOPER)) {
+                       LogWarning("author-signature.xml has got unrecognized Root CA certificate. "
+                               "Signature will be disregarded.");
+                       m_disregarded = true;
                }
        } else {
-               LogDebug("signaturefile name = " << data.getSignatureFileName());
-               if (storeIdSet.contains(CertStoreId::TIZEN_DEVELOPER)) {
-                       LogError("distributor has author level siganture! Signature will be disregarded.");
-                       return SignatureValidator::SIGNATURE_INVALID;
+               LogDebug("signaturefile name = " << m_data.getSignatureFileName());
+               if (storeIdSet.contains(TIZEN_DEVELOPER)) {
+                       LogError("distributor has author level siganture! "
+                               "Signature will be disregarded.");
+                       return E_SIG_INVALID_FORMAT;
                }
 
-               if (data.getSignatureNumber() == 1 && !storeIdSet.isContainsVis()) {
-                       LogWarning("signature1.xml has got unrecognized Root CA "
-                               "certificate. Signature will be disregarded.");
-                       disregard = true;
+               if (m_data.getSignatureNumber() == 1 && !storeIdSet.isContainsVis()) {
+                       LogWarning("signature1.xml has got unrecognized Root CA certificate. "
+                               "Signature will be disregarded.");
+                       m_disregarded = true;
                }
        }
 
-       data.setStorageType(storeIdSet);
+       m_data.setStorageType(storeIdSet);
 
        /*
         * We add only Root CA certificate because the rest
         * of certificates are present in signature files ;-)
         */
-       context.signatureFile = data.getSignatureFileName();
-       context.certificatePtr = data.getCertList().back();
+       m_context.signatureFile = m_data.getSignatureFileName();
+       m_context.certificatePtr = m_data.getCertList().back();
 
        /* certificate time check */
-       ASN1_TIME* notAfterTime = data.getEndEntityCertificatePtr()->getNotAfterTime();
-       ASN1_TIME* notBeforeTime = data.getEndEntityCertificatePtr()->getNotBeforeTime();
+       ASN1_TIME *notAfterTime = m_data.getEndEntityCertificatePtr()->getNotAfterTime();
+       ASN1_TIME *notBeforeTime = m_data.getEndEntityCertificatePtr()->getNotBeforeTime();
 
        time_t nowTime = time(NULL);
 
-       if (X509_cmp_time(notBeforeTime, &nowTime) > 0  || X509_cmp_time(notAfterTime, &nowTime) < 0) {
-               if (storeIdSet.contains(CertStoreId::TIZEN_TEST) || storeIdSet.contains(CertStoreId::TIZEN_VERIFY)) {
-                       LogError("TIZEN_VERIFY : check certificate Time : FALSE");
-                       return SignatureValidator::SIGNATURE_INVALID;
-               }
+       CertTimeStatus status = timeValidation(notBeforeTime, notAfterTime, &nowTime);
+       if (status != CertTimeStatus::VALID) {
+               if (isTimeStrict(storeIdSet))
+                       return status == CertTimeStatus::EXPIRED
+                                       ? E_SIG_CERT_EXPIRED : E_SIG_CERT_NOT_YET;
 
-               struct tm tMid = getMidTime(_ASN1_GetTimeT(notBeforeTime), _ASN1_GetTimeT(notAfterTime));
+               struct tm tMid = getMidTime(
+                               _ASN1_GetTimeT(notBeforeTime),
+                               _ASN1_GetTimeT(notAfterTime));
 
-               context.validationTime = mktime(&tMid);
+               m_context.validationTime = mktime(&tMid);
        }
 
-       return SignatureValidator::SIGNATURE_VERIFIED;
+       return E_SIG_NONE;
 }
 
-SignatureValidator::Result baseCheck(
-       const SignatureFileInfo &fileInfo,
-       const std::string &widgetContentPath,
+VCerr SignatureValidator::Impl::baseCheck(
+       const std::string &contentPath,
        bool checkOcsp,
-       bool checkReferences,
-       SignatureData &outData)
+       bool checkReferences)
 {
-       bool disregard = false;
-       SignatureValidator::Result result = SignatureValidator::SIGNATURE_INVALID;
-
        try {
-               XmlSec::XmlSecContext context;
-               result = preStep(fileInfo, disregard, context, outData);
-               if (result != SignatureValidator::SIGNATURE_VERIFIED)
+               VCerr result = preStep();
+               if (result != E_SIG_NONE)
                        return result;
 
-               if (!outData.isAuthorSignature()) {
-                       if (XmlSec::NO_ERROR != XmlSecSingleton::Instance().validate(&context)) {
+               if (!m_data.isAuthorSignature()) {
+                       if (XmlSec::NO_ERROR != XmlSecSingleton::Instance().validate(&m_context)) {
                                LogWarning("Installation break - invalid package!");
-                               return SignatureValidator::SIGNATURE_INVALID;
+                               return E_SIG_INVALID_FORMAT;
                        }
 
-                       outData.setReference(context.referenceSet);
-                       if (!checkObjectReferences(outData)) {
+                       m_data.setReference(m_context.referenceSet);
+                       if (!checkObjectReferences()) {
                                LogWarning("Failed to check Object References");
-                               return SignatureValidator::SIGNATURE_INVALID;
+                               return E_SIG_INVALID_REF;
                        }
 
                        if (checkReferences) {
-                               ReferenceValidator fileValidator(widgetContentPath);
-                               if (ReferenceValidator::NO_ERROR != fileValidator.checkReferences(outData)) {
+                               ReferenceValidator fileValidator(contentPath);
+                               if (ReferenceValidator::NO_ERROR != fileValidator.checkReferences(m_data)) {
                                        LogWarning("Invalid package - file references broken");
-                                       return SignatureValidator::SIGNATURE_INVALID;
+                                       return E_SIG_INVALID_REF;
                                }
                        }
                }
 
-               if (checkOcsp && Ocsp::check(outData) == Ocsp::Result::REVOKED) {
+               if (checkOcsp && Ocsp::check(m_data) == Ocsp::Result::REVOKED) {
                        LogError("Certificate is Revoked by OCSP server.");
-                       return SignatureValidator::SIGNATURE_REVOKED;
+                       return E_SIG_REVOKED;
                }
 
                LogDebug("Signature validation check done successfully ");
 
        } catch (const CertificateCollection::Exception::Base &e) {
                LogError("CertificateCollection exception : " << e.DumpToString());
-               return SignatureValidator::SIGNATURE_INVALID;
+               return E_SIG_INVALID_CHAIN;
        } catch (const XmlSec::Exception::Base &e) {
                LogError("XmlSec exception : " << e.DumpToString());
-               return SignatureValidator::SIGNATURE_INVALID;
+               return E_SIG_INVALID_FORMAT;
        } catch (const Ocsp::Exception::Base &e) {
                LogInfo("OCSP will be handled by cert-checker later. : " << e.DumpToString());
                /*
@@ -395,74 +457,68 @@ SignatureValidator::Result baseCheck(
                 */
        } catch (const std::exception &e) {
                LogError("std exception occured : " << e.what());
-               return SignatureValidator::SIGNATURE_INVALID;
+               return E_SIG_UNKNOWN;
        } catch (...) {
                LogError("Unknown exception in SignatureValidator::check");
-               return SignatureValidator::SIGNATURE_INVALID;
+               return E_SIG_UNKNOWN;
        }
 
-       return disregard ? SignatureValidator::SIGNATURE_DISREGARD : SignatureValidator::SIGNATURE_VERIFIED;
+       return m_disregarded ? E_SIG_DISREGARDED : E_SIG_NONE;
 }
 
-SignatureValidator::Result baseCheckList(
-       const SignatureFileInfo &fileInfo,
-       const std::string &widgetContentPath,
-       const std::list<std::string> &uriList,
+VCerr SignatureValidator::Impl::baseCheckList(
+       const std::string &contentPath,
+       const UriList &uriList,
        bool checkOcsp,
-       bool checkReferences,
-       SignatureData &outData)
+       bool checkReferences)
 {
-       bool disregard = false;
-       SignatureValidator::Result result = SignatureValidator::SIGNATURE_INVALID;
-
        try {
-               XmlSec::XmlSecContext context;
-               result = preStep(fileInfo, disregard, context, outData);
-               if (result != SignatureValidator::SIGNATURE_VERIFIED)
+               VCerr result = preStep();
+               if (result != E_SIG_NONE)
                        return result;
 
                if (uriList.size() == 0) {
-                       if (XmlSec::NO_ERROR != XmlSecSingleton::Instance().validateNoHash(&context)) {
+                       if (XmlSec::NO_ERROR != XmlSecSingleton::Instance().validateNoHash(&m_context)) {
                                LogWarning("Installation break - invalid package! >> validateNoHash");
-                               return SignatureValidator::SIGNATURE_INVALID;
+                               return E_SIG_INVALID_FORMAT;
                        }
                } else {
                        XmlSecSingleton::Instance().setPartialHashList(uriList);
-                       if (XmlSec::NO_ERROR != XmlSecSingleton::Instance().validatePartialHash(&context)) {
+                       if (XmlSec::NO_ERROR != XmlSecSingleton::Instance().validatePartialHash(&m_context)) {
                                LogWarning("Installation break - invalid package! >> validatePartialHash");
-                               return SignatureValidator::SIGNATURE_INVALID;
+                               return E_SIG_INVALID_FORMAT;
                        }
                }
 
-               outData.setReference(context.referenceSet);
+               m_data.setReference(m_context.referenceSet);
                /*
-               if (!checkObjectReferences(outData)) {
+               if (!checkObjectReferences()) {
                        LogWarning("Failed to check Object References");
-                       return SIGNATURE_INVALID;
+                       return E_SIG_INVALID_REF;
                }
                */
 
                if (checkReferences) {
-                       ReferenceValidator fileValidator(widgetContentPath);
-                       if (ReferenceValidator::NO_ERROR != fileValidator.checkReferences(outData)) {
+                       ReferenceValidator fileValidator(contentPath);
+                       if (ReferenceValidator::NO_ERROR != fileValidator.checkReferences(m_data)) {
                                LogWarning("Invalid package - file references broken");
-                               return SignatureValidator::SIGNATURE_INVALID;
+                               return E_SIG_INVALID_REF;
                        }
                }
 
-               if (checkOcsp && Ocsp::check(outData) == Ocsp::Result::REVOKED) {
+               if (checkOcsp && Ocsp::check(m_data) == Ocsp::Result::REVOKED) {
                        LogError("Certificate is Revoked by OCSP server.");
-                       return SignatureValidator::SIGNATURE_REVOKED;
+                       return E_SIG_REVOKED;
                }
 
                LogDebug("Signature validation of check list done successfully ");
 
        } catch (const CertificateCollection::Exception::Base &e) {
                LogError("CertificateCollection exception : " << e.DumpToString());
-               return SignatureValidator::SIGNATURE_INVALID;
+               return E_SIG_INVALID_CHAIN;
        } catch (const XmlSec::Exception::Base &e) {
                LogError("XmlSec exception : " << e.DumpToString());
-               return SignatureValidator::SIGNATURE_INVALID;
+               return E_SIG_INVALID_FORMAT;
        } catch (const Ocsp::Exception::Base &e) {
                LogInfo("OCSP will be handled by cert-checker later. : " << e.DumpToString());
                /*
@@ -472,51 +528,137 @@ SignatureValidator::Result baseCheckList(
                 */
        } catch (...) {
                LogError("Unknown exception in SignatureValidator::checkList");
-               return SignatureValidator::SIGNATURE_INVALID;
+               return E_SIG_UNKNOWN;
        }
 
-       return disregard ? SignatureValidator::SIGNATURE_DISREGARD : SignatureValidator::SIGNATURE_VERIFIED;
+       return m_disregarded ? E_SIG_DISREGARDED : E_SIG_NONE;
 }
 
-SignatureValidator::Result SignatureValidator::check(
-       const SignatureFileInfo &fileInfo,
-       const std::string &widgetContentPath,
+VCerr SignatureValidator::Impl::check(
+       const std::string &contentPath,
        bool checkOcsp,
        bool checkReferences,
        SignatureData &outData)
 {
-       Result result = baseCheck(fileInfo, widgetContentPath, checkOcsp, checkReferences, outData);
+       VCerr result;
+
+       result = baseCheck(contentPath, checkOcsp, checkReferences);
+       result = additionalCheck(result);
 
-       return additionalCheck(result, outData);
+       outData = m_data;
+
+       return result;
 }
 
-SignatureValidator::Result SignatureValidator::checkList(
-       const SignatureFileInfo &fileInfo,
-       const std::string &widgetContentPath,
-       const std::list<std::string> &uriList,
+VCerr SignatureValidator::Impl::checkList(
+       const std::string &contentPath,
+       const UriList &uriList,
        bool checkOcsp,
        bool checkReferences,
        SignatureData &outData)
 {
-       Result result = baseCheckList(fileInfo, widgetContentPath, uriList, checkOcsp, checkReferences, outData);
+       VCerr result;
+
+       result = baseCheckList(contentPath, uriList, checkOcsp, checkReferences);
+       result = additionalCheck(result);
 
-       return additionalCheck(result, outData);
+       outData = m_data;
+
+       return result;
 }
 
-SignatureValidator::Result SignatureValidator::makeChainBySignature(
-       const SignatureFileInfo &fileInfo,
+VCerr SignatureValidator::Impl::makeChainBySignature(
        bool completeWithSystemCert,
        CertificateList &certList)
 {
-       SignatureData data;
-       if (makeDataBySignature(fileInfo, completeWithSystemCert, data))
-               return SIGNATURE_INVALID;
+       VCerr result = makeDataBySignature(completeWithSystemCert);
+       if (result != E_SIG_NONE)
+               return result;
+
+       certList = m_data.getCertList();
+
+       return E_SIG_NONE;
+}
+
+std::string SignatureValidator::Impl::errorToString(VCerr code)
+{
+       switch (code) {
+       case E_SIG_NONE:           return "E_SIG_NONE";
+       case E_SIG_INVALID_FORMAT: return "E_SIG_INVALID_FORMAT";
+       case E_SIG_INVALID_CERT:   return "E_SIG_INVALID_CERT";
+       case E_SIG_INVALID_CHAIN:  return "E_SIG_INVALID_CHAIN";
+       case E_SIG_INVALID_REF:    return "E_SIG_INVALID_REF";
+       case E_SIG_CERT_EXPIRED:   return "E_SIG_CERT_EXPIRED";
+       case E_SIG_CERT_NOT_YET:   return "E_SIG_CERT_NOT_YET";
+       case E_SIG_DISREGARDED:    return "E_SIG_DISREGARDED";
+       case E_SIG_REVOKED:        return "E_SIG_REVOKED";
+       case E_SIG_PLUGIN:         return "E_SIG_PLUGIN";
+       case E_SIG_OUT_OF_MEM:     return "E_SIG_OUT_OF_MEM";
+       case E_SIG_UNKNOWN:        return "E_SIG_UNKNOWN";
+       default:                   return m_pluginHandler.errorToString(code);
+       }
+}
+
+
+SignatureValidator::SignatureValidator(const SignatureFileInfo &info)
+{
+       std::unique_ptr<SignatureValidator::Impl> impl(new(std::nothrow) SignatureValidator::Impl(info))
+;
+       m_pImpl = std::move(impl);
+}
+SignatureValidator::~SignatureValidator() {}
+
+std::string SignatureValidator::errorToString(VCerr code)
+{
+       if (!m_pImpl)
+               return "out of memory. error.";
 
-       certList = data.getCertList();
+       return m_pImpl->errorToString(code);
+}
+
+VCerr SignatureValidator::check(
+       const std::string &contentPath,
+       bool checkOcsp,
+       bool checkReferences,
+       SignatureData &outData)
+{
+       if (!m_pImpl)
+               return E_SIG_OUT_OF_MEM;
+
+       return m_pImpl->check(
+                       contentPath,
+                       checkOcsp,
+                       checkReferences,
+                       outData);
+}
 
-       return SIGNATURE_VALID;
+VCerr SignatureValidator::checkList(
+       const std::string &contentPath,
+       const UriList &uriList,
+       bool checkOcsp,
+       bool checkReferences,
+       SignatureData &outData)
+{
+       if (!m_pImpl)
+               return E_SIG_OUT_OF_MEM;
+
+       return m_pImpl->checkList(
+                       contentPath,
+                       uriList,
+                       checkOcsp,
+                       checkReferences,
+                       outData);
 }
 
+VCerr SignatureValidator::makeChainBySignature(
+       bool completeWithSystemCert,
+       CertificateList &certList)
+{
+       if (!m_pImpl)
+               return E_SIG_OUT_OF_MEM;
+
+       return m_pImpl->makeChainBySignature(completeWithSystemCert, certList);
+}
 
 } // namespace ValidationCore
 
index 60afb27..f488ad6 100644 (file)
 
 #include <string>
 #include <list>
+#include <memory>
+
 #include <vcore/Certificate.h>
 #include <vcore/SignatureData.h>
 #include <vcore/SignatureFinder.h>
+#include <vcore/Error.h>
 
 namespace ValidationCore {
 
+using UriList = std::list<std::string>;
+
+/*
+ *  Error code defined on vcore/Error.h
+ */
 class SignatureValidator {
 public:
-    enum Result
-    {
-        SIGNATURE_VALID,
-        SIGNATURE_INVALID,
-        SIGNATURE_VERIFIED,
-        SIGNATURE_DISREGARD,
-        SIGNATURE_REVOKED
-    };
+    SignatureValidator(const SignatureFileInfo &info);
+    virtual ~SignatureValidator();
 
     SignatureValidator() = delete;
     SignatureValidator(const SignatureValidator &) = delete;
     const SignatureValidator &operator=(const SignatureValidator &) = delete;
 
-    virtual ~SignatureValidator();
-
-    static Result check(
-        const SignatureFileInfo &fileInfo,
-        const std::string &widgetContentPath,
+    VCerr check(
+        const std::string &contentPath,
         bool checkOcsp,
         bool checkReferences,
         SignatureData &outData);
 
-    static Result checkList(
-        const SignatureFileInfo &fileInfo,
-        const std::string &widgetContentPath,
-        const std::list<std::string> &uriList,
+    VCerr checkList(
+        const std::string &contentPath,
+        const UriList &uriList,
         bool checkOcsp,
         bool checkReferences,
         SignatureData &outData);
@@ -65,14 +63,16 @@ public:
     /*
      *  @Remarks : cert list isn't completed with self-signed root CA system cert
      *             if completeWithSystemCert is false.
-     *
-     *  return Result::SIGNATURE_VALID if success
-     *  return Result::SIGNATURE_INVALID otherwise
      */
-    static Result makeChainBySignature(
-        const SignatureFileInfo &fileInfo,
+    VCerr makeChainBySignature(
         bool completeWithSystemCert,
         CertificateList &certList);
+
+    std::string errorToString(int code);
+
+private:
+    class Impl;
+    std::unique_ptr<Impl> m_pImpl;
 };
 
 } // namespace ValidationCore
index 17402d1..fb895b4 100644 (file)
  */
 #pragma once
 
+#include <string>
+
 #include <vcore/SignatureData.h>
 #include <vcore/SignatureValidator.h>
+#include <vcore/Error.h>
 
 namespace ValidationCore {
 
@@ -31,8 +34,12 @@ const std::string PLUGIN_PATH = "/usr/lib/libcert-svc-validator-plugin.so";
 
 class ValidatorPlugin {
 public:
-       virtual SignatureValidator::Result step(SignatureValidator::Result result, SignatureData &data) = 0;
        virtual ~ValidatorPlugin() {}
+       virtual VCerr step(VCerr result, SignatureData &data) = 0;
+       virtual std::string errorToString(VCerr)
+       {
+               return std::string("Plugin developer should implement if error code added");
+       }
 };
 
 /*