From 0a7e2dda9a14744fdf76489808ac660935a47cf5 Mon Sep 17 00:00:00 2001
From: Ivan Deniskin <ivanmordwin@yandex.ru>
Date: Mon, 18 Jun 2018 14:46:34 +0300
Subject: [PATCH] Aes and Msrln updated, little changes in dap-client

---
 client/.vscode/tasks.json                     |  34 +++++
 client/CMakeLists.txt                         |  15 ++-
 client/dap_client.c                           |   2 +-
 client/dap_client.h                           |  18 +--
 client/dap_client_internal.c                  |  30 ++++-
 core/dap_common.c                             |   2 +-
 crypto/dap_enc_aes.c                          |  25 +++-
 crypto/dap_enc_aes.h                          |   2 +
 crypto/dap_enc_msrln16.c                      | 123 ++++++------------
 crypto/dap_enc_msrln16.h                      |   4 +-
 crypto/liboqs/crypto/rand/rand.h              |   9 --
 .../kex_rlwe_msrln16/kex_rlwe_msrln16.h       |   8 --
 crypto/liboqs/kex_sidh_cln16/kex_sidh_cln16.c |  59 +++++++++
 http/CMakeLists.txt                           |   2 +
 http/dap_http_client.c                        |   6 +-
 http/dap_http_client.h                        |   1 +
 16 files changed, 213 insertions(+), 127 deletions(-)
 create mode 100644 client/.vscode/tasks.json

diff --git a/client/.vscode/tasks.json b/client/.vscode/tasks.json
new file mode 100644
index 0000000..b9ffc5d
--- /dev/null
+++ b/client/.vscode/tasks.json
@@ -0,0 +1,34 @@
+{
+    // See https://go.microsoft.com/fwlink/?LinkId=733558
+    // for the documentation about the tasks.json format
+    "version": "2.0.0",
+    "options": {
+        "cwd": "${workspaceRoot}/build"
+    },
+    "tasks": [
+        {
+            "label": "cmake",
+            "type": "shell",
+            "command": "cmake",
+            "args": [
+                "../",
+                "-G",
+                "'Unix Makefiles'",
+                "-DCMAKE_BUILD_TYPE=Debug"
+            ],
+            "group": {
+                "kind": "build",
+                "isDefault": true
+            }
+        },
+        {
+            "label": "make",
+            "command": "make",
+            "args": [
+                "-j",
+                "8"
+            ],
+            "problemMatcher": []
+        }
+    ]
+}
\ No newline at end of file
diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt
index cf25b42..b349940 100644
--- a/client/CMakeLists.txt
+++ b/client/CMakeLists.txt
@@ -1,17 +1,26 @@
 cmake_minimum_required(VERSION 2.8)
 project (dap_client)
-  
-set(CLIENT_SRCS dap_client.c dap_client_internal.c dap_client_remote.c)
+
+set(CMAKE_VERBOSE_MAKEFILE ON)
+set(CMAKE_COLOR_MAKEFILE   ON)
+set (CMAKE_CXX_STANDARD 11)
+
+set(CLIENT_SRCS dap_client.c dap_client_internal.c dap_client_remote.c sxmlc/sxmlc.c sxmlc/sxmlsearch.c)
  
 add_library(${PROJECT_NAME} STATIC ${CLIENT_SRCS})
 
 include_directories("${dap_core_INCLUDE_DIRS}")
 include_directories("${dap_crypto_INCLUDE_DIRS}")
-#include_directories("${dap_http_INCLUDE_DIRS}")
+include_directories("${dap_http_INCLUDE_DIRS}")
+include_directories("${dap_core_server_INCLUDE_DIRS}")
 add_definitions ("${dap_core_DEFINITIONS}")
 add_definitions ("${dap_crypto_DEFINITIONS}")
 add_definitions ("${dap_http_DEFINITIONS}")
+add_definitions ("${dap_core_server_DEFINITIONS}")
 
 set(${PROJECT_NAME}_DEFINITIONS CACHE INTERNAL "${PROJECT_NAME}: Definitions" FORCE)
 
 set(${PROJECT_NAME}_INCLUDE_DIRS ${PROJECT_SOURCE_DIR} CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE)
+
+
+
diff --git a/client/dap_client.c b/client/dap_client.c
index ff0c0c8..ae2ed40 100644
--- a/client/dap_client.c
+++ b/client/dap_client.c
@@ -2,7 +2,7 @@
 
 #include "dap_common.h"
 
-#include "../http/dap_http_client.h"
+#include "dap_http_client.h"
 
 #include "dap_client.h"
 #include "dap_client_internal.h"
diff --git a/client/dap_client.h b/client/dap_client.h
index dfcc158..d83a887 100644
--- a/client/dap_client.h
+++ b/client/dap_client.h
@@ -12,11 +12,11 @@ typedef struct dap_enc_key dap_enc_key_t;
 typedef enum dap_client_stage {
     DAP_CLIENT_STAGE_BEGIN=0,
     DAP_CLIENT_STAGE_ENC=1,
-    DAP_CLIENT_STAGE_AUTH=2,
-    DAP_CLIENT_STAGE_STREAM_CTL=3,
-    DAP_CLIENT_STAGE_STREAM=4,
-    DAP_CLIENT_STAGE_NETCONF=5,
-    DAP_CLIENT_STAGE_TUNNEL=6,
+    DAP_CLIENT_STAGE_STREAM_CTL=2,
+    DAP_CLIENT_STAGE_STREAM=3,
+    DAP_CLIENT_STAGE_NETCONF=4,
+    DAP_CLIENT_STAGE_TUNNEL=5,
+    DAP_CLIENT_STAGE_AUTH=6
 } dap_client_stage_t;
 
 typedef enum dap_client_stage_status {
@@ -60,10 +60,10 @@ typedef void (*dap_client_callback_t) (dap_client_t *, void*);
 typedef void (*dap_client_callback_int_t) (dap_client_t *, int);
 typedef void (*dap_client_callback_data_size_t) (dap_client_t *, void *, size_t);
 
-#define DAP_UPLINK_PATH_ENC_INIT "handshake"
-#define DAP_UPLINK_PATH_DB "db"
-#define DAP_UPLINK_PATH_STREAM_CTL "stream_ctl"
-#define DAP_UPLINK_PATH_STREAM "stream"
+#define DAP_UPLINK_PATH_ENC_INIT "1901248124123459"
+#define DAP_UPLINK_PATH_DB "01094787531354"
+#define DAP_UPLINK_PATH_STREAM_CTL "091348758013553"
+#define DAP_UPLINK_PATH_STREAM "874751843144"
 #define DAP_UPLINK_PATH_LICENSE "license"
 
 #ifdef __cplusplus
diff --git a/client/dap_client_internal.c b/client/dap_client_internal.c
index ea59028..a4edd1a 100644
--- a/client/dap_client_internal.c
+++ b/client/dap_client_internal.c
@@ -13,7 +13,7 @@
 #include "liboqs/kex/kex.h"
 #include "dap_enc_msrln16.h"
 
-#include "../http/dap_http_client_simple.h"
+#include "dap_http_client_simple.h"
 #include "dap_client_internal.h"
 
 #define LOG_TAG "dap_client_internal"
@@ -176,11 +176,29 @@ static void s_stage_status_after(dap_client_internal_t * a_client_internal)
                              a_client_internal->uplink_password, DAP_CLIENT_PROTOCOL_VERSION);
                     log_it(L_DEBUG,"STREAM_CTL request size %u",strlen(l_request));
 
+                    a_client_internal->uplink_protocol_version = DAP_PROTOCOL_VERSION;
+
                     dap_client_internal_request_enc(a_client_internal,
                                                    DAP_UPLINK_PATH_STREAM_CTL,
                                                     "socket_forward","sf=1",l_request,l_request_size,
                                                     m_stream_ctl_response, m_stream_ctl_error);
                 }break;
+                case DAP_CLIENT_STAGE_STREAM:{
+                    log_it(L_INFO,"Go to stage STREAM: prepare the request");
+
+                    size_t l_request_size = strlen( a_client_internal->uplink_user)
+                            + strlen( a_client_internal->uplink_password)+2+10;
+                    char *l_request = DAP_NEW_Z_SIZE (char,l_request_size) ;
+
+                    snprintf(l_request, l_request_size,"%s %s %d",a_client_internal->uplink_user,
+                             a_client_internal->uplink_password, DAP_CLIENT_PROTOCOL_VERSION);
+                    log_it(L_DEBUG,"STREAM request size %u",strlen(l_request));
+
+                    dap_client_internal_request_enc(a_client_internal,
+                                                   DAP_UPLINK_PATH_STREAM,
+                                                    "socket_forward","sf=1",l_request,l_request_size,
+                                                    m_stream_ctl_response, m_stream_ctl_error);
+                }break;
                 default:{
                     log_it(L_ERROR,"Undefined proccessing actions for stage status %s",
                                 dap_client_stage_status_str(a_client_internal->stage_status));
@@ -296,10 +314,10 @@ void dap_client_internal_request_enc(dap_client_internal_t * a_client_internal,
     snprintf(l_url,1024,"http://%s:%u",a_client_internal->uplink_addr, a_client_internal->uplink_port );
     l_url_size = strlen(l_url);
 
-    char *l_sub_url_enc = l_sub_url_size ? (char*) calloc(1,2*l_sub_url_size+16 ): NULL;
-    char *l_query_enc = l_query_size ? (char*) calloc(1,l_query_size*2+16 ):NULL;
+    char *l_sub_url_enc = l_sub_url_size ? (char*) calloc(1,2*(l_sub_url_size+16) ): NULL;
+    char *l_query_enc = l_query_size ? (char*) calloc(1,(l_query_size+16)*2):NULL;
 
-    size_t l_url_full_size_max  = 2*l_sub_url_size + 2*l_query_size + 5 + l_url_size;
+    size_t l_url_full_size_max  = 2*l_sub_url_size + 2*(l_query_size+16) + 5 + l_url_size;
     char * l_url_full = (char*) calloc(1, l_url_full_size_max);
 
     size_t l_request_enc_size_max = a_request_size ?a_request_size*2+16 : 0;
@@ -430,6 +448,10 @@ void m_enc_init_response(dap_client_t * a_client, void * a_response,size_t a_res
             dap_enc_msrln16_key_t* msrln16_key = DAP_ENC_KEY_TYPE_RLWE_MSRLN16(s_key_domain);
             OQS_KEX_rlwe_msrln16_alice_1(msrln16_key->kex, msrln16_key->private_key, encoded_msg, 2048,&msrln16_key->public_key,&msrln16_key->public_length);
             aes_key_from_msrln_pub(s_key_domain);
+            l_client_internal->session_key_id = (char*)malloc(33);
+            memcpy(l_client_internal->session_key_id,encoded_key,33);
+            l_client_internal->session_key_id[32] = 0;
+            l_client_internal->session_key = s_key_domain;
             free(encoded_key);
             free(encoded_msg);
             l_client_internal->stage_status = DAP_CLIENT_STAGE_STATUS_DONE;
diff --git a/core/dap_common.c b/core/dap_common.c
index 21e3bb9..bab79df 100644
--- a/core/dap_common.c
+++ b/core/dap_common.c
@@ -74,7 +74,7 @@ int dap_common_init( const char * a_log_file )
 	return 0;
 }
 
-void common_deinit()
+void dap_common_deinit()
 {
     if(s_log_file) fclose(s_log_file);
 }
diff --git a/crypto/dap_enc_aes.c b/crypto/dap_enc_aes.c
index 5ca1f87..4131396 100755
--- a/crypto/dap_enc_aes.c
+++ b/crypto/dap_enc_aes.c
@@ -5,8 +5,8 @@
 #include "dap_enc_aes.h"
 #include "dap_enc_key.h"
 
+uint8_t tail_block[] =  {21,27,20,36,16,20,27,31,22,41,27,33,30,21,32,28};
 
-#define AES_BLOCKSIZE 16
 #define AES_KEYSIZE 16
 
 #define DAP_ENC_AES_KEY(a) ((dap_enc_aes_key_t *)((a)->_inheritor) )
@@ -102,8 +102,14 @@ void dap_enc_aes_key_new_from_data(struct dap_enc_key * a_key, const void * a_in
  */
 size_t dap_enc_aes_decode(struct dap_enc_key* a_key, const void * a_in, size_t a_in_size,void * a_out)
 {
-	OQS_AES128_ECB_dec(a_in,a_in_size,a_key->data,a_out);
-	return sizeof(a_in);
+	if(a_in_size % 16 != 0)
+		return 0;
+    OQS_AES128_ECB_dec(a_in,a_in_size,a_key->data,a_out);
+    int tail = 0;
+	for(int i =a_in_size-1; i > a_in_size-15; i--)
+		if(*(char*)(a_out + i) == (char)tail_block[i%16])
+			tail++;  
+	return a_in_size - tail;
 }
 
 /**
@@ -116,6 +122,15 @@ size_t dap_enc_aes_decode(struct dap_enc_key* a_key, const void * a_in, size_t a
  */
 size_t dap_enc_aes_encode(struct dap_enc_key* a_key, const void * a_in, size_t a_in_size,void * a_out)
 {
-	OQS_AES128_ECB_enc(a_in,a_in_size,a_key->data,a_out);
-	return sizeof(a_in);
+    int tail = 0;
+    if(a_in_size < 16)
+        tail = 16 - a_in_size;
+    else
+        tail = 16 - a_in_size % 16;
+    void * a_in_new = (void*)malloc(a_in_size + tail);
+    memcpy(a_in_new,a_in,a_in_size);
+    uint8_t* pointer = &tail_block;
+    memcpy(a_in_new+a_in_size,pointer+(16-tail),tail);
+    OQS_AES128_ECB_enc(a_in_new,a_in_size+tail,a_key->data,a_out);
+    return a_in_size + tail;
 }
diff --git a/crypto/dap_enc_aes.h b/crypto/dap_enc_aes.h
index cd41434..611b4cc 100755
--- a/crypto/dap_enc_aes.h
+++ b/crypto/dap_enc_aes.h
@@ -4,6 +4,8 @@
 #include <stddef.h>
 #include <stdint.h>
 
+#define AES_BLOCK_SIZE 16
+
 struct dap_enc_key;
 
 void dap_enc_aes_key_new_generate(struct dap_enc_key * a_key,size_t a_size);
diff --git a/crypto/dap_enc_msrln16.c b/crypto/dap_enc_msrln16.c
index 61bc3eb..afbb586 100644
--- a/crypto/dap_enc_msrln16.c
+++ b/crypto/dap_enc_msrln16.c
@@ -1,5 +1,6 @@
 #include "dap_common.h"
 #include "dap_enc_msrln16.h"
+#include "dap_enc_aes.h"
 
 #include "liboqs/crypto/rand/rand.h"
 #include "liboqs/kex_rlwe_msrln16/kex_rlwe_msrln16.h"
@@ -7,6 +8,7 @@
 
 #define LOG_TAG "dap_enc_msrln16"
 
+
 OQS_KEX *kex = NULL;
 
 void *alignce_priv = NULL;
@@ -20,14 +22,6 @@ size_t bob_msg_len;
 uint8_t *bob_key = NULL;
 size_t bob_key_len;
 
-/*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;*/
 
 #define PRINT_HEX_STRING(label, str, len)                        \
     {   size_t i;                                                \
@@ -41,8 +35,9 @@ typedef struct dap_enc_sidh16_key{
 
 /**
  * @brief dap_enc_msrln16_key_new_generate
- * @param rand
- * @return
+ * @param a_key Struct for new key
+ * @param a_size Not used
+ * @return Size of a new key
  */
 
 size_t dap_enc_msrln16_key_new_generate(struct dap_enc_key* a_key, size_t a_size)//(OQS_RAND* rand)
@@ -55,6 +50,8 @@ size_t dap_enc_msrln16_key_new_generate(struct dap_enc_key* a_key, size_t a_size
 
     a_key->type = DAP_ENC_KEY_TYPE_RLWE_MSRLN16;
     a_key->last_used_timestamp;
+    a_key->dec=dap_enc_aes_decode;
+    a_key->enc=dap_enc_aes_encode;
     dap_enc_msrln16_key_t *msrln16_a_key = DAP_ENC_KEY_TYPE_RLWE_MSRLN16(a_key);
     msrln16_a_key->private_key = NULL;
 
@@ -73,31 +70,7 @@ size_t dap_enc_msrln16_key_new_generate(struct dap_enc_key* a_key, size_t a_size
 
 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);
-    if(gen != 1) {
-        printf("OQS_KEX_rlwe_msrln16_alice_1 lose..\n");
-        gen = 0;
-    }
-    PRINT_HEX_STRING("Alice session key", alice_key, alice_key_len);
-
-   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;
-            }
-   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;
-      }
-       printf("Alice and Bob's session keys match.\n");
-       printf("\n\n");
-
-      gen = 1;*/
 
 }
 
@@ -112,17 +85,34 @@ void dap_enc_msrln16_key_new_from_data_public(dap_enc_key_t * a_key, const void
 
 }
 
+/**
+ * @brief dap_kex_rlwe_msrln16_new
+ * @param a_key
+ * @param a_in
+ * @param a_in_size
+ */
 OQS_KEX *dap_kex_rlwe_msrln16_new(OQS_RAND *rand){
     return OQS_KEX_rlwe_msrln16_new(rand);
 }
 
+/**
+ * @brief dap_rlwe_msrln16_alice_0
+ * @param a_key
+ * @param a_in
+ * @param a_in_size
+ */
 int dap_rlwe_msrln16_alice_0(OQS_KEX *k, void **alice_priv, uint8_t **alice_msg, size_t *alice_msg_len){
     return OQS_KEX_rlwe_msrln16_alice_0(k, alice_priv, alice_msg, alice_msg_len);
 }
 
+/**
+ * @brief dap_rlwe_msrln16_alice_1
+ * @param a_key
+ * @param a_in
+ * @param a_in_size
+ */
 int dap_rlwe_msrln16_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){
     return OQS_KEX_rlwe_msrln16_alice_1(k,alice_priv,bob_msg,bob_msg_len,key,key_len);
-
 }
 
 /**
@@ -131,32 +121,12 @@ int dap_rlwe_msrln16_alice_1(OQS_KEX *k, const void *alice_priv, const uint8_t *
  */
 void dap_enc_msrln16_key_delete(struct dap_enc_key* a_key)
 {
-    //dap_enc_sidh16_key_t *sidh_a_key = DAP_ENC_SIDH16_KEY(a_key);
     dap_enc_msrln16_key_t* msrln_a_key = DAP_ENC_KEY_TYPE_RLWE_MSRLN16(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);
- //   free();
-    /*free(alice_msg);
-    free(alice_key);
-    free(bob_msg);
-    free(bob_key);*/
-    /*if (alice_priv) {*/
-        //free(alice_priv);
-    /*}*/
-    //OQS_KEX k = a_key->
-//    if (!k) {
-//        return;
-//    }
-//    free(k->method_name);
-//    k->method_name = NULL;
-//    free(k);
-//    /*OQS_KEX_rlwe_msrln16_alice_priv_free(kex, alignce_priv);
-   /* OQS_KEX_rlwe_msrln16_free(kex);*/
+    (void) a_key;
+    if(!a_key){
+        return;
+    }
+    DAP_DELETE(a_key);
 }
 
 /**
@@ -191,18 +161,9 @@ size_t dap_enc_msrln16_key_public_raw(dap_enc_key_t *a_key, void ** a_key_public
  * @param key_len
  * @return
  */
-//Боб отвечает на приветствие
-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)
+size_t dap_enc_msrln16_decode(struct dap_enc_key* a_key, const void * a_in, size_t a_in_size,void * a_out)
 {
-    /*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);*/
-
+    return dap_enc_aes_decode(a_key,a_in,a_in_size,a_out);
 }
 
 /**
@@ -213,22 +174,20 @@ size_t dap_enc_msrln16_decode(OQS_KEX *k, const uint8_t *alice_msg, const size_t
  * @param alice_msg_len
  * @return
  */
-
-
-//Алиса приветствует
-size_t dap_enc_msrln16_encode(OQS_KEX *k, void **alice_priv, uint8_t **alice_msg, size_t *alice_msg_len)
+size_t dap_enc_msrln16_encode(struct dap_enc_key* a_key, const void * a_in, size_t a_in_size,void * a_out)
 {
-    /*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);*/
+    return dap_enc_aes_encode(a_key,a_in,a_in_size,a_out);
 }
 
-
+/**
+ * @brief aes_key_from_msrln_pub
+ * @param key Key for conversion
+ */
 void aes_key_from_msrln_pub(dap_enc_key_t* key){
-    //TODO: More difflicult aes generation
     dap_enc_msrln16_key_t* msrln_key = DAP_ENC_KEY_TYPE_RLWE_MSRLN16(key);
     key->data = (unsigned char *)malloc(16);
     memcpy(key->data,msrln_key->public_key,16);
+    key->data_size = 16;
 }
+
+
diff --git a/crypto/dap_enc_msrln16.h b/crypto/dap_enc_msrln16.h
index 583ef4e..11b39d2 100644
--- a/crypto/dap_enc_msrln16.h
+++ b/crypto/dap_enc_msrln16.h
@@ -43,8 +43,8 @@ void dap_enc_msrln16_key_delete(struct dap_enc_key* a_key);
 /*?*/size_t dap_enc_msrln16_key_public_raw(dap_enc_key_t *a_key, void ** a_key_public);
 
 //size_t dap_enc_msrln16_decode(dap_enc_key_t* a_key, const void * a_in, size_t a_in_size,void * a_out);
-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);
-size_t dap_enc_msrln16_encode(OQS_KEX *k, void **alice_priv, uint8_t **alice_msg, size_t *alice_msg_len);
+size_t dap_enc_msrln16_decode(struct dap_enc_key* a_key, const void * a_in, size_t a_in_size,void * a_out);
+size_t dap_enc_msrln16_encode(struct dap_enc_key* a_key, const void * a_in, size_t a_in_size,void * a_out);
 //size_t dap_enc_msrln16_encode(dap_enc_key_t* a_key, const void * a_in, size_t a_in_size,void * a_out);
 void aes_key_from_msrln_pub(dap_enc_key_t* key);
 
diff --git a/crypto/liboqs/crypto/rand/rand.h b/crypto/liboqs/crypto/rand/rand.h
index bf5af4e..710e449 100644
--- a/crypto/liboqs/crypto/rand/rand.h
+++ b/crypto/liboqs/crypto/rand/rand.h
@@ -9,10 +9,6 @@
 #include <stddef.h>
 #include <stdint.h>
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 enum OQS_RAND_alg_name {
 	OQS_RAND_alg_default,
 	OQS_RAND_alg_urandom_chacha20,
@@ -99,9 +95,4 @@ double OQS_RAND_zscore_deviation_from_uniform(const unsigned long occurrences[25
 void OQS_RAND_report_statistics(const unsigned long occurrences[256], const char *indent);
 
 int OQS_RAND_get_system_entropy(uint8_t *buf, size_t n);
-
-#ifdef __cplusplus
-}
-#endif
-
 #endif
diff --git a/crypto/liboqs/kex_rlwe_msrln16/kex_rlwe_msrln16.h b/crypto/liboqs/kex_rlwe_msrln16/kex_rlwe_msrln16.h
index 08cd3ff..77613a4 100644
--- a/crypto/liboqs/kex_rlwe_msrln16/kex_rlwe_msrln16.h
+++ b/crypto/liboqs/kex_rlwe_msrln16/kex_rlwe_msrln16.h
@@ -16,10 +16,6 @@
 /*#include <oqs/kex.h>
 #include <oqs/rand.h>*/
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 OQS_KEX *OQS_KEX_rlwe_msrln16_new(OQS_RAND *rand);
 
 int OQS_KEX_rlwe_msrln16_alice_0(OQS_KEX *k, void **alice_priv, uint8_t **alice_msg, size_t *alice_msg_len);
@@ -29,8 +25,4 @@ int OQS_KEX_rlwe_msrln16_alice_1(OQS_KEX *k, const void *alice_priv, const uint8
 void OQS_KEX_rlwe_msrln16_alice_priv_free(OQS_KEX *k, void *alice_priv);
 void OQS_KEX_rlwe_msrln16_free(OQS_KEX *k);
 
-#ifdef __cplusplus
-}
-#endif
-
 #endif
diff --git a/crypto/liboqs/kex_sidh_cln16/kex_sidh_cln16.c b/crypto/liboqs/kex_sidh_cln16/kex_sidh_cln16.c
index 178f983..5151901 100644
--- a/crypto/liboqs/kex_sidh_cln16/kex_sidh_cln16.c
+++ b/crypto/liboqs/kex_sidh_cln16/kex_sidh_cln16.c
@@ -241,7 +241,66 @@ cleanup:
 	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;
+	free(*key);
+	*key = NULL;
+
+cleanup:
+	free(A);
+	free(R);
+
+	return ret;
+}
 
 void OQS_KEX_sidh_cln16_alice_priv_free(UNUSED OQS_KEX *k, void *alice_priv) {
 	if (alice_priv) {
diff --git a/http/CMakeLists.txt b/http/CMakeLists.txt
index 247ce38..7a3ac86 100644
--- a/http/CMakeLists.txt
+++ b/http/CMakeLists.txt
@@ -8,8 +8,10 @@ target_link_libraries(${PROJECT_NAME}  curl)
 
 include_directories("${dap_core_INCLUDE_DIRS}")
 include_directories("${dap_client_INCLUDE_DIRS}")
+include_directories("${dap_http_server_INCLUDE_DIRS}")
 add_definitions ("${dap_core_DEFINITIONS}")
 add_definitions ("${dap_client_DEFINITIONS}")
+add_definitions ("${dap_http_server_DEFINITIONS}")
 
 set(${PROJECT_NAME}_DEFINITIONS CACHE INTERNAL "${PROJECT_NAME}: Definitions" FORCE)
 
diff --git a/http/dap_http_client.c b/http/dap_http_client.c
index 96da5a6..7739605 100644
--- a/http/dap_http_client.c
+++ b/http/dap_http_client.c
@@ -25,10 +25,10 @@
 #include <libgen.h>
 #include "dap_common.h"
 #include "dap_client_remote.h"
+#include "dap_http.h"
 
 #ifdef DAP_SERVER
-#include "dap_server.h"
-#include "dap_http.h"
+#include "../../libdap-server/core_server/dap_server.h"
 #endif
 #include "dap_http_header.h"
 #include "dap_http_client.h"
@@ -223,7 +223,7 @@ cnt:switch(cl_ht->state_read){
                         cl_ht->state_read=DAP_HTTP_CLIENT_STATE_HEADERS;
                     }
                     else{
-                        log_it(L_WARNINGNG, "Input: unprocessed URL request %s is rejected", d_name);
+                        log_it(L_WARNING, "Input: unprocessed URL request %s is rejected", d_name);
                         cl_ht->state_read=DAP_HTTP_CLIENT_STATE_NONE;
                         dap_client_ready_to_read(cl_ht->client,true);
                         dap_client_ready_to_write(cl_ht->client,true);
diff --git a/http/dap_http_client.h b/http/dap_http_client.h
index 4402ea7..01c48c0 100644
--- a/http/dap_http_client.h
+++ b/http/dap_http_client.h
@@ -74,6 +74,7 @@ typedef struct dap_http_client
     struct dap_http_url_proc * proc;
 
     void * _inheritor;
+    void * _internal;
 
 } dap_http_client_t;
 
-- 
GitLab