From dee4205590fb84baf20e75f2c9b71f9f82466399 Mon Sep 17 00:00:00 2001
From: Aleksei Voronin <aleksei.voronin@demlabs.net>
Date: Tue, 21 Apr 2020 19:22:14 +0000
Subject: [PATCH] Bugs 3508

---
 src/dap_enc_msrln.c                |  4 ---
 src/sig_bliss/bliss_b_keys.c       |  6 ----
 src/sig_bliss/bliss_b_signatures.c | 56 ++++++++++++++++++++++++------
 3 files changed, 45 insertions(+), 21 deletions(-)

diff --git a/src/dap_enc_msrln.c b/src/dap_enc_msrln.c
index 80e7ba8..b480080 100755
--- a/src/dap_enc_msrln.c
+++ b/src/dap_enc_msrln.c
@@ -112,8 +112,6 @@ size_t dap_enc_msrln_gen_bob_shared_key(struct dap_enc_key* b_key, const void* a
     *b_pub = malloc(MSRLN_PKB_BYTES);
     if(b_pub == NULL) {
         ret = 0;
-        DAP_DELETE(b_pub);
-        b_pub = NULL;
         DAP_DELETE(b_key->priv_key_data);
         b_key->priv_key_data = NULL;
         return ret;
@@ -125,8 +123,6 @@ size_t dap_enc_msrln_gen_bob_shared_key(struct dap_enc_key* b_key, const void* a
         ret = 0;
         DAP_DELETE(b_pub);
         b_pub = NULL;
-        DAP_DELETE(b_key->priv_key_data);
-        b_key->priv_key_data = NULL;
         return ret;
     }
 
diff --git a/src/sig_bliss/bliss_b_keys.c b/src/sig_bliss/bliss_b_keys.c
index 1740d31..7e8e4a4 100755
--- a/src/sig_bliss/bliss_b_keys.c
+++ b/src/sig_bliss/bliss_b_keys.c
@@ -118,17 +118,12 @@ static int32_t bliss_b_private_key_init(bliss_private_key_t *private_key, bliss_
 
   f = calloc(n, sizeof(int32_t));
   if (f == NULL) {
-      free(f);
-      free(g);
-      free(a);
       return BLISS_B_NO_MEM;
   }
 
   g = calloc(n, sizeof(int32_t));
   if (g == NULL) {
       free(f);
-      free(g);
-      free(a);
       return BLISS_B_NO_MEM;
   }
 
@@ -136,7 +131,6 @@ static int32_t bliss_b_private_key_init(bliss_private_key_t *private_key, bliss_
   if (a == NULL) {
       free(f);
       free(g);
-      free(a);
       return BLISS_B_NO_MEM;
   }
 
diff --git a/src/sig_bliss/bliss_b_signatures.c b/src/sig_bliss/bliss_b_signatures.c
index 0e1de13..173fa49 100755
--- a/src/sig_bliss/bliss_b_signatures.c
+++ b/src/sig_bliss/bliss_b_signatures.c
@@ -404,18 +404,7 @@ int32_t bliss_b_sign(bliss_signature_t *signature,  const bliss_private_key_t *p
       /* initialize our sampler */
       if (!sampler_init(&sampler, p.sigma, p.ell, p.precision, entropy)) {
         retval = BLISS_B_BAD_ARGS;
-        secure_free(&z1, n);
-        secure_free(&z2, n);
-        secure_free((int32_t **)&indices, kappa);
-        free(hash);
-        hash = NULL;
         delete_ntt_state(state);
-        secure_free(&v, n);
-        secure_free(&dv, n);
-        secure_free(&y1, n);
-        secure_free(&y2, n);
-        secure_free(&v1, n);
-        secure_free(&v2, n);
         return retval;
       }
 
@@ -429,46 +418,91 @@ int32_t bliss_b_sign(bliss_signature_t *signature,  const bliss_private_key_t *p
 
       z1 = malloc(n * sizeof(int32_t));
       if(z1 ==  NULL){
+        free(hash);
         return BLISS_B_NO_MEM;
       }
 
       z2 = malloc(n * sizeof(int32_t));
       if(z2 ==  NULL){
+        free(hash);
+        secure_free(&z1, n);
         return BLISS_B_NO_MEM;
       }
 
       v1 = malloc(n * sizeof(int32_t));
       if(v1 ==  NULL){
+        free(hash);
+        secure_free(&z1, n);
+        secure_free(&z2, n);
         return BLISS_B_NO_MEM;
       }
 
       v2 = malloc(n * sizeof(int32_t));
       if(v2 ==  NULL){
+        free(hash);
+        secure_free(&z1, n);
+        secure_free(&z2, n);
+        secure_free(&v1, n);
         return BLISS_B_NO_MEM;
       }
 
       y1 = malloc(n * sizeof(int32_t));
       if(y1 ==  NULL){
+        free(hash);
+        secure_free(&z1, n);
+        secure_free(&z2, n);
+        secure_free(&v1, n);
+        secure_free(&v2, n);
         return BLISS_B_NO_MEM;
       }
 
       y2 = malloc(n * sizeof(int32_t));
       if(y2 ==  NULL){
+        free(hash);
+        secure_free(&z1, n);
+        secure_free(&z2, n);
+        secure_free(&v1, n);
+        secure_free(&v2, n);
+        secure_free(&y1, n);
         return BLISS_B_NO_MEM;
       }
 
       v = calloc(n, sizeof(int32_t));
       if(v ==  NULL){
+        free(hash);
+        secure_free(&z1, n);
+        secure_free(&z2, n);
+        secure_free(&v1, n);
+        secure_free(&v2, n);
+        secure_free(&y1, n);
+        secure_free(&y2, n);
         return BLISS_B_NO_MEM;
       }
 
       dv = calloc(n, sizeof(int32_t));
       if(dv ==  NULL){
+        free(hash);
+        secure_free(&z1, n);
+        secure_free(&z2, n);
+        secure_free(&v1, n);
+        secure_free(&v2, n);
+        secure_free(&y1, n);
+        secure_free(&y2, n);
+        secure_free(&v, n);
         return BLISS_B_NO_MEM;
       }
 
       indices = calloc(kappa, sizeof(int32_t));
       if(indices ==  NULL){
+        free(hash);
+        secure_free(&z1, n);
+        secure_free(&z2, n);
+        secure_free(&v1, n);
+        secure_free(&v2, n);
+        secure_free(&y1, n);
+        secure_free(&y2, n);
+        secure_free(&v, n);
+        secure_free(&dv, n);
         return BLISS_B_NO_MEM;
       }
 
-- 
GitLab