Add negative and positive test cases 03/314003/6
authorPhan Xuan Tan <xuan.tan@samsung.com>
Thu, 4 Jul 2024 02:31:07 +0000 (09:31 +0700)
committerPhan Xuan Tan <xuan.tan@samsung.com>
Fri, 12 Jul 2024 02:06:02 +0000 (09:06 +0700)
+ Save certificate to specific file
+ Get certificate information such as: subject info, issuer info, time not before and time not after

Change-Id: I17efc555dce73ae9821e325de326e0f0e96e8dde

unit-tests/CMakeLists.txt
unit-tests/data/signer_cert.pem [new file with mode: 0644]
unit-tests/test_constant.cpp
unit-tests/test_constant.h
unit-tests/test_vcore_api_cert.cpp

index 01f2dab30b287bf015c91ae6157163dc9d83d1d7..49f336eaa4a16993f4ae62a1267cd5eeee9cff8e 100644 (file)
@@ -110,5 +110,6 @@ INSTALL(TARGETS ${TARGET_UNIT_TESTS} DESTINATION ${BIN_DIR})
 INSTALL(
     FILES
         data/server_without_pass_cert.pem
+        data/signer_cert.pem
     DESTINATION ${CERT_SVC_TESTS}/unit_test_data
 )
\ No newline at end of file
diff --git a/unit-tests/data/signer_cert.pem b/unit-tests/data/signer_cert.pem
new file mode 100644 (file)
index 0000000..4df704a
--- /dev/null
@@ -0,0 +1,20 @@
+-----BEGIN CERTIFICATE-----
+MIIDNjCCAp+gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmTELMAkGA1UEBhMCVk4x
+DjAMBgNVBAgMBUhhTm9pMRIwEAYDVQQHDAlOYW1UdUxpZW0xEDAOBgNVBAoMB1Nh
+bXN1bmcxEzARBgNVBAsMClRpemVuIFRlc3QxGjAYBgNVBAMMEVRlc3QgSW50ZXJt
+ZWRpYXRlMSMwIQYJKoZIhvcNAQkBFhRpbnRlci50ZXN0QGdtYWlsLmNvbTAeFw0y
+NDA3MDQwOTA3MDRaFw0yNTA3MDQwOTA3MDRaMIGUMQswCQYDVQQGEwJWTjEOMAwG
+A1UECAwFSGFOb2kxEjAQBgNVBAcMCU5hbVR1TGllbTEQMA4GA1UECgwHU2Ftc3Vu
+ZzETMBEGA1UECwwKVGl6ZW4gVGVzdDEUMBIGA1UEAwwLVGVzdCBTaWduZXIxJDAi
+BgkqhkiG9w0BCQEWFXNpZ25lci50ZXN0QGdtYWlsLmNvbTCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEAvvlP8+wNdwARyUSDKls81NKmBWeebPpt31+dkB83r3PC
+KATYXGpCPLC2YkFNzsWPQOonpgqJ4m7WNeZUhcnM1YtBJkJj+6PoHFEcGr3dinTq
+JvDkarbUjCha9k5t/Y4rrp/J8k6WodVAFWZ+nJV//OD+JEZGJjMto3FuLARFY+sC
+AwEAAaOBkDCBjTBzBggrBgEFBQcBAQRnMGUwIQYIKwYBBQUHMAGGFWh0dHA6Ly8x
+MjcuMC4wLjE6ODg4ODBABggrBgEFBQcwAoY0aHR0cDovL1NWUlNlY3VyZS1HMy1h
+aWEudmVyaXNpZ24uY29tL1NWUlNlY3VyZUczLmNlcjAJBgNVHRMEAjAAMAsGA1Ud
+DwQEAwIFoDANBgkqhkiG9w0BAQsFAAOBgQAfqYxi5xl60tJcJGPZo8nUxjkK/B/Q
+7DNTOHlcOOHdHAW1upq8bXlJiTVi9MFAA+q3HH9stcz7XK3fhmWuoTs5aFZS5/IA
+Wdy3S20RH/Vp7PAd6MB3LNBFVOCxFEywDbbCyxeJkajCM4xj3PFcNPYXdS4AT0HG
+Fovz/asxnXEpPA==
+-----END CERTIFICATE-----
index 031bff9dcd65be4da681b0e0c6dac63f0ffc2b19..4630613e27f395a4425e7b7b43c886d73e75da9a 100644 (file)
@@ -21,6 +21,9 @@ namespace ServerCertInfo {
                std::string(TESTAPP_RES_DIR) +
                "unit_test_data/server_without_pass_cert.pem";
 
+       const std::string ServerCertPemPath =
+               std::string(TESTAPP_RES_DIR) + "unit_test_data/server_cert.pem";
+
        const std::string FullFieldCertPem =
                "MIIDpDCCAowCAQEwDQYJKoZIhvcNAQELBQAwgZcxCzAJBgNVBAYTAlZOMQ8wDQYD"
                "VQQIDAZIYSBOb2kxFDASBgNVBAcMC05hbSBUdSBMaWVtMRAwDgYDVQQKDAdTYW1z"
@@ -170,4 +173,56 @@ namespace P12CertInfo {
        const std::string SubjectName =
                "/C=VN/ST=Ha Noi/L=Nam Tu Liem/O=Samsung/OU=SRV/CN=Tizen Security Root/"
                "emailAddress=test@samsung.com";
-}
\ No newline at end of file
+}
+
+namespace SignerCertInfo {
+       const std::string Path = std::string(TESTAPP_RES_DIR) + "unit_test_data/signer_cert.pem";
+
+       const std::string Subject =
+               "/C=VN/ST=HaNoi/L=NamTuLiem/O=Samsung/OU=Tizen Test/CN=Test Signer/"
+               "emailAddress=signer.test@gmail.com";
+
+       const std::string SubjectCommonName = "Test Signer";
+       const std::string SubjectCountryName = "VN";
+       const std::string SubjectStateName = "HaNoi";
+       const std::string SubjectLocalityName = "NamTuLiem";
+       const std::string SubjectOrgName = "Samsung";
+       const std::string SubjectOrgUnitName = "Tizen Test";
+       const std::string SubjectEmail = "signer.test@gmail.com";
+
+       const std::string Issuer =
+               "/C=VN/ST=HaNoi/L=NamTuLiem/O=Samsung/OU=Tizen Test/CN=Test Intermediate/"
+               "emailAddress=inter.test@gmail.com";
+
+       const std::string IssuerCommonName = "Test Intermediate";
+       const std::string IssuerCountryName = "VN";
+       const std::string IssuerStateName = "HaNoi";
+       const std::string IssuerLocalityName = "NamTuLiem";
+       const std::string IssuerOrgName = "Samsung";
+       const std::string IssuerOrgUnitName = "Tizen Test";
+       const std::string IssuerEmail = "inter.test@gmail.com";
+
+       const std::string Version = "3";
+       const std::string SerialNumber = "00";
+       const std::string KeyUsage = "digitalSignature,keyEncipherment";
+
+       const std::string Key =
+               "                Public-Key: (1024 bit)\n"
+               "                Modulus:\n"
+               "                    00:be:f9:4f:f3:ec:0d:77:00:11:c9:44:83:2a:5b:\n"
+               "                    3c:d4:d2:a6:05:67:9e:6c:fa:6d:df:5f:9d:90:1f:\n"
+               "                    37:af:73:c2:28:04:d8:5c:6a:42:3c:b0:b6:62:41:\n"
+               "                    4d:ce:c5:8f:40:ea:27:a6:0a:89:e2:6e:d6:35:e6:\n"
+               "                    54:85:c9:cc:d5:8b:41:26:42:63:fb:a3:e8:1c:51:\n"
+               "                    1c:1a:bd:dd:8a:74:ea:26:f0:e4:6a:b6:d4:8c:28:\n"
+               "                    5a:f6:4e:6d:fd:8e:2b:ae:9f:c9:f2:4e:96:a1:d5:\n"
+               "                    40:15:66:7e:9c:95:7f:fc:e0:fe:24:46:46:26:33:\n"
+               "                    2d:a3:71:6e:2c:04:45:63:eb\n"
+               "                Exponent: 65537 (0x10001)\n";
+
+       const std::string KeyAlgo = "rsaEncryption";
+       const std::string SignatureAlgo = "sha256WithRSAEncryption";
+
+       unsigned long TimeNotBefore = 1720084024;
+       unsigned long TimeNotAfter = 1751620024;
+}
index 35aaabf0cb07d3a4fa9092c9b6331e760dad9ed3..ef31b1b21d5fe3bd6b1a75bf15315edfc168571f 100644 (file)
@@ -18,6 +18,7 @@
 
 namespace ServerCertInfo {
        extern const std::string ServerCertPemWithoutPassPath;
+       extern const std::string ServerCertPemPath;
        extern const std::string FullFieldCertPem;
        extern const std::string CertDer;
        extern const std::string SubjectCommonName;
@@ -32,4 +33,35 @@ namespace P12CertInfo {
        extern const std::string PrivateKey;
        extern const std::string EndUserCert;
        extern const std::string SubjectName;
-}
\ No newline at end of file
+}
+
+namespace SignerCertInfo {
+       extern const std::string Path;
+       extern const std::string Subject;
+       extern const std::string SubjectCommonName;
+       extern const std::string SubjectCountryName;
+       extern const std::string SubjectStateName;
+       extern const std::string SubjectLocalityName;
+       extern const std::string SubjectOrgName;
+       extern const std::string SubjectOrgUnitName;
+       extern const std::string SubjectEmail;
+
+       extern const std::string Issuer;
+       extern const std::string IssuerCommonName;
+       extern const std::string IssuerCountryName;
+       extern const std::string IssuerStateName;
+       extern const std::string IssuerLocalityName;
+       extern const std::string IssuerOrgName;
+       extern const std::string IssuerOrgUnitName;
+       extern const std::string IssuerEmail;
+
+       extern const std::string Version;
+       extern const std::string SerialNumber;
+       extern const std::string KeyUsage;
+       extern const std::string Key;
+       extern const std::string KeyAlgo;
+       extern const std::string SignatureAlgo;
+
+       extern unsigned long TimeNotBefore;
+       extern unsigned long TimeNotAfter;
+}
index 9892e1e3cc1958341132ba19bef9f93b277d8748..0780376bf608d8d7a333421cf301a309cc333c52 100644 (file)
 
 static CertSvcInstance instance;
 
-void checkFiledCertificate(CertSvcCertificate certificate, const char *expected)
+void checkCertificateField(
+       CertSvcCertificate certificate,
+       CertSvcCertificateField field,
+       const std::string &expected)
 {
-       CertSvcString subjectStr;
+       CertSvcString certSvcStr;
        const char *buffer = nullptr;
        size_t bufferLength;
        int result;
 
-       result = certsvc_certificate_get_string_field(
-               certificate,
-               CERTSVC_SUBJECT_COMMON_NAME,
-               &subjectStr);
+       result = certsvc_certificate_get_string_field(certificate, field, &certSvcStr);
 
        BOOST_CHECK_EQUAL(result, CERTSVC_SUCCESS);
 
-       certsvc_string_to_cstring(subjectStr, &buffer, &bufferLength);
+       certsvc_string_to_cstring(certSvcStr, &buffer, &bufferLength);
 
-       BOOST_CHECK_EQUAL(bufferLength, std::strlen(expected));
+       BOOST_CHECK_EQUAL(bufferLength, expected.length());
        BOOST_CHECK(buffer);
-       BOOST_CHECK_EQUAL(std::strcmp(expected, buffer), 0);
+       BOOST_CHECK_EQUAL(std::strcmp(expected.c_str(), buffer), 0);
 
-       certsvc_string_free(subjectStr);
+       certsvc_string_free(certSvcStr);
 }
 
-BOOST_AUTO_TEST_SUITE(VCORE_API_CERT_TEST)
-
-POSITIVE_TEST_CASE(T_certsvc_certificate_new_from_file)
+void makeCertificateFromMemory(
+       CertSvcInstance instance,
+       const std::string &certPem,
+       CertSvcCertificate &certificate)
 {
        int result;
-       CertSvcCertificate certificate;
 
-       const char *location = ServerCertInfo::ServerCertPemWithoutPassPath.c_str();
+       result = certsvc_certificate_new_from_memory(
+               instance,
+               reinterpret_cast<const unsigned char *>(certPem.c_str()),
+               certPem.size(),
+               CERTSVC_FORM_DER_BASE64,
+               &certificate);
 
-       BOOST_REQUIRE_EQUAL(certsvc_instance_new(&instance), CERTSVC_SUCCESS);
+       BOOST_CHECK_EQUAL(result, CERTSVC_SUCCESS);
+       BOOST_CHECK_EQUAL(certificate.privateHandler, 0);
 
-       result = certsvc_certificate_new_from_file(instance, location, &certificate);
+       checkCertificateField(
+               certificate,
+               CERTSVC_SUBJECT_COMMON_NAME,
+               ServerCertInfo::SubjectCommonName);
+}
+
+void makeCertificateFromFile(
+       CertSvcInstance instance,
+       const std::string &location,
+       CertSvcCertificate &certificate,
+       std::string subjectCommonName)
+{
+       int result;
+       result = certsvc_certificate_new_from_file(instance, location.c_str(), &certificate);
        BOOST_CHECK_EQUAL(result, CERTSVC_SUCCESS);
        BOOST_CHECK_EQUAL(certificate.privateHandler, 0);
 
-       checkFiledCertificate(certificate, ServerCertInfo::SubjectCommonName.c_str());
+       checkCertificateField(certificate, CERTSVC_SUBJECT_COMMON_NAME, subjectCommonName);
+}
+
+BOOST_AUTO_TEST_SUITE(VCORE_API_CERT_TEST)
+
+POSITIVE_TEST_CASE(T_certsvc_certificate_new_from_file)
+{
+       CertSvcCertificate certificate;
+
+       BOOST_REQUIRE_EQUAL(certsvc_instance_new(&instance), CERTSVC_SUCCESS);
+
+       makeCertificateFromFile(
+               instance,
+               ServerCertInfo::ServerCertPemWithoutPassPath,
+               certificate,
+               ServerCertInfo::SubjectCommonName);
 
        certsvc_certificate_free(certificate);
        certsvc_instance_free(instance);
@@ -84,24 +118,18 @@ NEGATIVE_TEST_CASE(T_certsvc_certificate_new_from_file_invalid_argument)
        certsvc_instance_free(instance);
 }
 
-POSITIVE_TEST_CASE(T_certsvc_certificate_new_from_memory_base64)
+POSITIVE_TEST_CASE(T_certsvc_certificate_new_from_memory_base64_and_save)
 {
        int result;
        CertSvcCertificate certificate;
+       const char *location = ServerCertInfo::ServerCertPemPath.c_str();
 
        BOOST_REQUIRE_EQUAL(certsvc_instance_new(&instance), CERTSVC_SUCCESS);
 
-       result = certsvc_certificate_new_from_memory(
-               instance,
-               reinterpret_cast<const unsigned char *>(ServerCertInfo::FullFieldCertPem.c_str()),
-               ServerCertInfo::FullFieldCertPem.size(),
-               CERTSVC_FORM_DER_BASE64,
-               &certificate);
+       makeCertificateFromMemory(instance, ServerCertInfo::FullFieldCertPem, certificate);
 
+       result = certsvc_certificate_save_file(certificate, location);
        BOOST_CHECK_EQUAL(result, CERTSVC_SUCCESS);
-       BOOST_CHECK_EQUAL(certificate.privateHandler, 0);
-
-       checkFiledCertificate(certificate, ServerCertInfo::SubjectCommonName.c_str());
 
        certsvc_certificate_free(certificate);
        certsvc_instance_free(instance);
@@ -129,7 +157,10 @@ POSITIVE_TEST_CASE(T_certsvc_certificate_new_from_memory_der)
        BOOST_CHECK_EQUAL(result, CERTSVC_SUCCESS);
        BOOST_CHECK_EQUAL(certificate.privateHandler, 0);
 
-       checkFiledCertificate(certificate, ServerCertInfo::SubjectCommonName.c_str());
+       checkCertificateField(
+               certificate,
+               CERTSVC_SUBJECT_COMMON_NAME,
+               ServerCertInfo::SubjectCommonName);
 
        free(content);
        certsvc_certificate_free(certificate);
@@ -220,4 +251,282 @@ NEGATIVE_TEST_CASE(T_certsvc_certificate_new_from_memory_invalid_memory_size)
        certsvc_instance_free(instance);
 }
 
+NEGATIVE_TEST_CASE(T_certsvc_certificate_save_file_wrong_argument)
+{
+       int result;
+       CertSvcCertificate certificate;
+       const char *location = ServerCertInfo::ServerCertPemPath.c_str();
+
+       BOOST_REQUIRE_EQUAL(certsvc_instance_new(&instance), CERTSVC_SUCCESS);
+
+       certificate.privateInstance = instance;
+       certificate.privateHandler = -1;
+
+       result = certsvc_certificate_save_file(certificate, location);
+       BOOST_CHECK_EQUAL(result, CERTSVC_WRONG_ARGUMENT);
+
+       certsvc_instance_free(instance);
+}
+
+NEGATIVE_TEST_CASE(T_certsvc_certificate_save_file_from_memory_wrong_location)
+{
+       int result;
+       CertSvcCertificate certificate;
+       const char *location = nullptr;
+
+       BOOST_REQUIRE_EQUAL(certsvc_instance_new(&instance), CERTSVC_SUCCESS);
+
+       makeCertificateFromMemory(instance, ServerCertInfo::FullFieldCertPem, certificate);
+
+       result = certsvc_certificate_save_file(certificate, location);
+       BOOST_CHECK_EQUAL(result, CERTSVC_FAIL);
+
+       certsvc_certificate_free(certificate);
+       certsvc_instance_free(instance);
+}
+
+POSITIVE_TEST_CASE(T_certsvc_certificate_get_subject_string_field)
+{
+       CertSvcCertificate certificate;
+
+       BOOST_REQUIRE_EQUAL(certsvc_instance_new(&instance), CERTSVC_SUCCESS);
+
+       makeCertificateFromFile(
+               instance,
+               SignerCertInfo::Path,
+               certificate,
+               SignerCertInfo::SubjectCommonName);
+
+       checkCertificateField(
+               certificate,
+               CERTSVC_SUBJECT,
+               SignerCertInfo::Subject);
+
+       checkCertificateField(
+               certificate,
+               CERTSVC_SUBJECT_COMMON_NAME,
+               SignerCertInfo::SubjectCommonName);
+
+       checkCertificateField(
+               certificate,
+               CERTSVC_SUBJECT_COUNTRY_NAME,
+               SignerCertInfo::SubjectCountryName);
+
+       checkCertificateField(
+               certificate,
+               CERTSVC_SUBJECT_STATE_NAME,
+               SignerCertInfo::SubjectStateName);
+
+       checkCertificateField(
+               certificate,
+               CERTSVC_SUBJECT_LOCALITY_NAME,
+               SignerCertInfo::SubjectLocalityName);
+
+       checkCertificateField(
+               certificate,
+               CERTSVC_SUBJECT_ORGANIZATION_NAME,
+               SignerCertInfo::SubjectOrgName);
+
+       checkCertificateField(
+               certificate,
+               CERTSVC_SUBJECT_ORGANIZATION_UNIT_NAME,
+               SignerCertInfo::SubjectOrgUnitName);
+
+       checkCertificateField(
+               certificate,
+               CERTSVC_SUBJECT_EMAIL_ADDRESS,
+               SignerCertInfo::SubjectEmail);
+
+       checkCertificateField(
+               certificate,
+               CERTSVC_ISSUER,
+               SignerCertInfo::Issuer);
+
+       checkCertificateField(
+               certificate,
+               CERTSVC_ISSUER_COMMON_NAME,
+               SignerCertInfo::IssuerCommonName);
+
+       checkCertificateField(
+               certificate,
+               CERTSVC_ISSUER_COUNTRY_NAME,
+               SignerCertInfo::IssuerCountryName);
+
+       checkCertificateField(
+               certificate,
+               CERTSVC_ISSUER_STATE_NAME,
+               SignerCertInfo::IssuerStateName);
+
+       checkCertificateField(
+               certificate,
+               CERTSVC_ISSUER_LOCALITY_NAME,
+               SignerCertInfo::IssuerLocalityName);
+
+       checkCertificateField(
+               certificate,
+               CERTSVC_ISSUER_ORGANIZATION_NAME,
+               SignerCertInfo::IssuerOrgName);
+
+       checkCertificateField(
+               certificate,
+               CERTSVC_ISSUER_ORGANIZATION_UNIT_NAME,
+               SignerCertInfo::IssuerOrgUnitName);
+
+       checkCertificateField(
+               certificate,
+               CERTSVC_ISSUER_EMAIL_ADDRESS,
+               SignerCertInfo::IssuerEmail);
+
+       checkCertificateField(
+               certificate,
+               CERTSVC_VERSION,
+               SignerCertInfo::Version);
+
+       checkCertificateField(
+               certificate,
+               CERTSVC_SERIAL_NUMBER,
+               SignerCertInfo::SerialNumber);
+
+       checkCertificateField(
+               certificate,
+               CERTSVC_KEY_USAGE,
+               SignerCertInfo::KeyUsage);
+
+       checkCertificateField(
+               certificate,
+               CERTSVC_KEY,
+               SignerCertInfo::Key);
+
+       checkCertificateField(
+               certificate,
+               CERTSVC_KEY_ALGO,
+               SignerCertInfo::KeyAlgo);
+
+       checkCertificateField(
+               certificate,
+               CERTSVC_SIGNATURE_ALGORITHM,
+               SignerCertInfo::SignatureAlgo);
+
+       certsvc_certificate_free(certificate);
+       certsvc_instance_free(instance);
+}
+
+NEGATIVE_TEST_CASE(T_certsvc_certificate_get_string_field_invalid_field)
+{
+       int result;
+       CertSvcCertificate certificate;
+       CertSvcString strSubject;
+       CertSvcCertificateField invalidField = (CertSvcCertificateField) -1;
+
+       BOOST_REQUIRE_EQUAL(certsvc_instance_new(&instance), CERTSVC_SUCCESS);
+
+       makeCertificateFromFile(
+               instance,
+               SignerCertInfo::Path,
+               certificate,
+               SignerCertInfo::SubjectCommonName);
+
+       result = certsvc_certificate_get_string_field(certificate, invalidField, &strSubject);
+       BOOST_CHECK_EQUAL(result, CERTSVC_SUCCESS);
+
+       BOOST_CHECK(strSubject.privateHandler == NULL);
+       BOOST_CHECK_EQUAL(strSubject.privateLength, 0);
+
+       certsvc_string_free(strSubject);
+       certsvc_certificate_free(certificate);
+       certsvc_instance_free(instance);
+}
+
+NEGATIVE_TEST_CASE(T_certsvc_certificate_get_string_field_wrong_argument)
+{
+       int result;
+       CertSvcCertificate certificate;
+       CertSvcString strSubject;
+
+       BOOST_REQUIRE_EQUAL(certsvc_instance_new(&instance), CERTSVC_SUCCESS);
+
+       certificate.privateInstance = instance;
+       certificate.privateHandler = 0;
+       result = certsvc_certificate_get_string_field(certificate, CERTSVC_SUBJECT, &strSubject);
+       BOOST_CHECK_EQUAL(result, CERTSVC_WRONG_ARGUMENT);
+
+       certsvc_instance_free(instance);
+}
+
+POSITIVE_TEST_CASE(T_certsvc_certificate_get_not_after)
+{
+       int result;
+       CertSvcCertificate certificate;
+       time_t timeNotAfter;
+
+       BOOST_REQUIRE_EQUAL(certsvc_instance_new(&instance), CERTSVC_SUCCESS);
+
+       makeCertificateFromFile(
+               instance,
+               SignerCertInfo::Path,
+               certificate,
+               SignerCertInfo::SubjectCommonName);
+
+       result = certsvc_certificate_get_not_after(certificate, &timeNotAfter);
+       BOOST_CHECK_EQUAL(result, CERTSVC_SUCCESS);
+       BOOST_CHECK_EQUAL(static_cast<unsigned long>(timeNotAfter), SignerCertInfo::TimeNotAfter);
+
+       certsvc_certificate_free(certificate);
+       certsvc_instance_free(instance);
+}
+
+NEGATIVE_TEST_CASE(T_certsvc_certificate_get_not_after_wrong_argument)
+{
+       int result;
+       CertSvcCertificate certificate;
+       time_t timeNotAfter;
+
+       BOOST_REQUIRE_EQUAL(certsvc_instance_new(&instance), CERTSVC_SUCCESS);
+
+       certificate.privateInstance = instance;
+       certificate.privateHandler = 0;
+       result = certsvc_certificate_get_not_after(certificate, &timeNotAfter);
+       BOOST_CHECK_EQUAL(result, CERTSVC_WRONG_ARGUMENT);
+
+       certsvc_instance_free(instance);
+}
+
+POSITIVE_TEST_CASE(T_certsvc_certificate_get_not_before)
+{
+       int result;
+       CertSvcCertificate certificate;
+       time_t timeNotBefore;
+
+       BOOST_REQUIRE_EQUAL(certsvc_instance_new(&instance), CERTSVC_SUCCESS);
+
+       makeCertificateFromFile(
+               instance,
+               SignerCertInfo::Path,
+               certificate,
+               SignerCertInfo::SubjectCommonName);
+
+       result = certsvc_certificate_get_not_before(certificate, &timeNotBefore);
+       BOOST_CHECK_EQUAL(result, CERTSVC_SUCCESS);
+       BOOST_CHECK_EQUAL(static_cast<unsigned long>(timeNotBefore), SignerCertInfo::TimeNotBefore);
+
+       certsvc_certificate_free(certificate);
+       certsvc_instance_free(instance);
+}
+
+NEGATIVE_TEST_CASE(T_certsvc_certificate_get_not_before_wrong_argument)
+{
+       int result;
+       CertSvcCertificate certificate;
+       time_t timeNotBefore;
+
+       BOOST_REQUIRE_EQUAL(certsvc_instance_new(&instance), CERTSVC_SUCCESS);
+
+       certificate.privateInstance = instance;
+       certificate.privateHandler = 0;
+       result = certsvc_certificate_get_not_before(certificate, &timeNotBefore);
+       BOOST_CHECK_EQUAL(result, CERTSVC_WRONG_ARGUMENT);
+
+       certsvc_instance_free(instance);
+}
+
 BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file