From: Christoph Egger Date: Wed, 15 Jan 2020 16:23:07 +0000 (+0100) Subject: optimize X-Git-Url: https://git.siccegge.de//index.cgi?p=software%2FDIPE.git;a=commitdiff_plain;h=f20d9414f3017939d6aec74c70c0d5c0380edfae optimize --- diff --git a/src/SS.cxx b/src/SS.cxx index 721c004..426072b 100644 --- a/src/SS.cxx +++ b/src/SS.cxx @@ -48,7 +48,7 @@ namespace { /* 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; @@ -58,6 +58,8 @@ namespace { 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); @@ -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)); } - 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) { @@ -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] */ - 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) { @@ -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); }