Remove exported C++ interfaces from libcrypto that were used only by tests.

This limits the disablement of the MSVC warning "needs to have
dll-interface to be used by clients of class" to libpki.

Bug: 42220000
Change-Id: I14868c1c3baa77b8ff2e285aa89c95bd6a6a6964
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/88887
Reviewed-by: Xiangfei Ding <xfding@google.com>
Auto-Submit: Rudolf Polzer <rpolzer@google.com>
Commit-Queue: Xiangfei Ding <xfding@google.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 133dd4d..2296a0e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -518,7 +518,6 @@
       "-wd4127" # conditional expression is constant
       "-wd4244" # 'function' : conversion from 'int' to 'uint8_t',
                 # possible loss of data
-      "-wd4251" # needs to have dll-interface to be used by clients of class
       "-wd4267" # conversion from 'size_t' to 'int', possible loss of data
       "-wd4702" # unreachable code; MSVC's warning is too aggressive. See
                 # https://crbug.com/385161043
@@ -694,6 +693,14 @@
 target_link_libraries(pki crypto)
 target_compile_options(pki PRIVATE ${PKI_CXX_FLAGS})
 target_compile_definitions(pki PRIVATE -DBORINGSSL_IMPLEMENTATION)
+if(MSVC)
+  # libpki has a DLL C++ interface, where this warning is expected:
+  set(PKI_MSVC_DISABLED_WARNINGS_LIST
+      "-wd4251" # assignment within conditional expression
+      )
+  target_compile_options(pki PUBLIC
+    "$<$<COMPILE_LANGUAGE:C,CXX>:${PKI_MSVC_DISABLED_WARNINGS_LIST}>")
+endif()
 
 if(BUILD_TESTING)
   add_library(test_support_lib STATIC
diff --git a/crypto/fipsmodule/ec/ec_test.cc b/crypto/fipsmodule/ec/ec_test.cc
index 0a35b19..79564fa 100644
--- a/crypto/fipsmodule/ec/ec_test.cc
+++ b/crypto/fipsmodule/ec/ec_test.cc
@@ -456,15 +456,15 @@
 }
 
 TEST(ECTest, PointAtInfinity) {
-  UniquePtr<ECKey> key(
-      FromOpaque(EC_KEY_new_by_curve_name(NID_X9_62_prime256v1)));
+  UniquePtr<EC_KEY> key_opaque(EC_KEY_new_by_curve_name(NID_X9_62_prime256v1));
+  ECKey *key = FromOpaque(key_opaque.get());
   ASSERT_TRUE(key);
 
   UniquePtr<EC_POINT> inf(EC_POINT_new(key->group));
   ASSERT_TRUE(inf);
   ASSERT_TRUE(EC_POINT_set_to_infinity(key->group, inf.get()));
   // Configuring a public key with the point at infinity is invalid.
-  EXPECT_FALSE(EC_KEY_set_public_key(key.get(), inf.get()));
+  EXPECT_FALSE(EC_KEY_set_public_key(key, inf.get()));
 }
 
 TEST(ECTest, GroupMismatch) {
diff --git a/crypto/fipsmodule/ec/internal.h b/crypto/fipsmodule/ec/internal.h
index d792f56..f09a4b3 100644
--- a/crypto/fipsmodule/ec/internal.h
+++ b/crypto/fipsmodule/ec/internal.h
@@ -713,8 +713,7 @@
   EC_SCALAR scalar;
 } EC_WRAPPED_SCALAR;
 
-// Exported, as the destructor is used by ec_test.cc.
-class OPENSSL_EXPORT ECKey : public ec_key_st {
+class ECKey : public ec_key_st {
  public:
   static constexpr bool kAllowUniquePtr = true;
 
diff --git a/crypto/fipsmodule/rsa/internal.h b/crypto/fipsmodule/rsa/internal.h
index 602573b..46f3d1a 100644
--- a/crypto/fipsmodule/rsa/internal.h
+++ b/crypto/fipsmodule/rsa/internal.h
@@ -44,8 +44,7 @@
   rsa_pss_sha512,
 };
 
-// Exported because rsa_test.cc uses this class and links to the .so.
-class OPENSSL_EXPORT RSAImpl : public rsa_st {
+class RSAImpl : public rsa_st {
  public:
   static constexpr bool kAllowUniquePtr = true;
 
diff --git a/crypto/rsa/rsa_test.cc b/crypto/rsa/rsa_test.cc
index bdee9a2..0a935b5 100644
--- a/crypto/rsa/rsa_test.cc
+++ b/crypto/rsa/rsa_test.cc
@@ -577,75 +577,80 @@
 }
 
 TEST(RSATest, GenerateFIPS) {
-  UniquePtr<RSAImpl> rsa(FromOpaque(RSA_new()));
+  UniquePtr<RSA> rsa_opaque(RSA_new());
+  RSAImpl *rsa = FromOpaque(rsa_opaque.get());
   ASSERT_TRUE(rsa);
 
   // RSA_generate_key_fips may only be used for 2048-, 3072-, and 4096-bit
   // keys.
-  EXPECT_FALSE(RSA_generate_key_fips(rsa.get(), 512, nullptr));
-  EXPECT_FALSE(RSA_generate_key_fips(rsa.get(), 1024, nullptr));
-  EXPECT_FALSE(RSA_generate_key_fips(rsa.get(), 2047, nullptr));
-  EXPECT_FALSE(RSA_generate_key_fips(rsa.get(), 2049, nullptr));
-  EXPECT_FALSE(RSA_generate_key_fips(rsa.get(), 3071, nullptr));
-  EXPECT_FALSE(RSA_generate_key_fips(rsa.get(), 3073, nullptr));
-  EXPECT_FALSE(RSA_generate_key_fips(rsa.get(), 4095, nullptr));
-  EXPECT_FALSE(RSA_generate_key_fips(rsa.get(), 4097, nullptr));
+  EXPECT_FALSE(RSA_generate_key_fips(rsa, 512, nullptr));
+  EXPECT_FALSE(RSA_generate_key_fips(rsa, 1024, nullptr));
+  EXPECT_FALSE(RSA_generate_key_fips(rsa, 2047, nullptr));
+  EXPECT_FALSE(RSA_generate_key_fips(rsa, 2049, nullptr));
+  EXPECT_FALSE(RSA_generate_key_fips(rsa, 3071, nullptr));
+  EXPECT_FALSE(RSA_generate_key_fips(rsa, 3073, nullptr));
+  EXPECT_FALSE(RSA_generate_key_fips(rsa, 4095, nullptr));
+  EXPECT_FALSE(RSA_generate_key_fips(rsa, 4097, nullptr));
   ERR_clear_error();
 
   // Test that we can generate keys of the supported lengths:
   for (const size_t bits : {2048, 3072, 4096}) {
     SCOPED_TRACE(bits);
 
-    rsa.reset(FromOpaque(RSA_new()));
+    rsa_opaque.reset(RSA_new());
+    rsa = FromOpaque(rsa_opaque.get());
     ASSERT_TRUE(rsa);
-    ASSERT_TRUE(RSA_generate_key_fips(rsa.get(), bits, nullptr));
+    ASSERT_TRUE(RSA_generate_key_fips(rsa, bits, nullptr));
     EXPECT_EQ(bits, BN_num_bits(rsa->n));
   }
 }
 
 TEST(RSATest, BadKey) {
-  UniquePtr<RSAImpl> key(FromOpaque(RSA_new()));
+  UniquePtr<RSA> key_opaque(RSA_new());
+  RSAImpl *key = FromOpaque(key_opaque.get());
   UniquePtr<BIGNUM> e(BN_new());
   ASSERT_TRUE(key);
   ASSERT_TRUE(e);
   ASSERT_TRUE(BN_set_word(e.get(), RSA_F4));
 
   // Generate a bad key.
-  ASSERT_TRUE(RSA_generate_key_ex(key.get(), 2048, e.get(), nullptr));
+  ASSERT_TRUE(RSA_generate_key_ex(key, 2048, e.get(), nullptr));
   ASSERT_TRUE(BN_add(key->p, key->p, BN_value_one()));
 
   // Bad keys are detected.
-  EXPECT_FALSE(RSA_check_key(key.get()));
-  EXPECT_FALSE(RSA_check_fips(key.get()));
+  EXPECT_FALSE(RSA_check_key(key));
+  EXPECT_FALSE(RSA_check_fips(key));
 
   // Bad keys may not be parsed.
   uint8_t *der;
   size_t der_len;
-  ASSERT_TRUE(RSA_private_key_to_bytes(&der, &der_len, key.get()));
+  ASSERT_TRUE(RSA_private_key_to_bytes(&der, &der_len, key));
   UniquePtr<uint8_t> delete_der(der);
-  key.reset(FromOpaque(RSA_private_key_from_bytes(der, der_len)));
+  key_opaque.reset(RSA_private_key_from_bytes(der, der_len));
+  key = FromOpaque(key_opaque.get());
   EXPECT_FALSE(key);
 }
 
 TEST(RSATest, ASN1) {
   // Test that private keys may be decoded.
-  UniquePtr<RSAImpl> rsa(
-      FromOpaque(RSA_private_key_from_bytes(kKey1, sizeof(kKey1))));
+  UniquePtr<RSA> rsa_opaque(RSA_private_key_from_bytes(kKey1, sizeof(kKey1)));
+  RSAImpl *rsa = FromOpaque(rsa_opaque.get());
   ASSERT_TRUE(rsa);
 
   // Test that the serialization round-trips.
   uint8_t *der;
   size_t der_len;
-  ASSERT_TRUE(RSA_private_key_to_bytes(&der, &der_len, rsa.get()));
+  ASSERT_TRUE(RSA_private_key_to_bytes(&der, &der_len, rsa));
   UniquePtr<uint8_t> delete_der(der);
   EXPECT_EQ(Bytes(kKey1), Bytes(der, der_len));
 
   // Test that serializing public keys works.
-  ASSERT_TRUE(RSA_public_key_to_bytes(&der, &der_len, rsa.get()));
+  ASSERT_TRUE(RSA_public_key_to_bytes(&der, &der_len, rsa));
   delete_der.reset(der);
 
   // Public keys may be parsed back out.
-  rsa.reset(FromOpaque(RSA_public_key_from_bytes(der, der_len)));
+  rsa_opaque.reset(RSA_public_key_from_bytes(der, der_len));
+  rsa = FromOpaque(rsa_opaque.get());
   ASSERT_TRUE(rsa);
   EXPECT_FALSE(rsa->p);
   EXPECT_FALSE(rsa->q);
@@ -653,12 +658,12 @@
   // Serializing the result round-trips.
   uint8_t *der2;
   size_t der2_len;
-  ASSERT_TRUE(RSA_public_key_to_bytes(&der2, &der2_len, rsa.get()));
+  ASSERT_TRUE(RSA_public_key_to_bytes(&der2, &der2_len, rsa));
   UniquePtr<uint8_t> delete_der2(der2);
   EXPECT_EQ(Bytes(der, der_len), Bytes(der2, der2_len));
 
   // Public keys cannot be serialized as private keys.
-  int ok = RSA_private_key_to_bytes(&der, &der_len, rsa.get());
+  int ok = RSA_private_key_to_bytes(&der, &der_len, rsa);
   if (ok) {
     OPENSSL_free(der);
   }
@@ -666,8 +671,9 @@
   ERR_clear_error();
 
   // Public keys with negative moduli are invalid.
-  rsa.reset(FromOpaque(
-      RSA_public_key_from_bytes(kEstonianRSAKey, sizeof(kEstonianRSAKey))));
+  rsa_opaque.reset(
+      RSA_public_key_from_bytes(kEstonianRSAKey, sizeof(kEstonianRSAKey)));
+  rsa = FromOpaque(rsa_opaque.get());
   EXPECT_FALSE(rsa);
   ERR_clear_error();
 }
@@ -685,24 +691,28 @@
   ASSERT_TRUE(e);
   ASSERT_TRUE(BN_set_word(e.get(), RSA_F4));
 
-  UniquePtr<RSAImpl> rsa(FromOpaque(RSA_new()));
+  UniquePtr<RSA> rsa_opaque(RSA_new());
+  RSAImpl *rsa = FromOpaque(rsa_opaque.get());
   ASSERT_TRUE(rsa);
-  ASSERT_TRUE(RSA_generate_key_ex(rsa.get(), 1025, e.get(), nullptr));
+  ASSERT_TRUE(RSA_generate_key_ex(rsa, 1025, e.get(), nullptr));
   EXPECT_EQ(1024u, BN_num_bits(rsa->n));
 
-  rsa.reset(FromOpaque(RSA_new()));
+  rsa_opaque.reset(RSA_new());
+  rsa = FromOpaque(rsa_opaque.get());
   ASSERT_TRUE(rsa);
-  ASSERT_TRUE(RSA_generate_key_ex(rsa.get(), 1027, e.get(), nullptr));
+  ASSERT_TRUE(RSA_generate_key_ex(rsa, 1027, e.get(), nullptr));
   EXPECT_EQ(1024u, BN_num_bits(rsa->n));
 
-  rsa.reset(FromOpaque(RSA_new()));
+  rsa_opaque.reset(RSA_new());
+  rsa = FromOpaque(rsa_opaque.get());
   ASSERT_TRUE(rsa);
-  ASSERT_TRUE(RSA_generate_key_ex(rsa.get(), 1151, e.get(), nullptr));
+  ASSERT_TRUE(RSA_generate_key_ex(rsa, 1151, e.get(), nullptr));
   EXPECT_EQ(1024u, BN_num_bits(rsa->n));
 
-  rsa.reset(FromOpaque(RSA_new()));
+  rsa_opaque.reset(RSA_new());
+  rsa = FromOpaque(rsa_opaque.get());
   ASSERT_TRUE(rsa);
-  ASSERT_TRUE(RSA_generate_key_ex(rsa.get(), 1152, e.get(), nullptr));
+  ASSERT_TRUE(RSA_generate_key_ex(rsa, 1152, e.get(), nullptr));
   EXPECT_EQ(1152u, BN_num_bits(rsa->n));
 }
 
@@ -752,46 +762,47 @@
       "a54bb61ea5e64b9423102933ea100c12dad809fbf9589515e9d28e867f6b95c2d307f792"
       "cac28c6d7d23f441cb5b62798233db29b5cc0348";
 
-  UniquePtr<RSAImpl> rsa(FromOpaque(RSA_new()));
+  UniquePtr<RSA> rsa_opaque(RSA_new());
+  RSAImpl *rsa = FromOpaque(rsa_opaque.get());
   ASSERT_TRUE(rsa);
 
   // Missing n or e does not pass.
   ASSERT_TRUE(BN_hex2bn(&rsa->n, kN));
-  EXPECT_FALSE(RSA_check_key(rsa.get()));
+  EXPECT_FALSE(RSA_check_key(rsa));
   ERR_clear_error();
 
   BN_free(rsa->n);
   rsa->n = nullptr;
   ASSERT_TRUE(BN_hex2bn(&rsa->e, kE));
-  EXPECT_FALSE(RSA_check_key(rsa.get()));
+  EXPECT_FALSE(RSA_check_key(rsa));
   ERR_clear_error();
 
   // Public keys pass.
   ASSERT_TRUE(BN_hex2bn(&rsa->n, kN));
-  EXPECT_TRUE(RSA_check_key(rsa.get()));
+  EXPECT_TRUE(RSA_check_key(rsa));
 
   // Configuring d also passes.
   ASSERT_TRUE(BN_hex2bn(&rsa->d, kD));
-  EXPECT_TRUE(RSA_check_key(rsa.get()));
+  EXPECT_TRUE(RSA_check_key(rsa));
 
   // p and q must be provided together.
   ASSERT_TRUE(BN_hex2bn(&rsa->p, kP));
-  EXPECT_FALSE(RSA_check_key(rsa.get()));
+  EXPECT_FALSE(RSA_check_key(rsa));
   ERR_clear_error();
 
   BN_free(rsa->p);
   rsa->p = nullptr;
   ASSERT_TRUE(BN_hex2bn(&rsa->q, kQ));
-  EXPECT_FALSE(RSA_check_key(rsa.get()));
+  EXPECT_FALSE(RSA_check_key(rsa));
   ERR_clear_error();
 
   // Supplying p and q without CRT parameters passes.
   ASSERT_TRUE(BN_hex2bn(&rsa->p, kP));
-  EXPECT_TRUE(RSA_check_key(rsa.get()));
+  EXPECT_TRUE(RSA_check_key(rsa));
 
   // With p and q together, it is sufficient to check d against e.
   ASSERT_TRUE(BN_add_word(rsa->d, 1));
-  EXPECT_FALSE(RSA_check_key(rsa.get()));
+  EXPECT_FALSE(RSA_check_key(rsa));
   ERR_clear_error();
 
   // Test another invalid d. p-1 is divisible by 3, so there is no valid value
@@ -808,7 +819,7 @@
       "47fff51d";
   ASSERT_TRUE(BN_set_word(rsa->e, 111));
   ASSERT_TRUE(BN_hex2bn(&rsa->d, kDBogus));
-  EXPECT_FALSE(RSA_check_key(rsa.get()));
+  EXPECT_FALSE(RSA_check_key(rsa));
   ERR_clear_error();
   ASSERT_TRUE(BN_hex2bn(&rsa->e, kE));
 
@@ -824,7 +835,7 @@
       "8f9bfaf3f37dcf8aa0211311bac07b1a478c3ed8a6369e5d5fc42b2afa93f5de8f520981"
       "c62bbe81";
   ASSERT_TRUE(BN_hex2bn(&rsa->d, kDEuler));
-  EXPECT_TRUE(RSA_check_key(rsa.get()));
+  EXPECT_TRUE(RSA_check_key(rsa));
 
   // If d is completely out of range but otherwise valid, it is rejected.
   static const char kDTooLarge[] =
@@ -837,67 +848,68 @@
       "e9fa635b8ca36ce5c5fbd579a53cbb0348ceae752d4bc5621c5acc922ca2082494633337"
       "42e770c1";
   ASSERT_TRUE(BN_hex2bn(&rsa->d, kDTooLarge));
-  EXPECT_FALSE(RSA_check_key(rsa.get()));
+  EXPECT_FALSE(RSA_check_key(rsa));
   ERR_clear_error();
   ASSERT_TRUE(BN_hex2bn(&rsa->d, kD));
 
   // CRT value must either all be provided or all missing.
   ASSERT_TRUE(BN_hex2bn(&rsa->dmp1, kDMP1));
-  EXPECT_FALSE(RSA_check_key(rsa.get()));
+  EXPECT_FALSE(RSA_check_key(rsa));
   ERR_clear_error();
   BN_free(rsa->dmp1);
   rsa->dmp1 = nullptr;
 
   ASSERT_TRUE(BN_hex2bn(&rsa->dmq1, kDMQ1));
-  EXPECT_FALSE(RSA_check_key(rsa.get()));
+  EXPECT_FALSE(RSA_check_key(rsa));
   ERR_clear_error();
   BN_free(rsa->dmq1);
   rsa->dmq1 = nullptr;
 
   ASSERT_TRUE(BN_hex2bn(&rsa->iqmp, kIQMP));
-  EXPECT_FALSE(RSA_check_key(rsa.get()));
+  EXPECT_FALSE(RSA_check_key(rsa));
   ERR_clear_error();
 
   // The full key is accepted.
   ASSERT_TRUE(BN_hex2bn(&rsa->dmp1, kDMP1));
   ASSERT_TRUE(BN_hex2bn(&rsa->dmq1, kDMQ1));
-  EXPECT_TRUE(RSA_check_key(rsa.get()));
+  EXPECT_TRUE(RSA_check_key(rsa));
 
   // Incorrect CRT values are rejected.
   ASSERT_TRUE(BN_add_word(rsa->dmp1, 1));
-  EXPECT_FALSE(RSA_check_key(rsa.get()));
+  EXPECT_FALSE(RSA_check_key(rsa));
   ERR_clear_error();
   ASSERT_TRUE(BN_sub_word(rsa->dmp1, 1));
 
   ASSERT_TRUE(BN_add_word(rsa->dmq1, 1));
-  EXPECT_FALSE(RSA_check_key(rsa.get()));
+  EXPECT_FALSE(RSA_check_key(rsa));
   ERR_clear_error();
   ASSERT_TRUE(BN_sub_word(rsa->dmq1, 1));
 
   ASSERT_TRUE(BN_add_word(rsa->iqmp, 1));
-  EXPECT_FALSE(RSA_check_key(rsa.get()));
+  EXPECT_FALSE(RSA_check_key(rsa));
   ERR_clear_error();
   ASSERT_TRUE(BN_sub_word(rsa->iqmp, 1));
 
   // Non-reduced CRT values are rejected.
   ASSERT_TRUE(BN_add(rsa->dmp1, rsa->dmp1, rsa->p));
-  EXPECT_FALSE(RSA_check_key(rsa.get()));
+  EXPECT_FALSE(RSA_check_key(rsa));
   ERR_clear_error();
   ASSERT_TRUE(BN_sub(rsa->dmp1, rsa->dmp1, rsa->p));
 
   ASSERT_TRUE(BN_add(rsa->dmq1, rsa->dmq1, rsa->q));
-  EXPECT_FALSE(RSA_check_key(rsa.get()));
+  EXPECT_FALSE(RSA_check_key(rsa));
   ERR_clear_error();
   ASSERT_TRUE(BN_sub(rsa->dmq1, rsa->dmq1, rsa->q));
 
   ASSERT_TRUE(BN_add(rsa->iqmp, rsa->iqmp, rsa->p));
-  EXPECT_FALSE(RSA_check_key(rsa.get()));
+  EXPECT_FALSE(RSA_check_key(rsa));
   ERR_clear_error();
   ASSERT_TRUE(BN_sub(rsa->iqmp, rsa->iqmp, rsa->p));
 }
 
 TEST(RSATest, KeygenFail) {
-  UniquePtr<RSAImpl> rsa(FromOpaque(RSA_new()));
+  UniquePtr<RSA> rsa_opaque(RSA_new());
+  RSAImpl *rsa = FromOpaque(rsa_opaque.get());
   ASSERT_TRUE(rsa);
 
   // Cause RSA key generation after a prime has been generated, to test that
@@ -912,7 +924,7 @@
   ASSERT_TRUE(BN_set_word(e.get(), RSA_F4));
 
   // Key generation should fail.
-  EXPECT_FALSE(RSA_generate_key_ex(rsa.get(), 2048, e.get(), &cb));
+  EXPECT_FALSE(RSA_generate_key_ex(rsa, 2048, e.get(), &cb));
 
   // Failed key generations do not leave garbage in |rsa|.
   EXPECT_FALSE(rsa->n);
@@ -933,26 +945,26 @@
   EXPECT_FALSE(rsa->private_key_frozen);
 
   // Failed key generations leave the previous contents alone.
-  EXPECT_TRUE(RSA_generate_key_ex(rsa.get(), 2048, e.get(), nullptr));
+  EXPECT_TRUE(RSA_generate_key_ex(rsa, 2048, e.get(), nullptr));
   uint8_t *der;
   size_t der_len;
-  ASSERT_TRUE(RSA_private_key_to_bytes(&der, &der_len, rsa.get()));
+  ASSERT_TRUE(RSA_private_key_to_bytes(&der, &der_len, rsa));
   UniquePtr<uint8_t> delete_der(der);
 
-  EXPECT_FALSE(RSA_generate_key_ex(rsa.get(), 2048, e.get(), &cb));
+  EXPECT_FALSE(RSA_generate_key_ex(rsa, 2048, e.get(), &cb));
 
   uint8_t *der2;
   size_t der2_len;
-  ASSERT_TRUE(RSA_private_key_to_bytes(&der2, &der2_len, rsa.get()));
+  ASSERT_TRUE(RSA_private_key_to_bytes(&der2, &der2_len, rsa));
   UniquePtr<uint8_t> delete_der2(der2);
   EXPECT_EQ(Bytes(der, der_len), Bytes(der2, der2_len));
 
   // Generating a key over an existing key works, despite any cached state.
-  EXPECT_TRUE(RSA_generate_key_ex(rsa.get(), 2048, e.get(), nullptr));
-  EXPECT_TRUE(RSA_check_key(rsa.get()));
+  EXPECT_TRUE(RSA_generate_key_ex(rsa, 2048, e.get(), nullptr));
+  EXPECT_TRUE(RSA_check_key(rsa));
   uint8_t *der3;
   size_t der3_len;
-  ASSERT_TRUE(RSA_private_key_to_bytes(&der3, &der3_len, rsa.get()));
+  ASSERT_TRUE(RSA_private_key_to_bytes(&der3, &der3_len, rsa));
   UniquePtr<uint8_t> delete_der3(der3);
   EXPECT_NE(Bytes(der, der_len), Bytes(der3, der3_len));
 }
@@ -1197,28 +1209,29 @@
 TEST(RSATest, LargeE) {
   // Test an RSA key with large e by swapping d and e in kKey1.
   // Since e is small, e mod (p-1) and e mod (q-1) will simply be e.
-  UniquePtr<RSAImpl> key(
-      FromOpaque(RSA_private_key_from_bytes(kKey1, sizeof(kKey1))));
+  UniquePtr<RSA> key_opaque(RSA_private_key_from_bytes(kKey1, sizeof(kKey1)));
+  RSAImpl *key = FromOpaque(key_opaque.get());
   ASSERT_TRUE(key);
-  const BIGNUM *n = RSA_get0_n(key.get());
-  const BIGNUM *e = RSA_get0_e(key.get());
-  const BIGNUM *d = RSA_get0_d(key.get());
-  const BIGNUM *p = RSA_get0_p(key.get());
-  const BIGNUM *q = RSA_get0_q(key.get());
-  const BIGNUM *iqmp = RSA_get0_iqmp(key.get());
+  const BIGNUM *n = RSA_get0_n(key);
+  const BIGNUM *e = RSA_get0_e(key);
+  const BIGNUM *d = RSA_get0_d(key);
+  const BIGNUM *p = RSA_get0_p(key);
+  const BIGNUM *q = RSA_get0_q(key);
+  const BIGNUM *iqmp = RSA_get0_iqmp(key);
 
   // By default, the large exponent is not allowed as e.
   UniquePtr<RSA> pub(RSA_new_public_key(n, /*e=*/d));
   EXPECT_FALSE(pub);
-  UniquePtr<RSAImpl> priv(
-      FromOpaque(RSA_new_private_key(n, /*e=*/d, /*d=*/e, p, q,
-                                     /*dmp1=*/e, /*dmq1=*/e, iqmp)));
+  UniquePtr<RSA> priv_opaque(RSA_new_private_key(n, /*e=*/d, /*d=*/e, p, q,
+                                                 /*dmp1=*/e, /*dmq1=*/e, iqmp));
+  RSAImpl *priv = FromOpaque(priv_opaque.get());
   EXPECT_FALSE(priv);
 
   // Constructing such a key piecemeal also would not work. This was only
   // possible with private APIs, so when |RSA| is opaque, this case will be
   // impossible.
-  priv.reset(FromOpaque(RSA_new()));
+  priv_opaque.reset(RSA_new());
+  priv = FromOpaque(priv_opaque.get());
   ASSERT_TRUE(priv);
   priv->n = BN_dup(n);
   ASSERT_TRUE(priv->n);
@@ -1228,25 +1241,26 @@
   ASSERT_TRUE(priv->d);
 
   static const uint8_t kDigest[32] = {0};
-  std::vector<uint8_t> sig(RSA_size(priv.get()));
+  std::vector<uint8_t> sig(RSA_size(priv));
   size_t len;
-  EXPECT_FALSE(RSA_sign_pss_mgf1(priv.get(), &len, sig.data(), sig.size(),
-                                 kDigest, sizeof(kDigest), EVP_sha256(),
-                                 EVP_sha256(), /*salt_len=*/32));
+  EXPECT_FALSE(RSA_sign_pss_mgf1(priv, &len, sig.data(), sig.size(), kDigest,
+                                 sizeof(kDigest), EVP_sha256(), EVP_sha256(),
+                                 /*salt_len=*/32));
 
   // But the "large e" APIs tolerate it.
   pub.reset(RSA_new_public_key_large_e(n, /*e=*/d));
   ASSERT_TRUE(pub);
-  priv.reset(FromOpaque(RSA_new_private_key_large_e(n, /*e=*/d, /*d=*/e, p, q,
-                                                    /*dmp1=*/e,
-                                                    /*dmq1=*/e, iqmp)));
+  priv_opaque.reset(RSA_new_private_key_large_e(n, /*e=*/d, /*d=*/e, p, q,
+                                                /*dmp1=*/e,
+                                                /*dmq1=*/e, iqmp));
+  priv = FromOpaque(priv_opaque.get());
   ASSERT_TRUE(priv);
 
   // Test that operations work correctly.
-  sig.resize(RSA_size(priv.get()));
-  ASSERT_TRUE(RSA_sign_pss_mgf1(priv.get(), &len, sig.data(), sig.size(),
-                                kDigest, sizeof(kDigest), EVP_sha256(),
-                                EVP_sha256(), /*salt_len=*/32));
+  sig.resize(RSA_size(priv));
+  ASSERT_TRUE(RSA_sign_pss_mgf1(priv, &len, sig.data(), sig.size(), kDigest,
+                                sizeof(kDigest), EVP_sha256(), EVP_sha256(),
+                                /*salt_len=*/32));
   sig.resize(len);
 
   EXPECT_TRUE(RSA_verify_pss_mgf1(pub.get(), kDigest, sizeof(kDigest),
@@ -1347,20 +1361,22 @@
 
 #if defined(OPENSSL_THREADS)
 TEST(RSATest, Threads) {
-  UniquePtr<RSAImpl> rsa_template(
-      FromOpaque(RSA_private_key_from_bytes(kKey1, sizeof(kKey1))));
+  UniquePtr<RSA> rsa_template_opaque(
+      RSA_private_key_from_bytes(kKey1, sizeof(kKey1)));
+  RSAImpl *rsa_template = FromOpaque(rsa_template_opaque.get());
   ASSERT_TRUE(rsa_template);
 
   const uint8_t kDummyHash[32] = {0};
-  std::vector<uint8_t> sig(RSA_size(rsa_template.get()));
+  std::vector<uint8_t> sig(RSA_size(rsa_template));
   unsigned sig_len;
   EXPECT_TRUE(RSA_sign(NID_sha256, kDummyHash, sizeof(kDummyHash), sig.data(),
-                       &sig_len, rsa_template.get()));
+                       &sig_len, rsa_template));
   sig.resize(sig_len);
 
   // RSA keys may be assembled piece-meal and then used in parallel between
   // threads, which requires internal locking to create some derived properties.
-  UniquePtr<RSAImpl> rsa(FromOpaque(RSA_new()));
+  UniquePtr<RSA> rsa_opaque(RSA_new());
+  RSAImpl *rsa = FromOpaque(rsa_opaque.get());
   rsa->n = BN_dup(rsa_template->n);
   ASSERT_TRUE(rsa->n);
   rsa->e = BN_dup(rsa_template->e);
@@ -1383,21 +1399,21 @@
   auto raw_access = [&] { EXPECT_EQ(0, BN_cmp(rsa->d, rsa_template->d)); };
   auto getter = [&] {
     const BIGNUM *d;
-    RSA_get0_key(rsa.get(), nullptr, nullptr, &d);
+    RSA_get0_key(rsa, nullptr, nullptr, &d);
     EXPECT_EQ(0, BN_cmp(d, rsa_template->d));
   };
   auto sign = [&] {
-    std::vector<uint8_t> sig2(RSA_size(rsa.get()));
+    std::vector<uint8_t> sig2(RSA_size(rsa));
     unsigned sig2_len;
     EXPECT_TRUE(RSA_sign(NID_sha256, kDummyHash, sizeof(kDummyHash),
-                         sig2.data(), &sig2_len, rsa.get()));
+                         sig2.data(), &sig2_len, rsa));
     sig2.resize(sig2_len);
     // RSASSA-PKCS1-v1_5 is deterministic.
     EXPECT_EQ(Bytes(sig), Bytes(sig2));
   };
   auto verify = [&] {
     EXPECT_TRUE(RSA_verify(NID_sha256, kDummyHash, sizeof(kDummyHash),
-                           sig.data(), sig.size(), rsa.get()));
+                           sig.data(), sig.size(), rsa));
   };
 
   std::vector<std::thread> threads;