diff options
author | Christian Fuchs <christian.fuchs@cfuchs.net> | 2014-02-03 16:56:34 +0000 |
---|---|---|
committer | Christian Fuchs <christian.fuchs@cfuchs.net> | 2014-02-03 16:56:34 +0000 |
commit | 92a7f822eacb4dec18adc1a53008cfc64b62bed1 (patch) | |
tree | b64627ddca1be8b27c56a476fcffd4371e29ff2e /src/scalarproduct | |
parent | d6d4ffb707a1607c5aaa8e790de6afa21a195afe (diff) | |
download | gnunet-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.c | 93 |
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 | */ | ||
482 | static void | ||
483 | encrypt_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); |