Skip to content
Snippets Groups Projects
Commit 2b1d2fc3 authored by Adrien Béraud's avatar Adrien Béraud
Browse files

c wrapper: use shared_ptr for dht_privatekey

parent a0566cf6
No related branches found
No related tags found
No related merge requests found
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
#include "opendht.h" #include "opendht.h"
using ValueSp = std::shared_ptr<dht::Value>; using ValueSp = std::shared_ptr<dht::Value>;
using PrivkeySp = std::shared_ptr<dht::crypto::PrivateKey>;
using CertSp = std::shared_ptr<dht::crypto::Certificate>;
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
...@@ -119,23 +121,30 @@ dht_blob* dht_publickey_encrypt(const dht_publickey* pk, const char* data, size_ ...@@ -119,23 +121,30 @@ dht_blob* dht_publickey_encrypt(const dht_publickey* pk, const char* data, size_
dht_privatekey* dht_privatekey_generate(unsigned key_length_bits) { dht_privatekey* dht_privatekey_generate(unsigned key_length_bits) {
if (key_length_bits == 0) if (key_length_bits == 0)
key_length_bits = 4096; key_length_bits = 4096;
return reinterpret_cast<dht_privatekey*>(new dht::crypto::PrivateKey(dht::crypto::PrivateKey::generate(key_length_bits))); return reinterpret_cast<dht_privatekey*>(new PrivkeySp(std::make_shared<dht::crypto::PrivateKey>(dht::crypto::PrivateKey::generate(key_length_bits))));
} }
dht_privatekey* dht_privatekey_import(const uint8_t* dat, size_t dat_size, const char* password) { dht_privatekey* dht_privatekey_import(const uint8_t* dat, size_t dat_size, const char* password) {
try { try {
return reinterpret_cast<dht_privatekey*>(new dht::crypto::PrivateKey(dat, dat_size, password)); return reinterpret_cast<dht_privatekey*>(new PrivkeySp(std::make_shared<dht::crypto::PrivateKey>(dat, dat_size, password)));
} catch (const dht::crypto::CryptoException& e) { } catch (const dht::crypto::CryptoException& e) {
return nullptr; return nullptr;
} }
} }
dht_publickey* dht_privatekey_get_publickey(const dht_privatekey* key) { dht_publickey* dht_privatekey_get_publickey(const dht_privatekey* k) {
return reinterpret_cast<dht_publickey*>(new dht::crypto::PublicKey(reinterpret_cast<const dht::crypto::PrivateKey*>(key)->getPublicKey())); const auto& key = *reinterpret_cast<const PrivkeySp*>(k);
return reinterpret_cast<dht_publickey*>(new dht::crypto::PublicKey(key->getPublicKey()));
} }
void dht_privatekey_delete(dht_privatekey* pk) { void dht_privatekey_delete(dht_privatekey* pk) {
delete reinterpret_cast<dht::crypto::PrivateKey*>(pk); delete reinterpret_cast<PrivkeySp*>(pk);
}
// config
void dht_runner_config_default(dht_runner_config* config) {
bzero(config, sizeof(dht_runner_config));
config->threaded = true;
} }
// dht::DhtRunner // dht::DhtRunner
...@@ -152,6 +161,30 @@ void dht_runner_run(dht_runner* r, in_port_t port) { ...@@ -152,6 +161,30 @@ void dht_runner_run(dht_runner* r, in_port_t port) {
runner->run(port, {}, true); runner->run(port, {}, true);
} }
void dht_runner_run_config(dht_runner* r, in_port_t port, const dht_runner_config* conf) {
auto runner = reinterpret_cast<dht::DhtRunner*>(r);
dht::DhtRunner::Config config;
config.dht_config.node_config.is_bootstrap = conf->dht_config.node_config.is_bootstrap;
config.dht_config.node_config.maintain_storage = conf->dht_config.node_config.maintain_storage;
config.dht_config.node_config.node_id = *reinterpret_cast<const dht::InfoHash*>(&conf->dht_config.node_config.node_id);
config.dht_config.node_config.network = conf->dht_config.node_config.network;
config.dht_config.node_config.persist_path = conf->dht_config.node_config.persist_path;
if (conf->dht_config.id.privkey)
config.dht_config.id.first = *reinterpret_cast<const PrivkeySp*>(conf->dht_config.id.privkey);
if (conf->dht_config.id.certificate)
config.dht_config.id.second = *reinterpret_cast<const CertSp*>(conf->dht_config.id.certificate);
config.threaded = conf->threaded;
config.proxy_server = conf->proxy_server;
config.push_node_id = conf->push_node_id;
config.push_token = conf->push_token;
config.peer_discovery = conf->peer_discovery;
config.peer_publish = conf->peer_publish;
runner->run(port, config);
}
void dht_runner_ping(dht_runner* r, struct sockaddr* addr, socklen_t addr_len) { void dht_runner_ping(dht_runner* r, struct sockaddr* addr, socklen_t addr_len) {
auto runner = reinterpret_cast<dht::DhtRunner*>(r); auto runner = reinterpret_cast<dht::DhtRunner*>(r);
runner->bootstrap(dht::SockAddr(addr, addr_len)); runner->bootstrap(dht::SockAddr(addr, addr_len));
......
...@@ -70,6 +70,12 @@ OPENDHT_C_PUBLIC void dht_privatekey_delete(dht_privatekey*); ...@@ -70,6 +70,12 @@ OPENDHT_C_PUBLIC void dht_privatekey_delete(dht_privatekey*);
struct OPENDHT_C_PUBLIC dht_certificate; struct OPENDHT_C_PUBLIC dht_certificate;
typedef struct dht_certificate dht_certificate; typedef struct dht_certificate dht_certificate;
struct OPENDHT_PUBLIC dht_identity {
dht_privatekey* privkey;
dht_certificate* certificate;
};
typedef struct dht_identity dht_identity;
// callbacks // callbacks
typedef bool (*dht_get_cb)(const dht_value* value, void* user_data); typedef bool (*dht_get_cb)(const dht_value* value, void* user_data);
typedef bool (*dht_value_cb)(const dht_value* value, bool expired, void* user_data); typedef bool (*dht_value_cb)(const dht_value* value, bool expired, void* user_data);
...@@ -80,12 +86,44 @@ struct OPENDHT_C_PUBLIC dht_op_token; ...@@ -80,12 +86,44 @@ struct OPENDHT_C_PUBLIC dht_op_token;
typedef struct dht_op_token dht_op_token; typedef struct dht_op_token dht_op_token;
OPENDHT_C_PUBLIC void dht_op_token_delete(dht_op_token* token); OPENDHT_C_PUBLIC void dht_op_token_delete(dht_op_token* token);
// config
struct OPENDHT_PUBLIC dht_node_config {
dht_infohash node_id;
uint32_t network;
bool is_bootstrap;
bool maintain_storage;
const char* persist_path;
};
typedef struct dht_node_config dht_node_config;
struct OPENDHT_PUBLIC dht_secure_config
{
dht_node_config node_config;
dht_identity id;
};
typedef struct dht_secure_config dht_secure_config;
struct OPENDHT_PUBLIC dht_runner_config {
dht_secure_config dht_config;
bool threaded;
const char* proxy_server;
const char* push_node_id;
const char* push_token;
bool peer_discovery;
bool peer_publish;
dht_certificate* server_ca;
dht_identity client_identity;
};
typedef struct dht_runner_config dht_runner_config;
OPENDHT_C_PUBLIC void dht_runner_config_default(dht_runner_config* config);
// dht::DhtRunner // dht::DhtRunner
struct OPENDHT_C_PUBLIC dht_runner; struct OPENDHT_C_PUBLIC dht_runner;
typedef struct dht_runner dht_runner; typedef struct dht_runner dht_runner;
OPENDHT_C_PUBLIC dht_runner* dht_runner_new(); OPENDHT_C_PUBLIC dht_runner* dht_runner_new();
OPENDHT_C_PUBLIC void dht_runner_delete(dht_runner* runner); OPENDHT_C_PUBLIC void dht_runner_delete(dht_runner* runner);
OPENDHT_C_PUBLIC void dht_runner_run(dht_runner* runner, in_port_t port); OPENDHT_C_PUBLIC void dht_runner_run(dht_runner* runner, in_port_t port);
OPENDHT_C_PUBLIC void dht_runner_run_config(dht_runner* runner, in_port_t port, const dht_runner_config* config);
OPENDHT_C_PUBLIC void dht_runner_ping(dht_runner* runner, struct sockaddr* addr, socklen_t addr_len); OPENDHT_C_PUBLIC void dht_runner_ping(dht_runner* runner, struct sockaddr* addr, socklen_t addr_len);
OPENDHT_C_PUBLIC void dht_runner_bootstrap(dht_runner* runner, const char* host, const char* service); OPENDHT_C_PUBLIC void dht_runner_bootstrap(dht_runner* runner, const char* host, const char* service);
OPENDHT_C_PUBLIC void dht_runner_get(dht_runner* runner, const dht_infohash* hash, dht_get_cb cb, dht_done_cb done_cb, void* cb_user_data); OPENDHT_C_PUBLIC void dht_runner_get(dht_runner* runner, const dht_infohash* hash, dht_get_cb cb, dht_done_cb done_cb, void* cb_user_data);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment