github.com/jiajun1992/watercarver@v0.0.0-20191031150618-dfc2b17c0c4a/StadiumForWaterCarver/src/DL_equality_nizk.c (about)

     1  #include "edgamal.h"
     2  #include <assert.h>
     3  #include <stdio.h>
     4  #include <string.h>
     5  
     6  void fiat_shamir(edgamal_curve_scalar c,
     7                   const edgamal_curve_point *g, const edgamal_curve_point *h,
     8                   const edgamal_curve_point *a, const edgamal_curve_point *b) {
     9    edgamal_curve_scalar C = {3};
    10    memcpy(c, C, 32);
    11  }
    12  
    13  void prove(edgamal_curve_point *a, edgamal_curve_point *b, edgamal_curve_scalar r,
    14             const edgamal_curve_point *g, const edgamal_curve_point *h,
    15             const edgamal_curve_scalar alpha, const edgamal_curve_scalar w) {
    16    edgamal_curve_scalar c;
    17  
    18    edgamal_scalar_multiply_point(a, g, w);
    19    edgamal_scalar_multiply_point(b, h, w);
    20  
    21    fiat_shamir(c, g, h, a, b);
    22  
    23    edgamal_curve_scalar t1;
    24    edgamal_multiply_scalars(t1, alpha, c);
    25    edgamal_add_scalars(r, t1, w);
    26  }
    27  
    28  int verify(const edgamal_curve_point *a, const edgamal_curve_point *b, const edgamal_curve_scalar r,
    29             const edgamal_curve_point *g, const edgamal_curve_point *h,
    30             const edgamal_curve_point *x, const edgamal_curve_point *y) {
    31    edgamal_curve_scalar c;
    32    fiat_shamir(c, g, h, a, b);
    33  
    34    edgamal_curve_point ta0, tg, ta, tb0, th, tb;
    35    edgamal_scalar_multiply_point(&tg, g, r);
    36    edgamal_scalar_multiply_point(&th, h, r);
    37    edgamal_scalar_multiply_point(&ta0, x, c);
    38    edgamal_scalar_multiply_point(&tb0, y, c);
    39    edgamal_add_points(&ta, a, &ta0);
    40    edgamal_add_points(&tb, b, &tb0);
    41  
    42    return (edgamal_compare_points(&ta, &tg) == 0) && (edgamal_compare_points(&tb, &th) == 0);
    43  }
    44  
    45  int main() {
    46    edgamal_curve_scalar alpha, w, r;
    47    edgamal_curve_point h, g, x, y, a, b;
    48    edgamal_random_point(&h);
    49    edgamal_copy_point(&g, &edgamal_basepoint);
    50    edgamal_random_scalar(w);
    51  
    52    edgamal_random_scalar(alpha);
    53    edgamal_scalar_multiply_point(&x, &g, alpha);
    54    edgamal_scalar_multiply_point(&y, &h, alpha);
    55  
    56    prove(&a, &b, r, &g, &h, alpha, w);
    57    int result = verify(&a, &b, r, &g, &h, &x, &y);
    58    assert(result == 1);
    59    printf("result is %d\n", result);
    60  
    61    return 0;
    62  }