diff --git a/c/opendht.cpp b/c/opendht.cpp index f91f783458f076cc505e71a549eac62e340a32bc..6aa83d7deff83b6d274400ab3ab31385f3cf2a08 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 942c401041b48e16f4ae9a547e75a1ea9d1dae0a..0c7d31e98f43be7e4b736d774c6c8ad02ef33870 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