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