Add C language APIs of client
authoryuseok.jeon <yuseok.jeon@samsung.com>
Mon, 7 Jul 2014 02:27:01 +0000 (11:27 +0900)
committerBartlomiej Grzelewski <b.grzelewski@samsung.com>
Fri, 12 Sep 2014 12:58:49 +0000 (14:58 +0200)
Change-Id: I24ef238e49715624280cef1b4ea31f802be66ff5
Signed-off-by: yuseok.jeon <yuseok.jeon@samsung.com>
packaging/key-manager.spec [changed mode: 0644->0755]
src/CMakeLists.txt
src/include/ckmc/ckmc-control.h [new file with mode: 0644]
src/include/ckmc/ckmc-error.h [new file with mode: 0644]
src/include/ckmc/ckmc-manager.h [new file with mode: 0644]
src/include/ckmc/ckmc-type.h [new file with mode: 0644]
src/manager/client-capi/ckmc-control.cpp [new file with mode: 0644]
src/manager/client-capi/ckmc-error.cpp [new file with mode: 0644]
src/manager/client-capi/ckmc-manager.cpp [new file with mode: 0644]
src/manager/client-capi/ckmc-type.cpp [new file with mode: 0644]

old mode 100644 (file)
new mode 100755 (executable)
index b552642..bf4ca3e
@@ -165,6 +165,10 @@ fi
 %{_includedir}/ckm/ckm/ckm-control.h
 %{_includedir}/ckm/ckm/ckm-error.h
 %{_includedir}/ckm/ckm/ckm-type.h
+%{_includedir}/ckm/ckmc/ckmc-manager.h
+%{_includedir}/ckm/ckmc/ckmc-control.h
+%{_includedir}/ckm/ckmc/ckmc-error.h
+%{_includedir}/ckm/ckmc/ckmc-type.h
 %{_libdir}/pkgconfig/*.pc
 
 %files -n key-manager-tests
index e03ca83..2319eb5 100644 (file)
@@ -61,6 +61,7 @@ SET(KEY_MANAGER_CLIENT_VERSION_MAJOR 1)
 SET(KEY_MANAGER_CLIENT_VERSION ${KEY_MANAGER_CLIENT_VERSION_MAJOR}.0.1)
 
 SET(KEY_MANAGER_CLIENT_SRC_PATH ${KEY_MANAGER_PATH}/client)
+SET(KEY_MANAGER_CLIENT_CAPI_SRC_PATH ${KEY_MANAGER_PATH}/client-capi)
 
 INCLUDE_DIRECTORIES(
     ${KEY_MANAGER_PATH}/client
@@ -77,6 +78,9 @@ SET(KEY_MANAGER_CLIENT_SOURCES
     ${KEY_MANAGER_CLIENT_SRC_PATH}/client-key.cpp
     ${KEY_MANAGER_CLIENT_SRC_PATH}/client-manager.cpp
     ${KEY_MANAGER_CLIENT_SRC_PATH}/client-manager-impl.cpp
+    ${KEY_MANAGER_CLIENT_CAPI_SRC_PATH}/ckmc-type.cpp
+    ${KEY_MANAGER_CLIENT_CAPI_SRC_PATH}/ckmc-error.cpp
+    ${KEY_MANAGER_CLIENT_CAPI_SRC_PATH}/ckmc-manager.cpp
     )
 
 ADD_LIBRARY(${TARGET_KEY_MANAGER_CLIENT} SHARED ${KEY_MANAGER_CLIENT_SOURCES})
@@ -100,6 +104,7 @@ SET(KEY_MANAGER_CONTROL_CLIENT_VERSION_MAJOR 1)
 SET(KEY_MANAGER_CONTROL_CLIENT_VERSION ${KEY_MANAGER_CONTROL_CLIENT_VERSION_MAJOR}.0.1)
 
 SET(KEY_MANAGER_CONTROL_CLIENT_SRC_PATH ${KEY_MANAGER_PATH}/client)
+SET(KEY_MANAGER_CONTROL_CLIENT_CAPI_SRC_PATH ${KEY_MANAGER_PATH}/client-capi)
 
 INCLUDE_DIRECTORIES(
     ${KEY_MANAGER_PATH}/client
@@ -111,6 +116,7 @@ INCLUDE_DIRECTORIES(
 SET(KEY_MANAGER_CONTROL_CLIENT_SOURCES
     ${KEY_MANAGER_CONTROL_CLIENT_SRC_PATH}/client-control.cpp
     ${KEY_MANAGER_CONTROL_CLIENT_SRC_PATH}/client-common.cpp
+    ${KEY_MANAGER_CONTROL_CLIENT_CAPI_SRC_PATH}/ckmc-control.cpp
     )
 
 ADD_LIBRARY(${TARGET_KEY_MANAGER_CONTROL_CLIENT} SHARED ${KEY_MANAGER_CONTROL_CLIENT_SOURCES})
@@ -142,7 +148,13 @@ INSTALL(FILES
     ${KEY_MANAGER_SRC_PATH}/include/ckm/ckm-type.h
     DESTINATION /usr/include/ckm/ckm
     )
-
+INSTALL(FILES
+    ${KEY_MANAGER_SRC_PATH}/include/ckmc/ckmc-manager.h
+    ${KEY_MANAGER_SRC_PATH}/include/ckmc/ckmc-control.h
+    ${KEY_MANAGER_SRC_PATH}/include/ckmc/ckmc-error.h
+    ${KEY_MANAGER_SRC_PATH}/include/ckmc/ckmc-type.h
+    DESTINATION /usr/include/ckm/ckmc
+    )
 ################################################################################
 
 ADD_SUBDIRECTORY(manager)
diff --git a/src/include/ckmc/ckmc-control.h b/src/include/ckmc/ckmc-control.h
new file mode 100644 (file)
index 0000000..4c2a8f7
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ *  Copyright (c) 2000 - 2014 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        ckmc-control.h
+ * @author      Yuseok Jeon(yuseok.jeon@samsung.com)
+ * @version     1.0
+ * @brief       provides functions which are able to control key-manager daemon.
+ */
+
+#ifndef CKMC_CONTROL_H
+#define CKMC_CONTROL_H
+
+
+#include <sys/types.h>
+#include <ckmc/ckmc-error.h>
+#include <ckmc/ckmc-type.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+// decrypt user key with password
+int ckm_unlock_user_key(uid_t user, const char *password);
+
+// remove user key from memory
+int ckm_lock_user_key(uid_t user);
+
+// remove user data from Store and erase key used for encryption
+int ckm_remove_user_data(uid_t user);
+
+// change password for user
+int ckm_change_user_password(uid_t user, const char *old_password, const char *new_password);
+
+// This is work around for security-server api - resetPassword that may be called without passing oldPassword.
+// This api should not be supported on tizen 3.0
+// User must be already logged in and his DKEK is already loaded into memory in plain text form.
+// The service will use DKEK in plain text and encrypt it in encrypted form (using new password).
+int ckm_reset_user_password(uid_t user, const char *new_password);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* CKMC_CONTROL_H */
diff --git a/src/include/ckmc/ckmc-error.h b/src/include/ckmc/ckmc-error.h
new file mode 100644 (file)
index 0000000..940d389
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+ *
+ *  Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Bumjin Im <bj.im@samsung.com>
+ *
+ *  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        ckmc-error.h
+ * @author      Bartlomiej Grzelewski (b.grzelewski@samsung.com)
+ * @version     1.0
+ * @brief       This file is implementation of client-common functions.
+ */
+
+#ifndef CKMC_ERROR_H
+#define CKMC_ERROR_H
+
+#include <sys/types.h>
+
+/**
+ * \name Return Codes
+ * exported by the foundation API.
+ * result codes begin with the start error code and extend into negative direction.
+ * @{
+*/
+#define KEY_MANAGER_API_SUCCESS 0
+/*! \brief   indicating the result of the one specific API is successful */
+#define KEY_MANAGER_API_ERROR_SOCKET -1
+
+/*! \brief   indicating the socket between client and Central Key Manager failed  */
+#define KEY_MANAGER_API_ERROR_BAD_REQUEST -2
+
+/*! \brief   indicating the response from Central Key Manager is malformed */
+#define KEY_MANAGER_API_ERROR_BAD_RESPONSE -3
+
+/*! \brief   indicating the transmitting request failed */
+/* deprecated unused */
+#define KEY_MANAGER_API_ERROR_SEND_FAILED -4
+
+/*! \brief   indicating the receiving response failed */
+/* deprecated unused */
+#define KEY_MANAGER_API_ERROR_RECV_FAILED -5
+
+/*! \brief   indicating the authentication between client and manager failed */
+#define KEY_MANAGER_API_ERROR_AUTHENTICATION_FAILED -6
+
+/*! \brief   indicating the API's input parameter is malformed */
+#define KEY_MANAGER_API_ERROR_INPUT_PARAM -7
+
+/*! \brief   indicating the output buffer size which is passed as parameter is too small */
+#define KEY_MANAGER_API_ERROR_BUFFER_TOO_SMALL -8
+
+/*! \brief   indicating system  is running out of memory state */
+#define KEY_MANAGER_API_ERROR_OUT_OF_MEMORY -9
+
+/*! \brief   indicating the access has been denied by Central Key Manager */
+#define KEY_MANAGER_API_ERROR_ACCESS_DENIED -10
+
+/*! \brief   indicating Central Key Manager has been failed for some reason */
+#define KEY_MANAGER_API_ERROR_SERVER_ERROR -11
+
+/*! \brief   indicating the database was not unlocked - user did not login */
+#define KEY_MANAGER_API_ERROR_DB_LOCKED -12
+
+/*! \brief   indicating that request give to database returned no result */
+#define KEY_MANAGER_API_ERROR_DB_BAD_REQUEST -13
+
+/*! \brief   indicating an internal error inside the database */
+#define KEY_MANAGER_API_ERROR_DB_ERROR -14
+
+/*! \brief   indicating that provided alias already exists in the database */
+#define KEY_MANAGER_API_ERROR_DB_ALIAS_EXISTS -15
+
+/*! \brief   indicating that provided file doesn't exists or cannot be accessed in the file system */
+#define KEY_MANAGER_API_ERROR_FILE_ACCESS_DENIED -16
+
+/*! \brief   indicating that a provided file or binary has not a valid format */
+#define KEY_MANAGER_API_ERROR_INVALID_FORMAT -17
+
+
+/*! \brief   indicating the error with unknown reason */
+#define KEY_MANAGER_API_ERROR_UNKNOWN -255
+/** @}*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+const char * ckm_error_to_string(int error);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+ * @}
+*/
+
+/**
+ * @}
+*/
+
+#endif /* CKMC_ERROR_H */
diff --git a/src/include/ckmc/ckmc-manager.h b/src/include/ckmc/ckmc-manager.h
new file mode 100644 (file)
index 0000000..2e5cac8
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ *  Copyright (c) 2000 - 2014 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        ckmc-manager.h
+ * @author      Yuseok Jeon(yuseok.jeon@samsung.com)
+ * @version     1.0
+ * @brief       provides management functions(storing, retrieving, and removing) for keys, certificates and data of a user and additional crypto functions.
+ */
+
+
+#ifndef CKMC_MANAGER_H
+#define CKMC_MANAGER_H
+
+#include <sys/types.h>
+#include <ckmc/ckmc-type.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// key related functions
+int ckm_save_key(const char *alias, const ckm_key key, const ckm_policy policy);
+int ckm_remove_key(const char *alias);
+int ckm_get_key(const char *alias, const char *password, ckm_key **key);
+int ckm_get_key_alias_list(const ckm_alias_list** alias_list);
+
+int ckm_save_cert(const char *alias, const ckm_cert cert, const ckm_policy policy);
+int ckm_remove_cert(const char *alias);
+int ckm_get_cert(const char *alias, const char *password, const ckm_cert **cert);
+int ckm_get_cert_alias_list(const ckm_alias_list** alias_list);
+
+int ckm_save_data(const char *alias, ckm_raw_buffer data, const ckm_policy policy);
+int ckm_remove_data(const char *alias);
+int ckm_get_data(const char *alias, const char *password, ckm_raw_buffer **data);
+int ckm_get_data_alias_list(const ckm_alias_list** alias_list);
+
+
+// crypto functions
+int ckm_create_key_pair_rsa(const int size, const char *private_key_alias, const char *public_key_alias, const ckm_policy policy_private_key, const ckm_policy policy_public_key);
+int ckm_create_key_pair_ecdsa(const ckm_ec_type type, const char *private_key_alias, const char *public_key_alias, const ckm_policy policy_private_key, const ckm_policy policy_public_key);
+int ckm_create_signature(const char *private_key_alias, const char *password, const ckm_raw_buffer message, const ckm_hash_algo hash, const ckm_rsa_padding_algo padding, ckm_raw_buffer **signature);
+int ckm_verify_signature(const char *public_key_alias, const char *password, const ckm_raw_buffer message, const ckm_raw_buffer signature, const ckm_hash_algo hash, const ckm_rsa_padding_algo padding);
+
+int ckm_get_cert_chain(const ckm_cert *cert, const ckm_cert_list *untrustedcerts, ckm_cert_list **cert_chain_list);
+int ckm_get_cert_chain_with_alias(const ckm_cert *cert, const ckm_alias_list *untrustedcerts, ckm_cert_list **cert_chain_list);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* CKMC_MANAGER_H */
diff --git a/src/include/ckmc/ckmc-type.h b/src/include/ckmc/ckmc-type.h
new file mode 100644 (file)
index 0000000..468875e
--- /dev/null
@@ -0,0 +1,140 @@
+/*
+ *  Copyright (c) 2000 - 2014 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        ckmc-type.h
+ * @author      Yuseok Jeon(yuseok.jeon@samsung.com)
+ * @version     1.0
+ * @brief       Definitions of struct for CAPI
+ */
+
+#ifndef CKMC_TYPE_H
+#define CKMC_TYPE_H
+
+
+#define KEY_MANAGER_CAPI __attribute__((visibility("default")))
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum ckm_key_type_t {
+    CKM_KEY_NONE,
+    CKM_KEY_RSA_PUBLIC,
+    CKM_KEY_RSA_PRIVATE,
+    CKM_KEY_ECDSA_PUBLIC,
+    CKM_KEY_ECDSA_PRIVATE,
+    CKM_KEY_AES
+} ckm_key_type;
+
+typedef enum ckm_data_format_t {
+       CKM_FORM_DER_BASE64,
+       CKM_FORM_DER,
+       CKM_FORM_PEM
+} ckm_data_format;
+
+typedef enum ckm_ec_type_t {
+       CKM_EC_PRIME192V1,
+       CKM_EC_PRIME256V1,
+       CKM_EC_SECP384R1
+} ckm_ec_type;
+
+typedef enum ckm_bool_t {
+       CKM_FALSE,
+       CKM_TRUE
+} ckm_bool;
+
+typedef enum ckm_hash_algo_t {
+       CKM_HASH_SHA1,
+       CKM_HASH_SHA256,
+       CKM_HASH_SHA384,
+       CKM_HASH_SHA512
+} ckm_hash_algo;
+
+typedef enum ckm_rsa_padding_algo_t {
+    CKM_XRSA_PKCS1_PADDING,
+    CKM_XRSA_X931_PADDING
+} ckm_rsa_padding_algo;
+
+typedef enum ckm_cert_form_t {
+    CKM_CERT_FORM_DER,
+    CKM_CERT_FORM_DER_BASE64
+} ckm_cert_form;
+
+typedef struct ckm_raw_buff_t{
+       unsigned char* data;
+       unsigned int   size;
+} ckm_raw_buffer;
+
+typedef struct ckm_policy_t {
+       char*          password;  // byte array used to encrypt data inside CKM
+       ckm_bool       extractable;  // if true key may be extracted from storage
+       ckm_bool       restricted;   // if true only key owner may see data
+} ckm_policy;
+
+typedef struct ckm_key_t {
+       unsigned char* raw_key;
+       unsigned int   key_size;
+       ckm_key_type   key_type;
+       char*          password;  // byte array used to encrypt data inside CKM
+} ckm_key;
+
+typedef struct ckm_cert_t {
+       unsigned char* raw_cert;
+       unsigned int   cert_size;
+       ckm_cert_form  data_format;
+} ckm_cert;
+
+typedef struct ckm_alias_list_t {
+       char *alias;
+       struct ckm_alias_list_t *next;
+} ckm_alias_list;
+
+typedef struct ckm_cert_list_t {
+       ckm_cert *cert;
+       struct ckm_cert_list_t *next;
+} ckm_cert_list;
+
+
+ckm_key *ckm_key_new(unsigned char *raw_key, unsigned int key_size, ckm_key_type key_type, char *password);
+void ckm_key_free(ckm_key *key);
+
+ckm_raw_buffer * ckm_buffer_new(unsigned char *data, unsigned int size);
+void ckm_buffer_free(ckm_raw_buffer *buffer);
+
+ckm_cert *ckm_cert_new(unsigned char *raw_cert, unsigned int cert_size, ckm_cert_form data_format);
+
+void ckm_cert_free(ckm_cert *cert);
+
+int ckm_load_cert_from_file(const char *file_path, ckm_cert **cert);
+int ckm_load_from_pkcs12_file(const char *file_path, const char *passphrase, ckm_key **private_key, ckm_cert **cert, ckm_cert_list **ca_cert_list);
+
+ckm_alias_list *ckm_alias_list_new(char *alias);
+ckm_alias_list *ckm_alias_list_add(ckm_alias_list *previous, char *alias);
+void ckm_alias_list_free(ckm_alias_list *first);
+void ckm_alias_list_all_free(ckm_alias_list *cert_list);
+
+ckm_cert_list *ckm_cert_list_new(ckm_cert *cert);
+ckm_cert_list *ckm_cert_list_add(ckm_cert_list *previous, ckm_cert *cert);
+void ckm_cert_list_free(ckm_cert_list *first);
+void ckm_cert_list_all_free(ckm_cert_list *cert_list);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CKMC_TYPE_H */
diff --git a/src/manager/client-capi/ckmc-control.cpp b/src/manager/client-capi/ckmc-control.cpp
new file mode 100644 (file)
index 0000000..153a608
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ *  Copyright (c) 2000 - 2014 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        ckmc-control.h
+ * @author      Yuseok Jeon(yuseok.jeon@samsung.com)
+ * @version     1.0
+ * @brief       provides conversion methods to C from C++ for key-manager control functions.
+ */
+
+#include <ckm/ckm-control.h>
+#include <ckmc/ckmc-control.h>
+#include <ckmc/ckmc-error.h>
+
+KEY_MANAGER_CAPI
+int ckm_unlock_user_key(uid_t user, const char *password)
+{
+       CKM::Control control;
+       return control.unlockUserKey(user, std::string(password));
+}
+
+KEY_MANAGER_CAPI
+int ckm_lock_user_key(uid_t user)
+{
+       CKM::Control control;
+       return control.lockUserKey(user);
+}
+
+KEY_MANAGER_CAPI
+int ckm_remove_user_data(uid_t user)
+{
+       CKM::Control control;
+       return control.removeUserData(user);
+}
+
+KEY_MANAGER_CAPI
+int ckm_change_user_password(uid_t user, const char *oldPassword, const char *newPassword)
+{
+       CKM::Control control;
+       return control.changeUserPassword(user, std::string(oldPassword), std::string(newPassword));
+}
+
+KEY_MANAGER_CAPI
+int ckm_reset_user_password(uid_t user, const char *newPassword)
+{
+       CKM::Control control;
+       return control.resetUserPassword(user, std::string(newPassword));
+}
+
+
+
diff --git a/src/manager/client-capi/ckmc-error.cpp b/src/manager/client-capi/ckmc-error.cpp
new file mode 100644 (file)
index 0000000..95bc8bf
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ *  Copyright (c) 2000 - 2014 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        ckmc-error.cpp
+ * @author      Yuseok Jeon(yuseok.jeon@samsung.com)
+ * @version     1.0
+ * @brief       This file contains the conversion method to C from C++ about how to get error string.
+ */
+
+#include <ckmc/ckmc-error.h>
+#include <ckm/ckm-error.h>
+
+const char * ckm_error_to_string(int error) {
+       return CKM::ErrorToString(error);
+}
diff --git a/src/manager/client-capi/ckmc-manager.cpp b/src/manager/client-capi/ckmc-manager.cpp
new file mode 100644 (file)
index 0000000..b88af12
--- /dev/null
@@ -0,0 +1,511 @@
+/*
+ *  Copyright (c) 2000 - 2014 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        ckmc-control.h
+ * @author      Yuseok Jeon(yuseok.jeon@samsung.com)
+ * @version     1.0
+ * @brief       provides conversion methods to C from C++ for key-manager control functions.
+ */
+
+#include <ckm/ckm-type.h>
+#include <ckm/ckm-manager.h>
+#include <ckmc/ckmc-type.h>
+#include <ckmc/ckmc-manager.h>
+#include <ckmc/ckmc-error.h>
+
+bool _toBool(ckm_bool ckmBool)
+{
+       if(ckmBool == CKM_TRUE) {
+               return true;
+       }
+       return false;
+}
+
+CKM::Certificate _toCkmCertificate(const ckm_cert *cert)
+{
+       CKM::RawBuffer buffer(cert->raw_cert, cert->raw_cert + cert->cert_size);
+       CKM::DataFormat dataFormat = static_cast<CKM::DataFormat>(static_cast<int>(cert->data_format));
+       CKM::Certificate ckmCert(buffer, dataFormat);
+       return ckmCert;
+}
+
+ckm_cert_list *_toNewCkmCertList(CKM::CertificateVector &certVector)
+{
+       ckm_cert_list *start = NULL;
+       ckm_cert_list *plist = NULL;
+       CKM::CertificateVector::iterator it;
+       for(it = certVector.begin(); it != certVector.end(); it++) {
+               CKM::RawBuffer rawBuffer = it->getDER();
+               unsigned char *rawCert = reinterpret_cast<unsigned char*>(rawBuffer.data());
+               ckm_cert *pcert = ckm_cert_new( rawCert, rawBuffer.size(), CKM_CERT_FORM_DER);
+               if(pcert == NULL) {
+                       return NULL;
+               }
+               if(plist == NULL) {
+                       plist = ckm_cert_list_new(pcert);
+                       start = plist; // save the pointer of the first element
+               }else {
+                       plist = ckm_cert_list_add(plist, pcert);
+               }
+       }
+       return start;
+}
+
+KEY_MANAGER_CAPI
+int ckm_save_key(const char *alias, const ckm_key key, const ckm_policy policy)
+{
+       CKM::Manager mgr;
+
+       if(alias == NULL) {
+               return KEY_MANAGER_API_ERROR_INPUT_PARAM;
+       }
+       CKM::Alias ckmAlias(alias);
+
+       if(key.raw_key == NULL || key.key_size <= 0) {
+                       return KEY_MANAGER_API_ERROR_INPUT_PARAM;
+       }
+       CKM::RawBuffer buffer(key.raw_key, key.raw_key + key.key_size);
+       std::string password(key.password);
+       CKM::Key ckmKey(buffer,password);
+
+       CKM::Policy storePolicy(policy.password, _toBool(policy.extractable), _toBool(policy.restricted));
+
+       return mgr.saveKey(ckmAlias, ckmKey, storePolicy);
+}
+
+
+KEY_MANAGER_CAPI
+int ckm_remove_key(const char *alias)
+{
+       CKM::Manager mgr;
+
+       if(alias == NULL) {
+               return KEY_MANAGER_API_ERROR_INPUT_PARAM;
+       }
+       CKM::Alias ckmAlias(alias);
+
+       return mgr.removeKey(ckmAlias);
+}
+
+KEY_MANAGER_CAPI
+int ckm_get_key(const char *alias, const char *password, ckm_key **key)
+{
+       int ret;
+       CKM::Key ckmKey;
+
+       if(alias == NULL) {
+               return KEY_MANAGER_API_ERROR_INPUT_PARAM;
+       }
+       CKM::Alias ckmAlias(alias);
+
+       CKM::Manager mgr;
+       if( (ret = mgr.getKey(ckmAlias, std::string(password), ckmKey)) != KEY_MANAGER_API_SUCCESS) {
+               return ret;
+       }
+
+       unsigned char *rawKey = reinterpret_cast<unsigned char*>(ckmKey.getDER().data());
+       ckm_key_type keyType = static_cast<ckm_key_type>(static_cast<int>(ckmKey.getType()));
+       *key = ckm_key_new( rawKey, ckmKey.getDER().size(), keyType, NULL);
+       if(*key == NULL) {
+               return KEY_MANAGER_API_ERROR_OUT_OF_MEMORY;
+       }else {
+               return KEY_MANAGER_API_SUCCESS;
+       }
+}
+
+KEY_MANAGER_CAPI
+int ckm_get_key_alias_list(const ckm_alias_list** alias_list)
+{
+       int ret;
+       CKM::Key ckmKey;
+
+       CKM::AliasVector aliasVector;
+       CKM::Manager mgr;
+       if( (ret = mgr.getKeyAliasVector(aliasVector)) != KEY_MANAGER_API_SUCCESS) {
+               return ret;
+       }
+
+       ckm_alias_list *plist = NULL;
+       CKM::AliasVector::iterator it;
+       for(it = aliasVector.begin(); it != aliasVector.end(); it++) {
+               if(plist == NULL) { // first
+                       plist = ckm_alias_list_new(const_cast<char *>(it->c_str()));
+                       *alias_list = plist; // save the pointer of the first element
+               }else {
+                       plist = ckm_alias_list_add(plist, const_cast<char *>(it->c_str()));
+               }
+       }
+
+       return KEY_MANAGER_API_SUCCESS;
+}
+
+KEY_MANAGER_CAPI
+int ckm_save_cert(const char *alias, const ckm_cert cert, const ckm_policy policy)
+{
+       if(alias == NULL) {
+               return KEY_MANAGER_API_ERROR_INPUT_PARAM;
+       }
+       CKM::Alias ckmAlias(alias);
+
+       if(cert.raw_cert == NULL || cert.cert_size <= 0) {
+                       return KEY_MANAGER_API_ERROR_INPUT_PARAM;
+       }
+       CKM::Certificate ckmCert = _toCkmCertificate(&cert);
+
+       CKM::Policy storePolicy(policy.password, _toBool(policy.extractable), _toBool(policy.restricted));
+
+       CKM::Manager mgr;
+       return mgr.saveCertificate(ckmAlias, ckmCert, storePolicy);
+}
+
+KEY_MANAGER_CAPI
+int ckm_remove_cert(const char *alias)
+{
+       if(alias == NULL) {
+               return KEY_MANAGER_API_ERROR_INPUT_PARAM;
+       }
+       CKM::Alias ckmAlias(alias);
+
+       CKM::Manager mgr;
+       return mgr.removeCertificate(ckmAlias);
+}
+
+KEY_MANAGER_CAPI
+int ckm_get_cert(const char *alias, const char *password, const ckm_cert **cert)
+{
+       CKM::Certificate ckmCert;
+       int ret;
+
+       if(alias == NULL) {
+               return KEY_MANAGER_API_ERROR_INPUT_PARAM;
+       }
+       CKM::Alias ckmAlias(alias);
+
+       CKM::Manager mgr;
+       if( (ret = mgr.getCertificate(ckmAlias, std::string(password), ckmCert)) != KEY_MANAGER_API_SUCCESS) {
+               return ret;
+       }
+
+       unsigned char *rawCert = reinterpret_cast<unsigned char*>(ckmCert.getDER().data());
+       *cert = ckm_cert_new( rawCert, ckmCert.getDER().size(), CKM_CERT_FORM_DER);
+       if(*cert == NULL) {
+               return KEY_MANAGER_API_ERROR_OUT_OF_MEMORY;
+       }else {
+               return KEY_MANAGER_API_SUCCESS;
+       }
+}
+
+KEY_MANAGER_CAPI
+int ckm_get_cert_alias_list(const ckm_alias_list** alias_list) {
+       int ret;
+       CKM::Key ckmKey;
+
+       CKM::AliasVector aliasVector;
+       CKM::Manager mgr;
+       if( (ret = mgr.getCertificateAliasVector(aliasVector)) != KEY_MANAGER_API_SUCCESS) {
+               return ret;
+       }
+
+       ckm_alias_list *plist = NULL;
+       CKM::AliasVector::iterator it;
+       for(it = aliasVector.begin(); it != aliasVector.end(); it++) {
+               if(plist == NULL) { // first
+                       plist = ckm_alias_list_new(const_cast<char *>(it->c_str()));
+                       *alias_list = plist; // save the pointer of the first element
+               }else {
+                       plist = ckm_alias_list_add(plist, const_cast<char *>(it->c_str()));
+               }
+       }
+
+       return KEY_MANAGER_API_SUCCESS;
+}
+
+KEY_MANAGER_CAPI
+int ckm_save_data(const char *alias, ckm_raw_buffer data, const ckm_policy policy)
+{
+       if(alias == NULL) {
+               return KEY_MANAGER_API_ERROR_INPUT_PARAM;
+       }
+       CKM::Alias ckmAlias(alias);
+
+       if(data.data == NULL || data.size <= 0) {
+                       return KEY_MANAGER_API_ERROR_INPUT_PARAM;
+       }
+       CKM::RawBuffer buffer(data.data, data.data + data.size);
+
+       CKM::Policy storePolicy(policy.password, _toBool(policy.extractable), _toBool(policy.restricted));
+
+       CKM::Manager mgr;
+       return mgr.saveData(ckmAlias, buffer, storePolicy);
+}
+
+KEY_MANAGER_CAPI
+int ckm_remove_data(const char *alias)
+{
+       if(alias == NULL) {
+               return KEY_MANAGER_API_ERROR_INPUT_PARAM;
+       }
+       CKM::Alias ckmAlias(alias);
+
+       CKM::Manager mgr;
+       return mgr.removeData(ckmAlias);
+}
+
+KEY_MANAGER_CAPI
+int ckm_get_data(const char *alias, const char *password, ckm_raw_buffer **data)
+{
+       CKM::RawBuffer ckmBuff;
+       int ret;
+
+       if(alias == NULL) {
+               return KEY_MANAGER_API_ERROR_INPUT_PARAM;
+       }
+       CKM::Alias ckmAlias(alias);
+
+       CKM::Manager mgr;
+       if( (ret = mgr.getData(ckmAlias, std::string(password), ckmBuff)) != KEY_MANAGER_API_SUCCESS) {
+               return ret;
+       }
+
+       unsigned char *rawBuff = reinterpret_cast<unsigned char*>(ckmBuff.data());
+       *data = ckm_buffer_new( rawBuff, ckmBuff.size());
+       if(*data == NULL) {
+               return KEY_MANAGER_API_ERROR_OUT_OF_MEMORY;
+       }else {
+               return KEY_MANAGER_API_SUCCESS;
+       }
+}
+
+KEY_MANAGER_CAPI
+int ckm_get_data_alias_list(const ckm_alias_list** alias_list){
+       int ret;
+       CKM::Key ckmKey;
+
+       CKM::AliasVector aliasVector;
+       CKM::Manager mgr;
+       if( (ret = mgr.getDataAliasVector(aliasVector)) != KEY_MANAGER_API_SUCCESS) {
+               return ret;
+       }
+
+       ckm_alias_list *plist = NULL;
+       CKM::AliasVector::iterator it;
+       for(it = aliasVector.begin(); it != aliasVector.end(); it++) {
+               if(plist == NULL) { // first
+                       plist = ckm_alias_list_new(const_cast<char *>(it->c_str()));
+                       *alias_list = plist; // save the pointer of the first element
+               }else {
+                       plist = ckm_alias_list_add(plist, const_cast<char *>(it->c_str()));
+               }
+       }
+
+       return KEY_MANAGER_API_SUCCESS;
+}
+
+KEY_MANAGER_CAPI
+int ckm_create_key_pair_rsa(const int size,
+                                                       const char *private_key_alias,
+                                                       const char *public_key_alias,
+                                                       const ckm_policy policy_private_key,
+                                                       const ckm_policy policy_public_key)
+{
+       int ret;
+       CKM::Manager mgr;
+
+       CKM::Alias ckmPrivakeKeyAlias(private_key_alias);
+       CKM::Alias ckmPublicKeyAlias(public_key_alias);
+       CKM::Policy ckmPrivateKeyPolicy(policy_private_key.password, _toBool(policy_private_key.extractable), _toBool(policy_private_key.restricted));
+       CKM::Policy ckmPublicKeyPolicy(policy_public_key.password, _toBool(policy_public_key.extractable), _toBool(policy_public_key.restricted));
+
+       if( (mgr.createKeyPairRSA(size, ckmPrivakeKeyAlias, ckmPublicKeyAlias, ckmPrivateKeyPolicy, ckmPublicKeyPolicy))
+                       != KEY_MANAGER_API_SUCCESS) {
+               return ret;
+       }
+
+       return KEY_MANAGER_API_SUCCESS;
+}
+
+KEY_MANAGER_CAPI
+int ckm_create_key_pair_ecdsa(const ckm_ec_type type,
+                                                       const char *private_key_alias,
+                                                       const char *public_key_alias,
+                                                       const ckm_policy policy_private_key,
+                                                       const ckm_policy policy_public_key)
+{
+       int ret;
+       CKM::Manager mgr;
+
+       CKM::ElipticCurve ckmType = static_cast<CKM::ElipticCurve>(static_cast<int>(type));
+       CKM::Alias ckmPrivakeKeyAlias(private_key_alias);
+       CKM::Alias ckmPublicKeyAlias(public_key_alias);
+       CKM::Policy ckmPrivateKeyPolicy(policy_private_key.password, _toBool(policy_private_key.extractable), _toBool(policy_private_key.restricted));
+       CKM::Policy ckmPublicKeyPolicy(policy_public_key.password, _toBool(policy_public_key.extractable), _toBool(policy_public_key.restricted));
+
+       if( (mgr.createKeyPairECDSA(ckmType, ckmPrivakeKeyAlias, ckmPublicKeyAlias, ckmPrivateKeyPolicy, ckmPublicKeyPolicy))
+                       != KEY_MANAGER_API_SUCCESS) {
+               return ret;
+       }
+
+       return KEY_MANAGER_API_SUCCESS;
+}
+
+KEY_MANAGER_CAPI
+int ckm_create_signature(const char *private_key_alias,
+                                                       const char *password,
+                                                       const ckm_raw_buffer message,
+                                                       const ckm_hash_algo hash,
+                                                       const ckm_rsa_padding_algo padding,
+                                                       ckm_raw_buffer **signature)
+{
+       int ret;
+       CKM::Manager mgr;
+       CKM::RawBuffer ckmSignature;
+
+       CKM::Alias ckmPrivakeKeyAlias(private_key_alias);
+       CKM::RawBuffer ckmMessage(message.data, message.data + message.size);
+       CKM::HashAlgorithm ckmHashAlgo = static_cast<CKM::HashAlgorithm>(static_cast<int>(hash));
+       CKM::RSAPaddingAlgorithm ckmPadding = static_cast<CKM::RSAPaddingAlgorithm>(static_cast<int>(padding));
+
+       if( (ret = mgr.createSignature(
+                       ckmPrivakeKeyAlias,
+                       password,
+                       ckmMessage,
+                       ckmHashAlgo,
+                       ckmPadding,
+                       ckmSignature)) != KEY_MANAGER_API_SUCCESS) {
+               return ret;
+       }
+
+       unsigned char *rawBuff = reinterpret_cast<unsigned char*>(ckmSignature.data());
+       *signature = ckm_buffer_new( rawBuff, ckmSignature.size());
+       if(*signature == NULL) {
+               return KEY_MANAGER_API_ERROR_OUT_OF_MEMORY;
+       }else {
+               return KEY_MANAGER_API_SUCCESS;
+       }
+
+       return KEY_MANAGER_API_SUCCESS;
+}
+
+KEY_MANAGER_CAPI
+int ckm_verify_signature(const char *public_key_alias,
+                                                       const char *password,
+                                                       const ckm_raw_buffer message,
+                                                       const ckm_raw_buffer signature,
+                                                       const ckm_hash_algo hash,
+                                                       const ckm_rsa_padding_algo padding)
+{
+       int ret;
+       CKM::Manager mgr;
+
+       CKM::Alias ckmPublicKeyAlias(public_key_alias);
+       CKM::RawBuffer ckmMessage(message.data, message.data + message.size);
+       CKM::RawBuffer ckmSignature(signature.data, signature.data + signature.size);
+       CKM::HashAlgorithm ckmHashAlgo = static_cast<CKM::HashAlgorithm>(static_cast<int>(hash));
+       CKM::RSAPaddingAlgorithm ckmPadding = static_cast<CKM::RSAPaddingAlgorithm>(static_cast<int>(padding));
+
+       if( (ret = mgr.verifySignature(
+                       ckmPublicKeyAlias,
+                       password,
+                       ckmMessage,
+                       ckmSignature,
+                       ckmHashAlgo,
+                       ckmPadding)) != KEY_MANAGER_API_SUCCESS) {
+               return ret;
+       }
+
+       return KEY_MANAGER_API_SUCCESS;
+}
+
+KEY_MANAGER_CAPI
+int ckm_get_cert_chain(const ckm_cert *cert, const ckm_cert_list *untrustedcerts, ckm_cert_list **cert_chain_list)
+{
+       int ret;
+       CKM::Manager mgr;
+       CKM::CertificateVector ckmCertChain;
+
+
+       if(cert->raw_cert == NULL || cert->cert_size <= 0) {
+               return KEY_MANAGER_API_ERROR_INPUT_PARAM;
+       }
+       CKM::RawBuffer buffer(cert->raw_cert, cert->raw_cert + cert->cert_size);
+       CKM::DataFormat dataFormat = static_cast<CKM::DataFormat>(static_cast<int>(cert->data_format));
+       CKM::Certificate ckmCert(buffer, dataFormat);
+
+       CKM::CertificateVector ckmUntrustedCerts;
+       if(untrustedcerts != NULL) {
+               ckm_cert_list *current = NULL;
+               ckm_cert_list *next = const_cast<ckm_cert_list *>(untrustedcerts);
+               do {
+                       current = next;
+                       next = current->next;
+
+                       if(current->cert == NULL){
+                               return KEY_MANAGER_API_ERROR_INPUT_PARAM;
+                       }
+                       CKM::Certificate ckmCert = _toCkmCertificate(current->cert);
+                       ckmUntrustedCerts.push_back(ckmCert);
+               }while(next != NULL);
+       }
+
+       if( (ret = mgr.getCertificateChain(ckmCert, ckmUntrustedCerts, ckmCertChain)) != KEY_MANAGER_API_SUCCESS) {
+               return ret;
+       }
+
+       *cert_chain_list = _toNewCkmCertList(ckmCertChain);
+
+       return KEY_MANAGER_API_SUCCESS;
+}
+
+KEY_MANAGER_CAPI
+int ckm_get_cert_chain_with_alias(const ckm_cert *cert, const ckm_alias_list *untrustedcerts, ckm_cert_list **cert_chain_list)
+{
+       int ret;
+       CKM::Manager mgr;
+       CKM::CertificateVector ckmCertChain;
+
+
+       if(cert->raw_cert == NULL || cert->cert_size <= 0) {
+               return KEY_MANAGER_API_ERROR_INPUT_PARAM;
+       }
+       CKM::RawBuffer buffer(cert->raw_cert, cert->raw_cert + cert->cert_size);
+       CKM::DataFormat dataFormat = static_cast<CKM::DataFormat>(static_cast<int>(cert->data_format));
+       CKM::Certificate ckmCert(buffer, dataFormat);
+
+       CKM::AliasVector ckmUntrustedAliases;
+       if(untrustedcerts != NULL) {
+               ckm_alias_list *current = NULL;
+               ckm_alias_list *next = const_cast<ckm_alias_list *>(untrustedcerts);
+               do {
+                       current = next;
+                       next = current->next;
+
+                       if(current->alias == NULL){
+                               return KEY_MANAGER_API_ERROR_INPUT_PARAM;
+                       }
+                       CKM::Alias ckmAlias(current->alias);
+                       ckmUntrustedAliases.push_back(ckmAlias);
+               }while(next != NULL);
+       }
+
+       if( (ret = mgr.getCertificateChain(ckmCert, ckmUntrustedAliases, ckmCertChain)) != KEY_MANAGER_API_SUCCESS) {
+               return ret;
+       }
+
+       *cert_chain_list = _toNewCkmCertList(ckmCertChain);
+
+       return KEY_MANAGER_API_SUCCESS;
+}
+
diff --git a/src/manager/client-capi/ckmc-type.cpp b/src/manager/client-capi/ckmc-type.cpp
new file mode 100644 (file)
index 0000000..9b25446
--- /dev/null
@@ -0,0 +1,441 @@
+/*
+ *  Copyright (c) 2000 - 2014 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        ckmc-type.h
+ * @author      Yuseok Jeon(yuseok.jeon@samsung.com)
+ * @version     1.0
+ * @brief       new and free methods for the struct of CAPI
+ */
+
+
+#include <string.h>
+#include <stdlib.h>
+#include <ckmc/ckmc-type.h>
+#include <ckmc/ckmc-error.h>
+#include <openssl/x509v3.h>
+#include <openssl/pkcs12.h>
+#include <openssl/evp.h>
+#include <openssl/pem.h>
+
+int _ckm_load_cert_from_x509(X509 *xCert, ckm_cert **cert);
+
+
+KEY_MANAGER_CAPI
+ckm_key *ckm_key_new(unsigned char *raw_key, unsigned int key_size, ckm_key_type key_type, char *password)
+{
+       ckm_key *pkey = new ckm_key;
+       if(pkey == NULL)
+               return NULL;
+
+       pkey->raw_key = reinterpret_cast<unsigned char*>(malloc(key_size));
+       if(pkey->raw_key == NULL) {
+               free(pkey);
+               return NULL;
+       }
+       memcpy(pkey->raw_key, raw_key, key_size);
+
+       pkey->key_size = key_size;
+       pkey->key_type = key_type;
+
+       if(password != NULL) {
+               pkey->password = reinterpret_cast<char*>(malloc(strlen(password) +1));
+               if(pkey->password == NULL) {
+                       free(pkey);
+                       free(pkey->raw_key);
+                       return NULL;
+               }
+               memset(pkey->password, 0, strlen(password) +1);
+               strncpy(pkey->password, password, strlen(password));
+       }else {
+               pkey->password = NULL;
+       }
+
+       return pkey;
+}
+
+KEY_MANAGER_CAPI
+void ckm_key_free(ckm_key *key)
+{
+       if(key == NULL)
+               return;
+
+       if(key->password != NULL)
+               free(key->password);
+       if(key->raw_key != NULL)
+               free(key->raw_key);
+
+       free(key);
+}
+
+KEY_MANAGER_CAPI
+ckm_raw_buffer * ckm_buffer_new(unsigned char *data, unsigned int size)
+{
+       ckm_raw_buffer *pbuff = new ckm_raw_buffer;
+       if(pbuff == NULL)
+                       return NULL;
+
+       pbuff->data = reinterpret_cast<unsigned char*>(malloc(size));
+       if(pbuff->data == NULL) {
+               free(pbuff);
+               return NULL;
+       }
+       memcpy(pbuff->data, data, size);
+
+       pbuff->size = size;
+
+       return pbuff;
+}
+
+KEY_MANAGER_CAPI
+void ckm_buffer_free(ckm_raw_buffer *buffer)
+{
+       if(buffer == NULL)
+               return;
+
+       if(buffer->data != NULL)
+               free(buffer->data);
+       free(buffer);
+}
+
+KEY_MANAGER_CAPI
+ckm_cert *ckm_cert_new(unsigned char *raw_cert, unsigned int cert_size, ckm_cert_form data_format)
+{
+       ckm_cert *pcert = new ckm_cert;
+       if(pcert == NULL)
+               return NULL;
+
+       pcert->raw_cert = reinterpret_cast<unsigned char*>(malloc(cert_size));
+       if(pcert->raw_cert == NULL) {
+               free(pcert);
+               return NULL;
+       }
+       memcpy(pcert->raw_cert, raw_cert, cert_size);
+
+       pcert->cert_size = cert_size;
+       pcert->data_format = data_format;
+
+       return pcert;
+}
+
+KEY_MANAGER_CAPI
+int ckm_load_cert_from_file(const char *file_path, ckm_cert **cert)
+{
+       OpenSSL_add_all_algorithms();
+
+       FILE *fp = fopen(file_path, "r");
+       if(fp == NULL)
+               return KEY_MANAGER_API_ERROR_FILE_ACCESS_DENIED;
+       X509 *pcert = NULL;
+       if(!(pcert = d2i_X509_fp(fp, NULL))) {
+               fseek(fp, 0, SEEK_SET);
+               pcert = PEM_read_X509(fp, NULL, NULL, NULL);
+       }
+       fclose(fp);
+       if(pcert == NULL) {
+               return KEY_MANAGER_API_ERROR_INVALID_FORMAT;
+       }
+
+       int ret = _ckm_load_cert_from_x509(pcert, cert);
+       if(ret != KEY_MANAGER_API_SUCCESS) {
+               X509_free(pcert);
+       }
+       return ret;
+}
+
+KEY_MANAGER_CAPI
+int ckm_load_from_pkcs12_file(const char *file_path, const char *passphrase, ckm_key **private_key, ckm_cert **ckmcert, ckm_cert_list **ca_cert_list)
+{
+       class Pkcs12Converter {
+       private:
+               FILE* fp_in;
+               PKCS12* p12;
+               EVP_PKEY* pkey;
+               X509* x509Cert;
+               STACK_OF(X509)* ca;
+
+       public:
+               int ret;
+               ckm_key *retPrivateKey;
+               ckm_cert *retCkmCert;
+               ckm_cert_list *retCaCertList;
+
+               Pkcs12Converter(){
+                       fp_in = NULL;
+                       p12 = NULL;
+                       pkey = NULL;
+                       x509Cert = NULL;
+                       ca = NULL;
+                       ret = KEY_MANAGER_API_SUCCESS;
+                       retPrivateKey = NULL;
+                       retCkmCert = NULL;
+                       retCaCertList = NULL;
+               };
+               ~Pkcs12Converter(){
+                       if(fp_in != NULL)
+                               fclose(fp_in);
+                       if(p12 != NULL)
+                               PKCS12_free(p12);
+                       if(x509Cert != NULL)
+                               X509_free(x509Cert);
+                       if(pkey != NULL)
+                               EVP_PKEY_free(pkey);
+                       if(ca != NULL)
+                               sk_X509_pop_free(ca, X509_free);
+                       EVP_cleanup();
+
+                       if(ret != KEY_MANAGER_API_SUCCESS) {
+                               if(retPrivateKey != NULL)
+                                       ckm_key_free(retPrivateKey);
+                               if(retCkmCert != NULL)
+                                       ckm_cert_free(retCkmCert);
+                               if(retCaCertList != NULL)
+                                       ckm_cert_list_free(retCaCertList);
+                       }
+               };
+
+               int parsePkcs12(const char *filePath, const char *pass) {
+                       fp_in = NULL;
+                       if(!(fp_in = fopen(filePath, "rb"))) {
+                               return KEY_MANAGER_API_ERROR_FILE_ACCESS_DENIED;
+                       }
+
+                       if(!(p12 = d2i_PKCS12_fp(fp_in, NULL))) {
+                               return KEY_MANAGER_API_ERROR_INVALID_FORMAT;
+                       }
+
+                       /* parse PKCS#12 certificate */
+                       if((ret = PKCS12_parse(p12, pass, &pkey, &x509Cert, &ca)) != 1) {
+                               return KEY_MANAGER_API_ERROR_INVALID_FORMAT;
+                       }
+                       return KEY_MANAGER_API_SUCCESS;
+               }
+
+               int toCkmCert() {
+                       if( (ret =_ckm_load_cert_from_x509(x509Cert,&retCkmCert)) != KEY_MANAGER_API_SUCCESS) {
+                               return ret;
+                       }
+                       return KEY_MANAGER_API_SUCCESS;
+               }
+
+               int toCkmKey() {
+                       int prikeyLen = 0;
+                       if((prikeyLen = i2d_PrivateKey(pkey, NULL)) < 0) {
+                               return KEY_MANAGER_API_ERROR_OUT_OF_MEMORY;
+                       }
+                       unsigned char arrayPrikey[sizeof(unsigned char) * prikeyLen];
+                       unsigned char *pPrikey = arrayPrikey;
+                       if((prikeyLen = i2d_PrivateKey(pkey, &pPrikey)) < 0) {
+                               return KEY_MANAGER_API_ERROR_OUT_OF_MEMORY;
+                       }
+
+                       int type = EVP_PKEY_type(pkey->type);
+                       ckm_key_type key_type = CKM_KEY_NONE;
+                       switch(type) {
+                       case EVP_PKEY_RSA :
+                               key_type = CKM_KEY_RSA_PRIVATE;
+                               break;
+                       case EVP_PKEY_EC :
+                               key_type = CKM_KEY_ECDSA_PRIVATE;
+                               break;
+                       }
+                       if(key_type == CKM_KEY_NONE) {
+                               return KEY_MANAGER_API_ERROR_INVALID_FORMAT;
+                       }
+
+                       char *nullPassword = NULL;
+                       retPrivateKey = ckm_key_new(pPrikey, sizeof(unsigned char) * prikeyLen, key_type, nullPassword);
+
+                       return KEY_MANAGER_API_SUCCESS;
+               }
+
+               int toCaCkmCertList() {
+                       X509* popedCert = NULL;
+                       ckm_cert *popedCkmCert = NULL;
+                       ckm_cert_list *tmpCertList = NULL;
+                       retCaCertList = tmpCertList;
+                       while((popedCert = sk_X509_pop(ca)) != NULL) {
+                               if( (ret =_ckm_load_cert_from_x509(popedCert, &popedCkmCert)) != KEY_MANAGER_API_SUCCESS) {
+                                       return KEY_MANAGER_API_ERROR_OUT_OF_MEMORY;
+                               }
+                               tmpCertList = ckm_cert_list_add(tmpCertList, popedCkmCert);
+                       }
+                       return KEY_MANAGER_API_SUCCESS;
+               }
+
+       };
+
+       int ret = KEY_MANAGER_API_SUCCESS;
+
+       Pkcs12Converter converter;
+       if((ret = converter.parsePkcs12(file_path, passphrase)) != KEY_MANAGER_API_SUCCESS) {
+               return ret;
+       }
+       if((ret = converter.toCkmCert()) != KEY_MANAGER_API_SUCCESS) {
+               return ret;
+       }
+       if((ret = converter.toCkmKey()) != KEY_MANAGER_API_SUCCESS) {
+               return ret;
+       }
+       if((ret = converter.toCaCkmCertList()) != KEY_MANAGER_API_SUCCESS) {
+               return ret;
+       }
+       *private_key = converter.retPrivateKey;
+       *ckmcert = converter.retCkmCert;
+       *ca_cert_list = converter.retCaCertList;
+
+       return KEY_MANAGER_API_SUCCESS;
+}
+
+KEY_MANAGER_CAPI
+void ckm_cert_free(ckm_cert *cert)
+{
+       if(cert == NULL)
+               return;
+
+       if(cert->raw_cert != NULL)
+               free(cert->raw_cert);
+       free(cert);
+}
+
+KEY_MANAGER_CAPI
+ckm_alias_list *ckm_alias_list_new(char *alias)
+{
+       ckm_alias_list *previous = NULL;
+       return ckm_alias_list_add(previous, alias);
+}
+
+KEY_MANAGER_CAPI
+ckm_alias_list *ckm_alias_list_add(ckm_alias_list *previous, char *alias)
+{
+       ckm_alias_list *plist = new ckm_alias_list;
+
+       plist->alias = alias;
+       plist->next = NULL;
+
+       if(previous != NULL)
+               previous->next = plist;
+
+       return plist;
+}
+
+KEY_MANAGER_CAPI
+void ckm_alias_list_free(ckm_alias_list *first)
+{
+       if(first == NULL)
+               return;
+
+       ckm_alias_list *current = NULL;
+       ckm_alias_list *next = first;
+       do {
+               current = next;
+               next = current->next;
+               free(current);
+       }while(next != NULL);
+}
+
+KEY_MANAGER_CAPI
+void ckm_alias_list_all_free(ckm_alias_list *first)
+{
+       if(first == NULL)
+               return;
+
+       ckm_alias_list *current = NULL;
+       ckm_alias_list *next = first;
+       do {
+               current = next;
+               next = current->next;
+               if((current->alias)!=NULL) {
+                       free(current->alias);
+               }
+               free(current);
+       }while(next != NULL);
+}
+
+KEY_MANAGER_CAPI
+ckm_cert_list *ckm_cert_list_new(ckm_cert *cert)
+{
+       ckm_cert_list *previous = NULL;
+       return ckm_cert_list_add(previous, cert);
+}
+
+KEY_MANAGER_CAPI
+ckm_cert_list *ckm_cert_list_add(ckm_cert_list *previous, ckm_cert *cert)
+{
+       ckm_cert_list *plist = new ckm_cert_list;
+
+       plist->cert = cert;
+       plist->next = NULL;
+
+       if(previous != NULL)
+               previous->next = plist;
+
+       return plist;
+}
+
+KEY_MANAGER_CAPI
+void ckm_cert_list_free(ckm_cert_list *first)
+{
+       if(first == NULL)
+               return;
+
+       ckm_cert_list *current = NULL;
+       ckm_cert_list *next = first;
+       do {
+               current = next;
+               next = current->next;
+               free(current);
+       }while(next != NULL);
+}
+
+KEY_MANAGER_CAPI
+void ckm_cert_list_all_free(ckm_cert_list *first)
+{
+       if(first == NULL)
+               return;
+
+       ckm_cert_list *current = NULL;
+       ckm_cert_list *next = first;
+       do {
+               current = next;
+               next = current->next;
+               if((current->cert)!=NULL) {
+                       ckm_cert_free(current->cert);
+               }
+               free(current);
+       }while(next != NULL);
+}
+
+int _ckm_load_cert_from_x509(X509 *xCert, ckm_cert **cert)
+{
+       int certLen;
+       unsigned char* bufCert = NULL;
+
+       if(xCert == NULL) {
+               return KEY_MANAGER_API_ERROR_INVALID_FORMAT;
+       }
+
+       /* load certificate into buffer */
+       if((certLen = i2d_X509(xCert, NULL)) < 0) {
+               return KEY_MANAGER_API_ERROR_INVALID_FORMAT;
+       }
+       unsigned char arrayCert[sizeof(unsigned char) * certLen];
+       bufCert = arrayCert;
+       i2d_X509(xCert, &bufCert);
+
+       *cert = ckm_cert_new(bufCert, certLen, CKM_CERT_FORM_DER);
+
+       return KEY_MANAGER_API_SUCCESS;
+}