--- /dev/null
+-----BEGIN CERTIFICATE-----
+MIIC7jCCAlegAwIBAgIBADANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJLUjEO
+MAwGA1UECAwFU2VvdWwxEDAOBgNVBAoMB1NhbXN1bmcxEzARBgNVBAsMClRpemVu
+IFRlc3QxGjAYBgNVBAMMEVRlc3QgSW50ZXJtZWRpYXRlMRswGQYJKoZIhvcNAQkB
+Fgx0dEBnbWFpbC5jb20wIBcNMjQwNjEwMTExMjM1WhgPOTk5OTEyMzExMTEyMzVa
+MHUxCzAJBgNVBAYTAktSMQ4wDAYDVQQIDAVTZW91bDEQMA4GA1UECgwHU2Ftc3Vu
+ZzETMBEGA1UECwwKVGl6ZW4gVGVzdDESMBAGA1UEAwwJVGVzdCBMZWFmMRswGQYJ
+KoZIhvcNAQkBFgx0dEBnbWFpbC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ
+AoGBANXDr7WS0uJSI1hXiAiHmfjLqTB8KeMKpsAVAdmgNIHRzvxums7zpyXgTFBU
+8R+tok/drRQTW+tGZwxphDnucq2MmjlW9BHX58GryDj4gHXyh2prWKmEMNfjo/Bm
+hjzEvjs0+p/7lC8kHH+pOSIqm4ySkWg2nFsS1ocf98QcHEq7AgMBAAGjgYMwgYAw
+cwYIKwYBBQUHAQEEZzBlMCEGCCsGAQUFBzABhhVodHRwOi8vMTI3LjAuMC4xOjg4
+ODgwQAYIKwYBBQUHMAKGNGh0dHA6Ly9TVlJTZWN1cmUtRzMtYWlhLnZlcmlzaWdu
+LmNvbS9TVlJTZWN1cmVHMy5jZXIwCQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOB
+gQCkGyKRlvdOJe2RypMzVDuhi2NO0pvlM2/oXKdu8GDs/EyY16DOrz0K/Sx+IsjI
+RJ7tCfGGVHKJasMAPf6e0SUfFcDFj87TA+3ybGLVHNrS6Q0O6xkwUuwnJuv1T2JQ
+ymEXYgCMsgjUwj/sZwuhqI/qmzuzKyVs+NJItfhMmdo78Q==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIC8TCCAlqgAwIBAgIBADANBgkqhkiG9w0BAQsFADB1MQswCQYDVQQGEwJLUjEO
+MAwGA1UECAwFU2VvdWwxEDAOBgNVBAoMB1NhbXN1bmcxEzARBgNVBAsMClRpemVu
+IFRlc3QxEjAQBgNVBAMMCVRlc3QgUm9vdDEbMBkGCSqGSIb3DQEJARYMdHRAZ21h
+aWwuY29tMCAXDTI0MDYxMDExMTIzNVoYDzk5OTkxMjMxMTExMjM1WjB9MQswCQYD
+VQQGEwJLUjEOMAwGA1UECAwFU2VvdWwxEDAOBgNVBAoMB1NhbXN1bmcxEzARBgNV
+BAsMClRpemVuIFRlc3QxGjAYBgNVBAMMEVRlc3QgSW50ZXJtZWRpYXRlMRswGQYJ
+KoZIhvcNAQkBFgx0dEBnbWFpbC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ
+AoGBALKfVGjRrZDik+SfLIU81xz8XeTlTXbAVMjCBIvOYw5olkVF+8FLjZuQaim9
+V1JR3KpnTlVFIn3HN6FXK7pDzSD0iyPxp9YGZ4zJDZd6Pcvemoi13uDQVxStX3Ej
+fV+PoQ5e5WrYq4G1x5vhFIrnftaTo07UHg0idwc13bKgOFPPAgMBAAGjgYYwgYMw
+cwYIKwYBBQUHAQEEZzBlMCEGCCsGAQUFBzABhhVodHRwOi8vMTI3LjAuMC4xOjg4
+ODgwQAYIKwYBBQUHMAKGNGh0dHA6Ly9TVlJTZWN1cmUtRzMtYWlhLnZlcmlzaWdu
+LmNvbS9TVlJTZWN1cmVHMy5jZXIwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsF
+AAOBgQCs2yLaXYL39q1tqterGNZCdR3t7ZiLIoJXL17j/doYCtwanIw46bNwpkXe
+NJ6GRkQe1KNQ3sSnfCJ0fzqTTBp+EpUdECa7tAoQqEj+Qw8lbuvgmoE5K9vzzOBT
+c6FcPLwEx5Onr+lai0FMFHIIaKuF0yuqhwPjcz+nX9FTOo7KKw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDLDCCApWgAwIBAgIBADANBgkqhkiG9w0BAQsFADB1MQswCQYDVQQGEwJLUjEO
+MAwGA1UECAwFU2VvdWwxEDAOBgNVBAoMB1NhbXN1bmcxEzARBgNVBAsMClRpemVu
+IFRlc3QxEjAQBgNVBAMMCVRlc3QgUm9vdDEbMBkGCSqGSIb3DQEJARYMdHRAZ21h
+aWwuY29tMCAXDTI0MDYxMDExMTIzNVoYDzk5OTkxMjMxMTExMjM1WjB1MQswCQYD
+VQQGEwJLUjEOMAwGA1UECAwFU2VvdWwxEDAOBgNVBAoMB1NhbXN1bmcxEzARBgNV
+BAsMClRpemVuIFRlc3QxEjAQBgNVBAMMCVRlc3QgUm9vdDEbMBkGCSqGSIb3DQEJ
+ARYMdHRAZ21haWwuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDbsQsG
+AnrHA7ui/8fgSMfukAGf8k0vNw1Wvqk+pKtFgM3PtrP2zkNj5B+AkiVovaSNHfZl
+zzOZ3pn+jdruae2naVI9l1DSddUaLnfwlWVNynQKBCBhZH1+bsX0nMT+d5x+ysIT
+aufopE22YeS+ng2pesgNcsPR2du7LiB/aV6aLQIDAQABo4HJMIHGMB0GA1UdDgQW
+BBRuGerDSPswyii/2vKCRXOTqHLiODAfBgNVHSMEGDAWgBRuGerDSPswyii/2vKC
+RXOTqHLiODAPBgNVHRMBAf8EBTADAQH/MHMGCCsGAQUFBwEBBGcwZTAhBggrBgEF
+BQcwAYYVaHR0cDovLzEyNy4wLjAuMTo4ODg4MEAGCCsGAQUFBzAChjRodHRwOi8v
+U1ZSU2VjdXJlLUczLWFpYS52ZXJpc2lnbi5jb20vU1ZSU2VjdXJlRzMuY2VyMA0G
+CSqGSIb3DQEBCwUAA4GBAMdMoU5L6gxxpguiUpxhI6K+1yXBidT5LuHbT95ehm+m
+mUsDyhuUcTSTAGroIRkhyVtYYpSe2phgey8MwKAFCri+b/wX9aw45br6wb0vbKXd
+wf5EkzG55FICFclNgRr9nLSVGSzLfKnTVZy87VhofNEutmetWpSRN5YaPxQLRMXt
+-----END CERTIFICATE-----
--- /dev/null
+/*
+ * Copyright (c) 2024 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.
+ */
+
+#include "cert-svc/ccert.h"
+#include "cert-svc/cinstance.h"
+#include "cert-svc/cpkcs12.h"
+#include "cert-svc/cstring.h"
+#include "test_constant.h"
+#include "test_common.h"
+#include "test_macros.h"
+#include <cstring>
+#include <openssl/x509.h>
+
+
+static CertSvcInstance instance;
+static const std::string PemPrefix = "PEM_";
+static const std::string CrtPrefix = "CRT_";
+static const std::string P12Prefix = "P12_";
+static const std::string PfxPrefix = "PFX_";
+static const std::string Trusted = "TRUSTED_";
+static const std::string Chain = "CHAIN_";
+static const std::string WithPass = "PASS_";
+static const std::string EndUser = "END_USER_";
+static const std::string RetList = "RL_";
+
+CertSvcString wrapperCertsvcStringNew(std::string originStr, int *retVal)
+{
+ CertSvcString certsvcStr;
+
+ if (originStr.empty())
+ *retVal = certsvc_string_new(instance, NULL, 0, &certsvcStr);
+ else
+ *retVal = certsvc_string_new(instance, originStr.c_str(), originStr.length(), &certsvcStr);
+
+ return certsvcStr;
+}
+
+void importCertFromFileToStore(
+ CertStoreType storeType,
+ std::string path,
+ std::string pass,
+ std::string alias,
+ int expected)
+{
+ int result;
+
+ BOOST_REQUIRE_EQUAL(certsvc_instance_new(&instance), CERTSVC_SUCCESS);
+
+ CertSvcString cStrPath = wrapperCertsvcStringNew(path, &result);
+ BOOST_CHECK_EQUAL(result, CERTSVC_SUCCESS);
+
+ CertSvcString cStrPass = wrapperCertsvcStringNew(pass, &result);
+ BOOST_CHECK_EQUAL(result, CERTSVC_SUCCESS);
+
+ CertSvcString cStrAlias = wrapperCertsvcStringNew(alias, &result);
+ BOOST_CHECK_EQUAL(result, CERTSVC_SUCCESS);
+
+ result = certsvc_pkcs12_import_from_file_to_store(
+ instance,
+ storeType,
+ cStrPath,
+ cStrPass,
+ cStrAlias);
+
+ BOOST_CHECK_EQUAL(result, expected);
+
+ certsvc_string_free(cStrPath);
+ certsvc_string_free(cStrPass);
+ certsvc_string_free(cStrAlias);
+ certsvc_instance_free(instance);
+}
+
+void importCertFromFileToStoreRetList(
+ CertStoreType storeType,
+ std::string path,
+ std::string pass,
+ std::string alias,
+ bool isLen,
+ int expected)
+{
+ int result;
+ CertSvcStoreCertList *certList = NULL;
+ size_t length = 0;
+
+ BOOST_REQUIRE_EQUAL(certsvc_instance_new(&instance), CERTSVC_SUCCESS);
+
+ CertSvcString cStrPath = wrapperCertsvcStringNew(path, &result);
+ BOOST_CHECK_EQUAL(result, CERTSVC_SUCCESS);
+
+ CertSvcString cStrPass = wrapperCertsvcStringNew(pass, &result);
+ BOOST_CHECK_EQUAL(result, CERTSVC_SUCCESS);
+
+ CertSvcString cStrAlias = wrapperCertsvcStringNew(alias, &result);
+ BOOST_CHECK_EQUAL(result, CERTSVC_SUCCESS);
+
+ result = certsvc_pkcs12_import_from_file_to_store_ret_list(
+ instance,
+ storeType,
+ cStrPath,
+ cStrPass,
+ cStrAlias,
+ &certList,
+ isLen ? &length : nullptr);
+
+ BOOST_CHECK_EQUAL(result, expected);
+
+ if (expected == CERTSVC_SUCCESS) {
+ BOOST_CHECK(certList);
+ BOOST_CHECK(length > 0);
+ result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
+ BOOST_CHECK_EQUAL(result, CERTSVC_SUCCESS);
+ }
+
+ certsvc_string_free(cStrPath);
+ certsvc_string_free(cStrPass);
+ certsvc_string_free(cStrAlias);
+ certsvc_instance_free(instance);
+}
+
+BOOST_AUTO_TEST_SUITE(VCORE_API_PKCS12_TEST)
+
+POSITIVE_TEST_CASE(T_import_cert_from_to_individual_store)
+{
+ std::string path, pass, alias;
+ pass = ServerCert::ServerPass;
+
+ for (auto storeType: storeTypeMap)
+ {
+ path = ServerCert::PemWithoutPassPath;
+ alias = PemPrefix + storeType.first + std::to_string(PEM_CRT);
+ importCertFromFileToStore(storeType.second, path, std::string(), alias, CERTSVC_SUCCESS);
+
+ path = ServerCert::TrustedPemPath;
+ alias = PemPrefix + Trusted + storeType.first + std::to_string(PEM_CRT);
+ importCertFromFileToStore(storeType.second, path, std::string(), alias, CERTSVC_SUCCESS);
+
+ path = ServerCert::PemChainPath;
+ alias = PemPrefix + Chain + storeType.first + std::to_string(PEM_CRT);
+ importCertFromFileToStore(storeType.second, path, std::string(), alias, CERTSVC_SUCCESS);
+
+ path = ServerCert::CrtWithPassPath;
+ alias = CrtPrefix + storeType.first + std::to_string(PEM_CRT);
+ importCertFromFileToStore(storeType.second, path, pass, alias, CERTSVC_SUCCESS);
+
+ path = ServerCert::P12WithoutPassPath;
+ alias = P12Prefix + storeType.first + std::to_string(P12_END_USER);
+ importCertFromFileToStore(storeType.second, path, std::string(), alias, CERTSVC_SUCCESS);
+
+ path = ServerCert::P12WithPassPath;
+ alias = P12Prefix + WithPass + storeType.first + std::to_string(P12_END_USER);
+ importCertFromFileToStore(storeType.second, path, pass, alias, CERTSVC_SUCCESS);
+
+ path = ServerCert::P12ChainPath;
+ alias = P12Prefix + Chain + storeType.first + std::to_string(P12_END_USER);
+ importCertFromFileToStore(storeType.second, path, std::string(), alias, CERTSVC_SUCCESS);
+
+ path = ServerCert::P12EndUserPath;
+ alias = P12Prefix + EndUser + storeType.first + std::to_string(P12_END_USER);
+ importCertFromFileToStore(storeType.second, path, std::string(), alias, CERTSVC_SUCCESS);
+
+ path = ServerCert::PfxWithPassPath;
+ alias = PfxPrefix + storeType.first;
+ importCertFromFileToStore(storeType.second, path, pass, alias, CERTSVC_SUCCESS);
+
+ path = ServerCert::PfxChainPath;
+ alias = PfxPrefix + Chain + storeType.first;
+ importCertFromFileToStore(storeType.second, path, pass, alias, CERTSVC_SUCCESS);
+ }
+}
+
+NEGATIVE_TEST_CASE(T_import_cert_from_to_individual_store_error)
+{
+ std::string path;
+ std::string alias = PemPrefix + std::to_string(PEM_CRT);
+
+ path = ServerCert::PemInvalidCert;
+ importCertFromFileToStore(WIFI_STORE, path, std::string(), alias, CERTSVC_FAIL);
+
+ path = "Not Found";
+ importCertFromFileToStore(WIFI_STORE, path, std::string(), alias, CERTSVC_IO_ERROR);
+
+ path = "Not Found.pem";
+ importCertFromFileToStore(WIFI_STORE, path, std::string(), alias, CERTSVC_IO_ERROR);
+
+ path = ServerCert::EmptyCert;
+ importCertFromFileToStore(WIFI_STORE, path, std::string(), alias, CERTSVC_IO_ERROR);
+
+ path = ServerCert::P12InvalidCert;
+ importCertFromFileToStore(WIFI_STORE, path, std::string(), alias, CERTSVC_FALSE);
+
+ path = ServerCert::PfxWithPassPath;
+ importCertFromFileToStore(WIFI_STORE, path, std::string(), alias, CERTSVC_FAIL);
+
+ path = ServerCert::P12WithPassPath;
+ importCertFromFileToStore(WIFI_STORE, path, std::string(), alias, CERTSVC_FAIL);
+
+ path = ServerCert::PemWithoutPassPath;
+ importCertFromFileToStore(
+ NONE_STORE,
+ path,
+ std::string(),
+ alias,
+ CERTSVC_INVALID_STORE_TYPE);
+
+ importCertFromFileToStore(
+ SYSTEM_STORE,
+ path,
+ std::string(),
+ alias,
+ CERTSVC_INVALID_STORE_TYPE);
+
+ importCertFromFileToStore(
+ WIFI_STORE,
+ std::string(),
+ std::string(),
+ alias,
+ CERTSVC_INVALID_STORE_TYPE);
+
+ importCertFromFileToStore(
+ WIFI_STORE,
+ path,
+ std::string(),
+ std::string(),
+ CERTSVC_WRONG_ARGUMENT);
+
+ alias = createLargeString(1024 * 1024);
+ importCertFromFileToStore(WIFI_STORE, path, std::string(), alias, CERTSVC_WRONG_ARGUMENT);
+
+ path = ServerCert::P12WithoutPassPath;
+ importCertFromFileToStore(WIFI_STORE, path, std::string(), alias, CERTSVC_WRONG_ARGUMENT);
+
+}
+
+POSITIVE_TEST_CASE(T_certsvc_pkcs12_import_from_file_to_store_ret_list)
+{
+ std::string alias, path, pass;
+ pass = ServerCert::ServerPass;
+
+ for (auto storeType: storeTypeMap)
+ {
+ path = ServerCert::P12WithoutPassPath;
+ alias = P12Prefix + RetList + storeType.first + std::to_string(P12_END_USER);
+ importCertFromFileToStoreRetList(
+ storeType.second,
+ path,
+ std::string(),
+ alias,
+ true,
+ CERTSVC_SUCCESS);
+
+ path = ServerCert::P12WithPassPath;
+ alias = P12Prefix + RetList + WithPass + storeType.first + std::to_string(P12_END_USER);
+ importCertFromFileToStoreRetList(
+ storeType.second,
+ path,
+ pass,
+ alias,
+ true,
+ CERTSVC_SUCCESS);
+ }
+}
+
+NEGATIVE_TEST_CASE(T_certsvc_pkcs12_import_from_file_to_store_ret_list_error)
+{
+ std::string path = ServerCert::P12WithPassPath;
+ std::string alias = P12Prefix + std::to_string(P12_END_USER);
+
+ importCertFromFileToStoreRetList(
+ WIFI_STORE,
+ path,
+ std::string(),
+ alias,
+ false,
+ CERTSVC_WRONG_ARGUMENT);
+
+ importCertFromFileToStoreRetList(
+ NONE_STORE,
+ path,
+ std::string(),
+ alias,
+ true,
+ CERTSVC_INVALID_STORE_TYPE);
+
+ importCertFromFileToStoreRetList(
+ SYSTEM_STORE,
+ path,
+ std::string(),
+ alias,
+ true,
+ CERTSVC_INVALID_STORE_TYPE);
+
+ path = ServerCert::EmptyCert;
+ importCertFromFileToStoreRetList(
+ WIFI_STORE,
+ path,
+ std::string(),
+ alias,
+ true,
+ CERTSVC_IO_ERROR);
+
+ path = ServerCert::P12InvalidCert;
+ importCertFromFileToStoreRetList(
+ WIFI_STORE,
+ path,
+ std::string(),
+ alias,
+ true,
+ CERTSVC_FALSE);
+
+ path = ServerCert::P12WithPassPath;
+ importCertFromFileToStoreRetList(
+ WIFI_STORE,
+ path,
+ std::string(),
+ alias,
+ true,
+ CERTSVC_FAIL);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file