diff --git a/crypto/dap_enc_key.c b/crypto/dap_enc_key.c
index a52d115122a84fb1a16459058109ed5f5d22f7e4..df1a38a170d2f3b64fe409ed106c582a2de5ab64 100644
--- a/crypto/dap_enc_key.c
+++ b/crypto/dap_enc_key.c
@@ -69,6 +69,16 @@ struct dap_enc_key_callbacks{
                             .key_public_raw_callback = dap_enc_newhope_key_public_raw,
                             .new_from_data_public_callback = dap_enc_newhope_key_new_from_data_public
                            },
+  /*  [DAP_ENC_KEY_TYPE_SIDH_CLN16]={
+                                .name = "SIDHCLN16",
+                                .size_max = 64,
+                                .enc = dap_enc_sidh16_encode,
+                                .dec = dap_enc_sidh16_decode,
+                                .new_callback = NULL,
+                                .delete_callback = NULL,
+                                .new_generate_callback = dap_enc_sidh16_key_new_generate,
+                                .new_from_data_callback = dap_enc_sidh16_key_new_from_data
+    },*/
     //MSRLN16
     [DAP_ENC_KEY_TYPE_RLWE_MSRLN16] = {
                             .name = "MSRLN16",
diff --git a/crypto/dap_enc_key.h b/crypto/dap_enc_key.h
index 7cf6d7313d40f9d0ae4d1d548715e1f2233347e5..1aa7c382e10934e8eda6523e39f3d0f96c30062e 100644
--- a/crypto/dap_enc_key.h
+++ b/crypto/dap_enc_key.h
@@ -30,7 +30,7 @@ typedef enum dap_enc_data_type{DAP_ENC_DATA_TYPE_RAW,
                                } dap_enc_data_type_t;
 
                               
-} dap_enc_data_type_t;
+//} dap_enc_data_type_t;
 
 
 typedef enum dap_enc_key_type{ DAP_ENC_KEY_TYPE_AES, // Symmetric AES
@@ -46,7 +46,8 @@ typedef enum dap_enc_key_type{ DAP_ENC_KEY_TYPE_AES, // Symmetric AES
                                                 // from https://github.com/tpoeppelmann/newhop
                                                 // https://eprint.iacr.org/2015/1092
 
-                           DAP_ENC_KEY_TYPE_RLWE_MSRLN16, // Microsoft Research implementation of Peikert's ring-LWE key exchange
+                              DAP_ENC_KEY_TYPE_RLWE_MSRLN16,
+                           //DAP_ENC_KEY_TYPE_RLWE_MSRLN16, // Microsoft Research implementation of Peikert's ring-LWE key exchange
                                                // (Longa, Naehrig, CANS 2016, https://eprint.iacr.org/2016/504)
                                                // based on the implementation of Alkim, Ducas, Pöppelmann, and Schwabe,
                                                // with improvements from Longa and Naehrig,
@@ -87,7 +88,7 @@ typedef enum dap_enc_key_type{ DAP_ENC_KEY_TYPE_AES, // Symmetric AES
                                                // https://eprint.iacr.org/2017/279.pdf), using the optimized implemenation
                                                //  from https://github.com/IAIK/Picnic
                                DAP_ENC_KEY_TYPE_FNAM2 //ХЗ ЧТО, ДОБАВИЛ ЧТОБЫ БЫЛО И НА МЕНЯ КОМПИЛЯТОР НЕ РУГАЛСЯ:(
-                         } dap_enc_key_type_t;
+                         }  dap_enc_key_type_t;
 
 struct dap_enc_key;
 
diff --git a/crypto/dap_enc_msrln16.c b/crypto/dap_enc_msrln16.c
index c2d1bbda4b1da2323119820307b1d920ea8a87b9..a346c1fc87490a5ba3da0e1355e2dd35126423b4 100644
--- a/crypto/dap_enc_msrln16.c
+++ b/crypto/dap_enc_msrln16.c
@@ -20,14 +20,14 @@ size_t bob_msg_len;
 uint8_t *bob_key = NULL;
 size_t bob_key_len;
 
-struct  dap_enc_param{
+/*struct  dap_enc_param{
     enum OQS_KEX_alg_name alg_name;
     char *named_parameters;
     char *id;
 };
 
 typedef struct dap_enc_sidh16_key{
-} dap_enc_sidh16_key_t;
+} dap_enc_sidh16_key_t;*/
 
 #define PRINT_HEX_STRING(label, str, len)                        \
     {   size_t i;                                                \
@@ -41,18 +41,57 @@ typedef struct dap_enc_sidh16_key{
 
 /**
  * @brief dap_enc_msrln16_key_new_generate
- * @param a_key
- * @param a_size
+ * @param rand
+ * @return
  */
-void dap_enc_msrln16_key_new_generate(OQS_RAND *rand)
+
+dap_enc_key_t* dap_enc_msrln16_key_new_generate(struct dap_enc_key* a_key, size_t a_size)//(OQS_RAND* rand)
+//void dap_enc_msrln16_key_new_generate(OQS_RAND *rand)
 {
+    dap_enc_key_t *k = DAP_NEW(dap_enc_key_t);
+    dap_enc_msrln16_key_t *msrln16_a_key = DAP_ENC_KEY_TYPE_RLWE_MSRLN16(a_key); //DAP_ENC_SIDH16_KEY(a_key);
+   // OQS_KEX *k = malloc(sizeof(OQS_KEX));
+    if (k == NULL) {
+        return NULL;
+    }
+
+    k->data;
+    k->data_size;
+    k->type = DAP_ENC_KEY_TYPE_RLWE_MSRLN16;
+    k->last_used_timestamp;
+    k->enc = &dap_enc_msrln16_encode;
+    k->dec = &dap_enc_msrln16_decode;
+    k->delete_callback = &dap_enc_msrln16_key_delete;
+
+    msrln16_a_key->rand;
+
+  /*  k->ctx = NULL;
+    k->method_name = strdup("RLWE MSR LN16");
+    k->estimated_classical_security = 128;
+    k->estimated_quantum_security = 128;
+    k->seed = NULL;
+    k->seed_len = 0;
+    k->named_parameters = NULL;
+    k->rand = rand;
+    k->params = NULL;
+    k->alice_0 = &OQS_KEX_rlwe_msrln16_alice_0;
+    k->bob = &OQS_KEX_rlwe_msrln16_bob;
+    k->alice_1 = &OQS_KEX_rlwe_msrln16_alice_1;
+    k->alice_priv_free = &OQS_KEX_rlwe_msrln16_alice_priv_free;
+    k->free = &OQS_KEX_rlwe_msrln16_free;*/
+
+    dap_enc_key_t* key;
+
+
+    return k;
+//dap_enc_key_t *k = DAP_NEW(dap_enc_key_t);
     //rand = OQS_RAND_new(OQS_RAND_alg_default);
-    kex = OQS_KEX_rlwe_msrln16_new(rand);
+  /*  kex = OQS_KEX_rlwe_msrln16_new(rand);
     if(kex == NULL) {
            printf("новая пара не сгенерирована \n");
            //gen = 0;
        }
-           printf("расчёт для обмена ключами методом  %s\n", kex->method_name);
+           printf("расчёт для обмена ключами методом  %s\n", kex->method_name);*/
 
 }
 
@@ -68,7 +107,7 @@ void dap_enc_msrln16_key_new_generate(OQS_RAND *rand)
 
 void dap_enc_msrln16_key_new_from_data(OQS_KEX *k, const void * alice_priv, const uint8_t *bob_msg, const size_t bob_msg_len, uint8_t **key, size_t *key_len)
 {
-    gen = OQS_KEX_rlwe_msrln16_alice_1(k, alice_priv, bob_msg, bob_msg_len, &alice_key, &alice_key_len);
+    /*gen = OQS_KEX_rlwe_msrln16_alice_1(k, alice_priv, bob_msg, bob_msg_len, &alice_key, &alice_key_len);
     if(gen != 1) {
         printf("OQS_KEX_rlwe_msrln16_alice_1 lose..\n");
         gen = 0;
@@ -92,7 +131,7 @@ void dap_enc_msrln16_key_new_from_data(OQS_KEX *k, const void * alice_priv, cons
        printf("Alice and Bob's session keys match.\n");
        printf("\n\n");
 
-      gen = 1;
+      gen = 1;*/
 
 }
 
@@ -111,7 +150,7 @@ void dap_enc_msrln16_key_new_from_data_public(dap_enc_key_t * a_key, const void
  * @brief dap_enc_msrln16_key_delete
  * @param a_key
  */
-void dap_enc_msrln16_key_delete()
+void dap_enc_msrln16_key_delete(struct dap_enc_key* a_key)
 {
  //   free();
     free(alice_msg);
@@ -157,14 +196,14 @@ size_t dap_enc_msrln16_key_public_raw(dap_enc_key_t *a_key, void ** a_key_public
 //Боб отвечает на приветствие
 size_t dap_enc_msrln16_decode(OQS_KEX *k, const uint8_t *alice_msg, const size_t alice_msg_len, uint8_t **bob_msg, size_t *bob_msg_len, uint8_t **key, size_t *key_len)
 {
-    gen=OQS_KEX_rlwe_msrln16_bob(k, alice_msg, alice_msg_len, &bob_msg, &bob_msg_len, &bob_key, &bob_key_len);
+    /*gen=OQS_KEX_rlwe_msrln16_bob(k, alice_msg, alice_msg_len, &bob_msg, &bob_msg_len, &bob_key, &bob_key_len);
     if (gen!=1){
         //потеряли от боба
     }
 
 
     PRINT_HEX_STRING("Bob message", bob_msg, bob_msg_len);
-    PRINT_HEX_STRING("Bob session key", bob_key, bob_key_len);
+    PRINT_HEX_STRING("Bob session key", bob_key, bob_key_len);*/
 
 }
 
@@ -181,9 +220,9 @@ size_t dap_enc_msrln16_decode(OQS_KEX *k, const uint8_t *alice_msg, const size_t
 //Алиса приветствует
 size_t dap_enc_msrln16_encode(OQS_KEX *k, void **alice_priv, uint8_t **alice_msg, size_t *alice_msg_len)
 {
-    gen=OQS_KEX_rlwe_msrln16_alice_0(k ,alice_priv, alice_msg, alice_msg_len);
+    /*gen=OQS_KEX_rlwe_msrln16_alice_0(k ,alice_priv, alice_msg, alice_msg_len);
     if (gen!=1){
         //потеряли от алисы
     }
-   PRINT_HEX_STRING("Alice message", alice_msg, alice_msg_len);
+   PRINT_HEX_STRING("Alice message", alice_msg, alice_msg_len);*/
 }
diff --git a/crypto/dap_enc_msrln16.h b/crypto/dap_enc_msrln16.h
index a0d0e4c8e3db592fd46b7e0cfcf9ccc86adbd466..0dac8ec8304bea2686295495d1a30ccf378bde72 100644
--- a/crypto/dap_enc_msrln16.h
+++ b/crypto/dap_enc_msrln16.h
@@ -3,14 +3,28 @@
 
 #include <stddef.h>
 #include "liboqs/crypto/rand/rand.h"
+#include "liboqs/kex/kex.h"
+#include "dap_enc_key.h"
 
-typedef struct dap_enc_key dap_enc_key_t;
+//typedef struct dap_enc_key dap_enc_key_t;
 
-//void dap_enc_msrln16_key_new_generate(dap_enc_key_t * a_key, size_t a_size);
-//int OQS_KEX_rlwe_msrln16_bob(OQS_KEX *k, const uint8_t *alice_msg, const size_t alice_msg_len, uint8_t **bob_msg, size_t *bob_msg_len, uint8_t **key, size_t *key_len);
-//int OQS_KEX_rlwe_msrln16_alice_0(OQS_KEX *k, void **alice_priv, uint8_t **alice_msg, size_t *alice_msg_len);
+typedef struct dap_enc_msrln16_key{
+    OQS_RAND* rand;
 
-void dap_enc_msrln16_key_new_generate(OQS_RAND *rand);
+    unsigned int alice_msg_len;
+    unsigned int bob_msg_len;
+    unsigned int key_len;
+    uint16_t estimated_classical_security;
+    uint16_t estimated_quantum_security;
+    OQS_KEX* k;
+} dap_enc_msrln16_key_t;
+
+#define DAP_ENC_KEY_TYPE_RLWE_MSRLN16(a) ((dap_enc_msrln16_key_t *)((a)->_inheritor))
+
+
+//void dap_enc_msrln16_key_new_generate(OQS_RAND *rand);
+//dap_enc_key_t* dap_enc_msrln16_key_new_generate(struct dap_enc_key* a_key, size_t a_size);
+dap_enc_key_t* dap_enc_msrln16_key_new_genrate(struct dap_enc_key* a_key, size_t a_size);//(OQS_RAND* rand);
 // OQS_KEX_rlwe_msrln16_alice_1
 void dap_enc_msrln16_key_new_from_data(OQS_KEX *k, const void *alice_priv, const uint8_t *bob_msg, const size_t bob_msg_len, uint8_t **key, size_t *key_len);
 //void dap_enc_msrln16_key_new_from_data(dap_enc_key_t * a_key, const void * a_in, size_t a_in_size);
@@ -19,7 +33,8 @@ void dap_enc_msrln16_key_new_from_data_public(dap_enc_key_t* a_key, const void *
 
 // OQS_KEX_rlwe_msrln16_alice_priv_free
 // OQS_KEX_rlwe_msrln16_free
-void dap_enc_msrln16_key_delete();
+void dap_enc_msrln16_key_delete(struct dap_enc_key* a_key);
+//void dap_enc_msrln16_key_delete();
 
 /*?*/size_t dap_enc_msrln16_key_public_raw(dap_enc_key_t *a_key, void ** a_key_public);
 
diff --git a/crypto/dap_enc_sidh16.c b/crypto/dap_enc_sidh16.c
index 77a3dde30da695380e947edbaa0ac47100a68675..559e77e8aa6e93aaf0d852128531cc933ad361c0 100644
--- a/crypto/dap_enc_sidh16.c
+++ b/crypto/dap_enc_sidh16.c
@@ -5,148 +5,330 @@
 #include <string.h>
 #include <stdbool.h>
 
-#include "dap_common.h"
 #include "dap_enc_sidh16.h"
 #include "dap_enc_key.h"
 
-#include "liboqs/kex/kex.h"
-#include "liboqs/crypto/rand/rand.h"
-#include "liboqs/kex_sidh_cln16/kex_sidh_cln16.h"
+#include <../libdap/core/dap_common.h>
+#include <../libdap/crypto/liboqs/kex_sidh_cln16/kex_sidh_cln16.h>
+#include <../libdap/crypto/liboqs/kex_sidh_cln16/SIDH.h>
 
-OQS_KEX *k = NULL;
-int gen;
+static const char *P751 = "p751";
+static const char *CompressedP751 = "compressedp751";
 
-void *alignce_priv = NULL;
-uint8_t *alice_msg = NULL;
-size_t alice_msg_len;
-uint8_t *alice_key = NULL;
-size_t alice_key_len;
+static int isCompressed(void *_inheritor) {
+    if (_inheritor != NULL && strcmp(_inheritor, CompressedP751) == 0) {
+        return 1;
+    }
+    return 0;
+}
 
-uint8_t *bob_msg = NULL;
-size_t bob_msg_len;
-uint8_t *bob_key = NULL;
-size_t bob_key_len;
+extern bool dap_sidh16_CurveIsogenyStruct_isnull(PCurveIsogenyStruct pCurveIsogeny);
+
+dap_enc_key_t *dap_enc_sidh16_key_new_generate(struct dap_enc_key *a_key, size_t a_size) {
+    dap_enc_key_t *k = DAP_NEW(dap_enc_key_t);
+    dap_enc_sidh16_key_t *sidh_a_key = DAP_ENC_SIDH16_KEY(a_key);
+    if(k == NULL)
+        return NULL;
+    // инициализация системы изогенных кривых
+    PCurveIsogenyStruct curveIsogeny = oqs_sidh_cln16_curve_allocate(&CurveIsogeny_SIDHp751);
+    if(curveIsogeny == NULL || dap_sidh16_CurveIsogenyStruct_isnull(curveIsogeny)) {
+        DAP_DELETE(k);
+        // освобождаем память для изогении
+        oqs_sidh_cln16_curve_free(curveIsogeny);
+        return NULL;
+    }
+    // Инициализировать изогенную структуру кривой pCurveIsogeny со статическими данными, извлеченными из pCurveIsogenyData.
+    // Это нужно вызвать после выделения памяти для pCurveIsogeny с помощью SIDH_curve_allocate()
+    if(oqs_sidh_cln16_curve_initialize(curveIsogeny, &CurveIsogeny_SIDHp751) != SIDH_CRYPTO_SUCCESS) {
+        DAP_DELETE(k);
+        oqs_sidh_cln16_curve_free(curveIsogeny);
+        return NULL;
+    }
+    k->data;
+    k->data_size;
+    k->type = DAP_ENC_KEY_TYPE_SIDH_CLN16;
+    k->last_used_timestamp;
+    k->enc = &dap_enc_sidh16_encode;
+    k->dec = &dap_enc_sidh16_decode;
+    k->delete_callback = &dap_enc_sidh16_key_delete;
+
+    sidh_a_key->rand;
+    sidh_a_key->user_curveIsogeny;
+    return k;
 
+}
 
-struct  dap_enc_param{
-    enum OQS_KEX_alg_name alg_name;
-    char *named_parameters;
-    char *id;
-};
 
-typedef struct dap_enc_sidh16_key{
-} dap_enc_sidh16_key_t;
+void dap_enc_sidh16_key_new_from_data(struct dap_enc_key *a_key, const void *a_in, size_t a_in_size) {
 
+}
 
-#define PRINT_HEX_STRING(label, str, len)                        \
-    {   size_t i;                                                \
-        printf("%-20s (%4zu bytes):  ", (label), (size_t)(len)); \
-        for (i = 0; i < (len); i++) {                            \
-         printf("%02X", ((unsigned char *) (str))[i]);           \
-        }                                                        \
-        printf("\n");                                            \
+void dap_enc_sidh16_key_delete(struct dap_enc_key *a_key) {
+    dap_enc_sidh16_key_t *sidh_a_key = DAP_ENC_SIDH16_KEY(a_key);
+    (void) a_key;
+    if(!a_key){
+        return;
     }
+    oqs_sidh_cln16_curve_free((PCurveIsogenyStruct)sidh_a_key->user_curveIsogeny);
+    sidh_a_key->user_curveIsogeny = NULL;
+    DAP_DELETE(a_key);
+}
 
-int dap_enc_sidh16_key_new_generate(OQS_RAND *rand, const char *named_parameters) {
 
-    k = OQS_KEX_sidh_cln16_new(rand, named_parameters);
-    if(k == NULL) {
-        printf("новая пара не сгенерирована \n");
-        gen = 0;
+// alice_0
+size_t dap_enc_sidh16_encode(struct dap_enc_key *a_key, const void *a_in, size_t a_in_size, void *a_out) {
+    int ret;
+    dap_enc_sidh16_key_t *sidh_a_key = DAP_ENC_SIDH16_KEY(a_key);
+    // non-compressed public key
+    uint8_t *key_a_tmp_pub = NULL;
+    if(!a_key || !a_in || !a_in_size || !a_out)
+        return 0;
+
+    int compressed = isCompressed(a_key->_inheritor);
+    if(compressed) {
+        key_a_tmp_pub = malloc(SIDH_PUBKEY_LEN);
+        a_key->data = malloc(SIDH_COMPRESSED_PUBKEY_LEN);
+        if(key_a_tmp_pub == NULL || a_in == NULL) {
+            ret = 0;
+            DAP_DELETE(a_key->data);
+            a_in = NULL;
+            a_key->data = NULL;
+        }
     }
-        printf("расчёт для обмена ключами методом  %s\n", k->method_name);
-}
-    /* Alice's initial message */
-size_t dap_enc_sidh16_encode(OQS_KEX *k, void **alice_priv, uint8_t **alice_msg, size_t *alice_msg_len) {
-    gen = OQS_KEX_sidh_cln16_alice_0(k, &alice_priv, &alice_msg, &alice_msg_len);
-    if(gen != 1) {
-        printf("OQS_KEX_sidh_cln16_alice_0 lose..\n");
-        gen = 0;
-    }
-    PRINT_HEX_STRING("Alice message", alice_msg, alice_msg_len);
-}
-
-    /* Bob's response */
-size_t dap_enc_sidh16_decode(OQS_KEX *k, const uint8_t *alice_msg, const size_t alice_msg_len, uint8_t **bob_msg, size_t *bob_msg_len, uint8_t **bob_key, size_t *bob_key_len) {
-    gen = OQS_KEX_sidh_cln16_bob(k, alice_msg, alice_msg_len, &bob_msg, &bob_msg_len, &bob_key, &bob_key_len);
-    if(gen != 1){
-        printf("OQS_KEX_sidh_cln16_bob lose..\n");
-        gen = 0;
+    else {
+        // non-compressed key
+         a_key->data = malloc(SIDH_PUBKEY_LEN);
+         if(a_key->data == NULL) {
+             ret = 0;
+             DAP_DELETE(a_key->data = NULL);
+             a_key->data = NULL;
+             a_in = NULL;
+         }
+         key_a_tmp_pub = a_key->data;
     }
-    PRINT_HEX_STRING("Bob message", bob_msg, bob_msg_len);
-    PRINT_HEX_STRING("Bob session key", bob_key, bob_key_len);
-}
-
-    /* Alice processes Bob's response */
-void dap_enc_sidh16_key_new_from_data(OQS_KEX *k, const void *alice_priv, const uint8_t *bob_msg, const size_t bob_msg_len, uint8_t **key, size_t *key_len) {
-    gen = OQS_KEX_sidh_cln16_alice_1(k, alice_priv, bob_msg, bob_msg_len, &alice_key, &alice_key_len);
-    if(gen != 1) {
-        printf("OQS_KEX_sidh_cln16_alice_1 lose..\n");
-        gen = 0;
+    a_in = malloc(SIDH_SECRETKEY_LEN);
+    if(a_in == NULL) {
+        ret = 0;
+        DAP_DELETE(a_key->data = NULL);
+        a_key->data = NULL;
+        a_in = NULL;
     }
-    PRINT_HEX_STRING("Alice session key", alice_key, alice_key_len)
 
-
-    /*compare session key lengths and values*/
-    if(alice_key_len != bob_key_len) {
-        printf("ERROR: Alice's session key and Bob's session key are different lengths (%zu vs %zu)\n", alice_key_len, bob_key_len);
-        gen = 0;
+    // generate A key pair
+    if(oqs_sidh_cln16_EphemeralKeyGeneration_A((unsigned char *)a_in, (unsigned char *)key_a_tmp_pub, sidh_a_key->user_curveIsogeny, sidh_a_key->rand) != SIDH_CRYPTO_SUCCESS) {
+        ret = 0;
+        DAP_DELETE(a_key->data = NULL);
+        a_key->data = NULL;
+        a_in = NULL;
     }
-    gen = memcmp(alice_key, bob_key, alice_key_len);
-    if(gen != 0){
-        printf("ERROR: Alice's session key and Bob's session key are not equal\n");
-        PRINT_HEX_STRING("Alice session key", alice_key, alice_key_len);
-        PRINT_HEX_STRING("Bob session key", bob_key, bob_key_len);
-
-        // здесь сделать запись ключа в файл
-
-        gen = 0;
+    if (compressed) {
+        // compress Alice's public key
+        oqs_sidh_cln16_PublicKeyCompression_A(key_a_tmp_pub, (unsigned char *) a_in, sidh_a_key->user_curveIsogeny);
+        a_in_size = SIDH_COMPRESSED_PUBKEY_LEN;
+    } else {
+        a_in_size = SIDH_PUBKEY_LEN;
+        key_a_tmp_pub = NULL;
     }
-     printf("Alice and Bob's session keys match.\n");
-     printf("\n\n");
 
-    gen = 1;
+    ret = 1;
+    DAP_DELETE(key_a_tmp_pub);
+    return ret;
 }
 
-void dap_enc_sidh16_key_delete() {
-    free(alice_msg);
-    free(alice_key);
-    free(bob_msg);
-    free(bob_key);
-    OQS_KEX_sidh_cln16_alice_priv_free(k, alignce_priv);
-    OQS_KEX_sidh_cln16_free(k);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 
 
+// int OQS_KEX_sidh_cln16_bob(OQS_KEX *k, const uint8_t *alice_msg, const size_t alice_msg_len, uint8_t **bob_msg, size_t *bob_msg_len, uint8_t **key, size_t *key_len)
+size_t dap_enc_sidh16_decode(struct dap_enc_key *a_key, const void *a_in, size_t a_in_size, void *a_out) {
+    size_t ret;
+    dap_enc_sidh16_key_t *sidh_a_key = DAP_ENC_SIDH16_KEY(a_key);
+    uint8_t *bob_priv = NULL;
+    // non-compressed public key
+    uint8_t *bob_tmp_pub = NULL;
+    // decompession values
+    unsigned char *R = NULL, *A = NULL;
 
+    if(!a_key || !a_in || !a_out){
+        return 0;
+    }
 
+    a_out = NULL;
+    a_key->data = NULL;
+
+    int compressed = isCompressed(a_key->_inheritor);
+
+    if(compressed) {
+        if(sidh_a_key->alice_msg_len != SIDH_COMPRESSED_PUBKEY_LEN) {
+            ret = 0;
+            DAP_DELETE(a_out);
+            a_out = NULL;
+            DAP_DELETE(a_key->data);
+            a_key->data = NULL;
+        }
+        bob_tmp_pub = malloc(SIDH_PUBKEY_LEN);
+        a_out = malloc(SIDH_COMPRESSED_PUBKEY_LEN);
+        if(bob_tmp_pub == NULL || a_out == NULL) {
+            ret = 0;
+            DAP_DELETE(a_out);
+            a_out = NULL;
+            DAP_DELETE(a_key->data);
+            a_key->data = NULL;
+        }
+        A = malloc(SIDH_COMPRESSED_A_LEN);
+        if(A == NULL) {
+            ret = 0;
+            DAP_DELETE(a_out);
+            a_out = NULL;
+            DAP_DELETE(a_key->data);
+            a_key->data = NULL;
+        }
+        R = malloc(SIDH_COMPRESSED_R_LEN);
+        if(R == NULL) {
+            ret = 0;
+            DAP_DELETE(a_out);
+            a_out = NULL;
+            DAP_DELETE(a_key->data);
+            a_key->data = NULL;
+        }
+    }
+    else {
+        if(sidh_a_key->alice_msg_len != SIDH_PUBKEY_LEN) {
+            ret = 0;
+            DAP_DELETE(a_out);
+            a_out = NULL;
+            DAP_DELETE(a_key->data);
+            a_key->data = NULL;
+        }
+        // non-compressed
+        a_out = malloc(SIDH_PUBKEY_LEN);
+        if(a_out == NULL) {
+            ret = 0;
+            DAP_DELETE(a_out);
+            a_out = NULL;
+            DAP_DELETE(a_key->data);
+            a_key->data = NULL;
+        }
+        bob_tmp_pub = a_out;    // point to the pub key
+    }
 
+    bob_priv = malloc(SIDH_SECRETKEY_LEN);
+    if(bob_priv == NULL){
+        ret = 0;
+        DAP_DELETE(a_out);
+        a_out = NULL;
+        DAP_DELETE(a_key->data);
+        a_key->data = NULL;
+    }
+    a_key->data = malloc(SIDH_SHAREDKEY_LEN);
+    if(a_key->data == NULL) {
+        ret = 0;
+        DAP_DELETE(a_out);
+        a_out = NULL;
+        DAP_DELETE(a_key->data);
+        a_key->data = NULL;
+    }
 
+    // generate Bob's key pair
+    if(oqs_sidh_cln16_EphemeralKeyGeneration_B((unsigned char *) bob_priv, (unsigned char *) bob_tmp_pub, sidh_a_key->user_curveIsogeny, sidh_a_key->rand) != SIDH_CRYPTO_SUCCESS) {
+        ret = 0;
+        DAP_DELETE(a_out);
+        a_out = NULL;
+        DAP_DELETE(a_key->data);
+        a_key->data = NULL;
+    }
+    if(compressed) {
+        // compress Bob's public key
+        oqs_sidh_cln16_PublicKeyCompression_B(bob_tmp_pub, (unsigned char *) a_out, sidh_a_key->user_curveIsogeny);
+        sidh_a_key->bob_msg_len = SIDH_COMPRESSED_PUBKEY_LEN;
+        // decompress Alice's public key
+        oqs_sidh_cln16_PublicKeyADecompression_B((unsigned char *) bob_priv, (unsigned char *) a_in, R, A, sidh_a_key->user_curveIsogeny);
+        // compute Bob's shared secret
+        if(oqs_sidh_cln16_EphemeralSecretAgreement_Compression_B((unsigned char *) bob_priv, R, A, (unsigned char *) a_key->data, sidh_a_key->user_curveIsogeny) != SIDH_CRYPTO_SUCCESS) {
+            ret = 0;
+            DAP_DELETE(a_out);
+            a_out = NULL;
+            DAP_DELETE(a_key->data);
+            a_key->data = NULL;
+        }
+    } else {
+       sidh_a_key->bob_msg_len = SIDH_PUBKEY_LEN;
+        bob_tmp_pub = NULL;  // we do not want to double-free it
+        // compute Bob's shared secret
+        if(oqs_sidh_cln16_EphemeralSecretAgreement_B((unsigned char *) bob_priv, (unsigned char *) a_in, (unsigned char *) a_key->data, sidh_a_key->user_curveIsogeny) != SIDH_CRYPTO_SUCCESS) {
+            ret = 0;
+            DAP_DELETE(a_out);
+            a_out = NULL;
+            DAP_DELETE(a_key->data);
+            a_key->data = NULL;
+        }
+    }
+    sidh_a_key->key_len = SIDH_SHAREDKEY_LEN;
+    ret = 1;
+    DAP_DELETE(bob_tmp_pub);
+    DAP_DELETE(bob_priv);
+    DAP_DELETE(A);
+    DAP_DELETE(R);
+
+    return ret;
+}
 
 
+int OQS_KEX_sidh_cln16_alice_1(OQS_KEX *k, const void *alice_priv, const uint8_t *bob_msg, const size_t bob_msg_len, uint8_t **key, size_t *key_len) {
 
+    int ret;
+    // decompression values
+    unsigned char *R = NULL, *A = NULL;
 
+    if (!k || !alice_priv || !bob_msg || !key || !key_len) {
+        return 0;
+    }
 
+    *key = NULL;
 
+    int compressed = isCompressed(k->named_parameters);
 
+    *key = malloc(SIDH_SHAREDKEY_LEN);
+    if (*key == NULL) {
+        goto err;
+    }
+    *key_len = SIDH_SHAREDKEY_LEN;
+
+    if (compressed) {
+        if (bob_msg_len != SIDH_COMPRESSED_PUBKEY_LEN) {
+            goto err;
+        }
+        A = malloc(SIDH_COMPRESSED_A_LEN);
+        if (A == NULL) {
+            goto err;
+        }
+        R = malloc(SIDH_COMPRESSED_R_LEN);
+        if (R == NULL) {
+            goto err;
+        }
+        // compute Alice's shared secret
+        oqs_sidh_cln16_PublicKeyBDecompression_A((unsigned char *) alice_priv, (unsigned char *) bob_msg, R, A, k->ctx);
+        if (oqs_sidh_cln16_EphemeralSecretAgreement_Compression_A((unsigned char *) alice_priv, R, A, (unsigned char *) *key, k->ctx) != SIDH_CRYPTO_SUCCESS) {
+            goto err;
+        }
+    } else {
+        if (bob_msg_len != SIDH_PUBKEY_LEN) {
+            goto err;
+        }
+        if (oqs_sidh_cln16_EphemeralSecretAgreement_A((unsigned char *) alice_priv, (unsigned char *) bob_msg, (unsigned char *) *key, k->ctx) != SIDH_CRYPTO_SUCCESS) {
+            goto err;
+        }
+    }
 
+    ret = 1;
+    goto cleanup;
 
+err:
+    ret = 0;
+    DAP_DELETE(*key);
+    *key = NULL;
 
+cleanup:
+    DAP_DELETE(A);
+    DAP_DELETE(R);
 
+    return ret;
+}
diff --git a/crypto/dap_enc_sidh16.h b/crypto/dap_enc_sidh16.h
index a3ee502a18d346b23ea954614aac80f18df8f490..169cea09bd92b0e12d1e0784f25c456431336bd6 100644
--- a/crypto/dap_enc_sidh16.h
+++ b/crypto/dap_enc_sidh16.h
@@ -1,27 +1,51 @@
 #ifndef _DAP_ENC_SIDH16_H_
 #define _DAP_ENC_SIDH16_H_
 
+#include <stdlib.h>
+#include <stdio.h>
 #include <stddef.h>
-#include "liboqs/kex/kex.h"
-#include "liboqs/crypto/rand/rand.h"
+#include <stdint.h>
+#include <string.h>
+#include <stdbool.h>
 
-struct dap_enc_key;
-
-// OQS_KEX_sidh_cln16_new
-int dap_enc_sidh16_key_new_generate(OQS_RAND *rand, const char *named_parameters);
+#include "dap_common.h"
+#include "dap_enc_key.h"
+#include <../libdap/crypto/liboqs/kex_sidh_cln16/SIDH.h>
+#include <../libdap/crypto/liboqs/kex/kex.h>
 
-// OQS_KEX_sidh_cln16_alice_1
-void dap_enc_sidh16_key_new_from_data(OQS_KEX *k, const void *alice_priv, const uint8_t *bob_msg, const size_t bob_msg_len, uint8_t **key, size_t *key_len);
 
-// OQS_KEX_sidh_cln16_alice_priv_free
-// OQS_KEX_sidh_cln16_free
-void dap_enc_sidh16_key_delete();
 
-// OQS_KEX_sidh_cln16_alice_0
-size_t dap_enc_sidh16_encode(OQS_KEX *k, void **alice_priv, uint8_t **alice_msg, size_t *alice_msg_len);
-
-// OQS_KEX_sidh_cln16_bob
-size_t dap_enc_sidh16_decode(OQS_KEX *k, const uint8_t *alice_msg, const size_t alice_msg_len, uint8_t **bob_msg, size_t *bob_msg_len, uint8_t **key, size_t *key_len);
+struct dap_enc_key;
 
+extern bool dap_sidh16_CurveIsogenyStruct_isnull(PCurveIsogenyStruct pCurveIsogeny);
+
+typedef struct dap_enc_sidh16_key{
+    OQS_RAND *rand;
+    void * user_curveIsogeny;
+    unsigned int alice_msg_len;
+    unsigned int bob_msg_len;
+    unsigned int key_len;
+    uint16_t estimated_classical_security;
+    uint16_t estimated_quantum_security;
+} dap_enc_sidh16_key_t;
+
+struct dapenc_testcase {
+    enum OQS_KEX_alg_name alg_name;
+    unsigned char *seed;
+    size_t seed_len;
+    char *named_parameters;
+    char *id;
+    int run;
+    int iter;
+};
+
+#define DAP_ENC_SIDH16_KEY(a) ((dap_enc_sidh16_key_t *)((a)->_inheritor))
+
+dap_enc_key_t *dap_enc_sidh16_key_new_generate(struct dap_enc_key* a_key, size_t a_size);                            // new
+void dap_enc_sidh16_key_new_from_data(struct dap_enc_key* a_key, const void* a_in, size_t a_in_size);     // alice_1
+void dap_enc_sidh16_key_delete(struct dap_enc_key* a_key);                                                // sidh_cln16_alice_priv_free // sidh_cln16_free
+
+size_t dap_enc_sidh16_encode(struct dap_enc_key* a_key, const void* a_in, size_t a_in_size, void* a_out); // alice_0
+size_t dap_enc_sidh16_decode(struct dap_enc_key* a_key, const void* a_in, size_t a_in_size, void* a_out); // bob
 
 #endif