diff --git a/core/test/dap_config_test.c b/core/test/dap_config_test.c
index 38744b0ecd7e03c302d4834ee074b9b7b49d0785..96d3fc49ea67597fef4df3e784f45f052a31eeaa 100755
--- a/core/test/dap_config_test.c
+++ b/core/test/dap_config_test.c
@@ -119,7 +119,7 @@ void test_get_bool_default()
 void test_array_str()
 {
     uint16_t arraySize;
-    char ** result_arr = dap_config_get_array_str(config, "server_options", "str_arr", &arraySize);
+    const char **result_arr = dap_config_get_array_str(config, "server_options", "str_arr", &arraySize);
 
     dap_assert(result_arr != NULL, "Get array str from config");
     dap_assert(arraySize == STR_ARR_LEN, "Check array length");
@@ -131,7 +131,7 @@ void test_array_str()
 
 void test_array_int() {
     uint16_t arraySize;
-    char ** result_arr = dap_config_get_array_str(config, "server_options", "int_arr", &arraySize);
+    const char **result_arr = dap_config_get_array_str(config, "server_options", "int_arr", &arraySize);
 
     dap_assert(result_arr != NULL, "Get array int");
     dap_assert(arraySize == INT_ARR_LEN, "Check array int length");
diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt
index c97a8ec2919f74e29f2ecf17e25414a001795c3b..3f2bfa6ca0d5495c3ca7af51bf33fe4403e4884e 100755
--- a/crypto/CMakeLists.txt
+++ b/crypto/CMakeLists.txt
@@ -119,8 +119,6 @@ file( GLOB CRYPTO_SRCS
       src/sig_tesla/*.c
       src/sig_picnic/*.c
       src/sig_dilithium/*.c
-      src/sig_shipovnik/*.c
-      src/sig_shipovnik/streebog/*.c
       src/ringct20/*.c
       src/falcon/*.c
       ${SPHINCS_BASE_SRCS}
@@ -139,6 +137,17 @@ else()
     list (FILTER CRYPTO_SRCS EXCLUDE REGEX ".*ecdsa.c")
 endif()
 
+if (BUILD_WITH_SHIPOVNIK)
+    file (GLOB SHIPOVNIK_SRC
+        src/sig_shipovnik/*.c
+        src/sig_shipovnik/streebog/*.c
+    )
+    set (CRYPTO_SRCS ${CRYPTO_SRCS} ${SHIPOVNIK_SRC})
+    add_definitions("-DDAP_SHIPOVNIK")
+else()
+    list (FILTER CRYPTO_SRCS EXCLUDE REGEX ".*shipovnik.c")
+endif()
+
 get_filename_component(full_path_src ${CMAKE_CURRENT_SOURCE_DIR}/src/sig_shipovnik/streebog/gost3411-2012.c ABSOLUTE)
 list(REMOVE_ITEM CRYPTO_SRCS "${full_path_src}")
 
@@ -155,8 +164,6 @@ file( GLOB CRYPTO_HEADERS
       src/msrln/*.h
       src/newhope/*.h
       src/sig_bliss/*.h
-      src/sig_shipovnik/*.h
-      src/sig_shipovnik/streebog/*.h
       src/sig_tesla/*.h
       src/sig_picnic/*.h
       src/sig_dilithium/*.h
@@ -173,6 +180,16 @@ else()
     list (FILTER CRYPTO_HEADERS EXCLUDE REGEX ".*ecdsa.h")
 endif()
 
+if (BUILD_WITH_SHIPOVNIK)
+    file (GLOB SHIPOVNIK_HDR
+        src/sig_shipovnik/*.h
+        src/sig_shipovnik/streebog/*.h
+    )
+    set (CRYPTO_HEADERS ${CRYPTO_HEADERS} ${SHIPOVNIK_HDR})
+else()
+    list (FILTER CRYPTO_HEADERS EXCLUDE REGEX ".*shipovnik.h")
+endif()
+
 
 
 set_source_files_properties(src/sig_picnic/picnic_impl.c PROPERTIES COMPILE_FLAGS -Wno-stringop-overflow)
diff --git a/crypto/include/dap_cert.h b/crypto/include/dap_cert.h
index 5c3f82cb32e7ed070a2fb36d285e5d1dc18e650c..a2f7f0a7bc2005daff15a8a3b3b550cf0e443cf1 100755
--- a/crypto/include/dap_cert.h
+++ b/crypto/include/dap_cert.h
@@ -63,9 +63,7 @@ extern "C" {
 
 int dap_cert_init();
 
-DAP_STATIC_INLINE const char *dap_cert_get_str_recommended_sign(){
-    return "sig_dil\nsig_falcon\nsig_sphincs\nsig_shipovnik\n";
-}
+const char *dap_cert_get_str_recommended_sign();
 
 dap_cert_t *dap_cert_new(const char *a_name);
 int dap_cert_add(dap_cert_t *a_cert);
diff --git a/crypto/src/dap_cert.c b/crypto/src/dap_cert.c
index 64331a984df40cc65ed0aac5e179571782ec994f..9044414eea734c8d56c2a1514e1bacfa3199afe8 100755
--- a/crypto/src/dap_cert.c
+++ b/crypto/src/dap_cert.c
@@ -956,3 +956,11 @@ dap_enc_key_t *dap_cert_get_keys_from_certs(dap_cert_t **a_certs, size_t a_count
     DAP_DELETE(l_keys);
     return l_ret;
 }
+
+DAP_INLINE const char *dap_cert_get_str_recommended_sign(){
+    return "sig_dil\nsig_falcon\nsig_sphincs\n"
+#ifdef DAP_SHIPOVNIK
+    "sig_shipovnik\n"
+#endif
+    ;
+}
\ No newline at end of file
diff --git a/crypto/src/dap_enc_key.c b/crypto/src/dap_enc_key.c
index 8b8eb7f4b6fe2052828042e8e5d3bfd393d9d3c4..d07154bc2c65d14459fce6ec0fae588dc378691a 100755
--- a/crypto/src/dap_enc_key.c
+++ b/crypto/src/dap_enc_key.c
@@ -40,11 +40,13 @@
 #include "dap_enc_kyber.h"
 #include "dap_enc_sphincsplus.h"
 #include "dap_enc_multisign.h"
+#include "dap_enc_ringct20.h"
 #ifdef DAP_ECDSA
 #include "dap_enc_ecdsa.h"
 #endif
+#ifdef DAP_SHIPOVNIK
 #include "dap_enc_shipovnik.h"
-#include "dap_enc_ringct20.h"
+#endif
 #ifdef DAP_PQRL
 #include "dap_pqrl.h"
 #endif
@@ -409,6 +411,7 @@ dap_enc_key_callbacks_t s_callbacks[]={
 
     [DAP_ENC_KEY_TYPE_SIG_SHIPOVNIK]={
           .name =                             "SIG_SHIPOVNIK",
+#ifdef DAP_SHIPOVNIK
           .enc =                              NULL,
           .dec =                              NULL,
           .enc_na =                           NULL,
@@ -436,6 +439,7 @@ dap_enc_key_callbacks_t s_callbacks[]={
           .deser_priv_key_size =              dap_enc_sig_shipovnik_deser_key_size,
           .deser_pub_key_size =               dap_enc_sig_shipovnik_deser_pkey_size,
           .deser_sign_size =                  dap_enc_sig_shipovnik_deser_sign_size
+#endif
       },
 
 
diff --git a/crypto/src/dap_enc_shipovnik.c b/crypto/src/dap_enc_shipovnik.c
index ccd5230bbe304929e0cffe9998b59a7b91d06bc2..de117f9b75382e8df8b6acd3d1796c6758175b59 100644
--- a/crypto/src/dap_enc_shipovnik.c
+++ b/crypto/src/dap_enc_shipovnik.c
@@ -1,9 +1,7 @@
-#include <assert.h>
-#include <inttypes.h>
-#include <string.h>
 #include "dap_enc_shipovnik.h"
 #include "dap_common.h"
 #include "rand/dap_rand.h"
+#include "fips202.h"
 #include "sig_shipovnik/shipovnik_params.h"
 
 #define LOG_TAG "dap_enc_sig_shipovnik"
@@ -21,14 +19,21 @@ void dap_enc_sig_shipovnik_key_new(dap_enc_key_t *a_key) {
 }
 
 void dap_enc_sig_shipovnik_key_new_generate(dap_enc_key_t * key, UNUSED_ARG const void *kex_buf,
-        UNUSED_ARG size_t kex_size, const void * seed, size_t seed_size,
+        UNUSED_ARG size_t kex_size, const void *seed, size_t seed_size,
         UNUSED_ARG size_t key_size)
 {
-    key->priv_key_data_size =SHIPOVNIK_SECRETKEYBYTES;
+    DAP_NEW_Z_SIZE_RET(key->priv_key_data, void, SHIPOVNIK_SECRETKEYBYTES, NULL);
+    DAP_NEW_Z_SIZE_RET(key->pub_key_data, void, SHIPOVNIK_PUBLICKEYBYTES, key->priv_key_data);
+    key->priv_key_data_size = SHIPOVNIK_SECRETKEYBYTES;
     key->pub_key_data_size = SHIPOVNIK_PUBLICKEYBYTES;
-    key->priv_key_data = malloc(key->priv_key_data_size);
-    key->pub_key_data = malloc(key->pub_key_data_size);
-    shipovnik_generate_keys(key->priv_key_data,key->pub_key_data);
+    if (!seed || !seed_size) {
+        log_it(L_DEBUG, "Generate key with random seed");
+        shipovnik_generate_keys(key->priv_key_data, key->pub_key_data);
+    } else {
+        uint32_t l_seed_buf[N_shipovnik] = { 0 };
+        shake256((unsigned char *)l_seed_buf, sizeof(l_seed_buf), seed, seed_size);
+        shipovnik_generate_keys_with_seed(key->priv_key_data, key->pub_key_data, l_seed_buf);
+    }
 }
 
 int dap_enc_sig_shipovnik_get_sign(struct dap_enc_key* key, const void* msg, const size_t msg_size, void* signature, const size_t signature_size)
@@ -44,7 +49,7 @@ int dap_enc_sig_shipovnik_get_sign(struct dap_enc_key* key, const void* msg, con
     }
     size_t l_size = 0;
     shipovnik_sign(key->priv_key_data, msg, msg_size, signature, &l_size);
-    return signature_size ? 0 : ( log_it(L_ERROR, "Failed to sign message"), -1 );
+    return l_size ? 0 : ( log_it(L_ERROR, "Failed to sign message"), -1 );
 }
 
 int dap_enc_sig_shipovnik_verify_sign(struct dap_enc_key* key, const void* msg, const size_t msg_size, void* signature, const size_t signature_size)
diff --git a/crypto/src/dap_enc_sphincsplus.c b/crypto/src/dap_enc_sphincsplus.c
index 2c6a1d031217da34ba596c3e0f5fde941d8f6bd5..d62b94e5e25afb9973e357c266652b413b1242f8 100644
--- a/crypto/src/dap_enc_sphincsplus.c
+++ b/crypto/src/dap_enc_sphincsplus.c
@@ -89,9 +89,7 @@ int dap_enc_sig_sphincsplus_get_sign(dap_enc_key_t *a_key, const void *a_msg_in,
     DAP_NEW_Z_SIZE_RET_VAL(l_sign->sig_data, uint8_t, dap_enc_sig_sphincsplus_crypto_sign_bytes(), -3, NULL);
 
     l_sign->sig_params = l_skey->params;
-    int l_ret = sphincsplus_crypto_sign_signature(l_sign->sig_data, &l_sign->sig_len, (const unsigned char *)a_msg_in, a_msg_size, l_skey->data);
-    
-    return l_ret;
+    return sphincsplus_crypto_sign_signature(l_sign->sig_data, &l_sign->sig_len, (const unsigned char *)a_msg_in, a_msg_size, l_skey->data);
 }
 
 size_t dap_enc_sig_sphincsplus_get_sign_msg(dap_enc_key_t *a_key, const void *a_msg, const size_t a_msg_size,
diff --git a/crypto/src/dap_sign.c b/crypto/src/dap_sign.c
index ede92e8dc0c8d441808c96ae71424096d17d4f8a..e104ab530dce7dac4fddfe82c0bda5034171ea9a 100755
--- a/crypto/src/dap_sign.c
+++ b/crypto/src/dap_sign.c
@@ -83,7 +83,9 @@ dap_sign_type_t dap_sign_type_from_key_type( dap_enc_key_type_t a_key_type)
 #ifdef DAP_ECDSA
         case DAP_ENC_KEY_TYPE_SIG_ECDSA: l_sign_type.type = SIG_TYPE_ECDSA; break;
 #endif
+#ifdef DAP_SHIPOVNIK
         case DAP_ENC_KEY_TYPE_SIG_SHIPOVNIK: l_sign_type.type = SIG_TYPE_SHIPOVNIK; break;
+#endif
         case DAP_ENC_KEY_TYPE_SIG_MULTI_CHAINED: l_sign_type.type = SIG_TYPE_MULTI_CHAINED; break;
         default: l_sign_type.raw = 0;
     }
@@ -107,7 +109,9 @@ dap_enc_key_type_t  dap_sign_type_to_key_type(dap_sign_type_t  a_chain_sign_type
 #ifdef DAP_ECDSA
         case SIG_TYPE_ECDSA: return DAP_ENC_KEY_TYPE_SIG_ECDSA;
 #endif
+#ifdef DAP_SHIPOVNIK
         case SIG_TYPE_SHIPOVNIK: return DAP_ENC_KEY_TYPE_SIG_SHIPOVNIK;
+#endif
         case SIG_TYPE_MULTI_CHAINED: return DAP_ENC_KEY_TYPE_SIG_MULTI_CHAINED;
         default: return DAP_ENC_KEY_TYPE_INVALID;
     }
@@ -133,7 +137,9 @@ const char * dap_sign_type_to_str(dap_sign_type_t a_chain_sign_type)
 #ifdef DAP_ECDSA
         case SIG_TYPE_ECDSA: return "sig_ecdsa";
 #endif
+#ifdef DAP_SHIPOVNIK
         case SIG_TYPE_SHIPOVNIK: return "sig_shipovnik";
+#endif
         case SIG_TYPE_MULTI_COMBINED: return "sig_multi_combined";
         case SIG_TYPE_MULTI_CHAINED: return "sig_multi_chained";
         default: return "UNDEFINED";//DAP_ENC_KEY_TYPE_NULL;
@@ -166,8 +172,10 @@ dap_sign_type_t dap_sign_type_from_str(const char * a_type_str)
     } else if ( !dap_strcmp (a_type_str, "sig_ecdsa") ) {
          l_sign_type.type = SIG_TYPE_ECDSA;
 #endif
+#ifdef DAP_SHIPOVNIK
     } else if ( !dap_strcmp (a_type_str, "sig_shipovnik") ) {
          l_sign_type.type = SIG_TYPE_SHIPOVNIK;
+#endif
     } else if ( !dap_strcmp (a_type_str,"sig_multi_chained") ){
         l_sign_type.type = SIG_TYPE_MULTI_CHAINED;
     // } else if ( !dap_strcmp (a_type_str,"sig_multi_combined") ){
@@ -215,7 +223,9 @@ int dap_sign_create_output(dap_enc_key_t *a_key, const void * a_data, const size
 #ifdef DAP_ECDSA
         case DAP_ENC_KEY_TYPE_SIG_ECDSA:
 #endif
+#ifdef DAP_SHIPOVNIK
         case DAP_ENC_KEY_TYPE_SIG_SHIPOVNIK:
+#endif
         case DAP_ENC_KEY_TYPE_SIG_SPHINCSPLUS:
         case DAP_ENC_KEY_TYPE_SIG_MULTI_CHAINED:
             return a_key->sign_get(a_key, a_data, a_data_size, a_output, *a_output_size);
@@ -459,7 +469,9 @@ int dap_sign_verify(dap_sign_t *a_chain_sign, const void *a_data, const size_t a
 #ifdef DAP_ECDSA
         case DAP_ENC_KEY_TYPE_SIG_ECDSA:
 #endif
+#ifdef DAP_SHIPOVNIK
         case DAP_ENC_KEY_TYPE_SIG_SHIPOVNIK:
+#endif
         case DAP_ENC_KEY_TYPE_SIG_MULTI_CHAINED:
             l_ret = l_key->sign_verify(l_key, l_verify_data, l_verify_data_size, l_sign_data, l_sign_data_size);
             break;
@@ -590,5 +602,8 @@ DAP_INLINE const char *dap_sign_get_str_recommended_types(){
 #ifdef DAP_ECDSA
     "sig_ecdsa\n"
 #endif
-    "sig_sphincs\nsig_shipovnik\nsig_multi_chained\n";
+#ifdef DAP_SHIPOVNIK
+    "sig_shipovnik\n"
+#endif
+    "sig_sphincs\nsig_multi_chained\n";
 }
\ No newline at end of file
diff --git a/crypto/src/sig_shipovnik/genvector.c b/crypto/src/sig_shipovnik/genvector.c
index b73147faa1357608bbeb5a785c112b8afb89b71e..ccb4b898fa0d34e6e3b562c28ec65cc6c9f1e2bf 100644
--- a/crypto/src/sig_shipovnik/genvector.c
+++ b/crypto/src/sig_shipovnik/genvector.c
@@ -99,3 +99,14 @@ void gen_vector(uint16_t *s) {
   uint64_t buf[N_shipovnik];
   shuffle(entropy, s, buf, N_shipovnik);
 }
+
+void gen_vector_with_seed(uint16_t *s, uint32_t *seed) {
+
+  memset(s + W_shipovnik, 0, sizeof(uint16_t) * (N_shipovnik - W_shipovnik));
+  for (size_t i = 0; i < W_shipovnik; ++i) {
+    s[i] = 1;
+  }
+
+  uint64_t buf[N_shipovnik];
+  shuffle(seed, s, buf, N_shipovnik);
+}
diff --git a/crypto/src/sig_shipovnik/genvector.h b/crypto/src/sig_shipovnik/genvector.h
index 2177ad255e1ea639dca3149c69c0ba7bb7e57532..c2868a1f1d73df2bc85031cf74e53468a96b64b9 100644
--- a/crypto/src/sig_shipovnik/genvector.h
+++ b/crypto/src/sig_shipovnik/genvector.h
@@ -42,3 +42,10 @@ void shuffle(const uint32_t *p, uint16_t *pi, uint64_t *buf, size_t len);
  * @param[out] s buffer to be filled. Should have size at least 'N'.
  */
 void gen_vector(uint16_t *s);
+
+/**
+ * @brief Generate random binary vector.
+ * @param[in] seed seed array. Should have size at least 'N'.
+ * @param[out] s buffer to be filled. Should have size at least 'N'.
+ */
+void gen_vector_with_seed(uint16_t *s, uint32_t *seed);
diff --git a/crypto/src/sig_shipovnik/shipovnik.c b/crypto/src/sig_shipovnik/shipovnik.c
index b92a3a3ff78f10bceeee14492e4ea66e06e66568..befaf4310191fca496a64f68f99fa112b30c0240 100644
--- a/crypto/src/sig_shipovnik/shipovnik.c
+++ b/crypto/src/sig_shipovnik/shipovnik.c
@@ -48,6 +48,17 @@ void shipovnik_generate_keys(uint8_t *sk, uint8_t *pk) {
   syndrome(H_PRIME, sk, pk);
 }
 
+void shipovnik_generate_keys_with_seed(uint8_t *sk, uint8_t *pk, uint32_t *seed) {
+  ALLOC_ON_STACK(uint16_t, s, N_shipovnik);
+  gen_vector_with_seed(s, seed);
+  for (size_t i = 0; i < N_shipovnik; ++i) {
+    size_t j = i / 8;
+    sk[j] <<= 1;
+    sk[j] |= s[i] & 1;
+  }
+  syndrome(H_PRIME, sk, pk);
+}
+
 #define SIGMA_Y_SIZE (SIGMA_PACKED_BYTES + SHIPOVNIK_PUBLICKEYBYTES)
 
 void shipovnik_sign(const uint8_t *sk, const uint8_t *msg, size_t msg_len,
diff --git a/crypto/src/sig_shipovnik/shipovnik.h b/crypto/src/sig_shipovnik/shipovnik.h
index 6286b4ba1c8631c603e5ecbfdb686dee6c33dcf3..637c18c325de82703d668896d75342153481414e 100644
--- a/crypto/src/sig_shipovnik/shipovnik.h
+++ b/crypto/src/sig_shipovnik/shipovnik.h
@@ -40,6 +40,16 @@
  */
 void shipovnik_generate_keys(uint8_t *sk, uint8_t *pk);
 
+/**
+ * @brief Generates secret key and public key with prepared seed array.
+ * @param[in] s prepared seed array, of size N_shipovnik
+ * @param[out] sk Contiguous array to receive secret key, of size
+ *   `SHIPOVNIK_SECRETKEYBYTES`.
+ * @param[out] pk Contiguous array to receive public key, of size
+ *   `SHIPOVNIK_PUBLICKEYBYTES`.
+ */
+void shipovnik_generate_keys_with_seed(uint8_t *sk, uint8_t *pk, uint32_t *s);
+
 /**
  * @brief Generates signature for given message according to secret key.
  *
diff --git a/crypto/test/crypto/dap_enc_benchmark_test.c b/crypto/test/crypto/dap_enc_benchmark_test.c
index 651f31cee77f4deb26206d54dea58d25855babe7..814bfb99fc719a79faf8284281c8995a46a62998 100644
--- a/crypto/test/crypto/dap_enc_benchmark_test.c
+++ b/crypto/test/crypto/dap_enc_benchmark_test.c
@@ -5,38 +5,22 @@
 #include "rand/dap_rand.h"
 #define LOG_TAG "dap_crypto_benchmark_tests"
 
-//#define SIGNATURE_TYPE_COUNT 7
-#define SIGN_COUNT 5
 #define KEYS_TOTAL_COUNT 10
 
-dap_enc_key_type_t s_key_type_arr[] = {
-        DAP_ENC_KEY_TYPE_SIG_TESLA,
-        DAP_ENC_KEY_TYPE_SIG_BLISS,
-        DAP_ENC_KEY_TYPE_SIG_DILITHIUM,
-        // DAP_ENC_KEY_TYPE_SIG_PICNIC,
-        DAP_ENC_KEY_TYPE_SIG_FALCON,
-        DAP_ENC_KEY_TYPE_SIG_SPHINCSPLUS,
-#ifdef DAP_ECDSA
-        DAP_ENC_KEY_TYPE_SIG_ECDSA,
-#endif
-        DAP_ENC_KEY_TYPE_SIG_SHIPOVNIK };
-
 /*--------------------------TRANSFER TEST BLOCK--------------------------*/
-static int s_transfer_test(dap_enc_key_type_t a_key_type, int a_times, int *a_gen_time, int *a_alice_shared, int *a_bob_shared)
+static void s_transfer_test(dap_enc_key_type_t a_key_type, int a_times, int *a_gen_time, int *a_alice_shared, int *a_bob_shared)
 {
-    int l_ret = 0;
     dap_enc_key_t **l_alice_keys = NULL;
     dap_enc_key_t **l_bob_keys = NULL;
 
-    DAP_NEW_Z_COUNT_RET_VAL(l_alice_keys, dap_enc_key_t*, a_times, 1, NULL);
-    DAP_NEW_Z_COUNT_RET_VAL(l_bob_keys, dap_enc_key_t*, a_times, 1, l_alice_keys);
+    DAP_NEW_Z_COUNT_RET(l_alice_keys, dap_enc_key_t*, a_times, NULL);
+    DAP_NEW_Z_COUNT_RET(l_bob_keys, dap_enc_key_t*, a_times, l_alice_keys);
 
     int l_t1 = get_cur_time_msec();
 
     for (int i = 0; i < a_times; ++i) {
         l_alice_keys[i] = dap_enc_key_new_generate(a_key_type, NULL, 0, NULL, 0, 0);
         dap_assert_PIF(l_alice_keys[i], "Key generate");
-        l_ret |= !l_alice_keys[i];
     }
 
     int l_t2 = get_cur_time_msec();
@@ -47,7 +31,6 @@ static int s_transfer_test(dap_enc_key_type_t a_key_type, int a_times, int *a_ge
         l_bob_keys[i] = dap_enc_key_new(a_key_type);
         l_bob_keys[i]->pub_key_data_size = l_bob_keys[i]->gen_bob_shared_key(l_bob_keys[i], l_alice_keys[i]->pub_key_data, l_alice_keys[i]->pub_key_data_size, (void**)&l_bob_keys[i]->pub_key_data);
         dap_assert_PIF(l_bob_keys[i]->pub_key_data_size, "Bob shared key gen");
-        l_ret |= !l_bob_keys[i]->pub_key_data_size;
     }
     l_t2 = get_cur_time_msec();
     *a_bob_shared = l_t2 - l_t1;
@@ -62,22 +45,19 @@ static int s_transfer_test(dap_enc_key_type_t a_key_type, int a_times, int *a_ge
     for(int i = 0; i < a_times; ++i) {
         int l_cmp = memcmp(l_alice_keys[i]->shared_key, l_bob_keys[i]->shared_key, l_alice_keys[i]->shared_key_size);
         dap_assert_PIF(!l_cmp, "Session keys equals");
-        l_ret |= l_cmp;
         dap_enc_key_delete(l_alice_keys[i]);
         dap_enc_key_delete(l_bob_keys[i]);
     }
     DAP_DEL_MULTY(l_alice_keys, l_bob_keys);
-    return l_ret;
 }
 
-static int s_transfer_test_benchmark(const char *a_name, dap_enc_key_type_t a_key_type, int a_times) {
+static void s_transfer_test_benchmark(const char *a_name, dap_enc_key_type_t a_key_type, int a_times) {
     dap_print_module_name(a_name);
-    int l_ret = 0;
     int l_gen_time = 0;
     int l_alice_shared = 0;
     int l_bob_shared = 0;
 
-    l_ret |= s_transfer_test(a_key_type, a_times, &l_gen_time, &l_alice_shared, &l_bob_shared);
+    s_transfer_test(a_key_type, a_times, &l_gen_time, &l_alice_shared, &l_bob_shared);
 
     char l_msg[120] = {0};
     sprintf(l_msg, "Key gen %d times", a_times);
@@ -86,14 +66,12 @@ static int s_transfer_test_benchmark(const char *a_name, dap_enc_key_type_t a_ke
     benchmark_mgs_time(l_msg, l_bob_shared);
     sprintf(l_msg, "Alice shared key gen %d times", a_times);
     benchmark_mgs_time(l_msg, l_alice_shared);
-    return l_ret;
 }
 /*-----------------------------------------------------------------------*/
 
 /*------------------SIGNING AND VERIFICATION TEST BLOCK------------------*/
-static int s_sign_verify_test(dap_enc_key_type_t a_key_type, int a_times, int *a_sig_time, int *a_verify_time)
+static void s_sign_verify_test(dap_enc_key_type_t a_key_type, int a_times, int *a_sig_time, int *a_verify_time)
 {
-    int l_ret = 0;
     size_t seed_size = sizeof(uint8_t);
     uint8_t seed[sizeof(uint8_t)];
     randombytes(seed, seed_size);
@@ -105,26 +83,25 @@ static int s_sign_verify_test(dap_enc_key_type_t a_key_type, int a_times, int *a
     size_t max_signature_size = dap_sign_create_output_unserialized_calc_size(l_key_temp, 0);
     dap_enc_key_delete(l_key_temp);
 
-    DAP_NEW_Z_COUNT_RET_VAL(l_signs, uint8_t*, a_times, 1, NULL);
-    DAP_NEW_Z_COUNT_RET_VAL(l_source, uint8_t*, a_times, 1, l_signs);
-    DAP_NEW_Z_COUNT_RET_VAL(l_keys, dap_enc_key_t*, a_times, 1, l_source, l_signs);
+    DAP_NEW_Z_COUNT_RET(l_signs, uint8_t*, a_times, NULL);
+    DAP_NEW_Z_COUNT_RET(l_source, uint8_t*, a_times, l_signs);
+    DAP_NEW_Z_COUNT_RET(l_keys, dap_enc_key_t*, a_times, l_source, l_signs);
 
     int l_t1 = 0;
     *a_sig_time = 0;
-    int l_sig_type_count = sizeof(s_key_type_arr) / sizeof(*s_key_type_arr);
     for (int i = 0; i < a_times; ++i) {
         randombytes(seed, seed_size);
         // used only in multisign
         dap_enc_key_type_t l_key[KEYS_TOTAL_COUNT];
         for (int j = 0; j < KEYS_TOTAL_COUNT; j++) {
-            int l_step = random_uint32_t(l_sig_type_count);
-            l_key[j] = s_key_type_arr[l_step];
+            int l_step = random_uint32_t(c_keys_count);
+            l_key[j] = c_key_type_arr[l_step];
         }
         // ----------
         
-        DAP_NEW_Z_SIZE_RET_VAL(l_signs[i], uint8_t, max_signature_size, 1, NULL);
+        DAP_NEW_Z_SIZE_RET(l_signs[i], uint8_t, max_signature_size, NULL);
         l_source_size[i] = 1 + random_uint32_t(20);
-        DAP_NEW_Z_SIZE_RET_VAL(l_source[i], uint8_t, l_source_size[i], 1, NULL);
+        DAP_NEW_Z_SIZE_RET(l_source[i], uint8_t, l_source_size[i], NULL);
         randombytes(l_source[i], l_source_size[i]);
 
         l_t1 = get_cur_time_msec();
@@ -139,7 +116,6 @@ static int s_sign_verify_test(dap_enc_key_type_t a_key_type, int a_times, int *a
         }
         *a_sig_time += get_cur_time_msec() - l_t1;
         dap_assert_PIF(!l_signed, "Signing message");
-        l_ret |= l_signed;
     }
 
     l_t1 = get_cur_time_msec();
@@ -153,7 +129,6 @@ static int s_sign_verify_test(dap_enc_key_type_t a_key_type, int a_times, int *a
             l_verified = l_keys[i]->sign_verify(l_keys[i], &l_hash, sizeof(l_hash), l_signs[i], max_signature_size);
         }
         dap_assert_PIF(!l_verified, "Verifying signature");
-        l_ret |= l_verified;
     }
     *a_verify_time = get_cur_time_msec() - l_t1;
 //memory free
@@ -163,36 +138,33 @@ static int s_sign_verify_test(dap_enc_key_type_t a_key_type, int a_times, int *a
         DAP_DELETE(l_source[i]);
     }
     DAP_DEL_MULTY(l_signs, l_source, l_keys);
-    return l_ret;
 }
 
-static int s_sign_verify_ser_test(dap_enc_key_type_t a_key_type, int a_times, int *a_sig_time, int *a_verify_time)
+static void s_sign_verify_ser_test(dap_enc_key_type_t a_key_type, int a_times, int *a_sig_time, int *a_verify_time)
 {
-    int l_ret = 0;
     size_t seed_size = sizeof(uint8_t);
     uint8_t seed[seed_size];
     dap_sign_t **l_signs = NULL;
     uint8_t **l_source = NULL;
     size_t l_source_size[a_times];
 
-    DAP_NEW_Z_COUNT_RET_VAL(l_signs, dap_sign_t*, a_times, 1, NULL);
-    DAP_NEW_Z_COUNT_RET_VAL(l_source, uint8_t*, a_times, 1, l_signs);
+    DAP_NEW_Z_COUNT_RET(l_signs, dap_sign_t*, a_times, NULL);
+    DAP_NEW_Z_COUNT_RET(l_source, uint8_t*, a_times, l_signs);
 
     int l_t1 = 0;
     *a_sig_time = 0;
-    int l_sig_type_count = sizeof(s_key_type_arr) / sizeof(*s_key_type_arr);
     for (int i = 0; i < a_times; ++i) {
         randombytes(seed, seed_size);
 
         // used only in multisign
         dap_enc_key_type_t l_key[KEYS_TOTAL_COUNT];
         for (int j = 0; j < KEYS_TOTAL_COUNT; j++) {
-            int l_step = random_uint32_t(l_sig_type_count);
-            l_key[j] = s_key_type_arr[l_step];
+            int l_step = random_uint32_t(c_keys_count);
+            l_key[j] = c_key_type_arr[l_step];
         }
         // ----------
         l_source_size[i] = 1 + random_uint32_t(20);
-        DAP_NEW_Z_SIZE_RET_VAL(l_source[i], uint8_t, l_source_size[i], 1, NULL);
+        DAP_NEW_Z_SIZE_RET(l_source[i], uint8_t, l_source_size[i], NULL);
         randombytes(l_source[i], l_source_size[i]);
         
         l_t1 = get_cur_time_msec();
@@ -207,7 +179,6 @@ static int s_sign_verify_ser_test(dap_enc_key_type_t a_key_type, int a_times, in
         *a_sig_time += get_cur_time_msec() - l_t1;
         
         dap_assert_PIF(l_signs[i], "Signing message and serialize");
-        l_ret |= !l_signs[i];
         dap_enc_key_delete(key);
     }
 
@@ -222,7 +193,6 @@ static int s_sign_verify_ser_test(dap_enc_key_type_t a_key_type, int a_times, in
             l_verified = dap_sign_verify(l_signs[i], &l_hash, sizeof(l_hash));
         }
         dap_assert_PIF(!l_verified, "Deserialize and verifying signature");
-        l_ret |= l_verified;
     }
     *a_verify_time = get_cur_time_msec() - l_t1;
 
@@ -230,16 +200,14 @@ static int s_sign_verify_ser_test(dap_enc_key_type_t a_key_type, int a_times, in
         DAP_DEL_MULTY(l_signs[i], l_source[i]);
     }
     DAP_DEL_MULTY(l_signs, l_source);
-    return l_ret;
 }
 
-static int s_sign_verify_test_becnhmark(const char *a_name, dap_enc_key_type_t a_key_type, int a_times) {
+static void s_sign_verify_test_becnhmark(const char *a_name, dap_enc_key_type_t a_key_type, int a_times) {
     dap_print_module_name(a_name);
-    int l_ret = 0;
     int l_sig_time = 0;
     int l_verify_time = 0;
 
-    l_ret |= s_sign_verify_test(a_key_type, a_times, &l_sig_time, &l_verify_time);
+    s_sign_verify_test(a_key_type, a_times, &l_sig_time, &l_verify_time);
 
     char l_msg[120] = {0};
     sprintf(l_msg, "Signing message %d times", a_times);
@@ -247,50 +215,36 @@ static int s_sign_verify_test_becnhmark(const char *a_name, dap_enc_key_type_t a
     sprintf(l_msg, "Verifying message %d times", a_times);
     benchmark_mgs_time(l_msg, l_verify_time);
 
-    l_ret |= s_sign_verify_ser_test(a_key_type, a_times, &l_sig_time, &l_verify_time);
+    s_sign_verify_ser_test(a_key_type, a_times, &l_sig_time, &l_verify_time);
     sprintf(l_msg, "Signing message with serialization %d times", a_times);
     benchmark_mgs_time(l_msg, l_sig_time);
     sprintf(l_msg, "Verifying message with serialization %d times", a_times);
     benchmark_mgs_time(l_msg, l_verify_time);
-    return l_ret;
 }
 /*-----------------------------------------------------------------------*/
 
-static int s_transfer_tests_run(int a_times)
+static void s_transfer_tests_run(int a_times)
 {
-    int l_ret = 0;
     dap_init_test_case();
-    l_ret |= s_transfer_test_benchmark("NEWHOPE", DAP_ENC_KEY_TYPE_RLWE_NEWHOPE_CPA_KEM, a_times);
-    l_ret |= s_transfer_test_benchmark("KYBER512", DAP_ENC_KEY_TYPE_KEM_KYBER512, a_times);
-    l_ret |= s_transfer_test_benchmark("MSRLN", DAP_ENC_KEY_TYPE_MSRLN, a_times);
+    s_transfer_test_benchmark("NEWHOPE", DAP_ENC_KEY_TYPE_RLWE_NEWHOPE_CPA_KEM, a_times);
+    s_transfer_test_benchmark("KYBER512", DAP_ENC_KEY_TYPE_KEM_KYBER512, a_times);
+    s_transfer_test_benchmark("MSRLN", DAP_ENC_KEY_TYPE_MSRLN, a_times);
     dap_cleanup_test_case();
-    return l_ret;
 }
 
-static int s_sign_verify_tests_run(int a_times)
+static void s_sign_verify_tests_run(int a_times)
 {
-    int l_ret = 0;
     dap_init_test_case();
-    // s_sign_verify_test_becnhmark("PICNIC", DAP_ENC_KEY_TYPE_SIG_PICNIC, a_times);
-    l_ret |= s_sign_verify_test_becnhmark("TESLA", DAP_ENC_KEY_TYPE_SIG_TESLA, a_times);
-    l_ret |= s_sign_verify_test_becnhmark("BLISS", DAP_ENC_KEY_TYPE_SIG_BLISS, a_times);
-    l_ret |= s_sign_verify_test_becnhmark("DILITHIUM", DAP_ENC_KEY_TYPE_SIG_DILITHIUM, a_times);
-    l_ret |= s_sign_verify_test_becnhmark("FALCON", DAP_ENC_KEY_TYPE_SIG_FALCON, a_times);
-    l_ret |= s_sign_verify_test_becnhmark("SPHINCSPLUS", DAP_ENC_KEY_TYPE_SIG_SPHINCSPLUS, a_times);
-#ifdef DAP_ECDSA
-    l_ret |= s_sign_verify_test_becnhmark("ECDSA", DAP_ENC_KEY_TYPE_SIG_ECDSA, a_times);
-#endif
-    l_ret |= s_sign_verify_test_becnhmark("SHIPOVNIK", DAP_ENC_KEY_TYPE_SIG_SHIPOVNIK, a_times);
-    l_ret |= s_sign_verify_test_becnhmark("MULTISIGN", DAP_ENC_KEY_TYPE_SIG_MULTI_CHAINED, a_times);
+    for (size_t i = 0; i < c_keys_count; ++i) {
+        s_sign_verify_test_becnhmark(s_key_type_to_str(c_key_type_arr[i]), c_key_type_arr[i], a_times);
+    }
+    s_sign_verify_test_becnhmark("MULTISIGN", DAP_ENC_KEY_TYPE_SIG_MULTI_CHAINED, a_times);
     dap_cleanup_test_case();
-    return l_ret;
 }
 
-int dap_enc_benchmark_tests_run(int a_times)
+void dap_enc_benchmark_tests_run(int a_times)
 {
-    int l_ret = 0;
-    l_ret |= s_transfer_tests_run(a_times);
-    l_ret |= s_sign_verify_tests_run(a_times);
-    return l_ret;
+    s_transfer_tests_run(a_times);
+    s_sign_verify_tests_run(a_times);
 }
 
diff --git a/crypto/test/crypto/dap_enc_benchmark_test.h b/crypto/test/crypto/dap_enc_benchmark_test.h
index 929d8e62c5a1d7464e72b0dcc9dccef83d152e46..3af77069f0f3f5f9c7531f5d1db90eda8320a025 100644
--- a/crypto/test/crypto/dap_enc_benchmark_test.h
+++ b/crypto/test/crypto/dap_enc_benchmark_test.h
@@ -1,3 +1,3 @@
 #pragma once
 
-int dap_enc_benchmark_tests_run(int a_times);
\ No newline at end of file
+void dap_enc_benchmark_tests_run(int a_times);
\ No newline at end of file
diff --git a/crypto/test/crypto/dap_enc_multithread_test.c b/crypto/test/crypto/dap_enc_multithread_test.c
index f85bd6756ce7f9fef14c003448828e2e92ac277a..4f004882d6cc32f4f48421240be8dba1b6cd059f 100644
--- a/crypto/test/crypto/dap_enc_multithread_test.c
+++ b/crypto/test/crypto/dap_enc_multithread_test.c
@@ -127,14 +127,17 @@ int dap_enc_multithread_tests_run(int a_times)
     s_test_multithread("Falcon", s_test_thread_falcon, a_times);
     dap_pass_msg("Falcon multithread tests");
 
-    s_test_multithread("ECDSA", s_test_thread_ecdsa, a_times);
-    dap_pass_msg("ECDSA multithread tests");
-
     s_test_multithread("Sphincs plus", s_test_thread_sphincs, a_times);
     dap_pass_msg("Sphincs plus multithread tests");
 
+#ifdef DAP_ECDSA
+    s_test_multithread("ECDSA", s_test_thread_ecdsa, a_times);
+    dap_pass_msg("ECDSA multithread tests");
+#endif
+#ifdef DAP_SHIPOVNIK
     s_test_multithread("Shipovnik", s_test_thread_shipovnik, a_times);
     dap_pass_msg("Shipovnik plus multithread tests");
+#endif
     dap_cleanup_test_case();
     return 0;
 }
diff --git a/crypto/test/crypto/dap_enc_test.c b/crypto/test/crypto/dap_enc_test.c
index d38bf5fd0cea58359ca1571935de8b64fbd3b6ef..f4b734b3408c9048e98e2872b9d92dc4dee4ee07 100755
--- a/crypto/test/crypto/dap_enc_test.c
+++ b/crypto/test/crypto/dap_enc_test.c
@@ -7,6 +7,23 @@
 #include "dap_enc.h"
 
 #define LOG_TAG "dap_crypto_enc_tests"
+#define DAP_CHAIN_ATOM_MAX_SIZE (256 * 1024) // 256 KB
+
+const dap_enc_key_type_t c_key_type_arr[] = {
+        DAP_ENC_KEY_TYPE_SIG_TESLA,
+        DAP_ENC_KEY_TYPE_SIG_BLISS,
+        DAP_ENC_KEY_TYPE_SIG_DILITHIUM,
+        // DAP_ENC_KEY_TYPE_SIG_PICNIC,
+        DAP_ENC_KEY_TYPE_SIG_FALCON,
+        DAP_ENC_KEY_TYPE_SIG_SPHINCSPLUS,
+#ifdef DAP_ECDSA
+        DAP_ENC_KEY_TYPE_SIG_ECDSA,
+#endif
+#ifdef DAP_SHIPOVNIK
+        DAP_ENC_KEY_TYPE_SIG_SHIPOVNIK
+#endif
+        };
+const size_t c_keys_count = sizeof(c_key_type_arr) / sizeof(dap_enc_key_type_t);
 
 int get_cur_time_msec();
 
@@ -218,6 +235,98 @@ void* _read_key_from_file(const char* file_name, size_t key_size)
     return resut_key;
 }
 
+static void test_key_generate_by_seed(dap_enc_key_type_t a_key_type)
+{
+    const size_t seed_size = 1 + random_uint32_t( 1000);
+    uint8_t seed[seed_size];
+    randombytes(seed, seed_size);
+
+    size_t
+        l_priv_key_data_size_1 = 0,
+        l_priv_key_data_size_2 = 0,
+        l_priv_key_data_size_3 = 0,
+        l_priv_key_data_size_4 = 0,
+        l_priv_key_data_size_5 = 0,
+        l_pub_key_data_size_1 = 0,
+        l_pub_key_data_size_2 = 0,
+        l_pub_key_data_size_3 = 0,
+        l_pub_key_data_size_4 = 0,
+        l_pub_key_data_size_5 = 0;
+
+    dap_enc_key_t* l_key_1 = dap_enc_key_new_generate(a_key_type, NULL, 0, seed, seed_size, 0);
+    dap_enc_key_t* l_key_2 = dap_enc_key_new_generate(a_key_type, NULL, 0, seed, seed_size, 0);
+    dap_enc_key_t* l_key_3 = dap_enc_key_new_generate(a_key_type, NULL, 0, NULL, seed_size, 0);
+    dap_enc_key_t* l_key_4 = dap_enc_key_new_generate(a_key_type, NULL, 0, seed, 0, 0);
+    dap_enc_key_t* l_key_5 = dap_enc_key_new_generate(a_key_type, NULL, 0, NULL, 0, 0);
+
+
+    uint8_t *l_priv_key_data_1 = dap_enc_key_serialize_priv_key(l_key_1, &l_priv_key_data_size_1);
+    uint8_t *l_priv_key_data_2 = dap_enc_key_serialize_priv_key(l_key_2, &l_priv_key_data_size_2);
+    uint8_t *l_priv_key_data_3 = dap_enc_key_serialize_priv_key(l_key_3, &l_priv_key_data_size_3);
+    uint8_t *l_priv_key_data_4 = dap_enc_key_serialize_priv_key(l_key_4, &l_priv_key_data_size_4);
+    uint8_t *l_priv_key_data_5 = dap_enc_key_serialize_priv_key(l_key_5, &l_priv_key_data_size_5);
+
+    uint8_t *l_pub_key_data_1 = dap_enc_key_serialize_pub_key(l_key_1, &l_pub_key_data_size_1);
+    uint8_t *l_pub_key_data_2 = dap_enc_key_serialize_pub_key(l_key_2, &l_pub_key_data_size_2);
+    uint8_t *l_pub_key_data_3 = dap_enc_key_serialize_pub_key(l_key_3, &l_pub_key_data_size_3);
+    uint8_t *l_pub_key_data_4 = dap_enc_key_serialize_pub_key(l_key_4, &l_pub_key_data_size_4);
+    uint8_t *l_pub_key_data_5 = dap_enc_key_serialize_pub_key(l_key_5, &l_pub_key_data_size_5);
+
+    dap_assert_PIF(l_priv_key_data_size_1 && l_pub_key_data_size_1 &&
+                    l_priv_key_data_size_2 && l_pub_key_data_size_2 &&
+                    l_priv_key_data_size_3 && l_pub_key_data_size_3 &&
+                    l_priv_key_data_size_4 && l_pub_key_data_size_4 &&
+                    l_priv_key_data_size_5 && l_pub_key_data_size_5 &&
+
+                    l_priv_key_data_1 && l_pub_key_data_1 &&
+                    l_priv_key_data_2 && l_pub_key_data_2 &&
+                    l_priv_key_data_3 && l_pub_key_data_3 &&
+                    l_priv_key_data_4 && l_pub_key_data_4 &&
+                    l_priv_key_data_5 && l_pub_key_data_5,
+                    "Priv and pub data serialisation");
+
+    dap_assert_PIF(l_priv_key_data_size_1 == l_priv_key_data_size_2, "Equal priv_key_data_size");
+    dap_assert_PIF(l_priv_key_data_size_1 == l_priv_key_data_size_3, "Equal priv_key_data_size");
+    dap_assert_PIF(l_priv_key_data_size_1 == l_priv_key_data_size_4, "Equal priv_key_data_size");
+    dap_assert_PIF(l_priv_key_data_size_1 == l_priv_key_data_size_5, "Equal priv_key_data_size");
+
+    dap_assert_PIF(l_pub_key_data_size_1 == l_pub_key_data_size_2, "Equal pub_key_data_size");
+    dap_assert_PIF(l_pub_key_data_size_1 == l_pub_key_data_size_3, "Equal pub_key_data_size");
+    dap_assert_PIF(l_pub_key_data_size_1 == l_pub_key_data_size_4, "Equal pub_key_data_size");
+    dap_assert_PIF(l_pub_key_data_size_1 == l_pub_key_data_size_5, "Equal pub_key_data_size");
+
+    dap_assert_PIF(!memcmp(l_priv_key_data_1, l_priv_key_data_2, l_priv_key_data_size_1), "Equal priv_key_data with same seed");
+    dap_assert_PIF(memcmp(l_priv_key_data_1, l_priv_key_data_3, l_priv_key_data_size_1), "Different priv_key_data with not same seed");
+    dap_assert_PIF(memcmp(l_priv_key_data_1, l_priv_key_data_4, l_priv_key_data_size_1), "Different priv_key_data with not same seed");
+    dap_assert_PIF(memcmp(l_priv_key_data_1, l_priv_key_data_5, l_priv_key_data_size_1), "Different priv_key_data with not same seed");
+
+    dap_assert_PIF(memcmp(l_priv_key_data_3, l_priv_key_data_4, l_priv_key_data_size_1), "Different priv_key_data without seed");
+    dap_assert_PIF(memcmp(l_priv_key_data_3, l_priv_key_data_5, l_priv_key_data_size_1), "Different priv_key_data without seed");
+    dap_assert_PIF(memcmp(l_priv_key_data_4, l_priv_key_data_5, l_priv_key_data_size_1), "Different priv_key_data without seed");
+
+    dap_assert_PIF(!memcmp(l_pub_key_data_1, l_pub_key_data_2, l_pub_key_data_size_1), "Equal pub_key_data with same seed");
+    dap_assert_PIF(memcmp(l_pub_key_data_1, l_pub_key_data_3, l_pub_key_data_size_1), "Different pub_key_data with not same seed");
+    dap_assert_PIF(memcmp(l_pub_key_data_1, l_pub_key_data_4, l_pub_key_data_size_1), "Different pub_key_data with not same seed");
+    dap_assert_PIF(memcmp(l_pub_key_data_1, l_pub_key_data_5, l_pub_key_data_size_1), "Different pub_key_data with not same seed");
+
+    dap_assert_PIF(memcmp(l_pub_key_data_3, l_pub_key_data_4, l_pub_key_data_size_1), "Different pub_key_data without seed");
+    dap_assert_PIF(memcmp(l_pub_key_data_3, l_pub_key_data_5, l_pub_key_data_size_1), "Different pub_key_data without seed");
+    dap_assert_PIF(memcmp(l_pub_key_data_4, l_pub_key_data_5, l_pub_key_data_size_1), "Different pub_key_data without seed");
+
+    dap_enc_key_delete(l_key_1);
+    dap_enc_key_delete(l_key_2);
+    dap_enc_key_delete(l_key_3);
+    dap_enc_key_delete(l_key_4);
+    dap_enc_key_delete(l_key_5);
+
+    DAP_DEL_MULTY(  l_priv_key_data_1, l_pub_key_data_1,
+                    l_priv_key_data_2, l_pub_key_data_2,
+                    l_priv_key_data_3, l_pub_key_data_3,
+                    l_priv_key_data_4, l_pub_key_data_4,
+                    l_priv_key_data_5, l_pub_key_data_5);
+    dap_assert(true, s_key_type_to_str(a_key_type));
+}
+
 /**
  * @key_type may be DAP_ENC_KEY_TYPE_IAES, DAP_ENC_KEY_TYPE_OAES
  */
@@ -375,6 +484,7 @@ static void test_serialize_deserialize_pub_priv(dap_enc_key_type_t key_type)
     DAP_DELETE(l_sign_tmp);
 
     dap_assert_PIF(sig_buf, "Check serialize->deserialize signature");
+    dap_assert(sig_buf_len < DAP_CHAIN_ATOM_MAX_SIZE, "Check signature size");  // if fail new sign, recheck define in cellframe-sdk
 
     // decode by key2
     switch (key_type) {
@@ -408,46 +518,29 @@ void dap_enc_tests_run() {
     test_encode_decode_raw(500);
     test_encode_decode_raw_b64(500);
     test_encode_decode_raw_b64_url_safe(500);
-    dap_print_module_name("dap_enc serialize->deserialize BLISS");
-    test_serialize_deserialize(DAP_ENC_KEY_TYPE_SIG_BLISS, false);
-    dap_print_module_name("dap_enc serialize->deserialize PICNIC");
-    test_serialize_deserialize(DAP_ENC_KEY_TYPE_SIG_PICNIC, false);
-    dap_print_module_name("dap_enc serialize->deserialize TESLA");
-    test_serialize_deserialize(DAP_ENC_KEY_TYPE_SIG_TESLA, false);
-    dap_print_module_name("dap_enc serialize->deserialize DILITHIUM");
-    test_serialize_deserialize(DAP_ENC_KEY_TYPE_SIG_DILITHIUM, false);
-    dap_print_module_name("dap_enc serialize->deserialize FALCON");
-    test_serialize_deserialize(DAP_ENC_KEY_TYPE_SIG_FALCON, false);
-    dap_print_module_name("dap_enc serialize->deserialize SPHINCSPLUS");
-    test_serialize_deserialize(DAP_ENC_KEY_TYPE_SIG_SPHINCSPLUS, false);
-#ifdef DAP_ECDSA
-    dap_print_module_name("dap_enc serialize->deserialize ECDSA");
-    test_serialize_deserialize(DAP_ENC_KEY_TYPE_SIG_ECDSA, false);
-#endif
+
+    dap_print_module_name("key generate by seed");
+    for (size_t i = 0; i < c_keys_count; ++i) {
+        test_key_generate_by_seed(c_key_type_arr[i]);
+    }
+
+    for (size_t i = 0; i < c_keys_count; ++i) {
+        char l_module_name[128] = { 0 };
+        snprintf(l_module_name, sizeof(l_module_name) - 1, "dap_enc serialize->deserialize %s", s_key_type_to_str(c_key_type_arr[i]));
+        dap_print_module_name(l_module_name);
+        test_serialize_deserialize(c_key_type_arr[i], false);
+    }
+
     dap_print_module_name("dap_enc serialize->deserialize IAES");
     test_serialize_deserialize(DAP_ENC_KEY_TYPE_IAES, true);
-    dap_print_module_name("dap_enc serialize->deserialize SHIPOVNIK");
-    test_serialize_deserialize(DAP_ENC_KEY_TYPE_SIG_SHIPOVNIK, false);
     dap_print_module_name("dap_enc serialize->deserialize OAES");
     test_serialize_deserialize(DAP_ENC_KEY_TYPE_OAES, true);
 
-    dap_print_module_name("dap_enc_sig serialize->deserialize BLISS");
-    test_serialize_deserialize_pub_priv(DAP_ENC_KEY_TYPE_SIG_BLISS);
-    dap_print_module_name("dap_enc_sig serialize->deserialize PICNIC");
-    test_serialize_deserialize_pub_priv(DAP_ENC_KEY_TYPE_SIG_PICNIC);
-    dap_print_module_name("dap_enc_sig serialize->deserialize TESLA");
-    test_serialize_deserialize_pub_priv(DAP_ENC_KEY_TYPE_SIG_TESLA);
-    dap_print_module_name("dap_enc_sig serialize->deserialize DILITHIUM");
-    test_serialize_deserialize_pub_priv(DAP_ENC_KEY_TYPE_SIG_DILITHIUM);
-    dap_print_module_name("dap_enc_sig serialize->deserialize FALCON");
-    test_serialize_deserialize_pub_priv(DAP_ENC_KEY_TYPE_SIG_FALCON);
-    dap_print_module_name("dap_enc_sig serialize->deserialize SPHINCSPLUS");
-    test_serialize_deserialize_pub_priv(DAP_ENC_KEY_TYPE_SIG_SPHINCSPLUS);
-#ifdef DAP_ECDSA
-    dap_print_module_name("dap_enc_sig serialize->deserialize ECDSA");
-    test_serialize_deserialize_pub_priv(DAP_ENC_KEY_TYPE_SIG_ECDSA);
-#endif
-    dap_print_module_name("dap_enc_sig serialize->deserialize SHIPOVNIK");
-    test_serialize_deserialize_pub_priv(DAP_ENC_KEY_TYPE_SIG_SHIPOVNIK);
+    for (size_t i = 0; i < c_keys_count; ++i) {
+        char l_module_name[128] = { 0 };
+        snprintf(l_module_name, sizeof(l_module_name) - 1, "dap_enc_sig serialize->deserialize %s", s_key_type_to_str(c_key_type_arr[i]));
+        dap_print_module_name(l_module_name);
+        test_serialize_deserialize_pub_priv(c_key_type_arr[i]);
+    }
     dap_cleanup_test_case();
 }
\ No newline at end of file
diff --git a/crypto/test/crypto/dap_enc_test.h b/crypto/test/crypto/dap_enc_test.h
index 23f9f5f6c114206a64ffd000b96dfcfaa7897773..6dfa02529fda6655e7c108cbabea2e7f12320527 100755
--- a/crypto/test/crypto/dap_enc_test.h
+++ b/crypto/test/crypto/dap_enc_test.h
@@ -1,9 +1,33 @@
 #pragma once
 #include "dap_enc_key.h"
+
+extern const dap_enc_key_type_t c_key_type_arr[];
+extern const size_t c_keys_count;
+
+DAP_STATIC_INLINE const char *s_key_type_to_str(dap_enc_key_type_t a_signe_key_type)
+{
+    switch (a_signe_key_type) {
+        case DAP_ENC_KEY_TYPE_SIG_TESLA: return "TESLA";
+        case DAP_ENC_KEY_TYPE_SIG_BLISS: return "BLISS";
+        case DAP_ENC_KEY_TYPE_SIG_DILITHIUM: return "DILITHIUM";
+        case DAP_ENC_KEY_TYPE_SIG_PICNIC: return "PICNIC";
+        case DAP_ENC_KEY_TYPE_SIG_FALCON: return "FALCON";
+        case DAP_ENC_KEY_TYPE_SIG_SPHINCSPLUS: return "SPHINCSPLUS";
+#ifdef DAP_ECDSA
+        case DAP_ENC_KEY_TYPE_SIG_ECDSA: return "ECDSA";
+#endif
+#ifdef DAP_SHIPOVNIK
+        case DAP_ENC_KEY_TYPE_SIG_SHIPOVNIK: return "SHIPOVNIK";
+#endif
+        default: return "UNDEFINED";//DAP_ENC_KEY_TYPE_NULL;
+    }
+
+}
+
 void test_encypt_decrypt(int count_steps, const dap_enc_key_type_t key_type, const int cipher_key_size);
 void test_encypt_decrypt_fast(int count_steps, const dap_enc_key_type_t key_type, const int cipher_key_size);
 
 void dap_enc_tests_run(void);
-int dap_enc_benchmark_tests_run(int a_times);
+void dap_enc_benchmark_tests_run(int a_times);
 void dap_init_test_case();
 void dap_cleanup_test_case();
\ No newline at end of file
diff --git a/global-db/dap_global_db_cluster.c b/global-db/dap_global_db_cluster.c
index 508c7da86aedc66e805c3ba357f6203cebb9204d..51c17b1ba080f8e2c8612eaf540eb825254e01c7 100644
--- a/global-db/dap_global_db_cluster.c
+++ b/global-db/dap_global_db_cluster.c
@@ -148,7 +148,8 @@ dap_global_db_cluster_t *dap_global_db_cluster_add(dap_global_db_instance_t *a_d
     DL_APPEND(a_dbi->clusters, l_cluster);
     if (dap_strcmp(DAP_STREAM_CLUSTER_LOCAL, a_mnemonim))
         dap_proc_thread_timer_add(NULL, s_gdb_cluster_sync_timer_callback, l_cluster, 1000);
-    log_it(L_INFO, "Successfully added GlobalDB cluster ID %s for group mask %s", dap_guuid_to_hex_str(a_guuid), a_group_mask);
+    log_it(L_INFO, "Successfully added GlobalDB cluster ID %s for group mask %s, TTL %s",
+                    dap_guuid_to_hex_str(a_guuid), a_group_mask, l_cluster->ttl ? dap_itoa(l_cluster->ttl) : "unlimited");
     return l_cluster;
 }
 
diff --git a/io/dap_context.c b/io/dap_context.c
index c2ac6741799125cab63a5fede46db714aae00600..db352198212efec227f9495da4de81fc89891c2a 100644
--- a/io/dap_context.c
+++ b/io/dap_context.c
@@ -349,6 +349,7 @@ static void *s_context_thread(void *a_arg)
     pthread_cond_destroy(&l_context->started_cond);
     pthread_mutex_destroy(&l_context->started_mutex);
     DAP_DELETE(l_context);
+    DAP_DELETE(l_msg);
 
     return NULL;
 }
diff --git a/io/dap_events_socket.c b/io/dap_events_socket.c
index 7598e9b4f5a81e26b340fb4e772251131603021e..1bb6c32a5d9091adf481133af8a0641830c5cb7b 100644
--- a/io/dap_events_socket.c
+++ b/io/dap_events_socket.c
@@ -1309,14 +1309,20 @@ void dap_events_socket_set_readable_unsafe_ex(dap_events_socket_t *a_es, bool a_
 
         case DESCRIPTOR_TYPE_SOCKET_LISTENING:
         case DESCRIPTOR_TYPE_SOCKET_LOCAL_LISTENING:
-            if ( (a_es->socket2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET )
+            if ( (a_es->socket2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET ) {
                 log_it(L_ERROR, "Failed to create socket for accept()'ing, errno %d", WSAGetLastError());
-            else {
-                l_err = pfnAcceptEx( a_es->socket, a_es->socket2, (LPVOID)(a_es->buf_in), 0,
-                                     sizeof(SOCKADDR_STORAGE) + 16, sizeof(SOCKADDR_STORAGE) + 16, 
-                                     &bytes, (OVERLAPPED*)ol ) ? ERROR_SUCCESS : WSAGetLastError();
-                func = "AcceptEx";
+                break;
+            }
+            u_long l_option = 1;
+            if ( setsockopt(a_es->socket2, SOL_SOCKET, SO_REUSEADDR, (const char*)&l_option, sizeof(int)) < 0 ) {
+                _set_errno( WSAGetLastError() );
+                log_it(L_ERROR, "setsockopt(SO_REUSEADDR) on socket %d failed, error %d: \"%s\"",
+                                a_es->socket2, errno, dap_strerror(errno));
             }
+            l_err = pfnAcceptEx( a_es->socket, a_es->socket2, (LPVOID)(a_es->buf_in), 0,
+                                 sizeof(SOCKADDR_STORAGE) + 16, sizeof(SOCKADDR_STORAGE) + 16, 
+                                 &bytes, (OVERLAPPED*)ol ) ? ERROR_SUCCESS : WSAGetLastError();
+            func = "AcceptEx";
             break;
 
         case DESCRIPTOR_TYPE_FILE:
diff --git a/io/dap_proc_thread.c b/io/dap_proc_thread.c
index e8fab8317f409e2740f0f2200ae6a38584260ef1..26d5041323e3cec43b915944d526d13a53214717 100644
--- a/io/dap_proc_thread.c
+++ b/io/dap_proc_thread.c
@@ -37,9 +37,31 @@ static dap_proc_thread_t *s_threads = NULL;
 static int s_context_callback_started(dap_context_t *a_context, void *a_arg);
 static int s_context_callback_stopped(dap_context_t *a_context, void *a_arg);
 
+/**
+ * @brief add and run context to thread
+ * @param a_thread alocated thread memory
+ * @param a_cpu_id cpu id to thread assign
+ * @return result of dap_context_run (0 all OK)
+ */
+
+int dap_proc_thread_create(dap_proc_thread_t *a_thread, int a_cpu_id)
+{
+    dap_return_val_if_pass(!a_thread || a_thread->context, -1);
+
+    a_thread->context = dap_context_new(DAP_CONTEXT_TYPE_PROC_THREAD);
+    a_thread->context->_inheritor = a_thread;
+    int l_ret = dap_context_run(a_thread->context, a_cpu_id, DAP_CONTEXT_POLICY_TIMESHARING,
+                                DAP_CONTEXT_PRIORITY_NORMAL, DAP_CONTEXT_FLAG_WAIT_FOR_STARTED,
+                                s_context_callback_started, s_context_callback_stopped, a_thread);
+    if (l_ret) {
+        log_it(L_CRITICAL, "Create thread failed with code %d", l_ret);
+    }
+    return l_ret;
+}
+
 /**
  * @brief dap_proc_thread_init
- * @param a_cpu_count 0 means autodetect
+ * @param a_threads_count 0 means autodetect
  * @return
  */
 
@@ -50,19 +72,11 @@ int dap_proc_thread_init(uint32_t a_threads_count)
         return -1;
     }
     s_threads = DAP_NEW_Z_SIZE(dap_proc_thread_t, sizeof(dap_proc_thread_t) * s_threads_count);
-    for (uint32_t i = 0; i < s_threads_count; i++) {
-        dap_proc_thread_t *l_thread = s_threads + i;
-        l_thread->context = dap_context_new(DAP_CONTEXT_TYPE_PROC_THREAD);
-        l_thread->context->_inheritor = l_thread;
-        int l_ret = dap_context_run(l_thread->context, i, DAP_CONTEXT_POLICY_TIMESHARING,
-                                    DAP_CONTEXT_PRIORITY_NORMAL, DAP_CONTEXT_FLAG_WAIT_FOR_STARTED,
-                                    s_context_callback_started, s_context_callback_stopped, l_thread);
-        if (l_ret) {
-            log_it(L_CRITICAL, "Create thread failed with code %d", l_ret);
-            return l_ret;
-        }
+    int l_ret = 0;
+    for (uint32_t i = 0; i < s_threads_count && !l_ret; ++i) {
+        l_ret = dap_proc_thread_create(s_threads + i, i);
     }
-    return 0;
+    return l_ret;
 }
 
 /**
@@ -167,7 +181,8 @@ int dap_proc_thread_loop(dap_context_t *a_context)
                !(l_item = s_proc_queue_pull(l_thread, &l_item_priority)))
             pthread_cond_wait(&l_thread->queue_event, &l_thread->queue_lock);
         pthread_mutex_unlock(&l_thread->queue_lock);
-        debug_if(g_debug_reactor, L_DEBUG, "Call callback %p with arg %p on thread %p",
+        if (l_item)
+            debug_if(g_debug_reactor, L_DEBUG, "Call callback %p with arg %p on thread %p",
                                             l_item->callback, l_item->callback_arg, l_thread);
         if (!a_context->signal_exit &&
                 l_item->callback(l_item->callback_arg))
diff --git a/io/include/dap_proc_thread.h b/io/include/dap_proc_thread.h
index 0ba6823228090592d8a4733fe4dfa0eb7f6faebe..716b273fe83134ea9a1ef6e9703765996297dde4 100644
--- a/io/include/dap_proc_thread.h
+++ b/io/include/dap_proc_thread.h
@@ -61,6 +61,7 @@ typedef struct dap_proc_thread {
 
 #define DAP_PROC_THREAD(a) (dap_proc_thread_t *)((a)->_inheritor);
 
+int dap_proc_thread_create(dap_proc_thread_t *a_thread, int a_cpu_id);
 int dap_proc_thread_init(uint32_t a_threads_count);
 void dap_proc_thread_deinit();
 int dap_proc_thread_loop(dap_context_t *a_context);
diff --git a/net/link_manager/dap_link_manager.c b/net/link_manager/dap_link_manager.c
index 04467ee8bf1121ea77c94a1153b06db8f9575e43..12ee05a34405ac775b7c0227d3ffb0f1d55c5aaa 100644
--- a/net/link_manager/dap_link_manager.c
+++ b/net/link_manager/dap_link_manager.c
@@ -245,7 +245,7 @@ void dap_link_manager_deinit()
     DL_FOREACH_SAFE(s_link_manager->nets, it, tmp)
         dap_link_manager_remove_net(((dap_managed_net_t *)it->data)->id);
     pthread_rwlock_destroy(&s_link_manager->links_lock);
-    DAP_DELETE(s_link_manager);
+    DAP_DEL_Z(s_link_manager);
 }
 
 /**
diff --git a/net/server/notify_server/src/dap_notify_srv.c b/net/server/notify_server/src/dap_notify_srv.c
index b894b2216091e941607f339312eece1a67544c7b..e8d82ded1754e269bd81f2550bb1580c41573329 100644
--- a/net/server/notify_server/src/dap_notify_srv.c
+++ b/net/server/notify_server/src/dap_notify_srv.c
@@ -205,25 +205,26 @@ int dap_notify_server_send_f_mt(const char *a_format, ...)
  */
 static void s_notify_server_callback_queue(dap_events_socket_t * a_es, void * a_arg)
 {
+    size_t l_str_len = a_arg ? strlen((char*)a_arg) : 0;
+    if ( !l_str_len )
+        return;
     pthread_rwlock_rdlock(&s_notify_server_clients_mutex);
     dap_events_socket_handler_hh_t * l_socket_handler = NULL,* l_tmp = NULL;
-    HASH_ITER(hh, s_notify_server_clients, l_socket_handler, l_tmp){
+    HASH_ITER(hh, s_notify_server_clients, l_socket_handler, l_tmp) {
         uint32_t l_worker_id = l_socket_handler->worker_id;
-        if(l_worker_id>= dap_events_thread_get_count()){
+        if ( l_worker_id >= dap_events_thread_get_count() ) {
             log_it(L_ERROR,"Wrong worker id %u for send_inter() function", l_worker_id);
             continue;
         }
-        size_t l_str_len = a_arg? strlen((char*)a_arg): 0;
-        if(l_str_len){
+        char *l_arg = 
 #ifdef DAP_EVENTS_CAPS_IOCP
-            dap_events_socket_write_mt( dap_events_worker_get(l_worker_id),
-                                       l_socket_handler->uuid, a_arg, l_str_len + 1 );
+            a_arg;
 #else
-            dap_events_socket_write_inter(a_es->worker->queue_es_io_input[l_worker_id],
-                                          l_socket_handler->uuid,
-                                          a_arg, l_str_len + 1);
+            DAP_DUP_SIZE(a_arg, l_str_len + 1);
 #endif
-        }
+        
+        dap_events_socket_write_mt( dap_events_worker_get(l_worker_id),
+                                    l_socket_handler->uuid, l_arg, l_str_len + 1 );
     }
     pthread_rwlock_unlock(&s_notify_server_clients_mutex);
     DAP_DELETE(a_arg);