diff --git a/crypto/dap_enc_defeo.c b/crypto/dap_enc_defeo.c
index c33b0476f62d0e3076abb50d13ed88993891587a..b02f121a259d1f292e8968e1ae959a73a72e2ba7 100644
--- a/crypto/dap_enc_defeo.c
+++ b/crypto/dap_enc_defeo.c
@@ -15,13 +15,11 @@
 
 
 void dap_enc_defeo_key_new(struct dap_enc_key *a_key) {
-    a_key = DAP_NEW(dap_enc_key_t);
-    if(a_key == NULL)
-        return;
 
     a_key->type = DAP_ENC_KEY_TYPE_DEFEO;
-    a_key->enc = dap_enc_defeo_encode;
-    a_key->dec = dap_enc_defeo_decode;
+    a_key->enc = NULL;
+    a_key->gen_bob_shared_key = dap_enc_defeo_gen_bob_shared_key;
+    a_key->gen_alice_shared_key = dap_enc_defeo_gen_alice_shared_key;
 }
 
 // key pair generation of Alice
@@ -57,7 +55,8 @@ void dap_enc_defeo_key_new_generate(struct dap_enc_key * a_key, const void *kex_
 
 }
 
-void dap_enc_defeo_key_delete(struct dap_enc_key *a_key) {
+void dap_enc_defeo_key_delete(struct dap_enc_key *a_key)
+{
     (void)a_key;
 }
 
@@ -70,7 +69,7 @@ void dap_enc_defeo_key_delete(struct dap_enc_key *a_key) {
 // b_pub  --- Bob's public key
 // b_key->data  --- shared key
 // a_pub_size --- shared key length
-size_t dap_enc_defeo_encode(struct dap_enc_key *b_key, const void *a_pub,
+size_t dap_enc_defeo_gen_bob_shared_key(struct dap_enc_key *b_key, const void *a_pub,
                             size_t a_pub_size, void **b_pub)
 {
 
@@ -123,9 +122,9 @@ size_t dap_enc_defeo_encode(struct dap_enc_key *b_key, const void *a_pub,
 // a_priv  --- Alice's private key
 // b_pub  ---  Bob's public key
 // OUTPUT:
-// a_key->data  --- shared key
+// a_key->priv_key_data  --- shared key
 // a_key_len --- shared key length
-size_t dap_enc_defeo_decode(struct dap_enc_key *a_key, const void *a_priv, size_t b_pub_size, unsigned char *b_pub)
+size_t dap_enc_defeo_gen_alice_shared_key(struct dap_enc_key *a_key, const void *a_priv, size_t b_pub_size, unsigned char *b_pub)
 {
     if(b_pub_size != DEFEO_PUBLICK_KEY_LEN) {
         log_it(L_ERROR, "public key size not equal DEFEO_PUBLICKEYBYTES");
diff --git a/crypto/dap_enc_defeo.h b/crypto/dap_enc_defeo.h
index da3f03116c5c07e51a3500fa0d8e01937ec7dbec..94cdba205c69c99c2c04a072391647fcc17869ea 100644
--- a/crypto/dap_enc_defeo.h
+++ b/crypto/dap_enc_defeo.h
@@ -32,7 +32,7 @@ void dap_enc_defeo_key_new_generate(struct dap_enc_key * a_key, const void *kex_
 void dap_enc_defeo_key_new_from_data(struct dap_enc_key* a_key, void **a_priv, size_t a_in_size);
 void dap_enc_defeo_key_delete(struct dap_enc_key* a_key);
 
-size_t dap_enc_defeo_encode(struct dap_enc_key* b_key, const void* a_pub, size_t a_pub_size, void **b_pub);
-size_t dap_enc_defeo_decode(struct dap_enc_key* a_key, const void* a_priv, size_t b_pub_size, unsigned char * b_pub);
+size_t dap_enc_defeo_gen_bob_shared_key(struct dap_enc_key* b_key, const void* a_pub, size_t a_pub_size, void **b_pub);
+size_t dap_enc_defeo_gen_alice_shared_key(struct dap_enc_key* a_key, const void* a_priv, size_t b_pub_size, unsigned char * b_pub);
 
 #endif
diff --git a/crypto/dap_enc_key.c b/crypto/dap_enc_key.c
index 5849352647230cb3315c725f8b498fee1d3902e3..7fac63b503f83b523d567e3fcf472c13ef76480d 100644
--- a/crypto/dap_enc_key.c
+++ b/crypto/dap_enc_key.c
@@ -36,6 +36,9 @@ struct dap_enc_key_callbacks{
     dap_enc_callback_dataop_t enc;
     dap_enc_callback_dataop_t dec;
 
+    dap_enc_gen_bob_shared_key gen_bob_shared_key;
+    dap_enc_gen_alice_shared_key gen_alice_shared_key;
+
     dap_enc_callback_new new_callback;
     dap_enc_callback_data_t new_from_data_public_callback;
     dap_enc_callback_new_generate new_generate_callback;
@@ -53,17 +56,21 @@ struct dap_enc_key_callbacks{
                            },
     [DAP_ENC_KEY_TYPE_MSRLN] = {
                             .name = "MSRLN",
-                            .enc = dap_enc_msrln_encode,
-                            .dec = dap_enc_msrln_decode,
+                            .enc = NULL,
+                            .dec = NULL,
                             .new_callback = dap_enc_msrln_key_new,
                             .delete_callback = dap_enc_msrln_key_delete,
                             .new_generate_callback = dap_enc_msrln_key_generate,
+                            .gen_bob_shared_key = dap_enc_msrln_gen_bob_shared_key,
+                            .gen_alice_shared_key = dap_enc_msrln_gen_alice_shared_key,
                             .new_from_data_public_callback = dap_enc_msrln_key_new_from_data_public
     },
     [DAP_ENC_KEY_TYPE_DEFEO]={
                             .name = "DEFEO",
-                            .enc = dap_enc_defeo_encode,
-                            .dec = dap_enc_defeo_decode,
+                            .enc = NULL,
+                            .dec = NULL,
+                            .gen_bob_shared_key = dap_enc_defeo_gen_bob_shared_key,
+                            .gen_alice_shared_key = dap_enc_defeo_gen_alice_shared_key,
                             .new_callback = dap_enc_defeo_key_new,
                             .delete_callback = dap_enc_defeo_key_delete,
                             .new_generate_callback = dap_enc_defeo_key_new_generate,
diff --git a/crypto/dap_enc_key.h b/crypto/dap_enc_key.h
index 187ea58f461ea8a4bb6c93ee092f05908637477e..384b83e533c0e9458ec8d27495a4e2f86317e44e 100644
--- a/crypto/dap_enc_key.h
+++ b/crypto/dap_enc_key.h
@@ -116,6 +116,31 @@ typedef void (*dap_enc_callback_delete)(struct dap_enc_key*);
 typedef size_t (*dap_enc_callback_dataop_t)(struct dap_enc_key *key, const void *in,
                                             const size_t in_size,void ** out);
 
+// key pair generation and generation of shared key at Bob's side
+// INPUT:
+// dap_enc_key *b_key
+// a_pub  ---  Alice's public key
+// a_pub_size --- Alice's public key length
+// OUTPUT:
+// b_pub  --- Bob's public key
+// b_key->priv_key_data --- shared key
+// b_key->priv_key_data_size --- shared key length
+typedef int (*dap_enc_gen_bob_shared_key) (struct dap_enc_key *b_key, const void *a_pub,
+                                           size_t a_pub_size, void ** b_pub);
+
+// generation of shared key at Alice's side
+// INPUT:
+// dap_enc_key *b_key
+// a_priv  --- Alice's private key
+// b_pub  ---  Bob's public key
+// b_pub_size --- Bob public key size
+// OUTPUT:
+// a_key->priv_key_data  --- shared key
+// a_key->priv_key_data_size --- shared key length
+typedef int (*dap_enc_gen_alice_shared_key) (struct dap_enc_key *a_key, const void *a_priv,
+                                             size_t b_pub_size, unsigned char *b_pub);
+
+
 typedef void (*dap_enc_callback_ptr_t)(struct dap_enc_key *, void *);
 typedef size_t (*dap_enc_callback_pptr_r_size_t)(struct dap_enc_key *, void **);
 typedef void (*dap_enc_callback_data_t)(struct dap_enc_key *, const void * , size_t);
@@ -134,6 +159,8 @@ typedef struct dap_enc_key {
     dap_enc_key_type_t type;
     dap_enc_callback_dataop_t enc;
     dap_enc_callback_dataop_t dec;
+    dap_enc_gen_alice_shared_key gen_alice_shared_key;
+    dap_enc_gen_bob_shared_key gen_bob_shared_key;
 
     void * _inheritor; // WARNING! Inheritor must have only serealizeble/deserializeble data (copy)
     size_t _inheritor_size;
diff --git a/crypto/dap_enc_msrln.c b/crypto/dap_enc_msrln.c
index 6114e137bc992f5e30468ddf0b29b23d4a4b01f5..9c09cd5376f7656e771443a89ec62be04da83e2f 100644
--- a/crypto/dap_enc_msrln.c
+++ b/crypto/dap_enc_msrln.c
@@ -9,8 +9,10 @@
 void dap_enc_msrln_key_new(struct dap_enc_key* a_key)
 {
     a_key->type = DAP_ENC_KEY_TYPE_MSRLN;
-    a_key->dec = dap_enc_msrln_decode;
-    a_key->enc = dap_enc_msrln_encode;
+    a_key->dec = NULL;
+    a_key->enc = NULL;
+    a_key->gen_bob_shared_key = dap_enc_msrln_gen_bob_shared_key;
+    a_key->gen_alice_shared_key = dap_enc_msrln_gen_alice_shared_key;
     a_key->priv_key_data_size = 0;
     a_key->pub_key_data_size = 0;
 }
@@ -85,7 +87,7 @@ void dap_enc_msrln_key_generate(struct dap_enc_key * a_key, const void *kex_buf,
  * @param alice_msg_len
  * @return
  */
-size_t dap_enc_msrln_encode(struct dap_enc_key* b_key, const void* a_pub, const size_t a_pub_size, void ** b_pub)
+size_t dap_enc_msrln_gen_bob_shared_key(struct dap_enc_key* b_key, const void* a_pub, size_t a_pub_size, void ** b_pub)
 {
     size_t ret;
 
@@ -159,7 +161,7 @@ size_t dap_enc_msrln_encode(struct dap_enc_key* b_key, const void* a_pub, const
  * @param key_len
  * @return
  */
-size_t dap_enc_msrln_decode(struct dap_enc_key* a_key, const void* a_priv, const size_t b_key_len, unsigned char * b_pub)
+size_t dap_enc_msrln_gen_alice_shared_key(struct dap_enc_key* a_key, const void* a_priv, const size_t b_key_len, unsigned char * b_pub)
 {
     size_t ret = 1;
 
diff --git a/crypto/dap_enc_msrln.h b/crypto/dap_enc_msrln.h
index 4bb37517e8236560d0321d92482e7b8fc867e1fa..0b247231bd844df56486a4d8c8f30688aca6cd6e 100644
--- a/crypto/dap_enc_msrln.h
+++ b/crypto/dap_enc_msrln.h
@@ -28,7 +28,7 @@ void dap_enc_msrln_key_delete(struct dap_enc_key* a_key);
 
 size_t dap_enc_msrln_key_public_raw(dap_enc_key_t *a_key, void ** a_key_public);
 
-size_t dap_enc_msrln_encode(struct dap_enc_key* b_key, const void *a_pub, const size_t a_pub_size, void **b_pub);
-size_t dap_enc_msrln_decode(struct dap_enc_key* a_key, const void* a_priv, const size_t b_key_len, unsigned char * b_pub);
+size_t dap_enc_msrln_gen_bob_shared_key(struct dap_enc_key* b_key, const void *a_pub, size_t a_pub_size, void **b_pub);
+size_t dap_enc_msrln_gen_alice_shared_key(struct dap_enc_key* a_key, const void* a_priv, const size_t b_key_len, unsigned char * b_pub);
 
 #endif
diff --git a/test/crypto/dap_enc_defeo_test.c b/test/crypto/dap_enc_defeo_test.c
index 73108e492d1fb2e2272373485d26773404e7cf3b..4a97f5a173015d330a2ddd4e618132cf1ac16463 100644
--- a/test/crypto/dap_enc_defeo_test.c
+++ b/test/crypto/dap_enc_defeo_test.c
@@ -16,13 +16,13 @@ static void key_transfer_simulation_test()
 
     /* generate Bob's response */
     dap_enc_key_t* bob_key = dap_enc_key_new(DAP_ENC_KEY_TYPE_DEFEO);
-    dap_enc_defeo_encode(bob_key, (unsigned char *) alice_msg, alice_msg_len,
+    bob_key->gen_bob_shared_key(bob_key, (unsigned char *) alice_msg, alice_msg_len,
                          (unsigned char **) &bob_key->pub_key_data);
     bob_msg = bob_key->pub_key_data;
     bob_msg_len = bob_key->pub_key_data_size;
 
     /* Alice processes Bob's response */
-    dap_enc_defeo_decode(alice_key, alice_key->priv_key_data, bob_msg_len, bob_msg);
+    alice_key->gen_alice_shared_key(alice_key, alice_key->priv_key_data, bob_msg_len, bob_msg);
 
     /* compare session key values */
     dap_assert(memcmp(alice_key->priv_key_data, bob_key->priv_key_data, alice_key->priv_key_data_size) == 0, "Session keys equals");
diff --git a/test/crypto/dap_enc_msrln_test.c b/test/crypto/dap_enc_msrln_test.c
index 6b0a8f585890474656deb9cf393fc888dc397a0b..0020d50540883c2bc92518b1c47d4dad139ab10f 100644
--- a/test/crypto/dap_enc_msrln_test.c
+++ b/test/crypto/dap_enc_msrln_test.c
@@ -16,15 +16,13 @@ static void key_transfer_simulation_test()
     alice_msg_len = alice_key->pub_key_data_size;
 
 //    /* generate Bob's response */
-   // dap_enc_key_t* bob_key = dap_enc_key_new_generate(DAP_ENC_KEY_TYPE_MSRLN, NULL, 0, NULL, 0, 0);
     dap_enc_key_t* bob_key = dap_enc_key_new(DAP_ENC_KEY_TYPE_MSRLN);
-    dap_enc_msrln_encode(bob_key, (unsigned char *) alice_msg, alice_msg_len,
-                         (unsigned char **) &bob_key->pub_key_data);
+    bob_key->gen_bob_shared_key(bob_key, alice_msg, alice_msg_len, (void**)&bob_key->pub_key_data);
     bob_msg = bob_key->pub_key_data;
     bob_msg_len = bob_key->pub_key_data_size;
 
     /* Alice processes Bob's response */
-    dap_enc_msrln_decode(alice_key, alice_key->priv_key_data, bob_msg_len, bob_msg);
+    alice_key->gen_alice_shared_key(alice_key, alice_key->priv_key_data, bob_msg_len, bob_msg);
 
     /* compare session key values */
     dap_assert(memcmp(alice_key->priv_key_data, bob_key->priv_key_data, alice_key->priv_key_data_size) == 0, "Session keys equals");
diff --git a/test/crypto/dap_enc_test.c b/test/crypto/dap_enc_test.c
index 4cba6d5106bace8849b3b86051c55af2e5472529..337b2cdac60c7419ca9270421ec5dce1b950bb1b 100644
--- a/test/crypto/dap_enc_test.c
+++ b/test/crypto/dap_enc_test.c
@@ -87,13 +87,13 @@ void test_key_transfer_msrln()
 
     /* generate Bob's response */
     dap_enc_key_t* bob_key = dap_enc_key_new(DAP_ENC_KEY_TYPE_MSRLN);
-    bob_key->enc(bob_key, (unsigned char *) alice_msg, alice_msg_len,
+    bob_key->gen_bob_shared_key(bob_key, (unsigned char *) alice_msg, alice_msg_len,
                  (void **) &bob_key->pub_key_data);
     bob_msg = bob_key->pub_key_data;
     bob_msg_len = bob_key->pub_key_data_size;
 
     /* Alice processes Bob's response */
-    bob_key->dec(alice_key, alice_key->priv_key_data, bob_msg_len, (void**)bob_msg);
+    bob_key->gen_alice_shared_key(alice_key, alice_key->priv_key_data, bob_msg_len, (void**)bob_msg);
 
     /* compare session key values */
     dap_assert(memcmp(alice_key->priv_key_data, bob_key->priv_key_data, alice_key->priv_key_data_size) == 0, "Session keys equals");