aboutsummaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
authorSupriti Singh <supritisingh08@gmail.com>2014-02-07 00:14:43 +0000
committerSupriti Singh <supritisingh08@gmail.com>2014-02-07 00:14:43 +0000
commitba430ff1fbce68a8940e448f0e0fe7266fa638b5 (patch)
tree88b3f2a2ded45cb4e0a06bbff8c90582a30f53e6 /src/util
parentd76a8b89e6ff8ab39f65e75ab4ff0c6f21a63a5f (diff)
downloadgnunet-ba430ff1fbce68a8940e448f0e0fe7266fa638b5.tar.gz
gnunet-ba430ff1fbce68a8940e448f0e0fe7266fa638b5.zip
Computing finger identity using libgcrypt functions.
Diffstat (limited to 'src/util')
-rw-r--r--src/util/crypto_ecc.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/util/crypto_ecc.c b/src/util/crypto_ecc.c
index 23d6ade7e..2de97cb8c 100644
--- a/src/util/crypto_ecc.c
+++ b/src/util/crypto_ecc.c
@@ -1448,6 +1448,73 @@ GNUNET_CRYPTO_ecdsa_private_key_derive (const struct GNUNET_CRYPTO_EcdsaPrivateK
1448 1448
1449 1449
1450/** 1450/**
1451 * Computes a new PeerIdentity using the Chord formula.
1452 * new_peer_identity = ((my_identity + pow(2,i)) mod (pow(2,m)
1453 * where m, size of struct GNUNET_PeerIdentity in bits.
1454 * i, 0 <= i <= m
1455 * @param my_identity original PeerIdentity
1456 * @param value of i.
1457 * @return finger_identity
1458 */
1459struct GNUNET_PeerIdentity *
1460GNUNET_CRYPTO_compute_finger(struct GNUNET_PeerIdentity *my_identity, unsigned int index)
1461{
1462 gcry_mpi_t my_identity_mpi;
1463 gcry_mpi_t finger_identity_mpi;
1464 gcry_mpi_t add;
1465 gcry_mpi_t mod;
1466 gcry_error_t rc;
1467 struct GNUNET_PeerIdentity *finger_identity;
1468 size_t read = 0;
1469 size_t write = 0;
1470
1471 finger_identity = GNUNET_malloc(sizeof(struct GNUNET_PeerIdentity));
1472
1473 /* Initialize my_identity_mpi. */
1474 my_identity_mpi = gcry_mpi_new(8*sizeof(struct GNUNET_PeerIdentity));
1475
1476 /* Copy my_identity into my_id */
1477 if(0 != (rc = gcry_mpi_scan(&my_identity_mpi, GCRYMPI_FMT_USG, my_identity->public_key.q_y,
1478 sizeof(struct GNUNET_PeerIdentity), &read)))
1479 {
1480 LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_scan", rc);
1481 GNUNET_free(finger_identity);
1482 return NULL;
1483 }
1484
1485 /* Initialize finger_identity_mpi */
1486 finger_identity_mpi = gcry_mpi_new(8*sizeof(struct GNUNET_PeerIdentity));
1487
1488 /* Initialize add */
1489 add = gcry_mpi_new(8*sizeof(struct GNUNET_PeerIdentity));
1490
1491 /* Set the index bit in add.*/
1492 gcry_mpi_set_bit(add,index);
1493
1494 /* Initialize mod */
1495 mod = gcry_mpi_new(8*sizeof(struct GNUNET_PeerIdentity) + 1);
1496 gcry_mpi_set_bit(mod,257);
1497 gcry_mpi_sub_ui(mod,mod,(unsigned long)1);
1498
1499
1500 /* finger_identity_mpi = (my_identity_mpi + add) % mod */
1501 gcry_mpi_addm(finger_identity_mpi,my_identity_mpi,add,mod);
1502
1503
1504 /* Copy finger_identity_mpi to finger_identity */
1505 if(0 != (rc = gcry_mpi_print(GCRYMPI_FMT_USG,finger_identity->public_key.q_y,
1506 32,&write,finger_identity_mpi)))
1507 {
1508 LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_print", rc);
1509 GNUNET_free(finger_identity);
1510 return NULL;
1511 }
1512
1513 return finger_identity;
1514}
1515
1516
1517/**
1451 * Derive a public key from a given public key and a label. 1518 * Derive a public key from a given public key and a label.
1452 * Essentially calculates a public key 'V = H(l,P) * P'. 1519 * Essentially calculates a public key 'V = H(l,P) * P'.
1453 * 1520 *