]> git.siccegge.de Git - software/DIPE.git/commitdiff
optimize
authorChristoph Egger <egger@cs.fau.de>
Wed, 15 Jan 2020 16:23:07 +0000 (17:23 +0100)
committerChristoph Egger <egger@cs.fau.de>
Wed, 15 Jan 2020 16:23:07 +0000 (17:23 +0100)
src/SS.cxx

index 721c0046dd56c254b5ca2eae3a5b4c8119ff8761..426072b18aa21403aaa0f7e4d5dff124b6b9fc50 100644 (file)
@@ -48,7 +48,7 @@ namespace {
        /* https://proofwiki.org/wiki/Inverse_of_Vandermonde_Matrix     
         * Contract: result is allocated but not initialized size x size array
         */
        /* https://proofwiki.org/wiki/Inverse_of_Vandermonde_Matrix     
         * Contract: result is allocated but not initialized size x size array
         */
-       void dipe_ss_inverse_vandermonde(dipe_param_t param, size_t size, element_t* elements, element_t** result) {
+       void dipe_ss_inverse_vandermonde(dipe_param_t param, bool flat, size_t size, element_t* elements, element_t** result) {
                /* b_ij = (-1)^{n-i} e_{n-i}() / \Prod ()
                 */
                element_t numerator, denominator;
                /* b_ij = (-1)^{n-i} e_{n-i}() / \Prod ()
                 */
                element_t numerator, denominator;
@@ -58,6 +58,8 @@ namespace {
                element_init_Zr(tmp, param->pairing);
                
                for (size_t i = 0; i < size; ++i) {
                element_init_Zr(tmp, param->pairing);
                
                for (size_t i = 0; i < size; ++i) {
+                       if (flat && i > 0) continue;
+                       
                        for (size_t j = 0; j < size; ++j) {
                                element_init_Zr(result[i][j], param->pairing);
 
                        for (size_t j = 0; j < size; ++j) {
                                element_init_Zr(result[i][j], param->pairing);
 
@@ -99,7 +101,7 @@ void dipe_ss_share(dipe_param_t param, size_t id_size, element_t* ids, size_t fi
        for (size_t i = 0; i < id_size; ++i) {
                b[i] = (element_t*)calloc(id_size, sizeof(element_t));
        }
        for (size_t i = 0; i < id_size; ++i) {
                b[i] = (element_t*)calloc(id_size, sizeof(element_t));
        }
-       dipe_ss_inverse_vandermonde(param, id_size, ids, b);
+       dipe_ss_inverse_vandermonde(param, false, id_size, ids, b);
 
        /* Compute Secret */
        for (size_t k = 0; k < share_size; ++k) {
 
        /* Compute Secret */
        for (size_t k = 0; k < share_size; ++k) {
@@ -168,11 +170,9 @@ void dipe_ss_recover(dipe_param_t param, size_t id_size, element_t* ids, size_t
 
        /* Precompute V_I^{-1} needed in several steps */
        /* Actually for recover we only need the values b[0][j] */
 
        /* Precompute V_I^{-1} needed in several steps */
        /* Actually for recover we only need the values b[0][j] */
-       element_t** b = (element_t**)calloc(id_size, sizeof(element_t*));
-       for (size_t i = 0; i < id_size; ++i) {
-               b[i] = (element_t*)calloc(id_size, sizeof(element_t));
-       }
-       dipe_ss_inverse_vandermonde(param, id_size, ids, b);
+       element_t** b = (element_t**)calloc(1, sizeof(element_t*));
+       b[0] = (element_t*)calloc(id_size, sizeof(element_t));
+       dipe_ss_inverse_vandermonde(param, true, id_size, ids, b);
 
        /* Compute Secret */
        for (size_t k = 0; k < share_size; ++k) {
 
        /* Compute Secret */
        for (size_t k = 0; k < share_size; ++k) {
@@ -183,12 +183,10 @@ void dipe_ss_recover(dipe_param_t param, size_t id_size, element_t* ids, size_t
                }
        }
 
                }
        }
 
-       for (size_t i = 0; i < id_size; ++i) {
-               for (size_t j = 0; j < id_size; ++j) {
-                       element_clear(b[i][j]);
-               }
-               free(b[i]);
+       for (size_t j = 0; j < id_size; ++j) {
+               element_clear(b[0][j]);
        }
        }
+       free(b[0]);
        free(b);
        element_clear(tmp);
 }
        free(b);
        element_clear(tmp);
 }