write_key_to_file(c->filename, c);
else
{
- GNUNET_asprintf(&c->filename, "%s/%s.zone", zonefile_directory, GNUNET_h2s_full (&c->zone));
+ GNUNET_asprintf(&c->filename, "%s/%s.zkey", zonefile_directory, GNUNET_h2s_full (&c->zone));
write_key_to_file(c->filename, c);
}
}
+struct GNUNET_TIME_Absolute
+get_block_expiration_time (unsigned int rd_count, const struct GNUNET_NAMESTORE_RecordData *rd)
+{
+ int c;
+ struct GNUNET_TIME_Absolute expire = GNUNET_TIME_absolute_get_forever();
+ if (NULL == rd)
+ return GNUNET_TIME_absolute_get_zero();
+ for (c = 0; c < rd_count; c++)
+ {
+ if (rd[c].expiration.abs_value < expire.abs_value)
+ expire = rd[c].expiration;
+ }
+ return expire;
+}
+
/**
* Task run during shutdown.
*
snc = NULL;
GNUNET_CONTAINER_multihashmap_iterate(zonekeys, &zone_to_disk_it, NULL);
+ GNUNET_CONTAINER_multihashmap_destroy(zonekeys);
for (nc = client_head; nc != NULL; nc = next)
{
struct GNUNET_NAMESTORE_RecordData *rd_selected = NULL;
struct GNUNET_NAMESTORE_CryptoContainer *cc;
struct GNUNET_CRYPTO_RsaSignature *signature_new = NULL;
+ struct GNUNET_TIME_Absolute e;
GNUNET_HashCode zone_key_hash;
char *rd_tmp;
char *name_tmp;
copied_elements, lnc->name, GNUNET_h2s(lnc->zone));
if ((copied_elements == rd_count) && (NULL != signature))
- contains_signature = GNUNET_YES;
+ contains_signature = GNUNET_YES; /* returning all records, so include signature */
else
- contains_signature = GNUNET_NO;
+ contains_signature = GNUNET_NO; /* returning not all records, so do not include signature */
if ((NULL != zone_key) && (copied_elements == rd_count))
if (GNUNET_CONTAINER_multihashmap_contains(zonekeys, &zone_key_hash))
{
cc = GNUNET_CONTAINER_multihashmap_get(zonekeys, &zone_key_hash);
- signature_new = GNUNET_NAMESTORE_create_signature(cc->privkey, name, rd, rd_count);
+ e = get_block_expiration_time(rd_count, rd);
+ signature_new = GNUNET_NAMESTORE_create_signature(cc->privkey, e, name, rd, rd_count);
GNUNET_assert (signature_new != NULL);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Creating signature for name `%s' with %u records in zone `%s'\n",name, copied_elements, GNUNET_h2s(&zone_key_hash));
authoritative = GNUNET_YES;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "I am not authoritative for name `%s' in zone `%s'\n",name, GNUNET_h2s(&zone_key_hash));
}
- if (rd_selected != rd)
- GNUNET_free (rd_selected);
-
r_size = sizeof (struct LookupNameResponseMessage) +
sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded) +
name_len +
lnr_msg->rd_count = htons (copied_elements);
lnr_msg->rd_len = htons (rd_ser_len);
lnr_msg->name_len = htons (name_len);
- lnr_msg->expire = GNUNET_TIME_absolute_hton(expire);
+ lnr_msg->expire = GNUNET_TIME_absolute_hton(get_block_expiration_time(copied_elements, rd_selected));
+
+ if (rd_selected != rd)
+ GNUNET_free (rd_selected);
if (zone_key != NULL)
lnr_msg->public_key = (*zone_key);
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received `%s' message\n", "NAMESTORE_RECORD_CREATE");
struct GNUNET_NAMESTORE_Client *nc;
+ struct GNUNET_NAMESTORE_CryptoContainer *cc;
struct CreateRecordContext crc;
struct GNUNET_CRYPTO_RsaPrivateKey *pkey;
struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded pub;
GNUNET_CRYPTO_rsa_key_get_public(pkey, &pub);
GNUNET_CRYPTO_hash (&pub, sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), &pubkey_hash);
+ if (GNUNET_NO == GNUNET_CONTAINER_multihashmap_contains(zonekeys, &pubkey_hash))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received new private key for zone `%s'\n",GNUNET_h2s(&pubkey_hash));
+
+ cc = GNUNET_malloc (sizeof (struct GNUNET_NAMESTORE_CryptoContainer));
+ cc->privkey = GNUNET_CRYPTO_rsa_decode_key((char *) pkey_tmp, key_len);
+ cc->pubkey = GNUNET_malloc(sizeof (pub));
+ memcpy (cc->pubkey, &pub, sizeof(pub));
+ cc->zone = pubkey_hash;
+
+ GNUNET_CONTAINER_multihashmap_put(zonekeys, &pubkey_hash, cc, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY);
+ }
+
crc.expire = GNUNET_TIME_absolute_ntoh(rp_msg->expire);
crc.res = GNUNET_SYSERR;
crc.pkey = pkey;
if (res != GNUNET_SYSERR)
res = GNUNET_OK;
GNUNET_CRYPTO_rsa_key_free(pkey);
+ pkey = NULL;
/* Send response */
send:
struct GNUNET_NAMESTORE_Client *nc;
struct RecordRemoveResponseMessage rrr_msg;
struct GNUNET_CRYPTO_RsaPrivateKey *pkey;
+ struct GNUNET_NAMESTORE_CryptoContainer *cc = NULL;
struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded pub;
GNUNET_HashCode pubkey_hash;
char * pkey_tmp = NULL;
GNUNET_CRYPTO_rsa_key_get_public(pkey, &pub);
GNUNET_CRYPTO_hash (&pub, sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), &pubkey_hash);
+ if (GNUNET_NO == GNUNET_CONTAINER_multihashmap_contains(zonekeys, &pubkey_hash))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received new private key for zone `%s'\n",GNUNET_h2s(&pubkey_hash));
+ cc = GNUNET_malloc (sizeof (struct GNUNET_NAMESTORE_CryptoContainer));
+ cc->privkey = GNUNET_CRYPTO_rsa_decode_key((char *) pkey_tmp, key_len);
+ cc->pubkey = GNUNET_malloc(sizeof (pub));
+ memcpy (cc->pubkey, &pub, sizeof(pub));
+ cc->zone = pubkey_hash;
+
+ GNUNET_CONTAINER_multihashmap_put(zonekeys, &pubkey_hash, cc, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY);
+ }
+
struct GNUNET_NAMESTORE_RecordData rd[rd_count];
res = GNUNET_NAMESTORE_records_deserialize(rd_ser_len, rd_ser, rd_count, rd);
if ((res != GNUNET_OK) || (rd_count != 1))
{
struct GNUNET_NAMESTORE_ZoneIteration *zi = cls;
struct GNUNET_NAMESTORE_Client *nc = zi->client;
- //size_t len;
+ struct GNUNET_NAMESTORE_CryptoContainer * cc;
+ struct GNUNET_CRYPTO_RsaSignature *signature_new = NULL;
+ struct GNUNET_TIME_Absolute e;
+ GNUNET_HashCode zone_key_hash;
+ int authoritative = GNUNET_NO;
if ((zone_key == NULL) && (name == NULL))
{
name_tmp = (char *) &zir_msg[1];
rd_tmp = &name_tmp[name_len];
+ GNUNET_CRYPTO_hash(zone_key, sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), &zone_key_hash);
+ if (GNUNET_CONTAINER_multihashmap_contains(zonekeys, &zone_key_hash))
+ {
+ cc = GNUNET_CONTAINER_multihashmap_get(zonekeys, &zone_key_hash);
+ e = get_block_expiration_time(rd_count, rd);
+ expire = e;
+ signature_new = GNUNET_NAMESTORE_create_signature(cc->privkey, e, name, rd, rd_count);
+ GNUNET_assert (signature_new != NULL);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Creating signature for `%s' in zone `%s' with %u records and expiration %llu\n", name, GNUNET_h2s(&zone_key_hash), rd_count, e.abs_value);
+ authoritative = GNUNET_YES;
+ }
+
+
zir_msg->gns_header.header.type = htons (GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_ITERATION_RESPONSE);
zir_msg->gns_header.header.size = htons (msg_size);
zir_msg->gns_header.r_id = htonl(zi->request_id);
zir_msg->name_len = htons (name_len);
zir_msg->rd_count = htons (rd_count);
zir_msg->rd_len = htons (rd_ser_len);
- zir_msg->signature = *signature;
+ if ((GNUNET_YES == authoritative) && (NULL != signature_new))
+ {
+ zir_msg->signature = *signature_new;
+ GNUNET_free (signature_new);
+ }
+ else
+ zir_msg->signature = *signature;
GNUNET_assert (NULL != zone_key);
if (zone_key != NULL)
zir_msg->public_key = *zone_key;
struct ZoneIterationStartMessage * zis_msg = (struct ZoneIterationStartMessage *) message;
struct GNUNET_NAMESTORE_Client *nc;
struct GNUNET_NAMESTORE_ZoneIteration *zi;
- int res;
nc = client_lookup(client);
if (nc == NULL)
GNUNET_CONTAINER_DLL_insert (nc->op_head, nc->op_tail, zi);
- res = GSN_database->iterate_records (GSN_database->cls, zone_tmp , NULL, zi->offset , &zone_iteration_proc, zi);
+ GSN_database->iterate_records (GSN_database->cls, zone_tmp , NULL, zi->offset , &zone_iteration_proc, zi);
GNUNET_SERVER_receive_done (client, GNUNET_OK);
}
int zonekey_file_it (void *cls, const char *filename)
{
int *counter = cls;
- if ((filename != NULL) && (NULL != strstr(filename, ".zone")))
+ if ((filename != NULL) && (NULL != strstr(filename, ".zkey")))
{
struct GNUNET_CRYPTO_RsaPrivateKey * privkey;
struct GNUNET_NAMESTORE_CryptoContainer *c;