[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r32247 - in gnunet/src: dht include util
From: |
gnunet |
Subject: |
[GNUnet-SVN] r32247 - in gnunet/src: dht include util |
Date: |
Fri, 7 Feb 2014 01:14:43 +0100 |
Author: supriti
Date: 2014-02-07 01:14:43 +0100 (Fri, 07 Feb 2014)
New Revision: 32247
Modified:
gnunet/src/dht/gnunet-service-xdht_neighbours.c
gnunet/src/include/gnunet_crypto_lib.h
gnunet/src/util/crypto_ecc.c
Log:
Computing finger identity using libgcrypt functions.
Modified: gnunet/src/dht/gnunet-service-xdht_neighbours.c
===================================================================
--- gnunet/src/dht/gnunet-service-xdht_neighbours.c 2014-02-06 17:52:35 UTC
(rev 32246)
+++ gnunet/src/dht/gnunet-service-xdht_neighbours.c 2014-02-07 00:14:43 UTC
(rev 32247)
@@ -485,7 +485,7 @@
/**
* The current finger index that we have found trail to.
*/
-static unsigned int current_finger_id;
+static unsigned int current_finger_index;
/**
@@ -777,56 +777,29 @@
/**
- * TODO: Check the logic of using current_finger_id again.
- * This code is not correct. I need to check the pointers and
- * correct use of memcpy and all the data type.
- * Use Chord formula finger[i]=(n+2^(i-1))mod m,
- * where i = current finger map index - max. 256 bits
- * n = own peer identity - 256 bits
- * m = number of bits in peer id - 256 bits
- * @return finger_peer_id for which we have to find the trail through network.
+ * Find finger id to which we want to setup the trail
+ * @return finger id
*/
-static
+static
struct GNUNET_PeerIdentity *
-finger_id_to_search()
+compute_finger_identity()
{
- struct GNUNET_PeerIdentity *finger_peer_id;
- uint32_t peer_id;
- uint32_t finger_id;
+ struct GNUNET_PeerIdentity *finger_identity;
- finger_peer_id = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity));
-
- /* Copy unsigned char array into peer_id. */
- if (0 == memcpy(&peer_id,&my_identity.public_key.q_y,sizeof(uint32_t)))
- return NULL;
+ finger_identity =
GNUNET_CRYPTO_compute_finger(&my_identity,current_finger_index);
- /* We do all the arithmetic operation on peer_id to get finger_id*/
- finger_id = (uint32_t)(peer_id + pow(2,current_finger_id)) % MAX_FINGERS;
-
- /* Copy the finger_id to finger_peer_id. */
- if (0 == memcpy(&finger_peer_id->public_key.q_y,&finger_id,sizeof(uint32_t)))
- return NULL;
+ current_finger_index = (current_finger_index+1) % MAX_FINGERS;
-
- /* FIXME: Here I increment the index so that next time when we enter this
- function, then we begin the search from current index. Is it possible
- to set this value when we add the finger id to our finger table. No,
because
- even there is a call going on to find the finger, we can start another
call
- to search another peer. */
- current_finger_id = (current_finger_id+1) % MAX_FINGERS;
-
/* Check if you already have an entry in finger_peers for this finger_id.
- If yes then again look for a new finger_id. */
- /*if(NULL != GNUNET_CONTAINER_multipeermap_get(finger_peers,finger_peer_id))
+ If yes then again look for a new finger_id.
+ FIXME: Should we return NULL here?
+ if(NULL != GNUNET_CONTAINER_multipeermap_get(finger_peers,finger_peer_id))
{
-
- finger_peer_id = finger_id_to_search();
- }
- */
- return finger_peer_id;
+ finger_peer_id = compute_finger_identity();
+ }*/
+ return finger_identity;
}
-
/**
* TODO: Implement after testing friend/finger map.
* TODO: Handle the case when we already have a trail to our predecessor in
@@ -838,7 +811,7 @@
* @return peer identity of immediate predecessor.
*/
static
-struct GNUNET_PeerIdentity*
+struct GNUNET_PeerIdentity *
find_immediate_predecessor()
{
/* Using your own peer identity, calculate your predecessor
@@ -880,7 +853,7 @@
else
{
/* Find the finger_peer_id for which we want to setup the trail */
- finger_peer_id = finger_id_to_search();
+ finger_peer_id = compute_finger_identity();
}
/* Choose a friend randomly from your friend_peers map. */
@@ -897,7 +870,7 @@
DHT_MINIMUM_FIND_FINGER_TRAIL_INTERVAL.rel_value_us +
GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
DHT_MAXIMUM_FIND_FINGER_TRAIL_INTERVAL.rel_value_us /
- (current_finger_id + 1));
+ (current_finger_index + 1));
find_finger_trail_task =
GNUNET_SCHEDULER_add_delayed (next_send_time,
&send_find_finger_trail_message,
@@ -1059,6 +1032,11 @@
* FIXME:1. Check if current_destination field is set correctly.
* 2. Is it correct to use GNUNET_CMP_PEER_IDENTITY to find out the successor
* of a finger.
+ * 3. We should check the interval of the keys for which a peer is responsible
+ * when we are looking to find the correct peer to store a key. But
+ * --> How do we maintain this interval?
+ * --> Should we check this interval when we are looking for trail to a finger
+ * as in this function?
* The code flow seems to be very large. Could do better.
* @param destination peer id's predecessor we are looking for.
* @return
Modified: gnunet/src/include/gnunet_crypto_lib.h
===================================================================
--- gnunet/src/include/gnunet_crypto_lib.h 2014-02-06 17:52:35 UTC (rev
32246)
+++ gnunet/src/include/gnunet_crypto_lib.h 2014-02-07 00:14:43 UTC (rev
32247)
@@ -1268,6 +1268,19 @@
/**
+ * Computes a new PeerIdentity using the Chord formula.
+ * new_peer_identity = ((my_identity + pow(2,i)) mod (pow(2,m)
+ * where m, size of struct GNUNET_PeerIdentity in bits.
+ * i, 0 <= i <= m
+ * @param my_identity original PeerIdentity
+ * @param value of i.
+ * @return finger_identity
+ */
+struct GNUNET_PeerIdentity *
+GNUNET_CRYPTO_compute_finger(struct GNUNET_PeerIdentity *my_identity,unsigned
int index);
+
+
+/**
* @ingroup crypto
* Derive a public key from a given public key and a label.
* Essentially calculates a public key 'V = H(l,P) * P'.
Modified: gnunet/src/util/crypto_ecc.c
===================================================================
--- gnunet/src/util/crypto_ecc.c 2014-02-06 17:52:35 UTC (rev 32246)
+++ gnunet/src/util/crypto_ecc.c 2014-02-07 00:14:43 UTC (rev 32247)
@@ -1448,6 +1448,73 @@
/**
+ * Computes a new PeerIdentity using the Chord formula.
+ * new_peer_identity = ((my_identity + pow(2,i)) mod (pow(2,m)
+ * where m, size of struct GNUNET_PeerIdentity in bits.
+ * i, 0 <= i <= m
+ * @param my_identity original PeerIdentity
+ * @param value of i.
+ * @return finger_identity
+ */
+struct GNUNET_PeerIdentity *
+GNUNET_CRYPTO_compute_finger(struct GNUNET_PeerIdentity *my_identity, unsigned
int index)
+{
+ gcry_mpi_t my_identity_mpi;
+ gcry_mpi_t finger_identity_mpi;
+ gcry_mpi_t add;
+ gcry_mpi_t mod;
+ gcry_error_t rc;
+ struct GNUNET_PeerIdentity *finger_identity;
+ size_t read = 0;
+ size_t write = 0;
+
+ finger_identity = GNUNET_malloc(sizeof(struct GNUNET_PeerIdentity));
+
+ /* Initialize my_identity_mpi. */
+ my_identity_mpi = gcry_mpi_new(8*sizeof(struct GNUNET_PeerIdentity));
+
+ /* Copy my_identity into my_id */
+ if(0 != (rc = gcry_mpi_scan(&my_identity_mpi, GCRYMPI_FMT_USG,
my_identity->public_key.q_y,
+ sizeof(struct GNUNET_PeerIdentity), &read)))
+ {
+ LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_scan", rc);
+ GNUNET_free(finger_identity);
+ return NULL;
+ }
+
+ /* Initialize finger_identity_mpi */
+ finger_identity_mpi = gcry_mpi_new(8*sizeof(struct GNUNET_PeerIdentity));
+
+ /* Initialize add */
+ add = gcry_mpi_new(8*sizeof(struct GNUNET_PeerIdentity));
+
+ /* Set the index bit in add.*/
+ gcry_mpi_set_bit(add,index);
+
+ /* Initialize mod */
+ mod = gcry_mpi_new(8*sizeof(struct GNUNET_PeerIdentity) + 1);
+ gcry_mpi_set_bit(mod,257);
+ gcry_mpi_sub_ui(mod,mod,(unsigned long)1);
+
+
+ /* finger_identity_mpi = (my_identity_mpi + add) % mod */
+ gcry_mpi_addm(finger_identity_mpi,my_identity_mpi,add,mod);
+
+
+ /* Copy finger_identity_mpi to finger_identity */
+ if(0 != (rc =
gcry_mpi_print(GCRYMPI_FMT_USG,finger_identity->public_key.q_y,
+ 32,&write,finger_identity_mpi)))
+ {
+ LOG_GCRY (GNUNET_ERROR_TYPE_DEBUG, "gcry_mpi_print", rc);
+ GNUNET_free(finger_identity);
+ return NULL;
+ }
+
+ return finger_identity;
+}
+
+
+/**
* Derive a public key from a given public key and a label.
* Essentially calculates a public key 'V = H(l,P) * P'.
*
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r32247 - in gnunet/src: dht include util,
gnunet <=