/* 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;
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 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) {
/* 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) {
}
}
- 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);
}