From 27b8c870f33b478cfb053ddad7da6130a22325ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com> Date: Thu, 10 Mar 2022 19:46:25 -0500 Subject: [PATCH] c: add dht_privatekey_decrypt, handle crypto exceptions --- c/opendht.cpp | 27 +++++++++++++++++++++------ c/opendht_c.h | 1 + 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/c/opendht.cpp b/c/opendht.cpp index f91f7834..6aa83d7d 100644 --- a/c/opendht.cpp +++ b/c/opendht.cpp @@ -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) { const auto& pkey = *reinterpret_cast<const PubkeySp*>(pk); - auto rdata = new dht::Blob; - *rdata = pkey->encrypt((const uint8_t*)data, data_size); - return (dht_blob*)rdata; + try { + auto rdata = std::make_unique<dht::Blob>(); + *rdata = pkey->encrypt((const uint8_t*)data, data_size); + return (dht_blob*)rdata.release(); + } catch (...) { + return nullptr; + } } // dht::crypto::PrivateKey @@ -186,6 +190,17 @@ dht_publickey* dht_privatekey_get_publickey(const dht_privatekey* k) { 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) { delete reinterpret_cast<PrivkeySp*>(pk); } @@ -454,9 +469,9 @@ struct sockaddr** dht_runner_get_public_address(const dht_runner* r) { return nullptr; auto ret = (struct sockaddr**)malloc(sizeof(struct sockaddr*) * (addrs.size() + 1)); for (size_t i=0; i<addrs.size(); i++) { - if (auto len = addrs[i].getLength()) { - ret[i] = (struct sockaddr*)malloc(len); - memcpy((struct sockaddr*)ret[i], addrs[i].get(), len); + if (const auto& addr = addrs[i]) { + ret[i] = (struct sockaddr*)malloc(addr.getLength()); + memcpy((struct sockaddr*)ret[i], addr.get(), addr.getLength()); } else { ret[i] = nullptr; } diff --git a/c/opendht_c.h b/c/opendht_c.h index 942c4010..0c7d31e9 100644 --- a/c/opendht_c.h +++ b/c/opendht_c.h @@ -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 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_blob* dht_privatekey_decrypt(const dht_privatekey*, const char* data, size_t data_size); OPENDHT_C_PUBLIC void dht_privatekey_delete(dht_privatekey*); // dht::crypto::Certificate -- GitLab