nsNSSIOLayer.cpp 76 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542
  1. /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  2. *
  3. * This Source Code Form is subject to the terms of the Mozilla Public
  4. * License, v. 2.0. If a copy of the MPL was not distributed with this
  5. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  6. #include "nsNSSIOLayer.h"
  7. #include <algorithm>
  8. #include "NSSCertDBTrustDomain.h"
  9. #include "NSSErrorsService.h"
  10. #include "PSMRunnable.h"
  11. #include "SSLServerCertVerification.h"
  12. #include "ScopedNSSTypes.h"
  13. #include "SharedSSLState.h"
  14. #include "keyhi.h"
  15. #include "mozilla/Casting.h"
  16. #include "mozilla/DebugOnly.h"
  17. #include "mozilla/Logging.h"
  18. #include "mozilla/Move.h"
  19. #include "mozilla/Preferences.h"
  20. #include "nsArray.h"
  21. #include "nsArrayUtils.h"
  22. #include "nsCharSeparatedTokenizer.h"
  23. #include "nsClientAuthRemember.h"
  24. #include "nsContentUtils.h"
  25. #include "nsIClientAuthDialogs.h"
  26. #include "nsIConsoleService.h"
  27. #include "nsIPrefService.h"
  28. #include "nsISocketProvider.h"
  29. #include "nsIWebProgressListener.h"
  30. #include "nsNSSCertHelper.h"
  31. #include "nsNSSComponent.h"
  32. #include "nsPrintfCString.h"
  33. #include "nsServiceManagerUtils.h"
  34. #include "pkix/pkixtypes.h"
  35. #include "prmem.h"
  36. #include "prnetdb.h"
  37. #include "secder.h"
  38. #include "secerr.h"
  39. #include "ssl.h"
  40. #include "sslerr.h"
  41. #include "sslproto.h"
  42. using namespace mozilla;
  43. using namespace mozilla::psm;
  44. //#define DEBUG_SSL_VERBOSE //Enable this define to get minimal
  45. //reports when doing SSL read/write
  46. //#define DUMP_BUFFER //Enable this define along with
  47. //DEBUG_SSL_VERBOSE to dump SSL
  48. //read/write buffer to a log.
  49. //Uses PR_LOG except on Mac where
  50. //we always write out to our own
  51. //file.
  52. namespace {
  53. #define MAX_ALPN_LENGTH 255
  54. void
  55. getSiteKey(const nsACString& hostName, uint16_t port,
  56. /*out*/ nsCSubstring& key)
  57. {
  58. key = hostName;
  59. key.AppendASCII(":");
  60. key.AppendInt(port);
  61. }
  62. // Historically, we have required that the server negotiate ALPN or NPN in
  63. // order to false start, as a compatibility hack to work around
  64. // implementations that just stop responding during false start. However, now
  65. // false start is resricted to modern crypto (TLS 1.2 and AEAD cipher suites)
  66. // so it is less likely that requring NPN or ALPN is still necessary.
  67. static const bool FALSE_START_REQUIRE_NPN_DEFAULT = false;
  68. } // unnamed namespace
  69. extern LazyLogModule gPIPNSSLog;
  70. nsNSSSocketInfo::nsNSSSocketInfo(SharedSSLState& aState, uint32_t providerFlags)
  71. : mFd(nullptr),
  72. mCertVerificationState(before_cert_verification),
  73. mSharedState(aState),
  74. mForSTARTTLS(false),
  75. mHandshakePending(true),
  76. mRememberClientAuthCertificate(false),
  77. mPreliminaryHandshakeDone(false),
  78. mNPNCompleted(false),
  79. mEarlyDataAccepted(false),
  80. mFalseStartCallbackCalled(false),
  81. mFalseStarted(false),
  82. mIsFullHandshake(false),
  83. mHandshakeCompleted(false),
  84. mJoined(false),
  85. mSentClientCert(false),
  86. mNotedTimeUntilReady(false),
  87. mFailedVerification(false),
  88. mKEAUsed(nsISSLSocketControl::KEY_EXCHANGE_UNKNOWN),
  89. mKEAKeyBits(0),
  90. mSSLVersionUsed(nsISSLSocketControl::SSL_VERSION_UNKNOWN),
  91. mMACAlgorithmUsed(nsISSLSocketControl::SSL_MAC_UNKNOWN),
  92. mBypassAuthentication(false),
  93. mProviderFlags(providerFlags),
  94. mSocketCreationTimestamp(TimeStamp::Now()),
  95. mPlaintextBytesRead(0),
  96. mClientCert(nullptr)
  97. {
  98. mTLSVersionRange.min = 0;
  99. mTLSVersionRange.max = 0;
  100. }
  101. nsNSSSocketInfo::~nsNSSSocketInfo()
  102. {
  103. }
  104. NS_IMPL_ISUPPORTS_INHERITED(nsNSSSocketInfo, TransportSecurityInfo,
  105. nsISSLSocketControl,
  106. nsIClientAuthUserDecision)
  107. NS_IMETHODIMP
  108. nsNSSSocketInfo::GetProviderFlags(uint32_t* aProviderFlags)
  109. {
  110. *aProviderFlags = mProviderFlags;
  111. return NS_OK;
  112. }
  113. NS_IMETHODIMP
  114. nsNSSSocketInfo::GetKEAUsed(int16_t* aKea)
  115. {
  116. *aKea = mKEAUsed;
  117. return NS_OK;
  118. }
  119. NS_IMETHODIMP
  120. nsNSSSocketInfo::GetKEAKeyBits(uint32_t* aKeyBits)
  121. {
  122. *aKeyBits = mKEAKeyBits;
  123. return NS_OK;
  124. }
  125. NS_IMETHODIMP
  126. nsNSSSocketInfo::GetSSLVersionUsed(int16_t* aSSLVersionUsed)
  127. {
  128. *aSSLVersionUsed = mSSLVersionUsed;
  129. return NS_OK;
  130. }
  131. NS_IMETHODIMP
  132. nsNSSSocketInfo::GetSSLVersionOffered(int16_t* aSSLVersionOffered)
  133. {
  134. *aSSLVersionOffered = mTLSVersionRange.max;
  135. return NS_OK;
  136. }
  137. NS_IMETHODIMP
  138. nsNSSSocketInfo::GetMACAlgorithmUsed(int16_t* aMac)
  139. {
  140. *aMac = mMACAlgorithmUsed;
  141. return NS_OK;
  142. }
  143. NS_IMETHODIMP
  144. nsNSSSocketInfo::GetClientCert(nsIX509Cert** aClientCert)
  145. {
  146. NS_ENSURE_ARG_POINTER(aClientCert);
  147. *aClientCert = mClientCert;
  148. NS_IF_ADDREF(*aClientCert);
  149. return NS_OK;
  150. }
  151. NS_IMETHODIMP
  152. nsNSSSocketInfo::SetClientCert(nsIX509Cert* aClientCert)
  153. {
  154. mClientCert = aClientCert;
  155. return NS_OK;
  156. }
  157. NS_IMETHODIMP
  158. nsNSSSocketInfo::GetBypassAuthentication(bool* arg)
  159. {
  160. *arg = mBypassAuthentication;
  161. return NS_OK;
  162. }
  163. NS_IMETHODIMP
  164. nsNSSSocketInfo::GetFailedVerification(bool* arg)
  165. {
  166. *arg = mFailedVerification;
  167. return NS_OK;
  168. }
  169. NS_IMETHODIMP
  170. nsNSSSocketInfo::GetRememberClientAuthCertificate(bool* aRemember)
  171. {
  172. NS_ENSURE_ARG_POINTER(aRemember);
  173. *aRemember = mRememberClientAuthCertificate;
  174. return NS_OK;
  175. }
  176. NS_IMETHODIMP
  177. nsNSSSocketInfo::SetRememberClientAuthCertificate(bool aRemember)
  178. {
  179. mRememberClientAuthCertificate = aRemember;
  180. return NS_OK;
  181. }
  182. NS_IMETHODIMP
  183. nsNSSSocketInfo::GetNotificationCallbacks(nsIInterfaceRequestor** aCallbacks)
  184. {
  185. *aCallbacks = mCallbacks;
  186. NS_IF_ADDREF(*aCallbacks);
  187. return NS_OK;
  188. }
  189. NS_IMETHODIMP
  190. nsNSSSocketInfo::SetNotificationCallbacks(nsIInterfaceRequestor* aCallbacks)
  191. {
  192. if (!aCallbacks) {
  193. mCallbacks = nullptr;
  194. return NS_OK;
  195. }
  196. mCallbacks = aCallbacks;
  197. return NS_OK;
  198. }
  199. void
  200. nsNSSSocketInfo::NoteTimeUntilReady()
  201. {
  202. if (mNotedTimeUntilReady)
  203. return;
  204. mNotedTimeUntilReady = true;
  205. MOZ_LOG(gPIPNSSLog, LogLevel::Debug,
  206. ("[%p] nsNSSSocketInfo::NoteTimeUntilReady\n", mFd));
  207. }
  208. void
  209. nsNSSSocketInfo::SetHandshakeCompleted()
  210. {
  211. // Remove the plain text layer as it is not needed anymore.
  212. // The plain text layer is not always present - so its not a fatal error
  213. // if it cannot be removed
  214. PRFileDesc* poppedPlaintext =
  215. PR_GetIdentitiesLayer(mFd, nsSSLIOLayerHelpers::nsSSLPlaintextLayerIdentity);
  216. if (poppedPlaintext) {
  217. PR_PopIOLayer(mFd, nsSSLIOLayerHelpers::nsSSLPlaintextLayerIdentity);
  218. poppedPlaintext->dtor(poppedPlaintext);
  219. }
  220. mHandshakeCompleted = true;
  221. MOZ_LOG(gPIPNSSLog, LogLevel::Debug,
  222. ("[%p] nsNSSSocketInfo::SetHandshakeCompleted\n", (void*) mFd));
  223. mIsFullHandshake = false; // reset for next handshake on this connection
  224. }
  225. void
  226. nsNSSSocketInfo::SetNegotiatedNPN(const char* value, uint32_t length)
  227. {
  228. if (!value) {
  229. mNegotiatedNPN.Truncate();
  230. } else {
  231. mNegotiatedNPN.Assign(value, length);
  232. }
  233. mNPNCompleted = true;
  234. }
  235. NS_IMETHODIMP
  236. nsNSSSocketInfo::GetNegotiatedNPN(nsACString& aNegotiatedNPN)
  237. {
  238. if (!mNPNCompleted)
  239. return NS_ERROR_NOT_CONNECTED;
  240. aNegotiatedNPN = mNegotiatedNPN;
  241. return NS_OK;
  242. }
  243. NS_IMETHODIMP
  244. nsNSSSocketInfo::GetAlpnEarlySelection(nsACString& aAlpnSelected)
  245. {
  246. nsNSSShutDownPreventionLock locker;
  247. if (isAlreadyShutDown() || isPK11LoggedOut()) {
  248. return NS_ERROR_NOT_AVAILABLE;
  249. }
  250. SSLNextProtoState alpnState;
  251. unsigned char chosenAlpn[MAX_ALPN_LENGTH];
  252. unsigned int chosenAlpnLen;
  253. SECStatus rv = SSL_GetNextProto(mFd, &alpnState, chosenAlpn, &chosenAlpnLen,
  254. AssertedCast<unsigned int>(ArrayLength(chosenAlpn)));
  255. if (rv != SECSuccess || alpnState != SSL_NEXT_PROTO_EARLY_VALUE ||
  256. chosenAlpnLen == 0) {
  257. return NS_ERROR_NOT_AVAILABLE;
  258. }
  259. aAlpnSelected.Assign(BitwiseCast<char*, unsigned char*>(chosenAlpn),
  260. chosenAlpnLen);
  261. return NS_OK;
  262. }
  263. NS_IMETHODIMP
  264. nsNSSSocketInfo::GetEarlyDataAccepted(bool* aAccepted)
  265. {
  266. *aAccepted = mEarlyDataAccepted;
  267. return NS_OK;
  268. }
  269. void
  270. nsNSSSocketInfo::SetEarlyDataAccepted(bool aAccepted)
  271. {
  272. mEarlyDataAccepted = aAccepted;
  273. }
  274. NS_IMETHODIMP
  275. nsNSSSocketInfo::DriveHandshake()
  276. {
  277. nsNSSShutDownPreventionLock locker;
  278. if (isAlreadyShutDown() || isPK11LoggedOut()) {
  279. return NS_ERROR_NOT_AVAILABLE;
  280. }
  281. if (!mFd) {
  282. return NS_ERROR_FAILURE;
  283. }
  284. PRErrorCode errorCode = GetErrorCode();
  285. if (errorCode) {
  286. return GetXPCOMFromNSSError(errorCode);
  287. }
  288. SECStatus rv = SSL_ForceHandshake(mFd);
  289. if (rv != SECSuccess) {
  290. errorCode = PR_GetError();
  291. if (errorCode == PR_WOULD_BLOCK_ERROR) {
  292. return NS_BASE_STREAM_WOULD_BLOCK;
  293. }
  294. SetCanceled(errorCode, PlainErrorMessage);
  295. return GetXPCOMFromNSSError(errorCode);
  296. }
  297. return NS_OK;
  298. }
  299. NS_IMETHODIMP
  300. nsNSSSocketInfo::IsAcceptableForHost(const nsACString& hostname, bool* _retval)
  301. {
  302. NS_ENSURE_ARG(_retval);
  303. *_retval = false;
  304. // If this is the same hostname then the certicate status does not
  305. // need to be considered. They are joinable.
  306. if (hostname.Equals(GetHostName())) {
  307. *_retval = true;
  308. return NS_OK;
  309. }
  310. // Before checking the server certificate we need to make sure the
  311. // handshake has completed.
  312. if (!mHandshakeCompleted || !SSLStatus() || !SSLStatus()->HasServerCert()) {
  313. return NS_OK;
  314. }
  315. // If the cert has error bits (e.g. it is untrusted) then do not join.
  316. // The value of mHaveCertErrorBits is only reliable because we know that
  317. // the handshake completed.
  318. if (SSLStatus()->mHaveCertErrorBits)
  319. return NS_OK;
  320. // If the connection is using client certificates then do not join
  321. // because the user decides on whether to send client certs to hosts on a
  322. // per-domain basis.
  323. if (mSentClientCert)
  324. return NS_OK;
  325. // Ensure that the server certificate covers the hostname that would
  326. // like to join this connection
  327. UniqueCERTCertificate nssCert;
  328. nsCOMPtr<nsIX509Cert> cert;
  329. if (NS_FAILED(SSLStatus()->GetServerCert(getter_AddRefs(cert)))) {
  330. return NS_OK;
  331. }
  332. if (cert) {
  333. nssCert.reset(cert->GetCert());
  334. }
  335. if (!nssCert) {
  336. return NS_OK;
  337. }
  338. // Attempt to verify the joinee's certificate using the joining hostname.
  339. // This ensures that any hostname-specific verification logic (e.g. key
  340. // pinning) is satisfied by the joinee's certificate chain.
  341. // This verification only uses local information; since we're on the network
  342. // thread, we would be blocking on ourselves if we attempted any network i/o.
  343. // TODO(bug 1056935): The certificate chain built by this verification may be
  344. // different than the certificate chain originally built during the joined
  345. // connection's TLS handshake. Consequently, we may report a wrong and/or
  346. // misleading certificate chain for HTTP transactions coalesced onto this
  347. // connection. This may become problematic in the future. For example,
  348. // if/when we begin relying on intermediate certificates being stored in the
  349. // securityInfo of a cached HTTPS response, that cached certificate chain may
  350. // actually be the wrong chain. We should consider having JoinConnection
  351. // return the certificate chain built here, so that the calling Necko code
  352. // can associate the correct certificate chain with the HTTP transactions it
  353. // is trying to join onto this connection.
  354. RefPtr<SharedCertVerifier> certVerifier(GetDefaultCertVerifier());
  355. if (!certVerifier) {
  356. return NS_OK;
  357. }
  358. nsAutoCString hostnameFlat(PromiseFlatCString(hostname));
  359. CertVerifier::Flags flags = CertVerifier::FLAG_LOCAL_ONLY;
  360. UniqueCERTCertList unusedBuiltChain;
  361. mozilla::pkix::Result result =
  362. certVerifier->VerifySSLServerCert(nssCert,
  363. nullptr, // stapledOCSPResponse
  364. nullptr, // sctsFromTLSExtension
  365. mozilla::pkix::Now(),
  366. nullptr, // pinarg
  367. hostnameFlat.get(),
  368. unusedBuiltChain,
  369. false, // save intermediates
  370. flags);
  371. if (result != mozilla::pkix::Success) {
  372. return NS_OK;
  373. }
  374. // All tests pass
  375. *_retval = true;
  376. return NS_OK;
  377. }
  378. NS_IMETHODIMP
  379. nsNSSSocketInfo::JoinConnection(const nsACString& npnProtocol,
  380. const nsACString& hostname,
  381. int32_t port,
  382. bool* _retval)
  383. {
  384. *_retval = false;
  385. // Different ports may not be joined together
  386. if (port != GetPort())
  387. return NS_OK;
  388. // Make sure NPN has been completed and matches requested npnProtocol
  389. if (!mNPNCompleted || !mNegotiatedNPN.Equals(npnProtocol))
  390. return NS_OK;
  391. if (mBypassAuthentication) {
  392. // An unauthenticated connection does not know whether or not it
  393. // is acceptable for a particular hostname
  394. return NS_OK;
  395. }
  396. IsAcceptableForHost(hostname, _retval);
  397. if (*_retval) {
  398. // All tests pass - this is joinable
  399. mJoined = true;
  400. }
  401. return NS_OK;
  402. }
  403. bool
  404. nsNSSSocketInfo::GetForSTARTTLS()
  405. {
  406. return mForSTARTTLS;
  407. }
  408. void
  409. nsNSSSocketInfo::SetForSTARTTLS(bool aForSTARTTLS)
  410. {
  411. mForSTARTTLS = aForSTARTTLS;
  412. }
  413. NS_IMETHODIMP
  414. nsNSSSocketInfo::ProxyStartSSL()
  415. {
  416. return ActivateSSL();
  417. }
  418. NS_IMETHODIMP
  419. nsNSSSocketInfo::StartTLS()
  420. {
  421. return ActivateSSL();
  422. }
  423. NS_IMETHODIMP
  424. nsNSSSocketInfo::SetNPNList(nsTArray<nsCString>& protocolArray)
  425. {
  426. nsNSSShutDownPreventionLock locker;
  427. if (isAlreadyShutDown())
  428. return NS_ERROR_NOT_AVAILABLE;
  429. if (!mFd)
  430. return NS_ERROR_FAILURE;
  431. // the npn list is a concatenated list of 8 bit byte strings.
  432. nsCString npnList;
  433. for (uint32_t index = 0; index < protocolArray.Length(); ++index) {
  434. if (protocolArray[index].IsEmpty() ||
  435. protocolArray[index].Length() > 255)
  436. return NS_ERROR_ILLEGAL_VALUE;
  437. npnList.Append(protocolArray[index].Length());
  438. npnList.Append(protocolArray[index]);
  439. }
  440. if (SSL_SetNextProtoNego(
  441. mFd,
  442. BitwiseCast<const unsigned char*, const char*>(npnList.get()),
  443. npnList.Length()) != SECSuccess)
  444. return NS_ERROR_FAILURE;
  445. return NS_OK;
  446. }
  447. nsresult
  448. nsNSSSocketInfo::ActivateSSL()
  449. {
  450. nsNSSShutDownPreventionLock locker;
  451. if (isAlreadyShutDown())
  452. return NS_ERROR_NOT_AVAILABLE;
  453. if (SECSuccess != SSL_OptionSet(mFd, SSL_SECURITY, true))
  454. return NS_ERROR_FAILURE;
  455. if (SECSuccess != SSL_ResetHandshake(mFd, false))
  456. return NS_ERROR_FAILURE;
  457. mHandshakePending = true;
  458. return NS_OK;
  459. }
  460. nsresult
  461. nsNSSSocketInfo::GetFileDescPtr(PRFileDesc** aFilePtr)
  462. {
  463. *aFilePtr = mFd;
  464. return NS_OK;
  465. }
  466. nsresult
  467. nsNSSSocketInfo::SetFileDescPtr(PRFileDesc* aFilePtr)
  468. {
  469. mFd = aFilePtr;
  470. return NS_OK;
  471. }
  472. void
  473. nsNSSSocketInfo::SetCertVerificationWaiting()
  474. {
  475. // mCertVerificationState may be before_cert_verification for the first
  476. // handshake on the connection, or after_cert_verification for subsequent
  477. // renegotiation handshakes.
  478. NS_ASSERTION(mCertVerificationState != waiting_for_cert_verification,
  479. "Invalid state transition to waiting_for_cert_verification");
  480. mCertVerificationState = waiting_for_cert_verification;
  481. }
  482. // Be careful that SetCertVerificationResult does NOT get called while we are
  483. // processing a SSL callback function, because SSL_AuthCertificateComplete will
  484. // attempt to acquire locks that are already held by libssl when it calls
  485. // callbacks.
  486. void
  487. nsNSSSocketInfo::SetCertVerificationResult(PRErrorCode errorCode,
  488. SSLErrorMessageType errorMessageType)
  489. {
  490. NS_ASSERTION(mCertVerificationState == waiting_for_cert_verification,
  491. "Invalid state transition to cert_verification_finished");
  492. if (mFd) {
  493. SECStatus rv = SSL_AuthCertificateComplete(mFd, errorCode);
  494. // Only replace errorCode if there was originally no error
  495. if (rv != SECSuccess && errorCode == 0) {
  496. errorCode = PR_GetError();
  497. errorMessageType = PlainErrorMessage;
  498. if (errorCode == 0) {
  499. NS_ERROR("SSL_AuthCertificateComplete didn't set error code");
  500. errorCode = PR_INVALID_STATE_ERROR;
  501. }
  502. }
  503. }
  504. if (errorCode) {
  505. mFailedVerification = true;
  506. SetCanceled(errorCode, errorMessageType);
  507. }
  508. mCertVerificationState = after_cert_verification;
  509. }
  510. SharedSSLState&
  511. nsNSSSocketInfo::SharedState()
  512. {
  513. return mSharedState;
  514. }
  515. void nsSSLIOLayerHelpers::Cleanup()
  516. {
  517. MutexAutoLock lock(mutex);
  518. mTLSIntoleranceInfo.Clear();
  519. mInsecureFallbackSites.Clear();
  520. }
  521. static void
  522. nsHandleSSLError(nsNSSSocketInfo* socketInfo,
  523. ::mozilla::psm::SSLErrorMessageType errtype,
  524. PRErrorCode err)
  525. {
  526. if (!NS_IsMainThread()) {
  527. NS_ERROR("nsHandleSSLError called off the main thread");
  528. return;
  529. }
  530. // SetCanceled is only called by the main thread or the socket transport
  531. // thread. Whenever this function is called on the main thread, the SSL
  532. // thread is blocked on it. So, no mutex is necessary for
  533. // SetCanceled()/GetError*().
  534. if (socketInfo->GetErrorCode()) {
  535. // If the socket has been flagged as canceled,
  536. // the code who did was responsible for setting the error code.
  537. return;
  538. }
  539. // We must cancel first, which sets the error code.
  540. socketInfo->SetCanceled(err, PlainErrorMessage);
  541. nsXPIDLString errorString;
  542. socketInfo->GetErrorLogMessage(err, errtype, errorString);
  543. if (!errorString.IsEmpty()) {
  544. nsContentUtils::LogSimpleConsoleError(errorString, "SSL");
  545. }
  546. }
  547. namespace {
  548. enum Operation { reading, writing, not_reading_or_writing };
  549. int32_t checkHandshake(int32_t bytesTransfered, bool wasReading,
  550. PRFileDesc* ssl_layer_fd,
  551. nsNSSSocketInfo* socketInfo);
  552. nsNSSSocketInfo*
  553. getSocketInfoIfRunning(PRFileDesc* fd, Operation op,
  554. const nsNSSShutDownPreventionLock& /*proofOfLock*/)
  555. {
  556. if (!fd || !fd->lower || !fd->secret ||
  557. fd->identity != nsSSLIOLayerHelpers::nsSSLIOLayerIdentity) {
  558. NS_ERROR("bad file descriptor passed to getSocketInfoIfRunning");
  559. PR_SetError(PR_BAD_DESCRIPTOR_ERROR, 0);
  560. return nullptr;
  561. }
  562. nsNSSSocketInfo* socketInfo = (nsNSSSocketInfo*) fd->secret;
  563. if (socketInfo->isAlreadyShutDown() || socketInfo->isPK11LoggedOut()) {
  564. PR_SetError(PR_SOCKET_SHUTDOWN_ERROR, 0);
  565. return nullptr;
  566. }
  567. if (socketInfo->GetErrorCode()) {
  568. PRErrorCode err = socketInfo->GetErrorCode();
  569. PR_SetError(err, 0);
  570. if (op == reading || op == writing) {
  571. // We must do TLS intolerance checks for reads and writes, for timeouts
  572. // in particular.
  573. (void) checkHandshake(-1, op == reading, fd, socketInfo);
  574. }
  575. // If we get here, it is probably because cert verification failed and this
  576. // is the first I/O attempt since that failure.
  577. return nullptr;
  578. }
  579. return socketInfo;
  580. }
  581. } // namespace
  582. static PRStatus
  583. nsSSLIOLayerConnect(PRFileDesc* fd, const PRNetAddr* addr,
  584. PRIntervalTime timeout)
  585. {
  586. MOZ_LOG(gPIPNSSLog, LogLevel::Debug, ("[%p] connecting SSL socket\n",
  587. (void*) fd));
  588. nsNSSShutDownPreventionLock locker;
  589. if (!getSocketInfoIfRunning(fd, not_reading_or_writing, locker))
  590. return PR_FAILURE;
  591. PRStatus status = fd->lower->methods->connect(fd->lower, addr, timeout);
  592. if (status != PR_SUCCESS) {
  593. MOZ_LOG(gPIPNSSLog, LogLevel::Error, ("[%p] Lower layer connect error: %d\n",
  594. (void*) fd, PR_GetError()));
  595. return status;
  596. }
  597. MOZ_LOG(gPIPNSSLog, LogLevel::Debug, ("[%p] Connect\n", (void*) fd));
  598. return status;
  599. }
  600. void
  601. nsSSLIOLayerHelpers::rememberTolerantAtVersion(const nsACString& hostName,
  602. int16_t port, uint16_t tolerant)
  603. {
  604. nsCString key;
  605. getSiteKey(hostName, port, key);
  606. MutexAutoLock lock(mutex);
  607. IntoleranceEntry entry;
  608. if (mTLSIntoleranceInfo.Get(key, &entry)) {
  609. entry.AssertInvariant();
  610. entry.tolerant = std::max(entry.tolerant, tolerant);
  611. if (entry.intolerant != 0 && entry.intolerant <= entry.tolerant) {
  612. entry.intolerant = entry.tolerant + 1;
  613. entry.intoleranceReason = 0; // lose the reason
  614. }
  615. if (entry.strongCipherStatus == StrongCipherStatusUnknown) {
  616. entry.strongCipherStatus = StrongCiphersWorked;
  617. }
  618. } else {
  619. entry.tolerant = tolerant;
  620. entry.intolerant = 0;
  621. entry.intoleranceReason = 0;
  622. entry.strongCipherStatus = StrongCiphersWorked;
  623. }
  624. entry.AssertInvariant();
  625. mTLSIntoleranceInfo.Put(key, entry);
  626. }
  627. void
  628. nsSSLIOLayerHelpers::forgetIntolerance(const nsACString& hostName,
  629. int16_t port)
  630. {
  631. nsCString key;
  632. getSiteKey(hostName, port, key);
  633. MutexAutoLock lock(mutex);
  634. IntoleranceEntry entry;
  635. if (mTLSIntoleranceInfo.Get(key, &entry)) {
  636. entry.AssertInvariant();
  637. entry.intolerant = 0;
  638. entry.intoleranceReason = 0;
  639. if (entry.strongCipherStatus != StrongCiphersWorked) {
  640. entry.strongCipherStatus = StrongCipherStatusUnknown;
  641. }
  642. entry.AssertInvariant();
  643. mTLSIntoleranceInfo.Put(key, entry);
  644. }
  645. }
  646. bool
  647. nsSSLIOLayerHelpers::fallbackLimitReached(const nsACString& hostName,
  648. uint16_t intolerant)
  649. {
  650. if (isInsecureFallbackSite(hostName)) {
  651. return intolerant <= SSL_LIBRARY_VERSION_TLS_1_0;
  652. }
  653. return intolerant <= mVersionFallbackLimit;
  654. }
  655. // returns true if we should retry the handshake
  656. bool
  657. nsSSLIOLayerHelpers::rememberIntolerantAtVersion(const nsACString& hostName,
  658. int16_t port,
  659. uint16_t minVersion,
  660. uint16_t intolerant,
  661. PRErrorCode intoleranceReason)
  662. {
  663. if (intolerant <= minVersion || fallbackLimitReached(hostName, intolerant)) {
  664. // We can't fall back any further. Assume that intolerance isn't the issue.
  665. forgetIntolerance(hostName, port);
  666. return false;
  667. }
  668. nsCString key;
  669. getSiteKey(hostName, port, key);
  670. MutexAutoLock lock(mutex);
  671. IntoleranceEntry entry;
  672. if (mTLSIntoleranceInfo.Get(key, &entry)) {
  673. entry.AssertInvariant();
  674. if (intolerant <= entry.tolerant) {
  675. // We already know the server is tolerant at an equal or higher version.
  676. return false;
  677. }
  678. if ((entry.intolerant != 0 && intolerant >= entry.intolerant)) {
  679. // We already know that the server is intolerant at a lower version.
  680. return true;
  681. }
  682. } else {
  683. entry.tolerant = 0;
  684. entry.strongCipherStatus = StrongCipherStatusUnknown;
  685. }
  686. entry.intolerant = intolerant;
  687. entry.intoleranceReason = intoleranceReason;
  688. entry.AssertInvariant();
  689. mTLSIntoleranceInfo.Put(key, entry);
  690. return true;
  691. }
  692. // returns true if we should retry the handshake
  693. bool
  694. nsSSLIOLayerHelpers::rememberStrongCiphersFailed(const nsACString& hostName,
  695. int16_t port,
  696. PRErrorCode intoleranceReason)
  697. {
  698. nsCString key;
  699. getSiteKey(hostName, port, key);
  700. MutexAutoLock lock(mutex);
  701. IntoleranceEntry entry;
  702. if (mTLSIntoleranceInfo.Get(key, &entry)) {
  703. entry.AssertInvariant();
  704. if (entry.strongCipherStatus != StrongCipherStatusUnknown) {
  705. // We already know if the server supports a strong cipher.
  706. return false;
  707. }
  708. } else {
  709. entry.tolerant = 0;
  710. entry.intolerant = 0;
  711. entry.intoleranceReason = intoleranceReason;
  712. }
  713. entry.strongCipherStatus = StrongCiphersFailed;
  714. entry.AssertInvariant();
  715. mTLSIntoleranceInfo.Put(key, entry);
  716. return true;
  717. }
  718. void
  719. nsSSLIOLayerHelpers::adjustForTLSIntolerance(const nsACString& hostName,
  720. int16_t port,
  721. /*in/out*/ SSLVersionRange& range,
  722. /*out*/ StrongCipherStatus& strongCipherStatus)
  723. {
  724. IntoleranceEntry entry;
  725. {
  726. nsCString key;
  727. getSiteKey(hostName, port, key);
  728. MutexAutoLock lock(mutex);
  729. if (!mTLSIntoleranceInfo.Get(key, &entry)) {
  730. return;
  731. }
  732. }
  733. entry.AssertInvariant();
  734. if (entry.intolerant != 0) {
  735. // We've tried connecting at a higher range but failed, so try at the
  736. // version we haven't tried yet, unless we have reached the minimum.
  737. if (range.min < entry.intolerant) {
  738. range.max = entry.intolerant - 1;
  739. }
  740. }
  741. strongCipherStatus = entry.strongCipherStatus;
  742. }
  743. PRErrorCode
  744. nsSSLIOLayerHelpers::getIntoleranceReason(const nsACString& hostName,
  745. int16_t port)
  746. {
  747. IntoleranceEntry entry;
  748. {
  749. nsCString key;
  750. getSiteKey(hostName, port, key);
  751. MutexAutoLock lock(mutex);
  752. if (!mTLSIntoleranceInfo.Get(key, &entry)) {
  753. return 0;
  754. }
  755. }
  756. entry.AssertInvariant();
  757. return entry.intoleranceReason;
  758. }
  759. bool nsSSLIOLayerHelpers::nsSSLIOLayerInitialized = false;
  760. PRDescIdentity nsSSLIOLayerHelpers::nsSSLIOLayerIdentity;
  761. PRDescIdentity nsSSLIOLayerHelpers::nsSSLPlaintextLayerIdentity;
  762. PRIOMethods nsSSLIOLayerHelpers::nsSSLIOLayerMethods;
  763. PRIOMethods nsSSLIOLayerHelpers::nsSSLPlaintextLayerMethods;
  764. static PRStatus
  765. nsSSLIOLayerClose(PRFileDesc* fd)
  766. {
  767. nsNSSShutDownPreventionLock locker;
  768. if (!fd)
  769. return PR_FAILURE;
  770. MOZ_LOG(gPIPNSSLog, LogLevel::Debug, ("[%p] Shutting down socket\n",
  771. (void*) fd));
  772. nsNSSSocketInfo* socketInfo = (nsNSSSocketInfo*) fd->secret;
  773. NS_ASSERTION(socketInfo,"nsNSSSocketInfo was null for an fd");
  774. return socketInfo->CloseSocketAndDestroy(locker);
  775. }
  776. PRStatus
  777. nsNSSSocketInfo::CloseSocketAndDestroy(
  778. const nsNSSShutDownPreventionLock& /*proofOfLock*/)
  779. {
  780. PRFileDesc* popped = PR_PopIOLayer(mFd, PR_TOP_IO_LAYER);
  781. NS_ASSERTION(popped &&
  782. popped->identity == nsSSLIOLayerHelpers::nsSSLIOLayerIdentity,
  783. "SSL Layer not on top of stack");
  784. // The plain text layer is not always present - so its not a fatal error
  785. // if it cannot be removed
  786. PRFileDesc* poppedPlaintext =
  787. PR_GetIdentitiesLayer(mFd, nsSSLIOLayerHelpers::nsSSLPlaintextLayerIdentity);
  788. if (poppedPlaintext) {
  789. PR_PopIOLayer(mFd, nsSSLIOLayerHelpers::nsSSLPlaintextLayerIdentity);
  790. poppedPlaintext->dtor(poppedPlaintext);
  791. }
  792. PRStatus status = mFd->methods->close(mFd);
  793. // the nsNSSSocketInfo instance can out-live the connection, so we need some
  794. // indication that the connection has been closed. mFd == nullptr is that
  795. // indication. This is needed, for example, when the connection is closed
  796. // before we have finished validating the server's certificate.
  797. mFd = nullptr;
  798. if (status != PR_SUCCESS) return status;
  799. popped->identity = PR_INVALID_IO_LAYER;
  800. NS_RELEASE_THIS();
  801. popped->dtor(popped);
  802. return PR_SUCCESS;
  803. }
  804. #if defined(DEBUG_SSL_VERBOSE) && defined(DUMP_BUFFER)
  805. // Dumps a (potentially binary) buffer using SSM_DEBUG. (We could have used
  806. // the version in ssltrace.c, but that's specifically tailored to SSLTRACE.)
  807. #define DUMPBUF_LINESIZE 24
  808. static void
  809. nsDumpBuffer(unsigned char* buf, int len)
  810. {
  811. char hexbuf[DUMPBUF_LINESIZE*3+1];
  812. char chrbuf[DUMPBUF_LINESIZE+1];
  813. static const char* hex = "0123456789abcdef";
  814. int i = 0;
  815. int l = 0;
  816. char ch;
  817. char* c;
  818. char* h;
  819. if (len == 0)
  820. return;
  821. hexbuf[DUMPBUF_LINESIZE*3] = '\0';
  822. chrbuf[DUMPBUF_LINESIZE] = '\0';
  823. (void) memset(hexbuf, 0x20, DUMPBUF_LINESIZE*3);
  824. (void) memset(chrbuf, 0x20, DUMPBUF_LINESIZE);
  825. h = hexbuf;
  826. c = chrbuf;
  827. while (i < len) {
  828. ch = buf[i];
  829. if (l == DUMPBUF_LINESIZE) {
  830. MOZ_LOG(gPIPNSSLog, LogLevel::Debug, ("%s%s\n", hexbuf, chrbuf));
  831. (void) memset(hexbuf, 0x20, DUMPBUF_LINESIZE*3);
  832. (void) memset(chrbuf, 0x20, DUMPBUF_LINESIZE);
  833. h = hexbuf;
  834. c = chrbuf;
  835. l = 0;
  836. }
  837. // Convert a character to hex.
  838. *h++ = hex[(ch >> 4) & 0xf];
  839. *h++ = hex[ch & 0xf];
  840. h++;
  841. // Put the character (if it's printable) into the character buffer.
  842. if ((ch >= 0x20) && (ch <= 0x7e)) {
  843. *c++ = ch;
  844. } else {
  845. *c++ = '.';
  846. }
  847. i++; l++;
  848. }
  849. MOZ_LOG(gPIPNSSLog, LogLevel::Debug, ("%s%s\n", hexbuf, chrbuf));
  850. }
  851. #define DEBUG_DUMP_BUFFER(buf,len) nsDumpBuffer(buf,len)
  852. #else
  853. #define DEBUG_DUMP_BUFFER(buf,len)
  854. #endif
  855. class SSLErrorRunnable : public SyncRunnableBase
  856. {
  857. public:
  858. SSLErrorRunnable(nsNSSSocketInfo* infoObject,
  859. ::mozilla::psm::SSLErrorMessageType errtype,
  860. PRErrorCode errorCode)
  861. : mInfoObject(infoObject)
  862. , mErrType(errtype)
  863. , mErrorCode(errorCode)
  864. {
  865. }
  866. virtual void RunOnTargetThread()
  867. {
  868. nsHandleSSLError(mInfoObject, mErrType, mErrorCode);
  869. }
  870. RefPtr<nsNSSSocketInfo> mInfoObject;
  871. ::mozilla::psm::SSLErrorMessageType mErrType;
  872. const PRErrorCode mErrorCode;
  873. };
  874. namespace {
  875. bool
  876. retryDueToTLSIntolerance(PRErrorCode err, nsNSSSocketInfo* socketInfo)
  877. {
  878. // This function is supposed to decide which error codes should
  879. // be used to conclude server is TLS intolerant.
  880. // Note this only happens during the initial SSL handshake.
  881. SSLVersionRange range = socketInfo->GetTLSVersionRange();
  882. nsSSLIOLayerHelpers& helpers = socketInfo->SharedState().IOLayerHelpers();
  883. if (err == SSL_ERROR_UNSUPPORTED_VERSION &&
  884. range.min == SSL_LIBRARY_VERSION_TLS_1_0) {
  885. socketInfo->SetSecurityState(nsIWebProgressListener::STATE_IS_INSECURE |
  886. nsIWebProgressListener::STATE_USES_SSL_3);
  887. }
  888. // NSS will return SSL_ERROR_RX_MALFORMED_SERVER_HELLO if anti-downgrade
  889. // detected the downgrade.
  890. if (err == SSL_ERROR_INAPPROPRIATE_FALLBACK_ALERT ||
  891. err == SSL_ERROR_RX_MALFORMED_SERVER_HELLO) {
  892. // This is a clear signal that we've fallen back too many versions. Treat
  893. // this as a hard failure, but forget any intolerance so that later attempts
  894. // don't use this version (i.e., range.max) and trigger the error again.
  895. helpers.forgetIntolerance(socketInfo->GetHostName(),
  896. socketInfo->GetPort());
  897. return false;
  898. }
  899. // Disallow PR_CONNECT_RESET_ERROR if fallback limit reached.
  900. bool fallbackLimitReached =
  901. helpers.fallbackLimitReached(socketInfo->GetHostName(), range.max);
  902. if (err == PR_CONNECT_RESET_ERROR && fallbackLimitReached) {
  903. return false;
  904. }
  905. if ((err == SSL_ERROR_NO_CYPHER_OVERLAP || err == PR_END_OF_FILE_ERROR ||
  906. err == PR_CONNECT_RESET_ERROR) &&
  907. nsNSSComponent::AreAnyWeakCiphersEnabled()) {
  908. if (helpers.isInsecureFallbackSite(socketInfo->GetHostName()) ||
  909. helpers.mUnrestrictedRC4Fallback) {
  910. if (helpers.rememberStrongCiphersFailed(socketInfo->GetHostName(),
  911. socketInfo->GetPort(), err)) {
  912. return true;
  913. }
  914. }
  915. }
  916. // When not using a proxy we'll see a connection reset error.
  917. // When using a proxy, we'll see an end of file error.
  918. // Don't allow STARTTLS connections to fall back on connection resets or
  919. // EOF.
  920. if ((err == PR_CONNECT_RESET_ERROR || err == PR_END_OF_FILE_ERROR)
  921. && socketInfo->GetForSTARTTLS()) {
  922. return false;
  923. }
  924. if (!helpers.rememberIntolerantAtVersion(socketInfo->GetHostName(),
  925. socketInfo->GetPort(),
  926. range.min, range.max, err)) {
  927. return false;
  928. }
  929. return true;
  930. }
  931. // Ensure that we haven't added too many errors to fit.
  932. static_assert((SSL_ERROR_END_OF_LIST - SSL_ERROR_BASE) <= 256,
  933. "too many SSL errors");
  934. static_assert((SEC_ERROR_END_OF_LIST - SEC_ERROR_BASE) <= 256,
  935. "too many SEC errors");
  936. static_assert((PR_MAX_ERROR - PR_NSPR_ERROR_BASE) <= 128,
  937. "too many NSPR errors");
  938. static_assert((mozilla::pkix::ERROR_BASE - mozilla::pkix::END_OF_LIST) < 31,
  939. "too many moz::pkix errors");
  940. int32_t
  941. checkHandshake(int32_t bytesTransfered, bool wasReading,
  942. PRFileDesc* ssl_layer_fd, nsNSSSocketInfo* socketInfo)
  943. {
  944. const PRErrorCode originalError = PR_GetError();
  945. PRErrorCode err = originalError;
  946. // This is where we work around all of those SSL servers that don't
  947. // conform to the SSL spec and shutdown a connection when we request
  948. // SSL v3.1 (aka TLS). The spec says the client says what version
  949. // of the protocol we're willing to perform, in our case SSL v3.1
  950. // In its response, the server says which version it wants to perform.
  951. // Many servers out there only know how to do v3.0. Next, we're supposed
  952. // to send back the version of the protocol we requested (ie v3.1). At
  953. // this point many servers's implementations are broken and they shut
  954. // down the connection when they don't see the version they sent back.
  955. // This is supposed to prevent a man in the middle from forcing one
  956. // side to dumb down to a lower level of the protocol. Unfortunately,
  957. // there are enough broken servers out there that such a gross work-around
  958. // is necessary. :(
  959. // Do NOT assume TLS intolerance on a closed connection after bad cert ui was shown.
  960. // Simply retry.
  961. // This depends on the fact that Cert UI will not be shown again,
  962. // should the user override the bad cert.
  963. bool handleHandshakeResultNow = socketInfo->IsHandshakePending();
  964. bool wantRetry = false;
  965. if (0 > bytesTransfered) {
  966. if (handleHandshakeResultNow) {
  967. if (PR_WOULD_BLOCK_ERROR == err) {
  968. PR_SetError(err, 0);
  969. return bytesTransfered;
  970. }
  971. wantRetry = retryDueToTLSIntolerance(err, socketInfo);
  972. }
  973. // This is the common place where we trigger non-cert-errors on a SSL
  974. // socket. This might be reached at any time of the connection.
  975. //
  976. // The socketInfo->GetErrorCode() check is here to ensure we don't try to
  977. // do the synchronous dispatch to the main thread unnecessarily after we've
  978. // already handled a certificate error. (SSLErrorRunnable calls
  979. // nsHandleSSLError, which has logic to avoid replacing the error message,
  980. // so without the !socketInfo->GetErrorCode(), it would just be an
  981. // expensive no-op.)
  982. if (!wantRetry && mozilla::psm::IsNSSErrorCode(err) &&
  983. !socketInfo->GetErrorCode()) {
  984. RefPtr<SyncRunnableBase> runnable(new SSLErrorRunnable(socketInfo,
  985. PlainErrorMessage,
  986. err));
  987. (void) runnable->DispatchToMainThreadAndWait();
  988. }
  989. } else if (wasReading && 0 == bytesTransfered) {
  990. // zero bytes on reading, socket closed
  991. if (handleHandshakeResultNow) {
  992. wantRetry = retryDueToTLSIntolerance(PR_END_OF_FILE_ERROR, socketInfo);
  993. }
  994. }
  995. if (wantRetry) {
  996. MOZ_LOG(gPIPNSSLog, LogLevel::Debug,
  997. ("[%p] checkHandshake: will retry with lower max TLS version\n",
  998. ssl_layer_fd));
  999. // We want to cause the network layer to retry the connection.
  1000. err = PR_CONNECT_RESET_ERROR;
  1001. if (wasReading)
  1002. bytesTransfered = -1;
  1003. }
  1004. // TLS intolerant servers only cause the first transfer to fail, so let's
  1005. // set the HandshakePending attribute to false so that we don't try the logic
  1006. // above again in a subsequent transfer.
  1007. if (handleHandshakeResultNow) {
  1008. socketInfo->SetHandshakeNotPending();
  1009. }
  1010. if (bytesTransfered < 0) {
  1011. // Remember that we encountered an error so that getSocketInfoIfRunning
  1012. // will correctly cause us to fail if another part of Gecko
  1013. // (erroneously) calls an I/O function (PR_Send/PR_Recv/etc.) again on
  1014. // this socket. Note that we use the original error because if we use
  1015. // PR_CONNECT_RESET_ERROR, we'll repeated try to reconnect.
  1016. if (originalError != PR_WOULD_BLOCK_ERROR && !socketInfo->GetErrorCode()) {
  1017. socketInfo->SetCanceled(originalError, PlainErrorMessage);
  1018. }
  1019. PR_SetError(err, 0);
  1020. }
  1021. return bytesTransfered;
  1022. }
  1023. } // namespace
  1024. static int16_t
  1025. nsSSLIOLayerPoll(PRFileDesc* fd, int16_t in_flags, int16_t* out_flags)
  1026. {
  1027. nsNSSShutDownPreventionLock locker;
  1028. if (!out_flags) {
  1029. NS_WARNING("nsSSLIOLayerPoll called with null out_flags");
  1030. return 0;
  1031. }
  1032. *out_flags = 0;
  1033. nsNSSSocketInfo* socketInfo =
  1034. getSocketInfoIfRunning(fd, not_reading_or_writing, locker);
  1035. if (!socketInfo) {
  1036. // If we get here, it is probably because certificate validation failed
  1037. // and this is the first I/O operation after the failure.
  1038. MOZ_LOG(gPIPNSSLog, LogLevel::Debug,
  1039. ("[%p] polling SSL socket right after certificate verification failed "
  1040. "or NSS shutdown or SDR logout %d\n",
  1041. fd, (int) in_flags));
  1042. NS_ASSERTION(in_flags & PR_POLL_EXCEPT,
  1043. "caller did not poll for EXCEPT (canceled)");
  1044. // Since this poll method cannot return errors, we want the caller to call
  1045. // PR_Send/PR_Recv right away to get the error, so we tell that we are
  1046. // ready for whatever I/O they are asking for. (See getSocketInfoIfRunning).
  1047. *out_flags = in_flags | PR_POLL_EXCEPT; // see also bug 480619
  1048. return in_flags;
  1049. }
  1050. MOZ_LOG(gPIPNSSLog, LogLevel::Verbose,
  1051. (socketInfo->IsWaitingForCertVerification()
  1052. ? "[%p] polling SSL socket during certificate verification using lower %d\n"
  1053. : "[%p] poll SSL socket using lower %d\n",
  1054. fd, (int) in_flags));
  1055. // We want the handshake to continue during certificate validation, so we
  1056. // don't need to do anything special here. libssl automatically blocks when
  1057. // it reaches any point that would be unsafe to send/receive something before
  1058. // cert validation is complete.
  1059. int16_t result = fd->lower->methods->poll(fd->lower, in_flags, out_flags);
  1060. MOZ_LOG(gPIPNSSLog, LogLevel::Verbose,
  1061. ("[%p] poll SSL socket returned %d\n", (void*) fd, (int) result));
  1062. return result;
  1063. }
  1064. nsSSLIOLayerHelpers::nsSSLIOLayerHelpers()
  1065. : mTreatUnsafeNegotiationAsBroken(false)
  1066. , mTLSIntoleranceInfo()
  1067. , mFalseStartRequireNPN(false)
  1068. , mUnrestrictedRC4Fallback(false)
  1069. , mVersionFallbackLimit(SSL_LIBRARY_VERSION_TLS_1_0)
  1070. , mutex("nsSSLIOLayerHelpers.mutex")
  1071. {
  1072. }
  1073. static int
  1074. _PSM_InvalidInt(void)
  1075. {
  1076. MOZ_ASSERT_UNREACHABLE("I/O method is invalid");
  1077. PR_SetError(PR_INVALID_METHOD_ERROR, 0);
  1078. return -1;
  1079. }
  1080. static int64_t
  1081. _PSM_InvalidInt64(void)
  1082. {
  1083. MOZ_ASSERT_UNREACHABLE("I/O method is invalid");
  1084. PR_SetError(PR_INVALID_METHOD_ERROR, 0);
  1085. return -1;
  1086. }
  1087. static PRStatus
  1088. _PSM_InvalidStatus(void)
  1089. {
  1090. MOZ_ASSERT_UNREACHABLE("I/O method is invalid");
  1091. PR_SetError(PR_INVALID_METHOD_ERROR, 0);
  1092. return PR_FAILURE;
  1093. }
  1094. static PRFileDesc*
  1095. _PSM_InvalidDesc(void)
  1096. {
  1097. MOZ_ASSERT_UNREACHABLE("I/O method is invalid");
  1098. PR_SetError(PR_INVALID_METHOD_ERROR, 0);
  1099. return nullptr;
  1100. }
  1101. static PRStatus
  1102. PSMGetsockname(PRFileDesc* fd, PRNetAddr* addr)
  1103. {
  1104. nsNSSShutDownPreventionLock locker;
  1105. if (!getSocketInfoIfRunning(fd, not_reading_or_writing, locker))
  1106. return PR_FAILURE;
  1107. return fd->lower->methods->getsockname(fd->lower, addr);
  1108. }
  1109. static PRStatus
  1110. PSMGetpeername(PRFileDesc* fd, PRNetAddr* addr)
  1111. {
  1112. nsNSSShutDownPreventionLock locker;
  1113. if (!getSocketInfoIfRunning(fd, not_reading_or_writing, locker))
  1114. return PR_FAILURE;
  1115. return fd->lower->methods->getpeername(fd->lower, addr);
  1116. }
  1117. static PRStatus
  1118. PSMGetsocketoption(PRFileDesc* fd, PRSocketOptionData* data)
  1119. {
  1120. nsNSSShutDownPreventionLock locker;
  1121. if (!getSocketInfoIfRunning(fd, not_reading_or_writing, locker))
  1122. return PR_FAILURE;
  1123. return fd->lower->methods->getsocketoption(fd, data);
  1124. }
  1125. static PRStatus
  1126. PSMSetsocketoption(PRFileDesc* fd, const PRSocketOptionData* data)
  1127. {
  1128. nsNSSShutDownPreventionLock locker;
  1129. if (!getSocketInfoIfRunning(fd, not_reading_or_writing, locker))
  1130. return PR_FAILURE;
  1131. return fd->lower->methods->setsocketoption(fd, data);
  1132. }
  1133. static int32_t
  1134. PSMRecv(PRFileDesc* fd, void* buf, int32_t amount, int flags,
  1135. PRIntervalTime timeout)
  1136. {
  1137. nsNSSShutDownPreventionLock locker;
  1138. nsNSSSocketInfo* socketInfo = getSocketInfoIfRunning(fd, reading, locker);
  1139. if (!socketInfo)
  1140. return -1;
  1141. if (flags != PR_MSG_PEEK && flags != 0) {
  1142. PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
  1143. return -1;
  1144. }
  1145. int32_t bytesRead = fd->lower->methods->recv(fd->lower, buf, amount, flags,
  1146. timeout);
  1147. MOZ_LOG(gPIPNSSLog, LogLevel::Verbose,
  1148. ("[%p] read %d bytes\n", (void*) fd, bytesRead));
  1149. #ifdef DEBUG_SSL_VERBOSE
  1150. DEBUG_DUMP_BUFFER((unsigned char*) buf, bytesRead);
  1151. #endif
  1152. return checkHandshake(bytesRead, true, fd, socketInfo);
  1153. }
  1154. static int32_t
  1155. PSMSend(PRFileDesc* fd, const void* buf, int32_t amount, int flags,
  1156. PRIntervalTime timeout)
  1157. {
  1158. nsNSSShutDownPreventionLock locker;
  1159. nsNSSSocketInfo* socketInfo = getSocketInfoIfRunning(fd, writing, locker);
  1160. if (!socketInfo)
  1161. return -1;
  1162. if (flags != 0) {
  1163. PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
  1164. return -1;
  1165. }
  1166. #ifdef DEBUG_SSL_VERBOSE
  1167. DEBUG_DUMP_BUFFER((unsigned char*) buf, amount);
  1168. #endif
  1169. int32_t bytesWritten = fd->lower->methods->send(fd->lower, buf, amount,
  1170. flags, timeout);
  1171. MOZ_LOG(gPIPNSSLog, LogLevel::Verbose,
  1172. ("[%p] wrote %d bytes\n", fd, bytesWritten));
  1173. return checkHandshake(bytesWritten, false, fd, socketInfo);
  1174. }
  1175. static PRStatus
  1176. PSMBind(PRFileDesc* fd, const PRNetAddr *addr)
  1177. {
  1178. nsNSSShutDownPreventionLock locker;
  1179. if (!getSocketInfoIfRunning(fd, not_reading_or_writing, locker))
  1180. return PR_FAILURE;
  1181. return fd->lower->methods->bind(fd->lower, addr);
  1182. }
  1183. static int32_t
  1184. nsSSLIOLayerRead(PRFileDesc* fd, void* buf, int32_t amount)
  1185. {
  1186. return PSMRecv(fd, buf, amount, 0, PR_INTERVAL_NO_TIMEOUT);
  1187. }
  1188. static int32_t
  1189. nsSSLIOLayerWrite(PRFileDesc* fd, const void* buf, int32_t amount)
  1190. {
  1191. return PSMSend(fd, buf, amount, 0, PR_INTERVAL_NO_TIMEOUT);
  1192. }
  1193. static PRStatus
  1194. PSMConnectcontinue(PRFileDesc* fd, int16_t out_flags)
  1195. {
  1196. nsNSSShutDownPreventionLock locker;
  1197. if (!getSocketInfoIfRunning(fd, not_reading_or_writing, locker)) {
  1198. return PR_FAILURE;
  1199. }
  1200. return fd->lower->methods->connectcontinue(fd, out_flags);
  1201. }
  1202. static int
  1203. PSMAvailable(void)
  1204. {
  1205. // This is called through PR_Available(), but is not implemented in PSM
  1206. PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
  1207. return -1;
  1208. }
  1209. static int64_t
  1210. PSMAvailable64(void)
  1211. {
  1212. // This is called through PR_Available(), but is not implemented in PSM
  1213. PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
  1214. return -1;
  1215. }
  1216. namespace {
  1217. class PrefObserver : public nsIObserver {
  1218. public:
  1219. NS_DECL_THREADSAFE_ISUPPORTS
  1220. NS_DECL_NSIOBSERVER
  1221. explicit PrefObserver(nsSSLIOLayerHelpers* aOwner) : mOwner(aOwner) {}
  1222. protected:
  1223. virtual ~PrefObserver() {}
  1224. private:
  1225. nsSSLIOLayerHelpers* mOwner;
  1226. };
  1227. } // unnamed namespace
  1228. NS_IMPL_ISUPPORTS(PrefObserver, nsIObserver)
  1229. NS_IMETHODIMP
  1230. PrefObserver::Observe(nsISupports* aSubject, const char* aTopic,
  1231. const char16_t* someData)
  1232. {
  1233. if (nsCRT::strcmp(aTopic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID) == 0) {
  1234. NS_ConvertUTF16toUTF8 prefName(someData);
  1235. if (prefName.EqualsLiteral("security.ssl.treat_unsafe_negotiation_as_broken")) {
  1236. bool enabled;
  1237. Preferences::GetBool("security.ssl.treat_unsafe_negotiation_as_broken", &enabled);
  1238. mOwner->setTreatUnsafeNegotiationAsBroken(enabled);
  1239. } else if (prefName.EqualsLiteral("security.ssl.false_start.require-npn")) {
  1240. mOwner->mFalseStartRequireNPN =
  1241. Preferences::GetBool("security.ssl.false_start.require-npn",
  1242. FALSE_START_REQUIRE_NPN_DEFAULT);
  1243. } else if (prefName.EqualsLiteral("security.tls.version.fallback-limit")) {
  1244. mOwner->loadVersionFallbackLimit();
  1245. } else if (prefName.EqualsLiteral("security.tls.insecure_fallback_hosts")) {
  1246. // Changes to the whitelist on the public side will update the pref.
  1247. // Don't propagate the changes to the private side.
  1248. if (mOwner->isPublic()) {
  1249. mOwner->initInsecureFallbackSites();
  1250. }
  1251. } else if (prefName.EqualsLiteral("security.tls.unrestricted_rc4_fallback")) {
  1252. mOwner->mUnrestrictedRC4Fallback =
  1253. Preferences::GetBool("security.tls.unrestricted_rc4_fallback", false);
  1254. }
  1255. }
  1256. return NS_OK;
  1257. }
  1258. static int32_t
  1259. PlaintextRecv(PRFileDesc* fd, void* buf, int32_t amount, int flags,
  1260. PRIntervalTime timeout)
  1261. {
  1262. // The shutdownlocker is not needed here because it will already be
  1263. // held higher in the stack
  1264. nsNSSSocketInfo* socketInfo = nullptr;
  1265. int32_t bytesRead = fd->lower->methods->recv(fd->lower, buf, amount, flags,
  1266. timeout);
  1267. if (fd->identity == nsSSLIOLayerHelpers::nsSSLPlaintextLayerIdentity)
  1268. socketInfo = (nsNSSSocketInfo*) fd->secret;
  1269. if ((bytesRead > 0) && socketInfo)
  1270. socketInfo->AddPlaintextBytesRead(bytesRead);
  1271. return bytesRead;
  1272. }
  1273. nsSSLIOLayerHelpers::~nsSSLIOLayerHelpers()
  1274. {
  1275. // mPrefObserver will only be set if this->Init was called. The GTest tests
  1276. // do not call Init.
  1277. if (mPrefObserver) {
  1278. Preferences::RemoveObserver(mPrefObserver,
  1279. "security.ssl.treat_unsafe_negotiation_as_broken");
  1280. Preferences::RemoveObserver(mPrefObserver,
  1281. "security.ssl.false_start.require-npn");
  1282. Preferences::RemoveObserver(mPrefObserver,
  1283. "security.tls.version.fallback-limit");
  1284. Preferences::RemoveObserver(mPrefObserver,
  1285. "security.tls.insecure_fallback_hosts");
  1286. Preferences::RemoveObserver(mPrefObserver,
  1287. "security.tls.unrestricted_rc4_fallback");
  1288. }
  1289. }
  1290. nsresult
  1291. nsSSLIOLayerHelpers::Init()
  1292. {
  1293. if (!nsSSLIOLayerInitialized) {
  1294. nsSSLIOLayerInitialized = true;
  1295. nsSSLIOLayerIdentity = PR_GetUniqueIdentity("NSS layer");
  1296. nsSSLIOLayerMethods = *PR_GetDefaultIOMethods();
  1297. nsSSLIOLayerMethods.available = (PRAvailableFN) PSMAvailable;
  1298. nsSSLIOLayerMethods.available64 = (PRAvailable64FN) PSMAvailable64;
  1299. nsSSLIOLayerMethods.fsync = (PRFsyncFN) _PSM_InvalidStatus;
  1300. nsSSLIOLayerMethods.seek = (PRSeekFN) _PSM_InvalidInt;
  1301. nsSSLIOLayerMethods.seek64 = (PRSeek64FN) _PSM_InvalidInt64;
  1302. nsSSLIOLayerMethods.fileInfo = (PRFileInfoFN) _PSM_InvalidStatus;
  1303. nsSSLIOLayerMethods.fileInfo64 = (PRFileInfo64FN) _PSM_InvalidStatus;
  1304. nsSSLIOLayerMethods.writev = (PRWritevFN) _PSM_InvalidInt;
  1305. nsSSLIOLayerMethods.accept = (PRAcceptFN) _PSM_InvalidDesc;
  1306. nsSSLIOLayerMethods.listen = (PRListenFN) _PSM_InvalidStatus;
  1307. nsSSLIOLayerMethods.shutdown = (PRShutdownFN) _PSM_InvalidStatus;
  1308. nsSSLIOLayerMethods.recvfrom = (PRRecvfromFN) _PSM_InvalidInt;
  1309. nsSSLIOLayerMethods.sendto = (PRSendtoFN) _PSM_InvalidInt;
  1310. nsSSLIOLayerMethods.acceptread = (PRAcceptreadFN) _PSM_InvalidInt;
  1311. nsSSLIOLayerMethods.transmitfile = (PRTransmitfileFN) _PSM_InvalidInt;
  1312. nsSSLIOLayerMethods.sendfile = (PRSendfileFN) _PSM_InvalidInt;
  1313. nsSSLIOLayerMethods.getsockname = PSMGetsockname;
  1314. nsSSLIOLayerMethods.getpeername = PSMGetpeername;
  1315. nsSSLIOLayerMethods.getsocketoption = PSMGetsocketoption;
  1316. nsSSLIOLayerMethods.setsocketoption = PSMSetsocketoption;
  1317. nsSSLIOLayerMethods.recv = PSMRecv;
  1318. nsSSLIOLayerMethods.send = PSMSend;
  1319. nsSSLIOLayerMethods.connectcontinue = PSMConnectcontinue;
  1320. nsSSLIOLayerMethods.bind = PSMBind;
  1321. nsSSLIOLayerMethods.connect = nsSSLIOLayerConnect;
  1322. nsSSLIOLayerMethods.close = nsSSLIOLayerClose;
  1323. nsSSLIOLayerMethods.write = nsSSLIOLayerWrite;
  1324. nsSSLIOLayerMethods.read = nsSSLIOLayerRead;
  1325. nsSSLIOLayerMethods.poll = nsSSLIOLayerPoll;
  1326. nsSSLPlaintextLayerIdentity = PR_GetUniqueIdentity("Plaintxext PSM layer");
  1327. nsSSLPlaintextLayerMethods = *PR_GetDefaultIOMethods();
  1328. nsSSLPlaintextLayerMethods.recv = PlaintextRecv;
  1329. }
  1330. bool enabled = false;
  1331. Preferences::GetBool("security.ssl.treat_unsafe_negotiation_as_broken", &enabled);
  1332. setTreatUnsafeNegotiationAsBroken(enabled);
  1333. mFalseStartRequireNPN =
  1334. Preferences::GetBool("security.ssl.false_start.require-npn",
  1335. FALSE_START_REQUIRE_NPN_DEFAULT);
  1336. loadVersionFallbackLimit();
  1337. initInsecureFallbackSites();
  1338. mUnrestrictedRC4Fallback =
  1339. Preferences::GetBool("security.tls.unrestricted_rc4_fallback", false);
  1340. mPrefObserver = new PrefObserver(this);
  1341. Preferences::AddStrongObserver(mPrefObserver,
  1342. "security.ssl.treat_unsafe_negotiation_as_broken");
  1343. Preferences::AddStrongObserver(mPrefObserver,
  1344. "security.ssl.false_start.require-npn");
  1345. Preferences::AddStrongObserver(mPrefObserver,
  1346. "security.tls.version.fallback-limit");
  1347. Preferences::AddStrongObserver(mPrefObserver,
  1348. "security.tls.insecure_fallback_hosts");
  1349. Preferences::AddStrongObserver(mPrefObserver,
  1350. "security.tls.unrestricted_rc4_fallback");
  1351. return NS_OK;
  1352. }
  1353. void
  1354. nsSSLIOLayerHelpers::loadVersionFallbackLimit()
  1355. {
  1356. // see nsNSSComponent::setEnabledTLSVersions for pref handling rules
  1357. uint32_t limit = Preferences::GetUint("security.tls.version.fallback-limit",
  1358. 3); // 3 = TLS 1.2
  1359. SSLVersionRange defaults = { SSL_LIBRARY_VERSION_TLS_1_2,
  1360. SSL_LIBRARY_VERSION_TLS_1_2 };
  1361. SSLVersionRange filledInRange;
  1362. nsNSSComponent::FillTLSVersionRange(filledInRange, limit, limit, defaults);
  1363. if (filledInRange.max < SSL_LIBRARY_VERSION_TLS_1_2) {
  1364. filledInRange.max = SSL_LIBRARY_VERSION_TLS_1_2;
  1365. }
  1366. mVersionFallbackLimit = filledInRange.max;
  1367. }
  1368. void
  1369. nsSSLIOLayerHelpers::clearStoredData()
  1370. {
  1371. MutexAutoLock lock(mutex);
  1372. mInsecureFallbackSites.Clear();
  1373. mTLSIntoleranceInfo.Clear();
  1374. }
  1375. void
  1376. nsSSLIOLayerHelpers::setInsecureFallbackSites(const nsCString& str)
  1377. {
  1378. MutexAutoLock lock(mutex);
  1379. mInsecureFallbackSites.Clear();
  1380. if (str.IsEmpty()) {
  1381. return;
  1382. }
  1383. nsCCharSeparatedTokenizer toker(str, ',');
  1384. while (toker.hasMoreTokens()) {
  1385. const nsCSubstring& host = toker.nextToken();
  1386. if (!host.IsEmpty()) {
  1387. mInsecureFallbackSites.PutEntry(host);
  1388. }
  1389. }
  1390. }
  1391. void
  1392. nsSSLIOLayerHelpers::initInsecureFallbackSites()
  1393. {
  1394. MOZ_ASSERT(NS_IsMainThread());
  1395. nsCString insecureFallbackHosts;
  1396. Preferences::GetCString("security.tls.insecure_fallback_hosts",
  1397. &insecureFallbackHosts);
  1398. setInsecureFallbackSites(insecureFallbackHosts);
  1399. }
  1400. bool
  1401. nsSSLIOLayerHelpers::isPublic() const
  1402. {
  1403. return this == &PublicSSLState()->IOLayerHelpers();
  1404. }
  1405. void
  1406. nsSSLIOLayerHelpers::addInsecureFallbackSite(const nsCString& hostname,
  1407. bool temporary)
  1408. {
  1409. MOZ_ASSERT(NS_IsMainThread());
  1410. {
  1411. MutexAutoLock lock(mutex);
  1412. if (mInsecureFallbackSites.Contains(hostname)) {
  1413. return;
  1414. }
  1415. mInsecureFallbackSites.PutEntry(hostname);
  1416. }
  1417. if (!isPublic() || temporary) {
  1418. return;
  1419. }
  1420. nsCString value;
  1421. Preferences::GetCString("security.tls.insecure_fallback_hosts", &value);
  1422. if (!value.IsEmpty()) {
  1423. value.Append(',');
  1424. }
  1425. value.Append(hostname);
  1426. Preferences::SetCString("security.tls.insecure_fallback_hosts", value);
  1427. }
  1428. class FallbackPrefRemover final : public Runnable
  1429. {
  1430. public:
  1431. explicit FallbackPrefRemover(const nsACString& aHost)
  1432. : mHost(aHost)
  1433. {}
  1434. NS_IMETHOD Run() override;
  1435. private:
  1436. nsCString mHost;
  1437. };
  1438. NS_IMETHODIMP
  1439. FallbackPrefRemover::Run()
  1440. {
  1441. MOZ_ASSERT(NS_IsMainThread());
  1442. nsCString oldValue;
  1443. Preferences::GetCString("security.tls.insecure_fallback_hosts", &oldValue);
  1444. nsCCharSeparatedTokenizer toker(oldValue, ',');
  1445. nsCString newValue;
  1446. while (toker.hasMoreTokens()) {
  1447. const nsCSubstring& host = toker.nextToken();
  1448. if (host.Equals(mHost)) {
  1449. continue;
  1450. }
  1451. if (!newValue.IsEmpty()) {
  1452. newValue.Append(',');
  1453. }
  1454. newValue.Append(host);
  1455. }
  1456. Preferences::SetCString("security.tls.insecure_fallback_hosts", newValue);
  1457. return NS_OK;
  1458. }
  1459. void
  1460. nsSSLIOLayerHelpers::removeInsecureFallbackSite(const nsACString& hostname,
  1461. uint16_t port)
  1462. {
  1463. forgetIntolerance(hostname, port);
  1464. {
  1465. MutexAutoLock lock(mutex);
  1466. if (!mInsecureFallbackSites.Contains(hostname)) {
  1467. return;
  1468. }
  1469. mInsecureFallbackSites.RemoveEntry(hostname);
  1470. }
  1471. if (!isPublic()) {
  1472. return;
  1473. }
  1474. RefPtr<Runnable> runnable = new FallbackPrefRemover(hostname);
  1475. if (NS_IsMainThread()) {
  1476. runnable->Run();
  1477. } else {
  1478. NS_DispatchToMainThread(runnable);
  1479. }
  1480. }
  1481. bool
  1482. nsSSLIOLayerHelpers::isInsecureFallbackSite(const nsACString& hostname)
  1483. {
  1484. MutexAutoLock lock(mutex);
  1485. return mInsecureFallbackSites.Contains(hostname);
  1486. }
  1487. void
  1488. nsSSLIOLayerHelpers::setTreatUnsafeNegotiationAsBroken(bool broken)
  1489. {
  1490. MutexAutoLock lock(mutex);
  1491. mTreatUnsafeNegotiationAsBroken = broken;
  1492. }
  1493. bool
  1494. nsSSLIOLayerHelpers::treatUnsafeNegotiationAsBroken()
  1495. {
  1496. MutexAutoLock lock(mutex);
  1497. return mTreatUnsafeNegotiationAsBroken;
  1498. }
  1499. nsresult
  1500. nsSSLIOLayerNewSocket(int32_t family,
  1501. const char* host,
  1502. int32_t port,
  1503. nsIProxyInfo *proxy,
  1504. const NeckoOriginAttributes& originAttributes,
  1505. PRFileDesc** fd,
  1506. nsISupports** info,
  1507. bool forSTARTTLS,
  1508. uint32_t flags)
  1509. {
  1510. PRFileDesc* sock = PR_OpenTCPSocket(family);
  1511. if (!sock) return NS_ERROR_OUT_OF_MEMORY;
  1512. nsresult rv = nsSSLIOLayerAddToSocket(family, host, port, proxy,
  1513. originAttributes, sock, info,
  1514. forSTARTTLS, flags);
  1515. if (NS_FAILED(rv)) {
  1516. PR_Close(sock);
  1517. return rv;
  1518. }
  1519. *fd = sock;
  1520. return NS_OK;
  1521. }
  1522. // Creates CA names strings from (CERTDistNames* caNames)
  1523. //
  1524. // - arena: arena to allocate strings on
  1525. // - caNameStrings: filled with CA names strings on return
  1526. // - caNames: CERTDistNames to extract strings from
  1527. // - return: SECSuccess if successful; error code otherwise
  1528. //
  1529. // Note: copied in its entirety from Nova code
  1530. static SECStatus
  1531. nsConvertCANamesToStrings(const UniquePLArenaPool& arena, char** caNameStrings,
  1532. CERTDistNames* caNames)
  1533. {
  1534. MOZ_ASSERT(arena.get());
  1535. MOZ_ASSERT(caNameStrings);
  1536. MOZ_ASSERT(caNames);
  1537. if (!arena.get() || !caNameStrings || !caNames) {
  1538. PR_SetError(SEC_ERROR_INVALID_ARGS, 0);
  1539. return SECFailure;
  1540. }
  1541. SECItem* dername;
  1542. int n;
  1543. char* namestring;
  1544. for (n = 0; n < caNames->nnames; n++) {
  1545. dername = &caNames->names[n];
  1546. namestring = CERT_DerNameToAscii(dername);
  1547. if (!namestring) {
  1548. // XXX - keep going until we fail to convert the name
  1549. caNameStrings[n] = const_cast<char*>("");
  1550. } else {
  1551. caNameStrings[n] = PORT_ArenaStrdup(arena.get(), namestring);
  1552. PR_Free(namestring);
  1553. if (!caNameStrings[n]) {
  1554. return SECFailure;
  1555. }
  1556. }
  1557. }
  1558. return SECSuccess;
  1559. }
  1560. // Possible behaviors for choosing a cert for client auth.
  1561. enum class UserCertChoice {
  1562. // Ask the user to choose a cert.
  1563. Ask = 0,
  1564. // Automatically choose a cert.
  1565. Auto = 1,
  1566. };
  1567. // Returns the most appropriate user cert choice based on the value of the
  1568. // security.default_personal_cert preference.
  1569. UserCertChoice
  1570. nsGetUserCertChoice()
  1571. {
  1572. nsAutoCString value;
  1573. nsresult rv = Preferences::GetCString("security.default_personal_cert", &value);
  1574. if (NS_FAILED(rv)) {
  1575. return UserCertChoice::Ask;
  1576. }
  1577. // There are three cases for what the preference could be set to:
  1578. // 1. "Select Automatically" -> Auto.
  1579. // 2. "Ask Every Time" -> Ask.
  1580. // 3. Something else -> Ask. This might be a nickname from a migrated cert,
  1581. // but we no longer support this case.
  1582. return value.EqualsLiteral("Select Automatically") ? UserCertChoice::Auto
  1583. : UserCertChoice::Ask;
  1584. }
  1585. static bool
  1586. hasExplicitKeyUsageNonRepudiation(CERTCertificate* cert)
  1587. {
  1588. // There is no extension, v1 or v2 certificate
  1589. if (!cert->extensions)
  1590. return false;
  1591. SECStatus srv;
  1592. SECItem keyUsageItem;
  1593. keyUsageItem.data = nullptr;
  1594. srv = CERT_FindKeyUsageExtension(cert, &keyUsageItem);
  1595. if (srv == SECFailure)
  1596. return false;
  1597. unsigned char keyUsage = keyUsageItem.data[0];
  1598. PORT_Free (keyUsageItem.data);
  1599. return !!(keyUsage & KU_NON_REPUDIATION);
  1600. }
  1601. class ClientAuthDataRunnable : public SyncRunnableBase
  1602. {
  1603. public:
  1604. ClientAuthDataRunnable(CERTDistNames* caNames,
  1605. CERTCertificate** pRetCert,
  1606. SECKEYPrivateKey** pRetKey,
  1607. nsNSSSocketInfo* info,
  1608. const UniqueCERTCertificate& serverCert)
  1609. : mRV(SECFailure)
  1610. , mErrorCodeToReport(SEC_ERROR_NO_MEMORY)
  1611. , mPRetCert(pRetCert)
  1612. , mPRetKey(pRetKey)
  1613. , mCANames(caNames)
  1614. , mSocketInfo(info)
  1615. , mServerCert(serverCert.get())
  1616. {
  1617. }
  1618. SECStatus mRV; // out
  1619. PRErrorCode mErrorCodeToReport; // out
  1620. CERTCertificate** const mPRetCert; // in/out
  1621. SECKEYPrivateKey** const mPRetKey; // in/out
  1622. protected:
  1623. virtual void RunOnTargetThread();
  1624. private:
  1625. CERTDistNames* const mCANames; // in
  1626. nsNSSSocketInfo* const mSocketInfo; // in
  1627. CERTCertificate* const mServerCert; // in
  1628. };
  1629. // This callback function is used to pull client certificate
  1630. // information upon server request
  1631. //
  1632. // - arg: SSL data connection
  1633. // - socket: SSL socket we're dealing with
  1634. // - caNames: list of CA names
  1635. // - pRetCert: returns a pointer to a pointer to a valid certificate if
  1636. // successful; otherwise nullptr
  1637. // - pRetKey: returns a pointer to a pointer to the corresponding key if
  1638. // successful; otherwise nullptr
  1639. SECStatus
  1640. nsNSS_SSLGetClientAuthData(void* arg, PRFileDesc* socket,
  1641. CERTDistNames* caNames, CERTCertificate** pRetCert,
  1642. SECKEYPrivateKey** pRetKey)
  1643. {
  1644. nsNSSShutDownPreventionLock locker;
  1645. if (!socket || !caNames || !pRetCert || !pRetKey) {
  1646. PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
  1647. return SECFailure;
  1648. }
  1649. RefPtr<nsNSSSocketInfo> info(
  1650. BitwiseCast<nsNSSSocketInfo*, PRFilePrivate*>(socket->higher->secret));
  1651. UniqueCERTCertificate serverCert(SSL_PeerCertificate(socket));
  1652. if (!serverCert) {
  1653. NS_NOTREACHED("Missing server certificate should have been detected during "
  1654. "server cert authentication.");
  1655. PR_SetError(SSL_ERROR_NO_CERTIFICATE, 0);
  1656. return SECFailure;
  1657. }
  1658. if (info->GetJoined()) {
  1659. // We refuse to send a client certificate when there are multiple hostnames
  1660. // joined on this connection, because we only show the user one hostname
  1661. // (mHostName) in the client certificate UI.
  1662. MOZ_LOG(gPIPNSSLog, LogLevel::Debug,
  1663. ("[%p] Not returning client cert due to previous join\n", socket));
  1664. *pRetCert = nullptr;
  1665. *pRetKey = nullptr;
  1666. return SECSuccess;
  1667. }
  1668. // XXX: This should be done asynchronously; see bug 696976
  1669. RefPtr<ClientAuthDataRunnable> runnable(
  1670. new ClientAuthDataRunnable(caNames, pRetCert, pRetKey, info, serverCert));
  1671. nsresult rv = runnable->DispatchToMainThreadAndWait();
  1672. if (NS_FAILED(rv)) {
  1673. PR_SetError(SEC_ERROR_NO_MEMORY, 0);
  1674. return SECFailure;
  1675. }
  1676. if (runnable->mRV != SECSuccess) {
  1677. PR_SetError(runnable->mErrorCodeToReport, 0);
  1678. } else if (*runnable->mPRetCert || *runnable->mPRetKey) {
  1679. // Make joinConnection prohibit joining after we've sent a client cert
  1680. info->SetSentClientCert();
  1681. }
  1682. return runnable->mRV;
  1683. }
  1684. void
  1685. ClientAuthDataRunnable::RunOnTargetThread()
  1686. {
  1687. // We check the value of a pref in this runnable, so this runnable should only
  1688. // be run on the main thread.
  1689. MOZ_ASSERT(NS_IsMainThread());
  1690. UniquePLArenaPool arena;
  1691. char** caNameStrings;
  1692. UniqueCERTCertificate cert;
  1693. UniqueSECKEYPrivateKey privKey;
  1694. void* wincx = mSocketInfo;
  1695. nsresult rv;
  1696. nsCOMPtr<nsIX509Cert> socketClientCert;
  1697. mSocketInfo->GetClientCert(getter_AddRefs(socketClientCert));
  1698. // If a client cert preference was set on the socket info, use that and skip
  1699. // the client cert UI and/or search of the user's past cert decisions.
  1700. if (socketClientCert) {
  1701. cert.reset(socketClientCert->GetCert());
  1702. if (!cert) {
  1703. goto loser;
  1704. }
  1705. // Get the private key
  1706. privKey.reset(PK11_FindKeyByAnyCert(cert.get(), wincx));
  1707. if (!privKey) {
  1708. goto loser;
  1709. }
  1710. *mPRetCert = cert.release();
  1711. *mPRetKey = privKey.release();
  1712. mRV = SECSuccess;
  1713. return;
  1714. }
  1715. // create caNameStrings
  1716. arena.reset(PORT_NewArena(DER_DEFAULT_CHUNKSIZE));
  1717. if (!arena) {
  1718. goto loser;
  1719. }
  1720. caNameStrings = static_cast<char**>(
  1721. PORT_ArenaAlloc(arena.get(), sizeof(char*) * mCANames->nnames));
  1722. if (!caNameStrings) {
  1723. goto loser;
  1724. }
  1725. mRV = nsConvertCANamesToStrings(arena, caNameStrings, mCANames);
  1726. if (mRV != SECSuccess) {
  1727. goto loser;
  1728. }
  1729. // find valid user cert and key pair
  1730. if (nsGetUserCertChoice() == UserCertChoice::Auto) {
  1731. // automatically find the right cert
  1732. // find all user certs that are valid and for SSL
  1733. UniqueCERTCertList certList(
  1734. CERT_FindUserCertsByUsage(CERT_GetDefaultCertDB(), certUsageSSLClient,
  1735. false, true, wincx));
  1736. if (!certList) {
  1737. goto loser;
  1738. }
  1739. // filter the list to those issued by CAs supported by the server
  1740. mRV = CERT_FilterCertListByCANames(certList.get(), mCANames->nnames,
  1741. caNameStrings, certUsageSSLClient);
  1742. if (mRV != SECSuccess) {
  1743. goto loser;
  1744. }
  1745. // make sure the list is not empty
  1746. if (CERT_LIST_END(CERT_LIST_HEAD(certList), certList)) {
  1747. goto loser;
  1748. }
  1749. UniqueCERTCertificate lowPrioNonrepCert;
  1750. // loop through the list until we find a cert with a key
  1751. for (CERTCertListNode* node = CERT_LIST_HEAD(certList);
  1752. !CERT_LIST_END(node, certList);
  1753. node = CERT_LIST_NEXT(node)) {
  1754. // if the certificate has restriction and we do not satisfy it we do not
  1755. // use it
  1756. privKey.reset(PK11_FindKeyByAnyCert(node->cert, wincx));
  1757. if (privKey) {
  1758. if (hasExplicitKeyUsageNonRepudiation(node->cert)) {
  1759. privKey = nullptr;
  1760. // Not a preferred cert
  1761. if (!lowPrioNonrepCert) { // did not yet find a low prio cert
  1762. lowPrioNonrepCert.reset(CERT_DupCertificate(node->cert));
  1763. }
  1764. } else {
  1765. // this is a good cert to present
  1766. cert.reset(CERT_DupCertificate(node->cert));
  1767. break;
  1768. }
  1769. }
  1770. if (PR_GetError() == SEC_ERROR_BAD_PASSWORD) {
  1771. // problem with password: bail
  1772. goto loser;
  1773. }
  1774. }
  1775. if (!cert && lowPrioNonrepCert) {
  1776. cert = Move(lowPrioNonrepCert);
  1777. privKey.reset(PK11_FindKeyByAnyCert(cert.get(), wincx));
  1778. }
  1779. if (!cert) {
  1780. goto loser;
  1781. }
  1782. } else { // Not Auto => ask
  1783. // Get the SSL Certificate
  1784. nsXPIDLCString hostname;
  1785. mSocketInfo->GetHostName(getter_Copies(hostname));
  1786. RefPtr<nsClientAuthRememberService> cars =
  1787. mSocketInfo->SharedState().GetClientAuthRememberService();
  1788. bool hasRemembered = false;
  1789. nsCString rememberedDBKey;
  1790. if (cars) {
  1791. bool found;
  1792. rv = cars->HasRememberedDecision(hostname,
  1793. mSocketInfo->GetOriginAttributes(),
  1794. mServerCert, rememberedDBKey, &found);
  1795. if (NS_SUCCEEDED(rv) && found) {
  1796. hasRemembered = true;
  1797. }
  1798. }
  1799. if (hasRemembered && !rememberedDBKey.IsEmpty()) {
  1800. nsCOMPtr<nsIX509CertDB> certdb = do_GetService(NS_X509CERTDB_CONTRACTID);
  1801. if (certdb) {
  1802. nsCOMPtr<nsIX509Cert> foundCert;
  1803. rv = certdb->FindCertByDBKey(rememberedDBKey.get(),
  1804. getter_AddRefs(foundCert));
  1805. if (NS_SUCCEEDED(rv) && foundCert) {
  1806. nsNSSCertificate* objCert =
  1807. BitwiseCast<nsNSSCertificate*, nsIX509Cert*>(foundCert.get());
  1808. if (objCert) {
  1809. cert.reset(objCert->GetCert());
  1810. }
  1811. }
  1812. if (!cert) {
  1813. hasRemembered = false;
  1814. }
  1815. }
  1816. }
  1817. if (!hasRemembered) {
  1818. // user selects a cert to present
  1819. nsCOMPtr<nsIClientAuthDialogs> dialogs;
  1820. // find all user certs that are for SSL
  1821. // note that we are allowing expired certs in this list
  1822. UniqueCERTCertList certList(
  1823. CERT_FindUserCertsByUsage(CERT_GetDefaultCertDB(), certUsageSSLClient,
  1824. false, false, wincx));
  1825. if (!certList) {
  1826. goto loser;
  1827. }
  1828. if (mCANames->nnames != 0) {
  1829. // filter the list to those issued by CAs supported by the server
  1830. mRV = CERT_FilterCertListByCANames(certList.get(),
  1831. mCANames->nnames,
  1832. caNameStrings,
  1833. certUsageSSLClient);
  1834. if (mRV != SECSuccess) {
  1835. goto loser;
  1836. }
  1837. }
  1838. if (CERT_LIST_END(CERT_LIST_HEAD(certList), certList)) {
  1839. // list is empty - no matching certs
  1840. goto loser;
  1841. }
  1842. int32_t port;
  1843. mSocketInfo->GetPort(&port);
  1844. UniquePORTString corg(CERT_GetOrgName(&mServerCert->subject));
  1845. nsAutoCString org(corg.get());
  1846. UniquePORTString cissuer(CERT_GetOrgName(&mServerCert->issuer));
  1847. nsAutoCString issuer(cissuer.get());
  1848. nsCOMPtr<nsIMutableArray> certArray = nsArrayBase::Create();
  1849. if (!certArray) {
  1850. goto loser;
  1851. }
  1852. for (CERTCertListNode* node = CERT_LIST_HEAD(certList);
  1853. !CERT_LIST_END(node, certList);
  1854. node = CERT_LIST_NEXT(node)) {
  1855. nsCOMPtr<nsIX509Cert> tempCert = nsNSSCertificate::Create(node->cert);
  1856. if (!tempCert) {
  1857. goto loser;
  1858. }
  1859. rv = certArray->AppendElement(tempCert, false);
  1860. if (NS_FAILED(rv)) {
  1861. goto loser;
  1862. }
  1863. }
  1864. // Throw up the client auth dialog and get back the index of the selected cert
  1865. rv = getNSSDialogs(getter_AddRefs(dialogs),
  1866. NS_GET_IID(nsIClientAuthDialogs),
  1867. NS_CLIENTAUTHDIALOGS_CONTRACTID);
  1868. if (NS_FAILED(rv)) {
  1869. goto loser;
  1870. }
  1871. uint32_t selectedIndex = 0;
  1872. bool certChosen = false;
  1873. rv = dialogs->ChooseCertificate(mSocketInfo, hostname, port, org, issuer,
  1874. certArray, &selectedIndex, &certChosen);
  1875. if (NS_FAILED(rv)) {
  1876. goto loser;
  1877. }
  1878. // even if the user has canceled, we want to remember that, to avoid repeating prompts
  1879. bool wantRemember = false;
  1880. mSocketInfo->GetRememberClientAuthCertificate(&wantRemember);
  1881. if (certChosen) {
  1882. nsCOMPtr<nsIX509Cert> selectedCert = do_QueryElementAt(certArray,
  1883. selectedIndex);
  1884. if (!selectedCert) {
  1885. goto loser;
  1886. }
  1887. cert.reset(selectedCert->GetCert());
  1888. }
  1889. if (cars && wantRemember) {
  1890. cars->RememberDecision(hostname, mSocketInfo->GetOriginAttributes(),
  1891. mServerCert, certChosen ? cert.get() : nullptr);
  1892. }
  1893. }
  1894. if (!cert) {
  1895. goto loser;
  1896. }
  1897. // go get the private key
  1898. privKey.reset(PK11_FindKeyByAnyCert(cert.get(), wincx));
  1899. if (!privKey) {
  1900. goto loser;
  1901. }
  1902. }
  1903. goto done;
  1904. loser:
  1905. if (mRV == SECSuccess) {
  1906. mRV = SECFailure;
  1907. }
  1908. done:
  1909. int error = PR_GetError();
  1910. *mPRetCert = cert.release();
  1911. *mPRetKey = privKey.release();
  1912. if (mRV == SECFailure) {
  1913. mErrorCodeToReport = error;
  1914. }
  1915. }
  1916. static PRFileDesc*
  1917. nsSSLIOLayerImportFD(PRFileDesc* fd,
  1918. nsNSSSocketInfo* infoObject,
  1919. const char* host)
  1920. {
  1921. nsNSSShutDownPreventionLock locker;
  1922. PRFileDesc* sslSock = SSL_ImportFD(nullptr, fd);
  1923. if (!sslSock) {
  1924. NS_ASSERTION(false, "NSS: Error importing socket");
  1925. return nullptr;
  1926. }
  1927. SSL_SetPKCS11PinArg(sslSock, (nsIInterfaceRequestor*) infoObject);
  1928. SSL_HandshakeCallback(sslSock, HandshakeCallback, infoObject);
  1929. SSL_SetCanFalseStartCallback(sslSock, CanFalseStartCallback, infoObject);
  1930. // Disable this hook if we connect anonymously. See bug 466080.
  1931. uint32_t flags = 0;
  1932. infoObject->GetProviderFlags(&flags);
  1933. if (flags & nsISocketProvider::ANONYMOUS_CONNECT) {
  1934. SSL_GetClientAuthDataHook(sslSock, nullptr, infoObject);
  1935. } else {
  1936. SSL_GetClientAuthDataHook(sslSock,
  1937. (SSLGetClientAuthData) nsNSS_SSLGetClientAuthData,
  1938. infoObject);
  1939. }
  1940. if (flags & nsISocketProvider::MITM_OK) {
  1941. MOZ_LOG(gPIPNSSLog, LogLevel::Debug,
  1942. ("[%p] nsSSLIOLayerImportFD: bypass authentication flag\n", fd));
  1943. infoObject->SetBypassAuthentication(true);
  1944. }
  1945. if (SECSuccess != SSL_AuthCertificateHook(sslSock, AuthCertificateHook,
  1946. infoObject)) {
  1947. NS_NOTREACHED("failed to configure AuthCertificateHook");
  1948. goto loser;
  1949. }
  1950. if (SECSuccess != SSL_SetURL(sslSock, host)) {
  1951. NS_NOTREACHED("SSL_SetURL failed");
  1952. goto loser;
  1953. }
  1954. return sslSock;
  1955. loser:
  1956. if (sslSock) {
  1957. PR_Close(sslSock);
  1958. }
  1959. return nullptr;
  1960. }
  1961. // Please change getSignatureName in nsNSSCallbacks.cpp when changing the list
  1962. // here.
  1963. static const SSLSignatureScheme sEnabledSignatureSchemes[] = {
  1964. ssl_sig_ecdsa_secp256r1_sha256,
  1965. ssl_sig_ecdsa_secp384r1_sha384,
  1966. ssl_sig_ecdsa_secp521r1_sha512,
  1967. ssl_sig_rsa_pss_sha256,
  1968. ssl_sig_rsa_pss_sha384,
  1969. ssl_sig_rsa_pss_sha512,
  1970. ssl_sig_rsa_pkcs1_sha256,
  1971. ssl_sig_rsa_pkcs1_sha384,
  1972. ssl_sig_rsa_pkcs1_sha512,
  1973. ssl_sig_ecdsa_sha1,
  1974. ssl_sig_rsa_pkcs1_sha1,
  1975. };
  1976. static nsresult
  1977. nsSSLIOLayerSetOptions(PRFileDesc* fd, bool forSTARTTLS,
  1978. bool haveProxy, const char* host, int32_t port,
  1979. nsNSSSocketInfo* infoObject)
  1980. {
  1981. nsNSSShutDownPreventionLock locker;
  1982. if (forSTARTTLS || haveProxy) {
  1983. if (SECSuccess != SSL_OptionSet(fd, SSL_SECURITY, false)) {
  1984. return NS_ERROR_FAILURE;
  1985. }
  1986. }
  1987. SSLVersionRange range;
  1988. if (SSL_VersionRangeGet(fd, &range) != SECSuccess) {
  1989. return NS_ERROR_FAILURE;
  1990. }
  1991. if ((infoObject->GetProviderFlags() & nsISocketProvider::BE_CONSERVATIVE) &&
  1992. (range.max > SSL_LIBRARY_VERSION_TLS_1_2)) {
  1993. MOZ_LOG(gPIPNSSLog, LogLevel::Debug,
  1994. ("[%p] nsSSLIOLayerSetOptions: range.max limited to 1.2 due to BE_CONSERVATIVE flag\n",
  1995. fd));
  1996. range.max = SSL_LIBRARY_VERSION_TLS_1_2;
  1997. }
  1998. uint16_t maxEnabledVersion = range.max;
  1999. StrongCipherStatus strongCiphersStatus = StrongCipherStatusUnknown;
  2000. infoObject->SharedState().IOLayerHelpers()
  2001. .adjustForTLSIntolerance(infoObject->GetHostName(), infoObject->GetPort(),
  2002. range, strongCiphersStatus);
  2003. MOZ_LOG(gPIPNSSLog, LogLevel::Debug,
  2004. ("[%p] nsSSLIOLayerSetOptions: using TLS version range (0x%04x,0x%04x)%s\n",
  2005. fd, static_cast<unsigned int>(range.min),
  2006. static_cast<unsigned int>(range.max),
  2007. strongCiphersStatus == StrongCiphersFailed ? " with weak ciphers" : ""));
  2008. if (SSL_VersionRangeSet(fd, &range) != SECSuccess) {
  2009. return NS_ERROR_FAILURE;
  2010. }
  2011. infoObject->SetTLSVersionRange(range);
  2012. if (strongCiphersStatus == StrongCiphersFailed) {
  2013. nsNSSComponent::UseWeakCiphersOnSocket(fd);
  2014. }
  2015. // when adjustForTLSIntolerance tweaks the maximum version downward,
  2016. // we tell the server using this SCSV so they can detect a downgrade attack
  2017. if (range.max < maxEnabledVersion) {
  2018. MOZ_LOG(gPIPNSSLog, LogLevel::Debug,
  2019. ("[%p] nsSSLIOLayerSetOptions: enabling TLS_FALLBACK_SCSV\n", fd));
  2020. // Some servers will choke if we send the fallback SCSV with TLS 1.2.
  2021. if (range.max < SSL_LIBRARY_VERSION_TLS_1_2) {
  2022. if (SECSuccess != SSL_OptionSet(fd, SSL_ENABLE_FALLBACK_SCSV, true)) {
  2023. return NS_ERROR_FAILURE;
  2024. }
  2025. }
  2026. // tell NSS the max enabled version to make anti-downgrade effective
  2027. if (SECSuccess != SSL_SetDowngradeCheckVersion(fd, maxEnabledVersion)) {
  2028. return NS_ERROR_FAILURE;
  2029. }
  2030. }
  2031. // Include a modest set of named groups.
  2032. // Please change getKeaGroupName in nsNSSCallbacks.cpp when changing the list
  2033. // here.
  2034. const SSLNamedGroup namedGroups[] = {
  2035. ssl_grp_ec_curve25519, ssl_grp_ec_secp256r1, ssl_grp_ec_secp384r1,
  2036. ssl_grp_ec_secp521r1, ssl_grp_ffdhe_2048, ssl_grp_ffdhe_3072
  2037. };
  2038. if (SECSuccess != SSL_NamedGroupConfig(fd, namedGroups,
  2039. mozilla::ArrayLength(namedGroups))) {
  2040. return NS_ERROR_FAILURE;
  2041. }
  2042. // This ensures that we send key shares for X25519 and P-256 in TLS 1.3, so
  2043. // that servers are less likely to use HelloRetryRequest.
  2044. if (SECSuccess != SSL_SendAdditionalKeyShares(fd, 1)) {
  2045. return NS_ERROR_FAILURE;
  2046. }
  2047. if (SECSuccess != SSL_SignatureSchemePrefSet(fd, sEnabledSignatureSchemes,
  2048. mozilla::ArrayLength(sEnabledSignatureSchemes))) {
  2049. return NS_ERROR_FAILURE;
  2050. }
  2051. bool enabled = infoObject->SharedState().IsOCSPStaplingEnabled();
  2052. if (SECSuccess != SSL_OptionSet(fd, SSL_ENABLE_OCSP_STAPLING, enabled)) {
  2053. return NS_ERROR_FAILURE;
  2054. }
  2055. bool sctsEnabled = infoObject->SharedState().IsSignedCertTimestampsEnabled();
  2056. if (SECSuccess != SSL_OptionSet(fd, SSL_ENABLE_SIGNED_CERT_TIMESTAMPS,
  2057. sctsEnabled)) {
  2058. return NS_ERROR_FAILURE;
  2059. }
  2060. if (SECSuccess != SSL_OptionSet(fd, SSL_HANDSHAKE_AS_CLIENT, true)) {
  2061. return NS_ERROR_FAILURE;
  2062. }
  2063. // Set the Peer ID so that SSL proxy connections work properly and to
  2064. // separate anonymous and/or private browsing connections.
  2065. uint32_t flags = infoObject->GetProviderFlags();
  2066. nsAutoCString peerId;
  2067. if (flags & nsISocketProvider::ANONYMOUS_CONNECT) { // See bug 466080
  2068. peerId.AppendLiteral("anon:");
  2069. }
  2070. if (flags & nsISocketProvider::NO_PERMANENT_STORAGE) {
  2071. peerId.AppendLiteral("private:");
  2072. }
  2073. if (flags & nsISocketProvider::MITM_OK) {
  2074. peerId.AppendLiteral("bypassAuth:");
  2075. }
  2076. if (flags & nsISocketProvider::BE_CONSERVATIVE) {
  2077. peerId.AppendLiteral("beConservative:");
  2078. }
  2079. peerId.Append(host);
  2080. peerId.Append(':');
  2081. peerId.AppendInt(port);
  2082. nsAutoCString suffix;
  2083. infoObject->GetOriginAttributes().CreateSuffix(suffix);
  2084. peerId.Append(suffix);
  2085. if (SECSuccess != SSL_SetSockPeerID(fd, peerId.get())) {
  2086. return NS_ERROR_FAILURE;
  2087. }
  2088. return NS_OK;
  2089. }
  2090. nsresult
  2091. nsSSLIOLayerAddToSocket(int32_t family,
  2092. const char* host,
  2093. int32_t port,
  2094. nsIProxyInfo* proxy,
  2095. const NeckoOriginAttributes& originAttributes,
  2096. PRFileDesc* fd,
  2097. nsISupports** info,
  2098. bool forSTARTTLS,
  2099. uint32_t providerFlags)
  2100. {
  2101. nsNSSShutDownPreventionLock locker;
  2102. PRFileDesc* layer = nullptr;
  2103. PRFileDesc* plaintextLayer = nullptr;
  2104. nsresult rv;
  2105. PRStatus stat;
  2106. SharedSSLState* sharedState =
  2107. providerFlags & nsISocketProvider::NO_PERMANENT_STORAGE ? PrivateSSLState() : PublicSSLState();
  2108. nsNSSSocketInfo* infoObject = new nsNSSSocketInfo(*sharedState, providerFlags);
  2109. if (!infoObject) return NS_ERROR_FAILURE;
  2110. NS_ADDREF(infoObject);
  2111. infoObject->SetForSTARTTLS(forSTARTTLS);
  2112. infoObject->SetHostName(host);
  2113. infoObject->SetPort(port);
  2114. infoObject->SetOriginAttributes(originAttributes);
  2115. bool haveProxy = false;
  2116. if (proxy) {
  2117. nsCString proxyHost;
  2118. proxy->GetHost(proxyHost);
  2119. haveProxy = !proxyHost.IsEmpty();
  2120. }
  2121. // A plaintext observer shim is inserted so we can observe some protocol
  2122. // details without modifying nss
  2123. plaintextLayer = PR_CreateIOLayerStub(nsSSLIOLayerHelpers::nsSSLPlaintextLayerIdentity,
  2124. &nsSSLIOLayerHelpers::nsSSLPlaintextLayerMethods);
  2125. if (plaintextLayer) {
  2126. plaintextLayer->secret = (PRFilePrivate*) infoObject;
  2127. stat = PR_PushIOLayer(fd, PR_TOP_IO_LAYER, plaintextLayer);
  2128. if (stat == PR_FAILURE) {
  2129. plaintextLayer->dtor(plaintextLayer);
  2130. plaintextLayer = nullptr;
  2131. }
  2132. }
  2133. PRFileDesc* sslSock = nsSSLIOLayerImportFD(fd, infoObject, host);
  2134. if (!sslSock) {
  2135. NS_ASSERTION(false, "NSS: Error importing socket");
  2136. goto loser;
  2137. }
  2138. infoObject->SetFileDescPtr(sslSock);
  2139. rv = nsSSLIOLayerSetOptions(sslSock, forSTARTTLS, haveProxy, host, port,
  2140. infoObject);
  2141. if (NS_FAILED(rv))
  2142. goto loser;
  2143. // Now, layer ourselves on top of the SSL socket...
  2144. layer = PR_CreateIOLayerStub(nsSSLIOLayerHelpers::nsSSLIOLayerIdentity,
  2145. &nsSSLIOLayerHelpers::nsSSLIOLayerMethods);
  2146. if (!layer)
  2147. goto loser;
  2148. layer->secret = (PRFilePrivate*) infoObject;
  2149. stat = PR_PushIOLayer(sslSock, PR_GetLayersIdentity(sslSock), layer);
  2150. if (stat == PR_FAILURE) {
  2151. goto loser;
  2152. }
  2153. MOZ_LOG(gPIPNSSLog, LogLevel::Debug, ("[%p] Socket set up\n", (void*) sslSock));
  2154. infoObject->QueryInterface(NS_GET_IID(nsISupports), (void**) (info));
  2155. // We are going use a clear connection first //
  2156. if (forSTARTTLS || haveProxy) {
  2157. infoObject->SetHandshakeNotPending();
  2158. }
  2159. infoObject->SharedState().NoteSocketCreated();
  2160. return NS_OK;
  2161. loser:
  2162. NS_IF_RELEASE(infoObject);
  2163. if (layer) {
  2164. layer->dtor(layer);
  2165. }
  2166. if (plaintextLayer) {
  2167. PR_PopIOLayer(fd, nsSSLIOLayerHelpers::nsSSLPlaintextLayerIdentity);
  2168. plaintextLayer->dtor(plaintextLayer);
  2169. }
  2170. return NS_ERROR_FAILURE;
  2171. }