transportlayerdtls.cpp 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262
  1. /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
  2. /* This Source Code Form is subject to the terms of the Mozilla Public
  3. * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  4. * You can obtain one at http://mozilla.org/MPL/2.0/. */
  5. // Original author: ekr@rtfm.com
  6. #include "transportlayerdtls.h"
  7. #include <algorithm>
  8. #include <queue>
  9. #include <sstream>
  10. #include "dtlsidentity.h"
  11. #include "keyhi.h"
  12. #include "logging.h"
  13. #include "mozilla/Move.h"
  14. #include "mozilla/UniquePtr.h"
  15. #include "mozilla/Unused.h"
  16. #include "nsCOMPtr.h"
  17. #include "nsComponentManagerUtils.h"
  18. #include "nsComponentManagerUtils.h"
  19. #include "nsIEventTarget.h"
  20. #include "nsNetCID.h"
  21. #include "nsServiceManagerUtils.h"
  22. #include "ssl.h"
  23. #include "sslerr.h"
  24. #include "sslproto.h"
  25. #include "transportflow.h"
  26. namespace mozilla {
  27. MOZ_MTLOG_MODULE("mtransport")
  28. static PRDescIdentity transport_layer_identity = PR_INVALID_IO_LAYER;
  29. // TODO: Implement a mode for this where
  30. // the channel is not ready until confirmed externally
  31. // (e.g., after cert check).
  32. #define UNIMPLEMENTED \
  33. MOZ_MTLOG(ML_ERROR, \
  34. "Call to unimplemented function "<< __FUNCTION__); \
  35. MOZ_ASSERT(false); \
  36. PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0)
  37. #define MAX_ALPN_LENGTH 255
  38. // We need to adapt the NSPR/libssl model to the TransportFlow model.
  39. // The former wants pull semantics and TransportFlow wants push.
  40. //
  41. // - A TransportLayerDtls assumes it is sitting on top of another
  42. // TransportLayer, which means that events come in asynchronously.
  43. // - NSS (libssl) wants to sit on top of a PRFileDesc and poll.
  44. // - The TransportLayerNSPRAdapter is a PRFileDesc containing a
  45. // FIFO.
  46. // - When TransportLayerDtls.PacketReceived() is called, we insert
  47. // the packets in the FIFO and then do a PR_Recv() on the NSS
  48. // PRFileDesc, which eventually reads off the FIFO.
  49. //
  50. // All of this stuff is assumed to happen solely in a single thread
  51. // (generally the SocketTransportService thread)
  52. struct Packet {
  53. Packet() : data_(nullptr), len_(0) {}
  54. void Assign(const void *data, int32_t len) {
  55. data_.reset(new uint8_t[len]);
  56. memcpy(data_.get(), data, len);
  57. len_ = len;
  58. }
  59. UniquePtr<uint8_t[]> data_;
  60. int32_t len_;
  61. };
  62. void TransportLayerNSPRAdapter::PacketReceived(const void *data, int32_t len) {
  63. if (enabled_) {
  64. input_.push(new Packet());
  65. input_.back()->Assign(data, len);
  66. }
  67. }
  68. int32_t TransportLayerNSPRAdapter::Recv(void *buf, int32_t buflen) {
  69. if (input_.empty()) {
  70. PR_SetError(PR_WOULD_BLOCK_ERROR, 0);
  71. return -1;
  72. }
  73. Packet* front = input_.front();
  74. if (buflen < front->len_) {
  75. MOZ_ASSERT(false, "Not enough buffer space to receive into");
  76. PR_SetError(PR_BUFFER_OVERFLOW_ERROR, 0);
  77. return -1;
  78. }
  79. int32_t count = front->len_;
  80. memcpy(buf, front->data_.get(), count);
  81. input_.pop();
  82. delete front;
  83. return count;
  84. }
  85. int32_t TransportLayerNSPRAdapter::Write(const void *buf, int32_t length) {
  86. if (!enabled_) {
  87. MOZ_MTLOG(ML_WARNING, "Writing to disabled transport layer");
  88. return -1;
  89. }
  90. TransportResult r = output_->SendPacket(
  91. static_cast<const unsigned char *>(buf), length);
  92. if (r >= 0) {
  93. return r;
  94. }
  95. if (r == TE_WOULDBLOCK) {
  96. PR_SetError(PR_WOULD_BLOCK_ERROR, 0);
  97. } else {
  98. PR_SetError(PR_IO_ERROR, 0);
  99. }
  100. return -1;
  101. }
  102. // Implementation of NSPR methods
  103. static PRStatus TransportLayerClose(PRFileDesc *f) {
  104. f->dtor(f);
  105. return PR_SUCCESS;
  106. }
  107. static int32_t TransportLayerRead(PRFileDesc *f, void *buf, int32_t length) {
  108. UNIMPLEMENTED;
  109. return -1;
  110. }
  111. static int32_t TransportLayerWrite(PRFileDesc *f, const void *buf, int32_t length) {
  112. TransportLayerNSPRAdapter *io = reinterpret_cast<TransportLayerNSPRAdapter *>(f->secret);
  113. return io->Write(buf, length);
  114. }
  115. static int32_t TransportLayerAvailable(PRFileDesc *f) {
  116. UNIMPLEMENTED;
  117. return -1;
  118. }
  119. int64_t TransportLayerAvailable64(PRFileDesc *f) {
  120. UNIMPLEMENTED;
  121. return -1;
  122. }
  123. static PRStatus TransportLayerSync(PRFileDesc *f) {
  124. UNIMPLEMENTED;
  125. return PR_FAILURE;
  126. }
  127. static int32_t TransportLayerSeek(PRFileDesc *f, int32_t offset,
  128. PRSeekWhence how) {
  129. UNIMPLEMENTED;
  130. return -1;
  131. }
  132. static int64_t TransportLayerSeek64(PRFileDesc *f, int64_t offset,
  133. PRSeekWhence how) {
  134. UNIMPLEMENTED;
  135. return -1;
  136. }
  137. static PRStatus TransportLayerFileInfo(PRFileDesc *f, PRFileInfo *info) {
  138. UNIMPLEMENTED;
  139. return PR_FAILURE;
  140. }
  141. static PRStatus TransportLayerFileInfo64(PRFileDesc *f, PRFileInfo64 *info) {
  142. UNIMPLEMENTED;
  143. return PR_FAILURE;
  144. }
  145. static int32_t TransportLayerWritev(PRFileDesc *f, const PRIOVec *iov,
  146. int32_t iov_size, PRIntervalTime to) {
  147. UNIMPLEMENTED;
  148. return -1;
  149. }
  150. static PRStatus TransportLayerConnect(PRFileDesc *f, const PRNetAddr *addr,
  151. PRIntervalTime to) {
  152. UNIMPLEMENTED;
  153. return PR_FAILURE;
  154. }
  155. static PRFileDesc *TransportLayerAccept(PRFileDesc *sd, PRNetAddr *addr,
  156. PRIntervalTime to) {
  157. UNIMPLEMENTED;
  158. return nullptr;
  159. }
  160. static PRStatus TransportLayerBind(PRFileDesc *f, const PRNetAddr *addr) {
  161. UNIMPLEMENTED;
  162. return PR_FAILURE;
  163. }
  164. static PRStatus TransportLayerListen(PRFileDesc *f, int32_t depth) {
  165. UNIMPLEMENTED;
  166. return PR_FAILURE;
  167. }
  168. static PRStatus TransportLayerShutdown(PRFileDesc *f, int32_t how) {
  169. // This is only called from NSS when we are the server and the client refuses
  170. // to provide a certificate. In this case, the handshake is destined for
  171. // failure, so we will just let this pass.
  172. TransportLayerNSPRAdapter *io = reinterpret_cast<TransportLayerNSPRAdapter *>(f->secret);
  173. io->SetEnabled(false);
  174. return PR_SUCCESS;
  175. }
  176. // This function does not support peek, or waiting until `to`
  177. static int32_t TransportLayerRecv(PRFileDesc *f, void *buf, int32_t buflen,
  178. int32_t flags, PRIntervalTime to) {
  179. MOZ_ASSERT(flags == 0);
  180. if (flags != 0) {
  181. PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
  182. return -1;
  183. }
  184. TransportLayerNSPRAdapter *io = reinterpret_cast<TransportLayerNSPRAdapter *>(f->secret);
  185. return io->Recv(buf, buflen);
  186. }
  187. // Note: this is always nonblocking and assumes a zero timeout.
  188. static int32_t TransportLayerSend(PRFileDesc *f, const void *buf, int32_t amount,
  189. int32_t flags, PRIntervalTime to) {
  190. int32_t written = TransportLayerWrite(f, buf, amount);
  191. return written;
  192. }
  193. static int32_t TransportLayerRecvfrom(PRFileDesc *f, void *buf, int32_t amount,
  194. int32_t flags, PRNetAddr *addr, PRIntervalTime to) {
  195. UNIMPLEMENTED;
  196. return -1;
  197. }
  198. static int32_t TransportLayerSendto(PRFileDesc *f, const void *buf, int32_t amount,
  199. int32_t flags, const PRNetAddr *addr, PRIntervalTime to) {
  200. UNIMPLEMENTED;
  201. return -1;
  202. }
  203. static int16_t TransportLayerPoll(PRFileDesc *f, int16_t in_flags, int16_t *out_flags) {
  204. UNIMPLEMENTED;
  205. return -1;
  206. }
  207. static int32_t TransportLayerAcceptRead(PRFileDesc *sd, PRFileDesc **nd,
  208. PRNetAddr **raddr,
  209. void *buf, int32_t amount, PRIntervalTime t) {
  210. UNIMPLEMENTED;
  211. return -1;
  212. }
  213. static int32_t TransportLayerTransmitFile(PRFileDesc *sd, PRFileDesc *f,
  214. const void *headers, int32_t hlen,
  215. PRTransmitFileFlags flags, PRIntervalTime t) {
  216. UNIMPLEMENTED;
  217. return -1;
  218. }
  219. static PRStatus TransportLayerGetpeername(PRFileDesc *f, PRNetAddr *addr) {
  220. // TODO: Modify to return unique names for each channel
  221. // somehow, as opposed to always the same static address. The current
  222. // implementation messes up the session cache, which is why it's off
  223. // elsewhere
  224. addr->inet.family = PR_AF_INET;
  225. addr->inet.port = 0;
  226. addr->inet.ip = 0;
  227. return PR_SUCCESS;
  228. }
  229. static PRStatus TransportLayerGetsockname(PRFileDesc *f, PRNetAddr *addr) {
  230. UNIMPLEMENTED;
  231. return PR_FAILURE;
  232. }
  233. static PRStatus TransportLayerGetsockoption(PRFileDesc *f, PRSocketOptionData *opt) {
  234. switch (opt->option) {
  235. case PR_SockOpt_Nonblocking:
  236. opt->value.non_blocking = PR_TRUE;
  237. return PR_SUCCESS;
  238. default:
  239. UNIMPLEMENTED;
  240. break;
  241. }
  242. return PR_FAILURE;
  243. }
  244. // Imitate setting socket options. These are mostly noops.
  245. static PRStatus TransportLayerSetsockoption(PRFileDesc *f,
  246. const PRSocketOptionData *opt) {
  247. switch (opt->option) {
  248. case PR_SockOpt_Nonblocking:
  249. return PR_SUCCESS;
  250. case PR_SockOpt_NoDelay:
  251. return PR_SUCCESS;
  252. default:
  253. UNIMPLEMENTED;
  254. break;
  255. }
  256. return PR_FAILURE;
  257. }
  258. static int32_t TransportLayerSendfile(PRFileDesc *out, PRSendFileData *in,
  259. PRTransmitFileFlags flags, PRIntervalTime to) {
  260. UNIMPLEMENTED;
  261. return -1;
  262. }
  263. static PRStatus TransportLayerConnectContinue(PRFileDesc *f, int16_t flags) {
  264. UNIMPLEMENTED;
  265. return PR_FAILURE;
  266. }
  267. static int32_t TransportLayerReserved(PRFileDesc *f) {
  268. UNIMPLEMENTED;
  269. return -1;
  270. }
  271. static const struct PRIOMethods TransportLayerMethods = {
  272. PR_DESC_LAYERED,
  273. TransportLayerClose,
  274. TransportLayerRead,
  275. TransportLayerWrite,
  276. TransportLayerAvailable,
  277. TransportLayerAvailable64,
  278. TransportLayerSync,
  279. TransportLayerSeek,
  280. TransportLayerSeek64,
  281. TransportLayerFileInfo,
  282. TransportLayerFileInfo64,
  283. TransportLayerWritev,
  284. TransportLayerConnect,
  285. TransportLayerAccept,
  286. TransportLayerBind,
  287. TransportLayerListen,
  288. TransportLayerShutdown,
  289. TransportLayerRecv,
  290. TransportLayerSend,
  291. TransportLayerRecvfrom,
  292. TransportLayerSendto,
  293. TransportLayerPoll,
  294. TransportLayerAcceptRead,
  295. TransportLayerTransmitFile,
  296. TransportLayerGetsockname,
  297. TransportLayerGetpeername,
  298. TransportLayerReserved,
  299. TransportLayerReserved,
  300. TransportLayerGetsockoption,
  301. TransportLayerSetsockoption,
  302. TransportLayerSendfile,
  303. TransportLayerConnectContinue,
  304. TransportLayerReserved,
  305. TransportLayerReserved,
  306. TransportLayerReserved,
  307. TransportLayerReserved
  308. };
  309. TransportLayerDtls::~TransportLayerDtls() {
  310. nspr_io_adapter_->SetEnabled(false);
  311. if (timer_) {
  312. timer_->Cancel();
  313. }
  314. }
  315. nsresult TransportLayerDtls::InitInternal() {
  316. // Get the transport service as an event target
  317. nsresult rv;
  318. target_ = do_GetService(NS_SOCKETTRANSPORTSERVICE_CONTRACTID, &rv);
  319. if (NS_FAILED(rv)) {
  320. MOZ_MTLOG(ML_ERROR, "Couldn't get socket transport service");
  321. return rv;
  322. }
  323. timer_ = do_CreateInstance(NS_TIMER_CONTRACTID, &rv);
  324. if (NS_FAILED(rv)) {
  325. MOZ_MTLOG(ML_ERROR, "Couldn't get timer");
  326. return rv;
  327. }
  328. return NS_OK;
  329. }
  330. void TransportLayerDtls::WasInserted() {
  331. // Connect to the lower layers
  332. if (!Setup()) {
  333. TL_SET_STATE(TS_ERROR);
  334. }
  335. }
  336. // Set the permitted and default ALPN identifiers.
  337. // The default is here to allow for peers that don't want to negotiate ALPN
  338. // in that case, the default string will be reported from GetNegotiatedAlpn().
  339. // Setting the default to the empty string causes the transport layer to fail
  340. // if ALPN is not negotiated.
  341. // Note: we only support Unicode strings here, which are encoded into UTF-8,
  342. // even though ALPN ostensibly allows arbitrary octet sequences.
  343. nsresult TransportLayerDtls::SetAlpn(
  344. const std::set<std::string>& alpn_allowed,
  345. const std::string& alpn_default) {
  346. alpn_allowed_ = alpn_allowed;
  347. alpn_default_ = alpn_default;
  348. return NS_OK;
  349. }
  350. nsresult TransportLayerDtls::SetVerificationAllowAll() {
  351. // Defensive programming
  352. if (verification_mode_ != VERIFY_UNSET)
  353. return NS_ERROR_ALREADY_INITIALIZED;
  354. verification_mode_ = VERIFY_ALLOW_ALL;
  355. return NS_OK;
  356. }
  357. nsresult
  358. TransportLayerDtls::SetVerificationDigest(const std::string digest_algorithm,
  359. const unsigned char *digest_value,
  360. size_t digest_len) {
  361. // Defensive programming
  362. if (verification_mode_ != VERIFY_UNSET &&
  363. verification_mode_ != VERIFY_DIGEST) {
  364. return NS_ERROR_ALREADY_INITIALIZED;
  365. }
  366. // Note that we do not sanity check these values for length.
  367. // We merely ensure they will fit into the buffer.
  368. // TODO: is there a Data construct we could use?
  369. if (digest_len > kMaxDigestLength)
  370. return NS_ERROR_INVALID_ARG;
  371. digests_.push_back(new VerificationDigest(
  372. digest_algorithm, digest_value, digest_len));
  373. verification_mode_ = VERIFY_DIGEST;
  374. return NS_OK;
  375. }
  376. // These are the named groups that we will allow.
  377. static const SSLNamedGroup NamedGroupPreferences[] = {
  378. ssl_grp_ec_curve25519,
  379. ssl_grp_ec_secp256r1,
  380. ssl_grp_ec_secp384r1,
  381. ssl_grp_ffdhe_2048,
  382. ssl_grp_ffdhe_3072
  383. };
  384. // TODO: make sure this is called from STS. Otherwise
  385. // we have thread safety issues
  386. bool TransportLayerDtls::Setup() {
  387. CheckThread();
  388. SECStatus rv;
  389. if (!downward_) {
  390. MOZ_MTLOG(ML_ERROR, "DTLS layer with nothing below. This is useless");
  391. return false;
  392. }
  393. nspr_io_adapter_ = MakeUnique<TransportLayerNSPRAdapter>(downward_);
  394. if (!identity_) {
  395. MOZ_MTLOG(ML_ERROR, "Can't start DTLS without an identity");
  396. return false;
  397. }
  398. if (verification_mode_ == VERIFY_UNSET) {
  399. MOZ_MTLOG(ML_ERROR,
  400. "Can't start DTLS without specifying a verification mode");
  401. return false;
  402. }
  403. if (transport_layer_identity == PR_INVALID_IO_LAYER) {
  404. transport_layer_identity = PR_GetUniqueIdentity("nssstreamadapter");
  405. }
  406. UniquePRFileDesc pr_fd(PR_CreateIOLayerStub(transport_layer_identity,
  407. &TransportLayerMethods));
  408. MOZ_ASSERT(pr_fd != nullptr);
  409. if (!pr_fd)
  410. return false;
  411. pr_fd->secret = reinterpret_cast<PRFilePrivate *>(nspr_io_adapter_.get());
  412. UniquePRFileDesc ssl_fd(DTLS_ImportFD(nullptr, pr_fd.get()));
  413. MOZ_ASSERT(ssl_fd != nullptr); // This should never happen
  414. if (!ssl_fd) {
  415. return false;
  416. }
  417. Unused << pr_fd.release(); // ownership transfered to ssl_fd;
  418. if (role_ == CLIENT) {
  419. MOZ_MTLOG(ML_INFO, "Setting up DTLS as client");
  420. rv = SSL_GetClientAuthDataHook(ssl_fd.get(), GetClientAuthDataHook,
  421. this);
  422. if (rv != SECSuccess) {
  423. MOZ_MTLOG(ML_ERROR, "Couldn't set identity");
  424. return false;
  425. }
  426. } else {
  427. MOZ_MTLOG(ML_INFO, "Setting up DTLS as server");
  428. // Server side
  429. rv = SSL_ConfigSecureServer(ssl_fd.get(), identity_->cert().get(),
  430. identity_->privkey(),
  431. identity_->auth_type());
  432. if (rv != SECSuccess) {
  433. MOZ_MTLOG(ML_ERROR, "Couldn't set identity");
  434. return false;
  435. }
  436. UniqueCERTCertList zero_certs(CERT_NewCertList());
  437. rv = SSL_SetTrustAnchors(ssl_fd.get(), zero_certs.get());
  438. if (rv != SECSuccess) {
  439. MOZ_MTLOG(ML_ERROR, "Couldn't set trust anchors");
  440. return false;
  441. }
  442. // Insist on a certificate from the client
  443. rv = SSL_OptionSet(ssl_fd.get(), SSL_REQUEST_CERTIFICATE, PR_TRUE);
  444. if (rv != SECSuccess) {
  445. MOZ_MTLOG(ML_ERROR, "Couldn't request certificate");
  446. return false;
  447. }
  448. rv = SSL_OptionSet(ssl_fd.get(), SSL_REQUIRE_CERTIFICATE, PR_TRUE);
  449. if (rv != SECSuccess) {
  450. MOZ_MTLOG(ML_ERROR, "Couldn't require certificate");
  451. return false;
  452. }
  453. }
  454. // Require TLS 1.1 or 1.2. Perhaps some day in the future we will allow TLS
  455. // 1.0 for stream modes.
  456. SSLVersionRange version_range = {
  457. SSL_LIBRARY_VERSION_TLS_1_1,
  458. SSL_LIBRARY_VERSION_TLS_1_2
  459. };
  460. rv = SSL_VersionRangeSet(ssl_fd.get(), &version_range);
  461. if (rv != SECSuccess) {
  462. MOZ_MTLOG(ML_ERROR, "Can't disable SSLv3");
  463. return false;
  464. }
  465. rv = SSL_OptionSet(ssl_fd.get(), SSL_ENABLE_SESSION_TICKETS, PR_FALSE);
  466. if (rv != SECSuccess) {
  467. MOZ_MTLOG(ML_ERROR, "Couldn't disable session tickets");
  468. return false;
  469. }
  470. rv = SSL_OptionSet(ssl_fd.get(), SSL_NO_CACHE, PR_TRUE);
  471. if (rv != SECSuccess) {
  472. MOZ_MTLOG(ML_ERROR, "Couldn't disable session caching");
  473. return false;
  474. }
  475. rv = SSL_OptionSet(ssl_fd.get(), SSL_ENABLE_DEFLATE, PR_FALSE);
  476. if (rv != SECSuccess) {
  477. MOZ_MTLOG(ML_ERROR, "Couldn't disable deflate");
  478. return false;
  479. }
  480. rv = SSL_OptionSet(ssl_fd.get(), SSL_ENABLE_RENEGOTIATION,
  481. SSL_RENEGOTIATE_NEVER);
  482. if (rv != SECSuccess) {
  483. MOZ_MTLOG(ML_ERROR, "Couldn't disable renegotiation");
  484. return false;
  485. }
  486. rv = SSL_OptionSet(ssl_fd.get(), SSL_ENABLE_FALSE_START, PR_FALSE);
  487. if (rv != SECSuccess) {
  488. MOZ_MTLOG(ML_ERROR, "Couldn't disable false start");
  489. return false;
  490. }
  491. rv = SSL_OptionSet(ssl_fd.get(), SSL_NO_LOCKS, PR_TRUE);
  492. if (rv != SECSuccess) {
  493. MOZ_MTLOG(ML_ERROR, "Couldn't disable locks");
  494. return false;
  495. }
  496. rv = SSL_OptionSet(ssl_fd.get(), SSL_REUSE_SERVER_ECDHE_KEY, PR_FALSE);
  497. if (rv != SECSuccess) {
  498. MOZ_MTLOG(ML_ERROR, "Couldn't disable ECDHE key reuse");
  499. return false;
  500. }
  501. if (!SetupCipherSuites(ssl_fd)) {
  502. return false;
  503. }
  504. rv = SSL_NamedGroupConfig(ssl_fd.get(), NamedGroupPreferences,
  505. mozilla::ArrayLength(NamedGroupPreferences));
  506. if (rv != SECSuccess) {
  507. MOZ_MTLOG(ML_ERROR, "Couldn't set named groups");
  508. return false;
  509. }
  510. // Certificate validation
  511. rv = SSL_AuthCertificateHook(ssl_fd.get(), AuthCertificateHook,
  512. reinterpret_cast<void *>(this));
  513. if (rv != SECSuccess) {
  514. MOZ_MTLOG(ML_ERROR, "Couldn't set certificate validation hook");
  515. return false;
  516. }
  517. if (!SetupAlpn(ssl_fd)) {
  518. return false;
  519. }
  520. // Now start the handshake
  521. rv = SSL_ResetHandshake(ssl_fd.get(), role_ == SERVER ? PR_TRUE : PR_FALSE);
  522. if (rv != SECSuccess) {
  523. MOZ_MTLOG(ML_ERROR, "Couldn't reset handshake");
  524. return false;
  525. }
  526. ssl_fd_ = Move(ssl_fd);
  527. // Finally, get ready to receive data
  528. downward_->SignalStateChange.connect(this, &TransportLayerDtls::StateChange);
  529. downward_->SignalPacketReceived.connect(this, &TransportLayerDtls::PacketReceived);
  530. if (downward_->state() == TS_OPEN) {
  531. TL_SET_STATE(TS_CONNECTING);
  532. Handshake();
  533. }
  534. return true;
  535. }
  536. bool TransportLayerDtls::SetupAlpn(UniquePRFileDesc& ssl_fd) const {
  537. if (alpn_allowed_.empty()) {
  538. return true;
  539. }
  540. SECStatus rv = SSL_OptionSet(ssl_fd.get(), SSL_ENABLE_NPN, PR_FALSE);
  541. if (rv != SECSuccess) {
  542. MOZ_MTLOG(ML_ERROR, "Couldn't disable NPN");
  543. return false;
  544. }
  545. rv = SSL_OptionSet(ssl_fd.get(), SSL_ENABLE_ALPN, PR_TRUE);
  546. if (rv != SECSuccess) {
  547. MOZ_MTLOG(ML_ERROR, "Couldn't enable ALPN");
  548. return false;
  549. }
  550. unsigned char buf[MAX_ALPN_LENGTH];
  551. size_t offset = 0;
  552. for (auto tag = alpn_allowed_.begin();
  553. tag != alpn_allowed_.end(); ++tag) {
  554. if ((offset + 1 + tag->length()) >= sizeof(buf)) {
  555. MOZ_MTLOG(ML_ERROR, "ALPN too long");
  556. return false;
  557. }
  558. buf[offset++] = tag->length();
  559. memcpy(buf + offset, tag->c_str(), tag->length());
  560. offset += tag->length();
  561. }
  562. rv = SSL_SetNextProtoNego(ssl_fd.get(), buf, offset);
  563. if (rv != SECSuccess) {
  564. MOZ_MTLOG(ML_ERROR, "Couldn't set ALPN string");
  565. return false;
  566. }
  567. return true;
  568. }
  569. // Ciphers we need to enable. These are on by default in standard firefox
  570. // builds, but can be disabled with prefs and they aren't on in our unit tests
  571. // since that uses NSS default configuration.
  572. //
  573. // Only override prefs to comply with MUST statements in the security-arch doc.
  574. // Anything outside this list is governed by the usual combination of policy
  575. // and user preferences.
  576. static const uint32_t EnabledCiphers[] = {
  577. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  578. TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  579. };
  580. // Disable all NSS suites modes without PFS or with old and rusty ciphersuites.
  581. // Anything outside this list is governed by the usual combination of policy
  582. // and user preferences.
  583. static const uint32_t DisabledCiphers[] = {
  584. // Bug 1310061: disable all SHA384 ciphers until fixed
  585. TLS_AES_256_GCM_SHA384,
  586. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  587. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  588. TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
  589. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
  590. TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,
  591. TLS_DHE_DSS_WITH_AES_256_GCM_SHA384,
  592. TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,
  593. TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
  594. TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
  595. TLS_ECDHE_RSA_WITH_RC4_128_SHA,
  596. TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA,
  597. TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA,
  598. TLS_DHE_DSS_WITH_RC4_128_SHA,
  599. TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,
  600. TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,
  601. TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,
  602. TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,
  603. TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,
  604. TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA,
  605. TLS_ECDH_ECDSA_WITH_RC4_128_SHA,
  606. TLS_ECDH_RSA_WITH_RC4_128_SHA,
  607. TLS_RSA_WITH_AES_128_GCM_SHA256,
  608. TLS_RSA_WITH_AES_256_GCM_SHA384,
  609. TLS_RSA_WITH_AES_128_CBC_SHA,
  610. TLS_RSA_WITH_AES_128_CBC_SHA256,
  611. TLS_RSA_WITH_CAMELLIA_128_CBC_SHA,
  612. TLS_RSA_WITH_AES_256_CBC_SHA,
  613. TLS_RSA_WITH_AES_256_CBC_SHA256,
  614. TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,
  615. TLS_RSA_WITH_SEED_CBC_SHA,
  616. TLS_RSA_WITH_3DES_EDE_CBC_SHA,
  617. TLS_RSA_WITH_RC4_128_SHA,
  618. TLS_RSA_WITH_RC4_128_MD5,
  619. TLS_DHE_RSA_WITH_DES_CBC_SHA,
  620. TLS_DHE_DSS_WITH_DES_CBC_SHA,
  621. TLS_RSA_WITH_DES_CBC_SHA,
  622. TLS_ECDHE_ECDSA_WITH_NULL_SHA,
  623. TLS_ECDHE_RSA_WITH_NULL_SHA,
  624. TLS_ECDH_ECDSA_WITH_NULL_SHA,
  625. TLS_ECDH_RSA_WITH_NULL_SHA,
  626. TLS_RSA_WITH_NULL_SHA,
  627. TLS_RSA_WITH_NULL_SHA256,
  628. TLS_RSA_WITH_NULL_MD5,
  629. };
  630. bool TransportLayerDtls::SetupCipherSuites(UniquePRFileDesc& ssl_fd) const {
  631. SECStatus rv;
  632. // Set the SRTP ciphers
  633. if (!srtp_ciphers_.empty()) {
  634. // Note: std::vector is guaranteed to contiguous
  635. rv = SSL_SetSRTPCiphers(ssl_fd.get(), &srtp_ciphers_[0],
  636. srtp_ciphers_.size());
  637. if (rv != SECSuccess) {
  638. MOZ_MTLOG(ML_ERROR, "Couldn't set SRTP cipher suite");
  639. return false;
  640. }
  641. }
  642. for (const auto& cipher : EnabledCiphers) {
  643. MOZ_MTLOG(ML_DEBUG, LAYER_INFO << "Enabling: " << cipher);
  644. rv = SSL_CipherPrefSet(ssl_fd.get(), cipher, PR_TRUE);
  645. if (rv != SECSuccess) {
  646. MOZ_MTLOG(ML_ERROR, LAYER_INFO <<
  647. "Unable to enable suite: " << cipher);
  648. return false;
  649. }
  650. }
  651. for (const auto& cipher : DisabledCiphers) {
  652. MOZ_MTLOG(ML_DEBUG, LAYER_INFO << "Disabling: " << cipher);
  653. PRBool enabled = false;
  654. rv = SSL_CipherPrefGet(ssl_fd.get(), cipher, &enabled);
  655. if (rv != SECSuccess) {
  656. MOZ_MTLOG(ML_NOTICE, LAYER_INFO <<
  657. "Unable to check if suite is enabled: " << cipher);
  658. return false;
  659. }
  660. if (enabled) {
  661. rv = SSL_CipherPrefSet(ssl_fd.get(), cipher, PR_FALSE);
  662. if (rv != SECSuccess) {
  663. MOZ_MTLOG(ML_NOTICE, LAYER_INFO <<
  664. "Unable to disable suite: " << cipher);
  665. return false;
  666. }
  667. }
  668. }
  669. return true;
  670. }
  671. nsresult TransportLayerDtls::GetCipherSuite(uint16_t* cipherSuite) const {
  672. CheckThread();
  673. if (!cipherSuite) {
  674. MOZ_MTLOG(ML_ERROR, LAYER_INFO << "GetCipherSuite passed a nullptr");
  675. return NS_ERROR_NULL_POINTER;
  676. }
  677. if (state_ != TS_OPEN) {
  678. return NS_ERROR_NOT_AVAILABLE;
  679. }
  680. SSLChannelInfo info;
  681. SECStatus rv = SSL_GetChannelInfo(ssl_fd_.get(), &info, sizeof(info));
  682. if (rv != SECSuccess) {
  683. MOZ_MTLOG(ML_NOTICE, LAYER_INFO << "GetCipherSuite can't get channel info");
  684. return NS_ERROR_FAILURE;
  685. }
  686. *cipherSuite = info.cipherSuite;
  687. return NS_OK;
  688. }
  689. void TransportLayerDtls::StateChange(TransportLayer *layer, State state) {
  690. if (state <= state_) {
  691. MOZ_MTLOG(ML_ERROR, "Lower layer state is going backwards from ours");
  692. TL_SET_STATE(TS_ERROR);
  693. return;
  694. }
  695. switch (state) {
  696. case TS_NONE:
  697. MOZ_ASSERT(false); // Can't happen
  698. break;
  699. case TS_INIT:
  700. MOZ_MTLOG(ML_ERROR,
  701. LAYER_INFO << "State change of lower layer to INIT forbidden");
  702. TL_SET_STATE(TS_ERROR);
  703. break;
  704. case TS_CONNECTING:
  705. MOZ_MTLOG(ML_ERROR, LAYER_INFO << "Lower layer is connecting.");
  706. break;
  707. case TS_OPEN:
  708. MOZ_MTLOG(ML_ERROR,
  709. LAYER_INFO << "Lower layer is now open; starting TLS");
  710. // Async, since the ICE layer might need to send a STUN response, and we
  711. // don't want the handshake to start until that is sent.
  712. TL_SET_STATE(TS_CONNECTING);
  713. timer_->Cancel();
  714. timer_->SetTarget(target_);
  715. timer_->InitWithFuncCallback(TimerCallback,
  716. this,
  717. 0,
  718. nsITimer::TYPE_ONE_SHOT);
  719. break;
  720. case TS_CLOSED:
  721. MOZ_MTLOG(ML_ERROR, LAYER_INFO << "Lower layer is now closed");
  722. TL_SET_STATE(TS_CLOSED);
  723. break;
  724. case TS_ERROR:
  725. MOZ_MTLOG(ML_ERROR, LAYER_INFO << "Lower layer experienced an error");
  726. TL_SET_STATE(TS_ERROR);
  727. break;
  728. }
  729. }
  730. void TransportLayerDtls::Handshake() {
  731. // Clear the retransmit timer
  732. timer_->Cancel();
  733. SECStatus rv = SSL_ForceHandshake(ssl_fd_.get());
  734. if (rv == SECSuccess) {
  735. MOZ_MTLOG(ML_NOTICE,
  736. LAYER_INFO << "****** SSL handshake completed ******");
  737. if (!cert_ok_) {
  738. MOZ_MTLOG(ML_ERROR, LAYER_INFO << "Certificate check never occurred");
  739. TL_SET_STATE(TS_ERROR);
  740. return;
  741. }
  742. if (!CheckAlpn()) {
  743. // Despite connecting, the connection doesn't have a valid ALPN label.
  744. // Forcibly close the connection so that the peer isn't left hanging
  745. // (assuming the close_notify isn't dropped).
  746. ssl_fd_ = nullptr;
  747. TL_SET_STATE(TS_ERROR);
  748. return;
  749. }
  750. TL_SET_STATE(TS_OPEN);
  751. } else {
  752. int32_t err = PR_GetError();
  753. switch(err) {
  754. case SSL_ERROR_RX_MALFORMED_HANDSHAKE:
  755. MOZ_MTLOG(ML_ERROR, LAYER_INFO << "Malformed DTLS message; ignoring");
  756. // If this were TLS (and not DTLS), this would be fatal, but
  757. // here we're required to ignore bad messages, so fall through
  758. MOZ_FALLTHROUGH;
  759. case PR_WOULD_BLOCK_ERROR:
  760. MOZ_MTLOG(ML_NOTICE, LAYER_INFO << "Handshake would have blocked");
  761. PRIntervalTime timeout;
  762. rv = DTLS_GetHandshakeTimeout(ssl_fd_.get(), &timeout);
  763. if (rv == SECSuccess) {
  764. uint32_t timeout_ms = PR_IntervalToMilliseconds(timeout);
  765. MOZ_MTLOG(ML_DEBUG,
  766. LAYER_INFO << "Setting DTLS timeout to " << timeout_ms);
  767. timer_->SetTarget(target_);
  768. timer_->InitWithFuncCallback(TimerCallback,
  769. this, timeout_ms,
  770. nsITimer::TYPE_ONE_SHOT);
  771. }
  772. break;
  773. default:
  774. const char *err_msg = PR_ErrorToName(err);
  775. MOZ_MTLOG(ML_ERROR, LAYER_INFO << "DTLS handshake error " << err << " ("
  776. << err_msg << ")");
  777. TL_SET_STATE(TS_ERROR);
  778. break;
  779. }
  780. }
  781. }
  782. // Checks if ALPN was negotiated correctly and returns false if it wasn't.
  783. // After this returns successfully, alpn_ will be set to the negotiated
  784. // protocol.
  785. bool TransportLayerDtls::CheckAlpn() {
  786. if (alpn_allowed_.empty()) {
  787. return true;
  788. }
  789. SSLNextProtoState alpnState;
  790. char chosenAlpn[MAX_ALPN_LENGTH];
  791. unsigned int chosenAlpnLen;
  792. SECStatus rv = SSL_GetNextProto(ssl_fd_.get(), &alpnState,
  793. reinterpret_cast<unsigned char*>(chosenAlpn),
  794. &chosenAlpnLen, sizeof(chosenAlpn));
  795. if (rv != SECSuccess) {
  796. MOZ_MTLOG(ML_ERROR, LAYER_INFO << "ALPN error");
  797. return false;
  798. }
  799. switch (alpnState) {
  800. case SSL_NEXT_PROTO_SELECTED:
  801. case SSL_NEXT_PROTO_NEGOTIATED:
  802. break; // OK
  803. case SSL_NEXT_PROTO_NO_SUPPORT:
  804. MOZ_MTLOG(ML_NOTICE, LAYER_INFO << "ALPN not negotiated, "
  805. << (alpn_default_.empty() ? "failing" : "selecting default"));
  806. alpn_ = alpn_default_;
  807. return !alpn_.empty();
  808. case SSL_NEXT_PROTO_NO_OVERLAP:
  809. // This only happens if there is a custom NPN/ALPN callback installed and
  810. // that callback doesn't properly handle ALPN.
  811. MOZ_MTLOG(ML_ERROR, LAYER_INFO << "error in ALPN selection callback");
  812. return false;
  813. case SSL_NEXT_PROTO_EARLY_VALUE:
  814. MOZ_CRASH("Unexpected 0-RTT ALPN value");
  815. return false;
  816. }
  817. // Warning: NSS won't null terminate the ALPN string for us.
  818. std::string chosen(chosenAlpn, chosenAlpnLen);
  819. MOZ_MTLOG(ML_NOTICE, LAYER_INFO << "Selected ALPN string: " << chosen);
  820. if (alpn_allowed_.find(chosen) == alpn_allowed_.end()) {
  821. // Maybe our peer chose a protocol we didn't offer (when we are client), or
  822. // something is seriously wrong.
  823. std::ostringstream ss;
  824. for (auto i = alpn_allowed_.begin(); i != alpn_allowed_.end(); ++i) {
  825. ss << (i == alpn_allowed_.begin() ? " '" : ", '") << *i << "'";
  826. }
  827. MOZ_MTLOG(ML_ERROR, LAYER_INFO << "Bad ALPN string: '" << chosen
  828. << "'; permitted:" << ss.str());
  829. return false;
  830. }
  831. alpn_ = chosen;
  832. return true;
  833. }
  834. void TransportLayerDtls::PacketReceived(TransportLayer* layer,
  835. const unsigned char *data,
  836. size_t len) {
  837. CheckThread();
  838. MOZ_MTLOG(ML_DEBUG, LAYER_INFO << "PacketReceived(" << len << ")");
  839. if (state_ != TS_CONNECTING && state_ != TS_OPEN) {
  840. MOZ_MTLOG(ML_DEBUG,
  841. LAYER_INFO << "Discarding packet in inappropriate state");
  842. return;
  843. }
  844. // not DTLS per RFC 7983
  845. if (data[0] < 20 || data[0] > 63) {
  846. return;
  847. }
  848. nspr_io_adapter_->PacketReceived(data, len);
  849. // If we're still connecting, try to handshake
  850. if (state_ == TS_CONNECTING) {
  851. Handshake();
  852. }
  853. // Now try a recv if we're open, since there might be data left
  854. if (state_ == TS_OPEN) {
  855. // nICEr uses a 9216 bytes buffer to allow support for jumbo frames
  856. unsigned char buf[9216];
  857. int32_t rv;
  858. // One packet might contain several DTLS packets
  859. do {
  860. rv = PR_Recv(ssl_fd_.get(), buf, sizeof(buf), 0, PR_INTERVAL_NO_WAIT);
  861. if (rv > 0) {
  862. // We have data
  863. MOZ_MTLOG(ML_DEBUG, LAYER_INFO << "Read " << rv << " bytes from NSS");
  864. SignalPacketReceived(this, buf, rv);
  865. } else if (rv == 0) {
  866. TL_SET_STATE(TS_CLOSED);
  867. } else {
  868. int32_t err = PR_GetError();
  869. if (err == PR_WOULD_BLOCK_ERROR) {
  870. // This gets ignored
  871. MOZ_MTLOG(ML_DEBUG, LAYER_INFO << "Receive would have blocked");
  872. } else {
  873. MOZ_MTLOG(ML_NOTICE, LAYER_INFO << "NSS Error " << err);
  874. TL_SET_STATE(TS_ERROR);
  875. }
  876. }
  877. } while (rv > 0);
  878. }
  879. }
  880. TransportResult TransportLayerDtls::SendPacket(const unsigned char *data,
  881. size_t len) {
  882. CheckThread();
  883. if (state_ != TS_OPEN) {
  884. MOZ_MTLOG(ML_ERROR, LAYER_INFO << "Can't call SendPacket() in state "
  885. << state_);
  886. return TE_ERROR;
  887. }
  888. int32_t rv = PR_Send(ssl_fd_.get(), data, len, 0, PR_INTERVAL_NO_WAIT);
  889. if (rv > 0) {
  890. // We have data
  891. MOZ_MTLOG(ML_DEBUG, LAYER_INFO << "Wrote " << rv << " bytes to SSL Layer");
  892. return rv;
  893. }
  894. if (rv == 0) {
  895. TL_SET_STATE(TS_CLOSED);
  896. return 0;
  897. }
  898. int32_t err = PR_GetError();
  899. if (err == PR_WOULD_BLOCK_ERROR) {
  900. // This gets ignored
  901. MOZ_MTLOG(ML_DEBUG, LAYER_INFO << "Send would have blocked");
  902. return TE_WOULDBLOCK;
  903. }
  904. MOZ_MTLOG(ML_NOTICE, LAYER_INFO << "NSS Error " << err);
  905. TL_SET_STATE(TS_ERROR);
  906. return TE_ERROR;
  907. }
  908. SECStatus TransportLayerDtls::GetClientAuthDataHook(void *arg, PRFileDesc *fd,
  909. CERTDistNames *caNames,
  910. CERTCertificate **pRetCert,
  911. SECKEYPrivateKey **pRetKey) {
  912. MOZ_MTLOG(ML_DEBUG, "Server requested client auth");
  913. TransportLayerDtls *stream = reinterpret_cast<TransportLayerDtls *>(arg);
  914. stream->CheckThread();
  915. if (!stream->identity_) {
  916. MOZ_MTLOG(ML_ERROR, "No identity available");
  917. PR_SetError(SSL_ERROR_NO_CERTIFICATE, 0);
  918. return SECFailure;
  919. }
  920. *pRetCert = CERT_DupCertificate(stream->identity_->cert().get());
  921. if (!*pRetCert) {
  922. PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0);
  923. return SECFailure;
  924. }
  925. *pRetKey = SECKEY_CopyPrivateKey(stream->identity_->privkey());
  926. if (!*pRetKey) {
  927. CERT_DestroyCertificate(*pRetCert);
  928. *pRetCert = nullptr;
  929. PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0);
  930. return SECFailure;
  931. }
  932. return SECSuccess;
  933. }
  934. nsresult TransportLayerDtls::SetSrtpCiphers(std::vector<uint16_t> ciphers) {
  935. // TODO: We should check these
  936. srtp_ciphers_ = ciphers;
  937. return NS_OK;
  938. }
  939. nsresult TransportLayerDtls::GetSrtpCipher(uint16_t *cipher) const {
  940. CheckThread();
  941. if (state_ != TS_OPEN) {
  942. return NS_ERROR_NOT_AVAILABLE;
  943. }
  944. SECStatus rv = SSL_GetSRTPCipher(ssl_fd_.get(), cipher);
  945. if (rv != SECSuccess) {
  946. MOZ_MTLOG(ML_DEBUG, "No SRTP cipher negotiated");
  947. return NS_ERROR_FAILURE;
  948. }
  949. return NS_OK;
  950. }
  951. nsresult TransportLayerDtls::ExportKeyingMaterial(const std::string& label,
  952. bool use_context,
  953. const std::string& context,
  954. unsigned char *out,
  955. unsigned int outlen) {
  956. CheckThread();
  957. if (state_ != TS_OPEN) {
  958. MOZ_ASSERT(false, "Transport must be open for ExportKeyingMaterial");
  959. return NS_ERROR_NOT_AVAILABLE;
  960. }
  961. SECStatus rv = SSL_ExportKeyingMaterial(ssl_fd_.get(),
  962. label.c_str(),
  963. label.size(),
  964. use_context,
  965. reinterpret_cast<const unsigned char *>(
  966. context.c_str()),
  967. context.size(),
  968. out,
  969. outlen);
  970. if (rv != SECSuccess) {
  971. MOZ_MTLOG(ML_ERROR, "Couldn't export SSL keying material");
  972. return NS_ERROR_FAILURE;
  973. }
  974. return NS_OK;
  975. }
  976. SECStatus TransportLayerDtls::AuthCertificateHook(void *arg,
  977. PRFileDesc *fd,
  978. PRBool checksig,
  979. PRBool isServer) {
  980. TransportLayerDtls *stream = reinterpret_cast<TransportLayerDtls *>(arg);
  981. stream->CheckThread();
  982. return stream->AuthCertificateHook(fd, checksig, isServer);
  983. }
  984. SECStatus
  985. TransportLayerDtls::CheckDigest(const RefPtr<VerificationDigest>& digest,
  986. UniqueCERTCertificate& peer_cert) const {
  987. unsigned char computed_digest[kMaxDigestLength];
  988. size_t computed_digest_len;
  989. MOZ_MTLOG(ML_DEBUG, LAYER_INFO << "Checking digest, algorithm="
  990. << digest->algorithm_);
  991. nsresult res =
  992. DtlsIdentity::ComputeFingerprint(peer_cert,
  993. digest->algorithm_,
  994. computed_digest,
  995. sizeof(computed_digest),
  996. &computed_digest_len);
  997. if (NS_FAILED(res)) {
  998. MOZ_MTLOG(ML_ERROR, "Could not compute peer fingerprint for digest " <<
  999. digest->algorithm_);
  1000. // Go to end
  1001. PR_SetError(SSL_ERROR_BAD_CERTIFICATE, 0);
  1002. return SECFailure;
  1003. }
  1004. if (computed_digest_len != digest->len_) {
  1005. MOZ_MTLOG(ML_ERROR, "Digest is wrong length " << digest->len_ <<
  1006. " should be " << computed_digest_len << " for algorithm " <<
  1007. digest->algorithm_);
  1008. PR_SetError(SSL_ERROR_BAD_CERTIFICATE, 0);
  1009. return SECFailure;
  1010. }
  1011. if (memcmp(digest->value_, computed_digest, computed_digest_len) != 0) {
  1012. MOZ_MTLOG(ML_ERROR, "Digest does not match");
  1013. PR_SetError(SSL_ERROR_BAD_CERTIFICATE, 0);
  1014. return SECFailure;
  1015. }
  1016. return SECSuccess;
  1017. }
  1018. SECStatus TransportLayerDtls::AuthCertificateHook(PRFileDesc *fd,
  1019. PRBool checksig,
  1020. PRBool isServer) {
  1021. CheckThread();
  1022. UniqueCERTCertificate peer_cert(SSL_PeerCertificate(fd));
  1023. // We are not set up to take this being called multiple
  1024. // times. Change this if we ever add renegotiation.
  1025. MOZ_ASSERT(!auth_hook_called_);
  1026. if (auth_hook_called_) {
  1027. PR_SetError(PR_UNKNOWN_ERROR, 0);
  1028. return SECFailure;
  1029. }
  1030. auth_hook_called_ = true;
  1031. MOZ_ASSERT(verification_mode_ != VERIFY_UNSET);
  1032. switch (verification_mode_) {
  1033. case VERIFY_UNSET:
  1034. // Break out to error exit
  1035. PR_SetError(PR_UNKNOWN_ERROR, 0);
  1036. break;
  1037. case VERIFY_ALLOW_ALL:
  1038. cert_ok_ = true;
  1039. return SECSuccess;
  1040. case VERIFY_DIGEST:
  1041. {
  1042. MOZ_ASSERT(digests_.size() != 0);
  1043. // Check all the provided digests
  1044. // Checking functions call PR_SetError()
  1045. SECStatus rv = SECFailure;
  1046. for (size_t i = 0; i < digests_.size(); i++) {
  1047. RefPtr<VerificationDigest> digest = digests_[i];
  1048. rv = CheckDigest(digest, peer_cert);
  1049. // Matches a digest, we are good to go
  1050. if (rv == SECSuccess) {
  1051. cert_ok_ = true;
  1052. return SECSuccess;
  1053. }
  1054. }
  1055. }
  1056. break;
  1057. default:
  1058. MOZ_CRASH(); // Can't happen
  1059. }
  1060. return SECFailure;
  1061. }
  1062. void TransportLayerDtls::TimerCallback(nsITimer *timer, void *arg) {
  1063. TransportLayerDtls *dtls = reinterpret_cast<TransportLayerDtls *>(arg);
  1064. MOZ_MTLOG(ML_DEBUG, "DTLS timer expired");
  1065. dtls->Handshake();
  1066. }
  1067. } // close namespace