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

c: add dht_privatekey_decrypt, handle crypto exceptions

parent be43212a
No related branches found
No related tags found
No related merge requests found
...@@ -154,9 +154,13 @@ bool dht_publickey_check_signature(const dht_publickey* pk, const char* data, si ...@@ -154,9 +154,13 @@ bool dht_publickey_check_signature(const dht_publickey* pk, const char* data, si
dht_blob* dht_publickey_encrypt(const dht_publickey* pk, const char* data, size_t data_size) { dht_blob* dht_publickey_encrypt(const dht_publickey* pk, const char* data, size_t data_size) {
const auto& pkey = *reinterpret_cast<const PubkeySp*>(pk); const auto& pkey = *reinterpret_cast<const PubkeySp*>(pk);
auto rdata = new dht::Blob; try {
auto rdata = std::make_unique<dht::Blob>();
*rdata = pkey->encrypt((const uint8_t*)data, data_size); *rdata = pkey->encrypt((const uint8_t*)data, data_size);
return (dht_blob*)rdata; return (dht_blob*)rdata.release();
} catch (...) {
return nullptr;
}
} }
// dht::crypto::PrivateKey // dht::crypto::PrivateKey
...@@ -186,6 +190,17 @@ dht_publickey* dht_privatekey_get_publickey(const dht_privatekey* k) { ...@@ -186,6 +190,17 @@ dht_publickey* dht_privatekey_get_publickey(const dht_privatekey* k) {
return reinterpret_cast<dht_publickey*>(new PubkeySp(key->getSharedPublicKey())); return reinterpret_cast<dht_publickey*>(new PubkeySp(key->getSharedPublicKey()));
} }
dht_blob* dht_privatekey_decrypt(const dht_privatekey* k, const char* data, size_t data_size) {
const auto& key = *reinterpret_cast<const PrivkeySp*>(k);
try {
auto rdata = std::make_unique<dht::Blob>();
*rdata = key->decrypt((const uint8_t*)data, data_size);
return (dht_blob*)rdata.release();
} catch (...) {
return nullptr;
}
}
void dht_privatekey_delete(dht_privatekey* pk) { void dht_privatekey_delete(dht_privatekey* pk) {
delete reinterpret_cast<PrivkeySp*>(pk); delete reinterpret_cast<PrivkeySp*>(pk);
} }
...@@ -454,9 +469,9 @@ struct sockaddr** dht_runner_get_public_address(const dht_runner* r) { ...@@ -454,9 +469,9 @@ struct sockaddr** dht_runner_get_public_address(const dht_runner* r) {
return nullptr; return nullptr;
auto ret = (struct sockaddr**)malloc(sizeof(struct sockaddr*) * (addrs.size() + 1)); auto ret = (struct sockaddr**)malloc(sizeof(struct sockaddr*) * (addrs.size() + 1));
for (size_t i=0; i<addrs.size(); i++) { for (size_t i=0; i<addrs.size(); i++) {
if (auto len = addrs[i].getLength()) { if (const auto& addr = addrs[i]) {
ret[i] = (struct sockaddr*)malloc(len); ret[i] = (struct sockaddr*)malloc(addr.getLength());
memcpy((struct sockaddr*)ret[i], addrs[i].get(), len); memcpy((struct sockaddr*)ret[i], addr.get(), addr.getLength());
} else { } else {
ret[i] = nullptr; ret[i] = nullptr;
} }
......
...@@ -58,6 +58,7 @@ OPENDHT_C_PUBLIC dht_privatekey* dht_privatekey_generate(unsigned key_length_bit ...@@ -58,6 +58,7 @@ OPENDHT_C_PUBLIC dht_privatekey* dht_privatekey_generate(unsigned key_length_bit
OPENDHT_C_PUBLIC dht_privatekey* dht_privatekey_import(const uint8_t* dat, size_t dat_size, const char* password); OPENDHT_C_PUBLIC dht_privatekey* dht_privatekey_import(const uint8_t* dat, size_t dat_size, const char* password);
OPENDHT_C_PUBLIC int dht_privatekey_export(const dht_privatekey*, char* out, size_t* out_size, const char* password); OPENDHT_C_PUBLIC int dht_privatekey_export(const dht_privatekey*, char* out, size_t* out_size, const char* password);
OPENDHT_C_PUBLIC dht_publickey* dht_privatekey_get_publickey(const dht_privatekey*); OPENDHT_C_PUBLIC dht_publickey* dht_privatekey_get_publickey(const dht_privatekey*);
OPENDHT_C_PUBLIC dht_blob* dht_privatekey_decrypt(const dht_privatekey*, const char* data, size_t data_size);
OPENDHT_C_PUBLIC void dht_privatekey_delete(dht_privatekey*); OPENDHT_C_PUBLIC void dht_privatekey_delete(dht_privatekey*);
// dht::crypto::Certificate // dht::crypto::Certificate
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment