diff --git a/include/dap_cert.h b/include/dap_cert.h
index a793fd7ad309e6bc297906af1adf1ab6f69eb78c..db212d2484a8f5d12c69929db0cc3ccab74f0e41 100755
--- a/include/dap_cert.h
+++ b/include/dap_cert.h
@@ -52,8 +52,9 @@ size_t dap_cert_parse_str_list(const char * a_certs_str, dap_cert_t *** a_certs,
 
 dap_cert_t * dap_cert_generate(const char * a_cert_name,const char * a_file_path,dap_enc_key_type_t a_key_type );
 
-dap_cert_t * dap_cert_generate_mem(const char * a_cert_name,
-                                               dap_enc_key_type_t a_key_type );
+dap_cert_t * dap_cert_generate_mem_with_seed(const char * a_cert_name, dap_enc_key_type_t a_key_type,
+        const void* a_seed, size_t a_seed_size);
+dap_cert_t * dap_cert_generate_mem(const char * a_cert_name, dap_enc_key_type_t a_key_type );
 
 
 dap_cert_t * dap_cert_add_file(const char * a_cert_name,const char *a_folder_path);
diff --git a/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.c b/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.c
index 6dc94232cc3102ffaa11d2b01aaa824d9ebc1b9f..2aae03216e668c2faca40269c0d9adb9843446ac 100755
--- a/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.c
+++ b/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.c
@@ -21,6 +21,11 @@ int SHAKE256(unsigned char *output, size_t outputByteLen, const unsigned char *i
     return KeccakWidth1600_Sponge(1088, 512, input, inputByteLen, 0x1F, output, outputByteLen);
 }
 
+int SHA3_192(unsigned char *output, const unsigned char *input, size_t inputByteLen)
+{
+    return KeccakWidth1600_Sponge(1216, 384, input, inputByteLen, 0x06, output, 192/8);
+}
+
 int SHA3_224(unsigned char *output, const unsigned char *input, size_t inputByteLen)
 {
     return KeccakWidth1600_Sponge(1152, 448, input, inputByteLen, 0x06, output, 224/8);
diff --git a/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.h b/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.h
index b3c68ae842fc4f9667a4769a7b9f5e3d6f2deec8..73559dedce4f957d418b678b796cbda06c885b30 100755
--- a/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.h
+++ b/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.h
@@ -33,6 +33,15 @@ int SHAKE128(unsigned char *output, size_t outputByteLen, const unsigned char *i
   */
 int SHAKE256(unsigned char *output, size_t outputByteLen, const unsigned char *input, size_t inputByteLen);
 
+
+/** Implementation of SHA3-192 [FIPS 202].
+  * @param  output          Pointer to the output buffer (24 bytes).
+  * @param  input           Pointer to the input message.
+  * @param  inputByteLen    The length of the input message in bytes.
+  * @return 0 if successful, 1 otherwise.
+  */
+int SHA3_192(unsigned char *output, const unsigned char *input, size_t inputByteLen);
+
 /** Implementation of SHA3-224 [FIPS 202].
   * @param  output          Pointer to the output buffer (28 bytes).
   * @param  input           Pointer to the input message.
diff --git a/src/dap_cert.c b/src/dap_cert.c
index 7a21bbe87dec93b356daa89906933b72ea282a1b..a9fb97bfeef962c07a4392467d82ec5fa56dc520 100755
--- a/src/dap_cert.c
+++ b/src/dap_cert.c
@@ -193,10 +193,10 @@ int dap_cert_add_cert_sign(dap_cert_t * a_cert, dap_cert_t * a_cert_signer)
  * @param a_key_type
  * @return
  */
-dap_cert_t * dap_cert_generate_mem(const char * a_cert_name,
-                                               dap_enc_key_type_t a_key_type )
+dap_cert_t * dap_cert_generate_mem_with_seed(const char * a_cert_name, dap_enc_key_type_t a_key_type,
+        const void* a_seed, size_t a_seed_size)
 {
-    dap_enc_key_t *l_enc_key = dap_enc_key_new_generate(a_key_type, NULL, 0, NULL, 0, 0);
+    dap_enc_key_t *l_enc_key = dap_enc_key_new_generate(a_key_type, NULL, 0, a_seed, a_seed_size, 0);
     if ( l_enc_key ){
         dap_cert_t * l_cert = dap_cert_new(a_cert_name);
         l_cert->enc_key = l_enc_key;
@@ -213,6 +213,17 @@ dap_cert_t * dap_cert_generate_mem(const char * a_cert_name,
     }
 }
 
+/**
+ * @brief dap_cert_generate_mem
+ * @param a_cert_name
+ * @param a_key_type
+ * @return
+ */
+dap_cert_t * dap_cert_generate_mem(const char * a_cert_name, dap_enc_key_type_t a_key_type)
+{
+    return dap_cert_generate_mem_with_seed(a_cert_name, a_key_type, NULL, 0);
+}
+
 /**
  * @brief dap_cert_generate
  * @param a_cert_name
diff --git a/src/dap_enc_bliss.c b/src/dap_enc_bliss.c
index 78b34b4bae9cceede2d3ed104bf63f466125e383..255a29a3efcfb41e950845bb1f736afb6aca4937 100755
--- a/src/dap_enc_bliss.c
+++ b/src/dap_enc_bliss.c
@@ -6,6 +6,8 @@
 #include "dap_enc_bliss.h"
 #include "dap_common.h"
 #include "dap_rand.h"
+#include "SimpleFIPS202.h"
+
 #define LOG_TAG "dap_enc_sig_bliss"
 
 static enum DAP_BLISS_SIGN_SECURITY _bliss_type = MAX_SECURITY; // by default
@@ -74,7 +76,12 @@ void dap_enc_sig_bliss_key_new_generate(struct dap_enc_key * a_key, const void *
 
     uint8_t seed_tmp[SHA3_512_DIGEST_LENGTH];
     entropy_t entropy;
-    randombytes(&seed_tmp, 64);
+    if(seed && seed_size>0){
+        assert(SHA3_512_DIGEST_LENGTH==64);
+        SHA3_512((unsigned char *)seed_tmp, (const unsigned char *)seed, seed_size);
+    }
+    else
+        randombytes(&seed_tmp, 64);
     entropy_init(&entropy, seed_tmp);
 
     /* type is a param of sign-security
diff --git a/src/dap_enc_dilithium.c b/src/dap_enc_dilithium.c
index 5ddd872e306f0c67cd58c56cf567171c34c4ef99..c530ef8c49ab01e83c78fee69004461822984ed9 100755
--- a/src/dap_enc_dilithium.c
+++ b/src/dap_enc_dilithium.c
@@ -52,7 +52,7 @@ void dap_enc_sig_dilithium_key_new_generate(struct dap_enc_key * key, const void
     key->pub_key_data = malloc(key->pub_key_data_size);
 
     retcode = dilithium_crypto_sign_keypair((dilithium_public_key_t *) key->pub_key_data,
-            (dilithium_private_key_t *) key->priv_key_data, _dilithium_type);
+            (dilithium_private_key_t *) key->priv_key_data, _dilithium_type, seed, seed_size);
     if(retcode != 0) {
         dilithium_private_and_public_keys_delete((dilithium_private_key_t *) key->pub_key_data,
                 (dilithium_public_key_t *) key->pub_key_data);
diff --git a/src/dap_enc_picnic.c b/src/dap_enc_picnic.c
index 437699958dfcab5565fdb18a06bf4f017746de36..6c64c3d768eabf3612b137f40ed1e08a838e48c8 100755
--- a/src/dap_enc_picnic.c
+++ b/src/dap_enc_picnic.c
@@ -96,7 +96,7 @@ void dap_enc_sig_picnic_key_new_generate(struct dap_enc_key * key, const void *k
     key->priv_key_data = calloc(1, key->priv_key_data_size);
     key->pub_key_data = calloc(1, key->pub_key_data_size);
 
-    picnic_keys_gen((picnic_privatekey_t *) key->priv_key_data, (picnic_publickey_t *) key->pub_key_data, parameters);
+    picnic_keys_gen((picnic_privatekey_t *) key->priv_key_data, (picnic_publickey_t *) key->pub_key_data, parameters, seed, seed_size);
     if(!picnic_validate_keypair((picnic_privatekey_t *) key->priv_key_data, (picnic_publickey_t *) key->pub_key_data))
         set_picnic_params_t(key);
 }
diff --git a/src/dap_enc_tesla.c b/src/dap_enc_tesla.c
index 1bba317a8100d9ed031f4e4c15f06f6a18817c60..4da96a8ddafc58f0dd0b0f1a1ebaba374b77c1f4 100755
--- a/src/dap_enc_tesla.c
+++ b/src/dap_enc_tesla.c
@@ -58,7 +58,7 @@ void dap_enc_sig_tesla_key_new_generate(struct dap_enc_key * key, const void *ke
     key->pub_key_data = malloc(key->pub_key_data_size);
 
     retcode = tesla_crypto_sign_keypair((tesla_public_key_t *) key->pub_key_data,
-            (tesla_private_key_t *) key->priv_key_data, _tesla_type);
+            (tesla_private_key_t *) key->priv_key_data, _tesla_type, seed, seed_size);
     if(retcode != 0) {
         tesla_private_and_public_keys_delete((tesla_private_key_t *) key->pub_key_data,
                 (tesla_public_key_t *) key->pub_key_data);
diff --git a/src/dap_sign.c b/src/dap_sign.c
index b7f436d9548fd49fbcd23cec5d5f4f71408222f8..3e221c8bf679b49e36d3cf402cdbae23d1109c41 100755
--- a/src/dap_sign.c
+++ b/src/dap_sign.c
@@ -135,16 +135,16 @@ dap_sign_type_t dap_pkey_type_from_sign( dap_pkey_type_t a_pkey_type)
 dap_sign_type_t dap_sign_type_from_str(const char * a_type_str)
 {
     dap_sign_type_t l_sign_type = {0};
-    if ( strcmp (a_type_str,"sig_bliss") == 0 ){
+    if ( dap_strcmp (a_type_str,"sig_bliss") == 0 ){
         l_sign_type.type = SIG_TYPE_BLISS;
-    } else if ( strcmp (a_type_str,"sig_tesla") == 0){
+    } else if ( dap_strcmp (a_type_str,"sig_tesla") == 0){
         l_sign_type.type = SIG_TYPE_TESLA;
-    } else if ( strcmp (a_type_str,"sig_picnic") == 0){
+    } else if ( dap_strcmp (a_type_str,"sig_picnic") == 0){
         l_sign_type.type = SIG_TYPE_PICNIC;
-    }else if ( strcmp (a_type_str,"sig_dil") == 0){
+    }else if ( dap_strcmp (a_type_str,"sig_dil") == 0){
         l_sign_type.type = SIG_TYPE_DILITHIUM;
     }else{
-       log_it (L_WARNING, "Wrong sign type string \"%s\"",a_type_str);
+        log_it(L_WARNING, "Wrong sign type string \"%s\"", a_type_str ? a_type_str : "(null)");
     }
     return l_sign_type;
 }
diff --git a/src/sig_dilithium/dilithium_params.h b/src/sig_dilithium/dilithium_params.h
index e4a3fa6ddecb69aeb9f21f5d6df2febc091964c2..b7294dea8d2e32bc68acc1714c9dcfc20e995c0f 100755
--- a/src/sig_dilithium/dilithium_params.h
+++ b/src/sig_dilithium/dilithium_params.h
@@ -74,7 +74,8 @@ typedef struct {
 ///==========================================================================================
 bool dilithium_params_init(dilithium_param_t *, dilithium_kind_t );
 
-int dilithium_crypto_sign_keypair(dilithium_public_key_t *, dilithium_private_key_t *, dilithium_kind_t );
+int dilithium_crypto_sign_keypair(dilithium_public_key_t *public_key, dilithium_private_key_t *private_key,
+        dilithium_kind_t kind, const void * seed, size_t seed_size);
 
 int dilithium_crypto_sign(dilithium_signature_t *, const unsigned char *, unsigned long long, const dilithium_private_key_t *);
 
diff --git a/src/sig_dilithium/dilithium_sign.c b/src/sig_dilithium/dilithium_sign.c
index 28a5ec9e93c5d16f2aff98600e50858739733043..47942fa5ec7986bbccc589ee802960da3ebb6ec5 100755
--- a/src/sig_dilithium/dilithium_sign.c
+++ b/src/sig_dilithium/dilithium_sign.c
@@ -2,7 +2,7 @@
 #include "dilithium_sign.h"
 
 //#include "KeccakHash.h"
-//#include "SimpleFIPS202.h"
+#include "SimpleFIPS202.h"
 
 /********************************************************************************************/
 void expand_mat(polyvecl mat[], const unsigned char rho[SEEDBYTES], dilithium_param_t *p)
@@ -132,7 +132,9 @@ static int32_t dilithium_private_and_public_keys_init(dilithium_private_key_t *p
 }
 
 /*************************************************/
-int dilithium_crypto_sign_keypair(dilithium_public_key_t *public_key, dilithium_private_key_t *private_key, dilithium_kind_t kind) {
+int dilithium_crypto_sign_keypair(dilithium_public_key_t *public_key, dilithium_private_key_t *private_key,
+        dilithium_kind_t kind, const void * seed, size_t seed_size)
+{
 
     dilithium_param_t *p = malloc(sizeof(dilithium_param_t));
     if (! dilithium_params_init( p, kind)) return -1;
@@ -153,7 +155,13 @@ int dilithium_crypto_sign_keypair(dilithium_public_key_t *public_key, dilithium_
     polyvecl s1, s1hat;
     polyveck s2, t, t1, t0;
 
-    randombytes(seedbuf, SEEDBYTES);
+    if(seed && seed_size > 0) {
+        assert(SEEDBYTES==32);
+        SHA3_256((unsigned char *) seedbuf, (const unsigned char *) seed, seed_size);
+    }
+    else {
+        randombytes(seedbuf, SEEDBYTES);
+    }
 
     //SHAKE256(seedbuf, 3*SEEDBYTES, seedbuf, SEEDBYTES);
     shake256(seedbuf, 3*SEEDBYTES, seedbuf, SEEDBYTES);
diff --git a/src/sig_picnic/picnic.c b/src/sig_picnic/picnic.c
index c368d199c0deed24e87acdcca6dec1b8d274dfe8..4d04eb47ac6a1bd0657f03a25f4ef85b6f22ff1e 100755
--- a/src/sig_picnic/picnic.c
+++ b/src/sig_picnic/picnic.c
@@ -17,6 +17,7 @@
 #include "picnic_types.h"
 #include "lowmc_constants.h"
 #include "platform.h"
+#include "SimpleFIPS202.h"
 
 static int is_valid_params(picnic_params_t params)
 {
@@ -380,7 +381,7 @@ int picnic_validate_keypair(const picnic_privatekey_t* privatekey, const picnic_
     return 0;
 }
 
-int picnic_keys_gen(picnic_privatekey_t *sk, picnic_publickey_t *pk, picnic_params_t param)
+int picnic_keys_gen(picnic_privatekey_t *sk, picnic_publickey_t *pk, picnic_params_t param, const void * seed, size_t seed_size)
 {
     paramset_t paramset;
 
@@ -388,16 +389,42 @@ int picnic_keys_gen(picnic_privatekey_t *sk, picnic_publickey_t *pk, picnic_para
     if (ret != EXIT_SUCCESS) {
         return -1;
     }
-    /* Generate a private key */
-    sk->params = param;
-    if (randombytes(sk->data, paramset.stateSizeBytes) != 0) {
-        return -1;
-    }
 
-    /* Generate a random plaintext block */
-    pk->params = param;
-    if (randombytes(pk->plaintext, paramset.stateSizeBytes) != 0) {
-        return -1;
+    /* Generate a private key */
+    if(seed && seed_size > 0) {
+        sk->params = param;
+        pk->params = param;
+        switch (paramset.stateSizeBytes) {
+        case 16:
+            SHAKE128((unsigned char *) sk->data, 16, (const unsigned char *) seed, seed_size);
+            //Generate a random plaintext block
+            SHAKE128((unsigned char *) pk->plaintext, 16, (const unsigned char *) seed, seed_size);
+            break;
+        case 24:
+            SHA3_192((unsigned char *) sk->data, (const unsigned char *) seed, seed_size);
+            //Generate a random plaintext block
+            SHA3_192((unsigned char *) pk->plaintext, (const unsigned char *) seed, seed_size);
+            break;
+        case 32:
+            SHA3_256((unsigned char *) sk->data, (const unsigned char *) seed, seed_size);
+            //Generate a random plaintext block
+            SHA3_256((unsigned char *) pk->plaintext, (const unsigned char *) seed, seed_size);
+            break;
+        default:
+            return -1;
+        }
+    }
+    else {
+        sk->params = param;
+        if(randombytes(sk->data, paramset.stateSizeBytes) != 0) {
+            return -1;
+        }
+
+        /* Generate a random plaintext block */
+        pk->params = param;
+        if(randombytes(pk->plaintext, paramset.stateSizeBytes) != 0) {
+            return -1;
+        }
     }
 
     LowMCEnc((uint32_t*)pk->plaintext, (uint32_t*)pk->ciphertext,
diff --git a/src/sig_picnic/picnic.h b/src/sig_picnic/picnic.h
index 11621c9bbe570efbea858319e84c5b2e8bc3f8c7..723e51de6d3a2efb92d8e0eb068a08a10272b0ec 100755
--- a/src/sig_picnic/picnic.h
+++ b/src/sig_picnic/picnic.h
@@ -68,7 +68,7 @@ int picnic_validate_keypair(const picnic_privatekey_t* privatekey, const picnic_
 
 void picnic_keypair_delete(picnic_privatekey_t* sk, picnic_publickey_t *pk);
 
-int picnic_keys_gen(picnic_privatekey_t *sk, picnic_publickey_t *pk, picnic_params_t param);
+int picnic_keys_gen(picnic_privatekey_t *sk, picnic_publickey_t *pk, picnic_params_t param, const void * seed, size_t seed_size);
 
 int get_param_set(picnic_params_t picnicParams, paramset_t* paramset);
 
diff --git a/src/sig_tesla/sign.c b/src/sig_tesla/sign.c
index 83c5a8376bd7c1c5267012e2c3895674dc02dd12..70694249369e1d057ee1deae3d44acf663bba14d 100755
--- a/src/sig_tesla/sign.c
+++ b/src/sig_tesla/sign.c
@@ -653,7 +653,7 @@ static int32_t tesla_private_and_public_keys_init(tesla_private_key_t *private_k
 *              - tesla_param_t *params: struct of TESLA parametrs
 * Returns:     0 for successful execution
 **********************************************************/
-int tesla_crypto_sign_keypair(tesla_public_key_t *public_key, tesla_private_key_t *private_key, tesla_kind_t kind)
+int tesla_crypto_sign_keypair(tesla_public_key_t *public_key, tesla_private_key_t *private_key, tesla_kind_t kind, const void * seed, size_t seed_size)
 {
     tesla_param_t *p = malloc(sizeof(tesla_param_t));
     if (! tesla_params_init( p, kind)) return -1;
@@ -666,7 +666,13 @@ int tesla_crypto_sign_keypair(tesla_public_key_t *public_key, tesla_private_key_
     unsigned char *randomness_extended = malloc((p->PARAM_K + 3) * CRYPTO_SEEDBYTES * sizeof(char));
 
     // Get randomness_extended <- seed_e, seed_s, seed_a, seed_y
-    randombytes(randomness, CRYPTO_RANDOMBYTES);
+    if(seed && seed_size>0){
+        assert(CRYPTO_RANDOMBYTES==32);
+        SHA3_256((unsigned char *)randomness, (const unsigned char *)seed, seed_size);
+    }
+    else{
+        randombytes(randomness, CRYPTO_RANDOMBYTES);
+    }
 
     if(p->kind == 0 || p->kind == 3)
         SHAKE128(randomness_extended, ((p->PARAM_K) + 3) * CRYPTO_SEEDBYTES, randomness, CRYPTO_RANDOMBYTES);
diff --git a/src/sig_tesla/tesla_params.h b/src/sig_tesla/tesla_params.h
index bbc89202f8d4b23e32a1742bb0dabf0392f36f6e..9adfdafcce1dcf68d6b2b4db2d4b772a4a66f1e5 100755
--- a/src/sig_tesla/tesla_params.h
+++ b/src/sig_tesla/tesla_params.h
@@ -72,7 +72,7 @@ typedef struct {
 ///==========================================================================================
 bool tesla_params_init(tesla_param_t *, tesla_kind_t );
 
-int tesla_crypto_sign_keypair(tesla_public_key_t *, tesla_private_key_t *, tesla_kind_t );
+int tesla_crypto_sign_keypair(tesla_public_key_t *public_key, tesla_private_key_t *private_key, tesla_kind_t kind, const void * seed, size_t seed_size);
 
 int tesla_crypto_sign(tesla_signature_t *, const unsigned char *, unsigned long long, const tesla_private_key_t *);