transport_unittests.cpp 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344
  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 <iostream>
  7. #include <string>
  8. #include <map>
  9. #include <algorithm>
  10. #include "mozilla/UniquePtr.h"
  11. #include "sigslot.h"
  12. #include "logging.h"
  13. #include "nspr.h"
  14. #include "nss.h"
  15. #include "ssl.h"
  16. #include "sslproto.h"
  17. #include "nsThreadUtils.h"
  18. #include "nsXPCOM.h"
  19. #include "databuffer.h"
  20. #include "dtlsidentity.h"
  21. #include "nricectxhandler.h"
  22. #include "nricemediastream.h"
  23. #include "transportflow.h"
  24. #include "transportlayer.h"
  25. #include "transportlayerdtls.h"
  26. #include "transportlayerice.h"
  27. #include "transportlayerlog.h"
  28. #include "transportlayerloopback.h"
  29. #include "runnable_utils.h"
  30. #define GTEST_HAS_RTTI 0
  31. #include "gtest/gtest.h"
  32. #include "gtest_utils.h"
  33. using namespace mozilla;
  34. MOZ_MTLOG_MODULE("mtransport")
  35. const uint8_t kTlsChangeCipherSpecType = 0x14;
  36. const uint8_t kTlsHandshakeType = 0x16;
  37. const uint8_t kTlsHandshakeCertificate = 0x0b;
  38. const uint8_t kTlsHandshakeServerKeyExchange = 0x0c;
  39. const uint8_t kTlsFakeChangeCipherSpec[] = {
  40. kTlsChangeCipherSpecType, // Type
  41. 0xfe, 0xff, // Version
  42. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // Fictitious sequence #
  43. 0x00, 0x01, // Length
  44. 0x01 // Value
  45. };
  46. // Layer class which can't be initialized.
  47. class TransportLayerDummy : public TransportLayer {
  48. public:
  49. TransportLayerDummy(bool allow_init, bool *destroyed)
  50. : allow_init_(allow_init),
  51. destroyed_(destroyed) {
  52. *destroyed_ = false;
  53. }
  54. virtual ~TransportLayerDummy() {
  55. *destroyed_ = true;
  56. }
  57. virtual nsresult InitInternal() {
  58. return allow_init_ ? NS_OK : NS_ERROR_FAILURE;
  59. }
  60. virtual TransportResult SendPacket(const unsigned char *data, size_t len) {
  61. MOZ_CRASH(); // Should never be called.
  62. return 0;
  63. }
  64. TRANSPORT_LAYER_ID("lossy")
  65. private:
  66. bool allow_init_;
  67. bool *destroyed_;
  68. };
  69. class Inspector {
  70. public:
  71. virtual ~Inspector() {}
  72. virtual void Inspect(TransportLayer* layer,
  73. const unsigned char *data, size_t len) = 0;
  74. };
  75. // Class to simulate various kinds of network lossage
  76. class TransportLayerLossy : public TransportLayer {
  77. public:
  78. TransportLayerLossy() : loss_mask_(0), packet_(0), inspector_(nullptr) {}
  79. ~TransportLayerLossy () {}
  80. virtual TransportResult SendPacket(const unsigned char *data, size_t len) {
  81. MOZ_MTLOG(ML_NOTICE, LAYER_INFO << "SendPacket(" << len << ")");
  82. if (loss_mask_ & (1 << (packet_ % 32))) {
  83. MOZ_MTLOG(ML_NOTICE, "Dropping packet");
  84. ++packet_;
  85. return len;
  86. }
  87. if (inspector_) {
  88. inspector_->Inspect(this, data, len);
  89. }
  90. ++packet_;
  91. return downward_->SendPacket(data, len);
  92. }
  93. void SetLoss(uint32_t packet) {
  94. loss_mask_ |= (1 << (packet & 32));
  95. }
  96. void SetInspector(UniquePtr<Inspector> inspector) {
  97. inspector_ = Move(inspector);
  98. }
  99. void StateChange(TransportLayer *layer, State state) {
  100. TL_SET_STATE(state);
  101. }
  102. void PacketReceived(TransportLayer *layer, const unsigned char *data,
  103. size_t len) {
  104. SignalPacketReceived(this, data, len);
  105. }
  106. TRANSPORT_LAYER_ID("lossy")
  107. protected:
  108. virtual void WasInserted() {
  109. downward_->SignalPacketReceived.
  110. connect(this,
  111. &TransportLayerLossy::PacketReceived);
  112. downward_->SignalStateChange.
  113. connect(this,
  114. &TransportLayerLossy::StateChange);
  115. TL_SET_STATE(downward_->state());
  116. }
  117. private:
  118. uint32_t loss_mask_;
  119. uint32_t packet_;
  120. UniquePtr<Inspector> inspector_;
  121. };
  122. // Process DTLS Records
  123. #define CHECK_LENGTH(expected) \
  124. do { \
  125. EXPECT_GE(remaining(), expected); \
  126. if (remaining() < expected) return false; \
  127. } while(0)
  128. class TlsParser {
  129. public:
  130. TlsParser(const unsigned char *data, size_t len)
  131. : buffer_(data, len), offset_(0) {}
  132. bool Read(unsigned char* val) {
  133. if (remaining() < 1) {
  134. return false;
  135. }
  136. *val = *ptr();
  137. consume(1);
  138. return true;
  139. }
  140. // Read an integral type of specified width.
  141. bool Read(uint32_t *val, size_t len) {
  142. if (len > sizeof(uint32_t))
  143. return false;
  144. *val = 0;
  145. for (size_t i=0; i<len; ++i) {
  146. unsigned char tmp;
  147. if (!Read(&tmp))
  148. return false;
  149. (*val) = ((*val) << 8) + tmp;
  150. }
  151. return true;
  152. }
  153. bool Read(unsigned char* val, size_t len) {
  154. if (remaining() < len) {
  155. return false;
  156. }
  157. if (val) {
  158. memcpy(val, ptr(), len);
  159. }
  160. consume(len);
  161. return true;
  162. }
  163. private:
  164. size_t remaining() const { return buffer_.len() - offset_; }
  165. const uint8_t *ptr() const { return buffer_.data() + offset_; }
  166. void consume(size_t len) { offset_ += len; }
  167. DataBuffer buffer_;
  168. size_t offset_;
  169. };
  170. class DtlsRecordParser {
  171. public:
  172. DtlsRecordParser(const unsigned char *data, size_t len)
  173. : buffer_(data, len), offset_(0) {}
  174. bool NextRecord(uint8_t* ct, nsAutoPtr<DataBuffer>* buffer) {
  175. if (!remaining())
  176. return false;
  177. CHECK_LENGTH(13U);
  178. const uint8_t *ctp = reinterpret_cast<const uint8_t *>(ptr());
  179. consume(11); // ct + version + length
  180. const uint16_t *tmp = reinterpret_cast<const uint16_t*>(ptr());
  181. size_t length = ntohs(*tmp);
  182. consume(2);
  183. CHECK_LENGTH(length);
  184. DataBuffer* db = new DataBuffer(ptr(), length);
  185. consume(length);
  186. *ct = *ctp;
  187. *buffer = db;
  188. return true;
  189. }
  190. private:
  191. size_t remaining() const { return buffer_.len() - offset_; }
  192. const uint8_t *ptr() const { return buffer_.data() + offset_; }
  193. void consume(size_t len) { offset_ += len; }
  194. DataBuffer buffer_;
  195. size_t offset_;
  196. };
  197. // Inspector that parses out DTLS records and passes
  198. // them on.
  199. class DtlsRecordInspector : public Inspector {
  200. public:
  201. virtual void Inspect(TransportLayer* layer,
  202. const unsigned char *data, size_t len) {
  203. DtlsRecordParser parser(data, len);
  204. uint8_t ct;
  205. nsAutoPtr<DataBuffer> buf;
  206. while(parser.NextRecord(&ct, &buf)) {
  207. OnRecord(layer, ct, buf->data(), buf->len());
  208. }
  209. }
  210. virtual void OnRecord(TransportLayer* layer,
  211. uint8_t content_type,
  212. const unsigned char *record,
  213. size_t len) = 0;
  214. };
  215. // Inspector that injects arbitrary packets based on
  216. // DTLS records of various types.
  217. class DtlsInspectorInjector : public DtlsRecordInspector {
  218. public:
  219. DtlsInspectorInjector(uint8_t packet_type, uint8_t handshake_type,
  220. const unsigned char *data, size_t len) :
  221. packet_type_(packet_type),
  222. handshake_type_(handshake_type),
  223. injected_(false) {
  224. data_.reset(new unsigned char[len]);
  225. memcpy(data_.get(), data, len);
  226. len_ = len;
  227. }
  228. virtual void OnRecord(TransportLayer* layer,
  229. uint8_t content_type,
  230. const unsigned char *data, size_t len) {
  231. // Only inject once.
  232. if (injected_) {
  233. return;
  234. }
  235. // Check that the first byte is as requested.
  236. if (content_type != packet_type_) {
  237. return;
  238. }
  239. if (handshake_type_ != 0xff) {
  240. // Check that the packet is plausibly long enough.
  241. if (len < 1) {
  242. return;
  243. }
  244. // Check that the handshake type is as requested.
  245. if (data[0] != handshake_type_) {
  246. return;
  247. }
  248. }
  249. layer->SendPacket(data_.get(), len_);
  250. }
  251. private:
  252. uint8_t packet_type_;
  253. uint8_t handshake_type_;
  254. bool injected_;
  255. UniquePtr<unsigned char[]> data_;
  256. size_t len_;
  257. };
  258. // Make a copy of the first instance of a message.
  259. class DtlsInspectorRecordHandshakeMessage : public DtlsRecordInspector {
  260. public:
  261. explicit DtlsInspectorRecordHandshakeMessage(uint8_t handshake_type)
  262. : handshake_type_(handshake_type),
  263. buffer_() {}
  264. virtual void OnRecord(TransportLayer* layer,
  265. uint8_t content_type,
  266. const unsigned char *data, size_t len) {
  267. // Only do this once.
  268. if (buffer_.len()) {
  269. return;
  270. }
  271. // Check that the first byte is as requested.
  272. if (content_type != kTlsHandshakeType) {
  273. return;
  274. }
  275. TlsParser parser(data, len);
  276. unsigned char message_type;
  277. // Read the handshake message type.
  278. if (!parser.Read(&message_type)) {
  279. return;
  280. }
  281. if (message_type != handshake_type_) {
  282. return;
  283. }
  284. uint32_t length;
  285. if (!parser.Read(&length, 3)) {
  286. return;
  287. }
  288. uint32_t message_seq;
  289. if (!parser.Read(&message_seq, 2)) {
  290. return;
  291. }
  292. uint32_t fragment_offset;
  293. if (!parser.Read(&fragment_offset, 3)) {
  294. return;
  295. }
  296. uint32_t fragment_length;
  297. if (!parser.Read(&fragment_length, 3)) {
  298. return;
  299. }
  300. if ((fragment_offset != 0) || (fragment_length != length)) {
  301. // This shouldn't happen because all current tests where we
  302. // are using this code don't fragment.
  303. return;
  304. }
  305. buffer_.Allocate(length);
  306. if (!parser.Read(buffer_.data(), length)) {
  307. return;
  308. }
  309. }
  310. const DataBuffer& buffer() { return buffer_; }
  311. private:
  312. uint8_t handshake_type_;
  313. DataBuffer buffer_;
  314. };
  315. class TlsServerKeyExchangeECDHE {
  316. public:
  317. bool Parse(const unsigned char* data, size_t len) {
  318. TlsParser parser(data, len);
  319. uint8_t curve_type;
  320. if (!parser.Read(&curve_type)) {
  321. return false;
  322. }
  323. if (curve_type != 3) { // named_curve
  324. return false;
  325. }
  326. uint32_t named_curve;
  327. if (!parser.Read(&named_curve, 2)) {
  328. return false;
  329. }
  330. uint32_t point_length;
  331. if (!parser.Read(&point_length, 1)) {
  332. return false;
  333. }
  334. public_key_.Allocate(point_length);
  335. if (!parser.Read(public_key_.data(), point_length)) {
  336. return false;
  337. }
  338. return true;
  339. }
  340. DataBuffer public_key_;
  341. };
  342. namespace {
  343. class TransportTestPeer : public sigslot::has_slots<> {
  344. public:
  345. TransportTestPeer(nsCOMPtr<nsIEventTarget> target, std::string name, MtransportTestUtils* utils)
  346. : name_(name), target_(target),
  347. received_packets_(0),received_bytes_(0),flow_(new TransportFlow(name)),
  348. loopback_(new TransportLayerLoopback()),
  349. logging_(new TransportLayerLogging()),
  350. lossy_(new TransportLayerLossy()),
  351. dtls_(new TransportLayerDtls()),
  352. identity_(DtlsIdentity::Generate()),
  353. ice_ctx_(NrIceCtxHandler::Create(name,
  354. name == "P2" ?
  355. TransportLayerDtls::CLIENT :
  356. TransportLayerDtls::SERVER)),
  357. streams_(), candidates_(),
  358. peer_(nullptr),
  359. gathering_complete_(false),
  360. enabled_cipersuites_(),
  361. disabled_cipersuites_(),
  362. reuse_dhe_key_(false),
  363. test_utils_(utils) {
  364. std::vector<NrIceStunServer> stun_servers;
  365. UniquePtr<NrIceStunServer> server(NrIceStunServer::Create(
  366. std::string((char *)"stun.services.mozilla.com"), 3478));
  367. stun_servers.push_back(*server);
  368. EXPECT_TRUE(NS_SUCCEEDED(ice_ctx_->ctx()->SetStunServers(stun_servers)));
  369. dtls_->SetIdentity(identity_);
  370. dtls_->SetRole(name == "P2" ?
  371. TransportLayerDtls::CLIENT :
  372. TransportLayerDtls::SERVER);
  373. nsresult res = identity_->ComputeFingerprint("sha-1",
  374. fingerprint_,
  375. sizeof(fingerprint_),
  376. &fingerprint_len_);
  377. EXPECT_TRUE(NS_SUCCEEDED(res));
  378. EXPECT_EQ(20u, fingerprint_len_);
  379. }
  380. ~TransportTestPeer() {
  381. test_utils_->sts_target()->Dispatch(
  382. WrapRunnable(this, &TransportTestPeer::DestroyFlow),
  383. NS_DISPATCH_SYNC);
  384. }
  385. void DestroyFlow() {
  386. if (flow_) {
  387. loopback_->Disconnect();
  388. flow_ = nullptr;
  389. }
  390. ice_ctx_ = nullptr;
  391. }
  392. void DisconnectDestroyFlow() {
  393. loopback_->Disconnect();
  394. disconnect_all(); // Disconnect from the signals;
  395. flow_ = nullptr;
  396. }
  397. void SetDtlsAllowAll() {
  398. nsresult res = dtls_->SetVerificationAllowAll();
  399. ASSERT_TRUE(NS_SUCCEEDED(res));
  400. }
  401. void SetAlpn(std::string str, bool withDefault, std::string extra = "") {
  402. std::set<std::string> alpn;
  403. alpn.insert(str); // the one we want to select
  404. if (!extra.empty()) {
  405. alpn.insert(extra);
  406. }
  407. nsresult res = dtls_->SetAlpn(alpn, withDefault ? str : "");
  408. ASSERT_EQ(NS_OK, res);
  409. }
  410. const std::string& GetAlpn() const {
  411. return dtls_->GetNegotiatedAlpn();
  412. }
  413. void SetDtlsPeer(TransportTestPeer *peer, int digests, unsigned int damage) {
  414. unsigned int mask = 1;
  415. for (int i=0; i<digests; i++) {
  416. unsigned char fingerprint_to_set[TransportLayerDtls::kMaxDigestLength];
  417. memcpy(fingerprint_to_set,
  418. peer->fingerprint_,
  419. peer->fingerprint_len_);
  420. if (damage & mask)
  421. fingerprint_to_set[0]++;
  422. nsresult res = dtls_->SetVerificationDigest(
  423. "sha-1",
  424. fingerprint_to_set,
  425. peer->fingerprint_len_);
  426. ASSERT_TRUE(NS_SUCCEEDED(res));
  427. mask <<= 1;
  428. }
  429. }
  430. void SetupSrtp() {
  431. // this mimics the setup we do elsewhere
  432. std::vector<uint16_t> srtp_ciphers;
  433. srtp_ciphers.push_back(SRTP_AES128_CM_HMAC_SHA1_80);
  434. srtp_ciphers.push_back(SRTP_AES128_CM_HMAC_SHA1_32);
  435. SetSrtpCiphers(srtp_ciphers);
  436. }
  437. void SetSrtpCiphers(std::vector<uint16_t>& srtp_ciphers) {
  438. ASSERT_TRUE(NS_SUCCEEDED(dtls_->SetSrtpCiphers(srtp_ciphers)));
  439. }
  440. void ConnectSocket_s(TransportTestPeer *peer) {
  441. nsresult res;
  442. res = loopback_->Init();
  443. ASSERT_EQ((nsresult)NS_OK, res);
  444. loopback_->Connect(peer->loopback_);
  445. ASSERT_EQ((nsresult)NS_OK, flow_->PushLayer(loopback_));
  446. ASSERT_EQ((nsresult)NS_OK, flow_->PushLayer(logging_));
  447. ASSERT_EQ((nsresult)NS_OK, flow_->PushLayer(lossy_));
  448. ASSERT_EQ((nsresult)NS_OK, flow_->PushLayer(dtls_));
  449. if (dtls_->state() != TransportLayer::TS_ERROR) {
  450. // Don't execute these blocks if DTLS didn't initialize.
  451. TweakCiphers(dtls_->internal_fd());
  452. if (reuse_dhe_key_) {
  453. // TransportLayerDtls automatically sets this pref to false
  454. // so set it back for test.
  455. // This is pretty gross. Dig directly into the NSS FD. The problem
  456. // is that we are testing a feature which TransaportLayerDtls doesn't
  457. // expose.
  458. SECStatus rv = SSL_OptionSet(dtls_->internal_fd(),
  459. SSL_REUSE_SERVER_ECDHE_KEY, PR_TRUE);
  460. ASSERT_EQ(SECSuccess, rv);
  461. }
  462. }
  463. flow_->SignalPacketReceived.connect(this, &TransportTestPeer::PacketReceived);
  464. }
  465. void TweakCiphers(PRFileDesc* fd) {
  466. for (auto it = enabled_cipersuites_.begin();
  467. it != enabled_cipersuites_.end(); ++it) {
  468. SSL_CipherPrefSet(fd, *it, PR_TRUE);
  469. }
  470. for (auto it = disabled_cipersuites_.begin();
  471. it != disabled_cipersuites_.end(); ++it) {
  472. SSL_CipherPrefSet(fd, *it, PR_FALSE);
  473. }
  474. }
  475. void ConnectSocket(TransportTestPeer *peer) {
  476. RUN_ON_THREAD(test_utils_->sts_target(),
  477. WrapRunnable(this, & TransportTestPeer::ConnectSocket_s,
  478. peer),
  479. NS_DISPATCH_SYNC);
  480. }
  481. void InitIce() {
  482. nsresult res;
  483. // Attach our slots
  484. ice_ctx_->ctx()->SignalGatheringStateChange.
  485. connect(this, &TransportTestPeer::GatheringStateChange);
  486. char name[100];
  487. snprintf(name, sizeof(name), "%s:stream%d", name_.c_str(),
  488. (int)streams_.size());
  489. // Create the media stream
  490. RefPtr<NrIceMediaStream> stream =
  491. ice_ctx_->CreateStream(static_cast<char *>(name), 1);
  492. ASSERT_TRUE(stream != nullptr);
  493. ice_ctx_->ctx()->SetStream(streams_.size(), stream);
  494. streams_.push_back(stream);
  495. // Listen for candidates
  496. stream->SignalCandidate.
  497. connect(this, &TransportTestPeer::GotCandidate);
  498. // Create the transport layer
  499. ice_ = new TransportLayerIce(name);
  500. ice_->SetParameters(ice_ctx_->ctx(), stream, 1);
  501. // Assemble the stack
  502. nsAutoPtr<std::queue<mozilla::TransportLayer *> > layers(
  503. new std::queue<mozilla::TransportLayer *>);
  504. layers->push(ice_);
  505. layers->push(dtls_);
  506. test_utils_->sts_target()->Dispatch(
  507. WrapRunnableRet(&res, flow_, &TransportFlow::PushLayers, layers),
  508. NS_DISPATCH_SYNC);
  509. ASSERT_EQ((nsresult)NS_OK, res);
  510. // Listen for media events
  511. flow_->SignalPacketReceived.connect(this, &TransportTestPeer::PacketReceived);
  512. flow_->SignalStateChange.connect(this, &TransportTestPeer::StateChanged);
  513. // Start gathering
  514. test_utils_->sts_target()->Dispatch(
  515. WrapRunnableRet(&res,
  516. ice_ctx_->ctx(),
  517. &NrIceCtx::StartGathering,
  518. false,
  519. false),
  520. NS_DISPATCH_SYNC);
  521. ASSERT_TRUE(NS_SUCCEEDED(res));
  522. }
  523. void ConnectIce(TransportTestPeer *peer) {
  524. peer_ = peer;
  525. // If gathering is already complete, push the candidates over
  526. if (gathering_complete_)
  527. GatheringComplete();
  528. }
  529. // New candidate
  530. void GotCandidate(NrIceMediaStream *stream, const std::string &candidate) {
  531. std::cerr << "Got candidate " << candidate << std::endl;
  532. candidates_[stream->name()].push_back(candidate);
  533. }
  534. void GatheringStateChange(NrIceCtx* ctx,
  535. NrIceCtx::GatheringState state) {
  536. (void)ctx;
  537. if (state == NrIceCtx::ICE_CTX_GATHER_COMPLETE) {
  538. GatheringComplete();
  539. }
  540. }
  541. // Gathering complete, so send our candidates and start
  542. // connecting on the other peer.
  543. void GatheringComplete() {
  544. nsresult res;
  545. // Don't send to the other side
  546. if (!peer_) {
  547. gathering_complete_ = true;
  548. return;
  549. }
  550. // First send attributes
  551. test_utils_->sts_target()->Dispatch(
  552. WrapRunnableRet(&res, peer_->ice_ctx_->ctx(),
  553. &NrIceCtx::ParseGlobalAttributes,
  554. ice_ctx_->ctx()->GetGlobalAttributes()),
  555. NS_DISPATCH_SYNC);
  556. ASSERT_TRUE(NS_SUCCEEDED(res));
  557. for (size_t i=0; i<streams_.size(); ++i) {
  558. test_utils_->sts_target()->Dispatch(
  559. WrapRunnableRet(&res, peer_->streams_[i], &NrIceMediaStream::ParseAttributes,
  560. candidates_[streams_[i]->name()]), NS_DISPATCH_SYNC);
  561. ASSERT_TRUE(NS_SUCCEEDED(res));
  562. }
  563. // Start checks on the other peer.
  564. test_utils_->sts_target()->Dispatch(
  565. WrapRunnableRet(&res, peer_->ice_ctx_->ctx(), &NrIceCtx::StartChecks),
  566. NS_DISPATCH_SYNC);
  567. ASSERT_TRUE(NS_SUCCEEDED(res));
  568. }
  569. TransportResult SendPacket(const unsigned char* data, size_t len) {
  570. TransportResult ret;
  571. test_utils_->sts_target()->Dispatch(
  572. WrapRunnableRet(&ret, flow_, &TransportFlow::SendPacket, data, len),
  573. NS_DISPATCH_SYNC);
  574. return ret;
  575. }
  576. void StateChanged(TransportFlow *flow, TransportLayer::State state) {
  577. if (state == TransportLayer::TS_OPEN) {
  578. std::cerr << "Now connected" << std::endl;
  579. }
  580. }
  581. void PacketReceived(TransportFlow * flow, const unsigned char* data,
  582. size_t len) {
  583. std::cerr << "Received " << len << " bytes" << std::endl;
  584. ++received_packets_;
  585. received_bytes_ += len;
  586. }
  587. void SetLoss(uint32_t loss) {
  588. lossy_->SetLoss(loss);
  589. }
  590. void SetCombinePackets(bool combine) {
  591. loopback_->CombinePackets(combine);
  592. }
  593. void SetInspector(UniquePtr<Inspector> inspector) {
  594. lossy_->SetInspector(Move(inspector));
  595. }
  596. void SetInspector(Inspector* in) {
  597. UniquePtr<Inspector> inspector(in);
  598. lossy_->SetInspector(Move(inspector));
  599. }
  600. void SetCipherSuiteChanges(const std::vector<uint16_t>& enableThese,
  601. const std::vector<uint16_t>& disableThese) {
  602. disabled_cipersuites_ = disableThese;
  603. enabled_cipersuites_ = enableThese;
  604. }
  605. void SetReuseECDHEKey() {
  606. reuse_dhe_key_ = true;
  607. }
  608. TransportLayer::State state() {
  609. TransportLayer::State tstate;
  610. RUN_ON_THREAD(test_utils_->sts_target(),
  611. WrapRunnableRet(&tstate, flow_, &TransportFlow::state));
  612. return tstate;
  613. }
  614. bool connected() {
  615. return state() == TransportLayer::TS_OPEN;
  616. }
  617. bool failed() {
  618. return state() == TransportLayer::TS_ERROR;
  619. }
  620. size_t receivedPackets() { return received_packets_; }
  621. size_t receivedBytes() { return received_bytes_; }
  622. uint16_t cipherSuite() const {
  623. nsresult rv;
  624. uint16_t cipher;
  625. RUN_ON_THREAD(test_utils_->sts_target(),
  626. WrapRunnableRet(&rv, dtls_, &TransportLayerDtls::GetCipherSuite,
  627. &cipher));
  628. if (NS_FAILED(rv)) {
  629. return TLS_NULL_WITH_NULL_NULL; // i.e., not good
  630. }
  631. return cipher;
  632. }
  633. uint16_t srtpCipher() const {
  634. nsresult rv;
  635. uint16_t cipher;
  636. RUN_ON_THREAD(test_utils_->sts_target(),
  637. WrapRunnableRet(&rv, dtls_, &TransportLayerDtls::GetSrtpCipher,
  638. &cipher));
  639. if (NS_FAILED(rv)) {
  640. return 0; // the SRTP equivalent of TLS_NULL_WITH_NULL_NULL
  641. }
  642. return cipher;
  643. }
  644. private:
  645. std::string name_;
  646. nsCOMPtr<nsIEventTarget> target_;
  647. size_t received_packets_;
  648. size_t received_bytes_;
  649. RefPtr<TransportFlow> flow_;
  650. TransportLayerLoopback *loopback_;
  651. TransportLayerLogging *logging_;
  652. TransportLayerLossy *lossy_;
  653. TransportLayerDtls *dtls_;
  654. TransportLayerIce *ice_;
  655. RefPtr<DtlsIdentity> identity_;
  656. RefPtr<NrIceCtxHandler> ice_ctx_;
  657. std::vector<RefPtr<NrIceMediaStream> > streams_;
  658. std::map<std::string, std::vector<std::string> > candidates_;
  659. TransportTestPeer *peer_;
  660. bool gathering_complete_;
  661. unsigned char fingerprint_[TransportLayerDtls::kMaxDigestLength];
  662. size_t fingerprint_len_;
  663. std::vector<uint16_t> enabled_cipersuites_;
  664. std::vector<uint16_t> disabled_cipersuites_;
  665. bool reuse_dhe_key_;
  666. MtransportTestUtils* test_utils_;
  667. };
  668. class TransportTest : public MtransportTest {
  669. public:
  670. TransportTest() {
  671. fds_[0] = nullptr;
  672. fds_[1] = nullptr;
  673. }
  674. void TearDown() override {
  675. delete p1_;
  676. delete p2_;
  677. // Can't detach these
  678. // PR_Close(fds_[0]);
  679. // PR_Close(fds_[1]);
  680. MtransportTest::TearDown();
  681. }
  682. void DestroyPeerFlows() {
  683. p1_->DisconnectDestroyFlow();
  684. p2_->DisconnectDestroyFlow();
  685. }
  686. void SetUp() override {
  687. MtransportTest::SetUp();
  688. nsresult rv;
  689. target_ = do_GetService(NS_SOCKETTRANSPORTSERVICE_CONTRACTID, &rv);
  690. ASSERT_TRUE(NS_SUCCEEDED(rv));
  691. Reset();
  692. }
  693. void Reset() {
  694. p1_ = new TransportTestPeer(target_, "P1", test_utils_);
  695. p2_ = new TransportTestPeer(target_, "P2", test_utils_);
  696. }
  697. void SetupSrtp() {
  698. p1_->SetupSrtp();
  699. p2_->SetupSrtp();
  700. }
  701. void SetDtlsPeer(int digests = 1, unsigned int damage = 0) {
  702. p1_->SetDtlsPeer(p2_, digests, damage);
  703. p2_->SetDtlsPeer(p1_, digests, damage);
  704. }
  705. void SetDtlsAllowAll() {
  706. p1_->SetDtlsAllowAll();
  707. p2_->SetDtlsAllowAll();
  708. }
  709. void SetAlpn(std::string first, std::string second,
  710. bool withDefaults = true) {
  711. if (!first.empty()) {
  712. p1_->SetAlpn(first, withDefaults, "bogus");
  713. }
  714. if (!second.empty()) {
  715. p2_->SetAlpn(second, withDefaults);
  716. }
  717. }
  718. void CheckAlpn(std::string first, std::string second) {
  719. ASSERT_EQ(first, p1_->GetAlpn());
  720. ASSERT_EQ(second, p2_->GetAlpn());
  721. }
  722. void ConnectSocket() {
  723. ConnectSocketInternal();
  724. ASSERT_TRUE_WAIT(p1_->connected(), 10000);
  725. ASSERT_TRUE_WAIT(p2_->connected(), 10000);
  726. ASSERT_EQ(p1_->cipherSuite(), p2_->cipherSuite());
  727. ASSERT_EQ(p1_->srtpCipher(), p2_->srtpCipher());
  728. }
  729. void ConnectSocketExpectFail() {
  730. ConnectSocketInternal();
  731. ASSERT_TRUE_WAIT(p1_->failed(), 10000);
  732. ASSERT_TRUE_WAIT(p2_->failed(), 10000);
  733. }
  734. void ConnectSocketExpectState(TransportLayer::State s1,
  735. TransportLayer::State s2) {
  736. ConnectSocketInternal();
  737. ASSERT_EQ_WAIT(s1, p1_->state(), 10000);
  738. ASSERT_EQ_WAIT(s2, p2_->state(), 10000);
  739. }
  740. void InitIce() {
  741. p1_->InitIce();
  742. p2_->InitIce();
  743. }
  744. void ConnectIce() {
  745. p1_->InitIce();
  746. p2_->InitIce();
  747. p1_->ConnectIce(p2_);
  748. p2_->ConnectIce(p1_);
  749. ASSERT_TRUE_WAIT(p1_->connected(), 10000);
  750. ASSERT_TRUE_WAIT(p2_->connected(), 10000);
  751. }
  752. void TransferTest(size_t count, size_t bytes = 1024) {
  753. unsigned char buf[bytes];
  754. for (size_t i= 0; i<count; ++i) {
  755. memset(buf, count & 0xff, sizeof(buf));
  756. TransportResult rv = p1_->SendPacket(buf, sizeof(buf));
  757. ASSERT_TRUE(rv > 0);
  758. }
  759. std::cerr << "Received == " << p2_->receivedPackets() << " packets" << std::endl;
  760. ASSERT_TRUE_WAIT(count == p2_->receivedPackets(), 10000);
  761. ASSERT_TRUE((count * sizeof(buf)) == p2_->receivedBytes());
  762. }
  763. protected:
  764. void ConnectSocketInternal() {
  765. test_utils_->sts_target()->Dispatch(
  766. WrapRunnable(p1_, &TransportTestPeer::ConnectSocket, p2_),
  767. NS_DISPATCH_SYNC);
  768. test_utils_->sts_target()->Dispatch(
  769. WrapRunnable(p2_, &TransportTestPeer::ConnectSocket, p1_),
  770. NS_DISPATCH_SYNC);
  771. }
  772. PRFileDesc *fds_[2];
  773. TransportTestPeer *p1_;
  774. TransportTestPeer *p2_;
  775. nsCOMPtr<nsIEventTarget> target_;
  776. };
  777. TEST_F(TransportTest, TestNoDtlsVerificationSettings) {
  778. ConnectSocketExpectFail();
  779. }
  780. static void DisableChaCha(TransportTestPeer* peer) {
  781. // On ARM, ChaCha20Poly1305 might be preferred; disable it for the tests that
  782. // want to check the cipher suite. It doesn't matter which peer disables the
  783. // suite, disabling on either side has the same effect.
  784. std::vector<uint16_t> chachaSuites;
  785. chachaSuites.push_back(TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256);
  786. chachaSuites.push_back(TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256);
  787. peer->SetCipherSuiteChanges(std::vector<uint16_t>(), chachaSuites);
  788. }
  789. TEST_F(TransportTest, TestConnect) {
  790. SetDtlsPeer();
  791. DisableChaCha(p1_);
  792. ConnectSocket();
  793. // check that we got the right suite
  794. ASSERT_EQ(TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, p1_->cipherSuite());
  795. // no SRTP on this one
  796. ASSERT_EQ(0, p1_->srtpCipher());
  797. }
  798. TEST_F(TransportTest, TestConnectSrtp) {
  799. SetupSrtp();
  800. SetDtlsPeer();
  801. DisableChaCha(p2_);
  802. ConnectSocket();
  803. ASSERT_EQ(TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, p1_->cipherSuite());
  804. // SRTP is on
  805. ASSERT_EQ(SRTP_AES128_CM_HMAC_SHA1_80, p1_->srtpCipher());
  806. }
  807. TEST_F(TransportTest, TestConnectDestroyFlowsMainThread) {
  808. SetDtlsPeer();
  809. ConnectSocket();
  810. DestroyPeerFlows();
  811. }
  812. TEST_F(TransportTest, TestConnectAllowAll) {
  813. SetDtlsAllowAll();
  814. ConnectSocket();
  815. }
  816. TEST_F(TransportTest, TestConnectAlpn) {
  817. SetDtlsPeer();
  818. SetAlpn("a", "a");
  819. ConnectSocket();
  820. CheckAlpn("a", "a");
  821. }
  822. TEST_F(TransportTest, TestConnectAlpnMismatch) {
  823. SetDtlsPeer();
  824. SetAlpn("something", "different");
  825. ConnectSocketExpectFail();
  826. }
  827. TEST_F(TransportTest, TestConnectAlpnServerDefault) {
  828. SetDtlsPeer();
  829. SetAlpn("def", "");
  830. // server allows default, client doesn't support
  831. ConnectSocket();
  832. CheckAlpn("def", "");
  833. }
  834. TEST_F(TransportTest, TestConnectAlpnClientDefault) {
  835. SetDtlsPeer();
  836. SetAlpn("", "clientdef");
  837. // client allows default, but server will ignore the extension
  838. ConnectSocket();
  839. CheckAlpn("", "clientdef");
  840. }
  841. TEST_F(TransportTest, TestConnectClientNoAlpn) {
  842. SetDtlsPeer();
  843. // Here the server has ALPN, but no default is allowed.
  844. // Reminder: p1 == server, p2 == client
  845. SetAlpn("server-nodefault", "", false);
  846. // The server doesn't see the extension, so negotiates without it.
  847. // But then the server is forced to close when it discovers that ALPN wasn't
  848. // negotiated; the client sees a close.
  849. ConnectSocketExpectState(TransportLayer::TS_ERROR,
  850. TransportLayer::TS_CLOSED);
  851. }
  852. TEST_F(TransportTest, TestConnectServerNoAlpn) {
  853. SetDtlsPeer();
  854. SetAlpn("", "client-nodefault", false);
  855. // The client aborts; the server doesn't realize this is a problem and just
  856. // sees the close.
  857. ConnectSocketExpectState(TransportLayer::TS_CLOSED,
  858. TransportLayer::TS_ERROR);
  859. }
  860. TEST_F(TransportTest, TestConnectNoDigest) {
  861. SetDtlsPeer(0, 0);
  862. ConnectSocketExpectFail();
  863. }
  864. TEST_F(TransportTest, TestConnectBadDigest) {
  865. SetDtlsPeer(1, 1);
  866. ConnectSocketExpectFail();
  867. }
  868. TEST_F(TransportTest, TestConnectTwoDigests) {
  869. SetDtlsPeer(2, 0);
  870. ConnectSocket();
  871. }
  872. TEST_F(TransportTest, TestConnectTwoDigestsFirstBad) {
  873. SetDtlsPeer(2, 1);
  874. ConnectSocket();
  875. }
  876. TEST_F(TransportTest, TestConnectTwoDigestsSecondBad) {
  877. SetDtlsPeer(2, 2);
  878. ConnectSocket();
  879. }
  880. TEST_F(TransportTest, TestConnectTwoDigestsBothBad) {
  881. SetDtlsPeer(2, 3);
  882. ConnectSocketExpectFail();
  883. }
  884. TEST_F(TransportTest, TestConnectInjectCCS) {
  885. SetDtlsPeer();
  886. p2_->SetInspector(MakeUnique<DtlsInspectorInjector>(
  887. kTlsHandshakeType,
  888. kTlsHandshakeCertificate,
  889. kTlsFakeChangeCipherSpec,
  890. sizeof(kTlsFakeChangeCipherSpec)));
  891. ConnectSocket();
  892. }
  893. TEST_F(TransportTest, TestConnectVerifyNewECDHE) {
  894. SetDtlsPeer();
  895. DtlsInspectorRecordHandshakeMessage *i1 = new
  896. DtlsInspectorRecordHandshakeMessage(kTlsHandshakeServerKeyExchange);
  897. p1_->SetInspector(i1);
  898. ConnectSocket();
  899. TlsServerKeyExchangeECDHE dhe1;
  900. ASSERT_TRUE(dhe1.Parse(i1->buffer().data(), i1->buffer().len()));
  901. Reset();
  902. SetDtlsPeer();
  903. DtlsInspectorRecordHandshakeMessage *i2 = new
  904. DtlsInspectorRecordHandshakeMessage(kTlsHandshakeServerKeyExchange);
  905. p1_->SetInspector(i2);
  906. ConnectSocket();
  907. TlsServerKeyExchangeECDHE dhe2;
  908. ASSERT_TRUE(dhe2.Parse(i2->buffer().data(), i2->buffer().len()));
  909. // Now compare these two to see if they are the same.
  910. ASSERT_FALSE((dhe1.public_key_.len() == dhe2.public_key_.len()) &&
  911. (!memcmp(dhe1.public_key_.data(), dhe2.public_key_.data(),
  912. dhe1.public_key_.len())));
  913. }
  914. TEST_F(TransportTest, TestConnectVerifyReusedECDHE) {
  915. SetDtlsPeer();
  916. DtlsInspectorRecordHandshakeMessage *i1 = new
  917. DtlsInspectorRecordHandshakeMessage(kTlsHandshakeServerKeyExchange);
  918. p1_->SetInspector(i1);
  919. p1_->SetReuseECDHEKey();
  920. ConnectSocket();
  921. TlsServerKeyExchangeECDHE dhe1;
  922. ASSERT_TRUE(dhe1.Parse(i1->buffer().data(), i1->buffer().len()));
  923. Reset();
  924. SetDtlsPeer();
  925. DtlsInspectorRecordHandshakeMessage *i2 = new
  926. DtlsInspectorRecordHandshakeMessage(kTlsHandshakeServerKeyExchange);
  927. p1_->SetInspector(i2);
  928. p1_->SetReuseECDHEKey();
  929. ConnectSocket();
  930. TlsServerKeyExchangeECDHE dhe2;
  931. ASSERT_TRUE(dhe2.Parse(i2->buffer().data(), i2->buffer().len()));
  932. // Now compare these two to see if they are the same.
  933. ASSERT_EQ(dhe1.public_key_.len(), dhe2.public_key_.len());
  934. ASSERT_TRUE(!memcmp(dhe1.public_key_.data(), dhe2.public_key_.data(),
  935. dhe1.public_key_.len()));
  936. }
  937. TEST_F(TransportTest, TestTransfer) {
  938. SetDtlsPeer();
  939. ConnectSocket();
  940. TransferTest(1);
  941. }
  942. TEST_F(TransportTest, TestTransferMaxSize) {
  943. SetDtlsPeer();
  944. ConnectSocket();
  945. /* transportlayerdtls uses a 9216 bytes buffer - as this test uses the
  946. * loopback implementation it does not have to take into account the extra
  947. * bytes added by the DTLS layer below. */
  948. TransferTest(1, 9216);
  949. }
  950. TEST_F(TransportTest, TestTransferMultiple) {
  951. SetDtlsPeer();
  952. ConnectSocket();
  953. TransferTest(3);
  954. }
  955. TEST_F(TransportTest, TestTransferCombinedPackets) {
  956. SetDtlsPeer();
  957. ConnectSocket();
  958. p2_->SetCombinePackets(true);
  959. TransferTest(3);
  960. }
  961. TEST_F(TransportTest, TestConnectLoseFirst) {
  962. SetDtlsPeer();
  963. p1_->SetLoss(0);
  964. ConnectSocket();
  965. TransferTest(1);
  966. }
  967. TEST_F(TransportTest, TestConnectIce) {
  968. SetDtlsPeer();
  969. ConnectIce();
  970. }
  971. TEST_F(TransportTest, TestTransferIceMaxSize) {
  972. SetDtlsPeer();
  973. ConnectIce();
  974. /* nICEr and transportlayerdtls both use 9216 bytes buffers. But the DTLS
  975. * layer add extra bytes to the packet, which size depends on chosen cipher
  976. * etc. Sending more then 9216 bytes works, but on the receiving side the call
  977. * to PR_recvfrom() will truncate any packet bigger then nICEr's buffer size
  978. * of 9216 bytes, which then results in the DTLS layer discarding the packet.
  979. * Therefore we leave some headroom (according to
  980. * https://bugzilla.mozilla.org/show_bug.cgi?id=1214269#c29 256 bytes should
  981. * be save choice) here for the DTLS bytes to make it safely into the
  982. * receiving buffer in nICEr. */
  983. TransferTest(1, 8960);
  984. }
  985. TEST_F(TransportTest, TestTransferIceMultiple) {
  986. SetDtlsPeer();
  987. ConnectIce();
  988. TransferTest(3);
  989. }
  990. TEST_F(TransportTest, TestTransferIceCombinedPackets) {
  991. SetDtlsPeer();
  992. ConnectIce();
  993. p2_->SetCombinePackets(true);
  994. TransferTest(3);
  995. }
  996. // test the default configuration against a peer that supports only
  997. // one of the mandatory-to-implement suites, which should succeed
  998. static void ConfigureOneCipher(TransportTestPeer* peer, uint16_t suite) {
  999. std::vector<uint16_t> justOne;
  1000. justOne.push_back(suite);
  1001. std::vector<uint16_t> everythingElse(SSL_GetImplementedCiphers(),
  1002. SSL_GetImplementedCiphers()
  1003. + SSL_GetNumImplementedCiphers());
  1004. std::remove(everythingElse.begin(), everythingElse.end(), suite);
  1005. peer->SetCipherSuiteChanges(justOne, everythingElse);
  1006. }
  1007. TEST_F(TransportTest, TestCipherMismatch) {
  1008. SetDtlsPeer();
  1009. ConfigureOneCipher(p1_, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256);
  1010. ConfigureOneCipher(p2_, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA);
  1011. ConnectSocketExpectFail();
  1012. }
  1013. TEST_F(TransportTest, TestCipherMandatoryOnlyGcm) {
  1014. SetDtlsPeer();
  1015. ConfigureOneCipher(p1_, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256);
  1016. ConnectSocket();
  1017. ASSERT_EQ(TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, p1_->cipherSuite());
  1018. }
  1019. TEST_F(TransportTest, TestCipherMandatoryOnlyCbc) {
  1020. SetDtlsPeer();
  1021. ConfigureOneCipher(p1_, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA);
  1022. ConnectSocket();
  1023. ASSERT_EQ(TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, p1_->cipherSuite());
  1024. }
  1025. TEST_F(TransportTest, TestSrtpMismatch) {
  1026. std::vector<uint16_t> setA;
  1027. setA.push_back(SRTP_AES128_CM_HMAC_SHA1_80);
  1028. std::vector<uint16_t> setB;
  1029. setB.push_back(SRTP_AES128_CM_HMAC_SHA1_32);
  1030. p1_->SetSrtpCiphers(setA);
  1031. p2_->SetSrtpCiphers(setB);
  1032. SetDtlsPeer();
  1033. ConnectSocket();
  1034. ASSERT_EQ(0, p1_->srtpCipher());
  1035. ASSERT_EQ(0, p2_->srtpCipher());
  1036. }
  1037. // NSS doesn't support DHE suites on the server end.
  1038. // This checks to see if we barf when that's the only option available.
  1039. TEST_F(TransportTest, TestDheOnlyFails) {
  1040. SetDtlsPeer();
  1041. // p2_ is the client
  1042. // setting this on p1_ (the server) causes NSS to assert
  1043. ConfigureOneCipher(p2_, TLS_DHE_RSA_WITH_AES_128_CBC_SHA);
  1044. ConnectSocketExpectFail();
  1045. }
  1046. TEST(PushTests, LayerFail) {
  1047. RefPtr<TransportFlow> flow = new TransportFlow();
  1048. nsresult rv;
  1049. bool destroyed1, destroyed2;
  1050. rv = flow->PushLayer(new TransportLayerDummy(true, &destroyed1));
  1051. ASSERT_TRUE(NS_SUCCEEDED(rv));
  1052. rv = flow->PushLayer(new TransportLayerDummy(false, &destroyed2));
  1053. ASSERT_TRUE(NS_FAILED(rv));
  1054. ASSERT_EQ(TransportLayer::TS_ERROR, flow->state());
  1055. ASSERT_EQ(true, destroyed1);
  1056. ASSERT_EQ(true, destroyed2);
  1057. rv = flow->PushLayer(new TransportLayerDummy(true, &destroyed1));
  1058. ASSERT_TRUE(NS_FAILED(rv));
  1059. ASSERT_EQ(true, destroyed1);
  1060. }
  1061. TEST(PushTests, LayersFail) {
  1062. RefPtr<TransportFlow> flow = new TransportFlow();
  1063. nsresult rv;
  1064. bool destroyed1, destroyed2, destroyed3;
  1065. rv = flow->PushLayer(new TransportLayerDummy(true, &destroyed1));
  1066. ASSERT_TRUE(NS_SUCCEEDED(rv));
  1067. nsAutoPtr<std::queue<TransportLayer *> > layers(
  1068. new std::queue<TransportLayer *>());
  1069. layers->push(new TransportLayerDummy(true, &destroyed2));
  1070. layers->push(new TransportLayerDummy(false, &destroyed3));
  1071. rv = flow->PushLayers(layers);
  1072. ASSERT_TRUE(NS_FAILED(rv));
  1073. ASSERT_EQ(TransportLayer::TS_ERROR, flow->state());
  1074. ASSERT_EQ(true, destroyed1);
  1075. ASSERT_EQ(true, destroyed2);
  1076. ASSERT_EQ(true, destroyed3);
  1077. layers = new std::queue<TransportLayer *>();
  1078. layers->push(new TransportLayerDummy(true, &destroyed2));
  1079. layers->push(new TransportLayerDummy(true, &destroyed3));
  1080. rv = flow->PushLayers(layers);
  1081. ASSERT_TRUE(NS_FAILED(rv));
  1082. ASSERT_EQ(true, destroyed2);
  1083. ASSERT_EQ(true, destroyed3);
  1084. }
  1085. } // end namespace