diff --git a/include/dap_cert.h b/include/dap_cert.h
index 16c43b9d80ae36a05a135327783e8c083e68923f..a793fd7ad309e6bc297906af1adf1ab6f69eb78c 100755
--- a/include/dap_cert.h
+++ b/include/dap_cert.h
@@ -39,6 +39,10 @@ typedef struct dap_cert {
     char * metadata;
 } dap_cert_t;
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 int dap_cert_init();
 
 
@@ -62,7 +66,7 @@ dap_cert_t * dap_cert_find_by_name(const char * a_cert_name);
 
 dap_sign_t * dap_cert_sign(dap_cert_t * a_cert, const void * a_data, size_t a_data_size, size_t a_output_size_wished );
 
-int dap_cert_compare_with_sign (dap_cert_t * a_cert,dap_sign_t * a_sign);
+int dap_cert_compare_with_sign (dap_cert_t * a_cert,const dap_sign_t * a_sign);
 
 
 size_t dap_cert_sign_output_size(dap_cert_t * a_cert, size_t a_size_wished);
@@ -80,3 +84,7 @@ void dap_cert_deinit();
 
 void dap_cert_delete(dap_cert_t * a_cert);
 void dap_cert_delete_by_name(const char * a_cert_name);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/include/dap_cert_file.h b/include/dap_cert_file.h
index 5ba7f1fbabe38e5b913cbbf277ae9cffc790b182..6ab2293a4343bdd14c28bfccb7d9eae2f636cdd5 100755
--- a/include/dap_cert_file.h
+++ b/include/dap_cert_file.h
@@ -53,8 +53,16 @@ typedef struct dap_cert_file{
     uint8_t data[];
 }DAP_ALIGN_PACKED dap_cert_file_t;
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 int dap_cert_file_save(dap_cert_t * a_cert, const char * a_cert_file_path);
 uint8_t* dap_cert_mem_save(dap_cert_t * a_cert, uint32_t *a_cert_size_out);
 
 dap_cert_t* dap_cert_file_load(const char * a_cert_file_path);
-dap_cert_t* dap_cert_mem_load(void * a_data, size_t a_data_size);
+dap_cert_t* dap_cert_mem_load(const void * a_data, size_t a_data_size);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/include/dap_enc_key.h b/include/dap_enc_key.h
index 4598356890308ff25d0bfb1d3c3e3196b3d5a66e..064896d3cfadd7109fa932de816eb596686b19dd 100755
--- a/include/dap_enc_key.h
+++ b/include/dap_enc_key.h
@@ -30,9 +30,7 @@
 #include <time.h>
 #include <stdint.h>
 
-#ifdef __cplusplus
-extern "C" {
-#endif
+
 
 typedef enum dap_enc_data_type{DAP_ENC_DATA_TYPE_RAW,
 
@@ -216,6 +214,10 @@ typedef struct dap_enc_key_serealize {
     unsigned char inheritor[MAX_INHERITOR_SIZE];
 } dap_enc_key_serealize_t;
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 int dap_enc_key_init(void);
 void dap_enc_key_deinit(void);
 
@@ -228,10 +230,10 @@ uint8_t* dap_enc_key_deserealize_sign(dap_enc_key_type_t a_key_type, uint8_t *a_
 uint8_t* dap_enc_key_serealize_priv_key(dap_enc_key_t *a_key, size_t *a_buflen_out);
 uint8_t* dap_enc_key_serealize_pub_key(dap_enc_key_t *a_key, size_t *a_buflen_out);
 int dap_enc_key_deserealize_priv_key(dap_enc_key_t *a_key, uint8_t *a_buf, size_t a_buflen);
-int dap_enc_key_deserealize_pub_key(dap_enc_key_t *a_key, uint8_t *a_buf, size_t a_buflen);
+int dap_enc_key_deserealize_pub_key(dap_enc_key_t *a_key, const uint8_t *a_buf, size_t a_buflen);
 
 dap_enc_key_serealize_t* dap_enc_key_serealize(dap_enc_key_t * key);
-dap_enc_key_t* dap_enc_key_deserealize(void *buf, size_t buf_size);
+dap_enc_key_t* dap_enc_key_deserealize(const void *buf, size_t buf_size);
 
 // allocate memory for key struct
 dap_enc_key_t *dap_enc_key_new(dap_enc_key_type_t a_key_type);
diff --git a/include/dap_sign.h b/include/dap_sign.h
index 8a5542e6c9d4ca414246d2c6b8bc5c3df855f1d8..467b087da418bbd8b0a63ed2a107dc31bb705e42 100755
--- a/include/dap_sign.h
+++ b/include/dap_sign.h
@@ -61,6 +61,10 @@ typedef struct dap_sign
     uint8_t pkey_n_sign[]; /// @param sig @brief raw signature data
 } DAP_ALIGN_PACKED dap_sign_t;
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 size_t dap_sign_get_size(dap_sign_t * a_chain_sign);
 
 int dap_sign_verify (dap_sign_t * a_chain_sign, const void * a_data, const size_t a_data_size);
@@ -85,3 +89,6 @@ dap_enc_key_t *dap_sign_to_enc_key(dap_sign_t * a_chain_sign);
 const char * dap_sign_type_to_str(dap_sign_type_t a_chain_sign_type);
 dap_sign_type_t dap_sign_type_from_str(const char * a_type_str);
 
+#ifdef __cplusplus
+}
+#endif
diff --git a/libdap-crypto.pri b/libdap-crypto.pri
index 6ca16ee9ab396c05d066747891444b552df9f5a2..6761178a2da9cc92b3a3d312ead49a816759fb1c 100755
--- a/libdap-crypto.pri
+++ b/libdap-crypto.pri
@@ -21,9 +21,16 @@ HEADERS += $$PWD/include/dap_enc.h \
     $$PWD/include/dap_enc_picnic.h \
     $$PWD/include/dap_enc_bliss.h \
     $$PWD/include/dap_enc_tesla.h \
-    $$PWD/include/dap_crypto_common.h \
     $$PWD/include/dap_enc_base58.h \
     $$PWD/include/dap_enc_dilithium.h \
+    $$PWD/include/dap_crypto_common.h \
+    $$PWD/include/dap_cert.h \
+    $$PWD/include/dap_cert_file.h \
+    $$PWD/include/dap_pkey.h \
+    $$PWD/include/dap_sign.h \
+    $$PWD/include/dap_hash.h \
+    $$PWD/include/dap_hash_fusion.h \
+    $$PWD/include/dap_hash_keccak.h \
     $$PWD/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.h \
     $$PWD/src/XKCP/lib/high/Keccak/SP800-185/SP800-185.h \
     $$PWD/src/XKCP/lib/high/common/Phases.h
@@ -41,6 +48,13 @@ SOURCES += $$PWD/src/dap_enc.c \
     $$PWD/src/dap_enc_base58.c \
     $$PWD/src/dap_enc_dilithium.c \
     $$PWD/src/dap_enc_ca.c \
+    $$PWD/src/dap_cert.c \
+    $$PWD/src/dap_cert_file.c \
+    $$PWD/src/dap_pkey.c \
+    $$PWD/src/dap_sign.c \
+    $$PWD/src/dap_hash.c \
+    $$PWD/src/dap_hash_fusion.c \
+    $$PWD/src/dap_hash_keccak.c \
     $$PWD/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.c \
     $$PWD/src/XKCP/lib/high/Keccak/SP800-185/SP800-185.c \
     $$PWD/src/XKCP/lib/high/Keccak/SP800-185/SP800-185.inc
diff --git a/src/dap_cert.c b/src/dap_cert.c
index e82d29d395a34606da772837c5eeaaf3074d293a..14fd1a793076122ff516c3a37a73f287791c9520 100755
--- a/src/dap_cert.c
+++ b/src/dap_cert.c
@@ -389,7 +389,7 @@ dap_pkey_t * dap_cert_to_pkey(dap_cert_t * a_cert)
  * @param a_sign
  * @return
  */
-int dap_cert_compare_with_sign (dap_cert_t * a_cert,dap_sign_t * a_sign)
+int dap_cert_compare_with_sign (dap_cert_t * a_cert,const dap_sign_t * a_sign)
 {
     dap_return_val_if_fail(a_cert && a_cert->enc_key && a_sign, -1);
     if ( dap_sign_type_from_key_type( a_cert->enc_key->type ).type == a_sign->header.type.type ){
diff --git a/src/dap_cert_file.c b/src/dap_cert_file.c
index f41e05eac7242b450d9b78a9deb744114f1f1009..2958abaf6bd608e3231b415be74c364139d66542 100755
--- a/src/dap_cert_file.c
+++ b/src/dap_cert_file.c
@@ -179,11 +179,11 @@ lb_exit:
  * @param a_data_size
  * @return
  */
-dap_cert_t* dap_cert_mem_load(void * a_data, size_t a_data_size)
+dap_cert_t* dap_cert_mem_load(const void * a_data, size_t a_data_size)
 {
     dap_cert_t * l_ret = NULL;
     dap_cert_file_hdr_t l_hdr={0};
-    uint8_t * l_data = (uint8_t *) a_data;
+    const uint8_t * l_data = (const uint8_t *) a_data;
     uint32_t l_data_offset = 0;
     memcpy(&l_hdr,l_data, sizeof(l_hdr));
     l_data_offset += sizeof(l_hdr);
diff --git a/src/dap_enc_key.c b/src/dap_enc_key.c
index 1d9ab6e03c4a155042b306c9acea58bff9659627..332eb6b4da96a7db425ab733abcd67db33e5ac68 100755
--- a/src/dap_enc_key.c
+++ b/src/dap_enc_key.c
@@ -410,7 +410,7 @@ int dap_enc_key_deserealize_priv_key(dap_enc_key_t *a_key, uint8_t *a_buf, size_
  * @param a_buflen_out
  * @return 0 Ok, -1 error
  */
-int dap_enc_key_deserealize_pub_key(dap_enc_key_t *a_key, uint8_t *a_buf, size_t a_buflen)
+int dap_enc_key_deserealize_pub_key(dap_enc_key_t *a_key, const uint8_t *a_buf, size_t a_buflen)
 {
     if(!a_key || !a_buf)
         return -1;
@@ -490,13 +490,13 @@ dap_enc_key_serealize_t* dap_enc_key_serealize(dap_enc_key_t * key)
  * @param buf_size
  * @return allocates dap_enc_key_t*. Use dap_enc_key_delete for free memory
  */
-dap_enc_key_t* dap_enc_key_deserealize(void *buf, size_t buf_size)
+dap_enc_key_t* dap_enc_key_deserealize(const void *buf, size_t buf_size)
 {
     if(buf_size != sizeof (dap_enc_key_serealize_t)) {
         log_it(L_ERROR, "Key can't be deserealize. buf_size != sizeof (dap_enc_key_serealize_t)");
         return NULL;
     }
-    dap_enc_key_serealize_t *in_key = (dap_enc_key_serealize_t *)buf;
+    const dap_enc_key_serealize_t *in_key = (const dap_enc_key_serealize_t *)buf;
     dap_enc_key_t *result = dap_enc_key_new(in_key->type);
     result->last_used_timestamp = in_key->last_used_timestamp;
     result->priv_key_data_size = in_key->priv_key_data_size;