2016-12-09 19:12:23 +00:00
|
|
|
#include "ks_dht.h"
|
|
|
|
#include "ks_dht-int.h"
|
|
|
|
#include "sodium.h"
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
2016-12-15 05:27:54 +00:00
|
|
|
KS_DECLARE(ks_status_t) ks_dht_storageitem_create_immutable(ks_dht_storageitem_t **item, ks_pool_t *pool, struct bencode *v)
|
2016-12-09 19:12:23 +00:00
|
|
|
{
|
|
|
|
ks_dht_storageitem_t *si;
|
2016-12-15 05:27:54 +00:00
|
|
|
SHA_CTX sha;
|
|
|
|
size_t enc_len = 0;
|
|
|
|
uint8_t *enc = NULL;
|
|
|
|
ks_status_t ret = KS_STATUS_SUCCESS;
|
2016-12-09 19:12:23 +00:00
|
|
|
|
|
|
|
ks_assert(item);
|
|
|
|
ks_assert(pool);
|
2016-12-15 05:27:54 +00:00
|
|
|
ks_assert(v);
|
|
|
|
ks_assert(SHA_DIGEST_LENGTH == KS_DHT_NODEID_SIZE);
|
2016-12-10 07:36:57 +00:00
|
|
|
|
2016-12-09 19:12:23 +00:00
|
|
|
*item = si = ks_pool_alloc(pool, sizeof(ks_dht_storageitem_t));
|
2016-12-15 05:27:54 +00:00
|
|
|
if (!si) {
|
|
|
|
ret = KS_STATUS_NO_MEM;
|
|
|
|
goto done;
|
|
|
|
}
|
2016-12-09 19:12:23 +00:00
|
|
|
si->pool = pool;
|
|
|
|
|
2016-12-15 05:27:54 +00:00
|
|
|
si->mutable = KS_FALSE;
|
|
|
|
|
|
|
|
si->v = ben_clone(v);
|
|
|
|
if (!si->v) {
|
|
|
|
ret = KS_STATUS_NO_MEM;
|
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
|
|
|
|
enc = ben_encode(&enc_len, si->v);
|
|
|
|
SHA1_Init(&sha);
|
|
|
|
SHA1_Update(&sha, enc, enc_len);
|
|
|
|
SHA1_Final(si->id.id, &sha);
|
|
|
|
free(enc);
|
2016-12-09 19:12:23 +00:00
|
|
|
|
2016-12-15 05:27:54 +00:00
|
|
|
done:
|
|
|
|
if (ret != KS_STATUS_SUCCESS) {
|
|
|
|
if (si) ks_dht_storageitem_destroy(&si);
|
|
|
|
*item = NULL;
|
|
|
|
}
|
|
|
|
return ret;
|
2016-12-09 19:12:23 +00:00
|
|
|
}
|
|
|
|
|
2016-12-15 05:27:54 +00:00
|
|
|
KS_DECLARE(ks_status_t) ks_dht_storageitem_create_mutable(ks_dht_storageitem_t **item,
|
|
|
|
ks_pool_t *pool,
|
|
|
|
struct bencode *v,
|
|
|
|
ks_dht_storageitem_key_t *k,
|
|
|
|
uint8_t *salt,
|
|
|
|
ks_size_t salt_length,
|
|
|
|
int64_t sequence,
|
|
|
|
ks_dht_storageitem_signature_t *signature)
|
2016-12-09 19:12:23 +00:00
|
|
|
{
|
2016-12-15 05:27:54 +00:00
|
|
|
ks_dht_storageitem_t *si;
|
|
|
|
SHA_CTX sha;
|
|
|
|
ks_status_t ret = KS_STATUS_SUCCESS;
|
2016-12-09 19:12:23 +00:00
|
|
|
|
|
|
|
ks_assert(item);
|
2016-12-15 05:27:54 +00:00
|
|
|
ks_assert(pool);
|
2016-12-09 19:12:23 +00:00
|
|
|
ks_assert(v);
|
|
|
|
ks_assert(SHA_DIGEST_LENGTH == KS_DHT_NODEID_SIZE);
|
2016-12-15 05:27:54 +00:00
|
|
|
ks_assert(k);
|
|
|
|
ks_assert(!(!salt && salt_length > 0));
|
|
|
|
ks_assert(!(salt_length > KS_DHT_STORAGEITEM_SIGNATURE_SIZE));
|
|
|
|
ks_assert(signature);
|
2016-12-09 19:12:23 +00:00
|
|
|
|
2016-12-15 05:27:54 +00:00
|
|
|
*item = si = ks_pool_alloc(pool, sizeof(ks_dht_storageitem_t));
|
|
|
|
if (!si) {
|
|
|
|
ret = KS_STATUS_NO_MEM;
|
|
|
|
goto done;
|
2016-12-09 19:12:23 +00:00
|
|
|
}
|
2016-12-15 05:27:54 +00:00
|
|
|
si->pool = pool;
|
2016-12-09 19:12:23 +00:00
|
|
|
|
2016-12-15 05:27:54 +00:00
|
|
|
si->v = ben_clone(v);
|
2016-12-09 19:12:23 +00:00
|
|
|
|
2016-12-15 05:27:54 +00:00
|
|
|
si->mutable = KS_TRUE;
|
2016-12-09 19:12:23 +00:00
|
|
|
|
2016-12-15 05:27:54 +00:00
|
|
|
memcpy(si->pk.key, k->key, KS_DHT_STORAGEITEM_KEY_SIZE);
|
|
|
|
if (salt && salt_length > 0) {
|
|
|
|
memcpy(si->salt, salt, salt_length);
|
|
|
|
si->salt_length = salt_length;
|
2016-12-09 19:12:23 +00:00
|
|
|
}
|
2016-12-15 05:27:54 +00:00
|
|
|
si->seq = sequence;
|
|
|
|
memcpy(si->sig.sig, signature->sig, KS_DHT_STORAGEITEM_SIGNATURE_SIZE);
|
2016-12-09 19:12:23 +00:00
|
|
|
|
|
|
|
SHA1_Init(&sha);
|
2016-12-15 05:27:54 +00:00
|
|
|
SHA1_Update(&sha, si->pk.key, KS_DHT_STORAGEITEM_KEY_SIZE);
|
|
|
|
if (si->salt && si->salt_length > 0) SHA1_Update(&sha, si->salt, si->salt_length);
|
|
|
|
SHA1_Final(si->id.id, &sha);
|
|
|
|
|
|
|
|
done:
|
|
|
|
if (ret != KS_STATUS_SUCCESS) {
|
|
|
|
if (si) ks_dht_storageitem_destroy(&si);
|
|
|
|
*item = NULL;
|
|
|
|
}
|
|
|
|
return ret;
|
2016-12-09 19:12:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
2016-12-15 05:27:54 +00:00
|
|
|
KS_DECLARE(void) ks_dht_storageitem_destroy(ks_dht_storageitem_t **item)
|
2016-12-09 19:12:23 +00:00
|
|
|
{
|
2016-12-15 05:27:54 +00:00
|
|
|
ks_dht_storageitem_t *si;
|
2016-12-09 19:12:23 +00:00
|
|
|
|
|
|
|
ks_assert(item);
|
2016-12-15 05:27:54 +00:00
|
|
|
ks_assert(*item);
|
2016-12-09 19:12:23 +00:00
|
|
|
|
2016-12-15 05:27:54 +00:00
|
|
|
si = *item;
|
2016-12-09 19:12:23 +00:00
|
|
|
|
2016-12-15 05:27:54 +00:00
|
|
|
if (si->v) {
|
|
|
|
ben_free(si->v);
|
|
|
|
si->v = NULL;
|
2016-12-09 19:12:23 +00:00
|
|
|
}
|
2016-12-15 05:27:54 +00:00
|
|
|
ks_pool_free(si->pool, si);
|
2016-12-09 19:12:23 +00:00
|
|
|
|
2016-12-15 05:27:54 +00:00
|
|
|
*item = NULL;
|
2016-12-09 19:12:23 +00:00
|
|
|
}
|
2016-12-15 05:27:54 +00:00
|
|
|
|
2016-12-09 19:12:23 +00:00
|
|
|
/* For Emacs:
|
|
|
|
* Local Variables:
|
|
|
|
* mode:c
|
|
|
|
* indent-tabs-mode:t
|
|
|
|
* tab-width:4
|
|
|
|
* c-basic-offset:4
|
|
|
|
* End:
|
|
|
|
* For VIM:
|
|
|
|
* vim:set softtabstop=4 shiftwidth=4 tabstop=4 noet:
|
|
|
|
*/
|