aboutsummaryrefslogtreecommitdiff
path: root/crypto.c
diff options
context:
space:
mode:
authorMarkus Teich <markus.teich@stusta.mhn.de>2016-06-21 16:12:57 +0200
committerMarkus Teich <markus.teich@stusta.mhn.de>2016-06-21 16:12:57 +0200
commit77f396003c6792c3cad8b41b19dd9e8d9435198c (patch)
treee7d5085c86564e3b3b1a80e5a25f9c80ff3a835c /crypto.c
parent24191a69683ca8fb7d01c26ec889f13a3f7d8ba8 (diff)
downloadlibbrandt-77f396003c6792c3cad8b41b19dd9e8d9435198c.tar.gz
libbrandt-77f396003c6792c3cad8b41b19dd9e8d9435198c.zip
use hash to generate challange in ZKPs
Diffstat (limited to 'crypto.c')
-rw-r--r--crypto.c190
1 files changed, 136 insertions, 54 deletions
diff --git a/crypto.c b/crypto.c
index f892e7d..d3da75d 100644
--- a/crypto.c
+++ b/crypto.c
@@ -30,6 +30,32 @@
30#define CURVE "Ed25519" 30#define CURVE "Ed25519"
31 31
32 32
33struct zkp_challenge_dl {
34 struct ec_mpi g;
35 struct ec_mpi v;
36 struct ec_mpi a;
37};
38
39struct 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
48struct 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
33static gcry_ctx_t ec_ctx; 59static gcry_ctx_t ec_ctx;
34static gcry_mpi_point_t ec_gen; 60static gcry_mpi_point_t ec_gen;
35static gcry_mpi_point_t ec_zero; 61static 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 */
592void 615void
@@ -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
628smc_zkp_dl_check (const gcry_mpi_point_t v, 655smc_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 */
663void 700void
@@ -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);