aboutsummaryrefslogtreecommitdiff
path: root/src/scalarproduct
diff options
context:
space:
mode:
authorChristian Fuchs <christian.fuchs@cfuchs.net>2014-02-03 16:56:34 +0000
committerChristian Fuchs <christian.fuchs@cfuchs.net>2014-02-03 16:56:34 +0000
commit92a7f822eacb4dec18adc1a53008cfc64b62bed1 (patch)
treeb64627ddca1be8b27c56a476fcffd4371e29ff2e /src/scalarproduct
parentd6d4ffb707a1607c5aaa8e790de6afa21a195afe (diff)
downloadgnunet-92a7f822eacb4dec18adc1a53008cfc64b62bed1.tar.gz
gnunet-92a7f822eacb4dec18adc1a53008cfc64b62bed1.zip
- begun migrating scalarproduct to use crypto_paillier and set intersection
- removed paillier from the regular build for now - partially replaced pailier-encryption functionality in scalarproduct with the new API
Diffstat (limited to 'src/scalarproduct')
-rw-r--r--src/scalarproduct/gnunet-service-scalarproduct.c93
1 files changed, 18 insertions, 75 deletions
diff --git a/src/scalarproduct/gnunet-service-scalarproduct.c b/src/scalarproduct/gnunet-service-scalarproduct.c
index 44d80ed1f..154c48d8f 100644
--- a/src/scalarproduct/gnunet-service-scalarproduct.c
+++ b/src/scalarproduct/gnunet-service-scalarproduct.c
@@ -471,36 +471,6 @@ adjust (unsigned char *buf, size_t size, size_t target)
471 471
472 472
473/** 473/**
474 * Encrypts an element using the paillier crypto system
475 *
476 * @param c ciphertext (output)
477 * @param m plaintext
478 * @param g the public base
479 * @param n the module from which which r is chosen (Z*_n)
480 * @param n_square the module for encryption, for performance reasons.
481 */
482static void
483encrypt_element (gcry_mpi_t c, gcry_mpi_t m, gcry_mpi_t g, gcry_mpi_t n, gcry_mpi_t n_square)
484{
485 gcry_mpi_t tmp;
486
487 GNUNET_assert (tmp = gcry_mpi_new (0));
488
489 while (0 >= gcry_mpi_cmp_ui (tmp, 1))
490 {
491 gcry_mpi_randomize (tmp, KEYBITS / 3, GCRY_WEAK_RANDOM);
492 // r must be 1 < r < n
493 }
494
495 gcry_mpi_powm (c, g, m, n_square);
496 gcry_mpi_powm (tmp, tmp, n, n_square);
497 gcry_mpi_mulm (c, tmp, c, n_square);
498
499 gcry_mpi_release (tmp);
500}
501
502
503/**
504 * decrypts an element using the paillier crypto system 474 * decrypts an element using the paillier crypto system
505 * 475 *
506 * @param m plaintext (output) 476 * @param m plaintext (output)
@@ -1211,7 +1181,9 @@ compute_service_response (struct ServiceSession * request,
1211 uint32_t count; 1181 uint32_t count;
1212 gcry_mpi_t * rand = NULL; 1182 gcry_mpi_t * rand = NULL;
1213 gcry_mpi_t * r = NULL; 1183 gcry_mpi_t * r = NULL;
1184 struct GNUNET_CRYPTO_PaillierCiphertext * R;
1214 gcry_mpi_t * r_prime = NULL; 1185 gcry_mpi_t * r_prime = NULL;
1186 struct GNUNET_CRYPTO_PaillierCiphertext * R_prime;
1215 gcry_mpi_t * b; 1187 gcry_mpi_t * b;
1216 gcry_mpi_t * a_pi; 1188 gcry_mpi_t * a_pi;
1217 gcry_mpi_t * a_pi_prime; 1189 gcry_mpi_t * a_pi_prime;
@@ -1220,10 +1192,7 @@ compute_service_response (struct ServiceSession * request,
1220 gcry_mpi_t * rand_pi_prime; 1192 gcry_mpi_t * rand_pi_prime;
1221 gcry_mpi_t s = NULL; 1193 gcry_mpi_t s = NULL;
1222 gcry_mpi_t s_prime = NULL; 1194 gcry_mpi_t s_prime = NULL;
1223 gcry_mpi_t remote_n = NULL; 1195
1224 gcry_mpi_t remote_nsquare;
1225 gcry_mpi_t remote_g = NULL;
1226 gcry_sexp_t tmp_exp;
1227 uint32_t value; 1196 uint32_t value;
1228 1197
1229 count = request->used; 1198 count = request->used;
@@ -1257,42 +1226,6 @@ compute_service_response (struct ServiceSession * request,
1257 response->vector = NULL; 1226 response->vector = NULL;
1258 q = NULL; 1227 q = NULL;
1259 p = NULL; 1228 p = NULL;
1260 tmp_exp = gcry_sexp_find_token (request->remote_pubkey, "n", 0);
1261 if (!tmp_exp)
1262 {
1263 GNUNET_break_op (0);
1264 gcry_sexp_release (request->remote_pubkey);
1265 request->remote_pubkey = NULL;
1266 goto except;
1267 }
1268 remote_n = gcry_sexp_nth_mpi (tmp_exp, 1, GCRYMPI_FMT_USG);
1269 if (!remote_n)
1270 {
1271 GNUNET_break (0);
1272 gcry_sexp_release (tmp_exp);
1273 goto except;
1274 }
1275 remote_nsquare = gcry_mpi_new (KEYBITS + 1);
1276 gcry_mpi_mul (remote_nsquare, remote_n, remote_n);
1277 gcry_sexp_release (tmp_exp);
1278 tmp_exp = gcry_sexp_find_token (request->remote_pubkey, "g", 0);
1279 gcry_sexp_release (request->remote_pubkey);
1280 request->remote_pubkey = NULL;
1281 if (!tmp_exp)
1282 {
1283 GNUNET_break_op (0);
1284 gcry_mpi_release (remote_n);
1285 goto except;
1286 }
1287 remote_g = gcry_sexp_nth_mpi (tmp_exp, 1, GCRYMPI_FMT_USG);
1288 if (!remote_g)
1289 {
1290 GNUNET_break (0);
1291 gcry_mpi_release (remote_n);
1292 gcry_sexp_release (tmp_exp);
1293 goto except;
1294 }
1295 gcry_sexp_release (tmp_exp);
1296 1229
1297 // generate r, p and q 1230 // generate r, p and q
1298 rand = initialize_mpi_vector (count); 1231 rand = initialize_mpi_vector (count);
@@ -1341,10 +1274,15 @@ compute_service_response (struct ServiceSession * request,
1341 // E(S - r_pi - b_pi) 1274 // E(S - r_pi - b_pi)
1342 gcry_mpi_sub (r[i], my_offset, rand_pi[i]); 1275 gcry_mpi_sub (r[i], my_offset, rand_pi[i]);
1343 gcry_mpi_sub (r[i], r[i], b_pi[i]); 1276 gcry_mpi_sub (r[i], r[i], b_pi[i]);
1344 encrypt_element (r[i], r[i], remote_g, remote_n, remote_nsquare); 1277 GNUNET_CRYPTO_paillier_encrypt (&request->remote_pubkey,
1345 1278 r[i],
1279 &R[i]);
1280
1346 // E(S - r_pi - b_pi) * E(S + a_pi) == E(2*S + a - r - b) 1281 // E(S - r_pi - b_pi) * E(S + a_pi) == E(2*S + a - r - b)
1347 gcry_mpi_mulm (r[i], r[i], a_pi[i], remote_nsquare); 1282 GNUNET_CRYPTO_paillier_hom_add (&request->remote_pubkey,
1283 &R[i],
1284 &A_pi[i],
1285 &R[i]);
1348 } 1286 }
1349 GNUNET_free (a_pi); 1287 GNUNET_free (a_pi);
1350 GNUNET_free (b_pi); 1288 GNUNET_free (b_pi);
@@ -1355,10 +1293,15 @@ compute_service_response (struct ServiceSession * request,
1355 { 1293 {
1356 // E(S - r_qi) 1294 // E(S - r_qi)
1357 gcry_mpi_sub (r_prime[i], my_offset, rand_pi_prime[i]); 1295 gcry_mpi_sub (r_prime[i], my_offset, rand_pi_prime[i]);
1358 encrypt_element (r_prime[i], r_prime[i], remote_g, remote_n, remote_nsquare); 1296 GNUNET_CRYPTO_paillier_encrypt (&request->remote_pubkey,
1297 r_prime[i],
1298 &R_prime[i]);
1359 1299
1360 // E(S - r_qi) * E(S + a_qi) == E(2*S + a_qi - r_qi) 1300 // E(S - r_qi) * E(S + a_qi) == E(2*S + a_qi - r_qi)
1361 gcry_mpi_mulm (r_prime[i], r_prime[i], a_pi_prime[i], remote_nsquare); 1301 GNUNET_CRYPTO_paillier_hom_add (&request->remote_pubkey,
1302 &R_prime[i],
1303 &A_pi_prime[i],
1304 &R_prime[i]);
1362 } 1305 }
1363 GNUNET_free (a_pi_prime); 1306 GNUNET_free (a_pi_prime);
1364 GNUNET_free (rand_pi_prime); 1307 GNUNET_free (rand_pi_prime);