]> git.siccegge.de Git - software/DIPE.git/blobdiff - src/DIPE.cxx
Fixes for actually working with multi-authorities, non-trivial threshold
[software/DIPE.git] / src / DIPE.cxx
index 7b13147966a7df39b24919bd023fe018f3ed5380..c593ae0937136f261e2f8b585e7ae6a749f28de6 100644 (file)
@@ -272,9 +272,6 @@ void dipe_encap(dipe_param_t param, size_t mpkcount, dipe_master_publickey_t* mp
        }
 
        element_t tmp;
-       for (size_t i = 0; i < (*ctxt)->sharecount; ++i) {
-               element_init_G1((*ctxt)->cx[i], param->pairing);
-       }
        element_init_G1(tmp, param->pairing);
        dipe_ss_share(param, mpkcount, aid, (*ctxt)->sharecount, faid, (*ctxt)->dimension, kshares, (*ctxt)->cx, kdummyshares);
 
@@ -341,7 +338,6 @@ void dipe_decap(dipe_param_t param, size_t skcount, dipe_secretkey_t* sk, const
                element_set1(innerp);
                for (size_t j = 0; j < sk[0]->dimension; ++j) {
                        element_pow_zn(hy, h, y[j]);
-                       element_printf("%B %B\n", ctxt->shares[i].cx[j], hy);
                        pairing_apply(tmp, ctxt->shares[i].cx[j], hy, param->pairing);
                        element_mul(innerp, innerp, tmp);
                }
@@ -395,14 +391,14 @@ void dipe_encrypt(dipe_param_t param, size_t mpkcount, dipe_master_publickey_t*
        element_clear(key);
 }
 
-size_t dipe_decrypt(dipe_param_t param, size_t skcount, dipe_secretkey_t* sk, const char* cid, element_t* y, size_t ctxt_len, char* ctxt, char* ptxt) {
+size_t dipe_decrypt(dipe_param_t param, size_t skcount, dipe_secretkey_t* sk, size_t sharecount, const char* cid, element_t* y, size_t ctxt_len, char* ctxt, char* ptxt) {
        dipe_ctxt_t cap;
        uint8_t aes[32];
        element_t key;
        size_t cap_len;
 
        element_init_GT(key, param->pairing);
-       cap_len = dipe_deserialize_ctxt(param, sk[0]->dimension, 0, &cap, (uint8_t*)ctxt);
+       cap_len = dipe_deserialize_ctxt(param, sk[0]->dimension, sharecount, &cap, (uint8_t*)ctxt);
        ctxt += cap_len;
        ctxt_len -= cap_len;
        dipe_decap(param, skcount, sk, cid, y, cap, key);
@@ -486,6 +482,18 @@ size_t dipe_deserialize_ctxt(dipe_param_t param, size_t dimension, size_t shares
                buffer += element_length_in_bytes((*ctxt)->shares[j].aid);
                bytes_read += element_length_in_bytes((*ctxt)->shares[j].aid);
 
+               (*ctxt)->shares[j].cx = (element_t*)calloc(dimension, sizeof(element_t));
+               for (size_t i = 0; i < dimension; ++i) {
+                       element_init_G1((*ctxt)->shares[j].cx[i], param->pairing);
+                       element_from_bytes_compressed((*ctxt)->shares[j].cx[i], buffer);
+                       buffer += element_length_in_bytes_compressed((*ctxt)->shares[j].cx[i]);
+                       bytes_read += element_length_in_bytes_compressed((*ctxt)->shares[j].cx[i]);
+               }
+
+               element_init_GT((*ctxt)->shares[j].c, param->pairing);
+               element_from_bytes((*ctxt)->shares[j].c, buffer);
+               buffer += element_length_in_bytes((*ctxt)->shares[j].c);
+               bytes_read += element_length_in_bytes((*ctxt)->shares[j].c);
        }
 
        return bytes_read;
@@ -508,6 +516,11 @@ size_t dipe_ciphertext_overhead(dipe_param_t param, size_t dimension, size_t sha
        overhead += (1+shares) * element_length_in_bytes(t);
        element_clear(t);
 
+       /* aid */
+       element_init_Zr(t, param->pairing);
+       overhead += shares * element_length_in_bytes(t);
+       element_clear(t);
+
        return overhead;
 }
 
@@ -557,6 +570,7 @@ void dipe_free_ctxt(dipe_ctxt_t ctxt) {
                        element_clear(ctxt->shares[i].cx[j]);
                }
                element_clear(ctxt->shares[i].c);
+               element_clear(ctxt->shares[i].aid);
                free(ctxt->shares[i].cx);
        }
        free(ctxt->shares);