@@ -1008,126 +1008,6 @@ static void AccumulateCipherSuite(Telemetry::HistogramID probe,
10081008 Telemetry::Accumulate (probe, value);
10091009}
10101010
1011- // In the case of session resumption, the AuthCertificate hook has been bypassed
1012- // (because we've previously successfully connected to our peer). That being the
1013- // case, we unfortunately don't know what the verified certificate chain was, if
1014- // the peer's server certificate verified as extended validation, or what its CT
1015- // status is (if enabled). To address this, we attempt to build a certificate
1016- // chain here using as much of the original context as possible (e.g. stapled
1017- // OCSP responses, SCTs, the hostname, the first party domain, etc.). Note that
1018- // because we are on the socket thread, this must not cause any network
1019- // requests, hence the use of FLAG_LOCAL_ONLY.
1020- static void RebuildVerifiedCertificateInformation (PRFileDesc* fd,
1021- nsNSSSocketInfo* infoObject) {
1022- MOZ_ASSERT (fd);
1023- MOZ_ASSERT (infoObject);
1024-
1025- if (!fd || !infoObject) {
1026- return ;
1027- }
1028-
1029- UniqueCERTCertificate cert (SSL_PeerCertificate (fd));
1030- MOZ_ASSERT (cert, " SSL_PeerCertificate failed in TLS handshake callback?" );
1031- if (!cert) {
1032- return ;
1033- }
1034-
1035- Maybe<nsTArray<nsTArray<uint8_t >>> maybePeerCertsBytes;
1036- UniqueCERTCertList peerCertChain (SSL_PeerCertificateChain (fd));
1037- if (!peerCertChain) {
1038- MOZ_LOG (gPIPNSSLog , LogLevel::Debug,
1039- (" RebuildVerifiedCertificateInformation: failed to get peer "
1040- " certificate chain" ));
1041- } else {
1042- nsTArray<nsTArray<uint8_t >> peerCertsBytes;
1043- for (CERTCertListNode* n = CERT_LIST_HEAD (peerCertChain);
1044- !CERT_LIST_END (n, peerCertChain); n = CERT_LIST_NEXT (n)) {
1045- // Don't include the end-entity certificate.
1046- if (n == CERT_LIST_HEAD (peerCertChain)) {
1047- continue ;
1048- }
1049- nsTArray<uint8_t > certBytes;
1050- certBytes.AppendElements (n->cert ->derCert .data , n->cert ->derCert .len );
1051- peerCertsBytes.AppendElement (std::move (certBytes));
1052- }
1053- maybePeerCertsBytes.emplace (std::move (peerCertsBytes));
1054- }
1055-
1056- RefPtr<SharedCertVerifier> certVerifier (GetDefaultCertVerifier ());
1057- MOZ_ASSERT (certVerifier,
1058- " Certificate verifier uninitialized in TLS handshake callback?" );
1059- if (!certVerifier) {
1060- return ;
1061- }
1062-
1063- // We don't own these pointers.
1064- const SECItemArray* stapledOCSPResponses = SSL_PeerStapledOCSPResponses (fd);
1065- Maybe<nsTArray<uint8_t >> stapledOCSPResponse;
1066- // we currently only support single stapled responses
1067- if (stapledOCSPResponses && stapledOCSPResponses->len == 1 ) {
1068- stapledOCSPResponse.emplace ();
1069- stapledOCSPResponse->SetCapacity (stapledOCSPResponses->items [0 ].len );
1070- stapledOCSPResponse->AppendElements (stapledOCSPResponses->items [0 ].data ,
1071- stapledOCSPResponses->items [0 ].len );
1072- }
1073-
1074- Maybe<nsTArray<uint8_t >> sctsFromTLSExtension;
1075- const SECItem* sctsFromTLSExtensionSECItem = SSL_PeerSignedCertTimestamps (fd);
1076- if (sctsFromTLSExtensionSECItem) {
1077- sctsFromTLSExtension.emplace ();
1078- sctsFromTLSExtension->SetCapacity (sctsFromTLSExtensionSECItem->len );
1079- sctsFromTLSExtension->AppendElements (sctsFromTLSExtensionSECItem->data ,
1080- sctsFromTLSExtensionSECItem->len );
1081- }
1082-
1083- int flags = mozilla::psm::CertVerifier::FLAG_LOCAL_ONLY;
1084- if (!infoObject->SharedState ().IsOCSPStaplingEnabled () ||
1085- !infoObject->SharedState ().IsOCSPMustStapleEnabled ()) {
1086- flags |= CertVerifier::FLAG_TLS_IGNORE_STATUS_REQUEST;
1087- }
1088-
1089- EVStatus evStatus;
1090- CertificateTransparencyInfo certificateTransparencyInfo;
1091- nsTArray<nsTArray<uint8_t >> builtChainCertBytes;
1092- nsTArray<uint8_t > certBytes (cert->derCert .data , cert->derCert .len );
1093- bool isBuiltCertChainRootBuiltInRoot = false ;
1094- mozilla::pkix::Result rv = certVerifier->VerifySSLServerCert (
1095- certBytes, mozilla::pkix::Now (), infoObject, infoObject->GetHostName (),
1096- builtChainCertBytes, flags, maybePeerCertsBytes, stapledOCSPResponse,
1097- sctsFromTLSExtension, Nothing (), infoObject->GetOriginAttributes (),
1098- &evStatus,
1099- nullptr , // OCSP stapling telemetry
1100- nullptr , // key size telemetry
1101- nullptr , // pinning telemetry
1102- &certificateTransparencyInfo, &isBuiltCertChainRootBuiltInRoot);
1103-
1104- if (rv != Success) {
1105- MOZ_LOG (gPIPNSSLog , LogLevel::Debug,
1106- (" HandshakeCallback: couldn't rebuild verified certificate info" ));
1107- }
1108-
1109- nsCOMPtr<nsIX509Cert> x509Cert (new nsNSSCertificate (cert.get ()));
1110- if (rv == Success && evStatus == EVStatus::EV) {
1111- MOZ_LOG (gPIPNSSLog , LogLevel::Debug,
1112- (" HandshakeCallback using NEW cert (is EV)" ));
1113- infoObject->SetServerCert (x509Cert, EVStatus::EV);
1114- } else {
1115- MOZ_LOG (gPIPNSSLog , LogLevel::Debug,
1116- (" HandshakeCallback using NEW cert (is not EV)" ));
1117- infoObject->SetServerCert (x509Cert, EVStatus::NotEV);
1118- }
1119-
1120- if (rv == Success) {
1121- uint16_t status =
1122- TransportSecurityInfo::ConvertCertificateTransparencyInfoToStatus (
1123- certificateTransparencyInfo);
1124- infoObject->SetCertificateTransparencyStatus (status);
1125- infoObject->SetSucceededCertChain (std::move (builtChainCertBytes));
1126- infoObject->SetIsBuiltCertChainRootBuiltInRoot (
1127- isBuiltCertChainRootBuiltInRoot);
1128- }
1129- }
1130-
11311011void HandshakeCallback (PRFileDesc* fd, void * client_data) {
11321012 SECStatus rv;
11331013
@@ -1265,11 +1145,7 @@ void HandshakeCallback(PRFileDesc* fd, void* client_data) {
12651145 MOZ_LOG (gPIPNSSLog , LogLevel::Debug,
12661146 (" HandshakeCallback KEEPING existing cert\n " ));
12671147 } else {
1268- if (StaticPrefs::network_ssl_tokens_cache_enabled ()) {
1269- infoObject->RebuildCertificateInfoFromSSLTokenCache ();
1270- } else {
1271- RebuildVerifiedCertificateInformation (fd, infoObject);
1272- }
1148+ infoObject->RebuildCertificateInfoFromSSLTokenCache ();
12731149 }
12741150
12751151 nsITransportSecurityInfo::OverridableErrorCategory overridableErrorCategory;
0 commit comments