use RAII to manager RSA pointers

Tested:
unit tests.

Signed-off-by: Nan Zhou <nanzhoumails@gmail.com>
Change-Id: I8888f01e0f64836ca36f03c79307c1044d0dae44
diff --git a/certs_manager.cpp b/certs_manager.cpp
index 9adca20..9a81991 100644
--- a/certs_manager.cpp
+++ b/certs_manager.cpp
@@ -466,12 +466,11 @@
         log<level::ERR>("Error occurred during BN_set_word call");
         elog<InternalFailure>();
     }
-
-    RSA* rsa = RSA_new();
-    ret = RSA_generate_key_ex(rsa, keyBitLen, bne.get(), nullptr);
+    using RSAPtr = std::unique_ptr<RSA, decltype(&::RSA_free)>;
+    RSAPtr rsa(RSA_new(), ::RSA_free);
+    ret = RSA_generate_key_ex(rsa.get(), keyBitLen, bne.get(), nullptr);
     if (ret != 1)
     {
-        free(rsa);
         log<level::ERR>("Error occurred during RSA_generate_key_ex call",
                         entry("KEYBITLENGTH=%PRIu64", keyBitLen));
         elog<InternalFailure>();
@@ -479,14 +478,14 @@
 
     // set public key of x509 req
     EVP_PKEY_Ptr pKey(EVP_PKEY_new(), ::EVP_PKEY_free);
-    ret = EVP_PKEY_assign_RSA(pKey.get(), rsa);
+    ret = EVP_PKEY_assign_RSA(pKey.get(), rsa.get());
     if (ret == 0)
     {
-        free(rsa);
         log<level::ERR>("Error occurred during assign rsa key into EVP");
         elog<InternalFailure>();
     }
-
+    // Now |rsa| is managed by |pKey|
+    rsa.release();
     return pKey;
 
 #else