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 }