aboutsummaryrefslogtreecommitdiff
path: root/src/scalarproduct
diff options
context:
space:
mode:
authorChristian Fuchs <christian.fuchs@cfuchs.net>2013-10-04 14:41:54 +0000
committerChristian Fuchs <christian.fuchs@cfuchs.net>2013-10-04 14:41:54 +0000
commited9c614f78b9a53d1c0a928a47e6f07f8470adfa (patch)
tree48ba2f289c14e179689d224c0c0028eb002bae3f /src/scalarproduct
parentc53de7e597b8f10efe19b0e44e879a4c7a431580 (diff)
downloadgnunet-ed9c614f78b9a53d1c0a928a47e6f07f8470adfa.tar.gz
gnunet-ed9c614f78b9a53d1c0a928a47e6f07f8470adfa.zip
more work on multipart support
Diffstat (limited to 'src/scalarproduct')
-rw-r--r--src/scalarproduct/gnunet-service-scalarproduct.c91
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 */
817static int 827static int
818prepare_service_response (gcry_mpi_t * r, 828prepare_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
1136except: 1143except:
1137 for (i = 0; i < count; i++) 1144 for (i = 0; i < count; i++)
1138 { 1145 {