X-Git-Url: https://git.siccegge.de//index.cgi?p=software%2FDIPE.git;a=blobdiff_plain;f=src%2FSS.cxx;h=426072b18aa21403aaa0f7e4d5dff124b6b9fc50;hp=721c0046dd56c254b5ca2eae3a5b4c8119ff8761;hb=f20d9414f3017939d6aec74c70c0d5c0380edfae;hpb=4b96407ab713fe81282b6b7d4d38cc4dbec95a7c 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); }