diff options
author | Christian Fuchs <christian.fuchs@cfuchs.net> | 2013-10-04 14:41:54 +0000 |
---|---|---|
committer | Christian Fuchs <christian.fuchs@cfuchs.net> | 2013-10-04 14:41:54 +0000 |
commit | ed9c614f78b9a53d1c0a928a47e6f07f8470adfa (patch) | |
tree | 48ba2f289c14e179689d224c0c0028eb002bae3f /src/scalarproduct | |
parent | c53de7e597b8f10efe19b0e44e879a4c7a431580 (diff) | |
download | gnunet-ed9c614f78b9a53d1c0a928a47e6f07f8470adfa.tar.gz gnunet-ed9c614f78b9a53d1c0a928a47e6f07f8470adfa.zip |
more work on multipart support
Diffstat (limited to 'src/scalarproduct')
-rw-r--r-- | src/scalarproduct/gnunet-service-scalarproduct.c | 91 |
1 files changed, 49 insertions, 42 deletions
diff --git a/src/scalarproduct/gnunet-service-scalarproduct.c b/src/scalarproduct/gnunet-service-scalarproduct.c index f4586235e..e3775f79a 100644 --- a/src/scalarproduct/gnunet-service-scalarproduct.c +++ b/src/scalarproduct/gnunet-service-scalarproduct.c | |||
@@ -155,6 +155,16 @@ struct ServiceSession | |||
155 | gcry_mpi_t * a; | 155 | gcry_mpi_t * a; |
156 | 156 | ||
157 | /** | 157 | /** |
158 | * Bob's permutation p of R | ||
159 | */ | ||
160 | gcry_mpi_t * r; | ||
161 | |||
162 | /** | ||
163 | * Bob's permutation q of R | ||
164 | */ | ||
165 | gcry_mpi_t * r_prime; | ||
166 | |||
167 | /** | ||
158 | * The computed scalar | 168 | * The computed scalar |
159 | */ | 169 | */ |
160 | gcry_mpi_t product; | 170 | gcry_mpi_t product; |
@@ -815,9 +825,7 @@ prepare_client_end_notification (void * cls, | |||
815 | * GNUNET_OK if the operation succeeded | 825 | * GNUNET_OK if the operation succeeded |
816 | */ | 826 | */ |
817 | static int | 827 | static int |
818 | prepare_service_response (gcry_mpi_t * r, | 828 | prepare_service_response (gcry_mpi_t s, |
819 | gcry_mpi_t * r_prime, | ||
820 | gcry_mpi_t s, | ||
821 | gcry_mpi_t s_prime, | 829 | gcry_mpi_t s_prime, |
822 | struct ServiceSession * request, | 830 | struct ServiceSession * request, |
823 | struct ServiceSession * response) | 831 | struct ServiceSession * response) |
@@ -855,55 +863,60 @@ prepare_service_response (gcry_mpi_t * r, | |||
855 | // doesn't really justify having 2 functions for that | 863 | // doesn't really justify having 2 functions for that |
856 | // so i put it into blocks to enhance readability | 864 | // so i put it into blocks to enhance readability |
857 | // convert s | 865 | // convert s |
858 | { | 866 | memset (element_exported, 0, PAILLIER_ELEMENT_LENGTH); |
859 | memset(element_exported, 0, PAILLIER_ELEMENT_LENGTH); | 867 | GNUNET_assert (0 == gcry_mpi_print (GCRYMPI_FMT_USG, |
860 | GNUNET_assert (0 == gcry_mpi_print (GCRYMPI_FMT_USG, | 868 | element_exported, PAILLIER_ELEMENT_LENGTH, |
861 | element_exported, PAILLIER_ELEMENT_LENGTH, | 869 | &element_length, |
862 | &element_length, | 870 | s)); |
863 | s)); | 871 | adjust (element_exported, element_length, PAILLIER_ELEMENT_LENGTH); |
864 | adjust (element_exported, element_length, PAILLIER_ELEMENT_LENGTH); | 872 | memcpy (current, element_exported, PAILLIER_ELEMENT_LENGTH); |
865 | memcpy (current, element_exported, PAILLIER_ELEMENT_LENGTH); | 873 | current += PAILLIER_ELEMENT_LENGTH; |
866 | current += PAILLIER_ELEMENT_LENGTH; | 874 | |
867 | } | ||
868 | // convert stick | 875 | // convert stick |
869 | { | 876 | memset (element_exported, 0, PAILLIER_ELEMENT_LENGTH); |
870 | memset(element_exported, 0, PAILLIER_ELEMENT_LENGTH); | 877 | GNUNET_assert (0 == gcry_mpi_print (GCRYMPI_FMT_USG, |
871 | GNUNET_assert (0 == gcry_mpi_print (GCRYMPI_FMT_USG, | 878 | element_exported, PAILLIER_ELEMENT_LENGTH, |
872 | element_exported, PAILLIER_ELEMENT_LENGTH, | 879 | &element_length, |
873 | &element_length, | 880 | s_prime)); |
874 | s_prime)); | 881 | adjust (element_exported, element_length, PAILLIER_ELEMENT_LENGTH); |
875 | adjust (element_exported, element_length, PAILLIER_ELEMENT_LENGTH); | 882 | memcpy (current, element_exported, PAILLIER_ELEMENT_LENGTH); |
876 | memcpy (current, element_exported, PAILLIER_ELEMENT_LENGTH); | 883 | current += PAILLIER_ELEMENT_LENGTH; |
877 | 884 | ||
878 | current += PAILLIER_ELEMENT_LENGTH; | ||
879 | } | ||
880 | // convert k[][] | 885 | // convert k[][] |
881 | for (i = 0; i < request->used_element_count; i++) | 886 | for (i = 0; i < request->used_element_count; i++) |
882 | { | 887 | { |
883 | if (request->transferred_element_count <= i) | 888 | if (request->transferred_element_count <= i) |
884 | break; //reached end of this message, can't include more | 889 | break; //reached end of this message, can't include more |
885 | 890 | ||
886 | //k[i][p] | 891 | //k[i][p] |
887 | memset(element_exported, 0, PAILLIER_ELEMENT_LENGTH); | 892 | memset (element_exported, 0, PAILLIER_ELEMENT_LENGTH); |
888 | GNUNET_assert (0 == gcry_mpi_print (GCRYMPI_FMT_USG, | 893 | GNUNET_assert (0 == gcry_mpi_print (GCRYMPI_FMT_USG, |
889 | element_exported, PAILLIER_ELEMENT_LENGTH, | 894 | element_exported, PAILLIER_ELEMENT_LENGTH, |
890 | &element_length, | 895 | &element_length, |
891 | r[i])); | 896 | request->r[i])); |
892 | adjust (element_exported, element_length, PAILLIER_ELEMENT_LENGTH); | 897 | adjust (element_exported, element_length, PAILLIER_ELEMENT_LENGTH); |
893 | memcpy (current, element_exported, PAILLIER_ELEMENT_LENGTH); | 898 | memcpy (current, element_exported, PAILLIER_ELEMENT_LENGTH); |
894 | current += PAILLIER_ELEMENT_LENGTH; | 899 | current += PAILLIER_ELEMENT_LENGTH; |
895 | //k[i][q] | 900 | //k[i][q] |
896 | memset(element_exported, 0, PAILLIER_ELEMENT_LENGTH); | 901 | memset (element_exported, 0, PAILLIER_ELEMENT_LENGTH); |
897 | GNUNET_assert (0 == gcry_mpi_print (GCRYMPI_FMT_USG, | 902 | GNUNET_assert (0 == gcry_mpi_print (GCRYMPI_FMT_USG, |
898 | element_exported, PAILLIER_ELEMENT_LENGTH, | 903 | element_exported, PAILLIER_ELEMENT_LENGTH, |
899 | &element_length, | 904 | &element_length, |
900 | r_prime[i])); | 905 | request->r_prime[i])); |
901 | adjust (element_exported, element_length, PAILLIER_ELEMENT_LENGTH); | 906 | adjust (element_exported, element_length, PAILLIER_ELEMENT_LENGTH); |
902 | memcpy (current, element_exported, PAILLIER_ELEMENT_LENGTH); | 907 | memcpy (current, element_exported, PAILLIER_ELEMENT_LENGTH); |
903 | current += PAILLIER_ELEMENT_LENGTH; | 908 | current += PAILLIER_ELEMENT_LENGTH; |
904 | } | 909 | } |
910 | |||
905 | GNUNET_free (element_exported); | 911 | GNUNET_free (element_exported); |
906 | 912 | for (i = 0; i < request->transferred_element_count; i++) | |
913 | { | ||
914 | gcry_mpi_release (request->r_prime[i]); | ||
915 | gcry_mpi_release (request->r[i]); | ||
916 | } | ||
917 | gcry_mpi_release (s); | ||
918 | gcry_mpi_release (s_prime); | ||
919 | |||
907 | request->msg = (struct GNUNET_MessageHeader *) msg; | 920 | request->msg = (struct GNUNET_MessageHeader *) msg; |
908 | request->service_transmit_handle = | 921 | request->service_transmit_handle = |
909 | GNUNET_MESH_notify_transmit_ready (request->tunnel, | 922 | GNUNET_MESH_notify_transmit_ready (request->tunnel, |
@@ -1096,6 +1109,9 @@ compute_service_response (struct ServiceSession * request, | |||
1096 | } | 1109 | } |
1097 | GNUNET_free (a_pi_prime); | 1110 | GNUNET_free (a_pi_prime); |
1098 | GNUNET_free (rand_pi_prime); | 1111 | GNUNET_free (rand_pi_prime); |
1112 | |||
1113 | request->r = r; | ||
1114 | request->r_prime = r_prime; | ||
1099 | 1115 | ||
1100 | // Calculate S' = E(SUM( r_i^2 )) | 1116 | // Calculate S' = E(SUM( r_i^2 )) |
1101 | s_prime = compute_square_sum (rand, count); | 1117 | s_prime = compute_square_sum (rand, count); |
@@ -1117,22 +1133,13 @@ compute_service_response (struct ServiceSession * request, | |||
1117 | // rp, rq, aq, ap, bp, bq are released along with a, r, b respectively, (a and b are handled at except:) | 1133 | // rp, rq, aq, ap, bp, bq are released along with a, r, b respectively, (a and b are handled at except:) |
1118 | gcry_mpi_release (rand[i]); | 1134 | gcry_mpi_release (rand[i]); |
1119 | 1135 | ||
1120 | // copy the Kp[], Kq[], S and Stick into a new message | 1136 | // copy the r[], r_prime[], S and Stick into a new message, prepare_service_response frees these |
1121 | if (GNUNET_YES != prepare_service_response (r, r_prime, s, s_prime, request, response)) | 1137 | if (GNUNET_YES != prepare_service_response (s, s_prime, request, response)) |
1122 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, _ ("Failed to communicate with `%s', scalar product calculation aborted.\n"), | 1138 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, _ ("Failed to communicate with `%s', scalar product calculation aborted.\n"), |
1123 | GNUNET_i2s (&request->peer)); | 1139 | GNUNET_i2s (&request->peer)); |
1124 | else | 1140 | else |
1125 | ret = GNUNET_OK; | 1141 | ret = GNUNET_OK; |
1126 | 1142 | ||
1127 | for (i = 0; i < count; i++) | ||
1128 | { | ||
1129 | gcry_mpi_release (r_prime[i]); | ||
1130 | gcry_mpi_release (r[i]); | ||
1131 | } | ||
1132 | |||
1133 | gcry_mpi_release (s); | ||
1134 | gcry_mpi_release (s_prime); | ||
1135 | |||
1136 | except: | 1143 | except: |
1137 | for (i = 0; i < count; i++) | 1144 | for (i = 0; i < count; i++) |
1138 | { | 1145 | { |