Browse Source

Refactor OpenSSL key generation a bit for clarity

Paul-Louis Ageneau 1 year ago
parent
commit
917b0f07bb
1 changed files with 8 additions and 10 deletions
  1. 8 10
      src/impl/certificate.cpp

+ 8 - 10
src/impl/certificate.cpp

@@ -396,6 +396,8 @@ Certificate Certificate::Generate(CertificateType type, const string &commonName
 		PLOG_VERBOSE << "Generating ECDSA P-256 key pair";
 		PLOG_VERBOSE << "Generating ECDSA P-256 key pair";
 #if OPENSSL_VERSION_NUMBER >= 0x30000000
 #if OPENSSL_VERSION_NUMBER >= 0x30000000
 		pkey = shared_ptr<EVP_PKEY>(EVP_EC_gen("P-256"), EVP_PKEY_free);
 		pkey = shared_ptr<EVP_PKEY>(EVP_EC_gen("P-256"), EVP_PKEY_free);
+		if (!pkey)
+			throw std::runtime_error("Unable to generate ECDSA P-256 key pair");
 #else
 #else
 		pkey = shared_ptr<EVP_PKEY>(EVP_PKEY_new(), EVP_PKEY_free);
 		pkey = shared_ptr<EVP_PKEY>(EVP_PKEY_new(), EVP_PKEY_free);
 		unique_ptr<EC_KEY, decltype(&EC_KEY_free)> ecc(
 		unique_ptr<EC_KEY, decltype(&EC_KEY_free)> ecc(
@@ -405,13 +407,10 @@ Certificate Certificate::Generate(CertificateType type, const string &commonName
 
 
 		EC_KEY_set_asn1_flag(ecc.get(), OPENSSL_EC_NAMED_CURVE); // Set ASN1 OID
 		EC_KEY_set_asn1_flag(ecc.get(), OPENSSL_EC_NAMED_CURVE); // Set ASN1 OID
 		if (!EC_KEY_generate_key(ecc.get()) || !EVP_PKEY_assign_EC_KEY(pkey.get(), ecc.get()))
 		if (!EC_KEY_generate_key(ecc.get()) || !EVP_PKEY_assign_EC_KEY(pkey.get(), ecc.get()))
-			pkey.reset(); // failure
-		else
-			ecc.release(); // the key will be freed when pkey is freed
-#endif
-		if (!pkey)
 			throw std::runtime_error("Unable to generate ECDSA P-256 key pair");
 			throw std::runtime_error("Unable to generate ECDSA P-256 key pair");
 
 
+		ecc.release(); // the key will be freed when pkey is freed
+#endif
 		break;
 		break;
 	}
 	}
 	case CertificateType::Rsa: {
 	case CertificateType::Rsa: {
@@ -419,6 +418,8 @@ Certificate Certificate::Generate(CertificateType type, const string &commonName
 		const unsigned int bits = 2048;
 		const unsigned int bits = 2048;
 #if OPENSSL_VERSION_NUMBER >= 0x30000000
 #if OPENSSL_VERSION_NUMBER >= 0x30000000
 		pkey = shared_ptr<EVP_PKEY>(EVP_RSA_gen(bits), EVP_PKEY_free);
 		pkey = shared_ptr<EVP_PKEY>(EVP_RSA_gen(bits), EVP_PKEY_free);
+		if (!pkey)
+			throw std::runtime_error("Unable to generate RSA key pair");
 #else
 #else
 		pkey = shared_ptr<EVP_PKEY>(EVP_PKEY_new(), EVP_PKEY_free);
 		pkey = shared_ptr<EVP_PKEY>(EVP_PKEY_new(), EVP_PKEY_free);
 		unique_ptr<RSA, decltype(&RSA_free)> rsa(RSA_new(), RSA_free);
 		unique_ptr<RSA, decltype(&RSA_free)> rsa(RSA_new(), RSA_free);
@@ -430,13 +431,10 @@ Certificate Certificate::Generate(CertificateType type, const string &commonName
 		if (!BN_set_word(exponent.get(), e) ||
 		if (!BN_set_word(exponent.get(), e) ||
 		    !RSA_generate_key_ex(rsa.get(), bits, exponent.get(), NULL) ||
 		    !RSA_generate_key_ex(rsa.get(), bits, exponent.get(), NULL) ||
 		    !EVP_PKEY_assign_RSA(pkey.get(), rsa.get()))
 		    !EVP_PKEY_assign_RSA(pkey.get(), rsa.get()))
-			pkey.reset(); // failure
-		else
-			rsa.release(); // the key will be freed when pkey is freed
-#endif
-		if (!pkey)
 			throw std::runtime_error("Unable to generate RSA key pair");
 			throw std::runtime_error("Unable to generate RSA key pair");
 
 
+		rsa.release(); // the key will be freed when pkey is freed
+#endif
 		break;
 		break;
 	}
 	}
 	default:
 	default: