From 808349b5cc0add50f4538e7a00581fa422af4719 Mon Sep 17 00:00:00 2001
From: armatusmiles <akurotych@gmail.com>
Date: Wed, 7 Nov 2018 09:44:16 +0200
Subject: [PATCH] [+] gen_bob/alice_shared_key callback

---
 crypto/dap_enc_defeo.c           | 17 ++++++++---------
 crypto/dap_enc_defeo.h           |  4 ++--
 crypto/dap_enc_key.c             | 15 +++++++++++----
 crypto/dap_enc_key.h             | 27 +++++++++++++++++++++++++++
 crypto/dap_enc_msrln.c           | 10 ++++++----
 crypto/dap_enc_msrln.h           |  4 ++--
 test/crypto/dap_enc_defeo_test.c |  4 ++--
 test/crypto/dap_enc_msrln_test.c |  6 ++----
 test/crypto/dap_enc_test.c       |  4 ++--
 9 files changed, 62 insertions(+), 29 deletions(-)

diff --git a/crypto/dap_enc_defeo.c b/crypto/dap_enc_defeo.c
index c33b047..b02f121 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 da3f031..94cdba2 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 5849352..7fac63b 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 187ea58..384b83e 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 6114e13..9c09cd5 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 4bb3751..0b24723 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 73108e4..4a97f5a 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 6b0a8f5..0020d50 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 4cba6d5..337b2cd 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");
-- 
GitLab