diff options
author | Markus Teich <markus.teich@stusta.mhn.de> | 2016-06-21 16:12:57 +0200 |
---|---|---|
committer | Markus Teich <markus.teich@stusta.mhn.de> | 2016-06-21 16:12:57 +0200 |
commit | 77f396003c6792c3cad8b41b19dd9e8d9435198c (patch) | |
tree | e7d5085c86564e3b3b1a80e5a25f9c80ff3a835c /crypto.c | |
parent | 24191a69683ca8fb7d01c26ec889f13a3f7d8ba8 (diff) | |
download | libbrandt-77f396003c6792c3cad8b41b19dd9e8d9435198c.tar.gz libbrandt-77f396003c6792c3cad8b41b19dd9e8d9435198c.zip |
use hash to generate challange in ZKPs
Diffstat (limited to 'crypto.c')
-rw-r--r-- | crypto.c | 190 |
1 files changed, 136 insertions, 54 deletions
@@ -30,6 +30,32 @@ | |||
30 | #define CURVE "Ed25519" | 30 | #define CURVE "Ed25519" |
31 | 31 | ||
32 | 32 | ||
33 | struct zkp_challenge_dl { | ||
34 | struct ec_mpi g; | ||
35 | struct ec_mpi v; | ||
36 | struct ec_mpi a; | ||
37 | }; | ||
38 | |||
39 | struct zkp_challenge_2dle { | ||
40 | struct ec_mpi g1; | ||
41 | struct ec_mpi g2; | ||
42 | struct ec_mpi v; | ||
43 | struct ec_mpi w; | ||
44 | struct ec_mpi a; | ||
45 | struct ec_mpi b; | ||
46 | }; | ||
47 | |||
48 | struct zkp_challenge_0og { | ||
49 | struct ec_mpi g; | ||
50 | struct ec_mpi alpha; | ||
51 | struct ec_mpi beta; | ||
52 | struct ec_mpi a1; | ||
53 | struct ec_mpi a2; | ||
54 | struct ec_mpi b1; | ||
55 | struct ec_mpi b2; | ||
56 | }; | ||
57 | |||
58 | |||
33 | static gcry_ctx_t ec_ctx; | 59 | static gcry_ctx_t ec_ctx; |
34 | static gcry_mpi_point_t ec_gen; | 60 | static gcry_mpi_point_t ec_gen; |
35 | static gcry_mpi_point_t ec_zero; | 61 | static gcry_mpi_point_t ec_zero; |
@@ -534,7 +560,6 @@ smc_gen_keyshare (struct AuctionData *ad) | |||
534 | * @param a2 TODO | 560 | * @param a2 TODO |
535 | * @param b1 TODO | 561 | * @param b1 TODO |
536 | * @param b2 TODO | 562 | * @param b2 TODO |
537 | * @param c TODO | ||
538 | * @param d1 TODO | 563 | * @param d1 TODO |
539 | * @param d2 TODO | 564 | * @param d2 TODO |
540 | * @param r1 TODO | 565 | * @param r1 TODO |
@@ -547,14 +572,13 @@ smc_encrypt_bid (struct AuctionData *ad, | |||
547 | gcry_mpi_point_t a2, | 572 | gcry_mpi_point_t a2, |
548 | gcry_mpi_point_t b1, | 573 | gcry_mpi_point_t b1, |
549 | gcry_mpi_point_t b2, | 574 | gcry_mpi_point_t b2, |
550 | gcry_mpi_t c, | ||
551 | gcry_mpi_t d1, | 575 | gcry_mpi_t d1, |
552 | gcry_mpi_t d2, | 576 | gcry_mpi_t d2, |
553 | gcry_mpi_t r1, | 577 | gcry_mpi_t r1, |
554 | gcry_mpi_t r2) | 578 | gcry_mpi_t r2) |
555 | { | 579 | { |
556 | smc_zkp_0og (ad->alpha[ad->i][j], (j == ad->b ? ec_gen : ec_zero), ad->Y, | 580 | smc_zkp_0og (ad->alpha[ad->i][j], (j == ad->b ? ec_gen : ec_zero), ad->Y, |
557 | ad->beta[ad->i][j], a1, a2, b1, b2, c, d1, d2, r1, r2); | 581 | ad->beta[ad->i][j], a1, a2, b1, b2, d1, d2, r1, r2); |
558 | } | 582 | } |
559 | 583 | ||
560 | 584 | ||
@@ -586,7 +610,6 @@ smc_compute_outcome (struct AuctionData *ad) | |||
586 | * @param g \todo | 610 | * @param g \todo |
587 | * @param x \todo | 611 | * @param x \todo |
588 | * @param a \todo | 612 | * @param a \todo |
589 | * @param c \todo | ||
590 | * @param r \todo | 613 | * @param r \todo |
591 | */ | 614 | */ |
592 | void | 615 | void |
@@ -594,22 +617,27 @@ smc_zkp_dl (const gcry_mpi_point_t v, | |||
594 | const gcry_mpi_point_t g, | 617 | const gcry_mpi_point_t g, |
595 | const gcry_mpi_t x, | 618 | const gcry_mpi_t x, |
596 | const gcry_mpi_point_t a, | 619 | const gcry_mpi_point_t a, |
597 | gcry_mpi_t c, | ||
598 | gcry_mpi_t r) | 620 | gcry_mpi_t r) |
599 | { | 621 | { |
600 | gcry_mpi_t z = gcry_mpi_new (0); | 622 | struct zkp_challenge_dl challenge; |
623 | struct brandt_hash_code challhash; | ||
624 | gcry_mpi_t c = gcry_mpi_new (0); | ||
625 | gcry_mpi_t z = gcry_mpi_new (0); | ||
601 | 626 | ||
602 | ec_keypair_create_base (a, z, g); | 627 | ec_keypair_create_base (a, z, g); |
603 | 628 | ||
604 | /* compute challange c */ | 629 | /* compute challenge c */ |
605 | /**\todo: generate c from HASH(g,v,a) and don't output it */ | 630 | ec_point_serialize (&challenge.g, ec_gen); |
606 | // brandt_hash (const void *block, size_t size, struct brandt_hash_code *ret) | 631 | ec_point_serialize (&challenge.v, v); |
607 | ec_skey_create (c); | 632 | ec_point_serialize (&challenge.a, a); |
633 | brandt_hash (&challenge, sizeof (struct zkp_challenge_dl), &challhash); | ||
634 | mpi_parse (c, (struct ec_mpi *)&challhash); | ||
608 | gcry_mpi_mod (c, c, ec_n); | 635 | gcry_mpi_mod (c, c, ec_n); |
609 | 636 | ||
610 | gcry_mpi_mulm (r, c, x, ec_n); | 637 | gcry_mpi_mulm (r, c, x, ec_n); |
611 | gcry_mpi_addm (r, r, z, ec_n); | 638 | gcry_mpi_addm (r, r, z, ec_n); |
612 | 639 | ||
640 | gcry_mpi_release (c); | ||
613 | gcry_mpi_release (z); | 641 | gcry_mpi_release (z); |
614 | } | 642 | } |
615 | 643 | ||
@@ -620,7 +648,6 @@ smc_zkp_dl (const gcry_mpi_point_t v, | |||
620 | * @param v \todo | 648 | * @param v \todo |
621 | * @param g \todo | 649 | * @param g \todo |
622 | * @param a \todo | 650 | * @param a \todo |
623 | * @param c \todo | ||
624 | * @param r \todo | 651 | * @param r \todo |
625 | * @return 0 if the proof is correct, something else otherwise | 652 | * @return 0 if the proof is correct, something else otherwise |
626 | */ | 653 | */ |
@@ -628,18 +655,29 @@ int | |||
628 | smc_zkp_dl_check (const gcry_mpi_point_t v, | 655 | smc_zkp_dl_check (const gcry_mpi_point_t v, |
629 | const gcry_mpi_point_t g, | 656 | const gcry_mpi_point_t g, |
630 | const gcry_mpi_point_t a, | 657 | const gcry_mpi_point_t a, |
631 | const gcry_mpi_t c, | ||
632 | const gcry_mpi_t r) | 658 | const gcry_mpi_t r) |
633 | { | 659 | { |
634 | int ret; | 660 | int ret; |
635 | gcry_mpi_point_t left = gcry_mpi_point_new (0); | 661 | struct zkp_challenge_dl challenge; |
636 | gcry_mpi_point_t right = gcry_mpi_point_new (0); | 662 | struct brandt_hash_code challhash; |
663 | gcry_mpi_t c = gcry_mpi_new (0); | ||
664 | gcry_mpi_point_t left = gcry_mpi_point_new (0); | ||
665 | gcry_mpi_point_t right = gcry_mpi_point_new (0); | ||
666 | |||
667 | /* compute challenge c */ | ||
668 | ec_point_serialize (&challenge.g, ec_gen); | ||
669 | ec_point_serialize (&challenge.v, v); | ||
670 | ec_point_serialize (&challenge.a, a); | ||
671 | brandt_hash (&challenge, sizeof (struct zkp_challenge_dl), &challhash); | ||
672 | mpi_parse (c, (struct ec_mpi *)&challhash); | ||
673 | gcry_mpi_mod (c, c, ec_n); | ||
637 | 674 | ||
638 | gcry_mpi_ec_mul (left, r, g, ec_ctx); | 675 | gcry_mpi_ec_mul (left, r, g, ec_ctx); |
639 | gcry_mpi_ec_mul (right, c, v, ec_ctx); | 676 | gcry_mpi_ec_mul (right, c, v, ec_ctx); |
640 | gcry_mpi_ec_add (right, a, right, ec_ctx); | 677 | gcry_mpi_ec_add (right, a, right, ec_ctx); |
641 | 678 | ||
642 | ret = ec_point_cmp (left, right); | 679 | ret = ec_point_cmp (left, right); |
680 | gcry_mpi_release (c); | ||
643 | gcry_mpi_point_release (left); | 681 | gcry_mpi_point_release (left); |
644 | gcry_mpi_point_release (right); | 682 | gcry_mpi_point_release (right); |
645 | 683 | ||
@@ -657,7 +695,6 @@ smc_zkp_dl_check (const gcry_mpi_point_t v, | |||
657 | * @param x TODO | 695 | * @param x TODO |
658 | * @param a TODO | 696 | * @param a TODO |
659 | * @param b TODO | 697 | * @param b TODO |
660 | * @param c TODO | ||
661 | * @param r TODO | 698 | * @param r TODO |
662 | */ | 699 | */ |
663 | void | 700 | void |
@@ -668,22 +705,31 @@ smc_zkp_2dle (const gcry_mpi_point_t v, | |||
668 | const gcry_mpi_t x, | 705 | const gcry_mpi_t x, |
669 | gcry_mpi_point_t a, | 706 | gcry_mpi_point_t a, |
670 | gcry_mpi_point_t b, | 707 | gcry_mpi_point_t b, |
671 | gcry_mpi_t c, | ||
672 | gcry_mpi_t r) | 708 | gcry_mpi_t r) |
673 | { | 709 | { |
674 | gcry_mpi_t z = gcry_mpi_new (0); | 710 | struct zkp_challenge_2dle challenge; |
711 | struct brandt_hash_code challhash; | ||
712 | gcry_mpi_t c = gcry_mpi_new (0); | ||
713 | gcry_mpi_t z = gcry_mpi_new (0); | ||
675 | 714 | ||
676 | ec_keypair_create_base (a, z, g1); | 715 | ec_keypair_create_base (a, z, g1); |
677 | gcry_mpi_ec_mul (b, z, g2, ec_ctx); | 716 | gcry_mpi_ec_mul (b, z, g2, ec_ctx); |
678 | 717 | ||
679 | /* compute challange c */ | 718 | /* compute challenge c */ |
680 | /* \todo: generate c from HASH(g1,g2,v,w,a,b) and don't output it */ | 719 | ec_point_serialize (&challenge.g1, g1); |
681 | ec_skey_create (c); | 720 | ec_point_serialize (&challenge.g2, g2); |
721 | ec_point_serialize (&challenge.v, v); | ||
722 | ec_point_serialize (&challenge.w, w); | ||
723 | ec_point_serialize (&challenge.a, a); | ||
724 | ec_point_serialize (&challenge.b, b); | ||
725 | brandt_hash (&challenge, sizeof (struct zkp_challenge_dl), &challhash); | ||
726 | mpi_parse (c, (struct ec_mpi *)&challhash); | ||
682 | gcry_mpi_mod (c, c, ec_n); | 727 | gcry_mpi_mod (c, c, ec_n); |
683 | 728 | ||
684 | gcry_mpi_mulm (r, c, x, ec_n); | 729 | gcry_mpi_mulm (r, c, x, ec_n); |
685 | gcry_mpi_addm (r, r, z, ec_n); | 730 | gcry_mpi_addm (r, r, z, ec_n); |
686 | 731 | ||
732 | gcry_mpi_release (c); | ||
687 | gcry_mpi_release (z); | 733 | gcry_mpi_release (z); |
688 | } | 734 | } |
689 | 735 | ||
@@ -697,7 +743,6 @@ smc_zkp_2dle (const gcry_mpi_point_t v, | |||
697 | * @param g2 TODO | 743 | * @param g2 TODO |
698 | * @param a TODO | 744 | * @param a TODO |
699 | * @param b TODO | 745 | * @param b TODO |
700 | * @param c TODO | ||
701 | * @param r TODO | 746 | * @param r TODO |
702 | * @return TODO | 747 | * @return TODO |
703 | */ | 748 | */ |
@@ -708,12 +753,25 @@ smc_zkp_2dle_check (const gcry_mpi_point_t v, | |||
708 | const gcry_mpi_point_t g2, | 753 | const gcry_mpi_point_t g2, |
709 | const gcry_mpi_point_t a, | 754 | const gcry_mpi_point_t a, |
710 | const gcry_mpi_point_t b, | 755 | const gcry_mpi_point_t b, |
711 | const gcry_mpi_t c, | ||
712 | const gcry_mpi_t r) | 756 | const gcry_mpi_t r) |
713 | { | 757 | { |
714 | int ret; | 758 | int ret; |
715 | gcry_mpi_point_t left = gcry_mpi_point_new (0); | 759 | struct zkp_challenge_2dle challenge; |
716 | gcry_mpi_point_t right = gcry_mpi_point_new (0); | 760 | struct brandt_hash_code challhash; |
761 | gcry_mpi_t c = gcry_mpi_new (0); | ||
762 | gcry_mpi_point_t left = gcry_mpi_point_new (0); | ||
763 | gcry_mpi_point_t right = gcry_mpi_point_new (0); | ||
764 | |||
765 | /* compute challenge c */ | ||
766 | ec_point_serialize (&challenge.g1, g1); | ||
767 | ec_point_serialize (&challenge.g2, g2); | ||
768 | ec_point_serialize (&challenge.v, v); | ||
769 | ec_point_serialize (&challenge.w, w); | ||
770 | ec_point_serialize (&challenge.a, a); | ||
771 | ec_point_serialize (&challenge.b, b); | ||
772 | brandt_hash (&challenge, sizeof (struct zkp_challenge_dl), &challhash); | ||
773 | mpi_parse (c, (struct ec_mpi *)&challhash); | ||
774 | gcry_mpi_mod (c, c, ec_n); | ||
717 | 775 | ||
718 | gcry_mpi_ec_mul (left, r, g1, ec_ctx); | 776 | gcry_mpi_ec_mul (left, r, g1, ec_ctx); |
719 | gcry_mpi_ec_mul (right, c, v, ec_ctx); | 777 | gcry_mpi_ec_mul (right, c, v, ec_ctx); |
@@ -725,6 +783,7 @@ smc_zkp_2dle_check (const gcry_mpi_point_t v, | |||
725 | gcry_mpi_ec_add (right, b, right, ec_ctx); | 783 | gcry_mpi_ec_add (right, b, right, ec_ctx); |
726 | ret |= ec_point_cmp (left, right); | 784 | ret |= ec_point_cmp (left, right); |
727 | 785 | ||
786 | gcry_mpi_release (c); | ||
728 | gcry_mpi_point_release (left); | 787 | gcry_mpi_point_release (left); |
729 | gcry_mpi_point_release (right); | 788 | gcry_mpi_point_release (right); |
730 | 789 | ||
@@ -743,7 +802,6 @@ smc_zkp_2dle_check (const gcry_mpi_point_t v, | |||
743 | * @param a2 TODO | 802 | * @param a2 TODO |
744 | * @param b1 TODO | 803 | * @param b1 TODO |
745 | * @param b2 TODO | 804 | * @param b2 TODO |
746 | * @param c TODO | ||
747 | * @param d1 TODO | 805 | * @param d1 TODO |
748 | * @param d2 TODO | 806 | * @param d2 TODO |
749 | * @param r1 TODO | 807 | * @param r1 TODO |
@@ -758,16 +816,18 @@ smc_zkp_0og (gcry_mpi_point_t alpha, | |||
758 | gcry_mpi_point_t a2, | 816 | gcry_mpi_point_t a2, |
759 | gcry_mpi_point_t b1, | 817 | gcry_mpi_point_t b1, |
760 | gcry_mpi_point_t b2, | 818 | gcry_mpi_point_t b2, |
761 | gcry_mpi_t c, | ||
762 | gcry_mpi_t d1, | 819 | gcry_mpi_t d1, |
763 | gcry_mpi_t d2, | 820 | gcry_mpi_t d2, |
764 | gcry_mpi_t r1, | 821 | gcry_mpi_t r1, |
765 | gcry_mpi_t r2) | 822 | gcry_mpi_t r2) |
766 | { | 823 | { |
767 | gcry_mpi_t r = gcry_mpi_new (0); | 824 | struct zkp_challenge_0og challenge; |
768 | gcry_mpi_t w = gcry_mpi_new (0); | 825 | struct brandt_hash_code challhash; |
769 | int eq0 = !ec_point_cmp (m, ec_zero); | 826 | gcry_mpi_t c = gcry_mpi_new (0); |
770 | int eqg = !ec_point_cmp (m, ec_gen); | 827 | gcry_mpi_t r = gcry_mpi_new (0); |
828 | gcry_mpi_t w = gcry_mpi_new (0); | ||
829 | int eq0 = !ec_point_cmp (m, ec_zero); | ||
830 | int eqg = !ec_point_cmp (m, ec_gen); | ||
771 | 831 | ||
772 | if (!(eq0 ^ eqg)) | 832 | if (!(eq0 ^ eqg)) |
773 | eprintf ("zero knowledge proof: m is neither 0 nor g"); | 833 | eprintf ("zero knowledge proof: m is neither 0 nor g"); |
@@ -802,18 +862,6 @@ smc_zkp_0og (gcry_mpi_point_t alpha, | |||
802 | 862 | ||
803 | /* b2 = w * y */ | 863 | /* b2 = w * y */ |
804 | gcry_mpi_ec_mul (b2, w, y, ec_ctx); | 864 | gcry_mpi_ec_mul (b2, w, y, ec_ctx); |
805 | |||
806 | /* compute challange c */ | ||
807 | /* \todo: generate c from HASH(alpha,beta,a1,b1,a2,b2) and don't output it */ | ||
808 | ec_skey_create (c); | ||
809 | gcry_mpi_mod (c, c, ec_n); | ||
810 | |||
811 | /* d2 = c - d1 */ | ||
812 | gcry_mpi_subm (d2, c, d1, ec_n); | ||
813 | |||
814 | /* r2 = w - r*d2 */ | ||
815 | gcry_mpi_mulm (r2, r, d2, ec_n); | ||
816 | gcry_mpi_subm (r2, w, r2, ec_n); | ||
817 | } | 865 | } |
818 | else | 866 | else |
819 | { /* m == g */ | 867 | { /* m == g */ |
@@ -838,12 +886,31 @@ smc_zkp_0og (gcry_mpi_point_t alpha, | |||
838 | 886 | ||
839 | /* b1 = w * y */ | 887 | /* b1 = w * y */ |
840 | gcry_mpi_ec_mul (b1, w, y, ec_ctx); | 888 | gcry_mpi_ec_mul (b1, w, y, ec_ctx); |
889 | } | ||
841 | 890 | ||
842 | /* compute challange c */ | 891 | /* compute challenge c */ |
843 | /* \todo: generate c from HASH(alpha,beta,a1,b1,a2,b2) and don't output it */ | 892 | ec_point_serialize (&challenge.g, ec_gen); |
844 | ec_skey_create (c); | 893 | ec_point_serialize (&challenge.alpha, alpha); |
845 | gcry_mpi_mod (c, c, ec_n); | 894 | ec_point_serialize (&challenge.beta, beta); |
895 | ec_point_serialize (&challenge.a1, a1); | ||
896 | ec_point_serialize (&challenge.a2, a2); | ||
897 | ec_point_serialize (&challenge.b1, b1); | ||
898 | ec_point_serialize (&challenge.b2, b2); | ||
899 | brandt_hash (&challenge, sizeof (struct zkp_challenge_dl), &challhash); | ||
900 | mpi_parse (c, (struct ec_mpi *)&challhash); | ||
901 | gcry_mpi_mod (c, c, ec_n); | ||
846 | 902 | ||
903 | if (eq0) | ||
904 | { /* m == 0 */ | ||
905 | /* d2 = c - d1 */ | ||
906 | gcry_mpi_subm (d2, c, d1, ec_n); | ||
907 | |||
908 | /* r2 = w - r*d2 */ | ||
909 | gcry_mpi_mulm (r2, r, d2, ec_n); | ||
910 | gcry_mpi_subm (r2, w, r2, ec_n); | ||
911 | } | ||
912 | else | ||
913 | { /* m == g */ | ||
847 | /* d1 = c - d2 */ | 914 | /* d1 = c - d2 */ |
848 | gcry_mpi_subm (d1, c, d2, ec_n); | 915 | gcry_mpi_subm (d1, c, d2, ec_n); |
849 | 916 | ||
@@ -852,6 +919,7 @@ smc_zkp_0og (gcry_mpi_point_t alpha, | |||
852 | gcry_mpi_subm (r1, w, r1, ec_n); | 919 | gcry_mpi_subm (r1, w, r1, ec_n); |
853 | } | 920 | } |
854 | 921 | ||
922 | gcry_mpi_release (c); | ||
855 | gcry_mpi_release (r); | 923 | gcry_mpi_release (r); |
856 | gcry_mpi_release (w); | 924 | gcry_mpi_release (w); |
857 | } | 925 | } |
@@ -867,7 +935,6 @@ smc_zkp_0og (gcry_mpi_point_t alpha, | |||
867 | * @param a2 TODO | 935 | * @param a2 TODO |
868 | * @param b1 TODO | 936 | * @param b1 TODO |
869 | * @param b2 TODO | 937 | * @param b2 TODO |
870 | * @param c TODO | ||
871 | * @param d1 TODO | 938 | * @param d1 TODO |
872 | * @param d2 TODO | 939 | * @param d2 TODO |
873 | * @param r1 TODO | 940 | * @param r1 TODO |
@@ -882,16 +949,30 @@ smc_zkp_0og_check (const gcry_mpi_point_t alpha, | |||
882 | const gcry_mpi_point_t a2, | 949 | const gcry_mpi_point_t a2, |
883 | const gcry_mpi_point_t b1, | 950 | const gcry_mpi_point_t b1, |
884 | const gcry_mpi_point_t b2, | 951 | const gcry_mpi_point_t b2, |
885 | const gcry_mpi_t c, | ||
886 | const gcry_mpi_t d1, | 952 | const gcry_mpi_t d1, |
887 | const gcry_mpi_t d2, | 953 | const gcry_mpi_t d2, |
888 | const gcry_mpi_t r1, | 954 | const gcry_mpi_t r1, |
889 | const gcry_mpi_t r2) | 955 | const gcry_mpi_t r2) |
890 | { | 956 | { |
891 | int ret; | 957 | int ret; |
892 | gcry_mpi_t sum = gcry_mpi_new (0); | 958 | struct zkp_challenge_0og challenge; |
893 | gcry_mpi_point_t right = gcry_mpi_point_new (0); | 959 | struct brandt_hash_code challhash; |
894 | gcry_mpi_point_t tmp = gcry_mpi_point_new (0); | 960 | gcry_mpi_t c = gcry_mpi_new (0); |
961 | gcry_mpi_t sum = gcry_mpi_new (0); | ||
962 | gcry_mpi_point_t right = gcry_mpi_point_new (0); | ||
963 | gcry_mpi_point_t tmp = gcry_mpi_point_new (0); | ||
964 | |||
965 | /* compute challenge c */ | ||
966 | ec_point_serialize (&challenge.g, ec_gen); | ||
967 | ec_point_serialize (&challenge.alpha, alpha); | ||
968 | ec_point_serialize (&challenge.beta, beta); | ||
969 | ec_point_serialize (&challenge.a1, a1); | ||
970 | ec_point_serialize (&challenge.a2, a2); | ||
971 | ec_point_serialize (&challenge.b1, b1); | ||
972 | ec_point_serialize (&challenge.b2, b2); | ||
973 | brandt_hash (&challenge, sizeof (struct zkp_challenge_dl), &challhash); | ||
974 | mpi_parse (c, (struct ec_mpi *)&challhash); | ||
975 | gcry_mpi_mod (c, c, ec_n); | ||
895 | 976 | ||
896 | /* c == d1 + d2 */ | 977 | /* c == d1 + d2 */ |
897 | gcry_mpi_addm (sum, d1, d2, ec_n); | 978 | gcry_mpi_addm (sum, d1, d2, ec_n); |
@@ -922,6 +1003,7 @@ smc_zkp_0og_check (const gcry_mpi_point_t alpha, | |||
922 | gcry_mpi_ec_add (right, right, tmp, ec_ctx); | 1003 | gcry_mpi_ec_add (right, right, tmp, ec_ctx); |
923 | ret |= ec_point_cmp (b2, right) << 4; | 1004 | ret |= ec_point_cmp (b2, right) << 4; |
924 | 1005 | ||
1006 | gcry_mpi_release (c); | ||
925 | gcry_mpi_release (sum); | 1007 | gcry_mpi_release (sum); |
926 | gcry_mpi_point_release (right); | 1008 | gcry_mpi_point_release (right); |
927 | gcry_mpi_point_release (tmp); | 1009 | gcry_mpi_point_release (tmp); |