AsyncSSLSocketTest.cpp 83 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684
  1. /*
  2. * Copyright 2011-present Facebook, Inc.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #include <folly/io/async/test/AsyncSSLSocketTest.h>
  17. #include <folly/SocketAddress.h>
  18. #include <folly/String.h>
  19. #include <folly/io/Cursor.h>
  20. #include <folly/io/async/AsyncPipe.h>
  21. #include <folly/io/async/AsyncSSLSocket.h>
  22. #include <folly/io/async/EventBase.h>
  23. #include <folly/io/async/ScopedEventBaseThread.h>
  24. #include <folly/portability/GMock.h>
  25. #include <folly/portability/GTest.h>
  26. #include <folly/portability/OpenSSL.h>
  27. #include <folly/portability/Sockets.h>
  28. #include <folly/portability/Unistd.h>
  29. #include <folly/ssl/Init.h>
  30. #include <folly/io/async/test/BlockingSocket.h>
  31. #include <dlfcn.h>
  32. #include <fcntl.h>
  33. #include <signal.h>
  34. #include <sys/types.h>
  35. #include <fstream>
  36. #include <iostream>
  37. #include <list>
  38. #include <set>
  39. #include <thread>
  40. #if FOLLY_OPENSSL_IS_110
  41. #include <openssl/async.h>
  42. #endif
  43. #ifdef FOLLY_HAVE_MSG_ERRQUEUE
  44. #include <sys/utsname.h>
  45. #endif
  46. using std::cerr;
  47. using std::endl;
  48. using std::list;
  49. using std::min;
  50. using std::string;
  51. using std::vector;
  52. using namespace testing;
  53. #if defined __linux__
  54. namespace {
  55. // to store libc's original setsockopt()
  56. typedef int (*setsockopt_ptr)(int, int, int, const void*, socklen_t);
  57. setsockopt_ptr real_setsockopt_ = nullptr;
  58. // global struct to initialize before main runs. we can init within a test,
  59. // or in main, but this method seems to be least intrsive and universal
  60. struct GlobalStatic {
  61. GlobalStatic() {
  62. real_setsockopt_ = (setsockopt_ptr)dlsym(RTLD_NEXT, "setsockopt");
  63. }
  64. void reset() noexcept {
  65. ttlsDisabledSet.clear();
  66. }
  67. // for each fd, tracks whether TTLS is disabled or not
  68. std::set<int /* fd */> ttlsDisabledSet;
  69. };
  70. // the constructor will be called before main() which is all we care about
  71. GlobalStatic globalStatic;
  72. } // namespace
  73. // we intercept setsoctopt to test setting NO_TRANSPARENT_TLS opt
  74. // this name has to be global
  75. int setsockopt(
  76. int sockfd,
  77. int level,
  78. int optname,
  79. const void* optval,
  80. socklen_t optlen) {
  81. if (optname == SO_NO_TRANSPARENT_TLS) {
  82. globalStatic.ttlsDisabledSet.insert(sockfd);
  83. return 0;
  84. }
  85. return real_setsockopt_(sockfd, level, optname, optval, optlen);
  86. }
  87. #endif
  88. namespace folly {
  89. uint32_t TestSSLAsyncCacheServer::asyncCallbacks_ = 0;
  90. uint32_t TestSSLAsyncCacheServer::asyncLookups_ = 0;
  91. uint32_t TestSSLAsyncCacheServer::lookupDelay_ = 0;
  92. constexpr size_t SSLClient::kMaxReadBufferSz;
  93. constexpr size_t SSLClient::kMaxReadsPerEvent;
  94. void getfds(int fds[2]) {
  95. if (socketpair(PF_LOCAL, SOCK_STREAM, 0, fds) != 0) {
  96. FAIL() << "failed to create socketpair: " << errnoStr(errno);
  97. }
  98. for (int idx = 0; idx < 2; ++idx) {
  99. int flags = fcntl(fds[idx], F_GETFL, 0);
  100. if (flags == -1) {
  101. FAIL() << "failed to get flags for socket " << idx << ": "
  102. << errnoStr(errno);
  103. }
  104. if (fcntl(fds[idx], F_SETFL, flags | O_NONBLOCK) != 0) {
  105. FAIL() << "failed to put socket " << idx
  106. << " in non-blocking mode: " << errnoStr(errno);
  107. }
  108. }
  109. }
  110. void getctx(
  111. std::shared_ptr<folly::SSLContext> clientCtx,
  112. std::shared_ptr<folly::SSLContext> serverCtx) {
  113. clientCtx->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  114. serverCtx->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  115. serverCtx->loadCertificate(kTestCert);
  116. serverCtx->loadPrivateKey(kTestKey);
  117. }
  118. void sslsocketpair(
  119. EventBase* eventBase,
  120. AsyncSSLSocket::UniquePtr* clientSock,
  121. AsyncSSLSocket::UniquePtr* serverSock) {
  122. auto clientCtx = std::make_shared<folly::SSLContext>();
  123. auto serverCtx = std::make_shared<folly::SSLContext>();
  124. int fds[2];
  125. getfds(fds);
  126. getctx(clientCtx, serverCtx);
  127. clientSock->reset(new AsyncSSLSocket(clientCtx, eventBase, fds[0], false));
  128. serverSock->reset(new AsyncSSLSocket(serverCtx, eventBase, fds[1], true));
  129. // (*clientSock)->setSendTimeout(100);
  130. // (*serverSock)->setSendTimeout(100);
  131. }
  132. // client protocol filters
  133. bool clientProtoFilterPickPony(
  134. unsigned char** client,
  135. unsigned int* client_len,
  136. const unsigned char*,
  137. unsigned int) {
  138. // the protocol string in length prefixed byte string. the
  139. // length byte is not included in the length
  140. static unsigned char p[7] = {6, 'p', 'o', 'n', 'i', 'e', 's'};
  141. *client = p;
  142. *client_len = 7;
  143. return true;
  144. }
  145. bool clientProtoFilterPickNone(
  146. unsigned char**,
  147. unsigned int*,
  148. const unsigned char*,
  149. unsigned int) {
  150. return false;
  151. }
  152. std::string getFileAsBuf(const char* fileName) {
  153. std::string buffer;
  154. folly::readFile(fileName, buffer);
  155. return buffer;
  156. }
  157. /**
  158. * Test connecting to, writing to, reading from, and closing the
  159. * connection to the SSL server.
  160. */
  161. TEST(AsyncSSLSocketTest, ConnectWriteReadClose) {
  162. // Start listening on a local port
  163. WriteCallbackBase writeCallback;
  164. ReadCallback readCallback(&writeCallback);
  165. HandshakeCallback handshakeCallback(&readCallback);
  166. SSLServerAcceptCallback acceptCallback(&handshakeCallback);
  167. TestSSLServer server(&acceptCallback);
  168. // Set up SSL context.
  169. std::shared_ptr<SSLContext> sslContext(new SSLContext());
  170. sslContext->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  171. // sslContext->loadTrustedCertificates("./trusted-ca-certificate.pem");
  172. // sslContext->authenticate(true, false);
  173. // connect
  174. auto socket =
  175. std::make_shared<BlockingSocket>(server.getAddress(), sslContext);
  176. socket->open(std::chrono::milliseconds(10000));
  177. // write()
  178. uint8_t buf[128];
  179. memset(buf, 'a', sizeof(buf));
  180. socket->write(buf, sizeof(buf));
  181. // read()
  182. uint8_t readbuf[128];
  183. uint32_t bytesRead = socket->readAll(readbuf, sizeof(readbuf));
  184. EXPECT_EQ(bytesRead, 128);
  185. EXPECT_EQ(memcmp(buf, readbuf, bytesRead), 0);
  186. // close()
  187. socket->close();
  188. cerr << "ConnectWriteReadClose test completed" << endl;
  189. EXPECT_EQ(socket->getSSLSocket()->getTotalConnectTimeout().count(), 10000);
  190. }
  191. /**
  192. * Test reading after server close.
  193. */
  194. TEST(AsyncSSLSocketTest, ReadAfterClose) {
  195. // Start listening on a local port
  196. WriteCallbackBase writeCallback;
  197. ReadEOFCallback readCallback(&writeCallback);
  198. HandshakeCallback handshakeCallback(&readCallback);
  199. SSLServerAcceptCallback acceptCallback(&handshakeCallback);
  200. auto server = std::make_unique<TestSSLServer>(&acceptCallback);
  201. // Set up SSL context.
  202. auto sslContext = std::make_shared<SSLContext>();
  203. sslContext->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  204. auto socket =
  205. std::make_shared<BlockingSocket>(server->getAddress(), sslContext);
  206. socket->open();
  207. // This should trigger an EOF on the client.
  208. auto evb = handshakeCallback.getSocket()->getEventBase();
  209. evb->runInEventBaseThreadAndWait([&]() { handshakeCallback.closeSocket(); });
  210. std::array<uint8_t, 128> readbuf;
  211. auto bytesRead = socket->read(readbuf.data(), readbuf.size());
  212. EXPECT_EQ(0, bytesRead);
  213. }
  214. /**
  215. * Test bad renegotiation
  216. */
  217. #if !defined(OPENSSL_IS_BORINGSSL)
  218. TEST(AsyncSSLSocketTest, Renegotiate) {
  219. EventBase eventBase;
  220. auto clientCtx = std::make_shared<SSLContext>();
  221. auto dfServerCtx = std::make_shared<SSLContext>();
  222. std::array<int, 2> fds;
  223. getfds(fds.data());
  224. getctx(clientCtx, dfServerCtx);
  225. AsyncSSLSocket::UniquePtr clientSock(
  226. new AsyncSSLSocket(clientCtx, &eventBase, fds[0], false));
  227. AsyncSSLSocket::UniquePtr serverSock(
  228. new AsyncSSLSocket(dfServerCtx, &eventBase, fds[1], true));
  229. SSLHandshakeClient client(std::move(clientSock), true, true);
  230. RenegotiatingServer server(std::move(serverSock));
  231. while (!client.handshakeSuccess_ && !client.handshakeError_) {
  232. eventBase.loopOnce();
  233. }
  234. ASSERT_TRUE(client.handshakeSuccess_);
  235. auto sslSock = std::move(client).moveSocket();
  236. sslSock->detachEventBase();
  237. // This is nasty, however we don't want to add support for
  238. // renegotiation in AsyncSSLSocket.
  239. SSL_renegotiate(const_cast<SSL*>(sslSock->getSSL()));
  240. auto socket = std::make_shared<BlockingSocket>(std::move(sslSock));
  241. std::thread t([&]() { eventBase.loopForever(); });
  242. // Trigger the renegotiation.
  243. std::array<uint8_t, 128> buf;
  244. memset(buf.data(), 'a', buf.size());
  245. try {
  246. socket->write(buf.data(), buf.size());
  247. } catch (AsyncSocketException& e) {
  248. LOG(INFO) << "client got error " << e.what();
  249. }
  250. eventBase.terminateLoopSoon();
  251. t.join();
  252. eventBase.loop();
  253. ASSERT_TRUE(server.renegotiationError_);
  254. }
  255. #endif
  256. /**
  257. * Negative test for handshakeError().
  258. */
  259. TEST(AsyncSSLSocketTest, HandshakeError) {
  260. // Start listening on a local port
  261. WriteCallbackBase writeCallback;
  262. WriteErrorCallback readCallback(&writeCallback);
  263. HandshakeCallback handshakeCallback(&readCallback);
  264. HandshakeErrorCallback acceptCallback(&handshakeCallback);
  265. TestSSLServer server(&acceptCallback);
  266. // Set up SSL context.
  267. std::shared_ptr<SSLContext> sslContext(new SSLContext());
  268. sslContext->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  269. // connect
  270. auto socket =
  271. std::make_shared<BlockingSocket>(server.getAddress(), sslContext);
  272. // read()
  273. bool ex = false;
  274. try {
  275. socket->open();
  276. uint8_t readbuf[128];
  277. uint32_t bytesRead = socket->readAll(readbuf, sizeof(readbuf));
  278. LOG(ERROR) << "readAll returned " << bytesRead << " instead of throwing";
  279. } catch (AsyncSocketException&) {
  280. ex = true;
  281. }
  282. EXPECT_TRUE(ex);
  283. // close()
  284. socket->close();
  285. cerr << "HandshakeError test completed" << endl;
  286. }
  287. /**
  288. * Negative test for readError().
  289. */
  290. TEST(AsyncSSLSocketTest, ReadError) {
  291. // Start listening on a local port
  292. WriteCallbackBase writeCallback;
  293. ReadErrorCallback readCallback(&writeCallback);
  294. HandshakeCallback handshakeCallback(&readCallback);
  295. SSLServerAcceptCallback acceptCallback(&handshakeCallback);
  296. TestSSLServer server(&acceptCallback);
  297. // Set up SSL context.
  298. std::shared_ptr<SSLContext> sslContext(new SSLContext());
  299. sslContext->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  300. // connect
  301. auto socket =
  302. std::make_shared<BlockingSocket>(server.getAddress(), sslContext);
  303. socket->open();
  304. // write something to trigger ssl handshake
  305. uint8_t buf[128];
  306. memset(buf, 'a', sizeof(buf));
  307. socket->write(buf, sizeof(buf));
  308. socket->close();
  309. cerr << "ReadError test completed" << endl;
  310. }
  311. /**
  312. * Negative test for writeError().
  313. */
  314. TEST(AsyncSSLSocketTest, WriteError) {
  315. // Start listening on a local port
  316. WriteCallbackBase writeCallback;
  317. WriteErrorCallback readCallback(&writeCallback);
  318. HandshakeCallback handshakeCallback(&readCallback);
  319. SSLServerAcceptCallback acceptCallback(&handshakeCallback);
  320. TestSSLServer server(&acceptCallback);
  321. // Set up SSL context.
  322. std::shared_ptr<SSLContext> sslContext(new SSLContext());
  323. sslContext->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  324. // connect
  325. auto socket =
  326. std::make_shared<BlockingSocket>(server.getAddress(), sslContext);
  327. socket->open();
  328. // write something to trigger ssl handshake
  329. uint8_t buf[128];
  330. memset(buf, 'a', sizeof(buf));
  331. socket->write(buf, sizeof(buf));
  332. socket->close();
  333. cerr << "WriteError test completed" << endl;
  334. }
  335. /**
  336. * Test a socket with TCP_NODELAY unset.
  337. */
  338. TEST(AsyncSSLSocketTest, SocketWithDelay) {
  339. // Start listening on a local port
  340. WriteCallbackBase writeCallback;
  341. ReadCallback readCallback(&writeCallback);
  342. HandshakeCallback handshakeCallback(&readCallback);
  343. SSLServerAcceptCallbackDelay acceptCallback(&handshakeCallback);
  344. TestSSLServer server(&acceptCallback);
  345. // Set up SSL context.
  346. std::shared_ptr<SSLContext> sslContext(new SSLContext());
  347. sslContext->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  348. // connect
  349. auto socket =
  350. std::make_shared<BlockingSocket>(server.getAddress(), sslContext);
  351. socket->open();
  352. // write()
  353. uint8_t buf[128];
  354. memset(buf, 'a', sizeof(buf));
  355. socket->write(buf, sizeof(buf));
  356. // read()
  357. uint8_t readbuf[128];
  358. uint32_t bytesRead = socket->readAll(readbuf, sizeof(readbuf));
  359. EXPECT_EQ(bytesRead, 128);
  360. EXPECT_EQ(memcmp(buf, readbuf, bytesRead), 0);
  361. // close()
  362. socket->close();
  363. cerr << "SocketWithDelay test completed" << endl;
  364. }
  365. #if FOLLY_OPENSSL_HAS_ALPN
  366. class NextProtocolTest : public Test {
  367. // For matching protos
  368. public:
  369. void SetUp() override {
  370. getctx(clientCtx, serverCtx);
  371. }
  372. void connect(bool unset = false) {
  373. getfds(fds);
  374. if (unset) {
  375. // unsetting NPN for any of [client, server] is enough to make NPN not
  376. // work
  377. clientCtx->unsetNextProtocols();
  378. }
  379. AsyncSSLSocket::UniquePtr clientSock(
  380. new AsyncSSLSocket(clientCtx, &eventBase, fds[0], false));
  381. AsyncSSLSocket::UniquePtr serverSock(
  382. new AsyncSSLSocket(serverCtx, &eventBase, fds[1], true));
  383. client = std::make_unique<AlpnClient>(std::move(clientSock));
  384. server = std::make_unique<AlpnServer>(std::move(serverSock));
  385. eventBase.loop();
  386. }
  387. void expectProtocol(const std::string& proto) {
  388. expectHandshakeSuccess();
  389. EXPECT_NE(client->nextProtoLength, 0);
  390. EXPECT_EQ(client->nextProtoLength, server->nextProtoLength);
  391. EXPECT_EQ(
  392. memcmp(client->nextProto, server->nextProto, server->nextProtoLength),
  393. 0);
  394. string selected((const char*)client->nextProto, client->nextProtoLength);
  395. EXPECT_EQ(proto, selected);
  396. }
  397. void expectNoProtocol() {
  398. expectHandshakeSuccess();
  399. EXPECT_EQ(client->nextProtoLength, 0);
  400. EXPECT_EQ(server->nextProtoLength, 0);
  401. EXPECT_EQ(client->nextProto, nullptr);
  402. EXPECT_EQ(server->nextProto, nullptr);
  403. }
  404. void expectHandshakeSuccess() {
  405. EXPECT_FALSE(client->except.hasValue())
  406. << "client handshake error: " << client->except->what();
  407. EXPECT_FALSE(server->except.hasValue())
  408. << "server handshake error: " << server->except->what();
  409. }
  410. void expectHandshakeError() {
  411. EXPECT_TRUE(client->except.hasValue())
  412. << "Expected client handshake error!";
  413. EXPECT_TRUE(server->except.hasValue())
  414. << "Expected server handshake error!";
  415. }
  416. EventBase eventBase;
  417. std::shared_ptr<SSLContext> clientCtx{std::make_shared<SSLContext>()};
  418. std::shared_ptr<SSLContext> serverCtx{std::make_shared<SSLContext>()};
  419. int fds[2];
  420. std::unique_ptr<AlpnClient> client;
  421. std::unique_ptr<AlpnServer> server;
  422. };
  423. TEST_F(NextProtocolTest, AlpnTestOverlap) {
  424. clientCtx->setAdvertisedNextProtocols({"blub", "baz"});
  425. serverCtx->setAdvertisedNextProtocols({"foo", "bar", "baz"});
  426. connect();
  427. expectProtocol("baz");
  428. }
  429. TEST_F(NextProtocolTest, AlpnTestUnset) {
  430. // Identical to above test, except that we want unset NPN before
  431. // looping.
  432. clientCtx->setAdvertisedNextProtocols({"blub", "baz"});
  433. serverCtx->setAdvertisedNextProtocols({"foo", "bar", "baz"});
  434. connect(true /* unset */);
  435. expectNoProtocol();
  436. }
  437. TEST_F(NextProtocolTest, AlpnTestNoOverlap) {
  438. clientCtx->setAdvertisedNextProtocols({"blub"});
  439. serverCtx->setAdvertisedNextProtocols({"foo", "bar", "baz"});
  440. connect();
  441. expectNoProtocol();
  442. }
  443. TEST_F(NextProtocolTest, RandomizedAlpnTest) {
  444. // Probability that this test will fail is 2^-64, which could be considered
  445. // as negligible.
  446. const int kTries = 64;
  447. clientCtx->setAdvertisedNextProtocols({"foo", "bar", "baz"});
  448. serverCtx->setRandomizedAdvertisedNextProtocols({{1, {"foo"}}, {1, {"bar"}}});
  449. std::set<string> selectedProtocols;
  450. for (int i = 0; i < kTries; ++i) {
  451. connect();
  452. EXPECT_NE(client->nextProtoLength, 0);
  453. EXPECT_EQ(client->nextProtoLength, server->nextProtoLength);
  454. EXPECT_EQ(
  455. memcmp(client->nextProto, server->nextProto, server->nextProtoLength),
  456. 0);
  457. string selected((const char*)client->nextProto, client->nextProtoLength);
  458. selectedProtocols.insert(selected);
  459. expectHandshakeSuccess();
  460. }
  461. EXPECT_EQ(selectedProtocols.size(), 2);
  462. }
  463. #endif
  464. #ifndef OPENSSL_NO_TLSEXT
  465. /**
  466. * 1. Client sends TLSEXT_HOSTNAME in client hello.
  467. * 2. Server found a match SSL_CTX and use this SSL_CTX to
  468. * continue the SSL handshake.
  469. * 3. Server sends back TLSEXT_HOSTNAME in server hello.
  470. */
  471. TEST(AsyncSSLSocketTest, SNITestMatch) {
  472. EventBase eventBase;
  473. std::shared_ptr<SSLContext> clientCtx(new SSLContext);
  474. std::shared_ptr<SSLContext> dfServerCtx(new SSLContext);
  475. // Use the same SSLContext to continue the handshake after
  476. // tlsext_hostname match.
  477. std::shared_ptr<SSLContext> hskServerCtx(dfServerCtx);
  478. const std::string serverName("xyz.newdev.facebook.com");
  479. int fds[2];
  480. getfds(fds);
  481. getctx(clientCtx, dfServerCtx);
  482. AsyncSSLSocket::UniquePtr clientSock(
  483. new AsyncSSLSocket(clientCtx, &eventBase, fds[0], serverName));
  484. AsyncSSLSocket::UniquePtr serverSock(
  485. new AsyncSSLSocket(dfServerCtx, &eventBase, fds[1], true));
  486. SNIClient client(std::move(clientSock));
  487. SNIServer server(
  488. std::move(serverSock), dfServerCtx, hskServerCtx, serverName);
  489. eventBase.loop();
  490. EXPECT_TRUE(client.serverNameMatch);
  491. EXPECT_TRUE(server.serverNameMatch);
  492. }
  493. /**
  494. * 1. Client sends TLSEXT_HOSTNAME in client hello.
  495. * 2. Server cannot find a matching SSL_CTX and continue to use
  496. * the current SSL_CTX to do the handshake.
  497. * 3. Server does not send back TLSEXT_HOSTNAME in server hello.
  498. */
  499. TEST(AsyncSSLSocketTest, SNITestNotMatch) {
  500. EventBase eventBase;
  501. std::shared_ptr<SSLContext> clientCtx(new SSLContext);
  502. std::shared_ptr<SSLContext> dfServerCtx(new SSLContext);
  503. // Use the same SSLContext to continue the handshake after
  504. // tlsext_hostname match.
  505. std::shared_ptr<SSLContext> hskServerCtx(dfServerCtx);
  506. const std::string clientRequestingServerName("foo.com");
  507. const std::string serverExpectedServerName("xyz.newdev.facebook.com");
  508. int fds[2];
  509. getfds(fds);
  510. getctx(clientCtx, dfServerCtx);
  511. AsyncSSLSocket::UniquePtr clientSock(new AsyncSSLSocket(
  512. clientCtx, &eventBase, fds[0], clientRequestingServerName));
  513. AsyncSSLSocket::UniquePtr serverSock(
  514. new AsyncSSLSocket(dfServerCtx, &eventBase, fds[1], true));
  515. SNIClient client(std::move(clientSock));
  516. SNIServer server(
  517. std::move(serverSock),
  518. dfServerCtx,
  519. hskServerCtx,
  520. serverExpectedServerName);
  521. eventBase.loop();
  522. EXPECT_TRUE(!client.serverNameMatch);
  523. EXPECT_TRUE(!server.serverNameMatch);
  524. }
  525. /**
  526. * 1. Client sends TLSEXT_HOSTNAME in client hello.
  527. * 2. We then change the serverName.
  528. * 3. We expect that we get 'false' as the result for serNameMatch.
  529. */
  530. TEST(AsyncSSLSocketTest, SNITestChangeServerName) {
  531. EventBase eventBase;
  532. std::shared_ptr<SSLContext> clientCtx(new SSLContext);
  533. std::shared_ptr<SSLContext> dfServerCtx(new SSLContext);
  534. // Use the same SSLContext to continue the handshake after
  535. // tlsext_hostname match.
  536. std::shared_ptr<SSLContext> hskServerCtx(dfServerCtx);
  537. const std::string serverName("xyz.newdev.facebook.com");
  538. int fds[2];
  539. getfds(fds);
  540. getctx(clientCtx, dfServerCtx);
  541. AsyncSSLSocket::UniquePtr clientSock(
  542. new AsyncSSLSocket(clientCtx, &eventBase, fds[0], serverName));
  543. // Change the server name
  544. std::string newName("new.com");
  545. clientSock->setServerName(newName);
  546. AsyncSSLSocket::UniquePtr serverSock(
  547. new AsyncSSLSocket(dfServerCtx, &eventBase, fds[1], true));
  548. SNIClient client(std::move(clientSock));
  549. SNIServer server(
  550. std::move(serverSock), dfServerCtx, hskServerCtx, serverName);
  551. eventBase.loop();
  552. EXPECT_TRUE(!client.serverNameMatch);
  553. }
  554. /**
  555. * 1. Client does not send TLSEXT_HOSTNAME in client hello.
  556. * 2. Server does not send back TLSEXT_HOSTNAME in server hello.
  557. */
  558. TEST(AsyncSSLSocketTest, SNITestClientHelloNoHostname) {
  559. EventBase eventBase;
  560. std::shared_ptr<SSLContext> clientCtx(new SSLContext);
  561. std::shared_ptr<SSLContext> dfServerCtx(new SSLContext);
  562. // Use the same SSLContext to continue the handshake after
  563. // tlsext_hostname match.
  564. std::shared_ptr<SSLContext> hskServerCtx(dfServerCtx);
  565. const std::string serverExpectedServerName("xyz.newdev.facebook.com");
  566. int fds[2];
  567. getfds(fds);
  568. getctx(clientCtx, dfServerCtx);
  569. AsyncSSLSocket::UniquePtr clientSock(
  570. new AsyncSSLSocket(clientCtx, &eventBase, fds[0], false));
  571. AsyncSSLSocket::UniquePtr serverSock(
  572. new AsyncSSLSocket(dfServerCtx, &eventBase, fds[1], true));
  573. SNIClient client(std::move(clientSock));
  574. SNIServer server(
  575. std::move(serverSock),
  576. dfServerCtx,
  577. hskServerCtx,
  578. serverExpectedServerName);
  579. eventBase.loop();
  580. EXPECT_TRUE(!client.serverNameMatch);
  581. EXPECT_TRUE(!server.serverNameMatch);
  582. }
  583. #endif
  584. /**
  585. * Test SSL client socket
  586. */
  587. TEST(AsyncSSLSocketTest, SSLClientTest) {
  588. // Start listening on a local port
  589. WriteCallbackBase writeCallback;
  590. ReadCallback readCallback(&writeCallback);
  591. HandshakeCallback handshakeCallback(&readCallback);
  592. SSLServerAcceptCallbackDelay acceptCallback(&handshakeCallback);
  593. TestSSLServer server(&acceptCallback);
  594. // Set up SSL client
  595. EventBase eventBase;
  596. auto client = std::make_shared<SSLClient>(&eventBase, server.getAddress(), 1);
  597. client->connect();
  598. EventBaseAborter eba(&eventBase, 3000);
  599. eventBase.loop();
  600. EXPECT_EQ(client->getMiss(), 1);
  601. EXPECT_EQ(client->getHit(), 0);
  602. cerr << "SSLClientTest test completed" << endl;
  603. }
  604. /**
  605. * Test SSL client socket session re-use
  606. */
  607. TEST(AsyncSSLSocketTest, SSLClientTestReuse) {
  608. // Start listening on a local port
  609. WriteCallbackBase writeCallback;
  610. ReadCallback readCallback(&writeCallback);
  611. HandshakeCallback handshakeCallback(&readCallback);
  612. SSLServerAcceptCallbackDelay acceptCallback(&handshakeCallback);
  613. TestSSLServer server(&acceptCallback);
  614. // Set up SSL client
  615. EventBase eventBase;
  616. auto client =
  617. std::make_shared<SSLClient>(&eventBase, server.getAddress(), 10);
  618. client->connect();
  619. EventBaseAborter eba(&eventBase, 3000);
  620. eventBase.loop();
  621. EXPECT_EQ(client->getMiss(), 1);
  622. EXPECT_EQ(client->getHit(), 9);
  623. cerr << "SSLClientTestReuse test completed" << endl;
  624. }
  625. /**
  626. * Test SSL client socket timeout
  627. */
  628. TEST(AsyncSSLSocketTest, SSLClientTimeoutTest) {
  629. // Start listening on a local port
  630. EmptyReadCallback readCallback;
  631. HandshakeCallback handshakeCallback(
  632. &readCallback, HandshakeCallback::EXPECT_ERROR);
  633. HandshakeTimeoutCallback acceptCallback(&handshakeCallback);
  634. TestSSLServer server(&acceptCallback);
  635. // Set up SSL client
  636. EventBase eventBase;
  637. auto client =
  638. std::make_shared<SSLClient>(&eventBase, server.getAddress(), 1, 10);
  639. client->connect(true /* write before connect completes */);
  640. EventBaseAborter eba(&eventBase, 3000);
  641. eventBase.loop();
  642. usleep(100000);
  643. // This is checking that the connectError callback precedes any queued
  644. // writeError callbacks. This matches AsyncSocket's behavior
  645. EXPECT_EQ(client->getWriteAfterConnectErrors(), 1);
  646. EXPECT_EQ(client->getErrors(), 1);
  647. EXPECT_EQ(client->getMiss(), 0);
  648. EXPECT_EQ(client->getHit(), 0);
  649. cerr << "SSLClientTimeoutTest test completed" << endl;
  650. }
  651. // The next 3 tests need an FB-only extension, and will fail without it
  652. #ifdef SSL_ERROR_WANT_SESS_CACHE_LOOKUP
  653. /**
  654. * Test SSL server async cache
  655. */
  656. TEST(AsyncSSLSocketTest, SSLServerAsyncCacheTest) {
  657. // Start listening on a local port
  658. WriteCallbackBase writeCallback;
  659. ReadCallback readCallback(&writeCallback);
  660. HandshakeCallback handshakeCallback(&readCallback);
  661. SSLServerAsyncCacheAcceptCallback acceptCallback(&handshakeCallback);
  662. TestSSLAsyncCacheServer server(&acceptCallback);
  663. // Set up SSL client
  664. EventBase eventBase;
  665. auto client =
  666. std::make_shared<SSLClient>(&eventBase, server.getAddress(), 10, 500);
  667. client->connect();
  668. EventBaseAborter eba(&eventBase, 3000);
  669. eventBase.loop();
  670. EXPECT_EQ(server.getAsyncCallbacks(), 18);
  671. EXPECT_EQ(server.getAsyncLookups(), 9);
  672. EXPECT_EQ(client->getMiss(), 10);
  673. EXPECT_EQ(client->getHit(), 0);
  674. cerr << "SSLServerAsyncCacheTest test completed" << endl;
  675. }
  676. /**
  677. * Test SSL server accept timeout with cache path
  678. */
  679. TEST(AsyncSSLSocketTest, SSLServerTimeoutTest) {
  680. // Start listening on a local port
  681. WriteCallbackBase writeCallback;
  682. ReadCallback readCallback(&writeCallback);
  683. HandshakeCallback handshakeCallback(&readCallback);
  684. SSLServerAcceptCallback acceptCallback(&handshakeCallback, 50);
  685. TestSSLAsyncCacheServer server(&acceptCallback);
  686. // Set up SSL client
  687. EventBase eventBase;
  688. // only do a TCP connect
  689. std::shared_ptr<AsyncSocket> sock = AsyncSocket::newSocket(&eventBase);
  690. sock->connect(nullptr, server.getAddress());
  691. EmptyReadCallback clientReadCallback;
  692. clientReadCallback.tcpSocket_ = sock;
  693. sock->setReadCB(&clientReadCallback);
  694. EventBaseAborter eba(&eventBase, 3000);
  695. eventBase.loop();
  696. EXPECT_EQ(readCallback.state, STATE_WAITING);
  697. cerr << "SSLServerTimeoutTest test completed" << endl;
  698. }
  699. /**
  700. * Test SSL server accept timeout with cache path
  701. */
  702. TEST(AsyncSSLSocketTest, SSLServerAsyncCacheTimeoutTest) {
  703. // Start listening on a local port
  704. WriteCallbackBase writeCallback;
  705. ReadCallback readCallback(&writeCallback);
  706. HandshakeCallback handshakeCallback(&readCallback);
  707. SSLServerAsyncCacheAcceptCallback acceptCallback(&handshakeCallback, 50);
  708. TestSSLAsyncCacheServer server(&acceptCallback);
  709. // Set up SSL client
  710. EventBase eventBase;
  711. auto client = std::make_shared<SSLClient>(&eventBase, server.getAddress(), 2);
  712. client->connect();
  713. EventBaseAborter eba(&eventBase, 3000);
  714. eventBase.loop();
  715. EXPECT_EQ(server.getAsyncCallbacks(), 1);
  716. EXPECT_EQ(server.getAsyncLookups(), 1);
  717. EXPECT_EQ(client->getErrors(), 1);
  718. EXPECT_EQ(client->getMiss(), 1);
  719. EXPECT_EQ(client->getHit(), 0);
  720. cerr << "SSLServerAsyncCacheTimeoutTest test completed" << endl;
  721. }
  722. /**
  723. * Test SSL server accept timeout with cache path
  724. */
  725. TEST(AsyncSSLSocketTest, SSLServerCacheCloseTest) {
  726. // Start listening on a local port
  727. WriteCallbackBase writeCallback;
  728. ReadCallback readCallback(&writeCallback);
  729. HandshakeCallback handshakeCallback(
  730. &readCallback, HandshakeCallback::EXPECT_ERROR);
  731. SSLServerAsyncCacheAcceptCallback acceptCallback(&handshakeCallback);
  732. TestSSLAsyncCacheServer server(&acceptCallback, 500);
  733. // Set up SSL client
  734. EventBase eventBase;
  735. auto client =
  736. std::make_shared<SSLClient>(&eventBase, server.getAddress(), 2, 100);
  737. client->connect();
  738. EventBaseAborter eba(&eventBase, 3000);
  739. eventBase.loop();
  740. server.getEventBase().runInEventBaseThread(
  741. [&handshakeCallback] { handshakeCallback.closeSocket(); });
  742. // give time for the cache lookup to come back and find it closed
  743. handshakeCallback.waitForHandshake();
  744. EXPECT_EQ(server.getAsyncCallbacks(), 1);
  745. EXPECT_EQ(server.getAsyncLookups(), 1);
  746. EXPECT_EQ(client->getErrors(), 1);
  747. EXPECT_EQ(client->getMiss(), 1);
  748. EXPECT_EQ(client->getHit(), 0);
  749. cerr << "SSLServerCacheCloseTest test completed" << endl;
  750. }
  751. #endif // !SSL_ERROR_WANT_SESS_CACHE_LOOKUP
  752. /**
  753. * Verify Client Ciphers obtained using SSL MSG Callback.
  754. */
  755. TEST(AsyncSSLSocketTest, SSLParseClientHelloSuccess) {
  756. EventBase eventBase;
  757. auto clientCtx = std::make_shared<SSLContext>();
  758. auto serverCtx = std::make_shared<SSLContext>();
  759. serverCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::VERIFY);
  760. serverCtx->ciphers("ECDHE-RSA-AES128-SHA:AES128-SHA:AES256-SHA");
  761. serverCtx->loadPrivateKey(kTestKey);
  762. serverCtx->loadCertificate(kTestCert);
  763. serverCtx->loadTrustedCertificates(kTestCA);
  764. serverCtx->loadClientCAList(kTestCA);
  765. clientCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::VERIFY);
  766. clientCtx->ciphers("AES256-SHA:AES128-SHA");
  767. clientCtx->loadPrivateKey(kTestKey);
  768. clientCtx->loadCertificate(kTestCert);
  769. clientCtx->loadTrustedCertificates(kTestCA);
  770. int fds[2];
  771. getfds(fds);
  772. AsyncSSLSocket::UniquePtr clientSock(
  773. new AsyncSSLSocket(clientCtx, &eventBase, fds[0], false));
  774. AsyncSSLSocket::UniquePtr serverSock(
  775. new AsyncSSLSocket(serverCtx, &eventBase, fds[1], true));
  776. SSLHandshakeClient client(std::move(clientSock), true, true);
  777. SSLHandshakeServerParseClientHello server(std::move(serverSock), true, true);
  778. eventBase.loop();
  779. #if defined(OPENSSL_IS_BORINGSSL)
  780. EXPECT_EQ(server.clientCiphers_, "AES256-SHA:AES128-SHA");
  781. #else
  782. EXPECT_EQ(server.clientCiphers_, "AES256-SHA:AES128-SHA:00ff");
  783. #endif
  784. EXPECT_EQ(server.chosenCipher_, "AES256-SHA");
  785. EXPECT_TRUE(client.handshakeVerify_);
  786. EXPECT_TRUE(client.handshakeSuccess_);
  787. EXPECT_TRUE(!client.handshakeError_);
  788. EXPECT_TRUE(server.handshakeVerify_);
  789. EXPECT_TRUE(server.handshakeSuccess_);
  790. EXPECT_TRUE(!server.handshakeError_);
  791. }
  792. /**
  793. * Verify that server is able to get client cert by getPeerCert() API.
  794. */
  795. TEST(AsyncSSLSocketTest, GetClientCertificate) {
  796. EventBase eventBase;
  797. auto clientCtx = std::make_shared<SSLContext>();
  798. auto serverCtx = std::make_shared<SSLContext>();
  799. serverCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::VERIFY);
  800. serverCtx->ciphers("ECDHE-RSA-AES128-SHA:AES128-SHA:AES256-SHA");
  801. serverCtx->loadPrivateKey(kTestKey);
  802. serverCtx->loadCertificate(kTestCert);
  803. serverCtx->loadTrustedCertificates(kClientTestCA);
  804. serverCtx->loadClientCAList(kClientTestCA);
  805. clientCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::VERIFY);
  806. clientCtx->ciphers("AES256-SHA:AES128-SHA");
  807. clientCtx->loadPrivateKey(kClientTestKey);
  808. clientCtx->loadCertificate(kClientTestCert);
  809. clientCtx->loadTrustedCertificates(kTestCA);
  810. std::array<int, 2> fds;
  811. getfds(fds.data());
  812. AsyncSSLSocket::UniquePtr clientSock(
  813. new AsyncSSLSocket(clientCtx, &eventBase, fds[0], false));
  814. AsyncSSLSocket::UniquePtr serverSock(
  815. new AsyncSSLSocket(serverCtx, &eventBase, fds[1], true));
  816. SSLHandshakeClient client(std::move(clientSock), true, true);
  817. SSLHandshakeServerParseClientHello server(std::move(serverSock), true, true);
  818. eventBase.loop();
  819. // Handshake should succeed.
  820. EXPECT_TRUE(client.handshakeSuccess_);
  821. EXPECT_TRUE(server.handshakeSuccess_);
  822. // Reclaim the sockets from SSLHandshakeBase.
  823. auto cliSocket = std::move(client).moveSocket();
  824. auto srvSocket = std::move(server).moveSocket();
  825. // Client cert retrieved from server side.
  826. folly::ssl::X509UniquePtr serverPeerCert = srvSocket->getPeerCert();
  827. CHECK(serverPeerCert);
  828. // Client cert retrieved from client side.
  829. const X509* clientSelfCert = cliSocket->getSelfCert();
  830. CHECK(clientSelfCert);
  831. // The two certs should be the same.
  832. EXPECT_EQ(0, X509_cmp(clientSelfCert, serverPeerCert.get()));
  833. }
  834. TEST(AsyncSSLSocketTest, SSLParseClientHelloOnePacket) {
  835. EventBase eventBase;
  836. auto ctx = std::make_shared<SSLContext>();
  837. int fds[2];
  838. getfds(fds);
  839. int bufLen = 42;
  840. uint8_t majorVersion = 18;
  841. uint8_t minorVersion = 25;
  842. // Create callback buf
  843. auto buf = IOBuf::create(bufLen);
  844. buf->append(bufLen);
  845. folly::io::RWPrivateCursor cursor(buf.get());
  846. cursor.write<uint8_t>(SSL3_MT_CLIENT_HELLO);
  847. cursor.write<uint16_t>(0);
  848. cursor.write<uint8_t>(38);
  849. cursor.write<uint8_t>(majorVersion);
  850. cursor.write<uint8_t>(minorVersion);
  851. cursor.skip(32);
  852. cursor.write<uint32_t>(0);
  853. SSL* ssl = ctx->createSSL();
  854. SCOPE_EXIT {
  855. SSL_free(ssl);
  856. };
  857. AsyncSSLSocket::UniquePtr sock(
  858. new AsyncSSLSocket(ctx, &eventBase, fds[0], true));
  859. sock->enableClientHelloParsing();
  860. // Test client hello parsing in one packet
  861. AsyncSSLSocket::clientHelloParsingCallback(
  862. 0, 0, SSL3_RT_HANDSHAKE, buf->data(), buf->length(), ssl, sock.get());
  863. buf.reset();
  864. auto parsedClientHello = sock->getClientHelloInfo();
  865. EXPECT_TRUE(parsedClientHello != nullptr);
  866. EXPECT_EQ(parsedClientHello->clientHelloMajorVersion_, majorVersion);
  867. EXPECT_EQ(parsedClientHello->clientHelloMinorVersion_, minorVersion);
  868. }
  869. TEST(AsyncSSLSocketTest, SSLParseClientHelloTwoPackets) {
  870. EventBase eventBase;
  871. auto ctx = std::make_shared<SSLContext>();
  872. int fds[2];
  873. getfds(fds);
  874. int bufLen = 42;
  875. uint8_t majorVersion = 18;
  876. uint8_t minorVersion = 25;
  877. // Create callback buf
  878. auto buf = IOBuf::create(bufLen);
  879. buf->append(bufLen);
  880. folly::io::RWPrivateCursor cursor(buf.get());
  881. cursor.write<uint8_t>(SSL3_MT_CLIENT_HELLO);
  882. cursor.write<uint16_t>(0);
  883. cursor.write<uint8_t>(38);
  884. cursor.write<uint8_t>(majorVersion);
  885. cursor.write<uint8_t>(minorVersion);
  886. cursor.skip(32);
  887. cursor.write<uint32_t>(0);
  888. SSL* ssl = ctx->createSSL();
  889. SCOPE_EXIT {
  890. SSL_free(ssl);
  891. };
  892. AsyncSSLSocket::UniquePtr sock(
  893. new AsyncSSLSocket(ctx, &eventBase, fds[0], true));
  894. sock->enableClientHelloParsing();
  895. // Test parsing with two packets with first packet size < 3
  896. auto bufCopy = folly::IOBuf::copyBuffer(buf->data(), 2);
  897. AsyncSSLSocket::clientHelloParsingCallback(
  898. 0,
  899. 0,
  900. SSL3_RT_HANDSHAKE,
  901. bufCopy->data(),
  902. bufCopy->length(),
  903. ssl,
  904. sock.get());
  905. bufCopy.reset();
  906. bufCopy = folly::IOBuf::copyBuffer(buf->data() + 2, buf->length() - 2);
  907. AsyncSSLSocket::clientHelloParsingCallback(
  908. 0,
  909. 0,
  910. SSL3_RT_HANDSHAKE,
  911. bufCopy->data(),
  912. bufCopy->length(),
  913. ssl,
  914. sock.get());
  915. bufCopy.reset();
  916. auto parsedClientHello = sock->getClientHelloInfo();
  917. EXPECT_TRUE(parsedClientHello != nullptr);
  918. EXPECT_EQ(parsedClientHello->clientHelloMajorVersion_, majorVersion);
  919. EXPECT_EQ(parsedClientHello->clientHelloMinorVersion_, minorVersion);
  920. }
  921. TEST(AsyncSSLSocketTest, SSLParseClientHelloMultiplePackets) {
  922. EventBase eventBase;
  923. auto ctx = std::make_shared<SSLContext>();
  924. int fds[2];
  925. getfds(fds);
  926. int bufLen = 42;
  927. uint8_t majorVersion = 18;
  928. uint8_t minorVersion = 25;
  929. // Create callback buf
  930. auto buf = IOBuf::create(bufLen);
  931. buf->append(bufLen);
  932. folly::io::RWPrivateCursor cursor(buf.get());
  933. cursor.write<uint8_t>(SSL3_MT_CLIENT_HELLO);
  934. cursor.write<uint16_t>(0);
  935. cursor.write<uint8_t>(38);
  936. cursor.write<uint8_t>(majorVersion);
  937. cursor.write<uint8_t>(minorVersion);
  938. cursor.skip(32);
  939. cursor.write<uint32_t>(0);
  940. SSL* ssl = ctx->createSSL();
  941. SCOPE_EXIT {
  942. SSL_free(ssl);
  943. };
  944. AsyncSSLSocket::UniquePtr sock(
  945. new AsyncSSLSocket(ctx, &eventBase, fds[0], true));
  946. sock->enableClientHelloParsing();
  947. // Test parsing with multiple small packets
  948. for (std::size_t i = 0; i < buf->length(); i += 3) {
  949. auto bufCopy = folly::IOBuf::copyBuffer(
  950. buf->data() + i, std::min((std::size_t)3, buf->length() - i));
  951. AsyncSSLSocket::clientHelloParsingCallback(
  952. 0,
  953. 0,
  954. SSL3_RT_HANDSHAKE,
  955. bufCopy->data(),
  956. bufCopy->length(),
  957. ssl,
  958. sock.get());
  959. bufCopy.reset();
  960. }
  961. auto parsedClientHello = sock->getClientHelloInfo();
  962. EXPECT_TRUE(parsedClientHello != nullptr);
  963. EXPECT_EQ(parsedClientHello->clientHelloMajorVersion_, majorVersion);
  964. EXPECT_EQ(parsedClientHello->clientHelloMinorVersion_, minorVersion);
  965. }
  966. /**
  967. * Verify sucessful behavior of SSL certificate validation.
  968. */
  969. TEST(AsyncSSLSocketTest, SSLHandshakeValidationSuccess) {
  970. EventBase eventBase;
  971. auto clientCtx = std::make_shared<SSLContext>();
  972. auto dfServerCtx = std::make_shared<SSLContext>();
  973. int fds[2];
  974. getfds(fds);
  975. getctx(clientCtx, dfServerCtx);
  976. clientCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::VERIFY);
  977. dfServerCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::VERIFY);
  978. AsyncSSLSocket::UniquePtr clientSock(
  979. new AsyncSSLSocket(clientCtx, &eventBase, fds[0], false));
  980. AsyncSSLSocket::UniquePtr serverSock(
  981. new AsyncSSLSocket(dfServerCtx, &eventBase, fds[1], true));
  982. SSLHandshakeClient client(std::move(clientSock), true, true);
  983. clientCtx->loadTrustedCertificates(kTestCA);
  984. SSLHandshakeServer server(std::move(serverSock), true, true);
  985. eventBase.loop();
  986. EXPECT_TRUE(client.handshakeVerify_);
  987. EXPECT_TRUE(client.handshakeSuccess_);
  988. EXPECT_TRUE(!client.handshakeError_);
  989. EXPECT_LE(0, client.handshakeTime.count());
  990. EXPECT_TRUE(!server.handshakeVerify_);
  991. EXPECT_TRUE(server.handshakeSuccess_);
  992. EXPECT_TRUE(!server.handshakeError_);
  993. EXPECT_LE(0, server.handshakeTime.count());
  994. }
  995. /**
  996. * Verify that the client's verification callback is able to fail SSL
  997. * connection establishment.
  998. */
  999. TEST(AsyncSSLSocketTest, SSLHandshakeValidationFailure) {
  1000. EventBase eventBase;
  1001. auto clientCtx = std::make_shared<SSLContext>();
  1002. auto dfServerCtx = std::make_shared<SSLContext>();
  1003. int fds[2];
  1004. getfds(fds);
  1005. getctx(clientCtx, dfServerCtx);
  1006. clientCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::VERIFY);
  1007. dfServerCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::VERIFY);
  1008. AsyncSSLSocket::UniquePtr clientSock(
  1009. new AsyncSSLSocket(clientCtx, &eventBase, fds[0], false));
  1010. AsyncSSLSocket::UniquePtr serverSock(
  1011. new AsyncSSLSocket(dfServerCtx, &eventBase, fds[1], true));
  1012. SSLHandshakeClient client(std::move(clientSock), true, false);
  1013. clientCtx->loadTrustedCertificates(kTestCA);
  1014. SSLHandshakeServer server(std::move(serverSock), true, true);
  1015. eventBase.loop();
  1016. EXPECT_TRUE(client.handshakeVerify_);
  1017. EXPECT_TRUE(!client.handshakeSuccess_);
  1018. EXPECT_TRUE(client.handshakeError_);
  1019. EXPECT_LE(0, client.handshakeTime.count());
  1020. EXPECT_TRUE(!server.handshakeVerify_);
  1021. EXPECT_TRUE(!server.handshakeSuccess_);
  1022. EXPECT_TRUE(server.handshakeError_);
  1023. EXPECT_LE(0, server.handshakeTime.count());
  1024. }
  1025. /**
  1026. * Verify that the options in SSLContext can be overridden in
  1027. * sslConnect/Accept.i.e specifying that no validation should be performed
  1028. * allows an otherwise-invalid certificate to be accepted and doesn't fire
  1029. * the validation callback.
  1030. */
  1031. TEST(AsyncSSLSocketTest, OverrideSSLCtxDisableVerify) {
  1032. EventBase eventBase;
  1033. auto clientCtx = std::make_shared<SSLContext>();
  1034. auto dfServerCtx = std::make_shared<SSLContext>();
  1035. int fds[2];
  1036. getfds(fds);
  1037. getctx(clientCtx, dfServerCtx);
  1038. clientCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::VERIFY);
  1039. dfServerCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::VERIFY);
  1040. AsyncSSLSocket::UniquePtr clientSock(
  1041. new AsyncSSLSocket(clientCtx, &eventBase, fds[0], false));
  1042. AsyncSSLSocket::UniquePtr serverSock(
  1043. new AsyncSSLSocket(dfServerCtx, &eventBase, fds[1], true));
  1044. SSLHandshakeClientNoVerify client(std::move(clientSock), false, false);
  1045. clientCtx->loadTrustedCertificates(kTestCA);
  1046. SSLHandshakeServerNoVerify server(std::move(serverSock), false, false);
  1047. eventBase.loop();
  1048. EXPECT_TRUE(!client.handshakeVerify_);
  1049. EXPECT_TRUE(client.handshakeSuccess_);
  1050. EXPECT_TRUE(!client.handshakeError_);
  1051. EXPECT_LE(0, client.handshakeTime.count());
  1052. EXPECT_TRUE(!server.handshakeVerify_);
  1053. EXPECT_TRUE(server.handshakeSuccess_);
  1054. EXPECT_TRUE(!server.handshakeError_);
  1055. EXPECT_LE(0, server.handshakeTime.count());
  1056. }
  1057. /**
  1058. * Verify that the options in SSLContext can be overridden in
  1059. * sslConnect/Accept. Enable verification even if context says otherwise.
  1060. * Test requireClientCert with client cert
  1061. */
  1062. TEST(AsyncSSLSocketTest, OverrideSSLCtxEnableVerify) {
  1063. EventBase eventBase;
  1064. auto clientCtx = std::make_shared<SSLContext>();
  1065. auto serverCtx = std::make_shared<SSLContext>();
  1066. serverCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::NO_VERIFY);
  1067. serverCtx->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  1068. serverCtx->loadPrivateKey(kTestKey);
  1069. serverCtx->loadCertificate(kTestCert);
  1070. serverCtx->loadTrustedCertificates(kTestCA);
  1071. serverCtx->loadClientCAList(kTestCA);
  1072. clientCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::NO_VERIFY);
  1073. clientCtx->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  1074. clientCtx->loadPrivateKey(kTestKey);
  1075. clientCtx->loadCertificate(kTestCert);
  1076. clientCtx->loadTrustedCertificates(kTestCA);
  1077. int fds[2];
  1078. getfds(fds);
  1079. AsyncSSLSocket::UniquePtr clientSock(
  1080. new AsyncSSLSocket(clientCtx, &eventBase, fds[0], false));
  1081. AsyncSSLSocket::UniquePtr serverSock(
  1082. new AsyncSSLSocket(serverCtx, &eventBase, fds[1], true));
  1083. SSLHandshakeClientDoVerify client(std::move(clientSock), true, true);
  1084. SSLHandshakeServerDoVerify server(std::move(serverSock), true, true);
  1085. eventBase.loop();
  1086. EXPECT_TRUE(client.handshakeVerify_);
  1087. EXPECT_TRUE(client.handshakeSuccess_);
  1088. EXPECT_FALSE(client.handshakeError_);
  1089. EXPECT_LE(0, client.handshakeTime.count());
  1090. EXPECT_TRUE(server.handshakeVerify_);
  1091. EXPECT_TRUE(server.handshakeSuccess_);
  1092. EXPECT_FALSE(server.handshakeError_);
  1093. EXPECT_LE(0, server.handshakeTime.count());
  1094. }
  1095. /**
  1096. * Verify that the client's verification callback is able to override
  1097. * the preverification failure and allow a successful connection.
  1098. */
  1099. TEST(AsyncSSLSocketTest, SSLHandshakeValidationOverride) {
  1100. EventBase eventBase;
  1101. auto clientCtx = std::make_shared<SSLContext>();
  1102. auto dfServerCtx = std::make_shared<SSLContext>();
  1103. int fds[2];
  1104. getfds(fds);
  1105. getctx(clientCtx, dfServerCtx);
  1106. clientCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::VERIFY);
  1107. dfServerCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::VERIFY);
  1108. AsyncSSLSocket::UniquePtr clientSock(
  1109. new AsyncSSLSocket(clientCtx, &eventBase, fds[0], false));
  1110. AsyncSSLSocket::UniquePtr serverSock(
  1111. new AsyncSSLSocket(dfServerCtx, &eventBase, fds[1], true));
  1112. SSLHandshakeClient client(std::move(clientSock), false, true);
  1113. SSLHandshakeServer server(std::move(serverSock), true, true);
  1114. eventBase.loop();
  1115. EXPECT_TRUE(client.handshakeVerify_);
  1116. EXPECT_TRUE(client.handshakeSuccess_);
  1117. EXPECT_TRUE(!client.handshakeError_);
  1118. EXPECT_LE(0, client.handshakeTime.count());
  1119. EXPECT_TRUE(!server.handshakeVerify_);
  1120. EXPECT_TRUE(server.handshakeSuccess_);
  1121. EXPECT_TRUE(!server.handshakeError_);
  1122. EXPECT_LE(0, server.handshakeTime.count());
  1123. }
  1124. /**
  1125. * Verify that specifying that no validation should be performed allows an
  1126. * otherwise-invalid certificate to be accepted and doesn't fire the validation
  1127. * callback.
  1128. */
  1129. TEST(AsyncSSLSocketTest, SSLHandshakeValidationSkip) {
  1130. EventBase eventBase;
  1131. auto clientCtx = std::make_shared<SSLContext>();
  1132. auto dfServerCtx = std::make_shared<SSLContext>();
  1133. int fds[2];
  1134. getfds(fds);
  1135. getctx(clientCtx, dfServerCtx);
  1136. clientCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::NO_VERIFY);
  1137. dfServerCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::NO_VERIFY);
  1138. AsyncSSLSocket::UniquePtr clientSock(
  1139. new AsyncSSLSocket(clientCtx, &eventBase, fds[0], false));
  1140. AsyncSSLSocket::UniquePtr serverSock(
  1141. new AsyncSSLSocket(dfServerCtx, &eventBase, fds[1], true));
  1142. SSLHandshakeClient client(std::move(clientSock), false, false);
  1143. SSLHandshakeServer server(std::move(serverSock), false, false);
  1144. eventBase.loop();
  1145. EXPECT_TRUE(!client.handshakeVerify_);
  1146. EXPECT_TRUE(client.handshakeSuccess_);
  1147. EXPECT_TRUE(!client.handshakeError_);
  1148. EXPECT_LE(0, client.handshakeTime.count());
  1149. EXPECT_TRUE(!server.handshakeVerify_);
  1150. EXPECT_TRUE(server.handshakeSuccess_);
  1151. EXPECT_TRUE(!server.handshakeError_);
  1152. EXPECT_LE(0, server.handshakeTime.count());
  1153. }
  1154. /**
  1155. * Test requireClientCert with client cert
  1156. */
  1157. TEST(AsyncSSLSocketTest, ClientCertHandshakeSuccess) {
  1158. EventBase eventBase;
  1159. auto clientCtx = std::make_shared<SSLContext>();
  1160. auto serverCtx = std::make_shared<SSLContext>();
  1161. serverCtx->setVerificationOption(
  1162. SSLContext::SSLVerifyPeerEnum::VERIFY_REQ_CLIENT_CERT);
  1163. serverCtx->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  1164. serverCtx->loadPrivateKey(kTestKey);
  1165. serverCtx->loadCertificate(kTestCert);
  1166. serverCtx->loadTrustedCertificates(kTestCA);
  1167. serverCtx->loadClientCAList(kTestCA);
  1168. clientCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::VERIFY);
  1169. clientCtx->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  1170. clientCtx->loadPrivateKey(kTestKey);
  1171. clientCtx->loadCertificate(kTestCert);
  1172. clientCtx->loadTrustedCertificates(kTestCA);
  1173. int fds[2];
  1174. getfds(fds);
  1175. AsyncSSLSocket::UniquePtr clientSock(
  1176. new AsyncSSLSocket(clientCtx, &eventBase, fds[0], false));
  1177. AsyncSSLSocket::UniquePtr serverSock(
  1178. new AsyncSSLSocket(serverCtx, &eventBase, fds[1], true));
  1179. SSLHandshakeClient client(std::move(clientSock), true, true);
  1180. SSLHandshakeServer server(std::move(serverSock), true, true);
  1181. eventBase.loop();
  1182. EXPECT_TRUE(client.handshakeVerify_);
  1183. EXPECT_TRUE(client.handshakeSuccess_);
  1184. EXPECT_FALSE(client.handshakeError_);
  1185. EXPECT_LE(0, client.handshakeTime.count());
  1186. EXPECT_TRUE(server.handshakeVerify_);
  1187. EXPECT_TRUE(server.handshakeSuccess_);
  1188. EXPECT_FALSE(server.handshakeError_);
  1189. EXPECT_LE(0, server.handshakeTime.count());
  1190. // check certificates
  1191. auto clientSsl = std::move(client).moveSocket();
  1192. auto serverSsl = std::move(server).moveSocket();
  1193. auto clientPeer = clientSsl->getPeerCertificate();
  1194. auto clientSelf = clientSsl->getSelfCertificate();
  1195. auto serverPeer = serverSsl->getPeerCertificate();
  1196. auto serverSelf = serverSsl->getSelfCertificate();
  1197. EXPECT_NE(clientPeer, nullptr);
  1198. EXPECT_NE(clientSelf, nullptr);
  1199. EXPECT_NE(serverPeer, nullptr);
  1200. EXPECT_NE(serverSelf, nullptr);
  1201. EXPECT_EQ(clientPeer->getIdentity(), serverSelf->getIdentity());
  1202. EXPECT_EQ(clientSelf->getIdentity(), serverPeer->getIdentity());
  1203. }
  1204. /**
  1205. * Test requireClientCert with no client cert
  1206. */
  1207. TEST(AsyncSSLSocketTest, NoClientCertHandshakeError) {
  1208. EventBase eventBase;
  1209. auto clientCtx = std::make_shared<SSLContext>();
  1210. auto serverCtx = std::make_shared<SSLContext>();
  1211. serverCtx->setVerificationOption(
  1212. SSLContext::SSLVerifyPeerEnum::VERIFY_REQ_CLIENT_CERT);
  1213. serverCtx->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  1214. serverCtx->loadPrivateKey(kTestKey);
  1215. serverCtx->loadCertificate(kTestCert);
  1216. serverCtx->loadTrustedCertificates(kTestCA);
  1217. serverCtx->loadClientCAList(kTestCA);
  1218. clientCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::NO_VERIFY);
  1219. clientCtx->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  1220. int fds[2];
  1221. getfds(fds);
  1222. AsyncSSLSocket::UniquePtr clientSock(
  1223. new AsyncSSLSocket(clientCtx, &eventBase, fds[0], false));
  1224. AsyncSSLSocket::UniquePtr serverSock(
  1225. new AsyncSSLSocket(serverCtx, &eventBase, fds[1], true));
  1226. SSLHandshakeClient client(std::move(clientSock), false, false);
  1227. SSLHandshakeServer server(std::move(serverSock), false, false);
  1228. eventBase.loop();
  1229. EXPECT_FALSE(server.handshakeVerify_);
  1230. EXPECT_FALSE(server.handshakeSuccess_);
  1231. EXPECT_TRUE(server.handshakeError_);
  1232. EXPECT_LE(0, client.handshakeTime.count());
  1233. EXPECT_LE(0, server.handshakeTime.count());
  1234. }
  1235. /**
  1236. * Test OpenSSL 1.1.0's async functionality
  1237. */
  1238. #if FOLLY_OPENSSL_IS_110
  1239. static void makeNonBlockingPipe(int pipefds[2]) {
  1240. if (pipe(pipefds) != 0) {
  1241. throw std::runtime_error("Cannot create pipe");
  1242. }
  1243. if (::fcntl(pipefds[0], F_SETFL, O_NONBLOCK) != 0) {
  1244. throw std::runtime_error("Cannot set pipe to nonblocking");
  1245. }
  1246. if (::fcntl(pipefds[1], F_SETFL, O_NONBLOCK) != 0) {
  1247. throw std::runtime_error("Cannot set pipe to nonblocking");
  1248. }
  1249. }
  1250. // Custom RSA private key encryption method
  1251. static int kRSAExIndex = -1;
  1252. static int kRSAEvbExIndex = -1;
  1253. static int kRSASocketExIndex = -1;
  1254. static constexpr StringPiece kEngineId = "AsyncSSLSocketTest";
  1255. static int customRsaPrivEnc(
  1256. int flen,
  1257. const unsigned char* from,
  1258. unsigned char* to,
  1259. RSA* rsa,
  1260. int padding) {
  1261. LOG(INFO) << "rsa_priv_enc";
  1262. EventBase* asyncJobEvb =
  1263. reinterpret_cast<EventBase*>(RSA_get_ex_data(rsa, kRSAEvbExIndex));
  1264. CHECK(asyncJobEvb);
  1265. RSA* actualRSA = reinterpret_cast<RSA*>(RSA_get_ex_data(rsa, kRSAExIndex));
  1266. CHECK(actualRSA);
  1267. AsyncSSLSocket* socket = reinterpret_cast<AsyncSSLSocket*>(
  1268. RSA_get_ex_data(rsa, kRSASocketExIndex));
  1269. ASYNC_JOB* job = ASYNC_get_current_job();
  1270. if (job == nullptr) {
  1271. throw std::runtime_error("Expected call in job context");
  1272. }
  1273. ASYNC_WAIT_CTX* waitctx = ASYNC_get_wait_ctx(job);
  1274. OSSL_ASYNC_FD pipefds[2] = {0, 0};
  1275. makeNonBlockingPipe(pipefds);
  1276. if (!ASYNC_WAIT_CTX_set_wait_fd(
  1277. waitctx, kEngineId.data(), pipefds[0], nullptr, nullptr)) {
  1278. throw std::runtime_error("Cannot set wait fd");
  1279. }
  1280. int ret = 0;
  1281. int* retptr = &ret;
  1282. auto asyncPipeWriter =
  1283. folly::AsyncPipeWriter::newWriter(asyncJobEvb, pipefds[1]);
  1284. asyncJobEvb->runInEventBaseThread([retptr = retptr,
  1285. flen = flen,
  1286. from = from,
  1287. to = to,
  1288. padding = padding,
  1289. actualRSA = actualRSA,
  1290. writer = std::move(asyncPipeWriter),
  1291. socket = socket]() {
  1292. LOG(INFO) << "Running job";
  1293. if (socket) {
  1294. LOG(INFO) << "Got a socket passed in, closing it...";
  1295. socket->closeNow();
  1296. }
  1297. *retptr = RSA_meth_get_priv_enc(RSA_PKCS1_OpenSSL())(
  1298. flen, from, to, actualRSA, padding);
  1299. LOG(INFO) << "Finished job, writing to pipe";
  1300. uint8_t byte = *retptr > 0 ? 1 : 0;
  1301. writer->write(nullptr, &byte, 1);
  1302. });
  1303. LOG(INFO) << "About to pause job";
  1304. ASYNC_pause_job();
  1305. LOG(INFO) << "Resumed job with ret: " << ret;
  1306. return ret;
  1307. }
  1308. void rsaFree(void*, void* ptr, CRYPTO_EX_DATA*, int, long, void*) {
  1309. LOG(INFO) << "RSA_free is called with ptr " << std::hex << ptr;
  1310. if (ptr == nullptr) {
  1311. LOG(INFO) << "Returning early from rsaFree because ptr is null";
  1312. return;
  1313. }
  1314. RSA* rsa = (RSA*)ptr;
  1315. auto meth = RSA_get_method(rsa);
  1316. if (meth != RSA_get_default_method()) {
  1317. auto nonconst = const_cast<RSA_METHOD*>(meth);
  1318. RSA_meth_free(nonconst);
  1319. RSA_set_method(rsa, RSA_get_default_method());
  1320. }
  1321. RSA_free(rsa);
  1322. }
  1323. struct RSAPointers {
  1324. RSA* actualrsa{nullptr};
  1325. RSA* dummyrsa{nullptr};
  1326. RSA_METHOD* meth{nullptr};
  1327. };
  1328. inline void RSAPointersFree(RSAPointers* p) {
  1329. if (p->meth && p->dummyrsa && RSA_get_method(p->dummyrsa) == p->meth) {
  1330. RSA_set_method(p->dummyrsa, RSA_get_default_method());
  1331. }
  1332. if (p->meth) {
  1333. LOG(INFO) << "Freeing meth";
  1334. RSA_meth_free(p->meth);
  1335. }
  1336. if (p->actualrsa) {
  1337. LOG(INFO) << "Freeing actualrsa";
  1338. RSA_free(p->actualrsa);
  1339. }
  1340. if (p->dummyrsa) {
  1341. LOG(INFO) << "Freeing dummyrsa";
  1342. RSA_free(p->dummyrsa);
  1343. }
  1344. delete p;
  1345. }
  1346. using RSAPointersDeleter =
  1347. folly::static_function_deleter<RSAPointers, RSAPointersFree>;
  1348. std::unique_ptr<RSAPointers, RSAPointersDeleter>
  1349. setupCustomRSA(const char* certPath, const char* keyPath, EventBase* jobEvb) {
  1350. auto certPEM = getFileAsBuf(certPath);
  1351. auto keyPEM = getFileAsBuf(keyPath);
  1352. ssl::BioUniquePtr certBio(
  1353. BIO_new_mem_buf((void*)certPEM.data(), certPEM.size()));
  1354. ssl::BioUniquePtr keyBio(
  1355. BIO_new_mem_buf((void*)keyPEM.data(), keyPEM.size()));
  1356. ssl::X509UniquePtr cert(
  1357. PEM_read_bio_X509(certBio.get(), nullptr, nullptr, nullptr));
  1358. ssl::EvpPkeyUniquePtr evpPkey(
  1359. PEM_read_bio_PrivateKey(keyBio.get(), nullptr, nullptr, nullptr));
  1360. ssl::EvpPkeyUniquePtr publicEvpPkey(X509_get_pubkey(cert.get()));
  1361. std::unique_ptr<RSAPointers, RSAPointersDeleter> ret(new RSAPointers());
  1362. RSA* actualrsa = EVP_PKEY_get1_RSA(evpPkey.get());
  1363. LOG(INFO) << "actualrsa ptr " << std::hex << (void*)actualrsa;
  1364. RSA* dummyrsa = EVP_PKEY_get1_RSA(publicEvpPkey.get());
  1365. if (dummyrsa == nullptr) {
  1366. throw std::runtime_error("Couldn't get RSA cert public factors");
  1367. }
  1368. RSA_METHOD* meth = RSA_meth_dup(RSA_get_default_method());
  1369. if (meth == nullptr || RSA_meth_set1_name(meth, "Async RSA method") == 0 ||
  1370. RSA_meth_set_priv_enc(meth, customRsaPrivEnc) == 0 ||
  1371. RSA_meth_set_flags(meth, RSA_METHOD_FLAG_NO_CHECK) == 0) {
  1372. throw std::runtime_error("Cannot create async RSA_METHOD");
  1373. }
  1374. RSA_set_method(dummyrsa, meth);
  1375. RSA_set_flags(dummyrsa, RSA_FLAG_EXT_PKEY);
  1376. kRSAExIndex = RSA_get_ex_new_index(0, nullptr, nullptr, nullptr, nullptr);
  1377. kRSAEvbExIndex = RSA_get_ex_new_index(0, nullptr, nullptr, nullptr, nullptr);
  1378. kRSASocketExIndex =
  1379. RSA_get_ex_new_index(0, nullptr, nullptr, nullptr, nullptr);
  1380. CHECK_NE(kRSAExIndex, -1);
  1381. CHECK_NE(kRSAEvbExIndex, -1);
  1382. CHECK_NE(kRSASocketExIndex, -1);
  1383. RSA_set_ex_data(dummyrsa, kRSAExIndex, actualrsa);
  1384. RSA_set_ex_data(dummyrsa, kRSAEvbExIndex, jobEvb);
  1385. ret->actualrsa = actualrsa;
  1386. ret->dummyrsa = dummyrsa;
  1387. ret->meth = meth;
  1388. return ret;
  1389. }
  1390. // TODO: disabled with ASAN doesn't play nice with ASYNC for some reason
  1391. #ifndef FOLLY_SANITIZE_ADDRESS
  1392. TEST(AsyncSSLSocketTest, OpenSSL110AsyncTest) {
  1393. ASYNC_init_thread(1, 1);
  1394. EventBase eventBase;
  1395. ScopedEventBaseThread jobEvbThread;
  1396. auto clientCtx = std::make_shared<SSLContext>();
  1397. auto serverCtx = std::make_shared<SSLContext>();
  1398. serverCtx->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  1399. serverCtx->loadCertificate(kTestCert);
  1400. serverCtx->loadTrustedCertificates(kTestCA);
  1401. serverCtx->loadClientCAList(kTestCA);
  1402. auto rsaPointers =
  1403. setupCustomRSA(kTestCert, kTestKey, jobEvbThread.getEventBase());
  1404. CHECK(rsaPointers->dummyrsa);
  1405. // up-refs dummyrsa
  1406. SSL_CTX_use_RSAPrivateKey(serverCtx->getSSLCtx(), rsaPointers->dummyrsa);
  1407. SSL_CTX_set_mode(serverCtx->getSSLCtx(), SSL_MODE_ASYNC);
  1408. clientCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::NO_VERIFY);
  1409. clientCtx->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  1410. int fds[2];
  1411. getfds(fds);
  1412. AsyncSSLSocket::UniquePtr clientSock(
  1413. new AsyncSSLSocket(clientCtx, &eventBase, fds[0], false));
  1414. AsyncSSLSocket::UniquePtr serverSock(
  1415. new AsyncSSLSocket(serverCtx, &eventBase, fds[1], true));
  1416. SSLHandshakeClient client(std::move(clientSock), false, false);
  1417. SSLHandshakeServer server(std::move(serverSock), false, false);
  1418. eventBase.loop();
  1419. EXPECT_TRUE(server.handshakeSuccess_);
  1420. EXPECT_TRUE(client.handshakeSuccess_);
  1421. ASYNC_cleanup_thread();
  1422. }
  1423. TEST(AsyncSSLSocketTest, OpenSSL110AsyncTestFailure) {
  1424. ASYNC_init_thread(1, 1);
  1425. EventBase eventBase;
  1426. ScopedEventBaseThread jobEvbThread;
  1427. auto clientCtx = std::make_shared<SSLContext>();
  1428. auto serverCtx = std::make_shared<SSLContext>();
  1429. serverCtx->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  1430. serverCtx->loadCertificate(kTestCert);
  1431. serverCtx->loadTrustedCertificates(kTestCA);
  1432. serverCtx->loadClientCAList(kTestCA);
  1433. // Set the wrong key for the cert
  1434. auto rsaPointers =
  1435. setupCustomRSA(kTestCert, kClientTestKey, jobEvbThread.getEventBase());
  1436. CHECK(rsaPointers->dummyrsa);
  1437. SSL_CTX_use_RSAPrivateKey(serverCtx->getSSLCtx(), rsaPointers->dummyrsa);
  1438. SSL_CTX_set_mode(serverCtx->getSSLCtx(), SSL_MODE_ASYNC);
  1439. clientCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::NO_VERIFY);
  1440. clientCtx->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  1441. int fds[2];
  1442. getfds(fds);
  1443. AsyncSSLSocket::UniquePtr clientSock(
  1444. new AsyncSSLSocket(clientCtx, &eventBase, fds[0], false));
  1445. AsyncSSLSocket::UniquePtr serverSock(
  1446. new AsyncSSLSocket(serverCtx, &eventBase, fds[1], true));
  1447. SSLHandshakeClient client(std::move(clientSock), false, false);
  1448. SSLHandshakeServer server(std::move(serverSock), false, false);
  1449. eventBase.loop();
  1450. EXPECT_TRUE(server.handshakeError_);
  1451. EXPECT_TRUE(client.handshakeError_);
  1452. ASYNC_cleanup_thread();
  1453. }
  1454. TEST(AsyncSSLSocketTest, OpenSSL110AsyncTestClosedWithCallbackPending) {
  1455. ASYNC_init_thread(1, 1);
  1456. EventBase eventBase;
  1457. ScopedEventBaseThread jobEvbThread;
  1458. auto clientCtx = std::make_shared<SSLContext>();
  1459. auto serverCtx = std::make_shared<SSLContext>();
  1460. serverCtx->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  1461. serverCtx->loadCertificate(kTestCert);
  1462. serverCtx->loadTrustedCertificates(kTestCA);
  1463. serverCtx->loadClientCAList(kTestCA);
  1464. auto rsaPointers =
  1465. setupCustomRSA(kTestCert, kTestKey, jobEvbThread.getEventBase());
  1466. CHECK(rsaPointers->dummyrsa);
  1467. // up-refs dummyrsa
  1468. SSL_CTX_use_RSAPrivateKey(serverCtx->getSSLCtx(), rsaPointers->dummyrsa);
  1469. SSL_CTX_set_mode(serverCtx->getSSLCtx(), SSL_MODE_ASYNC);
  1470. clientCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::NO_VERIFY);
  1471. clientCtx->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  1472. int fds[2];
  1473. getfds(fds);
  1474. AsyncSSLSocket::UniquePtr clientSock(
  1475. new AsyncSSLSocket(clientCtx, &eventBase, fds[0], false));
  1476. AsyncSSLSocket::UniquePtr serverSock(
  1477. new AsyncSSLSocket(serverCtx, &eventBase, fds[1], true));
  1478. RSA_set_ex_data(rsaPointers->dummyrsa, kRSASocketExIndex, serverSock.get());
  1479. SSLHandshakeClient client(std::move(clientSock), false, false);
  1480. SSLHandshakeServer server(std::move(serverSock), false, false);
  1481. eventBase.loop();
  1482. EXPECT_TRUE(server.handshakeError_);
  1483. EXPECT_TRUE(client.handshakeError_);
  1484. ASYNC_cleanup_thread();
  1485. }
  1486. #endif // FOLLY_SANITIZE_ADDRESS
  1487. #endif // FOLLY_OPENSSL_IS_110
  1488. TEST(AsyncSSLSocketTest, LoadCertFromMemory) {
  1489. using folly::ssl::OpenSSLUtils;
  1490. auto cert = getFileAsBuf(kTestCert);
  1491. auto key = getFileAsBuf(kTestKey);
  1492. ssl::BioUniquePtr certBio(BIO_new(BIO_s_mem()));
  1493. BIO_write(certBio.get(), cert.data(), cert.size());
  1494. ssl::BioUniquePtr keyBio(BIO_new(BIO_s_mem()));
  1495. BIO_write(keyBio.get(), key.data(), key.size());
  1496. // Create SSL structs from buffers to get properties
  1497. ssl::X509UniquePtr certStruct(
  1498. PEM_read_bio_X509(certBio.get(), nullptr, nullptr, nullptr));
  1499. ssl::EvpPkeyUniquePtr keyStruct(
  1500. PEM_read_bio_PrivateKey(keyBio.get(), nullptr, nullptr, nullptr));
  1501. certBio = nullptr;
  1502. keyBio = nullptr;
  1503. auto origCommonName = OpenSSLUtils::getCommonName(certStruct.get());
  1504. auto origKeySize = EVP_PKEY_bits(keyStruct.get());
  1505. certStruct = nullptr;
  1506. keyStruct = nullptr;
  1507. auto ctx = std::make_shared<SSLContext>();
  1508. ctx->loadPrivateKeyFromBufferPEM(key);
  1509. ctx->loadCertificateFromBufferPEM(cert);
  1510. ctx->loadTrustedCertificates(kTestCA);
  1511. ssl::SSLUniquePtr ssl(ctx->createSSL());
  1512. auto newCert = SSL_get_certificate(ssl.get());
  1513. auto newKey = SSL_get_privatekey(ssl.get());
  1514. // Get properties from SSL struct
  1515. auto newCommonName = OpenSSLUtils::getCommonName(newCert);
  1516. auto newKeySize = EVP_PKEY_bits(newKey);
  1517. // Check that the key and cert have the expected properties
  1518. EXPECT_EQ(origCommonName, newCommonName);
  1519. EXPECT_EQ(origKeySize, newKeySize);
  1520. }
  1521. TEST(AsyncSSLSocketTest, MinWriteSizeTest) {
  1522. EventBase eb;
  1523. // Set up SSL context.
  1524. auto sslContext = std::make_shared<SSLContext>();
  1525. sslContext->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  1526. // create SSL socket
  1527. AsyncSSLSocket::UniquePtr socket(new AsyncSSLSocket(sslContext, &eb));
  1528. EXPECT_EQ(1500, socket->getMinWriteSize());
  1529. socket->setMinWriteSize(0);
  1530. EXPECT_EQ(0, socket->getMinWriteSize());
  1531. socket->setMinWriteSize(50000);
  1532. EXPECT_EQ(50000, socket->getMinWriteSize());
  1533. }
  1534. class ReadCallbackTerminator : public ReadCallback {
  1535. public:
  1536. ReadCallbackTerminator(EventBase* base, WriteCallbackBase* wcb)
  1537. : ReadCallback(wcb), base_(base) {}
  1538. // Do not write data back, terminate the loop.
  1539. void readDataAvailable(size_t len) noexcept override {
  1540. std::cerr << "readDataAvailable, len " << len << std::endl;
  1541. currentBuffer.length = len;
  1542. buffers.push_back(currentBuffer);
  1543. currentBuffer.reset();
  1544. state = STATE_SUCCEEDED;
  1545. socket_->setReadCB(nullptr);
  1546. base_->terminateLoopSoon();
  1547. }
  1548. private:
  1549. EventBase* base_;
  1550. };
  1551. /**
  1552. * Test a full unencrypted codepath
  1553. */
  1554. TEST(AsyncSSLSocketTest, UnencryptedTest) {
  1555. EventBase base;
  1556. auto clientCtx = std::make_shared<folly::SSLContext>();
  1557. auto serverCtx = std::make_shared<folly::SSLContext>();
  1558. int fds[2];
  1559. getfds(fds);
  1560. getctx(clientCtx, serverCtx);
  1561. auto client =
  1562. AsyncSSLSocket::newSocket(clientCtx, &base, fds[0], false, true);
  1563. auto server = AsyncSSLSocket::newSocket(serverCtx, &base, fds[1], true, true);
  1564. ReadCallbackTerminator readCallback(&base, nullptr);
  1565. server->setReadCB(&readCallback);
  1566. readCallback.setSocket(server);
  1567. uint8_t buf[128];
  1568. memset(buf, 'a', sizeof(buf));
  1569. client->write(nullptr, buf, sizeof(buf));
  1570. // Check that bytes are unencrypted
  1571. char c;
  1572. EXPECT_EQ(1, recv(fds[1], &c, 1, MSG_PEEK));
  1573. EXPECT_EQ('a', c);
  1574. EventBaseAborter eba(&base, 3000);
  1575. base.loop();
  1576. EXPECT_EQ(1, readCallback.buffers.size());
  1577. EXPECT_EQ(AsyncSSLSocket::STATE_UNENCRYPTED, client->getSSLState());
  1578. server->setReadCB(&readCallback);
  1579. // Unencrypted
  1580. server->sslAccept(nullptr);
  1581. client->sslConn(nullptr);
  1582. // Do NOT wait for handshake, writing should be queued and happen after
  1583. client->write(nullptr, buf, sizeof(buf));
  1584. // Check that bytes are *not* unencrypted
  1585. char c2;
  1586. EXPECT_EQ(1, recv(fds[1], &c2, 1, MSG_PEEK));
  1587. EXPECT_NE('a', c2);
  1588. base.loop();
  1589. EXPECT_EQ(2, readCallback.buffers.size());
  1590. EXPECT_EQ(AsyncSSLSocket::STATE_ESTABLISHED, client->getSSLState());
  1591. }
  1592. TEST(AsyncSSLSocketTest, ConnectUnencryptedTest) {
  1593. auto clientCtx = std::make_shared<folly::SSLContext>();
  1594. auto serverCtx = std::make_shared<folly::SSLContext>();
  1595. getctx(clientCtx, serverCtx);
  1596. WriteCallbackBase writeCallback;
  1597. ReadCallback readCallback(&writeCallback);
  1598. HandshakeCallback handshakeCallback(&readCallback);
  1599. SSLServerAcceptCallback acceptCallback(&handshakeCallback);
  1600. TestSSLServer server(&acceptCallback);
  1601. EventBase evb;
  1602. std::shared_ptr<AsyncSSLSocket> socket =
  1603. AsyncSSLSocket::newSocket(clientCtx, &evb, true);
  1604. socket->connect(nullptr, server.getAddress(), 0);
  1605. evb.loop();
  1606. EXPECT_EQ(AsyncSSLSocket::STATE_UNENCRYPTED, socket->getSSLState());
  1607. socket->sslConn(nullptr);
  1608. evb.loop();
  1609. EXPECT_EQ(AsyncSSLSocket::STATE_ESTABLISHED, socket->getSSLState());
  1610. // write()
  1611. std::array<uint8_t, 128> buf;
  1612. memset(buf.data(), 'a', buf.size());
  1613. socket->write(nullptr, buf.data(), buf.size());
  1614. socket->close();
  1615. }
  1616. /**
  1617. * Test acceptrunner in various situations
  1618. */
  1619. TEST(AsyncSSLSocketTest, SSLAcceptRunnerBasic) {
  1620. EventBase eventBase;
  1621. auto clientCtx = std::make_shared<SSLContext>();
  1622. auto serverCtx = std::make_shared<SSLContext>();
  1623. serverCtx->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  1624. serverCtx->loadPrivateKey(kTestKey);
  1625. serverCtx->loadCertificate(kTestCert);
  1626. clientCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::VERIFY);
  1627. clientCtx->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  1628. clientCtx->loadTrustedCertificates(kTestCA);
  1629. int fds[2];
  1630. getfds(fds);
  1631. AsyncSSLSocket::UniquePtr clientSock(
  1632. new AsyncSSLSocket(clientCtx, &eventBase, fds[0], false));
  1633. AsyncSSLSocket::UniquePtr serverSock(
  1634. new AsyncSSLSocket(serverCtx, &eventBase, fds[1], true));
  1635. serverCtx->sslAcceptRunner(std::make_unique<SSLAcceptEvbRunner>(&eventBase));
  1636. SSLHandshakeClient client(std::move(clientSock), true, true);
  1637. SSLHandshakeServer server(std::move(serverSock), true, true);
  1638. eventBase.loop();
  1639. EXPECT_TRUE(client.handshakeSuccess_);
  1640. EXPECT_FALSE(client.handshakeError_);
  1641. EXPECT_LE(0, client.handshakeTime.count());
  1642. EXPECT_TRUE(server.handshakeSuccess_);
  1643. EXPECT_FALSE(server.handshakeError_);
  1644. EXPECT_LE(0, server.handshakeTime.count());
  1645. }
  1646. TEST(AsyncSSLSocketTest, SSLAcceptRunnerAcceptError) {
  1647. EventBase eventBase;
  1648. auto clientCtx = std::make_shared<SSLContext>();
  1649. auto serverCtx = std::make_shared<SSLContext>();
  1650. serverCtx->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  1651. serverCtx->loadPrivateKey(kTestKey);
  1652. serverCtx->loadCertificate(kTestCert);
  1653. clientCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::VERIFY);
  1654. clientCtx->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  1655. clientCtx->loadTrustedCertificates(kTestCA);
  1656. int fds[2];
  1657. getfds(fds);
  1658. AsyncSSLSocket::UniquePtr clientSock(
  1659. new AsyncSSLSocket(clientCtx, &eventBase, fds[0], false));
  1660. AsyncSSLSocket::UniquePtr serverSock(
  1661. new AsyncSSLSocket(serverCtx, &eventBase, fds[1], true));
  1662. serverCtx->sslAcceptRunner(
  1663. std::make_unique<SSLAcceptErrorRunner>(&eventBase));
  1664. SSLHandshakeClient client(std::move(clientSock), true, true);
  1665. SSLHandshakeServer server(std::move(serverSock), true, true);
  1666. eventBase.loop();
  1667. EXPECT_FALSE(client.handshakeSuccess_);
  1668. EXPECT_TRUE(client.handshakeError_);
  1669. EXPECT_FALSE(server.handshakeSuccess_);
  1670. EXPECT_TRUE(server.handshakeError_);
  1671. }
  1672. TEST(AsyncSSLSocketTest, SSLAcceptRunnerAcceptClose) {
  1673. EventBase eventBase;
  1674. auto clientCtx = std::make_shared<SSLContext>();
  1675. auto serverCtx = std::make_shared<SSLContext>();
  1676. serverCtx->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  1677. serverCtx->loadPrivateKey(kTestKey);
  1678. serverCtx->loadCertificate(kTestCert);
  1679. clientCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::VERIFY);
  1680. clientCtx->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  1681. clientCtx->loadTrustedCertificates(kTestCA);
  1682. int fds[2];
  1683. getfds(fds);
  1684. AsyncSSLSocket::UniquePtr clientSock(
  1685. new AsyncSSLSocket(clientCtx, &eventBase, fds[0], false));
  1686. AsyncSSLSocket::UniquePtr serverSock(
  1687. new AsyncSSLSocket(serverCtx, &eventBase, fds[1], true));
  1688. serverCtx->sslAcceptRunner(
  1689. std::make_unique<SSLAcceptCloseRunner>(&eventBase, serverSock.get()));
  1690. SSLHandshakeClient client(std::move(clientSock), true, true);
  1691. SSLHandshakeServer server(std::move(serverSock), true, true);
  1692. eventBase.loop();
  1693. EXPECT_FALSE(client.handshakeSuccess_);
  1694. EXPECT_TRUE(client.handshakeError_);
  1695. EXPECT_FALSE(server.handshakeSuccess_);
  1696. EXPECT_TRUE(server.handshakeError_);
  1697. }
  1698. TEST(AsyncSSLSocketTest, SSLAcceptRunnerAcceptDestroy) {
  1699. EventBase eventBase;
  1700. auto clientCtx = std::make_shared<SSLContext>();
  1701. auto serverCtx = std::make_shared<SSLContext>();
  1702. serverCtx->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  1703. serverCtx->loadPrivateKey(kTestKey);
  1704. serverCtx->loadCertificate(kTestCert);
  1705. clientCtx->setVerificationOption(SSLContext::SSLVerifyPeerEnum::VERIFY);
  1706. clientCtx->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  1707. clientCtx->loadTrustedCertificates(kTestCA);
  1708. int fds[2];
  1709. getfds(fds);
  1710. AsyncSSLSocket::UniquePtr clientSock(
  1711. new AsyncSSLSocket(clientCtx, &eventBase, fds[0], false));
  1712. AsyncSSLSocket::UniquePtr serverSock(
  1713. new AsyncSSLSocket(serverCtx, &eventBase, fds[1], true));
  1714. SSLHandshakeClient client(std::move(clientSock), true, true);
  1715. SSLHandshakeServer server(std::move(serverSock), true, true);
  1716. serverCtx->sslAcceptRunner(
  1717. std::make_unique<SSLAcceptDestroyRunner>(&eventBase, &server));
  1718. eventBase.loop();
  1719. EXPECT_FALSE(client.handshakeSuccess_);
  1720. EXPECT_TRUE(client.handshakeError_);
  1721. EXPECT_FALSE(server.handshakeSuccess_);
  1722. EXPECT_TRUE(server.handshakeError_);
  1723. }
  1724. TEST(AsyncSSLSocketTest, ConnResetErrorString) {
  1725. // Start listening on a local port
  1726. WriteCallbackBase writeCallback;
  1727. WriteErrorCallback readCallback(&writeCallback);
  1728. HandshakeCallback handshakeCallback(
  1729. &readCallback, HandshakeCallback::EXPECT_ERROR);
  1730. SSLServerAcceptCallback acceptCallback(&handshakeCallback);
  1731. TestSSLServer server(&acceptCallback);
  1732. auto socket = std::make_shared<BlockingSocket>(server.getAddress(), nullptr);
  1733. socket->open();
  1734. uint8_t buf[3] = {0x16, 0x03, 0x01};
  1735. socket->write(buf, sizeof(buf));
  1736. socket->closeWithReset();
  1737. handshakeCallback.waitForHandshake();
  1738. EXPECT_NE(
  1739. handshakeCallback.errorString_.find("Network error"), std::string::npos);
  1740. EXPECT_NE(handshakeCallback.errorString_.find("104"), std::string::npos);
  1741. }
  1742. TEST(AsyncSSLSocketTest, ConnEOFErrorString) {
  1743. // Start listening on a local port
  1744. WriteCallbackBase writeCallback;
  1745. WriteErrorCallback readCallback(&writeCallback);
  1746. HandshakeCallback handshakeCallback(
  1747. &readCallback, HandshakeCallback::EXPECT_ERROR);
  1748. SSLServerAcceptCallback acceptCallback(&handshakeCallback);
  1749. TestSSLServer server(&acceptCallback);
  1750. auto socket = std::make_shared<BlockingSocket>(server.getAddress(), nullptr);
  1751. socket->open();
  1752. uint8_t buf[3] = {0x16, 0x03, 0x01};
  1753. socket->write(buf, sizeof(buf));
  1754. socket->close();
  1755. handshakeCallback.waitForHandshake();
  1756. #if FOLLY_OPENSSL_IS_110
  1757. EXPECT_NE(
  1758. handshakeCallback.errorString_.find("Network error"), std::string::npos);
  1759. #else
  1760. EXPECT_NE(
  1761. handshakeCallback.errorString_.find("Connection EOF"), std::string::npos);
  1762. #endif
  1763. }
  1764. TEST(AsyncSSLSocketTest, ConnOpenSSLErrorString) {
  1765. // Start listening on a local port
  1766. WriteCallbackBase writeCallback;
  1767. WriteErrorCallback readCallback(&writeCallback);
  1768. HandshakeCallback handshakeCallback(
  1769. &readCallback, HandshakeCallback::EXPECT_ERROR);
  1770. SSLServerAcceptCallback acceptCallback(&handshakeCallback);
  1771. TestSSLServer server(&acceptCallback);
  1772. auto socket = std::make_shared<BlockingSocket>(server.getAddress(), nullptr);
  1773. socket->open();
  1774. uint8_t buf[256] = {0x16, 0x03};
  1775. memset(buf + 2, 'a', sizeof(buf) - 2);
  1776. socket->write(buf, sizeof(buf));
  1777. socket->close();
  1778. handshakeCallback.waitForHandshake();
  1779. EXPECT_NE(
  1780. handshakeCallback.errorString_.find("SSL routines"), std::string::npos);
  1781. #if defined(OPENSSL_IS_BORINGSSL)
  1782. EXPECT_NE(
  1783. handshakeCallback.errorString_.find("ENCRYPTED_LENGTH_TOO_LONG"),
  1784. std::string::npos);
  1785. #elif FOLLY_OPENSSL_IS_110
  1786. EXPECT_NE(
  1787. handshakeCallback.errorString_.find("packet length too long"),
  1788. std::string::npos);
  1789. #else
  1790. EXPECT_NE(
  1791. handshakeCallback.errorString_.find("unknown protocol"),
  1792. std::string::npos);
  1793. #endif
  1794. }
  1795. TEST(AsyncSSLSocketTest, TestSSLCipherCodeToNameMap) {
  1796. using folly::ssl::OpenSSLUtils;
  1797. EXPECT_EQ(
  1798. OpenSSLUtils::getCipherName(0xc02c), "ECDHE-ECDSA-AES256-GCM-SHA384");
  1799. // TLS_DHE_RSA_WITH_DES_CBC_SHA - We shouldn't be building with this
  1800. EXPECT_EQ(OpenSSLUtils::getCipherName(0x0015), "");
  1801. // This indicates TLS_EMPTY_RENEGOTIATION_INFO_SCSV, no name expected
  1802. EXPECT_EQ(OpenSSLUtils::getCipherName(0x00ff), "");
  1803. }
  1804. #if defined __linux__
  1805. /**
  1806. * Ensure TransparentTLS flag is disabled with AsyncSSLSocket
  1807. */
  1808. TEST(AsyncSSLSocketTest, TTLSDisabled) {
  1809. // clear all setsockopt tracking history
  1810. globalStatic.reset();
  1811. // Start listening on a local port
  1812. WriteCallbackBase writeCallback;
  1813. ReadCallback readCallback(&writeCallback);
  1814. HandshakeCallback handshakeCallback(&readCallback);
  1815. SSLServerAcceptCallback acceptCallback(&handshakeCallback);
  1816. TestSSLServer server(&acceptCallback, false);
  1817. // Set up SSL context.
  1818. auto sslContext = std::make_shared<SSLContext>();
  1819. // connect
  1820. auto socket =
  1821. std::make_shared<BlockingSocket>(server.getAddress(), sslContext);
  1822. socket->open();
  1823. EXPECT_EQ(1, globalStatic.ttlsDisabledSet.count(socket->getSocketFD()));
  1824. // write()
  1825. std::array<uint8_t, 128> buf;
  1826. memset(buf.data(), 'a', buf.size());
  1827. socket->write(buf.data(), buf.size());
  1828. // close()
  1829. socket->close();
  1830. }
  1831. #endif
  1832. #if FOLLY_ALLOW_TFO
  1833. class MockAsyncTFOSSLSocket : public AsyncSSLSocket {
  1834. public:
  1835. using UniquePtr = std::unique_ptr<MockAsyncTFOSSLSocket, Destructor>;
  1836. explicit MockAsyncTFOSSLSocket(
  1837. std::shared_ptr<folly::SSLContext> sslCtx,
  1838. EventBase* evb)
  1839. : AsyncSocket(evb), AsyncSSLSocket(sslCtx, evb) {}
  1840. MOCK_METHOD3(tfoSendMsg, ssize_t(int fd, struct msghdr* msg, int msg_flags));
  1841. };
  1842. #if defined __linux__
  1843. /**
  1844. * Ensure TransparentTLS flag is disabled with AsyncSSLSocket + TFO
  1845. */
  1846. TEST(AsyncSSLSocketTest, TTLSDisabledWithTFO) {
  1847. // clear all setsockopt tracking history
  1848. globalStatic.reset();
  1849. // Start listening on a local port
  1850. WriteCallbackBase writeCallback;
  1851. ReadCallback readCallback(&writeCallback);
  1852. HandshakeCallback handshakeCallback(&readCallback);
  1853. SSLServerAcceptCallback acceptCallback(&handshakeCallback);
  1854. TestSSLServer server(&acceptCallback, true);
  1855. // Set up SSL context.
  1856. auto sslContext = std::make_shared<SSLContext>();
  1857. // connect
  1858. auto socket =
  1859. std::make_shared<BlockingSocket>(server.getAddress(), sslContext);
  1860. socket->enableTFO();
  1861. socket->open();
  1862. EXPECT_EQ(1, globalStatic.ttlsDisabledSet.count(socket->getSocketFD()));
  1863. // write()
  1864. std::array<uint8_t, 128> buf;
  1865. memset(buf.data(), 'a', buf.size());
  1866. socket->write(buf.data(), buf.size());
  1867. // close()
  1868. socket->close();
  1869. }
  1870. #endif
  1871. /**
  1872. * Test connecting to, writing to, reading from, and closing the
  1873. * connection to the SSL server with TFO.
  1874. */
  1875. TEST(AsyncSSLSocketTest, ConnectWriteReadCloseTFO) {
  1876. // Start listening on a local port
  1877. WriteCallbackBase writeCallback;
  1878. ReadCallback readCallback(&writeCallback);
  1879. HandshakeCallback handshakeCallback(&readCallback);
  1880. SSLServerAcceptCallback acceptCallback(&handshakeCallback);
  1881. TestSSLServer server(&acceptCallback, true);
  1882. // Set up SSL context.
  1883. auto sslContext = std::make_shared<SSLContext>();
  1884. // connect
  1885. auto socket =
  1886. std::make_shared<BlockingSocket>(server.getAddress(), sslContext);
  1887. socket->enableTFO();
  1888. socket->open();
  1889. // write()
  1890. std::array<uint8_t, 128> buf;
  1891. memset(buf.data(), 'a', buf.size());
  1892. socket->write(buf.data(), buf.size());
  1893. // read()
  1894. std::array<uint8_t, 128> readbuf;
  1895. uint32_t bytesRead = socket->readAll(readbuf.data(), readbuf.size());
  1896. EXPECT_EQ(bytesRead, 128);
  1897. EXPECT_EQ(memcmp(buf.data(), readbuf.data(), bytesRead), 0);
  1898. // close()
  1899. socket->close();
  1900. }
  1901. /**
  1902. * Test connecting to, writing to, reading from, and closing the
  1903. * connection to the SSL server with TFO.
  1904. */
  1905. TEST(AsyncSSLSocketTest, ConnectWriteReadCloseTFOWithTFOServerDisabled) {
  1906. // Start listening on a local port
  1907. WriteCallbackBase writeCallback;
  1908. ReadCallback readCallback(&writeCallback);
  1909. HandshakeCallback handshakeCallback(&readCallback);
  1910. SSLServerAcceptCallback acceptCallback(&handshakeCallback);
  1911. TestSSLServer server(&acceptCallback, false);
  1912. // Set up SSL context.
  1913. auto sslContext = std::make_shared<SSLContext>();
  1914. // connect
  1915. auto socket =
  1916. std::make_shared<BlockingSocket>(server.getAddress(), sslContext);
  1917. socket->enableTFO();
  1918. socket->open();
  1919. // write()
  1920. std::array<uint8_t, 128> buf;
  1921. memset(buf.data(), 'a', buf.size());
  1922. socket->write(buf.data(), buf.size());
  1923. // read()
  1924. std::array<uint8_t, 128> readbuf;
  1925. uint32_t bytesRead = socket->readAll(readbuf.data(), readbuf.size());
  1926. EXPECT_EQ(bytesRead, 128);
  1927. EXPECT_EQ(memcmp(buf.data(), readbuf.data(), bytesRead), 0);
  1928. // close()
  1929. socket->close();
  1930. }
  1931. class ConnCallback : public AsyncSocket::ConnectCallback {
  1932. public:
  1933. void connectSuccess() noexcept override {
  1934. state = State::SUCCESS;
  1935. }
  1936. void connectErr(const AsyncSocketException& ex) noexcept override {
  1937. state = State::ERROR;
  1938. error = ex.what();
  1939. }
  1940. enum class State { WAITING, SUCCESS, ERROR };
  1941. State state{State::WAITING};
  1942. std::string error;
  1943. };
  1944. template <class Cardinality>
  1945. MockAsyncTFOSSLSocket::UniquePtr setupSocketWithFallback(
  1946. EventBase* evb,
  1947. const SocketAddress& address,
  1948. Cardinality cardinality) {
  1949. // Set up SSL context.
  1950. auto sslContext = std::make_shared<SSLContext>();
  1951. // connect
  1952. auto socket = MockAsyncTFOSSLSocket::UniquePtr(
  1953. new MockAsyncTFOSSLSocket(sslContext, evb));
  1954. socket->enableTFO();
  1955. EXPECT_CALL(*socket, tfoSendMsg(_, _, _))
  1956. .Times(cardinality)
  1957. .WillOnce(Invoke([&](int fd, struct msghdr*, int) {
  1958. sockaddr_storage addr;
  1959. auto len = address.getAddress(&addr);
  1960. return connect(fd, (const struct sockaddr*)&addr, len);
  1961. }));
  1962. return socket;
  1963. }
  1964. TEST(AsyncSSLSocketTest, ConnectWriteReadCloseTFOFallback) {
  1965. // Start listening on a local port
  1966. WriteCallbackBase writeCallback;
  1967. ReadCallback readCallback(&writeCallback);
  1968. HandshakeCallback handshakeCallback(&readCallback);
  1969. SSLServerAcceptCallback acceptCallback(&handshakeCallback);
  1970. TestSSLServer server(&acceptCallback, true);
  1971. EventBase evb;
  1972. auto socket = setupSocketWithFallback(&evb, server.getAddress(), 1);
  1973. ConnCallback ccb;
  1974. socket->connect(&ccb, server.getAddress(), 30);
  1975. evb.loop();
  1976. EXPECT_EQ(ConnCallback::State::SUCCESS, ccb.state);
  1977. evb.runInEventBaseThread([&] { socket->detachEventBase(); });
  1978. evb.loop();
  1979. BlockingSocket sock(std::move(socket));
  1980. // write()
  1981. std::array<uint8_t, 128> buf;
  1982. memset(buf.data(), 'a', buf.size());
  1983. sock.write(buf.data(), buf.size());
  1984. // read()
  1985. std::array<uint8_t, 128> readbuf;
  1986. uint32_t bytesRead = sock.readAll(readbuf.data(), readbuf.size());
  1987. EXPECT_EQ(bytesRead, 128);
  1988. EXPECT_EQ(memcmp(buf.data(), readbuf.data(), bytesRead), 0);
  1989. // close()
  1990. sock.close();
  1991. }
  1992. #if !defined(OPENSSL_IS_BORINGSSL)
  1993. TEST(AsyncSSLSocketTest, ConnectTFOTimeout) {
  1994. // Start listening on a local port
  1995. ConnectTimeoutCallback acceptCallback;
  1996. TestSSLServer server(&acceptCallback, true);
  1997. // Set up SSL context.
  1998. auto sslContext = std::make_shared<SSLContext>();
  1999. // connect
  2000. auto socket =
  2001. std::make_shared<BlockingSocket>(server.getAddress(), sslContext);
  2002. socket->enableTFO();
  2003. EXPECT_THROW(
  2004. socket->open(std::chrono::milliseconds(20)), AsyncSocketException);
  2005. }
  2006. #endif
  2007. #if !defined(OPENSSL_IS_BORINGSSL)
  2008. TEST(AsyncSSLSocketTest, ConnectTFOFallbackTimeout) {
  2009. // Start listening on a local port
  2010. ConnectTimeoutCallback acceptCallback;
  2011. TestSSLServer server(&acceptCallback, true);
  2012. EventBase evb;
  2013. auto socket = setupSocketWithFallback(&evb, server.getAddress(), AtMost(1));
  2014. ConnCallback ccb;
  2015. // Set a short timeout
  2016. socket->connect(&ccb, server.getAddress(), 1);
  2017. evb.loop();
  2018. EXPECT_EQ(ConnCallback::State::ERROR, ccb.state);
  2019. }
  2020. #endif
  2021. TEST(AsyncSSLSocketTest, HandshakeTFOFallbackTimeout) {
  2022. // Start listening on a local port
  2023. EmptyReadCallback readCallback;
  2024. HandshakeCallback handshakeCallback(
  2025. &readCallback, HandshakeCallback::EXPECT_ERROR);
  2026. HandshakeTimeoutCallback acceptCallback(&handshakeCallback);
  2027. TestSSLServer server(&acceptCallback, true);
  2028. EventBase evb;
  2029. auto socket = setupSocketWithFallback(&evb, server.getAddress(), AtMost(1));
  2030. ConnCallback ccb;
  2031. socket->connect(&ccb, server.getAddress(), 100);
  2032. evb.loop();
  2033. EXPECT_EQ(ConnCallback::State::ERROR, ccb.state);
  2034. EXPECT_THAT(ccb.error, testing::HasSubstr("SSL connect timed out"));
  2035. }
  2036. TEST(AsyncSSLSocketTest, HandshakeTFORefused) {
  2037. // Start listening on a local port
  2038. EventBase evb;
  2039. // Hopefully nothing is listening on this address
  2040. SocketAddress addr("127.0.0.1", 65535);
  2041. auto socket = setupSocketWithFallback(&evb, addr, AtMost(1));
  2042. ConnCallback ccb;
  2043. socket->connect(&ccb, addr, 100);
  2044. evb.loop();
  2045. EXPECT_EQ(ConnCallback::State::ERROR, ccb.state);
  2046. EXPECT_THAT(ccb.error, testing::HasSubstr("refused"));
  2047. }
  2048. TEST(AsyncSSLSocketTest, TestPreReceivedData) {
  2049. EventBase eventBase;
  2050. auto clientCtx = std::make_shared<SSLContext>();
  2051. auto dfServerCtx = std::make_shared<SSLContext>();
  2052. std::array<int, 2> fds;
  2053. getfds(fds.data());
  2054. getctx(clientCtx, dfServerCtx);
  2055. AsyncSSLSocket::UniquePtr clientSockPtr(
  2056. new AsyncSSLSocket(clientCtx, &eventBase, fds[0], false));
  2057. AsyncSSLSocket::UniquePtr serverSockPtr(
  2058. new AsyncSSLSocket(dfServerCtx, &eventBase, fds[1], true));
  2059. auto clientSock = clientSockPtr.get();
  2060. auto serverSock = serverSockPtr.get();
  2061. SSLHandshakeClient client(std::move(clientSockPtr), true, true);
  2062. // Steal some data from the server.
  2063. std::array<uint8_t, 10> buf;
  2064. auto bytesReceived = recv(fds[1], buf.data(), buf.size(), 0);
  2065. checkUnixError(bytesReceived, "recv failed");
  2066. serverSock->setPreReceivedData(
  2067. IOBuf::wrapBuffer(ByteRange(buf.data(), bytesReceived)));
  2068. SSLHandshakeServer server(std::move(serverSockPtr), true, true);
  2069. while (!client.handshakeSuccess_ && !client.handshakeError_) {
  2070. eventBase.loopOnce();
  2071. }
  2072. EXPECT_TRUE(client.handshakeSuccess_);
  2073. EXPECT_TRUE(server.handshakeSuccess_);
  2074. EXPECT_EQ(
  2075. serverSock->getRawBytesReceived(), clientSock->getRawBytesWritten());
  2076. }
  2077. TEST(AsyncSSLSocketTest, TestMoveFromAsyncSocket) {
  2078. EventBase eventBase;
  2079. auto clientCtx = std::make_shared<SSLContext>();
  2080. auto dfServerCtx = std::make_shared<SSLContext>();
  2081. std::array<int, 2> fds;
  2082. getfds(fds.data());
  2083. getctx(clientCtx, dfServerCtx);
  2084. AsyncSSLSocket::UniquePtr clientSockPtr(
  2085. new AsyncSSLSocket(clientCtx, &eventBase, fds[0], false));
  2086. AsyncSocket::UniquePtr serverSockPtr(new AsyncSocket(&eventBase, fds[1]));
  2087. auto clientSock = clientSockPtr.get();
  2088. auto serverSock = serverSockPtr.get();
  2089. SSLHandshakeClient client(std::move(clientSockPtr), true, true);
  2090. // Steal some data from the server.
  2091. std::array<uint8_t, 10> buf;
  2092. auto bytesReceived = recv(fds[1], buf.data(), buf.size(), 0);
  2093. checkUnixError(bytesReceived, "recv failed");
  2094. serverSock->setPreReceivedData(
  2095. IOBuf::wrapBuffer(ByteRange(buf.data(), bytesReceived)));
  2096. AsyncSSLSocket::UniquePtr serverSSLSockPtr(
  2097. new AsyncSSLSocket(dfServerCtx, std::move(serverSockPtr), true));
  2098. auto serverSSLSock = serverSSLSockPtr.get();
  2099. SSLHandshakeServer server(std::move(serverSSLSockPtr), true, true);
  2100. while (!client.handshakeSuccess_ && !client.handshakeError_) {
  2101. eventBase.loopOnce();
  2102. }
  2103. EXPECT_TRUE(client.handshakeSuccess_);
  2104. EXPECT_TRUE(server.handshakeSuccess_);
  2105. EXPECT_EQ(
  2106. serverSSLSock->getRawBytesReceived(), clientSock->getRawBytesWritten());
  2107. }
  2108. /**
  2109. * Test overriding the flags passed to "sendmsg()" system call,
  2110. * and verifying that write requests fail properly.
  2111. */
  2112. TEST(AsyncSSLSocketTest, SendMsgParamsCallback) {
  2113. // Start listening on a local port
  2114. SendMsgFlagsCallback msgCallback;
  2115. ExpectWriteErrorCallback writeCallback(&msgCallback);
  2116. ReadCallback readCallback(&writeCallback);
  2117. HandshakeCallback handshakeCallback(&readCallback);
  2118. SSLServerAcceptCallback acceptCallback(&handshakeCallback);
  2119. TestSSLServer server(&acceptCallback);
  2120. // Set up SSL context.
  2121. auto sslContext = std::make_shared<SSLContext>();
  2122. sslContext->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  2123. // connect
  2124. auto socket =
  2125. std::make_shared<BlockingSocket>(server.getAddress(), sslContext);
  2126. socket->open();
  2127. // Setting flags to "-1" to trigger "Invalid argument" error
  2128. // on attempt to use this flags in sendmsg() system call.
  2129. msgCallback.resetFlags(-1);
  2130. // write()
  2131. std::vector<uint8_t> buf(128, 'a');
  2132. ASSERT_EQ(socket->write(buf.data(), buf.size()), buf.size());
  2133. // close()
  2134. socket->close();
  2135. cerr << "SendMsgParamsCallback test completed" << endl;
  2136. }
  2137. #ifdef FOLLY_HAVE_MSG_ERRQUEUE
  2138. /**
  2139. * Test connecting to, writing to, reading from, and closing the
  2140. * connection to the SSL server.
  2141. */
  2142. TEST(AsyncSSLSocketTest, SendMsgDataCallback) {
  2143. // This test requires Linux kernel v4.6 or later
  2144. struct utsname s_uname;
  2145. memset(&s_uname, 0, sizeof(s_uname));
  2146. ASSERT_EQ(uname(&s_uname), 0);
  2147. int major, minor;
  2148. folly::StringPiece extra;
  2149. if (folly::split<false>(
  2150. '.', std::string(s_uname.release) + ".", major, minor, extra)) {
  2151. if (major < 4 || (major == 4 && minor < 6)) {
  2152. LOG(INFO) << "Kernel version: 4.6 and newer required for this test ("
  2153. << "kernel ver. " << s_uname.release << " detected).";
  2154. return;
  2155. }
  2156. }
  2157. // Start listening on a local port
  2158. SendMsgDataCallback msgCallback;
  2159. WriteCheckTimestampCallback writeCallback(&msgCallback);
  2160. ReadCallback readCallback(&writeCallback);
  2161. HandshakeCallback handshakeCallback(&readCallback);
  2162. SSLServerAcceptCallback acceptCallback(&handshakeCallback);
  2163. TestSSLServer server(&acceptCallback);
  2164. // Set up SSL context.
  2165. auto sslContext = std::make_shared<SSLContext>();
  2166. sslContext->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
  2167. // connect
  2168. auto socket =
  2169. std::make_shared<BlockingSocket>(server.getAddress(), sslContext);
  2170. socket->open();
  2171. // Adding MSG_EOR flag to the message flags - it'll trigger
  2172. // timestamp generation for the last byte of the message.
  2173. msgCallback.resetFlags(MSG_DONTWAIT | MSG_NOSIGNAL | MSG_EOR);
  2174. // Init ancillary data buffer to trigger timestamp notification
  2175. union {
  2176. uint8_t ctrl_data[CMSG_LEN(sizeof(uint32_t))];
  2177. struct cmsghdr cmsg;
  2178. } u;
  2179. u.cmsg.cmsg_level = SOL_SOCKET;
  2180. u.cmsg.cmsg_type = SO_TIMESTAMPING;
  2181. u.cmsg.cmsg_len = CMSG_LEN(sizeof(uint32_t));
  2182. uint32_t flags = SOF_TIMESTAMPING_TX_SCHED | SOF_TIMESTAMPING_TX_SOFTWARE |
  2183. SOF_TIMESTAMPING_TX_ACK;
  2184. memcpy(CMSG_DATA(&u.cmsg), &flags, sizeof(uint32_t));
  2185. std::vector<char> ctrl(CMSG_LEN(sizeof(uint32_t)));
  2186. memcpy(ctrl.data(), u.ctrl_data, CMSG_LEN(sizeof(uint32_t)));
  2187. msgCallback.resetData(std::move(ctrl));
  2188. // write()
  2189. std::vector<uint8_t> buf(128, 'a');
  2190. socket->write(buf.data(), buf.size());
  2191. // read()
  2192. std::vector<uint8_t> readbuf(buf.size());
  2193. uint32_t bytesRead = socket->readAll(readbuf.data(), readbuf.size());
  2194. EXPECT_EQ(bytesRead, buf.size());
  2195. EXPECT_TRUE(std::equal(buf.begin(), buf.end(), readbuf.begin()));
  2196. writeCallback.checkForTimestampNotifications();
  2197. // close()
  2198. socket->close();
  2199. cerr << "SendMsgDataCallback test completed" << endl;
  2200. }
  2201. #endif // FOLLY_HAVE_MSG_ERRQUEUE
  2202. #endif
  2203. } // namespace folly
  2204. #ifdef SIGPIPE
  2205. ///////////////////////////////////////////////////////////////////////////
  2206. // init_unit_test_suite
  2207. ///////////////////////////////////////////////////////////////////////////
  2208. namespace {
  2209. struct Initializer {
  2210. Initializer() {
  2211. signal(SIGPIPE, SIG_IGN);
  2212. }
  2213. };
  2214. Initializer initializer;
  2215. } // namespace
  2216. #endif