diff --git a/CMakeLists.txt b/CMakeLists.txt
index e83538a211f90e04be4a2d65c0fc897f264c2e05..fae4546942d8ffbd7b4116d4d9efd7ad55983973 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -17,4 +17,3 @@ endif()
 
 add_subdirectory(core)
 add_subdirectory(crypto)
-
diff --git a/core/unix/CMakeLists.txt b/core/unix/CMakeLists.txt
index 7679c21334908fb049c31c980759aefa1ebdd496..da6eb03154d78815fd34573db71fc5042713f538 100644
--- a/core/unix/CMakeLists.txt
+++ b/core/unix/CMakeLists.txt
@@ -20,3 +20,4 @@ target_include_directories(dap_core_unix INTERFACE .)
 if(LINUX)
     target_include_directories(dap_core_unix INTERFACE ./linux)
 endif()
+
diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt
index daeb534ab668bdb202b9f25561a279ac1b375b36..9388ac5a7ddecff17b6dfbdf038d3aa7a935e1e3 100755
--- a/crypto/CMakeLists.txt
+++ b/crypto/CMakeLists.txt
@@ -14,3 +14,5 @@ target_include_directories(dap_crypto PRIVATE rand iaes oaes sha3 msrln defeo_sc
 target_include_directories(dap_crypto INTERFACE . sha3)
 
 target_link_libraries(dap_crypto dap_core m)
+
+
diff --git a/crypto/dap_enc_bliss.c b/crypto/dap_enc_bliss.c
index 4610d36203672689100ba22694ac64412ebc95ba..29d6f60f0ce1ac948b2192cde5e937a0ca354b1f 100644
--- a/crypto/dap_enc_bliss.c
+++ b/crypto/dap_enc_bliss.c
@@ -22,13 +22,43 @@ void dap_enc_sig_bliss_key_new(struct dap_enc_key *key) {
     key->gen_alice_shared_key = (dap_enc_gen_alice_shared_key) dap_enc_sig_bliss_verify_sign;
 }
 
+/**
+ * @brief dap_enc_sig_bliss_key_pub_output_size
+ * @param l_key
+ * @return
+ */
+size_t dap_enc_sig_bliss_key_pub_output_size(struct dap_enc_key *l_key)
+{
+    (void) l_key;
+    return sizeof(bliss_public_key_t); // Always same, right?
+}
+
+/**
+ * @brief dap_enc_sig_bliss_key_pub_output
+ * @param l_key
+ * @param l_output
+ * @return
+ */
+int dap_enc_sig_bliss_key_pub_output(struct dap_enc_key *l_key, void * l_output)
+{
+    int32_t retcode;
+
+    retcode = bliss_b_public_key_extract( (bliss_public_key_t *) l_output,
+                                          (const bliss_private_key_t *) l_key->priv_key_data);
+    if (retcode != BLISS_B_NO_ERROR) {
+        log_it(L_CRITICAL, "Can't extract public key from the private one");
+        return -1;
+    }
+    return 0;
+}
+
 
 // generation key pair for sign Alice
 // OUTPUT:
 // a_key->data  --- Alice's public key
 // alice_priv  ---  Alice's private key
 // alice_msg_len --- Alice's private key length
-void dap_enc_sig_bliss_key_new_generate(struct dap_enc_key * key, const void *kex_buf,
+void dap_enc_sig_bliss_key_new_generate(struct dap_enc_key * a_key, const void *kex_buf,
                                     size_t kex_size, const void * seed, size_t seed_size,
                                     size_t key_size)
 {
@@ -36,9 +66,9 @@ void dap_enc_sig_bliss_key_new_generate(struct dap_enc_key * key, const void *ke
     (void) seed; (void) seed_size;
     (void)key_size;
 
-    int32_t retcode;
+    int32_t l_retcode;
 
-    dap_enc_sig_bliss_key_new(key);
+    dap_enc_sig_bliss_key_new(a_key);
 
     uint8_t seed_tmp[SHA3_512_DIGEST_LENGTH];
     entropy_t entropy;
@@ -53,19 +83,23 @@ void dap_enc_sig_bliss_key_new_generate(struct dap_enc_key * key, const void *ke
      * type = 4 - max securiry                 (192 bits)
     */
     //int32_t type = 4;
-    key->priv_key_data = malloc(sizeof(bliss_private_key_t));
-    retcode = bliss_b_private_key_gen((bliss_private_key_t *) key->priv_key_data, _bliss_type, &entropy);
-    if (retcode != BLISS_B_NO_ERROR) {
-        bliss_b_private_key_delete(key->priv_key_data);
+    a_key->priv_key_data_size = sizeof(bliss_private_key_t);
+    a_key->priv_key_data = DAP_NEW_SIZE(void,a_key->priv_key_data_size);
+    l_retcode = bliss_b_private_key_gen((bliss_private_key_t *) a_key->priv_key_data, _bliss_type, &entropy);
+    if (l_retcode != BLISS_B_NO_ERROR) {
+        bliss_b_private_key_delete(a_key->priv_key_data);
+        a_key->priv_key_data = NULL;
+        a_key->priv_key_data_size = 0;
         log_it(L_CRITICAL, "Error");
         return;
     }
 
-    key->pub_key_data = malloc(sizeof(bliss_public_key_t));
-    retcode = bliss_b_public_key_extract( (bliss_public_key_t *) key->pub_key_data, (const bliss_private_key_t *) key->priv_key_data);
-    if (retcode != BLISS_B_NO_ERROR) {
-        bliss_b_private_key_delete(key->priv_key_data);
-        bliss_b_public_key_delete(key->pub_key_data);
+    a_key->pub_key_data_size = sizeof(bliss_public_key_t);
+    a_key->pub_key_data = DAP_NEW_SIZE(void,a_key->pub_key_data_size );
+    l_retcode = bliss_b_public_key_extract( (bliss_public_key_t *) a_key->pub_key_data, (const bliss_private_key_t *) a_key->priv_key_data);
+    if (l_retcode != BLISS_B_NO_ERROR) {
+        bliss_b_private_key_delete(a_key->priv_key_data);
+        bliss_b_public_key_delete(a_key->pub_key_data);
         log_it(L_CRITICAL, "Error");
         return;
     }
diff --git a/crypto/dap_enc_bliss.h b/crypto/dap_enc_bliss.h
index 73f2f25a7b261b4ddd2a2a1437fd442df2215c9a..3d7620b55a76ef07f140fc45bcd9586da916e9ff 100644
--- a/crypto/dap_enc_bliss.h
+++ b/crypto/dap_enc_bliss.h
@@ -23,4 +23,6 @@ size_t dap_enc_sig_bliss_verify_sign(struct dap_enc_key * key,const void * msg,
                                      const size_t msg_size, void * signature, const size_t signature_size);
 
 void dap_enc_sig_bliss_key_delete(struct dap_enc_key *key);
+size_t dap_enc_sig_bliss_key_pub_output_size(struct dap_enc_key *l_key);
+int dap_enc_sig_bliss_key_pub_output(struct dap_enc_key *l_key, void * l_output);
 
diff --git a/crypto/dap_enc_key.c b/crypto/dap_enc_key.c
index 06650d2da7f31a4f0241b1306f0d13a92a88e472..e56694a28de5746aa823e523877ad15f426feb4a 100755
--- a/crypto/dap_enc_key.c
+++ b/crypto/dap_enc_key.c
@@ -43,6 +43,9 @@ struct dap_enc_key_callbacks{
     dap_enc_callback_dataop_t dec;
     dap_enc_callback_dataop_na_t enc_na;
     dap_enc_callback_dataop_na_t dec_na;
+    dap_enc_callback_gen_key_public_t gen_key_public;
+    dap_enc_callback_key_size_t gen_key_public_size;
+
     dap_enc_callback_calc_out_size enc_out_size;
     dap_enc_callback_calc_out_size dec_out_size;
 
@@ -52,7 +55,6 @@ struct dap_enc_key_callbacks{
     dap_enc_callback_new new_callback;
     dap_enc_callback_data_t new_from_data_public_callback;
     dap_enc_callback_new_generate new_generate_callback;
-
     dap_enc_callback_delete delete_callback;
 } s_callbacks[]={
     // AES
@@ -65,6 +67,8 @@ struct dap_enc_key_callbacks{
         .new_callback = dap_enc_aes_key_new,
         .delete_callback = dap_enc_aes_key_delete,
         .new_generate_callback = dap_enc_aes_key_generate,
+        .gen_key_public = NULL,
+        .gen_key_public_size = NULL,
         .enc_out_size = dap_enc_iaes256_calc_encode_size,
         .dec_out_size = dap_enc_iaes256_calc_decode_size,
     },
@@ -78,6 +82,8 @@ struct dap_enc_key_callbacks{
         .new_callback = dap_enc_oaes_key_new,
         .delete_callback = dap_enc_oaes_key_delete,
         .new_generate_callback = dap_enc_oaes_key_generate,
+        .gen_key_public = NULL,
+        .gen_key_public_size = NULL,
         .enc_out_size = dap_enc_oaes_calc_encode_size,
         .dec_out_size = dap_enc_oaes_calc_decode_size,
     },
@@ -90,6 +96,8 @@ struct dap_enc_key_callbacks{
         .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,
+        .gen_key_public = NULL,
+        .gen_key_public_size = NULL,
         .new_from_data_public_callback = dap_enc_msrln_key_new_from_data_public,
         .enc_out_size = NULL,
         .dec_out_size = NULL
@@ -98,6 +106,8 @@ struct dap_enc_key_callbacks{
         .name = "DEFEO",
         .enc = NULL,
         .dec = NULL,
+        .gen_key_public = NULL,
+        .gen_key_public_size = 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,
@@ -115,6 +125,8 @@ struct dap_enc_key_callbacks{
         .gen_bob_shared_key = NULL,
         .gen_alice_shared_key = NULL,
         .new_callback = dap_enc_sig_picnic_key_new,
+        .gen_key_public = NULL,
+        .gen_key_public_size = NULL,
         .delete_callback = dap_enc_sig_picnic_key_delete,
         .new_generate_callback = dap_enc_sig_picnic_key_new_generate,
         .enc_out_size = NULL,
@@ -131,6 +143,9 @@ struct dap_enc_key_callbacks{
         .new_callback = dap_enc_sig_bliss_key_new,
         .delete_callback = dap_enc_sig_bliss_key_delete,
         .new_generate_callback = dap_enc_sig_bliss_key_new_generate,
+        .gen_key_public = dap_enc_sig_bliss_key_pub_output,
+        .gen_key_public_size = dap_enc_sig_bliss_key_pub_output_size,
+
         .enc_out_size = NULL,
         .dec_out_size = NULL
     },
@@ -140,6 +155,8 @@ struct dap_enc_key_callbacks{
         .dec = NULL,
         .enc_na = dap_enc_sig_tesla_get_sign,
         .dec_na = dap_enc_sig_tesla_verify_sign,
+        .gen_key_public = NULL,
+        .gen_key_public_size = NULL,
         .gen_bob_shared_key = NULL,
         .gen_alice_shared_key = NULL,
         .new_callback = dap_enc_sig_tesla_key_new,
@@ -260,6 +277,26 @@ dap_enc_key_t *dap_enc_key_new_generate(dap_enc_key_type_t a_key_type, const voi
 }
 
 
+size_t dap_enc_gen_key_public_size (dap_enc_key_t *a_key)
+{
+    if(s_callbacks[a_key->type].gen_key_public_size) {
+        return s_callbacks[a_key->type].gen_key_public_size(a_key);
+    } else {
+        log_it(L_ERROR, "No callback for key public size calculate");
+        return 0;
+    }
+}
+
+int dap_enc_gen_key_public (dap_enc_key_t *a_key, void * a_output)
+{
+    if(s_callbacks[a_key->type].gen_key_public) {
+        return s_callbacks[a_key->type].gen_key_public(a_key,a_output);
+    } else {
+        log_it(L_ERROR, "No callback for key public generate action");
+    }
+    return -1;
+}
+
 /**
  * @brief dap_enc_key_delete
  * @param a_key
diff --git a/crypto/dap_enc_key.h b/crypto/dap_enc_key.h
index 0ced83097685d51410249d3ddcfae11f4d2e61dc..8bc6d7b90e2a4abb0d21237214f7959aa6997c5d 100755
--- a/crypto/dap_enc_key.h
+++ b/crypto/dap_enc_key.h
@@ -110,7 +110,8 @@ typedef enum dap_enc_key_type{ DAP_ENC_KEY_TYPE_IAES, // Symmetric AES
                            DAP_ENC_KEY_TYPE_SIG_TESLA,  // signature based on Ring_LWE problem with zero-knowledge proof as specified in
                                                // Post-Quantum Zero-Knowledge and Signatures from Symmetric-Key Primitives
 
-                           DAP_ENC_KEY_TYPE_FNAM2
+                           DAP_ENC_KEY_TYPE_NULL = 0
+
                          }  dap_enc_key_type_t;
 
 struct dap_enc_key;
@@ -125,6 +126,8 @@ typedef void (*dap_enc_callback_new_generate)(struct dap_enc_key* key, const voi
 // free memory
 typedef void (*dap_enc_callback_delete)(struct dap_enc_key*);
 
+typedef size_t (*dap_enc_callback_key_size_t)(struct dap_enc_key*);
+
 // encrypt and decrypt functions. Allocates Memory for out
 typedef size_t (*dap_enc_callback_dataop_t)(struct dap_enc_key *key, const void *in,
                                             const size_t in_size,void ** out);
@@ -155,6 +158,7 @@ typedef size_t (*dap_enc_gen_bob_shared_key) (struct dap_enc_key *b_key, const v
 typedef size_t (*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 int (*dap_enc_callback_gen_key_public_t ) (struct dap_enc_key *l_key, void * l_output);
 
 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 **);
@@ -225,6 +229,9 @@ dap_enc_key_t *dap_enc_key_new_generate(dap_enc_key_type_t key_type, const void
 dap_enc_key_t *dap_enc_gen_pub_key_from_priv(struct dap_enc_key *a_key, void **priv_key, size_t *alice_msg_len);
 
 
+size_t dap_enc_gen_key_public_size (dap_enc_key_t *a_key);
+int dap_enc_gen_key_public (dap_enc_key_t *a_key, void * a_output);
+
 void dap_enc_key_delete(dap_enc_key_t * a_key);
 
 #ifdef __cplusplus
diff --git a/crypto/sig_picnic/macos_specific_endian.h b/crypto/sig_picnic/macos_specific_endian.h
new file mode 100644
index 0000000000000000000000000000000000000000..f7b6756a062fb8aced2f09687172b90f77f75106
--- /dev/null
+++ b/crypto/sig_picnic/macos_specific_endian.h
@@ -0,0 +1,32 @@
+#ifndef MACOS_SPECIFIC_ENDIAN_H
+#define MACOS_SPECIFIC_ENDIAN_H
+
+/** compatibility header for endian.h
+ * This is a simple compatibility shim to convert
+ * BSD/Linux endian macros to the Mac OS X equivalents.
+ * It is public domain.
+ * */
+
+#ifndef __APPLE__
+    #warning "This header file (endian.h) is MacOS X specific.\n"
+#endif	/* __APPLE__ */
+
+#include <machine/endian.h>
+#include <libkern/OSByteOrder.h>
+
+#define htobe16(x) OSSwapHostToBigInt16(x)
+#define htole16(x) OSSwapHostToLittleInt16(x)
+#define be16toh(x) OSSwapBigToHostInt16(x)
+#define le16toh(x) OSSwapLittleToHostInt16(x)
+
+#define htobe32(x) OSSwapHostToBigInt32(x)
+#define htole32(x) OSSwapHostToLittleInt32(x)
+#define be32toh(x) OSSwapBigToHostInt32(x)
+#define le32toh(x) OSSwapLittleToHostInt32(x)
+
+#define htobe64(x) OSSwapHostToBigInt64(x)
+#define htole64(x) OSSwapHostToLittleInt64(x)
+#define be64toh(x) OSSwapBigToHostInt64(x)
+#define le64toh(x) OSSwapLittleToHostInt64(x)
+
+#endif // MACOS_SPECIFIC_ENDIAN_H
diff --git a/crypto/sig_picnic/picnic_impl.c b/crypto/sig_picnic/picnic_impl.c
index e1061f03fd7fc8663e1cbf61596d90ab47eb1bd8..990a6dae471569046ef4b86d4258d11630e2f8a6 100644
--- a/crypto/sig_picnic/picnic_impl.c
+++ b/crypto/sig_picnic/picnic_impl.c
@@ -20,6 +20,8 @@
 #if defined (__WIN32)
 	#include <Windows.h>
 	#include <bcrypt.h>
+#elif defined (__APPLE__)
+    #include "macos_specific_endian.h"
 #else
     #include <endian.h>
 #endif
diff --git a/crypto/sig_picnic/sig_picnic.pri b/crypto/sig_picnic/sig_picnic.pri
index 52fd38176d6dc903300e9f32f5661674f5b0b64d..f95cfdd7a48fa9ea60d914fe4dbeac2d0eec57ad 100644
--- a/crypto/sig_picnic/sig_picnic.pri
+++ b/crypto/sig_picnic/sig_picnic.pri
@@ -3,8 +3,9 @@ HEADERS += $$PWD/hash.h \
     $$PWD/picnic.h \
     $$PWD/picnic_impl.h \
     $$PWD/picnic_types.h \
-    $$PWD/platform.h \
+    $$PWD/platform.h
 
+macos { HEADERS += $$PWD/macos_specific_endian.h }
 
 SOURCES +=  $$PWD/hash.c \
     $$PWD/lowmc_constants.c \