Add public_key_type() accessor to quic::CertificateView. This will be used later to disallow RSA certificates in WebTransport hash-based verifier. PiperOrigin-RevId: 416387139
diff --git a/quic/core/crypto/certificate_view.cc b/quic/core/crypto/certificate_view.cc index f0b1c18..e920cdb 100644 --- a/quic/core/crypto/certificate_view.cc +++ b/quic/core/crypto/certificate_view.cc
@@ -49,14 +49,6 @@ // 2.5.29.17 constexpr uint8_t kSubjectAltNameOid[] = {0x55, 0x1d, 0x11}; -enum class PublicKeyType { - kRsa, - kP256, - kP384, - kEd25519, - kUnknown, -}; - PublicKeyType PublicKeyTypeFromKey(EVP_PKEY* public_key) { switch (EVP_PKEY_id(public_key)) { case EVP_PKEY_RSA: @@ -469,11 +461,13 @@ } } +PublicKeyType CertificateView::public_key_type() { + return PublicKeyTypeFromKey(public_key_.get()); +} + bool CertificateView::ValidatePublicKeyParameters() { - // The profile here affects what certificates can be used: - // (1) when QUIC is used as a server library without any custom certificate - // provider logic, - // (2) when QuicTransport is handling self-signed certificates. + // The profile here affects what certificates can be used when QUIC is used as + // a server library without any custom certificate provider logic. // The goal is to allow at minimum any certificate that would be allowed on a // regular Web session over TLS 1.3 while ensuring we do not expose any // algorithms we don't want to support long-term.
diff --git a/quic/core/crypto/certificate_view.h b/quic/core/crypto/certificate_view.h index f2826cd..4249258 100644 --- a/quic/core/crypto/certificate_view.h +++ b/quic/core/crypto/certificate_view.h
@@ -34,6 +34,15 @@ // Reads |input| line-by-line and returns the next available PEM message. QUIC_EXPORT_PRIVATE PemReadResult ReadNextPemMessage(std::istream* input); +// Cryptograhpic algorithms recognized in X.509. +enum class PublicKeyType { + kRsa, + kP256, + kP384, + kEd25519, + kUnknown, +}; + // CertificateView represents a parsed version of a single X.509 certificate. As // the word "view" implies, it does not take ownership of the underlying strings // and consists primarily of pointers into the certificate that is passed into @@ -69,6 +78,9 @@ absl::string_view signature, uint16_t signature_algorithm) const; + // Returns the type of the key used in the certificate's SPKI. + PublicKeyType public_key_type(); + private: CertificateView() = default;
diff --git a/quic/core/crypto/certificate_view_test.cc b/quic/core/crypto/certificate_view_test.cc index 5d743b2..33514f2 100644 --- a/quic/core/crypto/certificate_view_test.cc +++ b/quic/core/crypto/certificate_view_test.cc
@@ -58,6 +58,7 @@ const QuicWallTime validity_end = QuicWallTime::FromUNIXSeconds( *quiche::QuicheUtcDateTimeToUnixSeconds(2020, 2, 2, 18, 13, 59)); EXPECT_EQ(view->validity_end(), validity_end); + EXPECT_EQ(view->public_key_type(), PublicKeyType::kRsa); EXPECT_EQ("C=US,ST=California,L=Mountain View,O=QUIC Server,CN=127.0.0.1", view->GetHumanReadableSubject());