openssl: Use unique_ptr to remove unnecessary goto statements
Bug: None Change-Id: I377cd17490a009d75545052a9300cfc34869ae85 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/223501 Reviewed-by: Harald Alvestrand <hta@webrtc.org> Commit-Queue: Philipp Hancke <phancke@nvidia.com> Cr-Commit-Position: refs/heads/master@{#34383}
This commit is contained in:
committed by
WebRTC LUCI CQ
parent
37477b8f24
commit
06a88fedd0
@ -59,27 +59,30 @@ static X509* MakeCertificate(EVP_PKEY* pkey, const SSLIdentityParams& params) {
|
||||
RTC_LOG(LS_INFO) << "Making certificate for " << params.common_name;
|
||||
|
||||
ASN1_INTEGER* asn1_serial_number = nullptr;
|
||||
BIGNUM* serial_number = nullptr;
|
||||
X509* x509 = nullptr;
|
||||
X509_NAME* name = nullptr;
|
||||
std::unique_ptr<BIGNUM, decltype(&::BN_free)> serial_number{nullptr,
|
||||
::BN_free};
|
||||
std::unique_ptr<X509, decltype(&::X509_free)> x509{nullptr, ::X509_free};
|
||||
std::unique_ptr<X509_NAME, decltype(&::X509_NAME_free)> name{
|
||||
nullptr, ::X509_NAME_free};
|
||||
time_t epoch_off = 0; // Time offset since epoch.
|
||||
|
||||
if ((x509 = X509_new()) == nullptr) {
|
||||
goto error;
|
||||
x509.reset(X509_new());
|
||||
if (x509 == nullptr) {
|
||||
return nullptr;
|
||||
}
|
||||
if (!X509_set_pubkey(x509, pkey)) {
|
||||
goto error;
|
||||
if (!X509_set_pubkey(x509.get(), pkey)) {
|
||||
return nullptr;
|
||||
}
|
||||
// serial number - temporary reference to serial number inside x509 struct
|
||||
if ((serial_number = BN_new()) == nullptr ||
|
||||
!BN_pseudo_rand(serial_number, SERIAL_RAND_BITS, 0, 0) ||
|
||||
(asn1_serial_number = X509_get_serialNumber(x509)) == nullptr ||
|
||||
!BN_to_ASN1_INTEGER(serial_number, asn1_serial_number)) {
|
||||
goto error;
|
||||
serial_number.reset(BN_new());
|
||||
if (serial_number == nullptr ||
|
||||
!BN_pseudo_rand(serial_number.get(), SERIAL_RAND_BITS, 0, 0) ||
|
||||
(asn1_serial_number = X509_get_serialNumber(x509.get())) == nullptr ||
|
||||
!BN_to_ASN1_INTEGER(serial_number.get(), asn1_serial_number)) {
|
||||
return nullptr;
|
||||
}
|
||||
// Set version to X509.V3
|
||||
if (!X509_set_version(x509, 2L)) {
|
||||
goto error;
|
||||
if (!X509_set_version(x509.get(), 2L)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// There are a lot of possible components for the name entries. In
|
||||
@ -89,31 +92,27 @@ static X509* MakeCertificate(EVP_PKEY* pkey, const SSLIdentityParams& params) {
|
||||
// arbitrary common_name. Note that this certificate goes out in
|
||||
// clear during SSL negotiation, so there may be a privacy issue in
|
||||
// putting anything recognizable here.
|
||||
if ((name = X509_NAME_new()) == nullptr ||
|
||||
!X509_NAME_add_entry_by_NID(name, NID_commonName, MBSTRING_UTF8,
|
||||
name.reset(X509_NAME_new());
|
||||
if (name == nullptr ||
|
||||
!X509_NAME_add_entry_by_NID(name.get(), NID_commonName, MBSTRING_UTF8,
|
||||
(unsigned char*)params.common_name.c_str(),
|
||||
-1, -1, 0) ||
|
||||
!X509_set_subject_name(x509, name) || !X509_set_issuer_name(x509, name)) {
|
||||
goto error;
|
||||
!X509_set_subject_name(x509.get(), name.get()) ||
|
||||
!X509_set_issuer_name(x509.get(), name.get())) {
|
||||
return nullptr;
|
||||
}
|
||||
if (!X509_time_adj(X509_get_notBefore(x509), params.not_before, &epoch_off) ||
|
||||
!X509_time_adj(X509_get_notAfter(x509), params.not_after, &epoch_off)) {
|
||||
goto error;
|
||||
if (!X509_time_adj(X509_get_notBefore(x509.get()), params.not_before,
|
||||
&epoch_off) ||
|
||||
!X509_time_adj(X509_get_notAfter(x509.get()), params.not_after,
|
||||
&epoch_off)) {
|
||||
return nullptr;
|
||||
}
|
||||
if (!X509_sign(x509, pkey, EVP_sha256())) {
|
||||
goto error;
|
||||
if (!X509_sign(x509.get(), pkey, EVP_sha256())) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
BN_free(serial_number);
|
||||
X509_NAME_free(name);
|
||||
RTC_LOG(LS_INFO) << "Returning certificate";
|
||||
return x509;
|
||||
|
||||
error:
|
||||
BN_free(serial_number);
|
||||
X509_NAME_free(name);
|
||||
X509_free(x509);
|
||||
return nullptr;
|
||||
return x509.release();
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
Reference in New Issue
Block a user