diff options
author | Christian Grothoff <christian@grothoff.org> | 2014-12-11 21:55:36 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2014-12-11 21:55:36 +0000 |
commit | addd20663f6f7ccdd666af0bc07b41c384e956a2 (patch) | |
tree | 699b69ec8adde0972ef57b3e7b6737b7ee66ad92 /src/scalarproduct/gnunet-service-scalarproduct_bob.c | |
parent | dcc098d1fdefcb74bed0a6ff6f81347500367ab6 (diff) | |
download | gnunet-addd20663f6f7ccdd666af0bc07b41c384e956a2.tar.gz gnunet-addd20663f6f7ccdd666af0bc07b41c384e956a2.zip |
-fix bugs
Diffstat (limited to 'src/scalarproduct/gnunet-service-scalarproduct_bob.c')
-rw-r--r-- | src/scalarproduct/gnunet-service-scalarproduct_bob.c | 89 |
1 files changed, 57 insertions, 32 deletions
diff --git a/src/scalarproduct/gnunet-service-scalarproduct_bob.c b/src/scalarproduct/gnunet-service-scalarproduct_bob.c index 2c6d607e5..e4ceecc4e 100644 --- a/src/scalarproduct/gnunet-service-scalarproduct_bob.c +++ b/src/scalarproduct/gnunet-service-scalarproduct_bob.c | |||
@@ -542,7 +542,7 @@ bob_cadet_done_cb (void *cls) | |||
542 | /** | 542 | /** |
543 | * Maximum count of elements we can put into a multipart message | 543 | * Maximum count of elements we can put into a multipart message |
544 | */ | 544 | */ |
545 | #define ELEMENT_CAPACITY ((GNUNET_CONSTANTS_MAX_CADET_MESSAGE_SIZE - sizeof (struct BobCryptodataMultipartMessage)) / sizeof (struct GNUNET_CRYPTO_PaillierCiphertext)) | 545 | #define ELEMENT_CAPACITY ((GNUNET_CONSTANTS_MAX_CADET_MESSAGE_SIZE - 1 - sizeof (struct BobCryptodataMultipartMessage)) / sizeof (struct GNUNET_CRYPTO_PaillierCiphertext)) |
546 | 546 | ||
547 | 547 | ||
548 | /** | 548 | /** |
@@ -615,8 +615,9 @@ transmit_bobs_cryptodata_message (struct BobServiceSession *s) | |||
615 | struct GNUNET_CRYPTO_PaillierCiphertext *payload; | 615 | struct GNUNET_CRYPTO_PaillierCiphertext *payload; |
616 | unsigned int i; | 616 | unsigned int i; |
617 | 617 | ||
618 | s->cadet_transmitted_element_count = (GNUNET_SERVER_MAX_MESSAGE_SIZE - 1 - sizeof (struct BobCryptodataMessage)) / | 618 | s->cadet_transmitted_element_count |
619 | (sizeof (struct GNUNET_CRYPTO_PaillierCiphertext) * 2) - 2; | 619 | = ((GNUNET_CONSTANTS_MAX_CADET_MESSAGE_SIZE - 1 - sizeof (struct BobCryptodataMessage)) |
620 | / sizeof (struct GNUNET_CRYPTO_PaillierCiphertext) / 2) - 1; | ||
620 | if (s->cadet_transmitted_element_count > s->used_element_count) | 621 | if (s->cadet_transmitted_element_count > s->used_element_count) |
621 | s->cadet_transmitted_element_count = s->used_element_count; | 622 | s->cadet_transmitted_element_count = s->used_element_count; |
622 | 623 | ||
@@ -659,6 +660,7 @@ transmit_bobs_cryptodata_message (struct BobServiceSession *s) | |||
659 | e); | 660 | e); |
660 | transmit_bobs_cryptodata_message_multipart (s); | 661 | transmit_bobs_cryptodata_message_multipart (s); |
661 | } | 662 | } |
663 | #undef ELEMENT_CAPACITY | ||
662 | 664 | ||
663 | 665 | ||
664 | /** | 666 | /** |
@@ -697,8 +699,9 @@ compute_square_sum (const gcry_mpi_t *vector, | |||
697 | * S': $S' := E_A(sum r_i^2)$ | 699 | * S': $S' := E_A(sum r_i^2)$ |
698 | * | 700 | * |
699 | * @param request the requesting session + bob's requesting peer | 701 | * @param request the requesting session + bob's requesting peer |
702 | * @return #GNUNET_OK on success | ||
700 | */ | 703 | */ |
701 | static void | 704 | static int |
702 | compute_service_response (struct BobServiceSession *session) | 705 | compute_service_response (struct BobServiceSession *session) |
703 | { | 706 | { |
704 | uint32_t i; | 707 | uint32_t i; |
@@ -751,16 +754,22 @@ compute_service_response (struct BobServiceSession *session) | |||
751 | // E(S - r_pi - b_pi) | 754 | // E(S - r_pi - b_pi) |
752 | gcry_mpi_sub (tmp, my_offset, rand[p[i]]); | 755 | gcry_mpi_sub (tmp, my_offset, rand[p[i]]); |
753 | gcry_mpi_sub (tmp, tmp, b[p[i]].value); | 756 | gcry_mpi_sub (tmp, tmp, b[p[i]].value); |
754 | GNUNET_CRYPTO_paillier_encrypt (&session->cadet->remote_pubkey, | 757 | GNUNET_assert (2 == |
755 | tmp, | 758 | GNUNET_CRYPTO_paillier_encrypt (&session->cadet->remote_pubkey, |
756 | 2, | 759 | tmp, |
757 | &r[i]); | 760 | 2, |
761 | &r[i])); | ||
758 | 762 | ||
759 | // E(S - r_pi - b_pi) * E(S + a_pi) == E(2*S + a - r - b) | 763 | // E(S - r_pi - b_pi) * E(S + a_pi) == E(2*S + a - r - b) |
760 | GNUNET_CRYPTO_paillier_hom_add (&session->cadet->remote_pubkey, | 764 | if (GNUNET_OK != |
761 | &r[i], | 765 | GNUNET_CRYPTO_paillier_hom_add (&session->cadet->remote_pubkey, |
762 | &a[p[i]], | 766 | &r[i], |
763 | &r[i]); | 767 | &a[p[i]], |
768 | &r[i])) | ||
769 | { | ||
770 | GNUNET_break_op (0); | ||
771 | return GNUNET_SYSERR; | ||
772 | } | ||
764 | } | 773 | } |
765 | 774 | ||
766 | // Calculate Kq = E(S + a_qi) (+) E(S - r_qi) | 775 | // Calculate Kq = E(S + a_qi) (+) E(S - r_qi) |
@@ -768,35 +777,43 @@ compute_service_response (struct BobServiceSession *session) | |||
768 | { | 777 | { |
769 | // E(S - r_qi) | 778 | // E(S - r_qi) |
770 | gcry_mpi_sub (tmp, my_offset, rand[q[i]]); | 779 | gcry_mpi_sub (tmp, my_offset, rand[q[i]]); |
771 | GNUNET_assert (2 == GNUNET_CRYPTO_paillier_encrypt (&session->cadet->remote_pubkey, | 780 | GNUNET_assert (2 == |
772 | tmp, | 781 | GNUNET_CRYPTO_paillier_encrypt (&session->cadet->remote_pubkey, |
773 | 2, | 782 | tmp, |
774 | &r_prime[i])); | 783 | 2, |
784 | &r_prime[i])); | ||
775 | 785 | ||
776 | // E(S - r_qi) * E(S + a_qi) == E(2*S + a_qi - r_qi) | 786 | // E(S - r_qi) * E(S + a_qi) == E(2*S + a_qi - r_qi) |
777 | GNUNET_assert (1 == GNUNET_CRYPTO_paillier_hom_add (&session->cadet->remote_pubkey, | 787 | if (GNUNET_OK != |
778 | &r_prime[i], | 788 | GNUNET_CRYPTO_paillier_hom_add (&session->cadet->remote_pubkey, |
779 | &a[q[i]], | 789 | &r_prime[i], |
780 | &r_prime[i])); | 790 | &a[q[i]], |
791 | &r_prime[i])) | ||
792 | { | ||
793 | GNUNET_break_op (0); | ||
794 | return GNUNET_SYSERR; | ||
795 | } | ||
781 | } | 796 | } |
782 | gcry_mpi_release (tmp); | 797 | gcry_mpi_release (tmp); |
783 | 798 | ||
784 | // Calculate S' = E(SUM( r_i^2 )) | 799 | // Calculate S' = E(SUM( r_i^2 )) |
785 | tmp = compute_square_sum (rand, count); | 800 | tmp = compute_square_sum (rand, count); |
786 | GNUNET_CRYPTO_paillier_encrypt (&session->cadet->remote_pubkey, | 801 | GNUNET_assert (1 == |
787 | tmp, | 802 | GNUNET_CRYPTO_paillier_encrypt (&session->cadet->remote_pubkey, |
788 | 1, | 803 | tmp, |
789 | &session->s_prime); | 804 | 1, |
805 | &session->s_prime)); | ||
790 | gcry_mpi_release (tmp); | 806 | gcry_mpi_release (tmp); |
791 | 807 | ||
792 | // Calculate S = E(SUM( (r_i + b_i)^2 )) | 808 | // Calculate S = E(SUM( (r_i + b_i)^2 )) |
793 | for (i = 0; i < count; i++) | 809 | for (i = 0; i < count; i++) |
794 | gcry_mpi_add (rand[i], rand[i], b[i].value); | 810 | gcry_mpi_add (rand[i], rand[i], b[i].value); |
795 | tmp = compute_square_sum (rand, count); | 811 | tmp = compute_square_sum (rand, count); |
796 | GNUNET_CRYPTO_paillier_encrypt (&session->cadet->remote_pubkey, | 812 | GNUNET_assert (1 == |
797 | tmp, | 813 | GNUNET_CRYPTO_paillier_encrypt (&session->cadet->remote_pubkey, |
798 | 1, | 814 | tmp, |
799 | &session->s); | 815 | 1, |
816 | &session->s)); | ||
800 | gcry_mpi_release (tmp); | 817 | gcry_mpi_release (tmp); |
801 | 818 | ||
802 | session->r = r; | 819 | session->r = r; |
@@ -810,8 +827,7 @@ compute_service_response (struct BobServiceSession *session) | |||
810 | GNUNET_free (p); | 827 | GNUNET_free (p); |
811 | GNUNET_free (q); | 828 | GNUNET_free (q); |
812 | GNUNET_free (rand); | 829 | GNUNET_free (rand); |
813 | 830 | return GNUNET_OK; | |
814 | // copy the r[], r_prime[], S and Stick into a new message, prepare_service_response frees these | ||
815 | } | 831 | } |
816 | 832 | ||
817 | 833 | ||
@@ -877,6 +893,8 @@ element_cmp (const void *a, | |||
877 | static void | 893 | static void |
878 | transmit_cryptographic_reply (struct BobServiceSession *s) | 894 | transmit_cryptographic_reply (struct BobServiceSession *s) |
879 | { | 895 | { |
896 | struct GNUNET_CADET_Channel *channel; | ||
897 | |||
880 | /* TODO: code duplication with Alice! */ | 898 | /* TODO: code duplication with Alice! */ |
881 | LOG (GNUNET_ERROR_TYPE_DEBUG, | 899 | LOG (GNUNET_ERROR_TYPE_DEBUG, |
882 | "Received everything, building reply for Alice\n"); | 900 | "Received everything, building reply for Alice\n"); |
@@ -891,7 +909,14 @@ transmit_cryptographic_reply (struct BobServiceSession *s) | |||
891 | s->used_element_count, | 909 | s->used_element_count, |
892 | sizeof (struct MpiElement), | 910 | sizeof (struct MpiElement), |
893 | &element_cmp); | 911 | &element_cmp); |
894 | compute_service_response (s); | 912 | if (GNUNET_OK != |
913 | compute_service_response (s)) | ||
914 | { | ||
915 | channel = s->cadet->channel; | ||
916 | s->cadet->channel = NULL; | ||
917 | GNUNET_CADET_channel_destroy (channel); | ||
918 | return; | ||
919 | } | ||
895 | transmit_bobs_cryptodata_message (s); | 920 | transmit_bobs_cryptodata_message (s); |
896 | } | 921 | } |
897 | 922 | ||
@@ -1421,7 +1446,7 @@ shutdown_task (void *cls, | |||
1421 | { | 1446 | { |
1422 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 1447 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
1423 | "Shutting down, initiating cleanup.\n"); | 1448 | "Shutting down, initiating cleanup.\n"); |
1424 | // FIXME: do we have to cut our connections to CADET first? | 1449 | // FIXME: we have to cut our connections to CADET first! |
1425 | if (NULL != my_cadet) | 1450 | if (NULL != my_cadet) |
1426 | { | 1451 | { |
1427 | GNUNET_CADET_disconnect (my_cadet); | 1452 | GNUNET_CADET_disconnect (my_cadet); |