ssl_test.cc 205 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590
  1. /* Copyright (c) 2014, Google Inc.
  2. *
  3. * Permission to use, copy, modify, and/or distribute this software for any
  4. * purpose with or without fee is hereby granted, provided that the above
  5. * copyright notice and this permission notice appear in all copies.
  6. *
  7. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  8. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  9. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
  10. * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  11. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
  12. * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  13. * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
  14. #include <stdio.h>
  15. #include <string.h>
  16. #include <time.h>
  17. #include <algorithm>
  18. #include <limits>
  19. #include <string>
  20. #include <utility>
  21. #include <vector>
  22. #include <gtest/gtest.h>
  23. #include <openssl/base64.h>
  24. #include <openssl/bio.h>
  25. #include <openssl/cipher.h>
  26. #include <openssl/crypto.h>
  27. #include <openssl/err.h>
  28. #include <openssl/hmac.h>
  29. #include <openssl/pem.h>
  30. #include <openssl/sha.h>
  31. #include <openssl/ssl.h>
  32. #include <openssl/rand.h>
  33. #include <openssl/x509.h>
  34. #include "internal.h"
  35. #include "../crypto/internal.h"
  36. #include "../crypto/test/test_util.h"
  37. #if defined(OPENSSL_WINDOWS)
  38. // Windows defines struct timeval in winsock2.h.
  39. OPENSSL_MSVC_PRAGMA(warning(push, 3))
  40. #include <winsock2.h>
  41. OPENSSL_MSVC_PRAGMA(warning(pop))
  42. #else
  43. #include <sys/time.h>
  44. #endif
  45. #if defined(OPENSSL_THREADS)
  46. #include <thread>
  47. #endif
  48. BSSL_NAMESPACE_BEGIN
  49. namespace {
  50. #define TRACED_CALL(code) \
  51. do { \
  52. SCOPED_TRACE("<- called from here"); \
  53. code; \
  54. if (::testing::Test::HasFatalFailure()) { \
  55. return; \
  56. } \
  57. } while (false)
  58. struct VersionParam {
  59. uint16_t version;
  60. enum { is_tls, is_dtls } ssl_method;
  61. const char name[8];
  62. };
  63. static const size_t kTicketKeyLen = 48;
  64. static const VersionParam kAllVersions[] = {
  65. {TLS1_VERSION, VersionParam::is_tls, "TLS1"},
  66. {TLS1_1_VERSION, VersionParam::is_tls, "TLS1_1"},
  67. {TLS1_2_VERSION, VersionParam::is_tls, "TLS1_2"},
  68. {TLS1_3_VERSION, VersionParam::is_tls, "TLS1_3"},
  69. {DTLS1_VERSION, VersionParam::is_dtls, "DTLS1"},
  70. {DTLS1_2_VERSION, VersionParam::is_dtls, "DTLS1_2"},
  71. };
  72. struct ExpectedCipher {
  73. unsigned long id;
  74. int in_group_flag;
  75. };
  76. struct CipherTest {
  77. // The rule string to apply.
  78. const char *rule;
  79. // The list of expected ciphers, in order.
  80. std::vector<ExpectedCipher> expected;
  81. // True if this cipher list should fail in strict mode.
  82. bool strict_fail;
  83. };
  84. struct CurveTest {
  85. // The rule string to apply.
  86. const char *rule;
  87. // The list of expected curves, in order.
  88. std::vector<uint16_t> expected;
  89. };
  90. template <typename T>
  91. class UnownedSSLExData {
  92. public:
  93. UnownedSSLExData() {
  94. index_ = SSL_get_ex_new_index(0, nullptr, nullptr, nullptr, nullptr);
  95. }
  96. T *Get(const SSL *ssl) {
  97. return index_ < 0 ? nullptr
  98. : static_cast<T *>(SSL_get_ex_data(ssl, index_));
  99. }
  100. bool Set(SSL *ssl, T *t) {
  101. return index_ >= 0 && SSL_set_ex_data(ssl, index_, t);
  102. }
  103. private:
  104. int index_;
  105. };
  106. static const CipherTest kCipherTests[] = {
  107. // Selecting individual ciphers should work.
  108. {
  109. "ECDHE-ECDSA-CHACHA20-POLY1305:"
  110. "ECDHE-RSA-CHACHA20-POLY1305:"
  111. "ECDHE-ECDSA-AES128-GCM-SHA256:"
  112. "ECDHE-RSA-AES128-GCM-SHA256",
  113. {
  114. {TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, 0},
  115. {TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, 0},
  116. {TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 0},
  117. {TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0},
  118. },
  119. false,
  120. },
  121. // + reorders selected ciphers to the end, keeping their relative order.
  122. {
  123. "ECDHE-ECDSA-CHACHA20-POLY1305:"
  124. "ECDHE-RSA-CHACHA20-POLY1305:"
  125. "ECDHE-ECDSA-AES128-GCM-SHA256:"
  126. "ECDHE-RSA-AES128-GCM-SHA256:"
  127. "+aRSA",
  128. {
  129. {TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, 0},
  130. {TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 0},
  131. {TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, 0},
  132. {TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0},
  133. },
  134. false,
  135. },
  136. // ! banishes ciphers from future selections.
  137. {
  138. "!aRSA:"
  139. "ECDHE-ECDSA-CHACHA20-POLY1305:"
  140. "ECDHE-RSA-CHACHA20-POLY1305:"
  141. "ECDHE-ECDSA-AES128-GCM-SHA256:"
  142. "ECDHE-RSA-AES128-GCM-SHA256",
  143. {
  144. {TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, 0},
  145. {TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 0},
  146. },
  147. false,
  148. },
  149. // Multiple masks can be ANDed in a single rule.
  150. {
  151. "kRSA+AESGCM+AES128",
  152. {
  153. {TLS1_CK_RSA_WITH_AES_128_GCM_SHA256, 0},
  154. },
  155. false,
  156. },
  157. // - removes selected ciphers, but preserves their order for future
  158. // selections. Select AES_128_GCM, but order the key exchanges RSA,
  159. // ECDHE_RSA.
  160. {
  161. "ALL:-kECDHE:"
  162. "-kRSA:-ALL:"
  163. "AESGCM+AES128+aRSA",
  164. {
  165. {TLS1_CK_RSA_WITH_AES_128_GCM_SHA256, 0},
  166. {TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0},
  167. },
  168. false,
  169. },
  170. // Unknown selectors are no-ops, except in strict mode.
  171. {
  172. "ECDHE-ECDSA-CHACHA20-POLY1305:"
  173. "ECDHE-RSA-CHACHA20-POLY1305:"
  174. "ECDHE-ECDSA-AES128-GCM-SHA256:"
  175. "ECDHE-RSA-AES128-GCM-SHA256:"
  176. "BOGUS1",
  177. {
  178. {TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, 0},
  179. {TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, 0},
  180. {TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 0},
  181. {TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0},
  182. },
  183. true,
  184. },
  185. // Unknown selectors are no-ops, except in strict mode.
  186. {
  187. "ECDHE-ECDSA-CHACHA20-POLY1305:"
  188. "ECDHE-RSA-CHACHA20-POLY1305:"
  189. "ECDHE-ECDSA-AES128-GCM-SHA256:"
  190. "ECDHE-RSA-AES128-GCM-SHA256:"
  191. "-BOGUS2:+BOGUS3:!BOGUS4",
  192. {
  193. {TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, 0},
  194. {TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, 0},
  195. {TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 0},
  196. {TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0},
  197. },
  198. true,
  199. },
  200. // Square brackets specify equi-preference groups.
  201. {
  202. "[ECDHE-ECDSA-CHACHA20-POLY1305|ECDHE-ECDSA-AES128-GCM-SHA256]:"
  203. "[ECDHE-RSA-CHACHA20-POLY1305]:"
  204. "ECDHE-RSA-AES128-GCM-SHA256",
  205. {
  206. {TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, 1},
  207. {TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 0},
  208. {TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, 0},
  209. {TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0},
  210. },
  211. false,
  212. },
  213. // Standard names may be used instead of OpenSSL names.
  214. {
  215. "[TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256|"
  216. "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256]:"
  217. "[TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256]:"
  218. "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
  219. {
  220. {TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, 1},
  221. {TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 0},
  222. {TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, 0},
  223. {TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0},
  224. },
  225. false,
  226. },
  227. // @STRENGTH performs a stable strength-sort of the selected ciphers and
  228. // only the selected ciphers.
  229. {
  230. // To simplify things, banish all but {ECDHE_RSA,RSA} x
  231. // {CHACHA20,AES_256_CBC,AES_128_CBC} x SHA1.
  232. "!AESGCM:!3DES:"
  233. // Order some ciphers backwards by strength.
  234. "ALL:-CHACHA20:-AES256:-AES128:-ALL:"
  235. // Select ECDHE ones and sort them by strength. Ties should resolve
  236. // based on the order above.
  237. "kECDHE:@STRENGTH:-ALL:"
  238. // Now bring back everything uses RSA. ECDHE_RSA should be first, sorted
  239. // by strength. Then RSA, backwards by strength.
  240. "aRSA",
  241. {
  242. {TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA, 0},
  243. {TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, 0},
  244. {TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA, 0},
  245. {TLS1_CK_RSA_WITH_AES_128_SHA, 0},
  246. {TLS1_CK_RSA_WITH_AES_256_SHA, 0},
  247. },
  248. false,
  249. },
  250. // Additional masks after @STRENGTH get silently discarded.
  251. //
  252. // TODO(davidben): Make this an error. If not silently discarded, they get
  253. // interpreted as + opcodes which are very different.
  254. {
  255. "ECDHE-RSA-AES128-GCM-SHA256:"
  256. "ECDHE-RSA-AES256-GCM-SHA384:"
  257. "@STRENGTH+AES256",
  258. {
  259. {TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA384, 0},
  260. {TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0},
  261. },
  262. false,
  263. },
  264. {
  265. "ECDHE-RSA-AES128-GCM-SHA256:"
  266. "ECDHE-RSA-AES256-GCM-SHA384:"
  267. "@STRENGTH+AES256:"
  268. "ECDHE-RSA-CHACHA20-POLY1305",
  269. {
  270. {TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA384, 0},
  271. {TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0},
  272. {TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, 0},
  273. },
  274. false,
  275. },
  276. // Exact ciphers may not be used in multi-part rules; they are treated
  277. // as unknown aliases.
  278. {
  279. "ECDHE-ECDSA-AES128-GCM-SHA256:"
  280. "ECDHE-RSA-AES128-GCM-SHA256:"
  281. "!ECDHE-RSA-AES128-GCM-SHA256+RSA:"
  282. "!ECDSA+ECDHE-ECDSA-AES128-GCM-SHA256",
  283. {
  284. {TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 0},
  285. {TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0},
  286. },
  287. true,
  288. },
  289. // SSLv3 matches everything that existed before TLS 1.2.
  290. {
  291. "AES128-SHA:ECDHE-RSA-AES128-GCM-SHA256:!SSLv3",
  292. {
  293. {TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0},
  294. },
  295. false,
  296. },
  297. // TLSv1.2 matches everything added in TLS 1.2.
  298. {
  299. "AES128-SHA:ECDHE-RSA-AES128-GCM-SHA256:!TLSv1.2",
  300. {
  301. {TLS1_CK_RSA_WITH_AES_128_SHA, 0},
  302. },
  303. false,
  304. },
  305. // The two directives have no intersection. But each component is valid, so
  306. // even in strict mode it is accepted.
  307. {
  308. "AES128-SHA:ECDHE-RSA-AES128-GCM-SHA256:!TLSv1.2+SSLv3",
  309. {
  310. {TLS1_CK_RSA_WITH_AES_128_SHA, 0},
  311. {TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0},
  312. },
  313. false,
  314. },
  315. // Spaces, semi-colons and commas are separators.
  316. {
  317. "AES128-SHA: ECDHE-RSA-AES128-GCM-SHA256 AES256-SHA ,ECDHE-ECDSA-AES128-GCM-SHA256 ; AES128-GCM-SHA256",
  318. {
  319. {TLS1_CK_RSA_WITH_AES_128_SHA, 0},
  320. {TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0},
  321. {TLS1_CK_RSA_WITH_AES_256_SHA, 0},
  322. {TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 0},
  323. {TLS1_CK_RSA_WITH_AES_128_GCM_SHA256, 0},
  324. },
  325. // …but not in strict mode.
  326. true,
  327. },
  328. };
  329. static const char *kBadRules[] = {
  330. // Invalid brackets.
  331. "[ECDHE-RSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256",
  332. "RSA]",
  333. "[[RSA]]",
  334. // Operators inside brackets.
  335. "[+RSA]",
  336. // Unknown directive.
  337. "@BOGUS",
  338. // Empty cipher lists error at SSL_CTX_set_cipher_list.
  339. "",
  340. "BOGUS",
  341. // COMPLEMENTOFDEFAULT is empty.
  342. "COMPLEMENTOFDEFAULT",
  343. // Invalid command.
  344. "?BAR",
  345. // Special operators are not allowed if groups are used.
  346. "[ECDHE-RSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256]:+FOO",
  347. "[ECDHE-RSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256]:!FOO",
  348. "[ECDHE-RSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256]:-FOO",
  349. "[ECDHE-RSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256]:@STRENGTH",
  350. // Opcode supplied, but missing selector.
  351. "+",
  352. // Spaces are forbidden in equal-preference groups.
  353. "[AES128-SHA | AES128-SHA256]",
  354. };
  355. static const char *kMustNotIncludeNull[] = {
  356. "ALL",
  357. "DEFAULT",
  358. "HIGH",
  359. "FIPS",
  360. "SHA",
  361. "SHA1",
  362. "RSA",
  363. "SSLv3",
  364. "TLSv1",
  365. "TLSv1.2",
  366. };
  367. static const CurveTest kCurveTests[] = {
  368. {
  369. "P-256",
  370. { SSL_CURVE_SECP256R1 },
  371. },
  372. {
  373. "P-256:CECPQ2",
  374. { SSL_CURVE_SECP256R1, SSL_CURVE_CECPQ2 },
  375. },
  376. {
  377. "P-256:P-384:P-521:X25519",
  378. {
  379. SSL_CURVE_SECP256R1,
  380. SSL_CURVE_SECP384R1,
  381. SSL_CURVE_SECP521R1,
  382. SSL_CURVE_X25519,
  383. },
  384. },
  385. {
  386. "prime256v1:secp384r1:secp521r1:x25519",
  387. {
  388. SSL_CURVE_SECP256R1,
  389. SSL_CURVE_SECP384R1,
  390. SSL_CURVE_SECP521R1,
  391. SSL_CURVE_X25519,
  392. },
  393. },
  394. };
  395. static const char *kBadCurvesLists[] = {
  396. "",
  397. ":",
  398. "::",
  399. "P-256::X25519",
  400. "RSA:P-256",
  401. "P-256:RSA",
  402. "X25519:P-256:",
  403. ":X25519:P-256",
  404. };
  405. static std::string CipherListToString(SSL_CTX *ctx) {
  406. bool in_group = false;
  407. std::string ret;
  408. const STACK_OF(SSL_CIPHER) *ciphers = SSL_CTX_get_ciphers(ctx);
  409. for (size_t i = 0; i < sk_SSL_CIPHER_num(ciphers); i++) {
  410. const SSL_CIPHER *cipher = sk_SSL_CIPHER_value(ciphers, i);
  411. if (!in_group && SSL_CTX_cipher_in_group(ctx, i)) {
  412. ret += "\t[\n";
  413. in_group = true;
  414. }
  415. ret += "\t";
  416. if (in_group) {
  417. ret += " ";
  418. }
  419. ret += SSL_CIPHER_get_name(cipher);
  420. ret += "\n";
  421. if (in_group && !SSL_CTX_cipher_in_group(ctx, i)) {
  422. ret += "\t]\n";
  423. in_group = false;
  424. }
  425. }
  426. return ret;
  427. }
  428. static bool CipherListsEqual(SSL_CTX *ctx,
  429. const std::vector<ExpectedCipher> &expected) {
  430. const STACK_OF(SSL_CIPHER) *ciphers = SSL_CTX_get_ciphers(ctx);
  431. if (sk_SSL_CIPHER_num(ciphers) != expected.size()) {
  432. return false;
  433. }
  434. for (size_t i = 0; i < expected.size(); i++) {
  435. const SSL_CIPHER *cipher = sk_SSL_CIPHER_value(ciphers, i);
  436. if (expected[i].id != SSL_CIPHER_get_id(cipher) ||
  437. expected[i].in_group_flag != !!SSL_CTX_cipher_in_group(ctx, i)) {
  438. return false;
  439. }
  440. }
  441. return true;
  442. }
  443. TEST(SSLTest, CipherRules) {
  444. for (const CipherTest &t : kCipherTests) {
  445. SCOPED_TRACE(t.rule);
  446. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  447. ASSERT_TRUE(ctx);
  448. // Test lax mode.
  449. ASSERT_TRUE(SSL_CTX_set_cipher_list(ctx.get(), t.rule));
  450. EXPECT_TRUE(CipherListsEqual(ctx.get(), t.expected))
  451. << "Cipher rule evaluated to:\n"
  452. << CipherListToString(ctx.get());
  453. // Test strict mode.
  454. if (t.strict_fail) {
  455. EXPECT_FALSE(SSL_CTX_set_strict_cipher_list(ctx.get(), t.rule));
  456. } else {
  457. ASSERT_TRUE(SSL_CTX_set_strict_cipher_list(ctx.get(), t.rule));
  458. EXPECT_TRUE(CipherListsEqual(ctx.get(), t.expected))
  459. << "Cipher rule evaluated to:\n"
  460. << CipherListToString(ctx.get());
  461. }
  462. }
  463. for (const char *rule : kBadRules) {
  464. SCOPED_TRACE(rule);
  465. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  466. ASSERT_TRUE(ctx);
  467. EXPECT_FALSE(SSL_CTX_set_cipher_list(ctx.get(), rule));
  468. ERR_clear_error();
  469. }
  470. for (const char *rule : kMustNotIncludeNull) {
  471. SCOPED_TRACE(rule);
  472. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  473. ASSERT_TRUE(ctx);
  474. ASSERT_TRUE(SSL_CTX_set_strict_cipher_list(ctx.get(), rule));
  475. for (const SSL_CIPHER *cipher : SSL_CTX_get_ciphers(ctx.get())) {
  476. EXPECT_NE(NID_undef, SSL_CIPHER_get_cipher_nid(cipher));
  477. }
  478. }
  479. }
  480. TEST(SSLTest, CurveRules) {
  481. for (const CurveTest &t : kCurveTests) {
  482. SCOPED_TRACE(t.rule);
  483. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  484. ASSERT_TRUE(ctx);
  485. ASSERT_TRUE(SSL_CTX_set1_curves_list(ctx.get(), t.rule));
  486. ASSERT_EQ(t.expected.size(), ctx->supported_group_list.size());
  487. for (size_t i = 0; i < t.expected.size(); i++) {
  488. EXPECT_EQ(t.expected[i], ctx->supported_group_list[i]);
  489. }
  490. }
  491. for (const char *rule : kBadCurvesLists) {
  492. SCOPED_TRACE(rule);
  493. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  494. ASSERT_TRUE(ctx);
  495. EXPECT_FALSE(SSL_CTX_set1_curves_list(ctx.get(), rule));
  496. ERR_clear_error();
  497. }
  498. }
  499. // kOpenSSLSession is a serialized SSL_SESSION.
  500. static const char kOpenSSLSession[] =
  501. "MIIFqgIBAQICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
  502. "kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
  503. "IWoJoQYCBFRDO46iBAICASyjggR6MIIEdjCCA16gAwIBAgIIK9dUvsPWSlUwDQYJ"
  504. "KoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMx"
  505. "JTAjBgNVBAMTHEdvb2dsZSBJbnRlcm5ldCBBdXRob3JpdHkgRzIwHhcNMTQxMDA4"
  506. "MTIwNzU3WhcNMTUwMTA2MDAwMDAwWjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwK"
  507. "Q2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzETMBEGA1UECgwKR29v"
  508. "Z2xlIEluYzEXMBUGA1UEAwwOd3d3Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEB"
  509. "AQUAA4IBDwAwggEKAoIBAQCcKeLrplAC+Lofy8t/wDwtB6eu72CVp0cJ4V3lknN6"
  510. "huH9ct6FFk70oRIh/VBNBBz900jYy+7111Jm1b8iqOTQ9aT5C7SEhNcQFJvqzH3e"
  511. "MPkb6ZSWGm1yGF7MCQTGQXF20Sk/O16FSjAynU/b3oJmOctcycWYkY0ytS/k3LBu"
  512. "Id45PJaoMqjB0WypqvNeJHC3q5JjCB4RP7Nfx5jjHSrCMhw8lUMW4EaDxjaR9KDh"
  513. "PLgjsk+LDIySRSRDaCQGhEOWLJZVLzLo4N6/UlctCHEllpBUSvEOyFga52qroGjg"
  514. "rf3WOQ925MFwzd6AK+Ich0gDRg8sQfdLH5OuP1cfLfU1AgMBAAGjggFBMIIBPTAd"
  515. "BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdv"
  516. "b2dsZS5jb20waAYIKwYBBQUHAQEEXDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtp"
  517. "Lmdvb2dsZS5jb20vR0lBRzIuY3J0MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50"
  518. "czEuZ29vZ2xlLmNvbS9vY3NwMB0GA1UdDgQWBBQ7a+CcxsZByOpc+xpYFcIbnUMZ"
  519. "hTAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEv"
  520. "MBcGA1UdIAQQMA4wDAYKKwYBBAHWeQIFATAwBgNVHR8EKTAnMCWgI6Ahhh9odHRw"
  521. "Oi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCa"
  522. "OXCBdoqUy5bxyq+Wrh1zsyyCFim1PH5VU2+yvDSWrgDY8ibRGJmfff3r4Lud5kal"
  523. "dKs9k8YlKD3ITG7P0YT/Rk8hLgfEuLcq5cc0xqmE42xJ+Eo2uzq9rYorc5emMCxf"
  524. "5L0TJOXZqHQpOEcuptZQ4OjdYMfSxk5UzueUhA3ogZKRcRkdB3WeWRp+nYRhx4St"
  525. "o2rt2A0MKmY9165GHUqMK9YaaXHDXqBu7Sefr1uSoAP9gyIJKeihMivsGqJ1TD6Z"
  526. "cc6LMe+dN2P8cZEQHtD1y296ul4Mivqk3jatUVL8/hCwgch9A8O4PGZq9WqBfEWm"
  527. "IyHh1dPtbg1lOXdYCWtjpAIEAKUDAgEUqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36S"
  528. "YTcLEkXqKwOBfF9vE4KX0NxeLwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9B"
  529. "sNHM362zZnY27GpTw+Kwd751CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yE"
  530. "OTDKPNj3+inbMaVigtK4PLyPq+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdA"
  531. "i4gv7Y5oliyntgMBAQA=";
  532. // kCustomSession is a custom serialized SSL_SESSION generated by
  533. // filling in missing fields from |kOpenSSLSession|. This includes
  534. // providing |peer_sha256|, so |peer| is not serialized.
  535. static const char kCustomSession[] =
  536. "MIIBZAIBAQICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
  537. "kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
  538. "IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUqAcEBXdvcmxkqQUCAwGJwKqBpwSB"
  539. "pBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0NxeLwjcDTpsuh3qXEaZ992r1N38"
  540. "VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751CLoXFPoaMOe57dbBpXoro6Pd"
  541. "3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyPq+Topyzvx9USFgRvyuoxn0Hg"
  542. "b+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYGBgYGBgYGBgYGBgYGBgYGBgYG"
  543. "BgYGBgYGBgYGrgMEAQevAwQBBLADBAEF";
  544. // kBoringSSLSession is a serialized SSL_SESSION generated from bssl client.
  545. static const char kBoringSSLSession[] =
  546. "MIIRwQIBAQICAwMEAsAvBCDdoGxGK26mR+8lM0uq6+k9xYuxPnwAjpcF9n0Yli9R"
  547. "kQQwbyshfWhdi5XQ1++7n2L1qqrcVlmHBPpr6yknT/u4pUrpQB5FZ7vqvNn8MdHf"
  548. "9rWgoQYCBFXgs7uiBAICHCCjggR6MIIEdjCCA16gAwIBAgIIf+yfD7Y6UicwDQYJ"
  549. "KoZIhvcNAQELBQAwSTELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMx"
  550. "JTAjBgNVBAMTHEdvb2dsZSBJbnRlcm5ldCBBdXRob3JpdHkgRzIwHhcNMTUwODEy"
  551. "MTQ1MzE1WhcNMTUxMTEwMDAwMDAwWjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwK"
  552. "Q2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzETMBEGA1UECgwKR29v"
  553. "Z2xlIEluYzEXMBUGA1UEAwwOd3d3Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEB"
  554. "AQUAA4IBDwAwggEKAoIBAQC0MeG5YGQ0t+IeJeoneP/PrhEaieibeKYkbKVLNZpo"
  555. "PLuBinvhkXZo3DC133NpCBpy6ZktBwamqyixAyuk/NU6OjgXqwwxfQ7di1AInLIU"
  556. "792c7hFyNXSUCG7At8Ifi3YwBX9Ba6u/1d6rWTGZJrdCq3QU11RkKYyTq2KT5mce"
  557. "Tv9iGKqSkSTlp8puy/9SZ/3DbU3U+BuqCFqeSlz7zjwFmk35acdCilpJlVDDN5C/"
  558. "RCh8/UKc8PaL+cxlt531qoTENvYrflBno14YEZlCBZsPiFeUSILpKEj3Ccwhy0eL"
  559. "EucWQ72YZU8mUzXBoXGn0zA0crFl5ci/2sTBBGZsylNBAgMBAAGjggFBMIIBPTAd"
  560. "BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdv"
  561. "b2dsZS5jb20waAYIKwYBBQUHAQEEXDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtp"
  562. "Lmdvb2dsZS5jb20vR0lBRzIuY3J0MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50"
  563. "czEuZ29vZ2xlLmNvbS9vY3NwMB0GA1UdDgQWBBS/bzHxcE73Q4j3slC4BLbMtLjG"
  564. "GjAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEv"
  565. "MBcGA1UdIAQQMA4wDAYKKwYBBAHWeQIFATAwBgNVHR8EKTAnMCWgI6Ahhh9odHRw"
  566. "Oi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQAb"
  567. "qdWPZEHk0X7iKPCTHL6S3w6q1eR67goxZGFSM1lk1hjwyu7XcLJuvALVV9uY3ovE"
  568. "kQZSHwT+pyOPWQhsSjO+1GyjvCvK/CAwiUmBX+bQRGaqHsRcio7xSbdVcajQ3bXd"
  569. "X+s0WdbOpn6MStKAiBVloPlSxEI8pxY6x/BBCnTIk/+DMB17uZlOjG3vbAnkDkP+"
  570. "n0OTucD9sHV7EVj9XUxi51nOfNBCN/s7lpUjDS/NJ4k3iwOtbCPswiot8vLO779a"
  571. "f07vR03r349Iz/KTzk95rlFtX0IU+KYNxFNsanIXZ+C9FYGRXkwhHcvFb4qMUB1y"
  572. "TTlM80jBMOwyjZXmjRAhpAIEAKUDAgEUqQUCAwGJwKqBpwSBpOgebbmn9NRUtMWH"
  573. "+eJpqA5JLMFSMCChOsvKey3toBaCNGU7HfAEiiXNuuAdCBoK262BjQc2YYfqFzqH"
  574. "zuppopXCvhohx7j/tnCNZIMgLYt/O9SXK2RYI5z8FhCCHvB4CbD5G0LGl5EFP27s"
  575. "Jb6S3aTTYPkQe8yZSlxevg6NDwmTogLO9F7UUkaYmVcMQhzssEE2ZRYNwSOU6KjE"
  576. "0Yj+8fAiBtbQriIEIN2L8ZlpaVrdN5KFNdvcmOxJu81P8q53X55xQyGTnGWwsgMC"
  577. "ARezggvvMIIEdjCCA16gAwIBAgIIf+yfD7Y6UicwDQYJKoZIhvcNAQELBQAwSTEL"
  578. "MAkGA1UEBhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2ds"
  579. "ZSBJbnRlcm5ldCBBdXRob3JpdHkgRzIwHhcNMTUwODEyMTQ1MzE1WhcNMTUxMTEw"
  580. "MDAwMDAwWjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQG"
  581. "A1UEBwwNTW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEXMBUGA1UE"
  582. "AwwOd3d3Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB"
  583. "AQC0MeG5YGQ0t+IeJeoneP/PrhEaieibeKYkbKVLNZpoPLuBinvhkXZo3DC133Np"
  584. "CBpy6ZktBwamqyixAyuk/NU6OjgXqwwxfQ7di1AInLIU792c7hFyNXSUCG7At8If"
  585. "i3YwBX9Ba6u/1d6rWTGZJrdCq3QU11RkKYyTq2KT5mceTv9iGKqSkSTlp8puy/9S"
  586. "Z/3DbU3U+BuqCFqeSlz7zjwFmk35acdCilpJlVDDN5C/RCh8/UKc8PaL+cxlt531"
  587. "qoTENvYrflBno14YEZlCBZsPiFeUSILpKEj3Ccwhy0eLEucWQ72YZU8mUzXBoXGn"
  588. "0zA0crFl5ci/2sTBBGZsylNBAgMBAAGjggFBMIIBPTAdBgNVHSUEFjAUBggrBgEF"
  589. "BQcDAQYIKwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdvb2dsZS5jb20waAYIKwYB"
  590. "BQUHAQEEXDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lB"
  591. "RzIuY3J0MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50czEuZ29vZ2xlLmNvbS9v"
  592. "Y3NwMB0GA1UdDgQWBBS/bzHxcE73Q4j3slC4BLbMtLjGGjAMBgNVHRMBAf8EAjAA"
  593. "MB8GA1UdIwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEvMBcGA1UdIAQQMA4wDAYK"
  594. "KwYBBAHWeQIFATAwBgNVHR8EKTAnMCWgI6Ahhh9odHRwOi8vcGtpLmdvb2dsZS5j"
  595. "b20vR0lBRzIuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQAbqdWPZEHk0X7iKPCTHL6S"
  596. "3w6q1eR67goxZGFSM1lk1hjwyu7XcLJuvALVV9uY3ovEkQZSHwT+pyOPWQhsSjO+"
  597. "1GyjvCvK/CAwiUmBX+bQRGaqHsRcio7xSbdVcajQ3bXdX+s0WdbOpn6MStKAiBVl"
  598. "oPlSxEI8pxY6x/BBCnTIk/+DMB17uZlOjG3vbAnkDkP+n0OTucD9sHV7EVj9XUxi"
  599. "51nOfNBCN/s7lpUjDS/NJ4k3iwOtbCPswiot8vLO779af07vR03r349Iz/KTzk95"
  600. "rlFtX0IU+KYNxFNsanIXZ+C9FYGRXkwhHcvFb4qMUB1yTTlM80jBMOwyjZXmjRAh"
  601. "MIID8DCCAtigAwIBAgIDAjqDMA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT"
  602. "MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i"
  603. "YWwgQ0EwHhcNMTMwNDA1MTUxNTU2WhcNMTYxMjMxMjM1OTU5WjBJMQswCQYDVQQG"
  604. "EwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzElMCMGA1UEAxMcR29vZ2xlIEludGVy"
  605. "bmV0IEF1dGhvcml0eSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB"
  606. "AJwqBHdc2FCROgajguDYUEi8iT/xGXAaiEZ+4I/F8YnOIe5a/mENtzJEiaB0C1NP"
  607. "VaTOgmKV7utZX8bhBYASxF6UP7xbSDj0U/ck5vuR6RXEz/RTDfRK/J9U3n2+oGtv"
  608. "h8DQUB8oMANA2ghzUWx//zo8pzcGjr1LEQTrfSTe5vn8MXH7lNVg8y5Kr0LSy+rE"
  609. "ahqyzFPdFUuLH8gZYR/Nnag+YyuENWllhMgZxUYi+FOVvuOAShDGKuy6lyARxzmZ"
  610. "EASg8GF6lSWMTlJ14rbtCMoU/M4iarNOz0YDl5cDfsCx3nuvRTPPuj5xt970JSXC"
  611. "DTWJnZ37DhF5iR43xa+OcmkCAwEAAaOB5zCB5DAfBgNVHSMEGDAWgBTAephojYn7"
  612. "qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUSt0GFhu89mi1dvWBtrtiGrpagS8wDgYD"
  613. "VR0PAQH/BAQDAgEGMC4GCCsGAQUFBwEBBCIwIDAeBggrBgEFBQcwAYYSaHR0cDov"
  614. "L2cuc3ltY2QuY29tMBIGA1UdEwEB/wQIMAYBAf8CAQAwNQYDVR0fBC4wLDAqoCig"
  615. "JoYkaHR0cDovL2cuc3ltY2IuY29tL2NybHMvZ3RnbG9iYWwuY3JsMBcGA1UdIAQQ"
  616. "MA4wDAYKKwYBBAHWeQIFATANBgkqhkiG9w0BAQsFAAOCAQEAqvqpIM1qZ4PtXtR+"
  617. "3h3Ef+AlBgDFJPupyC1tft6dgmUsgWM0Zj7pUsIItMsv91+ZOmqcUHqFBYx90SpI"
  618. "hNMJbHzCzTWf84LuUt5oX+QAihcglvcpjZpNy6jehsgNb1aHA30DP9z6eX0hGfnI"
  619. "Oi9RdozHQZJxjyXON/hKTAAj78Q1EK7gI4BzfE00LshukNYQHpmEcxpw8u1VDu4X"
  620. "Bupn7jLrLN1nBz/2i8Jw3lsA5rsb0zYaImxssDVCbJAJPZPpZAkiDoUGn8JzIdPm"
  621. "X4DkjYUiOnMDsWCOrmji9D6X52ASCWg23jrW4kOVWzeBkoEfu43XrVJkFleW2V40"
  622. "fsg12DCCA30wggLmoAMCAQICAxK75jANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG"
  623. "EwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUg"
  624. "Q2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTAyMDUyMTA0MDAwMFoXDTE4MDgyMTA0"
  625. "MDAwMFowQjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xGzAZ"
  626. "BgNVBAMTEkdlb1RydXN0IEdsb2JhbCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP"
  627. "ADCCAQoCggEBANrMGGMw/fQXIxpWflvfPGw45HG3eJHUvKHYTPioQ7YD6U0hBwiI"
  628. "2lgvZjkpvQV4i5046AW3an5xpObEYKaw74DkiSgPniXW7YPzraaRx5jJQhg1FJ2t"
  629. "mEaSLk/K8YdDwRaVVy1Q74ktgHpXrfLuX2vSAI25FPgUFTXZwEaje3LIkb/JVSvN"
  630. "0Jc+nCZkzN/Ogxlxyk7m1NV7qRnNVd7I7NJeOFPlXE+MLf5QIzb8ZubLjqQ5GQC3"
  631. "lQI5kQsO/jgu0R0FmvZNPm8PBx2vLB6PYDni+jZTEznUXiYr2z2oFL0y6xgDKFIE"
  632. "ceWrMz3hOLsHNoRinHnqFjD0X8Ar6HFr5PkCAwEAAaOB8DCB7TAfBgNVHSMEGDAW"
  633. "gBRI5mj5K9KylddH2CMgEE8zmJCf1DAdBgNVHQ4EFgQUwHqYaI2J+6sFZAwRfap9"
  634. "ZbjKzE4wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwOgYDVR0fBDMw"
  635. "MTAvoC2gK4YpaHR0cDovL2NybC5nZW90cnVzdC5jb20vY3Jscy9zZWN1cmVjYS5j"
  636. "cmwwTgYDVR0gBEcwRTBDBgRVHSAAMDswOQYIKwYBBQUHAgEWLWh0dHBzOi8vd3d3"
  637. "Lmdlb3RydXN0LmNvbS9yZXNvdXJjZXMvcmVwb3NpdG9yeTANBgkqhkiG9w0BAQUF"
  638. "AAOBgQB24RJuTksWEoYwBrKBCM/wCMfHcX5m7sLt1Dsf//DwyE7WQziwuTB9GNBV"
  639. "g6JqyzYRnOhIZqNtf7gT1Ef+i1pcc/yu2RsyGTirlzQUqpbS66McFAhJtrvlke+D"
  640. "NusdVm/K2rxzY5Dkf3s+Iss9B+1fOHSc4wNQTqGvmO5h8oQ/Eg==";
  641. // kBadSessionExtraField is a custom serialized SSL_SESSION generated by replacing
  642. // the final (optional) element of |kCustomSession| with tag number 30.
  643. static const char kBadSessionExtraField[] =
  644. "MIIBdgIBAQICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
  645. "kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
  646. "IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUphAEDnd3dy5nb29nbGUuY29tqAcE"
  647. "BXdvcmxkqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0Nxe"
  648. "LwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751"
  649. "CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyP"
  650. "q+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYG"
  651. "BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGrgMEAQevAwQBBL4DBAEF";
  652. // kBadSessionVersion is a custom serialized SSL_SESSION generated by replacing
  653. // the version of |kCustomSession| with 2.
  654. static const char kBadSessionVersion[] =
  655. "MIIBdgIBAgICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
  656. "kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
  657. "IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUphAEDnd3dy5nb29nbGUuY29tqAcE"
  658. "BXdvcmxkqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0Nxe"
  659. "LwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751"
  660. "CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyP"
  661. "q+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYG"
  662. "BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGrgMEAQevAwQBBLADBAEF";
  663. // kBadSessionTrailingData is a custom serialized SSL_SESSION with trailing data
  664. // appended.
  665. static const char kBadSessionTrailingData[] =
  666. "MIIBdgIBAQICAwMEAsAvBCAG5Q1ndq4Yfmbeo1zwLkNRKmCXGdNgWvGT3cskV0yQ"
  667. "kAQwJlrlzkAWBOWiLj/jJ76D7l+UXoizP2KI2C7I2FccqMmIfFmmkUy32nIJ0mZH"
  668. "IWoJoQYCBFRDO46iBAICASykAwQBAqUDAgEUphAEDnd3dy5nb29nbGUuY29tqAcE"
  669. "BXdvcmxkqQUCAwGJwKqBpwSBpBwUQvoeOk0Kg36SYTcLEkXqKwOBfF9vE4KX0Nxe"
  670. "LwjcDTpsuh3qXEaZ992r1N38VDcyS6P7I6HBYN9BsNHM362zZnY27GpTw+Kwd751"
  671. "CLoXFPoaMOe57dbBpXoro6Pd3BTbf/Tzr88K06yEOTDKPNj3+inbMaVigtK4PLyP"
  672. "q+Topyzvx9USFgRvyuoxn0Hgb+R0A3j6SLRuyOdAi4gv7Y5oliynrSIEIAYGBgYG"
  673. "BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGrgMEAQevAwQBBLADBAEFAAAA";
  674. static bool DecodeBase64(std::vector<uint8_t> *out, const char *in) {
  675. size_t len;
  676. if (!EVP_DecodedLength(&len, strlen(in))) {
  677. fprintf(stderr, "EVP_DecodedLength failed\n");
  678. return false;
  679. }
  680. out->resize(len);
  681. if (!EVP_DecodeBase64(out->data(), &len, len, (const uint8_t *)in,
  682. strlen(in))) {
  683. fprintf(stderr, "EVP_DecodeBase64 failed\n");
  684. return false;
  685. }
  686. out->resize(len);
  687. return true;
  688. }
  689. TEST(SSLTest, SessionEncoding) {
  690. for (const char *input_b64 : {
  691. kOpenSSLSession,
  692. kCustomSession,
  693. kBoringSSLSession,
  694. }) {
  695. SCOPED_TRACE(std::string(input_b64));
  696. // Decode the input.
  697. std::vector<uint8_t> input;
  698. ASSERT_TRUE(DecodeBase64(&input, input_b64));
  699. // Verify the SSL_SESSION decodes.
  700. bssl::UniquePtr<SSL_CTX> ssl_ctx(SSL_CTX_new(TLS_method()));
  701. ASSERT_TRUE(ssl_ctx);
  702. bssl::UniquePtr<SSL_SESSION> session(
  703. SSL_SESSION_from_bytes(input.data(), input.size(), ssl_ctx.get()));
  704. ASSERT_TRUE(session) << "SSL_SESSION_from_bytes failed";
  705. // Verify the SSL_SESSION encoding round-trips.
  706. size_t encoded_len;
  707. bssl::UniquePtr<uint8_t> encoded;
  708. uint8_t *encoded_raw;
  709. ASSERT_TRUE(SSL_SESSION_to_bytes(session.get(), &encoded_raw, &encoded_len))
  710. << "SSL_SESSION_to_bytes failed";
  711. encoded.reset(encoded_raw);
  712. EXPECT_EQ(Bytes(encoded.get(), encoded_len), Bytes(input))
  713. << "SSL_SESSION_to_bytes did not round-trip";
  714. // Verify the SSL_SESSION also decodes with the legacy API.
  715. const uint8_t *cptr = input.data();
  716. session.reset(d2i_SSL_SESSION(NULL, &cptr, input.size()));
  717. ASSERT_TRUE(session) << "d2i_SSL_SESSION failed";
  718. EXPECT_EQ(cptr, input.data() + input.size());
  719. // Verify the SSL_SESSION encoding round-trips via the legacy API.
  720. int len = i2d_SSL_SESSION(session.get(), NULL);
  721. ASSERT_GT(len, 0) << "i2d_SSL_SESSION failed";
  722. ASSERT_EQ(static_cast<size_t>(len), input.size())
  723. << "i2d_SSL_SESSION(NULL) returned invalid length";
  724. encoded.reset((uint8_t *)OPENSSL_malloc(input.size()));
  725. ASSERT_TRUE(encoded);
  726. uint8_t *ptr = encoded.get();
  727. len = i2d_SSL_SESSION(session.get(), &ptr);
  728. ASSERT_GT(len, 0) << "i2d_SSL_SESSION failed";
  729. ASSERT_EQ(static_cast<size_t>(len), input.size())
  730. << "i2d_SSL_SESSION(NULL) returned invalid length";
  731. ASSERT_EQ(ptr, encoded.get() + input.size())
  732. << "i2d_SSL_SESSION did not advance ptr correctly";
  733. EXPECT_EQ(Bytes(encoded.get(), encoded_len), Bytes(input))
  734. << "SSL_SESSION_to_bytes did not round-trip";
  735. }
  736. for (const char *input_b64 : {
  737. kBadSessionExtraField,
  738. kBadSessionVersion,
  739. kBadSessionTrailingData,
  740. }) {
  741. SCOPED_TRACE(std::string(input_b64));
  742. std::vector<uint8_t> input;
  743. ASSERT_TRUE(DecodeBase64(&input, input_b64));
  744. // Verify that the SSL_SESSION fails to decode.
  745. bssl::UniquePtr<SSL_CTX> ssl_ctx(SSL_CTX_new(TLS_method()));
  746. ASSERT_TRUE(ssl_ctx);
  747. bssl::UniquePtr<SSL_SESSION> session(
  748. SSL_SESSION_from_bytes(input.data(), input.size(), ssl_ctx.get()));
  749. EXPECT_FALSE(session) << "SSL_SESSION_from_bytes unexpectedly succeeded";
  750. ERR_clear_error();
  751. }
  752. }
  753. static void ExpectDefaultVersion(uint16_t min_version, uint16_t max_version,
  754. const SSL_METHOD *(*method)(void)) {
  755. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(method()));
  756. ASSERT_TRUE(ctx);
  757. EXPECT_EQ(min_version, SSL_CTX_get_min_proto_version(ctx.get()));
  758. EXPECT_EQ(max_version, SSL_CTX_get_max_proto_version(ctx.get()));
  759. }
  760. TEST(SSLTest, DefaultVersion) {
  761. // TODO(svaldez): Update this when TLS 1.3 is enabled by default.
  762. ExpectDefaultVersion(TLS1_VERSION, TLS1_2_VERSION, &TLS_method);
  763. ExpectDefaultVersion(TLS1_VERSION, TLS1_VERSION, &TLSv1_method);
  764. ExpectDefaultVersion(TLS1_1_VERSION, TLS1_1_VERSION, &TLSv1_1_method);
  765. ExpectDefaultVersion(TLS1_2_VERSION, TLS1_2_VERSION, &TLSv1_2_method);
  766. ExpectDefaultVersion(DTLS1_VERSION, DTLS1_2_VERSION, &DTLS_method);
  767. ExpectDefaultVersion(DTLS1_VERSION, DTLS1_VERSION, &DTLSv1_method);
  768. ExpectDefaultVersion(DTLS1_2_VERSION, DTLS1_2_VERSION, &DTLSv1_2_method);
  769. }
  770. TEST(SSLTest, CipherProperties) {
  771. static const struct {
  772. int id;
  773. const char *standard_name;
  774. int cipher_nid;
  775. int digest_nid;
  776. int kx_nid;
  777. int auth_nid;
  778. int prf_nid;
  779. } kTests[] = {
  780. {
  781. SSL3_CK_RSA_DES_192_CBC3_SHA,
  782. "TLS_RSA_WITH_3DES_EDE_CBC_SHA",
  783. NID_des_ede3_cbc,
  784. NID_sha1,
  785. NID_kx_rsa,
  786. NID_auth_rsa,
  787. NID_md5_sha1,
  788. },
  789. {
  790. TLS1_CK_RSA_WITH_AES_128_SHA,
  791. "TLS_RSA_WITH_AES_128_CBC_SHA",
  792. NID_aes_128_cbc,
  793. NID_sha1,
  794. NID_kx_rsa,
  795. NID_auth_rsa,
  796. NID_md5_sha1,
  797. },
  798. {
  799. TLS1_CK_PSK_WITH_AES_256_CBC_SHA,
  800. "TLS_PSK_WITH_AES_256_CBC_SHA",
  801. NID_aes_256_cbc,
  802. NID_sha1,
  803. NID_kx_psk,
  804. NID_auth_psk,
  805. NID_md5_sha1,
  806. },
  807. {
  808. TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  809. "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
  810. NID_aes_128_cbc,
  811. NID_sha1,
  812. NID_kx_ecdhe,
  813. NID_auth_rsa,
  814. NID_md5_sha1,
  815. },
  816. {
  817. TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  818. "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
  819. NID_aes_256_cbc,
  820. NID_sha1,
  821. NID_kx_ecdhe,
  822. NID_auth_rsa,
  823. NID_md5_sha1,
  824. },
  825. {
  826. TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  827. "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
  828. NID_aes_128_gcm,
  829. NID_undef,
  830. NID_kx_ecdhe,
  831. NID_auth_rsa,
  832. NID_sha256,
  833. },
  834. {
  835. TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  836. "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
  837. NID_aes_128_gcm,
  838. NID_undef,
  839. NID_kx_ecdhe,
  840. NID_auth_ecdsa,
  841. NID_sha256,
  842. },
  843. {
  844. TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  845. "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
  846. NID_aes_256_gcm,
  847. NID_undef,
  848. NID_kx_ecdhe,
  849. NID_auth_ecdsa,
  850. NID_sha384,
  851. },
  852. {
  853. TLS1_CK_ECDHE_PSK_WITH_AES_128_CBC_SHA,
  854. "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA",
  855. NID_aes_128_cbc,
  856. NID_sha1,
  857. NID_kx_ecdhe,
  858. NID_auth_psk,
  859. NID_md5_sha1,
  860. },
  861. {
  862. TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
  863. "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",
  864. NID_chacha20_poly1305,
  865. NID_undef,
  866. NID_kx_ecdhe,
  867. NID_auth_rsa,
  868. NID_sha256,
  869. },
  870. {
  871. TLS1_CK_AES_256_GCM_SHA384,
  872. "TLS_AES_256_GCM_SHA384",
  873. NID_aes_256_gcm,
  874. NID_undef,
  875. NID_kx_any,
  876. NID_auth_any,
  877. NID_sha384,
  878. },
  879. {
  880. TLS1_CK_AES_128_GCM_SHA256,
  881. "TLS_AES_128_GCM_SHA256",
  882. NID_aes_128_gcm,
  883. NID_undef,
  884. NID_kx_any,
  885. NID_auth_any,
  886. NID_sha256,
  887. },
  888. {
  889. TLS1_CK_CHACHA20_POLY1305_SHA256,
  890. "TLS_CHACHA20_POLY1305_SHA256",
  891. NID_chacha20_poly1305,
  892. NID_undef,
  893. NID_kx_any,
  894. NID_auth_any,
  895. NID_sha256,
  896. },
  897. };
  898. for (const auto &t : kTests) {
  899. SCOPED_TRACE(t.standard_name);
  900. const SSL_CIPHER *cipher = SSL_get_cipher_by_value(t.id & 0xffff);
  901. ASSERT_TRUE(cipher);
  902. EXPECT_STREQ(t.standard_name, SSL_CIPHER_standard_name(cipher));
  903. bssl::UniquePtr<char> rfc_name(SSL_CIPHER_get_rfc_name(cipher));
  904. ASSERT_TRUE(rfc_name);
  905. EXPECT_STREQ(t.standard_name, rfc_name.get());
  906. EXPECT_EQ(t.cipher_nid, SSL_CIPHER_get_cipher_nid(cipher));
  907. EXPECT_EQ(t.digest_nid, SSL_CIPHER_get_digest_nid(cipher));
  908. EXPECT_EQ(t.kx_nid, SSL_CIPHER_get_kx_nid(cipher));
  909. EXPECT_EQ(t.auth_nid, SSL_CIPHER_get_auth_nid(cipher));
  910. EXPECT_EQ(t.prf_nid, SSL_CIPHER_get_prf_nid(cipher));
  911. }
  912. }
  913. // CreateSessionWithTicket returns a sample |SSL_SESSION| with the specified
  914. // version and ticket length or nullptr on failure.
  915. static bssl::UniquePtr<SSL_SESSION> CreateSessionWithTicket(uint16_t version,
  916. size_t ticket_len) {
  917. std::vector<uint8_t> der;
  918. if (!DecodeBase64(&der, kOpenSSLSession)) {
  919. return nullptr;
  920. }
  921. bssl::UniquePtr<SSL_CTX> ssl_ctx(SSL_CTX_new(TLS_method()));
  922. if (!ssl_ctx) {
  923. return nullptr;
  924. }
  925. // Use a garbage ticket.
  926. std::vector<uint8_t> ticket(ticket_len, 'a');
  927. bssl::UniquePtr<SSL_SESSION> session(
  928. SSL_SESSION_from_bytes(der.data(), der.size(), ssl_ctx.get()));
  929. if (!session ||
  930. !SSL_SESSION_set_protocol_version(session.get(), version) ||
  931. !SSL_SESSION_set_ticket(session.get(), ticket.data(), ticket.size())) {
  932. return nullptr;
  933. }
  934. // Fix up the timeout.
  935. #if defined(BORINGSSL_UNSAFE_DETERMINISTIC_MODE)
  936. SSL_SESSION_set_time(session.get(), 1234);
  937. #else
  938. SSL_SESSION_set_time(session.get(), time(nullptr));
  939. #endif
  940. return session;
  941. }
  942. static bool GetClientHello(SSL *ssl, std::vector<uint8_t> *out) {
  943. bssl::UniquePtr<BIO> bio(BIO_new(BIO_s_mem()));
  944. if (!bio) {
  945. return false;
  946. }
  947. // Do not configure a reading BIO, but record what's written to a memory BIO.
  948. BIO_up_ref(bio.get());
  949. SSL_set_bio(ssl, nullptr /* rbio */, bio.get());
  950. int ret = SSL_connect(ssl);
  951. if (ret > 0) {
  952. // SSL_connect should fail without a BIO to write to.
  953. return false;
  954. }
  955. ERR_clear_error();
  956. const uint8_t *client_hello;
  957. size_t client_hello_len;
  958. if (!BIO_mem_contents(bio.get(), &client_hello, &client_hello_len)) {
  959. return false;
  960. }
  961. *out = std::vector<uint8_t>(client_hello, client_hello + client_hello_len);
  962. return true;
  963. }
  964. // GetClientHelloLen creates a client SSL connection with the specified version
  965. // and ticket length. It returns the length of the ClientHello, not including
  966. // the record header, on success and zero on error.
  967. static size_t GetClientHelloLen(uint16_t max_version, uint16_t session_version,
  968. size_t ticket_len) {
  969. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  970. bssl::UniquePtr<SSL_SESSION> session =
  971. CreateSessionWithTicket(session_version, ticket_len);
  972. if (!ctx || !session) {
  973. return 0;
  974. }
  975. // Set a one-element cipher list so the baseline ClientHello is unpadded.
  976. bssl::UniquePtr<SSL> ssl(SSL_new(ctx.get()));
  977. if (!ssl || !SSL_set_session(ssl.get(), session.get()) ||
  978. !SSL_set_strict_cipher_list(ssl.get(), "ECDHE-RSA-AES128-GCM-SHA256") ||
  979. !SSL_set_max_proto_version(ssl.get(), max_version)) {
  980. return 0;
  981. }
  982. std::vector<uint8_t> client_hello;
  983. if (!GetClientHello(ssl.get(), &client_hello) ||
  984. client_hello.size() <= SSL3_RT_HEADER_LENGTH) {
  985. return 0;
  986. }
  987. return client_hello.size() - SSL3_RT_HEADER_LENGTH;
  988. }
  989. TEST(SSLTest, Padding) {
  990. struct PaddingVersions {
  991. uint16_t max_version, session_version;
  992. };
  993. static const PaddingVersions kPaddingVersions[] = {
  994. // Test the padding extension at TLS 1.2.
  995. {TLS1_2_VERSION, TLS1_2_VERSION},
  996. // Test the padding extension at TLS 1.3 with a TLS 1.2 session, so there
  997. // will be no PSK binder after the padding extension.
  998. {TLS1_3_VERSION, TLS1_2_VERSION},
  999. // Test the padding extension at TLS 1.3 with a TLS 1.3 session, so there
  1000. // will be a PSK binder after the padding extension.
  1001. {TLS1_3_VERSION, TLS1_3_VERSION},
  1002. };
  1003. struct PaddingTest {
  1004. size_t input_len, padded_len;
  1005. };
  1006. static const PaddingTest kPaddingTests[] = {
  1007. // ClientHellos of length below 0x100 do not require padding.
  1008. {0xfe, 0xfe},
  1009. {0xff, 0xff},
  1010. // ClientHellos of length 0x100 through 0x1fb are padded up to 0x200.
  1011. {0x100, 0x200},
  1012. {0x123, 0x200},
  1013. {0x1fb, 0x200},
  1014. // ClientHellos of length 0x1fc through 0x1ff get padded beyond 0x200. The
  1015. // padding extension takes a minimum of four bytes plus one required
  1016. // content
  1017. // byte. (To work around yet more server bugs, we avoid empty final
  1018. // extensions.)
  1019. {0x1fc, 0x201},
  1020. {0x1fd, 0x202},
  1021. {0x1fe, 0x203},
  1022. {0x1ff, 0x204},
  1023. // Finally, larger ClientHellos need no padding.
  1024. {0x200, 0x200},
  1025. {0x201, 0x201},
  1026. };
  1027. for (const PaddingVersions &versions : kPaddingVersions) {
  1028. SCOPED_TRACE(versions.max_version);
  1029. SCOPED_TRACE(versions.session_version);
  1030. // Sample a baseline length.
  1031. size_t base_len =
  1032. GetClientHelloLen(versions.max_version, versions.session_version, 1);
  1033. ASSERT_NE(base_len, 0u) << "Baseline length could not be sampled";
  1034. for (const PaddingTest &test : kPaddingTests) {
  1035. SCOPED_TRACE(test.input_len);
  1036. ASSERT_LE(base_len, test.input_len) << "Baseline ClientHello too long";
  1037. size_t padded_len =
  1038. GetClientHelloLen(versions.max_version, versions.session_version,
  1039. 1 + test.input_len - base_len);
  1040. EXPECT_EQ(padded_len, test.padded_len)
  1041. << "ClientHello was not padded to expected length";
  1042. }
  1043. }
  1044. }
  1045. static bssl::UniquePtr<X509> GetTestCertificate() {
  1046. static const char kCertPEM[] =
  1047. "-----BEGIN CERTIFICATE-----\n"
  1048. "MIICWDCCAcGgAwIBAgIJAPuwTC6rEJsMMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV\n"
  1049. "BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX\n"
  1050. "aWRnaXRzIFB0eSBMdGQwHhcNMTQwNDIzMjA1MDQwWhcNMTcwNDIyMjA1MDQwWjBF\n"
  1051. "MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50\n"
  1052. "ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB\n"
  1053. "gQDYK8imMuRi/03z0K1Zi0WnvfFHvwlYeyK9Na6XJYaUoIDAtB92kWdGMdAQhLci\n"
  1054. "HnAjkXLI6W15OoV3gA/ElRZ1xUpxTMhjP6PyY5wqT5r6y8FxbiiFKKAnHmUcrgfV\n"
  1055. "W28tQ+0rkLGMryRtrukXOgXBv7gcrmU7G1jC2a7WqmeI8QIDAQABo1AwTjAdBgNV\n"
  1056. "HQ4EFgQUi3XVrMsIvg4fZbf6Vr5sp3Xaha8wHwYDVR0jBBgwFoAUi3XVrMsIvg4f\n"
  1057. "Zbf6Vr5sp3Xaha8wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQA76Hht\n"
  1058. "ldY9avcTGSwbwoiuIqv0jTL1fHFnzy3RHMLDh+Lpvolc5DSrSJHCP5WuK0eeJXhr\n"
  1059. "T5oQpHL9z/cCDLAKCKRa4uV0fhEdOWBqyR9p8y5jJtye72t6CuFUV5iqcpF4BH4f\n"
  1060. "j2VNHwsSrJwkD4QUGlUtH7vwnQmyCFxZMmWAJg==\n"
  1061. "-----END CERTIFICATE-----\n";
  1062. bssl::UniquePtr<BIO> bio(BIO_new_mem_buf(kCertPEM, strlen(kCertPEM)));
  1063. return bssl::UniquePtr<X509>(
  1064. PEM_read_bio_X509(bio.get(), nullptr, nullptr, nullptr));
  1065. }
  1066. static bssl::UniquePtr<EVP_PKEY> GetTestKey() {
  1067. static const char kKeyPEM[] =
  1068. "-----BEGIN RSA PRIVATE KEY-----\n"
  1069. "MIICXgIBAAKBgQDYK8imMuRi/03z0K1Zi0WnvfFHvwlYeyK9Na6XJYaUoIDAtB92\n"
  1070. "kWdGMdAQhLciHnAjkXLI6W15OoV3gA/ElRZ1xUpxTMhjP6PyY5wqT5r6y8FxbiiF\n"
  1071. "KKAnHmUcrgfVW28tQ+0rkLGMryRtrukXOgXBv7gcrmU7G1jC2a7WqmeI8QIDAQAB\n"
  1072. "AoGBAIBy09Fd4DOq/Ijp8HeKuCMKTHqTW1xGHshLQ6jwVV2vWZIn9aIgmDsvkjCe\n"
  1073. "i6ssZvnbjVcwzSoByhjN8ZCf/i15HECWDFFh6gt0P5z0MnChwzZmvatV/FXCT0j+\n"
  1074. "WmGNB/gkehKjGXLLcjTb6dRYVJSCZhVuOLLcbWIV10gggJQBAkEA8S8sGe4ezyyZ\n"
  1075. "m4e9r95g6s43kPqtj5rewTsUxt+2n4eVodD+ZUlCULWVNAFLkYRTBCASlSrm9Xhj\n"
  1076. "QpmWAHJUkQJBAOVzQdFUaewLtdOJoPCtpYoY1zd22eae8TQEmpGOR11L6kbxLQsk\n"
  1077. "aMly/DOnOaa82tqAGTdqDEZgSNmCeKKknmECQAvpnY8GUOVAubGR6c+W90iBuQLj\n"
  1078. "LtFp/9ihd2w/PoDwrHZaoUYVcT4VSfJQog/k7kjE4MYXYWL8eEKg3WTWQNECQQDk\n"
  1079. "104Wi91Umd1PzF0ijd2jXOERJU1wEKe6XLkYYNHWQAe5l4J4MWj9OdxFXAxIuuR/\n"
  1080. "tfDwbqkta4xcux67//khAkEAvvRXLHTaa6VFzTaiiO8SaFsHV3lQyXOtMrBpB5jd\n"
  1081. "moZWgjHvB2W9Ckn7sDqsPB+U2tyX0joDdQEyuiMECDY8oQ==\n"
  1082. "-----END RSA PRIVATE KEY-----\n";
  1083. bssl::UniquePtr<BIO> bio(BIO_new_mem_buf(kKeyPEM, strlen(kKeyPEM)));
  1084. return bssl::UniquePtr<EVP_PKEY>(
  1085. PEM_read_bio_PrivateKey(bio.get(), nullptr, nullptr, nullptr));
  1086. }
  1087. static bssl::UniquePtr<X509> GetECDSATestCertificate() {
  1088. static const char kCertPEM[] =
  1089. "-----BEGIN CERTIFICATE-----\n"
  1090. "MIIBzzCCAXagAwIBAgIJANlMBNpJfb/rMAkGByqGSM49BAEwRTELMAkGA1UEBhMC\n"
  1091. "QVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdp\n"
  1092. "dHMgUHR5IEx0ZDAeFw0xNDA0MjMyMzIxNTdaFw0xNDA1MjMyMzIxNTdaMEUxCzAJ\n"
  1093. "BgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5l\n"
  1094. "dCBXaWRnaXRzIFB0eSBMdGQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATmK2ni\n"
  1095. "v2Wfl74vHg2UikzVl2u3qR4NRvvdqakendy6WgHn1peoChj5w8SjHlbifINI2xYa\n"
  1096. "HPUdfvGULUvPciLBo1AwTjAdBgNVHQ4EFgQUq4TSrKuV8IJOFngHVVdf5CaNgtEw\n"
  1097. "HwYDVR0jBBgwFoAUq4TSrKuV8IJOFngHVVdf5CaNgtEwDAYDVR0TBAUwAwEB/zAJ\n"
  1098. "BgcqhkjOPQQBA0gAMEUCIQDyoDVeUTo2w4J5m+4nUIWOcAZ0lVfSKXQA9L4Vh13E\n"
  1099. "BwIgfB55FGohg/B6dGh5XxSZmmi08cueFV7mHzJSYV51yRQ=\n"
  1100. "-----END CERTIFICATE-----\n";
  1101. bssl::UniquePtr<BIO> bio(BIO_new_mem_buf(kCertPEM, strlen(kCertPEM)));
  1102. return bssl::UniquePtr<X509>(PEM_read_bio_X509(bio.get(), nullptr, nullptr, nullptr));
  1103. }
  1104. static bssl::UniquePtr<EVP_PKEY> GetECDSATestKey() {
  1105. static const char kKeyPEM[] =
  1106. "-----BEGIN PRIVATE KEY-----\n"
  1107. "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgBw8IcnrUoEqc3VnJ\n"
  1108. "TYlodwi1b8ldMHcO6NHJzgqLtGqhRANCAATmK2niv2Wfl74vHg2UikzVl2u3qR4N\n"
  1109. "Rvvdqakendy6WgHn1peoChj5w8SjHlbifINI2xYaHPUdfvGULUvPciLB\n"
  1110. "-----END PRIVATE KEY-----\n";
  1111. bssl::UniquePtr<BIO> bio(BIO_new_mem_buf(kKeyPEM, strlen(kKeyPEM)));
  1112. return bssl::UniquePtr<EVP_PKEY>(
  1113. PEM_read_bio_PrivateKey(bio.get(), nullptr, nullptr, nullptr));
  1114. }
  1115. static bssl::UniquePtr<CRYPTO_BUFFER> BufferFromPEM(const char *pem) {
  1116. bssl::UniquePtr<BIO> bio(BIO_new_mem_buf(pem, strlen(pem)));
  1117. char *name, *header;
  1118. uint8_t *data;
  1119. long data_len;
  1120. if (!PEM_read_bio(bio.get(), &name, &header, &data,
  1121. &data_len)) {
  1122. return nullptr;
  1123. }
  1124. OPENSSL_free(name);
  1125. OPENSSL_free(header);
  1126. auto ret = bssl::UniquePtr<CRYPTO_BUFFER>(
  1127. CRYPTO_BUFFER_new(data, data_len, nullptr));
  1128. OPENSSL_free(data);
  1129. return ret;
  1130. }
  1131. static bssl::UniquePtr<CRYPTO_BUFFER> GetChainTestCertificateBuffer() {
  1132. static const char kCertPEM[] =
  1133. "-----BEGIN CERTIFICATE-----\n"
  1134. "MIIC0jCCAbqgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwDzENMAsGA1UEAwwEQiBD\n"
  1135. "QTAeFw0xNjAyMjgyMDI3MDNaFw0yNjAyMjUyMDI3MDNaMBgxFjAUBgNVBAMMDUNs\n"
  1136. "aWVudCBDZXJ0IEEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDRvaz8\n"
  1137. "CC/cshpCafJo4jLkHEoBqDLhdgFelJoAiQUyIqyWl2O7YHPnpJH+TgR7oelzNzt/\n"
  1138. "kLRcH89M/TszB6zqyLTC4aqmvzKL0peD/jL2LWBucR0WXIvjA3zoRuF/x86+rYH3\n"
  1139. "tHb+xs2PSs8EGL/Ev+ss+qTzTGEn26fuGNHkNw6tOwPpc+o8+wUtzf/kAthamo+c\n"
  1140. "IDs2rQ+lP7+aLZTLeU/q4gcLutlzcK5imex5xy2jPkweq48kijK0kIzl1cPlA5d1\n"
  1141. "z7C8jU50Pj9X9sQDJTN32j7UYRisJeeYQF8GaaN8SbrDI6zHgKzrRLyxDt/KQa9V\n"
  1142. "iLeXANgZi+Xx9KgfAgMBAAGjLzAtMAwGA1UdEwEB/wQCMAAwHQYDVR0lBBYwFAYI\n"
  1143. "KwYBBQUHAwEGCCsGAQUFBwMCMA0GCSqGSIb3DQEBCwUAA4IBAQBFEVbmYl+2RtNw\n"
  1144. "rDftRDF1v2QUbcN2ouSnQDHxeDQdSgasLzT3ui8iYu0Rw2WWcZ0DV5e0ztGPhWq7\n"
  1145. "AO0B120aFRMOY+4+bzu9Q2FFkQqc7/fKTvTDzIJI5wrMnFvUfzzvxh3OHWMYSs/w\n"
  1146. "giq33hTKeHEq6Jyk3btCny0Ycecyc3yGXH10sizUfiHlhviCkDuESk8mFDwDDzqW\n"
  1147. "ZF0IipzFbEDHoIxLlm3GQxpiLoEV4k8KYJp3R5KBLFyxM6UGPz8h72mIPCJp2RuK\n"
  1148. "MYgF91UDvVzvnYm6TfseM2+ewKirC00GOrZ7rEcFvtxnKSqYf4ckqfNdSU1Y+RRC\n"
  1149. "1ngWZ7Ih\n"
  1150. "-----END CERTIFICATE-----\n";
  1151. return BufferFromPEM(kCertPEM);
  1152. }
  1153. static bssl::UniquePtr<X509> X509FromBuffer(
  1154. bssl::UniquePtr<CRYPTO_BUFFER> buffer) {
  1155. if (!buffer) {
  1156. return nullptr;
  1157. }
  1158. const uint8_t *derp = CRYPTO_BUFFER_data(buffer.get());
  1159. return bssl::UniquePtr<X509>(
  1160. d2i_X509(NULL, &derp, CRYPTO_BUFFER_len(buffer.get())));
  1161. }
  1162. static bssl::UniquePtr<X509> GetChainTestCertificate() {
  1163. return X509FromBuffer(GetChainTestCertificateBuffer());
  1164. }
  1165. static bssl::UniquePtr<CRYPTO_BUFFER> GetChainTestIntermediateBuffer() {
  1166. static const char kCertPEM[] =
  1167. "-----BEGIN CERTIFICATE-----\n"
  1168. "MIICwjCCAaqgAwIBAgICEAEwDQYJKoZIhvcNAQELBQAwFDESMBAGA1UEAwwJQyBS\n"
  1169. "b290IENBMB4XDTE2MDIyODIwMjcwM1oXDTI2MDIyNTIwMjcwM1owDzENMAsGA1UE\n"
  1170. "AwwEQiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALsSCYmDip2D\n"
  1171. "GkjFxw7ykz26JSjELkl6ArlYjFJ3aT/SCh8qbS4gln7RH8CPBd78oFdfhIKQrwtZ\n"
  1172. "3/q21ykD9BAS3qHe2YdcJfm8/kWAy5DvXk6NXU4qX334KofBAEpgdA/igEFq1P1l\n"
  1173. "HAuIfZCpMRfT+i5WohVsGi8f/NgpRvVaMONLNfgw57mz1lbtFeBEISmX0kbsuJxF\n"
  1174. "Qj/Bwhi5/0HAEXG8e7zN4cEx0yPRvmOATRdVb/8dW2pwOHRJq9R5M0NUkIsTSnL7\n"
  1175. "6N/z8hRAHMsV3IudC5Yd7GXW1AGu9a+iKU+Q4xcZCoj0DC99tL4VKujrV1kAeqsM\n"
  1176. "cz5/dKzi6+cCAwEAAaMjMCEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\n"
  1177. "AQYwDQYJKoZIhvcNAQELBQADggEBAIIeZiEeNhWWQ8Y4D+AGDwqUUeG8NjCbKrXQ\n"
  1178. "BlHg5wZ8xftFaiP1Dp/UAezmx2LNazdmuwrYB8lm3FVTyaPDTKEGIPS4wJKHgqH1\n"
  1179. "QPDhqNm85ey7TEtI9oYjsNim/Rb+iGkIAMXaxt58SzxbjvP0kMr1JfJIZbic9vye\n"
  1180. "NwIspMFIpP3FB8ywyu0T0hWtCQgL4J47nigCHpOu58deP88fS/Nyz/fyGVWOZ76b\n"
  1181. "WhWwgM3P3X95fQ3d7oFPR/bVh0YV+Cf861INwplokXgXQ3/TCQ+HNXeAMWn3JLWv\n"
  1182. "XFwk8owk9dq/kQGdndGgy3KTEW4ctPX5GNhf3LJ9Q7dLji4ReQ4=\n"
  1183. "-----END CERTIFICATE-----\n";
  1184. return BufferFromPEM(kCertPEM);
  1185. }
  1186. static bssl::UniquePtr<X509> GetChainTestIntermediate() {
  1187. return X509FromBuffer(GetChainTestIntermediateBuffer());
  1188. }
  1189. static bssl::UniquePtr<EVP_PKEY> GetChainTestKey() {
  1190. static const char kKeyPEM[] =
  1191. "-----BEGIN PRIVATE KEY-----\n"
  1192. "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDRvaz8CC/cshpC\n"
  1193. "afJo4jLkHEoBqDLhdgFelJoAiQUyIqyWl2O7YHPnpJH+TgR7oelzNzt/kLRcH89M\n"
  1194. "/TszB6zqyLTC4aqmvzKL0peD/jL2LWBucR0WXIvjA3zoRuF/x86+rYH3tHb+xs2P\n"
  1195. "Ss8EGL/Ev+ss+qTzTGEn26fuGNHkNw6tOwPpc+o8+wUtzf/kAthamo+cIDs2rQ+l\n"
  1196. "P7+aLZTLeU/q4gcLutlzcK5imex5xy2jPkweq48kijK0kIzl1cPlA5d1z7C8jU50\n"
  1197. "Pj9X9sQDJTN32j7UYRisJeeYQF8GaaN8SbrDI6zHgKzrRLyxDt/KQa9ViLeXANgZ\n"
  1198. "i+Xx9KgfAgMBAAECggEBAK0VjSJzkyPaamcyTVSWjo7GdaBGcK60lk657RjR+lK0\n"
  1199. "YJ7pkej4oM2hdsVZFsP8Cs4E33nXLa/0pDsRov/qrp0WQm2skwqGMC1I/bZ0WRPk\n"
  1200. "wHaDrBBfESWnJDX/AGpVtlyOjPmgmK6J2usMPihQUDkKdAYrVWJePrMIxt1q6BMe\n"
  1201. "iczs3qriMmtY3bUc4UyUwJ5fhDLjshHvfuIpYQyI6EXZM6dZksn9LylXJnigY6QJ\n"
  1202. "HxOYO0BDwOsZ8yQ8J8afLk88i0GizEkgE1z3REtQUwgWfxr1WV/ud+T6/ZhSAgH9\n"
  1203. "042mQvSFZnIUSEsmCvjhWuAunfxHKCTcAoYISWfzWpkCgYEA7gpf3HHU5Tn+CgUn\n"
  1204. "1X5uGpG3DmcMgfeGgs2r2f/IIg/5Ac1dfYILiybL1tN9zbyLCJfcbFpWBc9hJL6f\n"
  1205. "CPc5hUiwWFJqBJewxQkC1Ae/HakHbip+IZ+Jr0842O4BAArvixk4Lb7/N2Ct9sTE\n"
  1206. "NJO6RtK9lbEZ5uK61DglHy8CS2UCgYEA4ZC1o36kPAMQBggajgnucb2yuUEelk0f\n"
  1207. "AEr+GI32MGE+93xMr7rAhBoqLg4AITyIfEnOSQ5HwagnIHonBbv1LV/Gf9ursx8Z\n"
  1208. "YOGbvT8zzzC+SU1bkDzdjAYnFQVGIjMtKOBJ3K07++ypwX1fr4QsQ8uKL8WSOWwt\n"
  1209. "Z3Bym6XiZzMCgYADnhy+2OwHX85AkLt+PyGlPbmuelpyTzS4IDAQbBa6jcuW/2wA\n"
  1210. "UE2km75VUXmD+u2R/9zVuLm99NzhFhSMqlUxdV1YukfqMfP5yp1EY6m/5aW7QuIP\n"
  1211. "2MDa7TVL9rIFMiVZ09RKvbBbQxjhuzPQKL6X/PPspnhiTefQ+dl2k9xREQKBgHDS\n"
  1212. "fMfGNEeAEKezrfSVqxphE9/tXms3L+ZpnCaT+yu/uEr5dTIAawKoQ6i9f/sf1/Sy\n"
  1213. "xedsqR+IB+oKrzIDDWMgoJybN4pkZ8E5lzhVQIjFjKgFdWLzzqyW9z1gYfABQPlN\n"
  1214. "FiS20WX0vgP1vcKAjdNrHzc9zyHBpgQzDmAj3NZZAoGBAI8vKCKdH7w3aL5CNkZQ\n"
  1215. "2buIeWNA2HZazVwAGG5F2TU/LmXfRKnG6dX5bkU+AkBZh56jNZy//hfFSewJB4Kk\n"
  1216. "buB7ERSdaNbO21zXt9FEA3+z0RfMd/Zv2vlIWOSB5nzl/7UKti3sribK6s9ZVLfi\n"
  1217. "SxpiPQ8d/hmSGwn4ksrWUsJD\n"
  1218. "-----END PRIVATE KEY-----\n";
  1219. bssl::UniquePtr<BIO> bio(BIO_new_mem_buf(kKeyPEM, strlen(kKeyPEM)));
  1220. return bssl::UniquePtr<EVP_PKEY>(
  1221. PEM_read_bio_PrivateKey(bio.get(), nullptr, nullptr, nullptr));
  1222. }
  1223. // Test that |SSL_get_client_CA_list| echoes back the configured parameter even
  1224. // before configuring as a server.
  1225. TEST(SSLTest, ClientCAList) {
  1226. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  1227. ASSERT_TRUE(ctx);
  1228. bssl::UniquePtr<SSL> ssl(SSL_new(ctx.get()));
  1229. ASSERT_TRUE(ssl);
  1230. bssl::UniquePtr<X509_NAME> name(X509_NAME_new());
  1231. ASSERT_TRUE(name);
  1232. bssl::UniquePtr<X509_NAME> name_dup(X509_NAME_dup(name.get()));
  1233. ASSERT_TRUE(name_dup);
  1234. bssl::UniquePtr<STACK_OF(X509_NAME)> stack(sk_X509_NAME_new_null());
  1235. ASSERT_TRUE(stack);
  1236. ASSERT_TRUE(PushToStack(stack.get(), std::move(name_dup)));
  1237. // |SSL_set_client_CA_list| takes ownership.
  1238. SSL_set_client_CA_list(ssl.get(), stack.release());
  1239. STACK_OF(X509_NAME) *result = SSL_get_client_CA_list(ssl.get());
  1240. ASSERT_TRUE(result);
  1241. ASSERT_EQ(1u, sk_X509_NAME_num(result));
  1242. EXPECT_EQ(0, X509_NAME_cmp(sk_X509_NAME_value(result, 0), name.get()));
  1243. }
  1244. TEST(SSLTest, AddClientCA) {
  1245. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  1246. ASSERT_TRUE(ctx);
  1247. bssl::UniquePtr<SSL> ssl(SSL_new(ctx.get()));
  1248. ASSERT_TRUE(ssl);
  1249. bssl::UniquePtr<X509> cert1 = GetTestCertificate();
  1250. bssl::UniquePtr<X509> cert2 = GetChainTestCertificate();
  1251. ASSERT_TRUE(cert1 && cert2);
  1252. X509_NAME *name1 = X509_get_subject_name(cert1.get());
  1253. X509_NAME *name2 = X509_get_subject_name(cert2.get());
  1254. EXPECT_EQ(0u, sk_X509_NAME_num(SSL_get_client_CA_list(ssl.get())));
  1255. ASSERT_TRUE(SSL_add_client_CA(ssl.get(), cert1.get()));
  1256. ASSERT_TRUE(SSL_add_client_CA(ssl.get(), cert2.get()));
  1257. STACK_OF(X509_NAME) *list = SSL_get_client_CA_list(ssl.get());
  1258. ASSERT_EQ(2u, sk_X509_NAME_num(list));
  1259. EXPECT_EQ(0, X509_NAME_cmp(sk_X509_NAME_value(list, 0), name1));
  1260. EXPECT_EQ(0, X509_NAME_cmp(sk_X509_NAME_value(list, 1), name2));
  1261. ASSERT_TRUE(SSL_add_client_CA(ssl.get(), cert1.get()));
  1262. list = SSL_get_client_CA_list(ssl.get());
  1263. ASSERT_EQ(3u, sk_X509_NAME_num(list));
  1264. EXPECT_EQ(0, X509_NAME_cmp(sk_X509_NAME_value(list, 0), name1));
  1265. EXPECT_EQ(0, X509_NAME_cmp(sk_X509_NAME_value(list, 1), name2));
  1266. EXPECT_EQ(0, X509_NAME_cmp(sk_X509_NAME_value(list, 2), name1));
  1267. }
  1268. static void AppendSession(SSL_SESSION *session, void *arg) {
  1269. std::vector<SSL_SESSION*> *out =
  1270. reinterpret_cast<std::vector<SSL_SESSION*>*>(arg);
  1271. out->push_back(session);
  1272. }
  1273. // CacheEquals returns true if |ctx|'s session cache consists of |expected|, in
  1274. // order.
  1275. static bool CacheEquals(SSL_CTX *ctx,
  1276. const std::vector<SSL_SESSION*> &expected) {
  1277. // Check the linked list.
  1278. SSL_SESSION *ptr = ctx->session_cache_head;
  1279. for (SSL_SESSION *session : expected) {
  1280. if (ptr != session) {
  1281. return false;
  1282. }
  1283. // TODO(davidben): This is an absurd way to denote the end of the list.
  1284. if (ptr->next ==
  1285. reinterpret_cast<SSL_SESSION *>(&ctx->session_cache_tail)) {
  1286. ptr = nullptr;
  1287. } else {
  1288. ptr = ptr->next;
  1289. }
  1290. }
  1291. if (ptr != nullptr) {
  1292. return false;
  1293. }
  1294. // Check the hash table.
  1295. std::vector<SSL_SESSION*> actual, expected_copy;
  1296. lh_SSL_SESSION_doall_arg(ctx->sessions, AppendSession, &actual);
  1297. expected_copy = expected;
  1298. std::sort(actual.begin(), actual.end());
  1299. std::sort(expected_copy.begin(), expected_copy.end());
  1300. return actual == expected_copy;
  1301. }
  1302. static bssl::UniquePtr<SSL_SESSION> CreateTestSession(uint32_t number) {
  1303. bssl::UniquePtr<SSL_CTX> ssl_ctx(SSL_CTX_new(TLS_method()));
  1304. if (!ssl_ctx) {
  1305. return nullptr;
  1306. }
  1307. bssl::UniquePtr<SSL_SESSION> ret(SSL_SESSION_new(ssl_ctx.get()));
  1308. if (!ret) {
  1309. return nullptr;
  1310. }
  1311. uint8_t id[SSL3_SSL_SESSION_ID_LENGTH] = {0};
  1312. OPENSSL_memcpy(id, &number, sizeof(number));
  1313. if (!SSL_SESSION_set1_id(ret.get(), id, sizeof(id))) {
  1314. return nullptr;
  1315. }
  1316. return ret;
  1317. }
  1318. // Test that the internal session cache behaves as expected.
  1319. TEST(SSLTest, InternalSessionCache) {
  1320. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  1321. ASSERT_TRUE(ctx);
  1322. // Prepare 10 test sessions.
  1323. std::vector<bssl::UniquePtr<SSL_SESSION>> sessions;
  1324. for (int i = 0; i < 10; i++) {
  1325. bssl::UniquePtr<SSL_SESSION> session = CreateTestSession(i);
  1326. ASSERT_TRUE(session);
  1327. sessions.push_back(std::move(session));
  1328. }
  1329. SSL_CTX_sess_set_cache_size(ctx.get(), 5);
  1330. // Insert all the test sessions.
  1331. for (const auto &session : sessions) {
  1332. ASSERT_TRUE(SSL_CTX_add_session(ctx.get(), session.get()));
  1333. }
  1334. // Only the last five should be in the list.
  1335. ASSERT_TRUE(CacheEquals(
  1336. ctx.get(), {sessions[9].get(), sessions[8].get(), sessions[7].get(),
  1337. sessions[6].get(), sessions[5].get()}));
  1338. // Inserting an element already in the cache should fail and leave the cache
  1339. // unchanged.
  1340. ASSERT_FALSE(SSL_CTX_add_session(ctx.get(), sessions[7].get()));
  1341. ASSERT_TRUE(CacheEquals(
  1342. ctx.get(), {sessions[9].get(), sessions[8].get(), sessions[7].get(),
  1343. sessions[6].get(), sessions[5].get()}));
  1344. // Although collisions should be impossible (256-bit session IDs), the cache
  1345. // must handle them gracefully.
  1346. bssl::UniquePtr<SSL_SESSION> collision(CreateTestSession(7));
  1347. ASSERT_TRUE(collision);
  1348. ASSERT_TRUE(SSL_CTX_add_session(ctx.get(), collision.get()));
  1349. ASSERT_TRUE(CacheEquals(
  1350. ctx.get(), {collision.get(), sessions[9].get(), sessions[8].get(),
  1351. sessions[6].get(), sessions[5].get()}));
  1352. // Removing sessions behaves correctly.
  1353. ASSERT_TRUE(SSL_CTX_remove_session(ctx.get(), sessions[6].get()));
  1354. ASSERT_TRUE(CacheEquals(ctx.get(), {collision.get(), sessions[9].get(),
  1355. sessions[8].get(), sessions[5].get()}));
  1356. // Removing sessions requires an exact match.
  1357. ASSERT_FALSE(SSL_CTX_remove_session(ctx.get(), sessions[0].get()));
  1358. ASSERT_FALSE(SSL_CTX_remove_session(ctx.get(), sessions[7].get()));
  1359. // The cache remains unchanged.
  1360. ASSERT_TRUE(CacheEquals(ctx.get(), {collision.get(), sessions[9].get(),
  1361. sessions[8].get(), sessions[5].get()}));
  1362. }
  1363. static uint16_t EpochFromSequence(uint64_t seq) {
  1364. return static_cast<uint16_t>(seq >> 48);
  1365. }
  1366. static const uint8_t kTestName[] = {
  1367. 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
  1368. 0x02, 0x41, 0x55, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08,
  1369. 0x0c, 0x0a, 0x53, 0x6f, 0x6d, 0x65, 0x2d, 0x53, 0x74, 0x61, 0x74, 0x65,
  1370. 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x18, 0x49,
  1371. 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x57, 0x69, 0x64, 0x67,
  1372. 0x69, 0x74, 0x73, 0x20, 0x50, 0x74, 0x79, 0x20, 0x4c, 0x74, 0x64,
  1373. };
  1374. static bool CompleteHandshakes(SSL *client, SSL *server) {
  1375. // Drive both their handshakes to completion.
  1376. for (;;) {
  1377. int client_ret = SSL_do_handshake(client);
  1378. int client_err = SSL_get_error(client, client_ret);
  1379. if (client_err != SSL_ERROR_NONE &&
  1380. client_err != SSL_ERROR_WANT_READ &&
  1381. client_err != SSL_ERROR_WANT_WRITE &&
  1382. client_err != SSL_ERROR_PENDING_TICKET) {
  1383. fprintf(stderr, "Client error: %d\n", client_err);
  1384. return false;
  1385. }
  1386. int server_ret = SSL_do_handshake(server);
  1387. int server_err = SSL_get_error(server, server_ret);
  1388. if (server_err != SSL_ERROR_NONE &&
  1389. server_err != SSL_ERROR_WANT_READ &&
  1390. server_err != SSL_ERROR_WANT_WRITE &&
  1391. server_err != SSL_ERROR_PENDING_TICKET) {
  1392. fprintf(stderr, "Server error: %d\n", server_err);
  1393. return false;
  1394. }
  1395. if (client_ret == 1 && server_ret == 1) {
  1396. break;
  1397. }
  1398. }
  1399. return true;
  1400. }
  1401. static bool FlushNewSessionTickets(SSL *client, SSL *server) {
  1402. // NewSessionTickets are deferred on the server to |SSL_write|, and clients do
  1403. // not pick them up until |SSL_read|.
  1404. for (;;) {
  1405. int server_ret = SSL_write(server, nullptr, 0);
  1406. int server_err = SSL_get_error(server, server_ret);
  1407. // The server may either succeed (|server_ret| is zero) or block on write
  1408. // (|server_ret| is -1 and |server_err| is |SSL_ERROR_WANT_WRITE|).
  1409. if (server_ret > 0 ||
  1410. (server_ret < 0 && server_err != SSL_ERROR_WANT_WRITE)) {
  1411. fprintf(stderr, "Unexpected server result: %d %d\n", server_ret,
  1412. server_err);
  1413. return false;
  1414. }
  1415. int client_ret = SSL_read(client, nullptr, 0);
  1416. int client_err = SSL_get_error(client, client_ret);
  1417. // The client must always block on read.
  1418. if (client_ret != -1 || client_err != SSL_ERROR_WANT_READ) {
  1419. fprintf(stderr, "Unexpected client result: %d %d\n", client_ret,
  1420. client_err);
  1421. return false;
  1422. }
  1423. // The server flushed everything it had to write.
  1424. if (server_ret == 0) {
  1425. return true;
  1426. }
  1427. }
  1428. }
  1429. struct ClientConfig {
  1430. SSL_SESSION *session = nullptr;
  1431. std::string servername;
  1432. };
  1433. static bool ConnectClientAndServer(bssl::UniquePtr<SSL> *out_client,
  1434. bssl::UniquePtr<SSL> *out_server,
  1435. SSL_CTX *client_ctx, SSL_CTX *server_ctx,
  1436. const ClientConfig &config = ClientConfig(),
  1437. bool do_handshake = true,
  1438. bool shed_handshake_config = true) {
  1439. bssl::UniquePtr<SSL> client(SSL_new(client_ctx)), server(SSL_new(server_ctx));
  1440. if (!client || !server) {
  1441. return false;
  1442. }
  1443. SSL_set_connect_state(client.get());
  1444. SSL_set_accept_state(server.get());
  1445. if (config.session) {
  1446. SSL_set_session(client.get(), config.session);
  1447. }
  1448. if (!config.servername.empty() &&
  1449. !SSL_set_tlsext_host_name(client.get(), config.servername.c_str())) {
  1450. return false;
  1451. }
  1452. BIO *bio1, *bio2;
  1453. if (!BIO_new_bio_pair(&bio1, 0, &bio2, 0)) {
  1454. return false;
  1455. }
  1456. // SSL_set_bio takes ownership.
  1457. SSL_set_bio(client.get(), bio1, bio1);
  1458. SSL_set_bio(server.get(), bio2, bio2);
  1459. SSL_set_shed_handshake_config(client.get(), shed_handshake_config);
  1460. SSL_set_shed_handshake_config(server.get(), shed_handshake_config);
  1461. if (do_handshake && !CompleteHandshakes(client.get(), server.get())) {
  1462. return false;
  1463. }
  1464. *out_client = std::move(client);
  1465. *out_server = std::move(server);
  1466. return true;
  1467. }
  1468. // SSLVersionTest executes its test cases under all available protocol versions.
  1469. // Test cases call |Connect| to create a connection using context objects with
  1470. // the protocol version fixed to the current version under test.
  1471. class SSLVersionTest : public ::testing::TestWithParam<VersionParam> {
  1472. protected:
  1473. SSLVersionTest() : cert_(GetTestCertificate()), key_(GetTestKey()) {}
  1474. void SetUp() { ResetContexts(); }
  1475. bssl::UniquePtr<SSL_CTX> CreateContext() const {
  1476. const SSL_METHOD *method = is_dtls() ? DTLS_method() : TLS_method();
  1477. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(method));
  1478. if (!ctx || !SSL_CTX_set_min_proto_version(ctx.get(), version()) ||
  1479. !SSL_CTX_set_max_proto_version(ctx.get(), version())) {
  1480. return nullptr;
  1481. }
  1482. return ctx;
  1483. }
  1484. void ResetContexts() {
  1485. ASSERT_TRUE(cert_);
  1486. ASSERT_TRUE(key_);
  1487. client_ctx_ = CreateContext();
  1488. ASSERT_TRUE(client_ctx_);
  1489. server_ctx_ = CreateContext();
  1490. ASSERT_TRUE(server_ctx_);
  1491. // Set up a server cert. Client certs can be set up explicitly.
  1492. ASSERT_TRUE(UseCertAndKey(server_ctx_.get()));
  1493. }
  1494. bool UseCertAndKey(SSL_CTX *ctx) const {
  1495. return SSL_CTX_use_certificate(ctx, cert_.get()) &&
  1496. SSL_CTX_use_PrivateKey(ctx, key_.get());
  1497. }
  1498. bool Connect(const ClientConfig &config = ClientConfig()) {
  1499. return ConnectClientAndServer(&client_, &server_, client_ctx_.get(),
  1500. server_ctx_.get(), config, true,
  1501. shed_handshake_config_);
  1502. }
  1503. uint16_t version() const { return GetParam().version; }
  1504. bool is_dtls() const {
  1505. return GetParam().ssl_method == VersionParam::is_dtls;
  1506. }
  1507. bool shed_handshake_config_ = true;
  1508. bssl::UniquePtr<SSL> client_, server_;
  1509. bssl::UniquePtr<SSL_CTX> server_ctx_, client_ctx_;
  1510. bssl::UniquePtr<X509> cert_;
  1511. bssl::UniquePtr<EVP_PKEY> key_;
  1512. };
  1513. INSTANTIATE_TEST_SUITE_P(WithVersion, SSLVersionTest,
  1514. testing::ValuesIn(kAllVersions),
  1515. [](const testing::TestParamInfo<VersionParam> &i) {
  1516. return i.param.name;
  1517. });
  1518. TEST_P(SSLVersionTest, SequenceNumber) {
  1519. ASSERT_TRUE(Connect());
  1520. // Drain any post-handshake messages to ensure there are no unread records
  1521. // on either end.
  1522. ASSERT_TRUE(FlushNewSessionTickets(client_.get(), server_.get()));
  1523. uint64_t client_read_seq = SSL_get_read_sequence(client_.get());
  1524. uint64_t client_write_seq = SSL_get_write_sequence(client_.get());
  1525. uint64_t server_read_seq = SSL_get_read_sequence(server_.get());
  1526. uint64_t server_write_seq = SSL_get_write_sequence(server_.get());
  1527. if (is_dtls()) {
  1528. // Both client and server must be at epoch 1.
  1529. EXPECT_EQ(EpochFromSequence(client_read_seq), 1);
  1530. EXPECT_EQ(EpochFromSequence(client_write_seq), 1);
  1531. EXPECT_EQ(EpochFromSequence(server_read_seq), 1);
  1532. EXPECT_EQ(EpochFromSequence(server_write_seq), 1);
  1533. // The next record to be written should exceed the largest received.
  1534. EXPECT_GT(client_write_seq, server_read_seq);
  1535. EXPECT_GT(server_write_seq, client_read_seq);
  1536. } else {
  1537. // The next record to be written should equal the next to be received.
  1538. EXPECT_EQ(client_write_seq, server_read_seq);
  1539. EXPECT_EQ(server_write_seq, client_read_seq);
  1540. }
  1541. // Send a record from client to server.
  1542. uint8_t byte = 0;
  1543. EXPECT_EQ(SSL_write(client_.get(), &byte, 1), 1);
  1544. EXPECT_EQ(SSL_read(server_.get(), &byte, 1), 1);
  1545. // The client write and server read sequence numbers should have
  1546. // incremented.
  1547. EXPECT_EQ(client_write_seq + 1, SSL_get_write_sequence(client_.get()));
  1548. EXPECT_EQ(server_read_seq + 1, SSL_get_read_sequence(server_.get()));
  1549. }
  1550. TEST_P(SSLVersionTest, OneSidedShutdown) {
  1551. // SSL_shutdown is a no-op in DTLS.
  1552. if (is_dtls()) {
  1553. return;
  1554. }
  1555. ASSERT_TRUE(Connect());
  1556. // Shut down half the connection. SSL_shutdown will return 0 to signal only
  1557. // one side has shut down.
  1558. ASSERT_EQ(SSL_shutdown(client_.get()), 0);
  1559. // Reading from the server should consume the EOF.
  1560. uint8_t byte;
  1561. ASSERT_EQ(SSL_read(server_.get(), &byte, 1), 0);
  1562. ASSERT_EQ(SSL_get_error(server_.get(), 0), SSL_ERROR_ZERO_RETURN);
  1563. // However, the server may continue to write data and then shut down the
  1564. // connection.
  1565. byte = 42;
  1566. ASSERT_EQ(SSL_write(server_.get(), &byte, 1), 1);
  1567. ASSERT_EQ(SSL_read(client_.get(), &byte, 1), 1);
  1568. ASSERT_EQ(byte, 42);
  1569. // The server may then shutdown the connection.
  1570. EXPECT_EQ(SSL_shutdown(server_.get()), 1);
  1571. EXPECT_EQ(SSL_shutdown(client_.get()), 1);
  1572. }
  1573. TEST(SSLTest, SessionDuplication) {
  1574. bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
  1575. bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_method()));
  1576. ASSERT_TRUE(client_ctx);
  1577. ASSERT_TRUE(server_ctx);
  1578. bssl::UniquePtr<X509> cert = GetTestCertificate();
  1579. bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
  1580. ASSERT_TRUE(cert);
  1581. ASSERT_TRUE(key);
  1582. ASSERT_TRUE(SSL_CTX_use_certificate(server_ctx.get(), cert.get()));
  1583. ASSERT_TRUE(SSL_CTX_use_PrivateKey(server_ctx.get(), key.get()));
  1584. bssl::UniquePtr<SSL> client, server;
  1585. ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(),
  1586. server_ctx.get()));
  1587. SSL_SESSION *session0 = SSL_get_session(client.get());
  1588. bssl::UniquePtr<SSL_SESSION> session1 =
  1589. bssl::SSL_SESSION_dup(session0, SSL_SESSION_DUP_ALL);
  1590. ASSERT_TRUE(session1);
  1591. session1->not_resumable = false;
  1592. uint8_t *s0_bytes, *s1_bytes;
  1593. size_t s0_len, s1_len;
  1594. ASSERT_TRUE(SSL_SESSION_to_bytes(session0, &s0_bytes, &s0_len));
  1595. bssl::UniquePtr<uint8_t> free_s0(s0_bytes);
  1596. ASSERT_TRUE(SSL_SESSION_to_bytes(session1.get(), &s1_bytes, &s1_len));
  1597. bssl::UniquePtr<uint8_t> free_s1(s1_bytes);
  1598. EXPECT_EQ(Bytes(s0_bytes, s0_len), Bytes(s1_bytes, s1_len));
  1599. }
  1600. static void ExpectFDs(const SSL *ssl, int rfd, int wfd) {
  1601. EXPECT_EQ(rfd, SSL_get_fd(ssl));
  1602. EXPECT_EQ(rfd, SSL_get_rfd(ssl));
  1603. EXPECT_EQ(wfd, SSL_get_wfd(ssl));
  1604. // The wrapper BIOs are always equal when fds are equal, even if set
  1605. // individually.
  1606. if (rfd == wfd) {
  1607. EXPECT_EQ(SSL_get_rbio(ssl), SSL_get_wbio(ssl));
  1608. }
  1609. }
  1610. TEST(SSLTest, SetFD) {
  1611. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  1612. ASSERT_TRUE(ctx);
  1613. // Test setting different read and write FDs.
  1614. bssl::UniquePtr<SSL> ssl(SSL_new(ctx.get()));
  1615. ASSERT_TRUE(ssl);
  1616. EXPECT_TRUE(SSL_set_rfd(ssl.get(), 1));
  1617. EXPECT_TRUE(SSL_set_wfd(ssl.get(), 2));
  1618. ExpectFDs(ssl.get(), 1, 2);
  1619. // Test setting the same FD.
  1620. ssl.reset(SSL_new(ctx.get()));
  1621. ASSERT_TRUE(ssl);
  1622. EXPECT_TRUE(SSL_set_fd(ssl.get(), 1));
  1623. ExpectFDs(ssl.get(), 1, 1);
  1624. // Test setting the same FD one side at a time.
  1625. ssl.reset(SSL_new(ctx.get()));
  1626. ASSERT_TRUE(ssl);
  1627. EXPECT_TRUE(SSL_set_rfd(ssl.get(), 1));
  1628. EXPECT_TRUE(SSL_set_wfd(ssl.get(), 1));
  1629. ExpectFDs(ssl.get(), 1, 1);
  1630. // Test setting the same FD in the other order.
  1631. ssl.reset(SSL_new(ctx.get()));
  1632. ASSERT_TRUE(ssl);
  1633. EXPECT_TRUE(SSL_set_wfd(ssl.get(), 1));
  1634. EXPECT_TRUE(SSL_set_rfd(ssl.get(), 1));
  1635. ExpectFDs(ssl.get(), 1, 1);
  1636. // Test changing the read FD partway through.
  1637. ssl.reset(SSL_new(ctx.get()));
  1638. ASSERT_TRUE(ssl);
  1639. EXPECT_TRUE(SSL_set_fd(ssl.get(), 1));
  1640. EXPECT_TRUE(SSL_set_rfd(ssl.get(), 2));
  1641. ExpectFDs(ssl.get(), 2, 1);
  1642. // Test changing the write FD partway through.
  1643. ssl.reset(SSL_new(ctx.get()));
  1644. ASSERT_TRUE(ssl);
  1645. EXPECT_TRUE(SSL_set_fd(ssl.get(), 1));
  1646. EXPECT_TRUE(SSL_set_wfd(ssl.get(), 2));
  1647. ExpectFDs(ssl.get(), 1, 2);
  1648. // Test a no-op change to the read FD partway through.
  1649. ssl.reset(SSL_new(ctx.get()));
  1650. ASSERT_TRUE(ssl);
  1651. EXPECT_TRUE(SSL_set_fd(ssl.get(), 1));
  1652. EXPECT_TRUE(SSL_set_rfd(ssl.get(), 1));
  1653. ExpectFDs(ssl.get(), 1, 1);
  1654. // Test a no-op change to the write FD partway through.
  1655. ssl.reset(SSL_new(ctx.get()));
  1656. ASSERT_TRUE(ssl);
  1657. EXPECT_TRUE(SSL_set_fd(ssl.get(), 1));
  1658. EXPECT_TRUE(SSL_set_wfd(ssl.get(), 1));
  1659. ExpectFDs(ssl.get(), 1, 1);
  1660. // ASan builds will implicitly test that the internal |BIO| reference-counting
  1661. // is correct.
  1662. }
  1663. TEST(SSLTest, SetBIO) {
  1664. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  1665. ASSERT_TRUE(ctx);
  1666. bssl::UniquePtr<SSL> ssl(SSL_new(ctx.get()));
  1667. bssl::UniquePtr<BIO> bio1(BIO_new(BIO_s_mem())), bio2(BIO_new(BIO_s_mem())),
  1668. bio3(BIO_new(BIO_s_mem()));
  1669. ASSERT_TRUE(ssl);
  1670. ASSERT_TRUE(bio1);
  1671. ASSERT_TRUE(bio2);
  1672. ASSERT_TRUE(bio3);
  1673. // SSL_set_bio takes one reference when the parameters are the same.
  1674. BIO_up_ref(bio1.get());
  1675. SSL_set_bio(ssl.get(), bio1.get(), bio1.get());
  1676. // Repeating the call does nothing.
  1677. SSL_set_bio(ssl.get(), bio1.get(), bio1.get());
  1678. // It takes one reference each when the parameters are different.
  1679. BIO_up_ref(bio2.get());
  1680. BIO_up_ref(bio3.get());
  1681. SSL_set_bio(ssl.get(), bio2.get(), bio3.get());
  1682. // Repeating the call does nothing.
  1683. SSL_set_bio(ssl.get(), bio2.get(), bio3.get());
  1684. // It takes one reference when changing only wbio.
  1685. BIO_up_ref(bio1.get());
  1686. SSL_set_bio(ssl.get(), bio2.get(), bio1.get());
  1687. // It takes one reference when changing only rbio and the two are different.
  1688. BIO_up_ref(bio3.get());
  1689. SSL_set_bio(ssl.get(), bio3.get(), bio1.get());
  1690. // If setting wbio to rbio, it takes no additional references.
  1691. SSL_set_bio(ssl.get(), bio3.get(), bio3.get());
  1692. // From there, wbio may be switched to something else.
  1693. BIO_up_ref(bio1.get());
  1694. SSL_set_bio(ssl.get(), bio3.get(), bio1.get());
  1695. // If setting rbio to wbio, it takes no additional references.
  1696. SSL_set_bio(ssl.get(), bio1.get(), bio1.get());
  1697. // From there, rbio may be switched to something else, but, for historical
  1698. // reasons, it takes a reference to both parameters.
  1699. BIO_up_ref(bio1.get());
  1700. BIO_up_ref(bio2.get());
  1701. SSL_set_bio(ssl.get(), bio2.get(), bio1.get());
  1702. // ASAN builds will implicitly test that the internal |BIO| reference-counting
  1703. // is correct.
  1704. }
  1705. static int VerifySucceed(X509_STORE_CTX *store_ctx, void *arg) { return 1; }
  1706. TEST_P(SSLVersionTest, GetPeerCertificate) {
  1707. ASSERT_TRUE(UseCertAndKey(client_ctx_.get()));
  1708. // Configure both client and server to accept any certificate.
  1709. SSL_CTX_set_verify(client_ctx_.get(),
  1710. SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
  1711. nullptr);
  1712. SSL_CTX_set_cert_verify_callback(client_ctx_.get(), VerifySucceed, NULL);
  1713. SSL_CTX_set_verify(server_ctx_.get(),
  1714. SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
  1715. nullptr);
  1716. SSL_CTX_set_cert_verify_callback(server_ctx_.get(), VerifySucceed, NULL);
  1717. ASSERT_TRUE(Connect());
  1718. // Client and server should both see the leaf certificate.
  1719. bssl::UniquePtr<X509> peer(SSL_get_peer_certificate(server_.get()));
  1720. ASSERT_TRUE(peer);
  1721. ASSERT_EQ(X509_cmp(cert_.get(), peer.get()), 0);
  1722. peer.reset(SSL_get_peer_certificate(client_.get()));
  1723. ASSERT_TRUE(peer);
  1724. ASSERT_EQ(X509_cmp(cert_.get(), peer.get()), 0);
  1725. // However, for historical reasons, the X509 chain includes the leaf on the
  1726. // client, but does not on the server.
  1727. EXPECT_EQ(sk_X509_num(SSL_get_peer_cert_chain(client_.get())), 1u);
  1728. EXPECT_EQ(sk_CRYPTO_BUFFER_num(SSL_get0_peer_certificates(client_.get())),
  1729. 1u);
  1730. EXPECT_EQ(sk_X509_num(SSL_get_peer_cert_chain(server_.get())), 0u);
  1731. EXPECT_EQ(sk_CRYPTO_BUFFER_num(SSL_get0_peer_certificates(server_.get())),
  1732. 1u);
  1733. }
  1734. TEST_P(SSLVersionTest, NoPeerCertificate) {
  1735. SSL_CTX_set_verify(server_ctx_.get(), SSL_VERIFY_PEER, nullptr);
  1736. SSL_CTX_set_cert_verify_callback(server_ctx_.get(), VerifySucceed, NULL);
  1737. SSL_CTX_set_cert_verify_callback(client_ctx_.get(), VerifySucceed, NULL);
  1738. ASSERT_TRUE(Connect());
  1739. // Server should not see a peer certificate.
  1740. bssl::UniquePtr<X509> peer(SSL_get_peer_certificate(server_.get()));
  1741. ASSERT_FALSE(peer);
  1742. ASSERT_FALSE(SSL_get0_peer_certificates(server_.get()));
  1743. }
  1744. TEST_P(SSLVersionTest, RetainOnlySHA256OfCerts) {
  1745. uint8_t *cert_der = NULL;
  1746. int cert_der_len = i2d_X509(cert_.get(), &cert_der);
  1747. ASSERT_GE(cert_der_len, 0);
  1748. bssl::UniquePtr<uint8_t> free_cert_der(cert_der);
  1749. uint8_t cert_sha256[SHA256_DIGEST_LENGTH];
  1750. SHA256(cert_der, cert_der_len, cert_sha256);
  1751. ASSERT_TRUE(UseCertAndKey(client_ctx_.get()));
  1752. // Configure both client and server to accept any certificate, but the
  1753. // server must retain only the SHA-256 of the peer.
  1754. SSL_CTX_set_verify(client_ctx_.get(),
  1755. SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
  1756. nullptr);
  1757. SSL_CTX_set_verify(server_ctx_.get(),
  1758. SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
  1759. nullptr);
  1760. SSL_CTX_set_cert_verify_callback(client_ctx_.get(), VerifySucceed, NULL);
  1761. SSL_CTX_set_cert_verify_callback(server_ctx_.get(), VerifySucceed, NULL);
  1762. SSL_CTX_set_retain_only_sha256_of_client_certs(server_ctx_.get(), 1);
  1763. ASSERT_TRUE(Connect());
  1764. // The peer certificate has been dropped.
  1765. bssl::UniquePtr<X509> peer(SSL_get_peer_certificate(server_.get()));
  1766. EXPECT_FALSE(peer);
  1767. SSL_SESSION *session = SSL_get_session(server_.get());
  1768. EXPECT_TRUE(SSL_SESSION_has_peer_sha256(session));
  1769. const uint8_t *peer_sha256;
  1770. size_t peer_sha256_len;
  1771. SSL_SESSION_get0_peer_sha256(session, &peer_sha256, &peer_sha256_len);
  1772. EXPECT_EQ(Bytes(cert_sha256), Bytes(peer_sha256, peer_sha256_len));
  1773. }
  1774. // Tests that our ClientHellos do not change unexpectedly. These are purely
  1775. // change detection tests. If they fail as part of an intentional ClientHello
  1776. // change, update the test vector.
  1777. TEST(SSLTest, ClientHello) {
  1778. struct {
  1779. uint16_t max_version;
  1780. std::vector<uint8_t> expected;
  1781. } kTests[] = {
  1782. {TLS1_VERSION,
  1783. {0x16, 0x03, 0x01, 0x00, 0x5a, 0x01, 0x00, 0x00, 0x56, 0x03, 0x01, 0x00,
  1784. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1785. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1786. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xc0, 0x09,
  1787. 0xc0, 0x13, 0xc0, 0x0a, 0xc0, 0x14, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x0a,
  1788. 0x01, 0x00, 0x00, 0x1f, 0x00, 0x17, 0x00, 0x00, 0xff, 0x01, 0x00, 0x01,
  1789. 0x00, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x06, 0x00, 0x1d, 0x00, 0x17, 0x00,
  1790. 0x18, 0x00, 0x0b, 0x00, 0x02, 0x01, 0x00, 0x00, 0x23, 0x00, 0x00}},
  1791. {TLS1_1_VERSION,
  1792. {0x16, 0x03, 0x01, 0x00, 0x5a, 0x01, 0x00, 0x00, 0x56, 0x03, 0x02, 0x00,
  1793. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1794. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1795. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xc0, 0x09,
  1796. 0xc0, 0x13, 0xc0, 0x0a, 0xc0, 0x14, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x0a,
  1797. 0x01, 0x00, 0x00, 0x1f, 0x00, 0x17, 0x00, 0x00, 0xff, 0x01, 0x00, 0x01,
  1798. 0x00, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x06, 0x00, 0x1d, 0x00, 0x17, 0x00,
  1799. 0x18, 0x00, 0x0b, 0x00, 0x02, 0x01, 0x00, 0x00, 0x23, 0x00, 0x00}},
  1800. {TLS1_2_VERSION,
  1801. {0x16, 0x03, 0x01, 0x00, 0x82, 0x01, 0x00, 0x00, 0x7e, 0x03, 0x03, 0x00,
  1802. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1803. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1804. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xcc, 0xa9,
  1805. 0xcc, 0xa8, 0xc0, 0x2b, 0xc0, 0x2f, 0xc0, 0x2c, 0xc0, 0x30, 0xc0, 0x09,
  1806. 0xc0, 0x13, 0xc0, 0x0a, 0xc0, 0x14, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x2f,
  1807. 0x00, 0x35, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x37, 0x00, 0x17, 0x00, 0x00,
  1808. 0xff, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x06, 0x00,
  1809. 0x1d, 0x00, 0x17, 0x00, 0x18, 0x00, 0x0b, 0x00, 0x02, 0x01, 0x00, 0x00,
  1810. 0x23, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x12, 0x04, 0x03, 0x08,
  1811. 0x04, 0x04, 0x01, 0x05, 0x03, 0x08, 0x05, 0x05, 0x01, 0x08, 0x06, 0x06,
  1812. 0x01, 0x02, 0x01}},
  1813. // TODO(davidben): Add a change detector for TLS 1.3 once the spec and our
  1814. // implementation has settled enough that it won't change.
  1815. };
  1816. for (const auto &t : kTests) {
  1817. SCOPED_TRACE(t.max_version);
  1818. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  1819. ASSERT_TRUE(ctx);
  1820. // Our default cipher list varies by CPU capabilities, so manually place the
  1821. // ChaCha20 ciphers in front.
  1822. const char *cipher_list = "CHACHA20:ALL";
  1823. ASSERT_TRUE(SSL_CTX_set_max_proto_version(ctx.get(), t.max_version));
  1824. ASSERT_TRUE(SSL_CTX_set_strict_cipher_list(ctx.get(), cipher_list));
  1825. bssl::UniquePtr<SSL> ssl(SSL_new(ctx.get()));
  1826. ASSERT_TRUE(ssl);
  1827. std::vector<uint8_t> client_hello;
  1828. ASSERT_TRUE(GetClientHello(ssl.get(), &client_hello));
  1829. // Zero the client_random.
  1830. constexpr size_t kRandomOffset = 1 + 2 + 2 + // record header
  1831. 1 + 3 + // handshake message header
  1832. 2; // client_version
  1833. ASSERT_GE(client_hello.size(), kRandomOffset + SSL3_RANDOM_SIZE);
  1834. OPENSSL_memset(client_hello.data() + kRandomOffset, 0, SSL3_RANDOM_SIZE);
  1835. if (client_hello != t.expected) {
  1836. ADD_FAILURE() << "ClientHellos did not match.";
  1837. // Print the value manually so it is easier to update the test vector.
  1838. for (size_t i = 0; i < client_hello.size(); i += 12) {
  1839. printf(" %c", i == 0 ? '{' : ' ');
  1840. for (size_t j = i; j < client_hello.size() && j < i + 12; j++) {
  1841. if (j > i) {
  1842. printf(" ");
  1843. }
  1844. printf("0x%02x", client_hello[j]);
  1845. if (j < client_hello.size() - 1) {
  1846. printf(",");
  1847. }
  1848. }
  1849. if (i + 12 >= client_hello.size()) {
  1850. printf("}},");
  1851. }
  1852. printf("\n");
  1853. }
  1854. }
  1855. }
  1856. }
  1857. static bssl::UniquePtr<SSL_SESSION> g_last_session;
  1858. static int SaveLastSession(SSL *ssl, SSL_SESSION *session) {
  1859. // Save the most recent session.
  1860. g_last_session.reset(session);
  1861. return 1;
  1862. }
  1863. static bssl::UniquePtr<SSL_SESSION> CreateClientSession(
  1864. SSL_CTX *client_ctx, SSL_CTX *server_ctx,
  1865. const ClientConfig &config = ClientConfig()) {
  1866. g_last_session = nullptr;
  1867. SSL_CTX_sess_set_new_cb(client_ctx, SaveLastSession);
  1868. // Connect client and server to get a session.
  1869. bssl::UniquePtr<SSL> client, server;
  1870. if (!ConnectClientAndServer(&client, &server, client_ctx, server_ctx,
  1871. config) ||
  1872. !FlushNewSessionTickets(client.get(), server.get())) {
  1873. fprintf(stderr, "Failed to connect client and server.\n");
  1874. return nullptr;
  1875. }
  1876. SSL_CTX_sess_set_new_cb(client_ctx, nullptr);
  1877. if (!g_last_session) {
  1878. fprintf(stderr, "Client did not receive a session.\n");
  1879. return nullptr;
  1880. }
  1881. return std::move(g_last_session);
  1882. }
  1883. static void ExpectSessionReused(SSL_CTX *client_ctx, SSL_CTX *server_ctx,
  1884. SSL_SESSION *session, bool want_reused) {
  1885. bssl::UniquePtr<SSL> client, server;
  1886. ClientConfig config;
  1887. config.session = session;
  1888. EXPECT_TRUE(
  1889. ConnectClientAndServer(&client, &server, client_ctx, server_ctx, config));
  1890. EXPECT_EQ(SSL_session_reused(client.get()), SSL_session_reused(server.get()));
  1891. bool was_reused = !!SSL_session_reused(client.get());
  1892. EXPECT_EQ(was_reused, want_reused);
  1893. }
  1894. static bssl::UniquePtr<SSL_SESSION> ExpectSessionRenewed(SSL_CTX *client_ctx,
  1895. SSL_CTX *server_ctx,
  1896. SSL_SESSION *session) {
  1897. g_last_session = nullptr;
  1898. SSL_CTX_sess_set_new_cb(client_ctx, SaveLastSession);
  1899. bssl::UniquePtr<SSL> client, server;
  1900. ClientConfig config;
  1901. config.session = session;
  1902. if (!ConnectClientAndServer(&client, &server, client_ctx, server_ctx,
  1903. config) ||
  1904. !FlushNewSessionTickets(client.get(), server.get())) {
  1905. fprintf(stderr, "Failed to connect client and server.\n");
  1906. return nullptr;
  1907. }
  1908. if (SSL_session_reused(client.get()) != SSL_session_reused(server.get())) {
  1909. fprintf(stderr, "Client and server were inconsistent.\n");
  1910. return nullptr;
  1911. }
  1912. if (!SSL_session_reused(client.get())) {
  1913. fprintf(stderr, "Session was not reused.\n");
  1914. return nullptr;
  1915. }
  1916. SSL_CTX_sess_set_new_cb(client_ctx, nullptr);
  1917. if (!g_last_session) {
  1918. fprintf(stderr, "Client did not receive a renewed session.\n");
  1919. return nullptr;
  1920. }
  1921. return std::move(g_last_session);
  1922. }
  1923. static void ExpectTicketKeyChanged(SSL_CTX *ctx, uint8_t *inout_key,
  1924. bool changed) {
  1925. uint8_t new_key[kTicketKeyLen];
  1926. // May return 0, 1 or 48.
  1927. ASSERT_EQ(SSL_CTX_get_tlsext_ticket_keys(ctx, new_key, kTicketKeyLen), 1);
  1928. if (changed) {
  1929. ASSERT_NE(Bytes(inout_key, kTicketKeyLen), Bytes(new_key));
  1930. } else {
  1931. ASSERT_EQ(Bytes(inout_key, kTicketKeyLen), Bytes(new_key));
  1932. }
  1933. OPENSSL_memcpy(inout_key, new_key, kTicketKeyLen);
  1934. }
  1935. static int SwitchSessionIDContextSNI(SSL *ssl, int *out_alert, void *arg) {
  1936. static const uint8_t kContext[] = {3};
  1937. if (!SSL_set_session_id_context(ssl, kContext, sizeof(kContext))) {
  1938. return SSL_TLSEXT_ERR_ALERT_FATAL;
  1939. }
  1940. return SSL_TLSEXT_ERR_OK;
  1941. }
  1942. TEST_P(SSLVersionTest, SessionIDContext) {
  1943. static const uint8_t kContext1[] = {1};
  1944. static const uint8_t kContext2[] = {2};
  1945. ASSERT_TRUE(SSL_CTX_set_session_id_context(server_ctx_.get(), kContext1,
  1946. sizeof(kContext1)));
  1947. SSL_CTX_set_session_cache_mode(client_ctx_.get(), SSL_SESS_CACHE_BOTH);
  1948. SSL_CTX_set_session_cache_mode(server_ctx_.get(), SSL_SESS_CACHE_BOTH);
  1949. bssl::UniquePtr<SSL_SESSION> session =
  1950. CreateClientSession(client_ctx_.get(), server_ctx_.get());
  1951. ASSERT_TRUE(session);
  1952. TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
  1953. session.get(),
  1954. true /* expect session reused */));
  1955. // Change the session ID context.
  1956. ASSERT_TRUE(SSL_CTX_set_session_id_context(server_ctx_.get(), kContext2,
  1957. sizeof(kContext2)));
  1958. TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
  1959. session.get(),
  1960. false /* expect session not reused */));
  1961. // Change the session ID context back and install an SNI callback to switch
  1962. // it.
  1963. ASSERT_TRUE(SSL_CTX_set_session_id_context(server_ctx_.get(), kContext1,
  1964. sizeof(kContext1)));
  1965. SSL_CTX_set_tlsext_servername_callback(server_ctx_.get(),
  1966. SwitchSessionIDContextSNI);
  1967. TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
  1968. session.get(),
  1969. false /* expect session not reused */));
  1970. // Switch the session ID context with the early callback instead.
  1971. SSL_CTX_set_tlsext_servername_callback(server_ctx_.get(), nullptr);
  1972. SSL_CTX_set_select_certificate_cb(
  1973. server_ctx_.get(),
  1974. [](const SSL_CLIENT_HELLO *client_hello) -> ssl_select_cert_result_t {
  1975. static const uint8_t kContext[] = {3};
  1976. if (!SSL_set_session_id_context(client_hello->ssl, kContext,
  1977. sizeof(kContext))) {
  1978. return ssl_select_cert_error;
  1979. }
  1980. return ssl_select_cert_success;
  1981. });
  1982. TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
  1983. session.get(),
  1984. false /* expect session not reused */));
  1985. }
  1986. static timeval g_current_time;
  1987. static void CurrentTimeCallback(const SSL *ssl, timeval *out_clock) {
  1988. *out_clock = g_current_time;
  1989. }
  1990. static void FrozenTimeCallback(const SSL *ssl, timeval *out_clock) {
  1991. out_clock->tv_sec = 1000;
  1992. out_clock->tv_usec = 0;
  1993. }
  1994. static int RenewTicketCallback(SSL *ssl, uint8_t *key_name, uint8_t *iv,
  1995. EVP_CIPHER_CTX *ctx, HMAC_CTX *hmac_ctx,
  1996. int encrypt) {
  1997. static const uint8_t kZeros[16] = {0};
  1998. if (encrypt) {
  1999. OPENSSL_memcpy(key_name, kZeros, sizeof(kZeros));
  2000. RAND_bytes(iv, 16);
  2001. } else if (OPENSSL_memcmp(key_name, kZeros, 16) != 0) {
  2002. return 0;
  2003. }
  2004. if (!HMAC_Init_ex(hmac_ctx, kZeros, sizeof(kZeros), EVP_sha256(), NULL) ||
  2005. !EVP_CipherInit_ex(ctx, EVP_aes_128_cbc(), NULL, kZeros, iv, encrypt)) {
  2006. return -1;
  2007. }
  2008. // Returning two from the callback in decrypt mode renews the
  2009. // session in TLS 1.2 and below.
  2010. return encrypt ? 1 : 2;
  2011. }
  2012. static bool GetServerTicketTime(long *out, const SSL_SESSION *session) {
  2013. const uint8_t *ticket;
  2014. size_t ticket_len;
  2015. SSL_SESSION_get0_ticket(session, &ticket, &ticket_len);
  2016. if (ticket_len < 16 + 16 + SHA256_DIGEST_LENGTH) {
  2017. return false;
  2018. }
  2019. const uint8_t *ciphertext = ticket + 16 + 16;
  2020. size_t len = ticket_len - 16 - 16 - SHA256_DIGEST_LENGTH;
  2021. std::unique_ptr<uint8_t[]> plaintext(new uint8_t[len]);
  2022. #if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
  2023. // Fuzzer-mode tickets are unencrypted.
  2024. OPENSSL_memcpy(plaintext.get(), ciphertext, len);
  2025. #else
  2026. static const uint8_t kZeros[16] = {0};
  2027. const uint8_t *iv = ticket + 16;
  2028. bssl::ScopedEVP_CIPHER_CTX ctx;
  2029. int len1, len2;
  2030. if (!EVP_DecryptInit_ex(ctx.get(), EVP_aes_128_cbc(), nullptr, kZeros, iv) ||
  2031. !EVP_DecryptUpdate(ctx.get(), plaintext.get(), &len1, ciphertext, len) ||
  2032. !EVP_DecryptFinal_ex(ctx.get(), plaintext.get() + len1, &len2)) {
  2033. return false;
  2034. }
  2035. len = static_cast<size_t>(len1 + len2);
  2036. #endif
  2037. bssl::UniquePtr<SSL_CTX> ssl_ctx(SSL_CTX_new(TLS_method()));
  2038. if (!ssl_ctx) {
  2039. return false;
  2040. }
  2041. bssl::UniquePtr<SSL_SESSION> server_session(
  2042. SSL_SESSION_from_bytes(plaintext.get(), len, ssl_ctx.get()));
  2043. if (!server_session) {
  2044. return false;
  2045. }
  2046. *out = SSL_SESSION_get_time(server_session.get());
  2047. return true;
  2048. }
  2049. TEST_P(SSLVersionTest, SessionTimeout) {
  2050. for (bool server_test : {false, true}) {
  2051. SCOPED_TRACE(server_test);
  2052. ResetContexts();
  2053. SSL_CTX_set_session_cache_mode(client_ctx_.get(), SSL_SESS_CACHE_BOTH);
  2054. SSL_CTX_set_session_cache_mode(server_ctx_.get(), SSL_SESS_CACHE_BOTH);
  2055. static const time_t kStartTime = 1000;
  2056. g_current_time.tv_sec = kStartTime;
  2057. // We are willing to use a longer lifetime for TLS 1.3 sessions as
  2058. // resumptions still perform ECDHE.
  2059. const time_t timeout = version() == TLS1_3_VERSION
  2060. ? SSL_DEFAULT_SESSION_PSK_DHE_TIMEOUT
  2061. : SSL_DEFAULT_SESSION_TIMEOUT;
  2062. // Both client and server must enforce session timeouts. We configure the
  2063. // other side with a frozen clock so it never expires tickets.
  2064. if (server_test) {
  2065. SSL_CTX_set_current_time_cb(client_ctx_.get(), FrozenTimeCallback);
  2066. SSL_CTX_set_current_time_cb(server_ctx_.get(), CurrentTimeCallback);
  2067. } else {
  2068. SSL_CTX_set_current_time_cb(client_ctx_.get(), CurrentTimeCallback);
  2069. SSL_CTX_set_current_time_cb(server_ctx_.get(), FrozenTimeCallback);
  2070. }
  2071. // Configure a ticket callback which renews tickets.
  2072. SSL_CTX_set_tlsext_ticket_key_cb(server_ctx_.get(), RenewTicketCallback);
  2073. bssl::UniquePtr<SSL_SESSION> session =
  2074. CreateClientSession(client_ctx_.get(), server_ctx_.get());
  2075. ASSERT_TRUE(session);
  2076. // Advance the clock just behind the timeout.
  2077. g_current_time.tv_sec += timeout - 1;
  2078. TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
  2079. session.get(),
  2080. true /* expect session reused */));
  2081. // Advance the clock one more second.
  2082. g_current_time.tv_sec++;
  2083. TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
  2084. session.get(),
  2085. false /* expect session not reused */));
  2086. // Rewind the clock to before the session was minted.
  2087. g_current_time.tv_sec = kStartTime - 1;
  2088. TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
  2089. session.get(),
  2090. false /* expect session not reused */));
  2091. // Renew the session 10 seconds before expiration.
  2092. time_t new_start_time = kStartTime + timeout - 10;
  2093. g_current_time.tv_sec = new_start_time;
  2094. bssl::UniquePtr<SSL_SESSION> new_session = ExpectSessionRenewed(
  2095. client_ctx_.get(), server_ctx_.get(), session.get());
  2096. ASSERT_TRUE(new_session);
  2097. // This new session is not the same object as before.
  2098. EXPECT_NE(session.get(), new_session.get());
  2099. // Check the sessions have timestamps measured from issuance.
  2100. long session_time = 0;
  2101. if (server_test) {
  2102. ASSERT_TRUE(GetServerTicketTime(&session_time, new_session.get()));
  2103. } else {
  2104. session_time = SSL_SESSION_get_time(new_session.get());
  2105. }
  2106. ASSERT_EQ(session_time, g_current_time.tv_sec);
  2107. if (version() == TLS1_3_VERSION) {
  2108. // Renewal incorporates fresh key material in TLS 1.3, so we extend the
  2109. // lifetime TLS 1.3.
  2110. g_current_time.tv_sec = new_start_time + timeout - 1;
  2111. TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
  2112. new_session.get(),
  2113. true /* expect session reused */));
  2114. // The new session expires after the new timeout.
  2115. g_current_time.tv_sec = new_start_time + timeout + 1;
  2116. TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
  2117. new_session.get(),
  2118. false /* expect session ot reused */));
  2119. // Renew the session until it begins just past the auth timeout.
  2120. time_t auth_end_time = kStartTime + SSL_DEFAULT_SESSION_AUTH_TIMEOUT;
  2121. while (new_start_time < auth_end_time - 1000) {
  2122. // Get as close as possible to target start time.
  2123. new_start_time =
  2124. std::min(auth_end_time - 1000, new_start_time + timeout - 1);
  2125. g_current_time.tv_sec = new_start_time;
  2126. new_session = ExpectSessionRenewed(client_ctx_.get(), server_ctx_.get(),
  2127. new_session.get());
  2128. ASSERT_TRUE(new_session);
  2129. }
  2130. // Now the session's lifetime is bound by the auth timeout.
  2131. g_current_time.tv_sec = auth_end_time - 1;
  2132. TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
  2133. new_session.get(),
  2134. true /* expect session reused */));
  2135. g_current_time.tv_sec = auth_end_time + 1;
  2136. TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
  2137. new_session.get(),
  2138. false /* expect session ot reused */));
  2139. } else {
  2140. // The new session is usable just before the old expiration.
  2141. g_current_time.tv_sec = kStartTime + timeout - 1;
  2142. TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
  2143. new_session.get(),
  2144. true /* expect session reused */));
  2145. // Renewal does not extend the lifetime, so it is not usable beyond the
  2146. // old expiration.
  2147. g_current_time.tv_sec = kStartTime + timeout + 1;
  2148. TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
  2149. new_session.get(),
  2150. false /* expect session not reused */));
  2151. }
  2152. }
  2153. }
  2154. TEST_P(SSLVersionTest, DefaultTicketKeyInitialization) {
  2155. static const uint8_t kZeroKey[kTicketKeyLen] = {};
  2156. uint8_t ticket_key[kTicketKeyLen];
  2157. ASSERT_EQ(1, SSL_CTX_get_tlsext_ticket_keys(server_ctx_.get(), ticket_key,
  2158. kTicketKeyLen));
  2159. ASSERT_NE(0, OPENSSL_memcmp(ticket_key, kZeroKey, kTicketKeyLen));
  2160. }
  2161. TEST_P(SSLVersionTest, DefaultTicketKeyRotation) {
  2162. static const time_t kStartTime = 1001;
  2163. g_current_time.tv_sec = kStartTime;
  2164. // We use session reuse as a proxy for ticket decryption success, hence
  2165. // disable session timeouts.
  2166. SSL_CTX_set_timeout(server_ctx_.get(), std::numeric_limits<uint32_t>::max());
  2167. SSL_CTX_set_session_psk_dhe_timeout(server_ctx_.get(),
  2168. std::numeric_limits<uint32_t>::max());
  2169. SSL_CTX_set_current_time_cb(client_ctx_.get(), FrozenTimeCallback);
  2170. SSL_CTX_set_current_time_cb(server_ctx_.get(), CurrentTimeCallback);
  2171. SSL_CTX_set_session_cache_mode(client_ctx_.get(), SSL_SESS_CACHE_BOTH);
  2172. SSL_CTX_set_session_cache_mode(server_ctx_.get(), SSL_SESS_CACHE_OFF);
  2173. // Initialize ticket_key with the current key and check that it was
  2174. // initialized to something, not all zeros.
  2175. uint8_t ticket_key[kTicketKeyLen] = {0};
  2176. TRACED_CALL(ExpectTicketKeyChanged(server_ctx_.get(), ticket_key,
  2177. true /* changed */));
  2178. // Verify ticket resumption actually works.
  2179. bssl::UniquePtr<SSL> client, server;
  2180. bssl::UniquePtr<SSL_SESSION> session =
  2181. CreateClientSession(client_ctx_.get(), server_ctx_.get());
  2182. ASSERT_TRUE(session);
  2183. TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
  2184. session.get(), true /* reused */));
  2185. // Advance time to just before key rotation.
  2186. g_current_time.tv_sec += SSL_DEFAULT_TICKET_KEY_ROTATION_INTERVAL - 1;
  2187. TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
  2188. session.get(), true /* reused */));
  2189. TRACED_CALL(ExpectTicketKeyChanged(server_ctx_.get(), ticket_key,
  2190. false /* NOT changed */));
  2191. // Force key rotation.
  2192. g_current_time.tv_sec += 1;
  2193. bssl::UniquePtr<SSL_SESSION> new_session =
  2194. CreateClientSession(client_ctx_.get(), server_ctx_.get());
  2195. TRACED_CALL(ExpectTicketKeyChanged(server_ctx_.get(), ticket_key,
  2196. true /* changed */));
  2197. // Resumption with both old and new ticket should work.
  2198. TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
  2199. session.get(), true /* reused */));
  2200. TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
  2201. new_session.get(), true /* reused */));
  2202. TRACED_CALL(ExpectTicketKeyChanged(server_ctx_.get(), ticket_key,
  2203. false /* NOT changed */));
  2204. // Force key rotation again. Resumption with the old ticket now fails.
  2205. g_current_time.tv_sec += SSL_DEFAULT_TICKET_KEY_ROTATION_INTERVAL;
  2206. TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
  2207. session.get(), false /* NOT reused */));
  2208. TRACED_CALL(ExpectTicketKeyChanged(server_ctx_.get(), ticket_key,
  2209. true /* changed */));
  2210. // But resumption with the newer session still works.
  2211. TRACED_CALL(ExpectSessionReused(client_ctx_.get(), server_ctx_.get(),
  2212. new_session.get(), true /* reused */));
  2213. }
  2214. static int SwitchContext(SSL *ssl, int *out_alert, void *arg) {
  2215. SSL_CTX *ctx = reinterpret_cast<SSL_CTX *>(arg);
  2216. SSL_set_SSL_CTX(ssl, ctx);
  2217. return SSL_TLSEXT_ERR_OK;
  2218. }
  2219. TEST_P(SSLVersionTest, SNICallback) {
  2220. bssl::UniquePtr<X509> cert2 = GetECDSATestCertificate();
  2221. ASSERT_TRUE(cert2);
  2222. bssl::UniquePtr<EVP_PKEY> key2 = GetECDSATestKey();
  2223. ASSERT_TRUE(key2);
  2224. // Test that switching the |SSL_CTX| at the SNI callback behaves correctly.
  2225. static const uint16_t kECDSAWithSHA256 = SSL_SIGN_ECDSA_SECP256R1_SHA256;
  2226. static const uint8_t kSCTList[] = {0, 6, 0, 4, 5, 6, 7, 8};
  2227. static const uint8_t kOCSPResponse[] = {1, 2, 3, 4};
  2228. bssl::UniquePtr<SSL_CTX> server_ctx2 = CreateContext();
  2229. ASSERT_TRUE(server_ctx2);
  2230. ASSERT_TRUE(SSL_CTX_use_certificate(server_ctx2.get(), cert2.get()));
  2231. ASSERT_TRUE(SSL_CTX_use_PrivateKey(server_ctx2.get(), key2.get()));
  2232. ASSERT_TRUE(SSL_CTX_set_signed_cert_timestamp_list(
  2233. server_ctx2.get(), kSCTList, sizeof(kSCTList)));
  2234. ASSERT_TRUE(SSL_CTX_set_ocsp_response(server_ctx2.get(), kOCSPResponse,
  2235. sizeof(kOCSPResponse)));
  2236. // Historically signing preferences would be lost in some cases with the
  2237. // SNI callback, which triggers the TLS 1.2 SHA-1 default. To ensure
  2238. // this doesn't happen when |version| is TLS 1.2, configure the private
  2239. // key to only sign SHA-256.
  2240. ASSERT_TRUE(SSL_CTX_set_signing_algorithm_prefs(server_ctx2.get(),
  2241. &kECDSAWithSHA256, 1));
  2242. SSL_CTX_set_tlsext_servername_callback(server_ctx_.get(), SwitchContext);
  2243. SSL_CTX_set_tlsext_servername_arg(server_ctx_.get(), server_ctx2.get());
  2244. SSL_CTX_enable_signed_cert_timestamps(client_ctx_.get());
  2245. SSL_CTX_enable_ocsp_stapling(client_ctx_.get());
  2246. ASSERT_TRUE(Connect());
  2247. // The client should have received |cert2|.
  2248. bssl::UniquePtr<X509> peer(SSL_get_peer_certificate(client_.get()));
  2249. ASSERT_TRUE(peer);
  2250. EXPECT_EQ(X509_cmp(peer.get(), cert2.get()), 0);
  2251. // The client should have received |server_ctx2|'s SCT list.
  2252. const uint8_t *data;
  2253. size_t len;
  2254. SSL_get0_signed_cert_timestamp_list(client_.get(), &data, &len);
  2255. EXPECT_EQ(Bytes(kSCTList), Bytes(data, len));
  2256. // The client should have received |server_ctx2|'s OCSP response.
  2257. SSL_get0_ocsp_response(client_.get(), &data, &len);
  2258. EXPECT_EQ(Bytes(kOCSPResponse), Bytes(data, len));
  2259. }
  2260. // Test that the early callback can swap the maximum version.
  2261. TEST(SSLTest, EarlyCallbackVersionSwitch) {
  2262. bssl::UniquePtr<X509> cert = GetTestCertificate();
  2263. bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
  2264. bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_method()));
  2265. bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
  2266. ASSERT_TRUE(cert);
  2267. ASSERT_TRUE(key);
  2268. ASSERT_TRUE(server_ctx);
  2269. ASSERT_TRUE(client_ctx);
  2270. ASSERT_TRUE(SSL_CTX_use_certificate(server_ctx.get(), cert.get()));
  2271. ASSERT_TRUE(SSL_CTX_use_PrivateKey(server_ctx.get(), key.get()));
  2272. ASSERT_TRUE(SSL_CTX_set_max_proto_version(client_ctx.get(), TLS1_3_VERSION));
  2273. ASSERT_TRUE(SSL_CTX_set_max_proto_version(server_ctx.get(), TLS1_3_VERSION));
  2274. SSL_CTX_set_select_certificate_cb(
  2275. server_ctx.get(),
  2276. [](const SSL_CLIENT_HELLO *client_hello) -> ssl_select_cert_result_t {
  2277. if (!SSL_set_max_proto_version(client_hello->ssl, TLS1_2_VERSION)) {
  2278. return ssl_select_cert_error;
  2279. }
  2280. return ssl_select_cert_success;
  2281. });
  2282. bssl::UniquePtr<SSL> client, server;
  2283. ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(),
  2284. server_ctx.get()));
  2285. EXPECT_EQ(TLS1_2_VERSION, SSL_version(client.get()));
  2286. }
  2287. TEST(SSLTest, SetVersion) {
  2288. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  2289. ASSERT_TRUE(ctx);
  2290. // Set valid TLS versions.
  2291. EXPECT_TRUE(SSL_CTX_set_max_proto_version(ctx.get(), TLS1_VERSION));
  2292. EXPECT_TRUE(SSL_CTX_set_max_proto_version(ctx.get(), TLS1_1_VERSION));
  2293. EXPECT_TRUE(SSL_CTX_set_min_proto_version(ctx.get(), TLS1_VERSION));
  2294. EXPECT_TRUE(SSL_CTX_set_min_proto_version(ctx.get(), TLS1_1_VERSION));
  2295. // Invalid TLS versions are rejected.
  2296. EXPECT_FALSE(SSL_CTX_set_max_proto_version(ctx.get(), DTLS1_VERSION));
  2297. EXPECT_FALSE(SSL_CTX_set_max_proto_version(ctx.get(), 0x0200));
  2298. EXPECT_FALSE(SSL_CTX_set_max_proto_version(ctx.get(), 0x1234));
  2299. EXPECT_FALSE(SSL_CTX_set_min_proto_version(ctx.get(), DTLS1_VERSION));
  2300. EXPECT_FALSE(SSL_CTX_set_min_proto_version(ctx.get(), 0x0200));
  2301. EXPECT_FALSE(SSL_CTX_set_min_proto_version(ctx.get(), 0x1234));
  2302. // Zero is the default version.
  2303. EXPECT_TRUE(SSL_CTX_set_max_proto_version(ctx.get(), 0));
  2304. EXPECT_EQ(TLS1_2_VERSION, SSL_CTX_get_max_proto_version(ctx.get()));
  2305. EXPECT_TRUE(SSL_CTX_set_min_proto_version(ctx.get(), 0));
  2306. EXPECT_EQ(TLS1_VERSION, SSL_CTX_get_min_proto_version(ctx.get()));
  2307. // TLS 1.3 is available, but not by default.
  2308. EXPECT_TRUE(SSL_CTX_set_max_proto_version(ctx.get(), TLS1_3_VERSION));
  2309. EXPECT_EQ(TLS1_3_VERSION, SSL_CTX_get_max_proto_version(ctx.get()));
  2310. // SSL 3.0 is not available.
  2311. EXPECT_FALSE(SSL_CTX_set_min_proto_version(ctx.get(), SSL3_VERSION));
  2312. ctx.reset(SSL_CTX_new(DTLS_method()));
  2313. ASSERT_TRUE(ctx);
  2314. EXPECT_TRUE(SSL_CTX_set_max_proto_version(ctx.get(), DTLS1_VERSION));
  2315. EXPECT_TRUE(SSL_CTX_set_max_proto_version(ctx.get(), DTLS1_2_VERSION));
  2316. EXPECT_TRUE(SSL_CTX_set_min_proto_version(ctx.get(), DTLS1_VERSION));
  2317. EXPECT_TRUE(SSL_CTX_set_min_proto_version(ctx.get(), DTLS1_2_VERSION));
  2318. EXPECT_FALSE(SSL_CTX_set_max_proto_version(ctx.get(), TLS1_VERSION));
  2319. EXPECT_FALSE(SSL_CTX_set_max_proto_version(ctx.get(), 0xfefe /* DTLS 1.1 */));
  2320. EXPECT_FALSE(SSL_CTX_set_max_proto_version(ctx.get(), 0xfffe /* DTLS 0.1 */));
  2321. EXPECT_FALSE(SSL_CTX_set_max_proto_version(ctx.get(), 0x1234));
  2322. EXPECT_FALSE(SSL_CTX_set_min_proto_version(ctx.get(), TLS1_VERSION));
  2323. EXPECT_FALSE(SSL_CTX_set_min_proto_version(ctx.get(), 0xfefe /* DTLS 1.1 */));
  2324. EXPECT_FALSE(SSL_CTX_set_min_proto_version(ctx.get(), 0xfffe /* DTLS 0.1 */));
  2325. EXPECT_FALSE(SSL_CTX_set_min_proto_version(ctx.get(), 0x1234));
  2326. EXPECT_TRUE(SSL_CTX_set_max_proto_version(ctx.get(), 0));
  2327. EXPECT_EQ(DTLS1_2_VERSION, SSL_CTX_get_max_proto_version(ctx.get()));
  2328. EXPECT_TRUE(SSL_CTX_set_min_proto_version(ctx.get(), 0));
  2329. EXPECT_EQ(DTLS1_VERSION, SSL_CTX_get_min_proto_version(ctx.get()));
  2330. }
  2331. static const char *GetVersionName(uint16_t version) {
  2332. switch (version) {
  2333. case TLS1_VERSION:
  2334. return "TLSv1";
  2335. case TLS1_1_VERSION:
  2336. return "TLSv1.1";
  2337. case TLS1_2_VERSION:
  2338. return "TLSv1.2";
  2339. case TLS1_3_VERSION:
  2340. return "TLSv1.3";
  2341. case DTLS1_VERSION:
  2342. return "DTLSv1";
  2343. case DTLS1_2_VERSION:
  2344. return "DTLSv1.2";
  2345. default:
  2346. return "???";
  2347. }
  2348. }
  2349. TEST_P(SSLVersionTest, Version) {
  2350. ASSERT_TRUE(Connect());
  2351. EXPECT_EQ(SSL_version(client_.get()), version());
  2352. EXPECT_EQ(SSL_version(server_.get()), version());
  2353. // Test the version name is reported as expected.
  2354. const char *version_name = GetVersionName(version());
  2355. EXPECT_EQ(strcmp(version_name, SSL_get_version(client_.get())), 0);
  2356. EXPECT_EQ(strcmp(version_name, SSL_get_version(server_.get())), 0);
  2357. // Test SSL_SESSION reports the same name.
  2358. const char *client_name =
  2359. SSL_SESSION_get_version(SSL_get_session(client_.get()));
  2360. const char *server_name =
  2361. SSL_SESSION_get_version(SSL_get_session(server_.get()));
  2362. EXPECT_EQ(strcmp(version_name, client_name), 0);
  2363. EXPECT_EQ(strcmp(version_name, server_name), 0);
  2364. }
  2365. // Tests that that |SSL_get_pending_cipher| is available during the ALPN
  2366. // selection callback.
  2367. TEST_P(SSLVersionTest, ALPNCipherAvailable) {
  2368. ASSERT_TRUE(UseCertAndKey(client_ctx_.get()));
  2369. static const uint8_t kALPNProtos[] = {0x03, 'f', 'o', 'o'};
  2370. ASSERT_EQ(SSL_CTX_set_alpn_protos(client_ctx_.get(), kALPNProtos,
  2371. sizeof(kALPNProtos)),
  2372. 0);
  2373. // The ALPN callback does not fail the handshake on error, so have the
  2374. // callback write a boolean.
  2375. std::pair<uint16_t, bool> callback_state(version(), false);
  2376. SSL_CTX_set_alpn_select_cb(
  2377. server_ctx_.get(),
  2378. [](SSL *ssl, const uint8_t **out, uint8_t *out_len, const uint8_t *in,
  2379. unsigned in_len, void *arg) -> int {
  2380. auto state = reinterpret_cast<std::pair<uint16_t, bool> *>(arg);
  2381. if (SSL_get_pending_cipher(ssl) != nullptr &&
  2382. SSL_version(ssl) == state->first) {
  2383. state->second = true;
  2384. }
  2385. return SSL_TLSEXT_ERR_NOACK;
  2386. },
  2387. &callback_state);
  2388. ASSERT_TRUE(Connect());
  2389. ASSERT_TRUE(callback_state.second);
  2390. }
  2391. TEST_P(SSLVersionTest, SSLClearSessionResumption) {
  2392. // Skip this for TLS 1.3. TLS 1.3's ticket mechanism is incompatible with this
  2393. // API pattern.
  2394. if (version() == TLS1_3_VERSION) {
  2395. return;
  2396. }
  2397. shed_handshake_config_ = false;
  2398. ASSERT_TRUE(Connect());
  2399. EXPECT_FALSE(SSL_session_reused(client_.get()));
  2400. EXPECT_FALSE(SSL_session_reused(server_.get()));
  2401. // Reset everything.
  2402. ASSERT_TRUE(SSL_clear(client_.get()));
  2403. ASSERT_TRUE(SSL_clear(server_.get()));
  2404. // Attempt to connect a second time.
  2405. ASSERT_TRUE(CompleteHandshakes(client_.get(), server_.get()));
  2406. // |SSL_clear| should implicitly offer the previous session to the server.
  2407. EXPECT_TRUE(SSL_session_reused(client_.get()));
  2408. EXPECT_TRUE(SSL_session_reused(server_.get()));
  2409. }
  2410. TEST_P(SSLVersionTest, SSLClearFailsWithShedding) {
  2411. shed_handshake_config_ = false;
  2412. ASSERT_TRUE(Connect());
  2413. ASSERT_TRUE(CompleteHandshakes(client_.get(), server_.get()));
  2414. // Reset everything.
  2415. ASSERT_TRUE(SSL_clear(client_.get()));
  2416. ASSERT_TRUE(SSL_clear(server_.get()));
  2417. // Now enable shedding, and connect a second time.
  2418. shed_handshake_config_ = true;
  2419. ASSERT_TRUE(Connect());
  2420. ASSERT_TRUE(CompleteHandshakes(client_.get(), server_.get()));
  2421. // |SSL_clear| should now fail.
  2422. ASSERT_FALSE(SSL_clear(client_.get()));
  2423. ASSERT_FALSE(SSL_clear(server_.get()));
  2424. }
  2425. static bool ChainsEqual(STACK_OF(X509) * chain,
  2426. const std::vector<X509 *> &expected) {
  2427. if (sk_X509_num(chain) != expected.size()) {
  2428. return false;
  2429. }
  2430. for (size_t i = 0; i < expected.size(); i++) {
  2431. if (X509_cmp(sk_X509_value(chain, i), expected[i]) != 0) {
  2432. return false;
  2433. }
  2434. }
  2435. return true;
  2436. }
  2437. TEST_P(SSLVersionTest, AutoChain) {
  2438. cert_ = GetChainTestCertificate();
  2439. ASSERT_TRUE(cert_);
  2440. key_ = GetChainTestKey();
  2441. ASSERT_TRUE(key_);
  2442. bssl::UniquePtr<X509> intermediate = GetChainTestIntermediate();
  2443. ASSERT_TRUE(intermediate);
  2444. ASSERT_TRUE(UseCertAndKey(client_ctx_.get()));
  2445. ASSERT_TRUE(UseCertAndKey(server_ctx_.get()));
  2446. // Configure both client and server to accept any certificate. Add
  2447. // |intermediate| to the cert store.
  2448. ASSERT_TRUE(X509_STORE_add_cert(SSL_CTX_get_cert_store(client_ctx_.get()),
  2449. intermediate.get()));
  2450. ASSERT_TRUE(X509_STORE_add_cert(SSL_CTX_get_cert_store(server_ctx_.get()),
  2451. intermediate.get()));
  2452. SSL_CTX_set_verify(client_ctx_.get(),
  2453. SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
  2454. nullptr);
  2455. SSL_CTX_set_verify(server_ctx_.get(),
  2456. SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
  2457. nullptr);
  2458. SSL_CTX_set_cert_verify_callback(client_ctx_.get(), VerifySucceed, NULL);
  2459. SSL_CTX_set_cert_verify_callback(server_ctx_.get(), VerifySucceed, NULL);
  2460. // By default, the client and server should each only send the leaf.
  2461. ASSERT_TRUE(Connect());
  2462. EXPECT_TRUE(
  2463. ChainsEqual(SSL_get_peer_full_cert_chain(client_.get()), {cert_.get()}));
  2464. EXPECT_TRUE(
  2465. ChainsEqual(SSL_get_peer_full_cert_chain(server_.get()), {cert_.get()}));
  2466. // If auto-chaining is enabled, then the intermediate is sent.
  2467. SSL_CTX_clear_mode(client_ctx_.get(), SSL_MODE_NO_AUTO_CHAIN);
  2468. SSL_CTX_clear_mode(server_ctx_.get(), SSL_MODE_NO_AUTO_CHAIN);
  2469. ASSERT_TRUE(Connect());
  2470. EXPECT_TRUE(ChainsEqual(SSL_get_peer_full_cert_chain(client_.get()),
  2471. {cert_.get(), intermediate.get()}));
  2472. EXPECT_TRUE(ChainsEqual(SSL_get_peer_full_cert_chain(server_.get()),
  2473. {cert_.get(), intermediate.get()}));
  2474. // Auto-chaining does not override explicitly-configured intermediates.
  2475. ASSERT_TRUE(SSL_CTX_add1_chain_cert(client_ctx_.get(), cert_.get()));
  2476. ASSERT_TRUE(SSL_CTX_add1_chain_cert(server_ctx_.get(), cert_.get()));
  2477. ASSERT_TRUE(Connect());
  2478. EXPECT_TRUE(ChainsEqual(SSL_get_peer_full_cert_chain(client_.get()),
  2479. {cert_.get(), cert_.get()}));
  2480. EXPECT_TRUE(ChainsEqual(SSL_get_peer_full_cert_chain(server_.get()),
  2481. {cert_.get(), cert_.get()}));
  2482. }
  2483. static bool ExpectBadWriteRetry() {
  2484. int err = ERR_get_error();
  2485. if (ERR_GET_LIB(err) != ERR_LIB_SSL ||
  2486. ERR_GET_REASON(err) != SSL_R_BAD_WRITE_RETRY) {
  2487. char buf[ERR_ERROR_STRING_BUF_LEN];
  2488. ERR_error_string_n(err, buf, sizeof(buf));
  2489. fprintf(stderr, "Wanted SSL_R_BAD_WRITE_RETRY, got: %s.\n", buf);
  2490. return false;
  2491. }
  2492. if (ERR_peek_error() != 0) {
  2493. fprintf(stderr, "Unexpected error following SSL_R_BAD_WRITE_RETRY.\n");
  2494. return false;
  2495. }
  2496. return true;
  2497. }
  2498. TEST_P(SSLVersionTest, SSLWriteRetry) {
  2499. if (is_dtls()) {
  2500. return;
  2501. }
  2502. for (bool enable_partial_write : {false, true}) {
  2503. SCOPED_TRACE(enable_partial_write);
  2504. // Connect a client and server.
  2505. ASSERT_TRUE(UseCertAndKey(client_ctx_.get()));
  2506. ASSERT_TRUE(Connect());
  2507. if (enable_partial_write) {
  2508. SSL_set_mode(client_.get(), SSL_MODE_ENABLE_PARTIAL_WRITE);
  2509. }
  2510. // Write without reading until the buffer is full and we have an unfinished
  2511. // write. Keep a count so we may reread it again later. "hello!" will be
  2512. // written in two chunks, "hello" and "!".
  2513. char data[] = "hello!";
  2514. static const int kChunkLen = 5; // The length of "hello".
  2515. unsigned count = 0;
  2516. for (;;) {
  2517. int ret = SSL_write(client_.get(), data, kChunkLen);
  2518. if (ret <= 0) {
  2519. ASSERT_EQ(SSL_get_error(client_.get(), ret), SSL_ERROR_WANT_WRITE);
  2520. break;
  2521. }
  2522. ASSERT_EQ(ret, 5);
  2523. count++;
  2524. }
  2525. // Retrying with the same parameters is legal.
  2526. ASSERT_EQ(
  2527. SSL_get_error(client_.get(), SSL_write(client_.get(), data, kChunkLen)),
  2528. SSL_ERROR_WANT_WRITE);
  2529. // Retrying with the same buffer but shorter length is not legal.
  2530. ASSERT_EQ(SSL_get_error(client_.get(),
  2531. SSL_write(client_.get(), data, kChunkLen - 1)),
  2532. SSL_ERROR_SSL);
  2533. ASSERT_TRUE(ExpectBadWriteRetry());
  2534. // Retrying with a different buffer pointer is not legal.
  2535. char data2[] = "hello";
  2536. ASSERT_EQ(SSL_get_error(client_.get(),
  2537. SSL_write(client_.get(), data2, kChunkLen)),
  2538. SSL_ERROR_SSL);
  2539. ASSERT_TRUE(ExpectBadWriteRetry());
  2540. // With |SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER|, the buffer may move.
  2541. SSL_set_mode(client_.get(), SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
  2542. ASSERT_EQ(SSL_get_error(client_.get(),
  2543. SSL_write(client_.get(), data2, kChunkLen)),
  2544. SSL_ERROR_WANT_WRITE);
  2545. // |SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER| does not disable length checks.
  2546. ASSERT_EQ(SSL_get_error(client_.get(),
  2547. SSL_write(client_.get(), data2, kChunkLen - 1)),
  2548. SSL_ERROR_SSL);
  2549. ASSERT_TRUE(ExpectBadWriteRetry());
  2550. // Retrying with a larger buffer is legal.
  2551. ASSERT_EQ(SSL_get_error(client_.get(),
  2552. SSL_write(client_.get(), data, kChunkLen + 1)),
  2553. SSL_ERROR_WANT_WRITE);
  2554. // Drain the buffer.
  2555. char buf[20];
  2556. for (unsigned i = 0; i < count; i++) {
  2557. ASSERT_EQ(SSL_read(server_.get(), buf, sizeof(buf)), kChunkLen);
  2558. ASSERT_EQ(OPENSSL_memcmp(buf, "hello", kChunkLen), 0);
  2559. }
  2560. // Now that there is space, a retry with a larger buffer should flush the
  2561. // pending record, skip over that many bytes of input (on assumption they
  2562. // are the same), and write the remainder. If SSL_MODE_ENABLE_PARTIAL_WRITE
  2563. // is set, this will complete in two steps.
  2564. char data3[] = "_____!";
  2565. if (enable_partial_write) {
  2566. ASSERT_EQ(SSL_write(client_.get(), data3, kChunkLen + 1), kChunkLen);
  2567. ASSERT_EQ(SSL_write(client_.get(), data3 + kChunkLen, 1), 1);
  2568. } else {
  2569. ASSERT_EQ(SSL_write(client_.get(), data3, kChunkLen + 1), kChunkLen + 1);
  2570. }
  2571. // Check the last write was correct. The data will be spread over two
  2572. // records, so SSL_read returns twice.
  2573. ASSERT_EQ(SSL_read(server_.get(), buf, sizeof(buf)), kChunkLen);
  2574. ASSERT_EQ(OPENSSL_memcmp(buf, "hello", kChunkLen), 0);
  2575. ASSERT_EQ(SSL_read(server_.get(), buf, sizeof(buf)), 1);
  2576. ASSERT_EQ(buf[0], '!');
  2577. }
  2578. }
  2579. TEST_P(SSLVersionTest, RecordCallback) {
  2580. for (bool test_server : {true, false}) {
  2581. SCOPED_TRACE(test_server);
  2582. ResetContexts();
  2583. bool read_seen = false;
  2584. bool write_seen = false;
  2585. auto cb = [&](int is_write, int cb_version, int cb_type, const void *buf,
  2586. size_t len, SSL *ssl) {
  2587. if (cb_type != SSL3_RT_HEADER) {
  2588. return;
  2589. }
  2590. // The callback does not report a version for records.
  2591. EXPECT_EQ(0, cb_version);
  2592. if (is_write) {
  2593. write_seen = true;
  2594. } else {
  2595. read_seen = true;
  2596. }
  2597. // Sanity-check that the record header is plausible.
  2598. CBS cbs;
  2599. CBS_init(&cbs, reinterpret_cast<const uint8_t *>(buf), len);
  2600. uint8_t type;
  2601. uint16_t record_version, length;
  2602. ASSERT_TRUE(CBS_get_u8(&cbs, &type));
  2603. ASSERT_TRUE(CBS_get_u16(&cbs, &record_version));
  2604. EXPECT_EQ(record_version & 0xff00, version() & 0xff00);
  2605. if (is_dtls()) {
  2606. uint16_t epoch;
  2607. ASSERT_TRUE(CBS_get_u16(&cbs, &epoch));
  2608. EXPECT_TRUE(epoch == 0 || epoch == 1) << "Invalid epoch: " << epoch;
  2609. ASSERT_TRUE(CBS_skip(&cbs, 6));
  2610. }
  2611. ASSERT_TRUE(CBS_get_u16(&cbs, &length));
  2612. EXPECT_EQ(0u, CBS_len(&cbs));
  2613. };
  2614. using CallbackType = decltype(cb);
  2615. SSL_CTX *ctx = test_server ? server_ctx_.get() : client_ctx_.get();
  2616. SSL_CTX_set_msg_callback(
  2617. ctx, [](int is_write, int cb_version, int cb_type, const void *buf,
  2618. size_t len, SSL *ssl, void *arg) {
  2619. CallbackType *cb_ptr = reinterpret_cast<CallbackType *>(arg);
  2620. (*cb_ptr)(is_write, cb_version, cb_type, buf, len, ssl);
  2621. });
  2622. SSL_CTX_set_msg_callback_arg(ctx, &cb);
  2623. ASSERT_TRUE(Connect());
  2624. EXPECT_TRUE(read_seen);
  2625. EXPECT_TRUE(write_seen);
  2626. }
  2627. }
  2628. TEST_P(SSLVersionTest, GetServerName) {
  2629. ClientConfig config;
  2630. config.servername = "host1";
  2631. SSL_CTX_set_tlsext_servername_callback(
  2632. server_ctx_.get(), [](SSL *ssl, int *out_alert, void *arg) -> int {
  2633. // During the handshake, |SSL_get_servername| must match |config|.
  2634. ClientConfig *config_p = reinterpret_cast<ClientConfig *>(arg);
  2635. EXPECT_STREQ(config_p->servername.c_str(),
  2636. SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name));
  2637. return SSL_TLSEXT_ERR_OK;
  2638. });
  2639. SSL_CTX_set_tlsext_servername_arg(server_ctx_.get(), &config);
  2640. ASSERT_TRUE(Connect(config));
  2641. // After the handshake, it must also be available.
  2642. EXPECT_STREQ(config.servername.c_str(),
  2643. SSL_get_servername(server_.get(), TLSEXT_NAMETYPE_host_name));
  2644. // Establish a session under host1.
  2645. SSL_CTX_set_session_cache_mode(client_ctx_.get(), SSL_SESS_CACHE_BOTH);
  2646. SSL_CTX_set_session_cache_mode(server_ctx_.get(), SSL_SESS_CACHE_BOTH);
  2647. bssl::UniquePtr<SSL_SESSION> session =
  2648. CreateClientSession(client_ctx_.get(), server_ctx_.get(), config);
  2649. // If the client resumes a session with a different name, |SSL_get_servername|
  2650. // must return the new name.
  2651. ASSERT_TRUE(session);
  2652. config.session = session.get();
  2653. config.servername = "host2";
  2654. ASSERT_TRUE(Connect(config));
  2655. EXPECT_STREQ(config.servername.c_str(),
  2656. SSL_get_servername(server_.get(), TLSEXT_NAMETYPE_host_name));
  2657. }
  2658. // Test that session cache mode bits are honored in the client session callback.
  2659. TEST_P(SSLVersionTest, ClientSessionCacheMode) {
  2660. SSL_CTX_set_session_cache_mode(client_ctx_.get(), SSL_SESS_CACHE_OFF);
  2661. EXPECT_FALSE(CreateClientSession(client_ctx_.get(), server_ctx_.get()));
  2662. SSL_CTX_set_session_cache_mode(client_ctx_.get(), SSL_SESS_CACHE_CLIENT);
  2663. EXPECT_TRUE(CreateClientSession(client_ctx_.get(), server_ctx_.get()));
  2664. SSL_CTX_set_session_cache_mode(client_ctx_.get(), SSL_SESS_CACHE_SERVER);
  2665. EXPECT_FALSE(CreateClientSession(client_ctx_.get(), server_ctx_.get()));
  2666. }
  2667. // Test that all versions survive tiny write buffers. In particular, TLS 1.3
  2668. // NewSessionTickets are written post-handshake. Servers that block
  2669. // |SSL_do_handshake| on writing them will deadlock if clients are not draining
  2670. // the buffer. Test that we do not do this.
  2671. TEST_P(SSLVersionTest, SmallBuffer) {
  2672. // DTLS is a datagram protocol and requires packet-sized buffers.
  2673. if (is_dtls()) {
  2674. return;
  2675. }
  2676. // Test both flushing NewSessionTickets with a zero-sized write and
  2677. // non-zero-sized write.
  2678. for (bool use_zero_write : {false, true}) {
  2679. SCOPED_TRACE(use_zero_write);
  2680. g_last_session = nullptr;
  2681. SSL_CTX_set_session_cache_mode(client_ctx_.get(), SSL_SESS_CACHE_BOTH);
  2682. SSL_CTX_sess_set_new_cb(client_ctx_.get(), SaveLastSession);
  2683. bssl::UniquePtr<SSL> client(SSL_new(client_ctx_.get())),
  2684. server(SSL_new(server_ctx_.get()));
  2685. ASSERT_TRUE(client);
  2686. ASSERT_TRUE(server);
  2687. SSL_set_connect_state(client.get());
  2688. SSL_set_accept_state(server.get());
  2689. // Use a tiny buffer.
  2690. BIO *bio1, *bio2;
  2691. ASSERT_TRUE(BIO_new_bio_pair(&bio1, 1, &bio2, 1));
  2692. // SSL_set_bio takes ownership.
  2693. SSL_set_bio(client.get(), bio1, bio1);
  2694. SSL_set_bio(server.get(), bio2, bio2);
  2695. ASSERT_TRUE(CompleteHandshakes(client.get(), server.get()));
  2696. if (version() >= TLS1_3_VERSION) {
  2697. // The post-handshake ticket should not have been processed yet.
  2698. EXPECT_FALSE(g_last_session);
  2699. }
  2700. if (use_zero_write) {
  2701. ASSERT_TRUE(FlushNewSessionTickets(client.get(), server.get()));
  2702. EXPECT_TRUE(g_last_session);
  2703. }
  2704. // Send some data from server to client. If |use_zero_write| is false, this
  2705. // will also flush the NewSessionTickets.
  2706. static const char kMessage[] = "hello world";
  2707. char buf[sizeof(kMessage)];
  2708. for (;;) {
  2709. int server_ret = SSL_write(server.get(), kMessage, sizeof(kMessage));
  2710. int server_err = SSL_get_error(server.get(), server_ret);
  2711. int client_ret = SSL_read(client.get(), buf, sizeof(buf));
  2712. int client_err = SSL_get_error(client.get(), client_ret);
  2713. // The server will write a single record, so every iteration should see
  2714. // |SSL_ERROR_WANT_WRITE| and |SSL_ERROR_WANT_READ|, until the final
  2715. // iteration, where both will complete.
  2716. if (server_ret > 0) {
  2717. EXPECT_EQ(server_ret, static_cast<int>(sizeof(kMessage)));
  2718. EXPECT_EQ(client_ret, static_cast<int>(sizeof(kMessage)));
  2719. EXPECT_EQ(Bytes(buf), Bytes(kMessage));
  2720. break;
  2721. }
  2722. ASSERT_EQ(server_ret, -1);
  2723. ASSERT_EQ(server_err, SSL_ERROR_WANT_WRITE);
  2724. ASSERT_EQ(client_ret, -1);
  2725. ASSERT_EQ(client_err, SSL_ERROR_WANT_READ);
  2726. }
  2727. // The NewSessionTickets should have been flushed and processed.
  2728. EXPECT_TRUE(g_last_session);
  2729. }
  2730. }
  2731. TEST(SSLTest, AddChainCertHack) {
  2732. // Ensure that we don't accidently break the hack that we have in place to
  2733. // keep curl and serf happy when they use an |X509| even after transfering
  2734. // ownership.
  2735. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  2736. ASSERT_TRUE(ctx);
  2737. X509 *cert = GetTestCertificate().release();
  2738. ASSERT_TRUE(cert);
  2739. SSL_CTX_add0_chain_cert(ctx.get(), cert);
  2740. // This should not trigger a use-after-free.
  2741. X509_cmp(cert, cert);
  2742. }
  2743. TEST(SSLTest, GetCertificate) {
  2744. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  2745. ASSERT_TRUE(ctx);
  2746. bssl::UniquePtr<X509> cert = GetTestCertificate();
  2747. ASSERT_TRUE(cert);
  2748. ASSERT_TRUE(SSL_CTX_use_certificate(ctx.get(), cert.get()));
  2749. bssl::UniquePtr<SSL> ssl(SSL_new(ctx.get()));
  2750. ASSERT_TRUE(ssl);
  2751. X509 *cert2 = SSL_CTX_get0_certificate(ctx.get());
  2752. ASSERT_TRUE(cert2);
  2753. X509 *cert3 = SSL_get_certificate(ssl.get());
  2754. ASSERT_TRUE(cert3);
  2755. // The old and new certificates must be identical.
  2756. EXPECT_EQ(0, X509_cmp(cert.get(), cert2));
  2757. EXPECT_EQ(0, X509_cmp(cert.get(), cert3));
  2758. uint8_t *der = nullptr;
  2759. long der_len = i2d_X509(cert.get(), &der);
  2760. ASSERT_LT(0, der_len);
  2761. bssl::UniquePtr<uint8_t> free_der(der);
  2762. uint8_t *der2 = nullptr;
  2763. long der2_len = i2d_X509(cert2, &der2);
  2764. ASSERT_LT(0, der2_len);
  2765. bssl::UniquePtr<uint8_t> free_der2(der2);
  2766. uint8_t *der3 = nullptr;
  2767. long der3_len = i2d_X509(cert3, &der3);
  2768. ASSERT_LT(0, der3_len);
  2769. bssl::UniquePtr<uint8_t> free_der3(der3);
  2770. // They must also encode identically.
  2771. EXPECT_EQ(Bytes(der, der_len), Bytes(der2, der2_len));
  2772. EXPECT_EQ(Bytes(der, der_len), Bytes(der3, der3_len));
  2773. }
  2774. TEST(SSLTest, SetChainAndKeyMismatch) {
  2775. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_with_buffers_method()));
  2776. ASSERT_TRUE(ctx);
  2777. bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
  2778. ASSERT_TRUE(key);
  2779. bssl::UniquePtr<CRYPTO_BUFFER> leaf = GetChainTestCertificateBuffer();
  2780. ASSERT_TRUE(leaf);
  2781. std::vector<CRYPTO_BUFFER*> chain = {
  2782. leaf.get(),
  2783. };
  2784. // Should fail because |GetTestKey| doesn't match the chain-test certificate.
  2785. ASSERT_FALSE(SSL_CTX_set_chain_and_key(ctx.get(), &chain[0], chain.size(),
  2786. key.get(), nullptr));
  2787. ERR_clear_error();
  2788. }
  2789. TEST(SSLTest, SetChainAndKey) {
  2790. bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_with_buffers_method()));
  2791. ASSERT_TRUE(client_ctx);
  2792. bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_with_buffers_method()));
  2793. ASSERT_TRUE(server_ctx);
  2794. bssl::UniquePtr<EVP_PKEY> key = GetChainTestKey();
  2795. ASSERT_TRUE(key);
  2796. bssl::UniquePtr<CRYPTO_BUFFER> leaf = GetChainTestCertificateBuffer();
  2797. ASSERT_TRUE(leaf);
  2798. bssl::UniquePtr<CRYPTO_BUFFER> intermediate =
  2799. GetChainTestIntermediateBuffer();
  2800. ASSERT_TRUE(intermediate);
  2801. std::vector<CRYPTO_BUFFER*> chain = {
  2802. leaf.get(), intermediate.get(),
  2803. };
  2804. ASSERT_TRUE(SSL_CTX_set_chain_and_key(server_ctx.get(), &chain[0],
  2805. chain.size(), key.get(), nullptr));
  2806. SSL_CTX_set_custom_verify(
  2807. client_ctx.get(), SSL_VERIFY_PEER,
  2808. [](SSL *ssl, uint8_t *out_alert) -> ssl_verify_result_t {
  2809. return ssl_verify_ok;
  2810. });
  2811. bssl::UniquePtr<SSL> client, server;
  2812. ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(),
  2813. server_ctx.get()));
  2814. }
  2815. TEST(SSLTest, BuffersFailWithoutCustomVerify) {
  2816. bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_with_buffers_method()));
  2817. ASSERT_TRUE(client_ctx);
  2818. bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_with_buffers_method()));
  2819. ASSERT_TRUE(server_ctx);
  2820. bssl::UniquePtr<EVP_PKEY> key = GetChainTestKey();
  2821. ASSERT_TRUE(key);
  2822. bssl::UniquePtr<CRYPTO_BUFFER> leaf = GetChainTestCertificateBuffer();
  2823. ASSERT_TRUE(leaf);
  2824. std::vector<CRYPTO_BUFFER*> chain = { leaf.get() };
  2825. ASSERT_TRUE(SSL_CTX_set_chain_and_key(server_ctx.get(), &chain[0],
  2826. chain.size(), key.get(), nullptr));
  2827. // Without SSL_CTX_set_custom_verify(), i.e. with everything in the default
  2828. // configuration, certificate verification should fail.
  2829. bssl::UniquePtr<SSL> client, server;
  2830. ASSERT_FALSE(ConnectClientAndServer(&client, &server, client_ctx.get(),
  2831. server_ctx.get()));
  2832. // Whereas with a verifier, the connection should succeed.
  2833. SSL_CTX_set_custom_verify(
  2834. client_ctx.get(), SSL_VERIFY_PEER,
  2835. [](SSL *ssl, uint8_t *out_alert) -> ssl_verify_result_t {
  2836. return ssl_verify_ok;
  2837. });
  2838. ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(),
  2839. server_ctx.get()));
  2840. }
  2841. TEST(SSLTest, CustomVerify) {
  2842. bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_with_buffers_method()));
  2843. ASSERT_TRUE(client_ctx);
  2844. bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_with_buffers_method()));
  2845. ASSERT_TRUE(server_ctx);
  2846. bssl::UniquePtr<EVP_PKEY> key = GetChainTestKey();
  2847. ASSERT_TRUE(key);
  2848. bssl::UniquePtr<CRYPTO_BUFFER> leaf = GetChainTestCertificateBuffer();
  2849. ASSERT_TRUE(leaf);
  2850. std::vector<CRYPTO_BUFFER*> chain = { leaf.get() };
  2851. ASSERT_TRUE(SSL_CTX_set_chain_and_key(server_ctx.get(), &chain[0],
  2852. chain.size(), key.get(), nullptr));
  2853. SSL_CTX_set_custom_verify(
  2854. client_ctx.get(), SSL_VERIFY_PEER,
  2855. [](SSL *ssl, uint8_t *out_alert) -> ssl_verify_result_t {
  2856. return ssl_verify_ok;
  2857. });
  2858. bssl::UniquePtr<SSL> client, server;
  2859. ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(),
  2860. server_ctx.get()));
  2861. // With SSL_VERIFY_PEER, ssl_verify_invalid should result in a dropped
  2862. // connection.
  2863. SSL_CTX_set_custom_verify(
  2864. client_ctx.get(), SSL_VERIFY_PEER,
  2865. [](SSL *ssl, uint8_t *out_alert) -> ssl_verify_result_t {
  2866. return ssl_verify_invalid;
  2867. });
  2868. ASSERT_FALSE(ConnectClientAndServer(&client, &server, client_ctx.get(),
  2869. server_ctx.get()));
  2870. // But with SSL_VERIFY_NONE, ssl_verify_invalid should not cause a dropped
  2871. // connection.
  2872. SSL_CTX_set_custom_verify(
  2873. client_ctx.get(), SSL_VERIFY_NONE,
  2874. [](SSL *ssl, uint8_t *out_alert) -> ssl_verify_result_t {
  2875. return ssl_verify_invalid;
  2876. });
  2877. ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(),
  2878. server_ctx.get()));
  2879. }
  2880. TEST(SSLTest, ClientCABuffers) {
  2881. bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_with_buffers_method()));
  2882. ASSERT_TRUE(client_ctx);
  2883. bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_with_buffers_method()));
  2884. ASSERT_TRUE(server_ctx);
  2885. bssl::UniquePtr<EVP_PKEY> key = GetChainTestKey();
  2886. ASSERT_TRUE(key);
  2887. bssl::UniquePtr<CRYPTO_BUFFER> leaf = GetChainTestCertificateBuffer();
  2888. ASSERT_TRUE(leaf);
  2889. bssl::UniquePtr<CRYPTO_BUFFER> intermediate =
  2890. GetChainTestIntermediateBuffer();
  2891. ASSERT_TRUE(intermediate);
  2892. std::vector<CRYPTO_BUFFER *> chain = {
  2893. leaf.get(),
  2894. intermediate.get(),
  2895. };
  2896. ASSERT_TRUE(SSL_CTX_set_chain_and_key(server_ctx.get(), &chain[0],
  2897. chain.size(), key.get(), nullptr));
  2898. bssl::UniquePtr<CRYPTO_BUFFER> ca_name(
  2899. CRYPTO_BUFFER_new(kTestName, sizeof(kTestName), nullptr));
  2900. ASSERT_TRUE(ca_name);
  2901. bssl::UniquePtr<STACK_OF(CRYPTO_BUFFER)> ca_names(
  2902. sk_CRYPTO_BUFFER_new_null());
  2903. ASSERT_TRUE(ca_names);
  2904. ASSERT_TRUE(PushToStack(ca_names.get(), std::move(ca_name)));
  2905. SSL_CTX_set0_client_CAs(server_ctx.get(), ca_names.release());
  2906. // Configure client and server to accept all certificates.
  2907. SSL_CTX_set_custom_verify(
  2908. client_ctx.get(), SSL_VERIFY_PEER,
  2909. [](SSL *ssl, uint8_t *out_alert) -> ssl_verify_result_t {
  2910. return ssl_verify_ok;
  2911. });
  2912. SSL_CTX_set_custom_verify(
  2913. server_ctx.get(), SSL_VERIFY_PEER,
  2914. [](SSL *ssl, uint8_t *out_alert) -> ssl_verify_result_t {
  2915. return ssl_verify_ok;
  2916. });
  2917. bool cert_cb_called = false;
  2918. SSL_CTX_set_cert_cb(
  2919. client_ctx.get(),
  2920. [](SSL *ssl, void *arg) -> int {
  2921. const STACK_OF(CRYPTO_BUFFER) *peer_names =
  2922. SSL_get0_server_requested_CAs(ssl);
  2923. EXPECT_EQ(1u, sk_CRYPTO_BUFFER_num(peer_names));
  2924. CRYPTO_BUFFER *peer_name = sk_CRYPTO_BUFFER_value(peer_names, 0);
  2925. EXPECT_EQ(Bytes(kTestName), Bytes(CRYPTO_BUFFER_data(peer_name),
  2926. CRYPTO_BUFFER_len(peer_name)));
  2927. *reinterpret_cast<bool *>(arg) = true;
  2928. return 1;
  2929. },
  2930. &cert_cb_called);
  2931. bssl::UniquePtr<SSL> client, server;
  2932. ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(),
  2933. server_ctx.get()));
  2934. EXPECT_TRUE(cert_cb_called);
  2935. }
  2936. // Configuring the empty cipher list, though an error, should still modify the
  2937. // configuration.
  2938. TEST(SSLTest, EmptyCipherList) {
  2939. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  2940. ASSERT_TRUE(ctx);
  2941. // Initially, the cipher list is not empty.
  2942. EXPECT_NE(0u, sk_SSL_CIPHER_num(SSL_CTX_get_ciphers(ctx.get())));
  2943. // Configuring the empty cipher list fails.
  2944. EXPECT_FALSE(SSL_CTX_set_cipher_list(ctx.get(), ""));
  2945. ERR_clear_error();
  2946. // But the cipher list is still updated to empty.
  2947. EXPECT_EQ(0u, sk_SSL_CIPHER_num(SSL_CTX_get_ciphers(ctx.get())));
  2948. }
  2949. // ssl_test_ticket_aead_failure_mode enumerates the possible ways in which the
  2950. // test |SSL_TICKET_AEAD_METHOD| can fail.
  2951. enum ssl_test_ticket_aead_failure_mode {
  2952. ssl_test_ticket_aead_ok = 0,
  2953. ssl_test_ticket_aead_seal_fail,
  2954. ssl_test_ticket_aead_open_soft_fail,
  2955. ssl_test_ticket_aead_open_hard_fail,
  2956. };
  2957. struct ssl_test_ticket_aead_state {
  2958. unsigned retry_count;
  2959. ssl_test_ticket_aead_failure_mode failure_mode;
  2960. };
  2961. static int ssl_test_ticket_aead_ex_index_dup(CRYPTO_EX_DATA *to,
  2962. const CRYPTO_EX_DATA *from,
  2963. void **from_d, int index,
  2964. long argl, void *argp) {
  2965. abort();
  2966. }
  2967. static void ssl_test_ticket_aead_ex_index_free(void *parent, void *ptr,
  2968. CRYPTO_EX_DATA *ad, int index,
  2969. long argl, void *argp) {
  2970. auto state = reinterpret_cast<ssl_test_ticket_aead_state*>(ptr);
  2971. if (state == nullptr) {
  2972. return;
  2973. }
  2974. OPENSSL_free(state);
  2975. }
  2976. static CRYPTO_once_t g_ssl_test_ticket_aead_ex_index_once = CRYPTO_ONCE_INIT;
  2977. static int g_ssl_test_ticket_aead_ex_index;
  2978. static int ssl_test_ticket_aead_get_ex_index() {
  2979. CRYPTO_once(&g_ssl_test_ticket_aead_ex_index_once, [] {
  2980. g_ssl_test_ticket_aead_ex_index = SSL_get_ex_new_index(
  2981. 0, nullptr, nullptr, ssl_test_ticket_aead_ex_index_dup,
  2982. ssl_test_ticket_aead_ex_index_free);
  2983. });
  2984. return g_ssl_test_ticket_aead_ex_index;
  2985. }
  2986. static size_t ssl_test_ticket_aead_max_overhead(SSL *ssl) {
  2987. return 1;
  2988. }
  2989. static int ssl_test_ticket_aead_seal(SSL *ssl, uint8_t *out, size_t *out_len,
  2990. size_t max_out_len, const uint8_t *in,
  2991. size_t in_len) {
  2992. auto state = reinterpret_cast<ssl_test_ticket_aead_state *>(
  2993. SSL_get_ex_data(ssl, ssl_test_ticket_aead_get_ex_index()));
  2994. if (state->failure_mode == ssl_test_ticket_aead_seal_fail ||
  2995. max_out_len < in_len + 1) {
  2996. return 0;
  2997. }
  2998. OPENSSL_memmove(out, in, in_len);
  2999. out[in_len] = 0xff;
  3000. *out_len = in_len + 1;
  3001. return 1;
  3002. }
  3003. static ssl_ticket_aead_result_t ssl_test_ticket_aead_open(
  3004. SSL *ssl, uint8_t *out, size_t *out_len, size_t max_out_len,
  3005. const uint8_t *in, size_t in_len) {
  3006. auto state = reinterpret_cast<ssl_test_ticket_aead_state *>(
  3007. SSL_get_ex_data(ssl, ssl_test_ticket_aead_get_ex_index()));
  3008. if (state->retry_count > 0) {
  3009. state->retry_count--;
  3010. return ssl_ticket_aead_retry;
  3011. }
  3012. switch (state->failure_mode) {
  3013. case ssl_test_ticket_aead_ok:
  3014. break;
  3015. case ssl_test_ticket_aead_seal_fail:
  3016. // If |seal| failed then there shouldn't be any ticket to try and
  3017. // decrypt.
  3018. abort();
  3019. break;
  3020. case ssl_test_ticket_aead_open_soft_fail:
  3021. return ssl_ticket_aead_ignore_ticket;
  3022. case ssl_test_ticket_aead_open_hard_fail:
  3023. return ssl_ticket_aead_error;
  3024. }
  3025. if (in_len == 0 || in[in_len - 1] != 0xff) {
  3026. return ssl_ticket_aead_ignore_ticket;
  3027. }
  3028. if (max_out_len < in_len - 1) {
  3029. return ssl_ticket_aead_error;
  3030. }
  3031. OPENSSL_memmove(out, in, in_len - 1);
  3032. *out_len = in_len - 1;
  3033. return ssl_ticket_aead_success;
  3034. }
  3035. static const SSL_TICKET_AEAD_METHOD kSSLTestTicketMethod = {
  3036. ssl_test_ticket_aead_max_overhead,
  3037. ssl_test_ticket_aead_seal,
  3038. ssl_test_ticket_aead_open,
  3039. };
  3040. static void ConnectClientAndServerWithTicketMethod(
  3041. bssl::UniquePtr<SSL> *out_client, bssl::UniquePtr<SSL> *out_server,
  3042. SSL_CTX *client_ctx, SSL_CTX *server_ctx, unsigned retry_count,
  3043. ssl_test_ticket_aead_failure_mode failure_mode, SSL_SESSION *session) {
  3044. bssl::UniquePtr<SSL> client(SSL_new(client_ctx)), server(SSL_new(server_ctx));
  3045. ASSERT_TRUE(client);
  3046. ASSERT_TRUE(server);
  3047. SSL_set_connect_state(client.get());
  3048. SSL_set_accept_state(server.get());
  3049. auto state = reinterpret_cast<ssl_test_ticket_aead_state *>(
  3050. OPENSSL_malloc(sizeof(ssl_test_ticket_aead_state)));
  3051. ASSERT_TRUE(state);
  3052. OPENSSL_memset(state, 0, sizeof(ssl_test_ticket_aead_state));
  3053. state->retry_count = retry_count;
  3054. state->failure_mode = failure_mode;
  3055. ASSERT_TRUE(SSL_set_ex_data(server.get(), ssl_test_ticket_aead_get_ex_index(),
  3056. state));
  3057. SSL_set_session(client.get(), session);
  3058. BIO *bio1, *bio2;
  3059. ASSERT_TRUE(BIO_new_bio_pair(&bio1, 0, &bio2, 0));
  3060. // SSL_set_bio takes ownership.
  3061. SSL_set_bio(client.get(), bio1, bio1);
  3062. SSL_set_bio(server.get(), bio2, bio2);
  3063. if (CompleteHandshakes(client.get(), server.get())) {
  3064. *out_client = std::move(client);
  3065. *out_server = std::move(server);
  3066. } else {
  3067. out_client->reset();
  3068. out_server->reset();
  3069. }
  3070. }
  3071. using TicketAEADMethodParam =
  3072. testing::tuple<uint16_t, unsigned, ssl_test_ticket_aead_failure_mode>;
  3073. class TicketAEADMethodTest
  3074. : public ::testing::TestWithParam<TicketAEADMethodParam> {};
  3075. TEST_P(TicketAEADMethodTest, Resume) {
  3076. bssl::UniquePtr<X509> cert = GetTestCertificate();
  3077. ASSERT_TRUE(cert);
  3078. bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
  3079. ASSERT_TRUE(key);
  3080. bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_method()));
  3081. ASSERT_TRUE(server_ctx);
  3082. bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
  3083. ASSERT_TRUE(client_ctx);
  3084. const uint16_t version = testing::get<0>(GetParam());
  3085. const unsigned retry_count = testing::get<1>(GetParam());
  3086. const ssl_test_ticket_aead_failure_mode failure_mode =
  3087. testing::get<2>(GetParam());
  3088. ASSERT_TRUE(SSL_CTX_use_certificate(server_ctx.get(), cert.get()));
  3089. ASSERT_TRUE(SSL_CTX_use_PrivateKey(server_ctx.get(), key.get()));
  3090. ASSERT_TRUE(SSL_CTX_set_min_proto_version(client_ctx.get(), version));
  3091. ASSERT_TRUE(SSL_CTX_set_max_proto_version(client_ctx.get(), version));
  3092. ASSERT_TRUE(SSL_CTX_set_min_proto_version(server_ctx.get(), version));
  3093. ASSERT_TRUE(SSL_CTX_set_max_proto_version(server_ctx.get(), version));
  3094. SSL_CTX_set_session_cache_mode(client_ctx.get(), SSL_SESS_CACHE_BOTH);
  3095. SSL_CTX_set_session_cache_mode(server_ctx.get(), SSL_SESS_CACHE_BOTH);
  3096. SSL_CTX_set_current_time_cb(client_ctx.get(), FrozenTimeCallback);
  3097. SSL_CTX_set_current_time_cb(server_ctx.get(), FrozenTimeCallback);
  3098. SSL_CTX_sess_set_new_cb(client_ctx.get(), SaveLastSession);
  3099. SSL_CTX_set_ticket_aead_method(server_ctx.get(), &kSSLTestTicketMethod);
  3100. bssl::UniquePtr<SSL> client, server;
  3101. ConnectClientAndServerWithTicketMethod(&client, &server, client_ctx.get(),
  3102. server_ctx.get(), retry_count,
  3103. failure_mode, nullptr);
  3104. switch (failure_mode) {
  3105. case ssl_test_ticket_aead_ok:
  3106. case ssl_test_ticket_aead_open_hard_fail:
  3107. case ssl_test_ticket_aead_open_soft_fail:
  3108. ASSERT_TRUE(client);
  3109. break;
  3110. case ssl_test_ticket_aead_seal_fail:
  3111. EXPECT_FALSE(client);
  3112. return;
  3113. }
  3114. EXPECT_FALSE(SSL_session_reused(client.get()));
  3115. EXPECT_FALSE(SSL_session_reused(server.get()));
  3116. ASSERT_TRUE(FlushNewSessionTickets(client.get(), server.get()));
  3117. bssl::UniquePtr<SSL_SESSION> session = std::move(g_last_session);
  3118. ConnectClientAndServerWithTicketMethod(&client, &server, client_ctx.get(),
  3119. server_ctx.get(), retry_count,
  3120. failure_mode, session.get());
  3121. switch (failure_mode) {
  3122. case ssl_test_ticket_aead_ok:
  3123. ASSERT_TRUE(client);
  3124. EXPECT_TRUE(SSL_session_reused(client.get()));
  3125. EXPECT_TRUE(SSL_session_reused(server.get()));
  3126. break;
  3127. case ssl_test_ticket_aead_seal_fail:
  3128. abort();
  3129. break;
  3130. case ssl_test_ticket_aead_open_hard_fail:
  3131. EXPECT_FALSE(client);
  3132. break;
  3133. case ssl_test_ticket_aead_open_soft_fail:
  3134. ASSERT_TRUE(client);
  3135. EXPECT_FALSE(SSL_session_reused(client.get()));
  3136. EXPECT_FALSE(SSL_session_reused(server.get()));
  3137. }
  3138. }
  3139. std::string TicketAEADMethodParamToString(
  3140. const testing::TestParamInfo<TicketAEADMethodParam> &params) {
  3141. std::string ret = GetVersionName(std::get<0>(params.param));
  3142. // GTest only allows alphanumeric characters and '_' in the parameter
  3143. // string. Additionally filter out the 'v' to get "TLS13" over "TLSv13".
  3144. for (auto it = ret.begin(); it != ret.end();) {
  3145. if (*it == '.' || *it == 'v') {
  3146. it = ret.erase(it);
  3147. } else {
  3148. ++it;
  3149. }
  3150. }
  3151. char retry_count[256];
  3152. snprintf(retry_count, sizeof(retry_count), "%d", std::get<1>(params.param));
  3153. ret += "_";
  3154. ret += retry_count;
  3155. ret += "Retries_";
  3156. switch (std::get<2>(params.param)) {
  3157. case ssl_test_ticket_aead_ok:
  3158. ret += "OK";
  3159. break;
  3160. case ssl_test_ticket_aead_seal_fail:
  3161. ret += "SealFail";
  3162. break;
  3163. case ssl_test_ticket_aead_open_soft_fail:
  3164. ret += "OpenSoftFail";
  3165. break;
  3166. case ssl_test_ticket_aead_open_hard_fail:
  3167. ret += "OpenHardFail";
  3168. break;
  3169. }
  3170. return ret;
  3171. }
  3172. INSTANTIATE_TEST_SUITE_P(
  3173. TicketAEADMethodTests, TicketAEADMethodTest,
  3174. testing::Combine(testing::Values(TLS1_2_VERSION, TLS1_3_VERSION),
  3175. testing::Values(0, 1, 2),
  3176. testing::Values(ssl_test_ticket_aead_ok,
  3177. ssl_test_ticket_aead_seal_fail,
  3178. ssl_test_ticket_aead_open_soft_fail,
  3179. ssl_test_ticket_aead_open_hard_fail)),
  3180. TicketAEADMethodParamToString);
  3181. TEST(SSLTest, SelectNextProto) {
  3182. uint8_t *result;
  3183. uint8_t result_len;
  3184. // If there is an overlap, it should be returned.
  3185. EXPECT_EQ(OPENSSL_NPN_NEGOTIATED,
  3186. SSL_select_next_proto(&result, &result_len,
  3187. (const uint8_t *)"\1a\2bb\3ccc", 9,
  3188. (const uint8_t *)"\1x\1y\1a\1z", 8));
  3189. EXPECT_EQ(Bytes("a"), Bytes(result, result_len));
  3190. EXPECT_EQ(OPENSSL_NPN_NEGOTIATED,
  3191. SSL_select_next_proto(&result, &result_len,
  3192. (const uint8_t *)"\1a\2bb\3ccc", 9,
  3193. (const uint8_t *)"\1x\1y\2bb\1z", 9));
  3194. EXPECT_EQ(Bytes("bb"), Bytes(result, result_len));
  3195. EXPECT_EQ(OPENSSL_NPN_NEGOTIATED,
  3196. SSL_select_next_proto(&result, &result_len,
  3197. (const uint8_t *)"\1a\2bb\3ccc", 9,
  3198. (const uint8_t *)"\1x\1y\3ccc\1z", 10));
  3199. EXPECT_EQ(Bytes("ccc"), Bytes(result, result_len));
  3200. // Peer preference order takes precedence over local.
  3201. EXPECT_EQ(OPENSSL_NPN_NEGOTIATED,
  3202. SSL_select_next_proto(&result, &result_len,
  3203. (const uint8_t *)"\1a\2bb\3ccc", 9,
  3204. (const uint8_t *)"\3ccc\2bb\1a", 9));
  3205. EXPECT_EQ(Bytes("a"), Bytes(result, result_len));
  3206. // If there is no overlap, return the first local protocol.
  3207. EXPECT_EQ(OPENSSL_NPN_NO_OVERLAP,
  3208. SSL_select_next_proto(&result, &result_len,
  3209. (const uint8_t *)"\1a\2bb\3ccc", 9,
  3210. (const uint8_t *)"\1x\2yy\3zzz", 9));
  3211. EXPECT_EQ(Bytes("x"), Bytes(result, result_len));
  3212. EXPECT_EQ(OPENSSL_NPN_NO_OVERLAP,
  3213. SSL_select_next_proto(&result, &result_len, nullptr, 0,
  3214. (const uint8_t *)"\1x\2yy\3zzz", 9));
  3215. EXPECT_EQ(Bytes("x"), Bytes(result, result_len));
  3216. }
  3217. TEST(SSLTest, SealRecord) {
  3218. bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method())),
  3219. server_ctx(SSL_CTX_new(TLS_method()));
  3220. ASSERT_TRUE(client_ctx);
  3221. ASSERT_TRUE(server_ctx);
  3222. bssl::UniquePtr<X509> cert = GetTestCertificate();
  3223. bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
  3224. ASSERT_TRUE(cert);
  3225. ASSERT_TRUE(key);
  3226. ASSERT_TRUE(SSL_CTX_use_certificate(server_ctx.get(), cert.get()));
  3227. ASSERT_TRUE(SSL_CTX_use_PrivateKey(server_ctx.get(), key.get()));
  3228. bssl::UniquePtr<SSL> client, server;
  3229. ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(),
  3230. server_ctx.get()));
  3231. const std::vector<uint8_t> record = {1, 2, 3, 4, 5};
  3232. std::vector<uint8_t> prefix(
  3233. bssl::SealRecordPrefixLen(client.get(), record.size())),
  3234. body(record.size()),
  3235. suffix(bssl::SealRecordSuffixLen(client.get(), record.size()));
  3236. ASSERT_TRUE(bssl::SealRecord(client.get(), bssl::MakeSpan(prefix),
  3237. bssl::MakeSpan(body), bssl::MakeSpan(suffix),
  3238. record));
  3239. std::vector<uint8_t> sealed;
  3240. sealed.insert(sealed.end(), prefix.begin(), prefix.end());
  3241. sealed.insert(sealed.end(), body.begin(), body.end());
  3242. sealed.insert(sealed.end(), suffix.begin(), suffix.end());
  3243. std::vector<uint8_t> sealed_copy = sealed;
  3244. bssl::Span<uint8_t> plaintext;
  3245. size_t record_len;
  3246. uint8_t alert = 255;
  3247. EXPECT_EQ(bssl::OpenRecord(server.get(), &plaintext, &record_len, &alert,
  3248. bssl::MakeSpan(sealed)),
  3249. bssl::OpenRecordResult::kOK);
  3250. EXPECT_EQ(record_len, sealed.size());
  3251. EXPECT_EQ(plaintext, record);
  3252. EXPECT_EQ(255, alert);
  3253. }
  3254. TEST(SSLTest, SealRecordInPlace) {
  3255. bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method())),
  3256. server_ctx(SSL_CTX_new(TLS_method()));
  3257. ASSERT_TRUE(client_ctx);
  3258. ASSERT_TRUE(server_ctx);
  3259. bssl::UniquePtr<X509> cert = GetTestCertificate();
  3260. bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
  3261. ASSERT_TRUE(cert);
  3262. ASSERT_TRUE(key);
  3263. ASSERT_TRUE(SSL_CTX_use_certificate(server_ctx.get(), cert.get()));
  3264. ASSERT_TRUE(SSL_CTX_use_PrivateKey(server_ctx.get(), key.get()));
  3265. bssl::UniquePtr<SSL> client, server;
  3266. ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(),
  3267. server_ctx.get()));
  3268. const std::vector<uint8_t> plaintext = {1, 2, 3, 4, 5};
  3269. std::vector<uint8_t> record = plaintext;
  3270. std::vector<uint8_t> prefix(
  3271. bssl::SealRecordPrefixLen(client.get(), record.size())),
  3272. suffix(bssl::SealRecordSuffixLen(client.get(), record.size()));
  3273. ASSERT_TRUE(bssl::SealRecord(client.get(), bssl::MakeSpan(prefix),
  3274. bssl::MakeSpan(record), bssl::MakeSpan(suffix),
  3275. record));
  3276. record.insert(record.begin(), prefix.begin(), prefix.end());
  3277. record.insert(record.end(), suffix.begin(), suffix.end());
  3278. bssl::Span<uint8_t> result;
  3279. size_t record_len;
  3280. uint8_t alert;
  3281. EXPECT_EQ(bssl::OpenRecord(server.get(), &result, &record_len, &alert,
  3282. bssl::MakeSpan(record)),
  3283. bssl::OpenRecordResult::kOK);
  3284. EXPECT_EQ(record_len, record.size());
  3285. EXPECT_EQ(plaintext, result);
  3286. }
  3287. TEST(SSLTest, SealRecordTrailingData) {
  3288. bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method())),
  3289. server_ctx(SSL_CTX_new(TLS_method()));
  3290. ASSERT_TRUE(client_ctx);
  3291. ASSERT_TRUE(server_ctx);
  3292. bssl::UniquePtr<X509> cert = GetTestCertificate();
  3293. bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
  3294. ASSERT_TRUE(cert);
  3295. ASSERT_TRUE(key);
  3296. ASSERT_TRUE(SSL_CTX_use_certificate(server_ctx.get(), cert.get()));
  3297. ASSERT_TRUE(SSL_CTX_use_PrivateKey(server_ctx.get(), key.get()));
  3298. bssl::UniquePtr<SSL> client, server;
  3299. ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(),
  3300. server_ctx.get()));
  3301. const std::vector<uint8_t> plaintext = {1, 2, 3, 4, 5};
  3302. std::vector<uint8_t> record = plaintext;
  3303. std::vector<uint8_t> prefix(
  3304. bssl::SealRecordPrefixLen(client.get(), record.size())),
  3305. suffix(bssl::SealRecordSuffixLen(client.get(), record.size()));
  3306. ASSERT_TRUE(bssl::SealRecord(client.get(), bssl::MakeSpan(prefix),
  3307. bssl::MakeSpan(record), bssl::MakeSpan(suffix),
  3308. record));
  3309. record.insert(record.begin(), prefix.begin(), prefix.end());
  3310. record.insert(record.end(), suffix.begin(), suffix.end());
  3311. record.insert(record.end(), {5, 4, 3, 2, 1});
  3312. bssl::Span<uint8_t> result;
  3313. size_t record_len;
  3314. uint8_t alert;
  3315. EXPECT_EQ(bssl::OpenRecord(server.get(), &result, &record_len, &alert,
  3316. bssl::MakeSpan(record)),
  3317. bssl::OpenRecordResult::kOK);
  3318. EXPECT_EQ(record_len, record.size() - 5);
  3319. EXPECT_EQ(plaintext, result);
  3320. }
  3321. TEST(SSLTest, SealRecordInvalidSpanSize) {
  3322. bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method())),
  3323. server_ctx(SSL_CTX_new(TLS_method()));
  3324. ASSERT_TRUE(client_ctx);
  3325. ASSERT_TRUE(server_ctx);
  3326. bssl::UniquePtr<X509> cert = GetTestCertificate();
  3327. bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
  3328. ASSERT_TRUE(cert);
  3329. ASSERT_TRUE(key);
  3330. ASSERT_TRUE(SSL_CTX_use_certificate(server_ctx.get(), cert.get()));
  3331. ASSERT_TRUE(SSL_CTX_use_PrivateKey(server_ctx.get(), key.get()));
  3332. bssl::UniquePtr<SSL> client, server;
  3333. ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(),
  3334. server_ctx.get()));
  3335. std::vector<uint8_t> record = {1, 2, 3, 4, 5};
  3336. std::vector<uint8_t> prefix(
  3337. bssl::SealRecordPrefixLen(client.get(), record.size())),
  3338. body(record.size()),
  3339. suffix(bssl::SealRecordSuffixLen(client.get(), record.size()));
  3340. auto expect_err = []() {
  3341. int err = ERR_get_error();
  3342. EXPECT_EQ(ERR_GET_LIB(err), ERR_LIB_SSL);
  3343. EXPECT_EQ(ERR_GET_REASON(err), SSL_R_BUFFER_TOO_SMALL);
  3344. ERR_clear_error();
  3345. };
  3346. EXPECT_FALSE(bssl::SealRecord(
  3347. client.get(), bssl::MakeSpan(prefix.data(), prefix.size() - 1),
  3348. bssl::MakeSpan(record), bssl::MakeSpan(suffix), record));
  3349. expect_err();
  3350. EXPECT_FALSE(bssl::SealRecord(
  3351. client.get(), bssl::MakeSpan(prefix.data(), prefix.size() + 1),
  3352. bssl::MakeSpan(record), bssl::MakeSpan(suffix), record));
  3353. expect_err();
  3354. EXPECT_FALSE(
  3355. bssl::SealRecord(client.get(), bssl::MakeSpan(prefix),
  3356. bssl::MakeSpan(record.data(), record.size() - 1),
  3357. bssl::MakeSpan(suffix), record));
  3358. expect_err();
  3359. EXPECT_FALSE(
  3360. bssl::SealRecord(client.get(), bssl::MakeSpan(prefix),
  3361. bssl::MakeSpan(record.data(), record.size() + 1),
  3362. bssl::MakeSpan(suffix), record));
  3363. expect_err();
  3364. EXPECT_FALSE(bssl::SealRecord(
  3365. client.get(), bssl::MakeSpan(prefix), bssl::MakeSpan(record),
  3366. bssl::MakeSpan(suffix.data(), suffix.size() - 1), record));
  3367. expect_err();
  3368. EXPECT_FALSE(bssl::SealRecord(
  3369. client.get(), bssl::MakeSpan(prefix), bssl::MakeSpan(record),
  3370. bssl::MakeSpan(suffix.data(), suffix.size() + 1), record));
  3371. expect_err();
  3372. }
  3373. // The client should gracefully handle no suitable ciphers being enabled.
  3374. TEST(SSLTest, NoCiphersAvailable) {
  3375. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  3376. ASSERT_TRUE(ctx);
  3377. // Configure |client_ctx| with a cipher list that does not intersect with its
  3378. // version configuration.
  3379. ASSERT_TRUE(SSL_CTX_set_strict_cipher_list(
  3380. ctx.get(), "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"));
  3381. ASSERT_TRUE(SSL_CTX_set_max_proto_version(ctx.get(), TLS1_1_VERSION));
  3382. bssl::UniquePtr<SSL> ssl(SSL_new(ctx.get()));
  3383. ASSERT_TRUE(ssl);
  3384. SSL_set_connect_state(ssl.get());
  3385. UniquePtr<BIO> rbio(BIO_new(BIO_s_mem())), wbio(BIO_new(BIO_s_mem()));
  3386. ASSERT_TRUE(rbio);
  3387. ASSERT_TRUE(wbio);
  3388. SSL_set0_rbio(ssl.get(), rbio.release());
  3389. SSL_set0_wbio(ssl.get(), wbio.release());
  3390. int ret = SSL_do_handshake(ssl.get());
  3391. EXPECT_EQ(-1, ret);
  3392. EXPECT_EQ(SSL_ERROR_SSL, SSL_get_error(ssl.get(), ret));
  3393. uint32_t err = ERR_get_error();
  3394. EXPECT_EQ(ERR_LIB_SSL, ERR_GET_LIB(err));
  3395. EXPECT_EQ(SSL_R_NO_CIPHERS_AVAILABLE, ERR_GET_REASON(err));
  3396. }
  3397. TEST_P(SSLVersionTest, SessionVersion) {
  3398. SSL_CTX_set_session_cache_mode(client_ctx_.get(), SSL_SESS_CACHE_BOTH);
  3399. SSL_CTX_set_session_cache_mode(server_ctx_.get(), SSL_SESS_CACHE_BOTH);
  3400. bssl::UniquePtr<SSL_SESSION> session =
  3401. CreateClientSession(client_ctx_.get(), server_ctx_.get());
  3402. ASSERT_TRUE(session);
  3403. EXPECT_EQ(version(), SSL_SESSION_get_protocol_version(session.get()));
  3404. // Sessions in TLS 1.3 and later should be single-use.
  3405. EXPECT_EQ(version() == TLS1_3_VERSION,
  3406. !!SSL_SESSION_should_be_single_use(session.get()));
  3407. // Making fake sessions for testing works.
  3408. session.reset(SSL_SESSION_new(client_ctx_.get()));
  3409. ASSERT_TRUE(session);
  3410. ASSERT_TRUE(SSL_SESSION_set_protocol_version(session.get(), version()));
  3411. EXPECT_EQ(version(), SSL_SESSION_get_protocol_version(session.get()));
  3412. }
  3413. TEST_P(SSLVersionTest, SSLPending) {
  3414. UniquePtr<SSL> ssl(SSL_new(client_ctx_.get()));
  3415. ASSERT_TRUE(ssl);
  3416. EXPECT_EQ(0, SSL_pending(ssl.get()));
  3417. ASSERT_TRUE(Connect());
  3418. EXPECT_EQ(0, SSL_pending(client_.get()));
  3419. ASSERT_EQ(5, SSL_write(server_.get(), "hello", 5));
  3420. ASSERT_EQ(5, SSL_write(server_.get(), "world", 5));
  3421. EXPECT_EQ(0, SSL_pending(client_.get()));
  3422. char buf[10];
  3423. ASSERT_EQ(1, SSL_peek(client_.get(), buf, 1));
  3424. EXPECT_EQ(5, SSL_pending(client_.get()));
  3425. ASSERT_EQ(1, SSL_read(client_.get(), buf, 1));
  3426. EXPECT_EQ(4, SSL_pending(client_.get()));
  3427. ASSERT_EQ(4, SSL_read(client_.get(), buf, 10));
  3428. EXPECT_EQ(0, SSL_pending(client_.get()));
  3429. ASSERT_EQ(2, SSL_read(client_.get(), buf, 2));
  3430. EXPECT_EQ(3, SSL_pending(client_.get()));
  3431. }
  3432. // Test that post-handshake tickets consumed by |SSL_shutdown| are ignored.
  3433. TEST(SSLTest, ShutdownIgnoresTickets) {
  3434. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  3435. ASSERT_TRUE(ctx);
  3436. ASSERT_TRUE(SSL_CTX_set_min_proto_version(ctx.get(), TLS1_3_VERSION));
  3437. ASSERT_TRUE(SSL_CTX_set_max_proto_version(ctx.get(), TLS1_3_VERSION));
  3438. bssl::UniquePtr<X509> cert = GetTestCertificate();
  3439. bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
  3440. ASSERT_TRUE(cert);
  3441. ASSERT_TRUE(key);
  3442. ASSERT_TRUE(SSL_CTX_use_certificate(ctx.get(), cert.get()));
  3443. ASSERT_TRUE(SSL_CTX_use_PrivateKey(ctx.get(), key.get()));
  3444. SSL_CTX_set_session_cache_mode(ctx.get(), SSL_SESS_CACHE_BOTH);
  3445. bssl::UniquePtr<SSL> client, server;
  3446. ASSERT_TRUE(ConnectClientAndServer(&client, &server, ctx.get(), ctx.get()));
  3447. SSL_CTX_sess_set_new_cb(ctx.get(), [](SSL *ssl, SSL_SESSION *session) -> int {
  3448. ADD_FAILURE() << "New session callback called during SSL_shutdown";
  3449. return 0;
  3450. });
  3451. // Send close_notify.
  3452. EXPECT_EQ(0, SSL_shutdown(server.get()));
  3453. EXPECT_EQ(0, SSL_shutdown(client.get()));
  3454. // Receive close_notify.
  3455. EXPECT_EQ(1, SSL_shutdown(server.get()));
  3456. EXPECT_EQ(1, SSL_shutdown(client.get()));
  3457. }
  3458. TEST(SSLTest, SignatureAlgorithmProperties) {
  3459. EXPECT_EQ(EVP_PKEY_NONE, SSL_get_signature_algorithm_key_type(0x1234));
  3460. EXPECT_EQ(nullptr, SSL_get_signature_algorithm_digest(0x1234));
  3461. EXPECT_FALSE(SSL_is_signature_algorithm_rsa_pss(0x1234));
  3462. EXPECT_EQ(EVP_PKEY_RSA,
  3463. SSL_get_signature_algorithm_key_type(SSL_SIGN_RSA_PKCS1_MD5_SHA1));
  3464. EXPECT_EQ(EVP_md5_sha1(),
  3465. SSL_get_signature_algorithm_digest(SSL_SIGN_RSA_PKCS1_MD5_SHA1));
  3466. EXPECT_FALSE(SSL_is_signature_algorithm_rsa_pss(SSL_SIGN_RSA_PKCS1_MD5_SHA1));
  3467. EXPECT_EQ(EVP_PKEY_EC, SSL_get_signature_algorithm_key_type(
  3468. SSL_SIGN_ECDSA_SECP256R1_SHA256));
  3469. EXPECT_EQ(EVP_sha256(), SSL_get_signature_algorithm_digest(
  3470. SSL_SIGN_ECDSA_SECP256R1_SHA256));
  3471. EXPECT_FALSE(
  3472. SSL_is_signature_algorithm_rsa_pss(SSL_SIGN_ECDSA_SECP256R1_SHA256));
  3473. EXPECT_EQ(EVP_PKEY_RSA,
  3474. SSL_get_signature_algorithm_key_type(SSL_SIGN_RSA_PSS_RSAE_SHA384));
  3475. EXPECT_EQ(EVP_sha384(),
  3476. SSL_get_signature_algorithm_digest(SSL_SIGN_RSA_PSS_RSAE_SHA384));
  3477. EXPECT_TRUE(SSL_is_signature_algorithm_rsa_pss(SSL_SIGN_RSA_PSS_RSAE_SHA384));
  3478. }
  3479. static int XORCompressFunc(SSL *ssl, CBB *out, const uint8_t *in,
  3480. size_t in_len) {
  3481. for (size_t i = 0; i < in_len; i++) {
  3482. if (!CBB_add_u8(out, in[i] ^ 0x55)) {
  3483. return 0;
  3484. }
  3485. }
  3486. SSL_set_app_data(ssl, XORCompressFunc);
  3487. return 1;
  3488. }
  3489. static int XORDecompressFunc(SSL *ssl, CRYPTO_BUFFER **out,
  3490. size_t uncompressed_len, const uint8_t *in,
  3491. size_t in_len) {
  3492. if (in_len != uncompressed_len) {
  3493. return 0;
  3494. }
  3495. uint8_t *data;
  3496. *out = CRYPTO_BUFFER_alloc(&data, uncompressed_len);
  3497. if (*out == nullptr) {
  3498. return 0;
  3499. }
  3500. for (size_t i = 0; i < in_len; i++) {
  3501. data[i] = in[i] ^ 0x55;
  3502. }
  3503. SSL_set_app_data(ssl, XORDecompressFunc);
  3504. return 1;
  3505. }
  3506. TEST(SSLTest, CertCompression) {
  3507. bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
  3508. bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_method()));
  3509. ASSERT_TRUE(client_ctx);
  3510. ASSERT_TRUE(server_ctx);
  3511. bssl::UniquePtr<X509> cert = GetTestCertificate();
  3512. bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
  3513. ASSERT_TRUE(cert);
  3514. ASSERT_TRUE(key);
  3515. ASSERT_TRUE(SSL_CTX_use_certificate(server_ctx.get(), cert.get()));
  3516. ASSERT_TRUE(SSL_CTX_use_PrivateKey(server_ctx.get(), key.get()));
  3517. ASSERT_TRUE(SSL_CTX_set_max_proto_version(client_ctx.get(), TLS1_3_VERSION));
  3518. ASSERT_TRUE(SSL_CTX_set_max_proto_version(server_ctx.get(), TLS1_3_VERSION));
  3519. ASSERT_TRUE(SSL_CTX_add_cert_compression_alg(
  3520. client_ctx.get(), 0x1234, XORCompressFunc, XORDecompressFunc));
  3521. ASSERT_TRUE(SSL_CTX_add_cert_compression_alg(
  3522. server_ctx.get(), 0x1234, XORCompressFunc, XORDecompressFunc));
  3523. bssl::UniquePtr<SSL> client, server;
  3524. ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(),
  3525. server_ctx.get()));
  3526. EXPECT_TRUE(SSL_get_app_data(client.get()) == XORDecompressFunc);
  3527. EXPECT_TRUE(SSL_get_app_data(server.get()) == XORCompressFunc);
  3528. }
  3529. void MoveBIOs(SSL *dest, SSL *src) {
  3530. BIO *rbio = SSL_get_rbio(src);
  3531. BIO_up_ref(rbio);
  3532. SSL_set0_rbio(dest, rbio);
  3533. BIO *wbio = SSL_get_wbio(src);
  3534. BIO_up_ref(wbio);
  3535. SSL_set0_wbio(dest, wbio);
  3536. SSL_set0_rbio(src, nullptr);
  3537. SSL_set0_wbio(src, nullptr);
  3538. }
  3539. TEST(SSLTest, Handoff) {
  3540. bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
  3541. bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_method()));
  3542. bssl::UniquePtr<SSL_CTX> handshaker_ctx(SSL_CTX_new(TLS_method()));
  3543. ASSERT_TRUE(client_ctx);
  3544. ASSERT_TRUE(server_ctx);
  3545. ASSERT_TRUE(handshaker_ctx);
  3546. SSL_CTX_set_handoff_mode(server_ctx.get(), 1);
  3547. ASSERT_TRUE(SSL_CTX_set_max_proto_version(server_ctx.get(), TLS1_2_VERSION));
  3548. ASSERT_TRUE(
  3549. SSL_CTX_set_max_proto_version(handshaker_ctx.get(), TLS1_2_VERSION));
  3550. bssl::UniquePtr<X509> cert = GetTestCertificate();
  3551. bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
  3552. ASSERT_TRUE(cert);
  3553. ASSERT_TRUE(key);
  3554. ASSERT_TRUE(SSL_CTX_use_certificate(handshaker_ctx.get(), cert.get()));
  3555. ASSERT_TRUE(SSL_CTX_use_PrivateKey(handshaker_ctx.get(), key.get()));
  3556. bssl::UniquePtr<SSL> client, server;
  3557. ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(),
  3558. server_ctx.get(), ClientConfig(),
  3559. false /* don't handshake */));
  3560. int client_ret = SSL_do_handshake(client.get());
  3561. int client_err = SSL_get_error(client.get(), client_ret);
  3562. ASSERT_EQ(client_err, SSL_ERROR_WANT_READ);
  3563. int server_ret = SSL_do_handshake(server.get());
  3564. int server_err = SSL_get_error(server.get(), server_ret);
  3565. ASSERT_EQ(server_err, SSL_ERROR_HANDOFF);
  3566. ScopedCBB cbb;
  3567. Array<uint8_t> handoff;
  3568. SSL_CLIENT_HELLO hello;
  3569. ASSERT_TRUE(CBB_init(cbb.get(), 256));
  3570. ASSERT_TRUE(SSL_serialize_handoff(server.get(), cbb.get(), &hello));
  3571. ASSERT_TRUE(CBBFinishArray(cbb.get(), &handoff));
  3572. bssl::UniquePtr<SSL> handshaker(SSL_new(handshaker_ctx.get()));
  3573. ASSERT_TRUE(SSL_apply_handoff(handshaker.get(), handoff));
  3574. MoveBIOs(handshaker.get(), server.get());
  3575. int handshake_ret = SSL_do_handshake(handshaker.get());
  3576. int handshake_err = SSL_get_error(handshaker.get(), handshake_ret);
  3577. ASSERT_EQ(handshake_err, SSL_ERROR_HANDBACK);
  3578. // Double-check that additional calls to |SSL_do_handshake| continue
  3579. // to get |SSL_ERRROR_HANDBACK|.
  3580. handshake_ret = SSL_do_handshake(handshaker.get());
  3581. handshake_err = SSL_get_error(handshaker.get(), handshake_ret);
  3582. ASSERT_EQ(handshake_err, SSL_ERROR_HANDBACK);
  3583. ScopedCBB cbb_handback;
  3584. Array<uint8_t> handback;
  3585. ASSERT_TRUE(CBB_init(cbb_handback.get(), 1024));
  3586. ASSERT_TRUE(SSL_serialize_handback(handshaker.get(), cbb_handback.get()));
  3587. ASSERT_TRUE(CBBFinishArray(cbb_handback.get(), &handback));
  3588. bssl::UniquePtr<SSL> server2(SSL_new(server_ctx.get()));
  3589. ASSERT_TRUE(SSL_apply_handback(server2.get(), handback));
  3590. MoveBIOs(server2.get(), handshaker.get());
  3591. ASSERT_TRUE(CompleteHandshakes(client.get(), server2.get()));
  3592. uint8_t byte = 42;
  3593. EXPECT_EQ(SSL_write(client.get(), &byte, 1), 1);
  3594. EXPECT_EQ(SSL_read(server2.get(), &byte, 1), 1);
  3595. EXPECT_EQ(42, byte);
  3596. byte = 43;
  3597. EXPECT_EQ(SSL_write(server2.get(), &byte, 1), 1);
  3598. EXPECT_EQ(SSL_read(client.get(), &byte, 1), 1);
  3599. EXPECT_EQ(43, byte);
  3600. }
  3601. TEST(SSLTest, HandoffDeclined) {
  3602. bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
  3603. bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_method()));
  3604. ASSERT_TRUE(client_ctx);
  3605. ASSERT_TRUE(server_ctx);
  3606. SSL_CTX_set_handoff_mode(server_ctx.get(), 1);
  3607. ASSERT_TRUE(SSL_CTX_set_max_proto_version(server_ctx.get(), TLS1_2_VERSION));
  3608. bssl::UniquePtr<X509> cert = GetTestCertificate();
  3609. bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
  3610. ASSERT_TRUE(cert);
  3611. ASSERT_TRUE(key);
  3612. ASSERT_TRUE(SSL_CTX_use_certificate(server_ctx.get(), cert.get()));
  3613. ASSERT_TRUE(SSL_CTX_use_PrivateKey(server_ctx.get(), key.get()));
  3614. bssl::UniquePtr<SSL> client, server;
  3615. ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(),
  3616. server_ctx.get(), ClientConfig(),
  3617. false /* don't handshake */));
  3618. int client_ret = SSL_do_handshake(client.get());
  3619. int client_err = SSL_get_error(client.get(), client_ret);
  3620. ASSERT_EQ(client_err, SSL_ERROR_WANT_READ);
  3621. int server_ret = SSL_do_handshake(server.get());
  3622. int server_err = SSL_get_error(server.get(), server_ret);
  3623. ASSERT_EQ(server_err, SSL_ERROR_HANDOFF);
  3624. ScopedCBB cbb;
  3625. SSL_CLIENT_HELLO hello;
  3626. ASSERT_TRUE(CBB_init(cbb.get(), 256));
  3627. ASSERT_TRUE(SSL_serialize_handoff(server.get(), cbb.get(), &hello));
  3628. ASSERT_TRUE(SSL_decline_handoff(server.get()));
  3629. ASSERT_TRUE(CompleteHandshakes(client.get(), server.get()));
  3630. uint8_t byte = 42;
  3631. EXPECT_EQ(SSL_write(client.get(), &byte, 1), 1);
  3632. EXPECT_EQ(SSL_read(server.get(), &byte, 1), 1);
  3633. EXPECT_EQ(42, byte);
  3634. byte = 43;
  3635. EXPECT_EQ(SSL_write(server.get(), &byte, 1), 1);
  3636. EXPECT_EQ(SSL_read(client.get(), &byte, 1), 1);
  3637. EXPECT_EQ(43, byte);
  3638. }
  3639. static std::string SigAlgsToString(Span<const uint16_t> sigalgs) {
  3640. std::string ret = "{";
  3641. for (uint16_t v : sigalgs) {
  3642. if (ret.size() > 1) {
  3643. ret += ", ";
  3644. }
  3645. char buf[8];
  3646. snprintf(buf, sizeof(buf) - 1, "0x%02x", v);
  3647. buf[sizeof(buf)-1] = 0;
  3648. ret += std::string(buf);
  3649. }
  3650. ret += "}";
  3651. return ret;
  3652. }
  3653. void ExpectSigAlgsEqual(Span<const uint16_t> expected,
  3654. Span<const uint16_t> actual) {
  3655. bool matches = false;
  3656. if (expected.size() == actual.size()) {
  3657. matches = true;
  3658. for (size_t i = 0; i < expected.size(); i++) {
  3659. if (expected[i] != actual[i]) {
  3660. matches = false;
  3661. break;
  3662. }
  3663. }
  3664. }
  3665. if (!matches) {
  3666. ADD_FAILURE() << "expected: " << SigAlgsToString(expected)
  3667. << " got: " << SigAlgsToString(actual);
  3668. }
  3669. }
  3670. TEST(SSLTest, SigAlgs) {
  3671. static const struct {
  3672. std::vector<int> input;
  3673. bool ok;
  3674. std::vector<uint16_t> expected;
  3675. } kTests[] = {
  3676. {{}, true, {}},
  3677. {{1}, false, {}},
  3678. {{1, 2, 3}, false, {}},
  3679. {{NID_sha256, EVP_PKEY_ED25519}, false, {}},
  3680. {{NID_sha256, EVP_PKEY_RSA, NID_sha256, EVP_PKEY_RSA}, false, {}},
  3681. {{NID_sha256, EVP_PKEY_RSA}, true, {SSL_SIGN_RSA_PKCS1_SHA256}},
  3682. {{NID_sha512, EVP_PKEY_RSA}, true, {SSL_SIGN_RSA_PKCS1_SHA512}},
  3683. {{NID_sha256, EVP_PKEY_RSA_PSS}, true, {SSL_SIGN_RSA_PSS_RSAE_SHA256}},
  3684. {{NID_undef, EVP_PKEY_ED25519}, true, {SSL_SIGN_ED25519}},
  3685. {{NID_undef, EVP_PKEY_ED25519, NID_sha384, EVP_PKEY_EC},
  3686. true,
  3687. {SSL_SIGN_ED25519, SSL_SIGN_ECDSA_SECP384R1_SHA384}},
  3688. };
  3689. UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  3690. unsigned n = 1;
  3691. for (const auto &test : kTests) {
  3692. SCOPED_TRACE(n++);
  3693. const bool ok =
  3694. SSL_CTX_set1_sigalgs(ctx.get(), test.input.data(), test.input.size());
  3695. EXPECT_EQ(ok, test.ok);
  3696. if (!ok) {
  3697. ERR_clear_error();
  3698. }
  3699. if (!test.ok) {
  3700. continue;
  3701. }
  3702. ExpectSigAlgsEqual(test.expected, ctx->cert->sigalgs);
  3703. }
  3704. }
  3705. TEST(SSLTest, SigAlgsList) {
  3706. static const struct {
  3707. const char *input;
  3708. bool ok;
  3709. std::vector<uint16_t> expected;
  3710. } kTests[] = {
  3711. {"", false, {}},
  3712. {":", false, {}},
  3713. {"+", false, {}},
  3714. {"RSA", false, {}},
  3715. {"RSA+", false, {}},
  3716. {"RSA+SHA256:", false, {}},
  3717. {":RSA+SHA256:", false, {}},
  3718. {":RSA+SHA256+:", false, {}},
  3719. {"!", false, {}},
  3720. {"\x01", false, {}},
  3721. {"RSA+SHA256:RSA+SHA384:RSA+SHA256", false, {}},
  3722. {"RSA-PSS+SHA256:rsa_pss_rsae_sha256", false, {}},
  3723. {"RSA+SHA256", true, {SSL_SIGN_RSA_PKCS1_SHA256}},
  3724. {"RSA+SHA256:ed25519",
  3725. true,
  3726. {SSL_SIGN_RSA_PKCS1_SHA256, SSL_SIGN_ED25519}},
  3727. {"ECDSA+SHA256:RSA+SHA512",
  3728. true,
  3729. {SSL_SIGN_ECDSA_SECP256R1_SHA256, SSL_SIGN_RSA_PKCS1_SHA512}},
  3730. {"ecdsa_secp256r1_sha256:rsa_pss_rsae_sha256",
  3731. true,
  3732. {SSL_SIGN_ECDSA_SECP256R1_SHA256, SSL_SIGN_RSA_PSS_RSAE_SHA256}},
  3733. {"RSA-PSS+SHA256", true, {SSL_SIGN_RSA_PSS_RSAE_SHA256}},
  3734. {"PSS+SHA256", true, {SSL_SIGN_RSA_PSS_RSAE_SHA256}},
  3735. };
  3736. UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  3737. unsigned n = 1;
  3738. for (const auto &test : kTests) {
  3739. SCOPED_TRACE(n++);
  3740. const bool ok = SSL_CTX_set1_sigalgs_list(ctx.get(), test.input);
  3741. EXPECT_EQ(ok, test.ok);
  3742. if (!ok) {
  3743. if (test.ok) {
  3744. ERR_print_errors_fp(stderr);
  3745. }
  3746. ERR_clear_error();
  3747. }
  3748. if (!test.ok) {
  3749. continue;
  3750. }
  3751. ExpectSigAlgsEqual(test.expected, ctx->cert->sigalgs);
  3752. }
  3753. }
  3754. TEST(SSLTest, ApplyHandoffRemovesUnsupportedCiphers) {
  3755. bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_method()));
  3756. bssl::UniquePtr<SSL> server(SSL_new(server_ctx.get()));
  3757. // handoff is a handoff message that has been artificially modified to pretend
  3758. // that only cipher 0x0A is supported. When it is applied to |server|, all
  3759. // ciphers but that one should be removed.
  3760. //
  3761. // To make a new one of these, try sticking this in the |Handoff| test above:
  3762. //
  3763. // hexdump(stderr, "", handoff.data(), handoff.size());
  3764. // sed -e 's/\(..\)/0x\1, /g'
  3765. //
  3766. // and modify serialize_features() to emit only cipher 0x0A.
  3767. uint8_t handoff[] = {
  3768. 0x30, 0x81, 0x9a, 0x02, 0x01, 0x00, 0x04, 0x00, 0x04, 0x81, 0x82, 0x01,
  3769. 0x00, 0x00, 0x7e, 0x03, 0x03, 0x30, 0x8e, 0x8f, 0x79, 0xd2, 0x87, 0x39,
  3770. 0xc2, 0x23, 0x23, 0x13, 0xca, 0x3c, 0x80, 0x44, 0xfd, 0x80, 0x83, 0x62,
  3771. 0x3c, 0xcc, 0xf8, 0x76, 0xd3, 0x62, 0xbb, 0x54, 0xe3, 0xc4, 0x39, 0x24,
  3772. 0xa5, 0x00, 0x00, 0x1e, 0xc0, 0x2b, 0xc0, 0x2f, 0xc0, 0x2c, 0xc0, 0x30,
  3773. 0xcc, 0xa9, 0xcc, 0xa8, 0xc0, 0x09, 0xc0, 0x13, 0xc0, 0x0a, 0xc0, 0x14,
  3774. 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x0a, 0x01, 0x00,
  3775. 0x00, 0x37, 0x00, 0x17, 0x00, 0x00, 0xff, 0x01, 0x00, 0x01, 0x00, 0x00,
  3776. 0x0a, 0x00, 0x08, 0x00, 0x06, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x18, 0x00,
  3777. 0x0b, 0x00, 0x02, 0x01, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x0d, 0x00,
  3778. 0x14, 0x00, 0x12, 0x04, 0x03, 0x08, 0x04, 0x04, 0x01, 0x05, 0x03, 0x08,
  3779. 0x05, 0x05, 0x01, 0x08, 0x06, 0x06, 0x01, 0x02, 0x01, 0x04, 0x02, 0x00,
  3780. 0x0a, 0x04, 0x0a, 0x00, 0x15, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00,
  3781. 0x1d,
  3782. };
  3783. EXPECT_EQ(20u, sk_SSL_CIPHER_num(SSL_get_ciphers(server.get())));
  3784. ASSERT_TRUE(
  3785. SSL_apply_handoff(server.get(), {handoff, OPENSSL_ARRAY_SIZE(handoff)}));
  3786. EXPECT_EQ(1u, sk_SSL_CIPHER_num(SSL_get_ciphers(server.get())));
  3787. }
  3788. TEST(SSLTest, ApplyHandoffRemovesUnsupportedCurves) {
  3789. bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_method()));
  3790. bssl::UniquePtr<SSL> server(SSL_new(server_ctx.get()));
  3791. // handoff is a handoff message that has been artificially modified to pretend
  3792. // that only one curve is supported. When it is applied to |server|, all
  3793. // curves but that one should be removed.
  3794. //
  3795. // See |ApplyHandoffRemovesUnsupportedCiphers| for how to make a new one of
  3796. // these.
  3797. uint8_t handoff[] = {
  3798. 0x30, 0x81, 0xc0, 0x02, 0x01, 0x00, 0x04, 0x00, 0x04, 0x81, 0x82, 0x01,
  3799. 0x00, 0x00, 0x7e, 0x03, 0x03, 0x98, 0x30, 0xce, 0xd9, 0xb0, 0xdf, 0x5f,
  3800. 0x82, 0x05, 0x4a, 0x43, 0x67, 0x7e, 0xdb, 0x6a, 0x4f, 0x21, 0x18, 0x4e,
  3801. 0x0d, 0x94, 0x63, 0x18, 0x8b, 0x54, 0x89, 0xdb, 0x8b, 0x1d, 0x84, 0xbc,
  3802. 0x09, 0x00, 0x00, 0x1e, 0xc0, 0x2b, 0xc0, 0x2f, 0xc0, 0x2c, 0xc0, 0x30,
  3803. 0xcc, 0xa9, 0xcc, 0xa8, 0xc0, 0x09, 0xc0, 0x13, 0xc0, 0x0a, 0xc0, 0x14,
  3804. 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x0a, 0x01, 0x00,
  3805. 0x00, 0x37, 0x00, 0x17, 0x00, 0x00, 0xff, 0x01, 0x00, 0x01, 0x00, 0x00,
  3806. 0x0a, 0x00, 0x08, 0x00, 0x06, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x18, 0x00,
  3807. 0x0b, 0x00, 0x02, 0x01, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x0d, 0x00,
  3808. 0x14, 0x00, 0x12, 0x04, 0x03, 0x08, 0x04, 0x04, 0x01, 0x05, 0x03, 0x08,
  3809. 0x05, 0x05, 0x01, 0x08, 0x06, 0x06, 0x01, 0x02, 0x01, 0x04, 0x30, 0x00,
  3810. 0x02, 0x00, 0x0a, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x8c, 0x00, 0x8d, 0x00,
  3811. 0x9c, 0x00, 0x9d, 0x13, 0x01, 0x13, 0x02, 0x13, 0x03, 0xc0, 0x09, 0xc0,
  3812. 0x0a, 0xc0, 0x13, 0xc0, 0x14, 0xc0, 0x2b, 0xc0, 0x2c, 0xc0, 0x2f, 0xc0,
  3813. 0x30, 0xc0, 0x35, 0xc0, 0x36, 0xcc, 0xa8, 0xcc, 0xa9, 0xcc, 0xac, 0x04,
  3814. 0x02, 0x00, 0x17,
  3815. };
  3816. // The zero length means that the default list of groups is used.
  3817. EXPECT_EQ(0u, server->config->supported_group_list.size());
  3818. ASSERT_TRUE(
  3819. SSL_apply_handoff(server.get(), {handoff, OPENSSL_ARRAY_SIZE(handoff)}));
  3820. EXPECT_EQ(1u, server->config->supported_group_list.size());
  3821. }
  3822. TEST(SSLTest, ZeroSizedWiteFlushesHandshakeMessages) {
  3823. // If there are pending handshake mesages, an |SSL_write| of zero bytes should
  3824. // flush them.
  3825. bssl::UniquePtr<SSL_CTX> server_ctx(SSL_CTX_new(TLS_method()));
  3826. EXPECT_TRUE(SSL_CTX_set_max_proto_version(server_ctx.get(), TLS1_3_VERSION));
  3827. EXPECT_TRUE(SSL_CTX_set_min_proto_version(server_ctx.get(), TLS1_3_VERSION));
  3828. bssl::UniquePtr<X509> cert = GetTestCertificate();
  3829. bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
  3830. ASSERT_TRUE(cert);
  3831. ASSERT_TRUE(key);
  3832. ASSERT_TRUE(SSL_CTX_use_certificate(server_ctx.get(), cert.get()));
  3833. ASSERT_TRUE(SSL_CTX_use_PrivateKey(server_ctx.get(), key.get()));
  3834. bssl::UniquePtr<SSL_CTX> client_ctx(SSL_CTX_new(TLS_method()));
  3835. EXPECT_TRUE(SSL_CTX_set_max_proto_version(client_ctx.get(), TLS1_3_VERSION));
  3836. EXPECT_TRUE(SSL_CTX_set_min_proto_version(client_ctx.get(), TLS1_3_VERSION));
  3837. bssl::UniquePtr<SSL> client, server;
  3838. ASSERT_TRUE(ConnectClientAndServer(&client, &server, client_ctx.get(),
  3839. server_ctx.get()));
  3840. BIO *client_wbio = SSL_get_wbio(client.get());
  3841. EXPECT_EQ(0u, BIO_wpending(client_wbio));
  3842. EXPECT_TRUE(SSL_key_update(client.get(), SSL_KEY_UPDATE_NOT_REQUESTED));
  3843. EXPECT_EQ(0u, BIO_wpending(client_wbio));
  3844. EXPECT_EQ(0, SSL_write(client.get(), nullptr, 0));
  3845. EXPECT_NE(0u, BIO_wpending(client_wbio));
  3846. }
  3847. TEST_P(SSLVersionTest, VerifyBeforeCertRequest) {
  3848. // Configure the server to request client certificates.
  3849. SSL_CTX_set_custom_verify(
  3850. server_ctx_.get(), SSL_VERIFY_PEER,
  3851. [](SSL *ssl, uint8_t *out_alert) { return ssl_verify_ok; });
  3852. // Configure the client to reject the server certificate.
  3853. SSL_CTX_set_custom_verify(
  3854. client_ctx_.get(), SSL_VERIFY_PEER,
  3855. [](SSL *ssl, uint8_t *out_alert) { return ssl_verify_invalid; });
  3856. // cert_cb should not be called. Verification should fail first.
  3857. SSL_CTX_set_cert_cb(client_ctx_.get(),
  3858. [](SSL *ssl, void *arg) {
  3859. ADD_FAILURE() << "cert_cb unexpectedly called";
  3860. return 0;
  3861. },
  3862. nullptr);
  3863. bssl::UniquePtr<SSL> client, server;
  3864. EXPECT_FALSE(ConnectClientAndServer(&client, &server, client_ctx_.get(),
  3865. server_ctx_.get()));
  3866. }
  3867. // Test that ticket-based sessions on the client get fake session IDs.
  3868. TEST_P(SSLVersionTest, FakeIDsForTickets) {
  3869. SSL_CTX_set_session_cache_mode(client_ctx_.get(), SSL_SESS_CACHE_BOTH);
  3870. SSL_CTX_set_session_cache_mode(server_ctx_.get(), SSL_SESS_CACHE_BOTH);
  3871. bssl::UniquePtr<SSL_SESSION> session =
  3872. CreateClientSession(client_ctx_.get(), server_ctx_.get());
  3873. ASSERT_TRUE(session);
  3874. EXPECT_TRUE(SSL_SESSION_has_ticket(session.get()));
  3875. unsigned session_id_length;
  3876. SSL_SESSION_get_id(session.get(), &session_id_length);
  3877. EXPECT_NE(session_id_length, 0u);
  3878. }
  3879. // These tests test multi-threaded behavior. They are intended to run with
  3880. // ThreadSanitizer.
  3881. #if defined(OPENSSL_THREADS)
  3882. TEST_P(SSLVersionTest, SessionCacheThreads) {
  3883. SSL_CTX_set_options(server_ctx_.get(), SSL_OP_NO_TICKET);
  3884. SSL_CTX_set_session_cache_mode(client_ctx_.get(), SSL_SESS_CACHE_BOTH);
  3885. SSL_CTX_set_session_cache_mode(server_ctx_.get(), SSL_SESS_CACHE_BOTH);
  3886. if (version() == TLS1_3_VERSION) {
  3887. // Our TLS 1.3 implementation does not support stateful resumption.
  3888. ASSERT_FALSE(CreateClientSession(client_ctx_.get(), server_ctx_.get()));
  3889. return;
  3890. }
  3891. // Establish two client sessions to test with.
  3892. bssl::UniquePtr<SSL_SESSION> session1 =
  3893. CreateClientSession(client_ctx_.get(), server_ctx_.get());
  3894. ASSERT_TRUE(session1);
  3895. bssl::UniquePtr<SSL_SESSION> session2 =
  3896. CreateClientSession(client_ctx_.get(), server_ctx_.get());
  3897. ASSERT_TRUE(session2);
  3898. auto connect_with_session = [&](SSL_SESSION *session) {
  3899. ClientConfig config;
  3900. config.session = session;
  3901. UniquePtr<SSL> client, server;
  3902. EXPECT_TRUE(ConnectClientAndServer(&client, &server, client_ctx_.get(),
  3903. server_ctx_.get(), config));
  3904. };
  3905. // Resume sessions in parallel with establishing new ones.
  3906. {
  3907. std::vector<std::thread> threads;
  3908. threads.emplace_back([&] { connect_with_session(nullptr); });
  3909. threads.emplace_back([&] { connect_with_session(nullptr); });
  3910. threads.emplace_back([&] { connect_with_session(session1.get()); });
  3911. threads.emplace_back([&] { connect_with_session(session1.get()); });
  3912. threads.emplace_back([&] { connect_with_session(session2.get()); });
  3913. threads.emplace_back([&] { connect_with_session(session2.get()); });
  3914. for (auto &thread : threads) {
  3915. thread.join();
  3916. }
  3917. }
  3918. // Hit the maximum session cache size across multiple threads
  3919. size_t limit = SSL_CTX_sess_number(server_ctx_.get()) + 2;
  3920. SSL_CTX_sess_set_cache_size(server_ctx_.get(), limit);
  3921. {
  3922. std::vector<std::thread> threads;
  3923. for (int i = 0; i < 4; i++) {
  3924. threads.emplace_back([&]() {
  3925. connect_with_session(nullptr);
  3926. EXPECT_LE(SSL_CTX_sess_number(server_ctx_.get()), limit);
  3927. });
  3928. }
  3929. for (auto &thread : threads) {
  3930. thread.join();
  3931. }
  3932. EXPECT_EQ(SSL_CTX_sess_number(server_ctx_.get()), limit);
  3933. }
  3934. }
  3935. TEST_P(SSLVersionTest, SessionTicketThreads) {
  3936. for (bool renew_ticket : {false, true}) {
  3937. SCOPED_TRACE(renew_ticket);
  3938. ResetContexts();
  3939. SSL_CTX_set_session_cache_mode(client_ctx_.get(), SSL_SESS_CACHE_BOTH);
  3940. SSL_CTX_set_session_cache_mode(server_ctx_.get(), SSL_SESS_CACHE_BOTH);
  3941. if (renew_ticket) {
  3942. SSL_CTX_set_tlsext_ticket_key_cb(server_ctx_.get(), RenewTicketCallback);
  3943. }
  3944. // Establish two client sessions to test with.
  3945. bssl::UniquePtr<SSL_SESSION> session1 =
  3946. CreateClientSession(client_ctx_.get(), server_ctx_.get());
  3947. ASSERT_TRUE(session1);
  3948. bssl::UniquePtr<SSL_SESSION> session2 =
  3949. CreateClientSession(client_ctx_.get(), server_ctx_.get());
  3950. ASSERT_TRUE(session2);
  3951. auto connect_with_session = [&](SSL_SESSION *session) {
  3952. ClientConfig config;
  3953. config.session = session;
  3954. UniquePtr<SSL> client, server;
  3955. EXPECT_TRUE(ConnectClientAndServer(&client, &server, client_ctx_.get(),
  3956. server_ctx_.get(), config));
  3957. };
  3958. // Resume sessions in parallel with establishing new ones.
  3959. {
  3960. std::vector<std::thread> threads;
  3961. threads.emplace_back([&] { connect_with_session(nullptr); });
  3962. threads.emplace_back([&] { connect_with_session(nullptr); });
  3963. threads.emplace_back([&] { connect_with_session(session1.get()); });
  3964. threads.emplace_back([&] { connect_with_session(session1.get()); });
  3965. threads.emplace_back([&] { connect_with_session(session2.get()); });
  3966. threads.emplace_back([&] { connect_with_session(session2.get()); });
  3967. for (auto &thread : threads) {
  3968. thread.join();
  3969. }
  3970. }
  3971. }
  3972. }
  3973. // SSL_CTX_get0_certificate needs to lock internally. Test this works.
  3974. TEST(SSLTest, GetCertificateThreads) {
  3975. bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
  3976. ASSERT_TRUE(ctx);
  3977. bssl::UniquePtr<X509> cert = GetTestCertificate();
  3978. ASSERT_TRUE(cert);
  3979. ASSERT_TRUE(SSL_CTX_use_certificate(ctx.get(), cert.get()));
  3980. // Existing code expects |SSL_CTX_get0_certificate| to be callable from two
  3981. // threads concurrently. It originally was an immutable operation. Now we
  3982. // implement it with a thread-safe cache, so it is worth testing.
  3983. X509 *cert2_thread;
  3984. std::thread thread(
  3985. [&] { cert2_thread = SSL_CTX_get0_certificate(ctx.get()); });
  3986. X509 *cert2 = SSL_CTX_get0_certificate(ctx.get());
  3987. thread.join();
  3988. EXPECT_EQ(cert2, cert2_thread);
  3989. EXPECT_EQ(0, X509_cmp(cert.get(), cert2));
  3990. }
  3991. // Functions which access properties on the negotiated session are thread-safe
  3992. // where needed. Prior to TLS 1.3, clients resuming sessions and servers
  3993. // performing stateful resumption will share an underlying SSL_SESSION object,
  3994. // potentially across threads.
  3995. TEST_P(SSLVersionTest, SessionPropertiesThreads) {
  3996. if (version() == TLS1_3_VERSION) {
  3997. // Our TLS 1.3 implementation does not support stateful resumption.
  3998. ASSERT_FALSE(CreateClientSession(client_ctx_.get(), server_ctx_.get()));
  3999. return;
  4000. }
  4001. SSL_CTX_set_options(server_ctx_.get(), SSL_OP_NO_TICKET);
  4002. SSL_CTX_set_session_cache_mode(client_ctx_.get(), SSL_SESS_CACHE_BOTH);
  4003. SSL_CTX_set_session_cache_mode(server_ctx_.get(), SSL_SESS_CACHE_BOTH);
  4004. ASSERT_TRUE(UseCertAndKey(client_ctx_.get()));
  4005. ASSERT_TRUE(UseCertAndKey(server_ctx_.get()));
  4006. // Configure mutual authentication, so we have more session state.
  4007. SSL_CTX_set_custom_verify(
  4008. client_ctx_.get(), SSL_VERIFY_PEER,
  4009. [](SSL *ssl, uint8_t *out_alert) { return ssl_verify_ok; });
  4010. SSL_CTX_set_custom_verify(
  4011. server_ctx_.get(), SSL_VERIFY_PEER,
  4012. [](SSL *ssl, uint8_t *out_alert) { return ssl_verify_ok; });
  4013. // Establish a client session to test with.
  4014. bssl::UniquePtr<SSL_SESSION> session =
  4015. CreateClientSession(client_ctx_.get(), server_ctx_.get());
  4016. ASSERT_TRUE(session);
  4017. // Resume with it twice.
  4018. UniquePtr<SSL> ssls[4];
  4019. ClientConfig config;
  4020. config.session = session.get();
  4021. ASSERT_TRUE(ConnectClientAndServer(&ssls[0], &ssls[1], client_ctx_.get(),
  4022. server_ctx_.get(), config));
  4023. ASSERT_TRUE(ConnectClientAndServer(&ssls[2], &ssls[3], client_ctx_.get(),
  4024. server_ctx_.get(), config));
  4025. // Read properties in parallel.
  4026. auto read_properties = [](const SSL *ssl) {
  4027. EXPECT_TRUE(SSL_get_peer_cert_chain(ssl));
  4028. bssl::UniquePtr<X509> peer(SSL_get_peer_certificate(ssl));
  4029. EXPECT_TRUE(peer);
  4030. EXPECT_TRUE(SSL_get_current_cipher(ssl));
  4031. EXPECT_TRUE(SSL_get_curve_id(ssl));
  4032. };
  4033. std::vector<std::thread> threads;
  4034. for (const auto &ssl_ptr : ssls) {
  4035. const SSL *ssl = ssl_ptr.get();
  4036. threads.emplace_back([=] { read_properties(ssl); });
  4037. }
  4038. for (auto &thread : threads) {
  4039. thread.join();
  4040. }
  4041. }
  4042. #endif // OPENSSL_THREADS
  4043. constexpr size_t kNumQUICLevels = 4;
  4044. static_assert(ssl_encryption_initial < kNumQUICLevels,
  4045. "kNumQUICLevels is wrong");
  4046. static_assert(ssl_encryption_early_data < kNumQUICLevels,
  4047. "kNumQUICLevels is wrong");
  4048. static_assert(ssl_encryption_handshake < kNumQUICLevels,
  4049. "kNumQUICLevels is wrong");
  4050. static_assert(ssl_encryption_application < kNumQUICLevels,
  4051. "kNumQUICLevels is wrong");
  4052. class MockQUICTransport {
  4053. public:
  4054. enum class Role { kClient, kServer };
  4055. explicit MockQUICTransport(Role role) : role_(role) {
  4056. // The caller is expected to configure initial secrets.
  4057. levels_[ssl_encryption_initial].write_secret = {1};
  4058. levels_[ssl_encryption_initial].read_secret = {1};
  4059. }
  4060. void set_peer(MockQUICTransport *peer) { peer_ = peer; }
  4061. bool has_alert() const { return has_alert_; }
  4062. ssl_encryption_level_t alert_level() const { return alert_level_; }
  4063. uint8_t alert() const { return alert_; }
  4064. bool PeerSecretsMatch(ssl_encryption_level_t level) const {
  4065. return levels_[level].write_secret == peer_->levels_[level].read_secret &&
  4066. levels_[level].read_secret == peer_->levels_[level].write_secret &&
  4067. levels_[level].cipher == peer_->levels_[level].cipher;
  4068. }
  4069. bool HasSecrets(ssl_encryption_level_t level) const {
  4070. return !levels_[level].write_secret.empty() ||
  4071. !levels_[level].read_secret.empty();
  4072. }
  4073. bool SetEncryptionSecrets(ssl_encryption_level_t level,
  4074. const uint8_t *read_secret,
  4075. const uint8_t *write_secret, size_t secret_len,
  4076. const SSL_CIPHER *cipher) {
  4077. if (HasSecrets(level)) {
  4078. ADD_FAILURE() << "duplicate keys configured";
  4079. return false;
  4080. }
  4081. if (cipher == nullptr) {
  4082. ADD_FAILURE() << "current cipher unavailable";
  4083. return false;
  4084. }
  4085. bool expect_read_secret = true, expect_write_secret = true;
  4086. if (level == ssl_encryption_early_data) {
  4087. if (role_ == Role::kClient) {
  4088. expect_read_secret = false;
  4089. } else {
  4090. expect_write_secret = false;
  4091. }
  4092. }
  4093. if (expect_read_secret) {
  4094. if (read_secret == nullptr) {
  4095. ADD_FAILURE() << "read secret was unexpectedly null";
  4096. return false;
  4097. }
  4098. levels_[level].read_secret.assign(read_secret, read_secret + secret_len);
  4099. } else if (read_secret != nullptr) {
  4100. ADD_FAILURE() << "unexpected read secret";
  4101. return false;
  4102. }
  4103. if (expect_write_secret) {
  4104. if (write_secret == nullptr) {
  4105. ADD_FAILURE() << "write secret was unexpectedly null";
  4106. return false;
  4107. }
  4108. levels_[level].write_secret.assign(write_secret,
  4109. write_secret + secret_len);
  4110. } else if (write_secret != nullptr) {
  4111. ADD_FAILURE() << "unexpected write secret";
  4112. return false;
  4113. }
  4114. levels_[level].cipher = SSL_CIPHER_get_id(cipher);
  4115. return true;
  4116. }
  4117. bool WriteHandshakeData(ssl_encryption_level_t level,
  4118. Span<const uint8_t> data) {
  4119. if (levels_[level].write_secret.empty()) {
  4120. ADD_FAILURE() << "data written before keys configured";
  4121. return false;
  4122. }
  4123. levels_[level].write_data.insert(levels_[level].write_data.end(),
  4124. data.begin(), data.end());
  4125. return true;
  4126. }
  4127. bool SendAlert(ssl_encryption_level_t level, uint8_t alert_value) {
  4128. if (has_alert_) {
  4129. ADD_FAILURE() << "duplicate alert sent";
  4130. return false;
  4131. }
  4132. if (levels_[level].write_secret.empty()) {
  4133. ADD_FAILURE() << "alert sent before keys configured";
  4134. return false;
  4135. }
  4136. has_alert_ = true;
  4137. alert_level_ = level;
  4138. alert_ = alert_value;
  4139. return true;
  4140. }
  4141. bool ReadHandshakeData(std::vector<uint8_t> *out,
  4142. ssl_encryption_level_t level,
  4143. size_t num = std::numeric_limits<size_t>::max()) {
  4144. if (levels_[level].read_secret.empty()) {
  4145. ADD_FAILURE() << "data read before keys configured in level " << level;
  4146. return false;
  4147. }
  4148. // The peer may not have configured any keys yet.
  4149. if (peer_->levels_[level].write_secret.empty()) {
  4150. out->clear();
  4151. return true;
  4152. }
  4153. // Check the peer computed the same key.
  4154. if (peer_->levels_[level].write_secret != levels_[level].read_secret) {
  4155. ADD_FAILURE() << "peer write key does not match read key in level "
  4156. << level;
  4157. return false;
  4158. }
  4159. if (peer_->levels_[level].cipher != levels_[level].cipher) {
  4160. ADD_FAILURE() << "peer cipher does not match in level " << level;
  4161. return false;
  4162. }
  4163. std::vector<uint8_t> *peer_data = &peer_->levels_[level].write_data;
  4164. num = std::min(num, peer_data->size());
  4165. out->assign(peer_data->begin(), peer_data->begin() + num);
  4166. peer_data->erase(peer_data->begin(), peer_data->begin() + num);
  4167. return true;
  4168. }
  4169. private:
  4170. Role role_;
  4171. MockQUICTransport *peer_ = nullptr;
  4172. bool has_alert_ = false;
  4173. ssl_encryption_level_t alert_level_ = ssl_encryption_initial;
  4174. uint8_t alert_ = 0;
  4175. struct Level {
  4176. std::vector<uint8_t> write_data;
  4177. std::vector<uint8_t> write_secret;
  4178. std::vector<uint8_t> read_secret;
  4179. uint32_t cipher = 0;
  4180. };
  4181. Level levels_[kNumQUICLevels];
  4182. };
  4183. class MockQUICTransportPair {
  4184. public:
  4185. MockQUICTransportPair()
  4186. : client_(MockQUICTransport::Role::kClient),
  4187. server_(MockQUICTransport::Role::kServer) {
  4188. client_.set_peer(&server_);
  4189. server_.set_peer(&client_);
  4190. }
  4191. ~MockQUICTransportPair() {
  4192. client_.set_peer(nullptr);
  4193. server_.set_peer(nullptr);
  4194. }
  4195. MockQUICTransport *client() { return &client_; }
  4196. MockQUICTransport *server() { return &server_; }
  4197. bool SecretsMatch(ssl_encryption_level_t level) const {
  4198. return client_.HasSecrets(level) && server_.HasSecrets(level) &&
  4199. client_.PeerSecretsMatch(level);
  4200. }
  4201. private:
  4202. MockQUICTransport client_;
  4203. MockQUICTransport server_;
  4204. };
  4205. class QUICMethodTest : public testing::Test {
  4206. protected:
  4207. void SetUp() override {
  4208. client_ctx_.reset(SSL_CTX_new(TLS_method()));
  4209. server_ctx_.reset(SSL_CTX_new(TLS_method()));
  4210. ASSERT_TRUE(client_ctx_);
  4211. ASSERT_TRUE(server_ctx_);
  4212. bssl::UniquePtr<X509> cert = GetTestCertificate();
  4213. bssl::UniquePtr<EVP_PKEY> key = GetTestKey();
  4214. ASSERT_TRUE(cert);
  4215. ASSERT_TRUE(key);
  4216. ASSERT_TRUE(SSL_CTX_use_certificate(server_ctx_.get(), cert.get()));
  4217. ASSERT_TRUE(SSL_CTX_use_PrivateKey(server_ctx_.get(), key.get()));
  4218. SSL_CTX_set_min_proto_version(server_ctx_.get(), TLS1_3_VERSION);
  4219. SSL_CTX_set_max_proto_version(server_ctx_.get(), TLS1_3_VERSION);
  4220. SSL_CTX_set_min_proto_version(client_ctx_.get(), TLS1_3_VERSION);
  4221. SSL_CTX_set_max_proto_version(client_ctx_.get(), TLS1_3_VERSION);
  4222. }
  4223. static MockQUICTransport *TransportFromSSL(const SSL *ssl) {
  4224. return ex_data_.Get(ssl);
  4225. }
  4226. static bool ProvideHandshakeData(
  4227. SSL *ssl, size_t num = std::numeric_limits<size_t>::max()) {
  4228. MockQUICTransport *transport = TransportFromSSL(ssl);
  4229. ssl_encryption_level_t level = SSL_quic_read_level(ssl);
  4230. std::vector<uint8_t> data;
  4231. return transport->ReadHandshakeData(&data, level, num) &&
  4232. SSL_provide_quic_data(ssl, level, data.data(), data.size());
  4233. }
  4234. bool CreateClientAndServer() {
  4235. client_.reset(SSL_new(client_ctx_.get()));
  4236. server_.reset(SSL_new(server_ctx_.get()));
  4237. if (!client_ || !server_) {
  4238. return false;
  4239. }
  4240. SSL_set_connect_state(client_.get());
  4241. SSL_set_accept_state(server_.get());
  4242. transport_.reset(new MockQUICTransportPair);
  4243. ex_data_.Set(client_.get(), transport_->client());
  4244. ex_data_.Set(server_.get(), transport_->server());
  4245. return true;
  4246. }
  4247. // CompleteHandshakesForQUIC runs |SSL_do_handshake| on |client_| and
  4248. // |server_| until each completes once. It returns true on success and false
  4249. // on failure.
  4250. bool CompleteHandshakesForQUIC() {
  4251. bool client_done = false, server_done = false;
  4252. while (!client_done || !server_done) {
  4253. if (!client_done) {
  4254. if (!ProvideHandshakeData(client_.get())) {
  4255. ADD_FAILURE() << "ProvideHandshakeData(client_) failed";
  4256. return false;
  4257. }
  4258. int client_ret = SSL_do_handshake(client_.get());
  4259. if (client_ret == 1) {
  4260. client_done = true;
  4261. } else {
  4262. EXPECT_EQ(client_ret, -1);
  4263. EXPECT_EQ(SSL_get_error(client_.get(), client_ret),
  4264. SSL_ERROR_WANT_READ);
  4265. }
  4266. }
  4267. if (!server_done) {
  4268. if (!ProvideHandshakeData(server_.get())) {
  4269. ADD_FAILURE() << "ProvideHandshakeData(server_) failed";
  4270. return false;
  4271. }
  4272. int server_ret = SSL_do_handshake(server_.get());
  4273. if (server_ret == 1) {
  4274. server_done = true;
  4275. } else {
  4276. EXPECT_EQ(server_ret, -1);
  4277. EXPECT_EQ(SSL_get_error(server_.get(), server_ret),
  4278. SSL_ERROR_WANT_READ);
  4279. }
  4280. }
  4281. }
  4282. return true;
  4283. }
  4284. bssl::UniquePtr<SSL_SESSION> CreateClientSessionForQUIC() {
  4285. g_last_session = nullptr;
  4286. SSL_CTX_sess_set_new_cb(client_ctx_.get(), SaveLastSession);
  4287. if (!CreateClientAndServer() ||
  4288. !CompleteHandshakesForQUIC()) {
  4289. return nullptr;
  4290. }
  4291. // The server sent NewSessionTicket messages in the handshake.
  4292. if (!ProvideHandshakeData(client_.get()) ||
  4293. !SSL_process_quic_post_handshake(client_.get())) {
  4294. return nullptr;
  4295. }
  4296. return std::move(g_last_session);
  4297. }
  4298. void ExpectHandshakeSuccess() {
  4299. EXPECT_TRUE(transport_->SecretsMatch(ssl_encryption_application));
  4300. EXPECT_EQ(ssl_encryption_application, SSL_quic_read_level(client_.get()));
  4301. EXPECT_EQ(ssl_encryption_application, SSL_quic_write_level(client_.get()));
  4302. EXPECT_EQ(ssl_encryption_application, SSL_quic_read_level(server_.get()));
  4303. EXPECT_EQ(ssl_encryption_application, SSL_quic_write_level(server_.get()));
  4304. EXPECT_FALSE(transport_->client()->has_alert());
  4305. EXPECT_FALSE(transport_->server()->has_alert());
  4306. // SSL_do_handshake is now idempotent.
  4307. EXPECT_EQ(SSL_do_handshake(client_.get()), 1);
  4308. EXPECT_EQ(SSL_do_handshake(server_.get()), 1);
  4309. }
  4310. // The following functions may be configured on an |SSL_QUIC_METHOD| as
  4311. // default implementations.
  4312. static int SetEncryptionSecretsCallback(SSL *ssl,
  4313. ssl_encryption_level_t level,
  4314. const uint8_t *read_key,
  4315. const uint8_t *write_key,
  4316. size_t key_len) {
  4317. return TransportFromSSL(ssl)->SetEncryptionSecrets(
  4318. level, read_key, write_key, key_len, SSL_get_current_cipher(ssl));
  4319. }
  4320. static int AddHandshakeDataCallback(SSL *ssl,
  4321. enum ssl_encryption_level_t level,
  4322. const uint8_t *data, size_t len) {
  4323. EXPECT_EQ(level, SSL_quic_write_level(ssl));
  4324. return TransportFromSSL(ssl)->WriteHandshakeData(level,
  4325. MakeConstSpan(data, len));
  4326. }
  4327. static int FlushFlightCallback(SSL *ssl) { return 1; }
  4328. static int SendAlertCallback(SSL *ssl, ssl_encryption_level_t level,
  4329. uint8_t alert) {
  4330. EXPECT_EQ(level, SSL_quic_write_level(ssl));
  4331. return TransportFromSSL(ssl)->SendAlert(level, alert);
  4332. }
  4333. bssl::UniquePtr<SSL_CTX> client_ctx_;
  4334. bssl::UniquePtr<SSL_CTX> server_ctx_;
  4335. static UnownedSSLExData<MockQUICTransport> ex_data_;
  4336. std::unique_ptr<MockQUICTransportPair> transport_;
  4337. bssl::UniquePtr<SSL> client_;
  4338. bssl::UniquePtr<SSL> server_;
  4339. };
  4340. UnownedSSLExData<MockQUICTransport> QUICMethodTest::ex_data_;
  4341. // Test a full handshake and resumption work.
  4342. TEST_F(QUICMethodTest, Basic) {
  4343. const SSL_QUIC_METHOD quic_method = {
  4344. SetEncryptionSecretsCallback,
  4345. AddHandshakeDataCallback,
  4346. FlushFlightCallback,
  4347. SendAlertCallback,
  4348. };
  4349. g_last_session = nullptr;
  4350. SSL_CTX_set_session_cache_mode(client_ctx_.get(), SSL_SESS_CACHE_BOTH);
  4351. SSL_CTX_sess_set_new_cb(client_ctx_.get(), SaveLastSession);
  4352. ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
  4353. ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
  4354. ASSERT_TRUE(CreateClientAndServer());
  4355. ASSERT_TRUE(CompleteHandshakesForQUIC());
  4356. ExpectHandshakeSuccess();
  4357. EXPECT_FALSE(SSL_session_reused(client_.get()));
  4358. EXPECT_FALSE(SSL_session_reused(server_.get()));
  4359. // The server sent NewSessionTicket messages in the handshake.
  4360. EXPECT_FALSE(g_last_session);
  4361. ASSERT_TRUE(ProvideHandshakeData(client_.get()));
  4362. EXPECT_EQ(SSL_process_quic_post_handshake(client_.get()), 1);
  4363. EXPECT_TRUE(g_last_session);
  4364. // Create a second connection to verify resumption works.
  4365. ASSERT_TRUE(CreateClientAndServer());
  4366. bssl::UniquePtr<SSL_SESSION> session = std::move(g_last_session);
  4367. SSL_set_session(client_.get(), session.get());
  4368. ASSERT_TRUE(CompleteHandshakesForQUIC());
  4369. ExpectHandshakeSuccess();
  4370. EXPECT_TRUE(SSL_session_reused(client_.get()));
  4371. EXPECT_TRUE(SSL_session_reused(server_.get()));
  4372. }
  4373. // Test that HelloRetryRequest in QUIC works.
  4374. TEST_F(QUICMethodTest, HelloRetryRequest) {
  4375. const SSL_QUIC_METHOD quic_method = {
  4376. SetEncryptionSecretsCallback,
  4377. AddHandshakeDataCallback,
  4378. FlushFlightCallback,
  4379. SendAlertCallback,
  4380. };
  4381. ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
  4382. ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
  4383. // BoringSSL predicts the most preferred curve, so using different preferences
  4384. // will trigger HelloRetryRequest.
  4385. static const int kClientPrefs[] = {NID_X25519, NID_X9_62_prime256v1};
  4386. ASSERT_TRUE(SSL_CTX_set1_curves(client_ctx_.get(), kClientPrefs,
  4387. OPENSSL_ARRAY_SIZE(kClientPrefs)));
  4388. static const int kServerPrefs[] = {NID_X9_62_prime256v1, NID_X25519};
  4389. ASSERT_TRUE(SSL_CTX_set1_curves(server_ctx_.get(), kServerPrefs,
  4390. OPENSSL_ARRAY_SIZE(kServerPrefs)));
  4391. ASSERT_TRUE(CreateClientAndServer());
  4392. ASSERT_TRUE(CompleteHandshakesForQUIC());
  4393. ExpectHandshakeSuccess();
  4394. }
  4395. TEST_F(QUICMethodTest, ZeroRTTAccept) {
  4396. const SSL_QUIC_METHOD quic_method = {
  4397. SetEncryptionSecretsCallback,
  4398. AddHandshakeDataCallback,
  4399. FlushFlightCallback,
  4400. SendAlertCallback,
  4401. };
  4402. SSL_CTX_set_session_cache_mode(client_ctx_.get(), SSL_SESS_CACHE_BOTH);
  4403. SSL_CTX_set_early_data_enabled(client_ctx_.get(), 1);
  4404. SSL_CTX_set_early_data_enabled(server_ctx_.get(), 1);
  4405. ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
  4406. ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
  4407. bssl::UniquePtr<SSL_SESSION> session = CreateClientSessionForQUIC();
  4408. ASSERT_TRUE(session);
  4409. ASSERT_TRUE(CreateClientAndServer());
  4410. SSL_set_session(client_.get(), session.get());
  4411. // The client handshake should return immediately into the early data state.
  4412. ASSERT_EQ(SSL_do_handshake(client_.get()), 1);
  4413. EXPECT_TRUE(SSL_in_early_data(client_.get()));
  4414. // The transport should have keys for sending 0-RTT data.
  4415. EXPECT_TRUE(
  4416. transport_->client()->HasSecrets(ssl_encryption_early_data));
  4417. // The server will consume the ClientHello and also enter the early data
  4418. // state.
  4419. ASSERT_TRUE(ProvideHandshakeData(server_.get()));
  4420. ASSERT_EQ(SSL_do_handshake(server_.get()), 1);
  4421. EXPECT_TRUE(SSL_in_early_data(server_.get()));
  4422. EXPECT_TRUE(transport_->SecretsMatch(ssl_encryption_early_data));
  4423. // The transport should have keys for sending half-RTT data.
  4424. EXPECT_TRUE(
  4425. transport_->server()->HasSecrets(ssl_encryption_application));
  4426. // Finish up the client and server handshakes.
  4427. ASSERT_TRUE(CompleteHandshakesForQUIC());
  4428. // Both sides can now exchange 1-RTT data.
  4429. ExpectHandshakeSuccess();
  4430. EXPECT_TRUE(SSL_session_reused(client_.get()));
  4431. EXPECT_TRUE(SSL_session_reused(server_.get()));
  4432. EXPECT_FALSE(SSL_in_early_data(client_.get()));
  4433. EXPECT_FALSE(SSL_in_early_data(server_.get()));
  4434. EXPECT_TRUE(SSL_early_data_accepted(client_.get()));
  4435. EXPECT_TRUE(SSL_early_data_accepted(server_.get()));
  4436. }
  4437. TEST_F(QUICMethodTest, ZeroRTTReject) {
  4438. const SSL_QUIC_METHOD quic_method = {
  4439. SetEncryptionSecretsCallback,
  4440. AddHandshakeDataCallback,
  4441. FlushFlightCallback,
  4442. SendAlertCallback,
  4443. };
  4444. SSL_CTX_set_session_cache_mode(client_ctx_.get(), SSL_SESS_CACHE_BOTH);
  4445. SSL_CTX_set_early_data_enabled(client_ctx_.get(), 1);
  4446. SSL_CTX_set_early_data_enabled(server_ctx_.get(), 1);
  4447. ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
  4448. ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
  4449. bssl::UniquePtr<SSL_SESSION> session = CreateClientSessionForQUIC();
  4450. ASSERT_TRUE(session);
  4451. for (bool reject_hrr : {false, true}) {
  4452. SCOPED_TRACE(reject_hrr);
  4453. ASSERT_TRUE(CreateClientAndServer());
  4454. if (reject_hrr) {
  4455. // Configure the server to prefer P-256, which will reject 0-RTT via
  4456. // HelloRetryRequest.
  4457. int p256 = NID_X9_62_prime256v1;
  4458. ASSERT_TRUE(SSL_set1_curves(server_.get(), &p256, 1));
  4459. } else {
  4460. // Disable 0-RTT on the server, so it will reject it.
  4461. SSL_set_early_data_enabled(server_.get(), 0);
  4462. }
  4463. SSL_set_session(client_.get(), session.get());
  4464. // The client handshake should return immediately into the early data state.
  4465. ASSERT_EQ(SSL_do_handshake(client_.get()), 1);
  4466. EXPECT_TRUE(SSL_in_early_data(client_.get()));
  4467. // The transport should have keys for sending 0-RTT data.
  4468. EXPECT_TRUE(transport_->client()->HasSecrets(ssl_encryption_early_data));
  4469. // The server will consume the ClientHello, but it will not accept 0-RTT.
  4470. ASSERT_TRUE(ProvideHandshakeData(server_.get()));
  4471. ASSERT_EQ(SSL_do_handshake(server_.get()), -1);
  4472. EXPECT_EQ(SSL_ERROR_WANT_READ, SSL_get_error(server_.get(), -1));
  4473. EXPECT_FALSE(SSL_in_early_data(server_.get()));
  4474. EXPECT_FALSE(transport_->server()->HasSecrets(ssl_encryption_early_data));
  4475. // The client consumes the server response and signals 0-RTT rejection.
  4476. for (;;) {
  4477. ASSERT_TRUE(ProvideHandshakeData(client_.get()));
  4478. ASSERT_EQ(-1, SSL_do_handshake(client_.get()));
  4479. int err = SSL_get_error(client_.get(), -1);
  4480. if (err == SSL_ERROR_EARLY_DATA_REJECTED) {
  4481. break;
  4482. }
  4483. ASSERT_EQ(SSL_ERROR_WANT_READ, err);
  4484. }
  4485. // As in TLS over TCP, 0-RTT rejection is sticky.
  4486. ASSERT_EQ(-1, SSL_do_handshake(client_.get()));
  4487. ASSERT_EQ(SSL_ERROR_EARLY_DATA_REJECTED, SSL_get_error(client_.get(), -1));
  4488. // Finish up the client and server handshakes.
  4489. SSL_reset_early_data_reject(client_.get());
  4490. ASSERT_TRUE(CompleteHandshakesForQUIC());
  4491. // Both sides can now exchange 1-RTT data.
  4492. ExpectHandshakeSuccess();
  4493. EXPECT_TRUE(SSL_session_reused(client_.get()));
  4494. EXPECT_TRUE(SSL_session_reused(server_.get()));
  4495. EXPECT_FALSE(SSL_in_early_data(client_.get()));
  4496. EXPECT_FALSE(SSL_in_early_data(server_.get()));
  4497. EXPECT_FALSE(SSL_early_data_accepted(client_.get()));
  4498. EXPECT_FALSE(SSL_early_data_accepted(server_.get()));
  4499. }
  4500. }
  4501. // Test only releasing data to QUIC one byte at a time on request, to maximize
  4502. // state machine pauses. Additionally, test that existing asynchronous callbacks
  4503. // still work.
  4504. TEST_F(QUICMethodTest, Async) {
  4505. const SSL_QUIC_METHOD quic_method = {
  4506. SetEncryptionSecretsCallback,
  4507. AddHandshakeDataCallback,
  4508. FlushFlightCallback,
  4509. SendAlertCallback,
  4510. };
  4511. ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
  4512. ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
  4513. ASSERT_TRUE(CreateClientAndServer());
  4514. // Install an asynchronous certificate callback.
  4515. bool cert_cb_ok = false;
  4516. SSL_set_cert_cb(server_.get(),
  4517. [](SSL *, void *arg) -> int {
  4518. return *static_cast<bool *>(arg) ? 1 : -1;
  4519. },
  4520. &cert_cb_ok);
  4521. for (;;) {
  4522. int client_ret = SSL_do_handshake(client_.get());
  4523. if (client_ret != 1) {
  4524. ASSERT_EQ(client_ret, -1);
  4525. ASSERT_EQ(SSL_get_error(client_.get(), client_ret), SSL_ERROR_WANT_READ);
  4526. ASSERT_TRUE(ProvideHandshakeData(client_.get(), 1));
  4527. }
  4528. int server_ret = SSL_do_handshake(server_.get());
  4529. if (server_ret != 1) {
  4530. ASSERT_EQ(server_ret, -1);
  4531. int ssl_err = SSL_get_error(server_.get(), server_ret);
  4532. switch (ssl_err) {
  4533. case SSL_ERROR_WANT_READ:
  4534. ASSERT_TRUE(ProvideHandshakeData(server_.get(), 1));
  4535. break;
  4536. case SSL_ERROR_WANT_X509_LOOKUP:
  4537. ASSERT_FALSE(cert_cb_ok);
  4538. cert_cb_ok = true;
  4539. break;
  4540. default:
  4541. FAIL() << "Unexpected SSL_get_error result: " << ssl_err;
  4542. }
  4543. }
  4544. if (client_ret == 1 && server_ret == 1) {
  4545. break;
  4546. }
  4547. }
  4548. ExpectHandshakeSuccess();
  4549. }
  4550. // Test buffering write data until explicit flushes.
  4551. TEST_F(QUICMethodTest, Buffered) {
  4552. struct BufferedFlight {
  4553. std::vector<uint8_t> data[kNumQUICLevels];
  4554. };
  4555. static UnownedSSLExData<BufferedFlight> buffered_flights;
  4556. auto add_handshake_data = [](SSL *ssl, enum ssl_encryption_level_t level,
  4557. const uint8_t *data, size_t len) -> int {
  4558. BufferedFlight *flight = buffered_flights.Get(ssl);
  4559. flight->data[level].insert(flight->data[level].end(), data, data + len);
  4560. return 1;
  4561. };
  4562. auto flush_flight = [](SSL *ssl) -> int {
  4563. BufferedFlight *flight = buffered_flights.Get(ssl);
  4564. for (size_t level = 0; level < kNumQUICLevels; level++) {
  4565. if (!flight->data[level].empty()) {
  4566. if (!TransportFromSSL(ssl)->WriteHandshakeData(
  4567. static_cast<ssl_encryption_level_t>(level),
  4568. flight->data[level])) {
  4569. return 0;
  4570. }
  4571. flight->data[level].clear();
  4572. }
  4573. }
  4574. return 1;
  4575. };
  4576. const SSL_QUIC_METHOD quic_method = {
  4577. SetEncryptionSecretsCallback,
  4578. add_handshake_data,
  4579. flush_flight,
  4580. SendAlertCallback,
  4581. };
  4582. ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
  4583. ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
  4584. ASSERT_TRUE(CreateClientAndServer());
  4585. BufferedFlight client_flight, server_flight;
  4586. buffered_flights.Set(client_.get(), &client_flight);
  4587. buffered_flights.Set(server_.get(), &server_flight);
  4588. ASSERT_TRUE(CompleteHandshakesForQUIC());
  4589. ExpectHandshakeSuccess();
  4590. }
  4591. // Test that excess data at one level is rejected. That is, if a single
  4592. // |SSL_provide_quic_data| call included both ServerHello and
  4593. // EncryptedExtensions in a single chunk, BoringSSL notices and rejects this on
  4594. // key change.
  4595. TEST_F(QUICMethodTest, ExcessProvidedData) {
  4596. auto add_handshake_data = [](SSL *ssl, enum ssl_encryption_level_t level,
  4597. const uint8_t *data, size_t len) -> int {
  4598. // Switch everything to the initial level.
  4599. return TransportFromSSL(ssl)->WriteHandshakeData(ssl_encryption_initial,
  4600. MakeConstSpan(data, len));
  4601. };
  4602. const SSL_QUIC_METHOD quic_method = {
  4603. SetEncryptionSecretsCallback,
  4604. add_handshake_data,
  4605. FlushFlightCallback,
  4606. SendAlertCallback,
  4607. };
  4608. ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
  4609. ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
  4610. ASSERT_TRUE(CreateClientAndServer());
  4611. // Send the ClientHello and ServerHello through Finished.
  4612. ASSERT_EQ(SSL_do_handshake(client_.get()), -1);
  4613. ASSERT_EQ(SSL_get_error(client_.get(), -1), SSL_ERROR_WANT_READ);
  4614. ASSERT_TRUE(ProvideHandshakeData(server_.get()));
  4615. ASSERT_EQ(SSL_do_handshake(server_.get()), -1);
  4616. ASSERT_EQ(SSL_get_error(server_.get(), -1), SSL_ERROR_WANT_READ);
  4617. // The client is still waiting for the ServerHello at initial
  4618. // encryption.
  4619. ASSERT_EQ(ssl_encryption_initial, SSL_quic_read_level(client_.get()));
  4620. // |add_handshake_data| incorrectly wrote everything at the initial level, so
  4621. // this queues up ServerHello through Finished in one chunk.
  4622. ASSERT_TRUE(ProvideHandshakeData(client_.get()));
  4623. // The client reads ServerHello successfully, but then rejects the buffered
  4624. // EncryptedExtensions on key change.
  4625. ASSERT_EQ(SSL_do_handshake(client_.get()), -1);
  4626. ASSERT_EQ(SSL_get_error(client_.get(), -1), SSL_ERROR_SSL);
  4627. uint32_t err = ERR_get_error();
  4628. EXPECT_EQ(ERR_GET_LIB(err), ERR_LIB_SSL);
  4629. EXPECT_EQ(ERR_GET_REASON(err), SSL_R_BUFFERED_MESSAGES_ON_CIPHER_CHANGE);
  4630. // The client sends an alert in response to this.
  4631. ASSERT_TRUE(transport_->client()->has_alert());
  4632. EXPECT_EQ(transport_->client()->alert_level(), ssl_encryption_initial);
  4633. EXPECT_EQ(transport_->client()->alert(), SSL_AD_UNEXPECTED_MESSAGE);
  4634. // Sanity-check client did get far enough to process the ServerHello and
  4635. // install keys.
  4636. EXPECT_TRUE(transport_->client()->HasSecrets(ssl_encryption_handshake));
  4637. }
  4638. // Test that |SSL_provide_quic_data| will reject data at the wrong level.
  4639. TEST_F(QUICMethodTest, ProvideWrongLevel) {
  4640. const SSL_QUIC_METHOD quic_method = {
  4641. SetEncryptionSecretsCallback,
  4642. AddHandshakeDataCallback,
  4643. FlushFlightCallback,
  4644. SendAlertCallback,
  4645. };
  4646. ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
  4647. ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
  4648. ASSERT_TRUE(CreateClientAndServer());
  4649. // Send the ClientHello and ServerHello through Finished.
  4650. ASSERT_EQ(SSL_do_handshake(client_.get()), -1);
  4651. ASSERT_EQ(SSL_get_error(client_.get(), -1), SSL_ERROR_WANT_READ);
  4652. ASSERT_TRUE(ProvideHandshakeData(server_.get()));
  4653. ASSERT_EQ(SSL_do_handshake(server_.get()), -1);
  4654. ASSERT_EQ(SSL_get_error(server_.get(), -1), SSL_ERROR_WANT_READ);
  4655. // The client is still waiting for the ServerHello at initial
  4656. // encryption.
  4657. ASSERT_EQ(ssl_encryption_initial, SSL_quic_read_level(client_.get()));
  4658. // Data cannot be provided at the next level.
  4659. std::vector<uint8_t> data;
  4660. ASSERT_TRUE(
  4661. transport_->client()->ReadHandshakeData(&data, ssl_encryption_initial));
  4662. ASSERT_FALSE(SSL_provide_quic_data(client_.get(), ssl_encryption_handshake,
  4663. data.data(), data.size()));
  4664. ERR_clear_error();
  4665. // Progress to EncryptedExtensions.
  4666. ASSERT_TRUE(SSL_provide_quic_data(client_.get(), ssl_encryption_initial,
  4667. data.data(), data.size()));
  4668. ASSERT_EQ(SSL_do_handshake(client_.get()), -1);
  4669. ASSERT_EQ(SSL_get_error(client_.get(), -1), SSL_ERROR_WANT_READ);
  4670. ASSERT_EQ(ssl_encryption_handshake, SSL_quic_read_level(client_.get()));
  4671. // Data cannot be provided at the previous level.
  4672. ASSERT_TRUE(
  4673. transport_->client()->ReadHandshakeData(&data, ssl_encryption_handshake));
  4674. ASSERT_FALSE(SSL_provide_quic_data(client_.get(), ssl_encryption_initial,
  4675. data.data(), data.size()));
  4676. }
  4677. TEST_F(QUICMethodTest, TooMuchData) {
  4678. const SSL_QUIC_METHOD quic_method = {
  4679. SetEncryptionSecretsCallback,
  4680. AddHandshakeDataCallback,
  4681. FlushFlightCallback,
  4682. SendAlertCallback,
  4683. };
  4684. ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
  4685. ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
  4686. ASSERT_TRUE(CreateClientAndServer());
  4687. size_t limit =
  4688. SSL_quic_max_handshake_flight_len(client_.get(), ssl_encryption_initial);
  4689. uint8_t b = 0;
  4690. for (size_t i = 0; i < limit; i++) {
  4691. ASSERT_TRUE(
  4692. SSL_provide_quic_data(client_.get(), ssl_encryption_initial, &b, 1));
  4693. }
  4694. EXPECT_FALSE(
  4695. SSL_provide_quic_data(client_.get(), ssl_encryption_initial, &b, 1));
  4696. }
  4697. // Provide invalid post-handshake data.
  4698. TEST_F(QUICMethodTest, BadPostHandshake) {
  4699. const SSL_QUIC_METHOD quic_method = {
  4700. SetEncryptionSecretsCallback,
  4701. AddHandshakeDataCallback,
  4702. FlushFlightCallback,
  4703. SendAlertCallback,
  4704. };
  4705. g_last_session = nullptr;
  4706. SSL_CTX_set_session_cache_mode(client_ctx_.get(), SSL_SESS_CACHE_BOTH);
  4707. SSL_CTX_sess_set_new_cb(client_ctx_.get(), SaveLastSession);
  4708. ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method));
  4709. ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method));
  4710. ASSERT_TRUE(CreateClientAndServer());
  4711. ASSERT_TRUE(CompleteHandshakesForQUIC());
  4712. EXPECT_EQ(SSL_do_handshake(client_.get()), 1);
  4713. EXPECT_EQ(SSL_do_handshake(server_.get()), 1);
  4714. EXPECT_TRUE(transport_->SecretsMatch(ssl_encryption_application));
  4715. EXPECT_FALSE(transport_->client()->has_alert());
  4716. EXPECT_FALSE(transport_->server()->has_alert());
  4717. // Junk sent as part of post-handshake data should cause an error.
  4718. uint8_t kJunk[] = {0x17, 0x0, 0x0, 0x4, 0xB, 0xE, 0xE, 0xF};
  4719. ASSERT_TRUE(SSL_provide_quic_data(client_.get(), ssl_encryption_application,
  4720. kJunk, sizeof(kJunk)));
  4721. EXPECT_EQ(SSL_process_quic_post_handshake(client_.get()), 0);
  4722. }
  4723. extern "C" {
  4724. int BORINGSSL_enum_c_type_test(void);
  4725. }
  4726. TEST(SSLTest, EnumTypes) {
  4727. EXPECT_EQ(sizeof(int), sizeof(ssl_private_key_result_t));
  4728. EXPECT_EQ(1, BORINGSSL_enum_c_type_test());
  4729. }
  4730. TEST_P(SSLVersionTest, DoubleSSLError) {
  4731. // Connect the inner SSL connections.
  4732. ASSERT_TRUE(Connect());
  4733. // Make a pair of |BIO|s which wrap |client_| and |server_|.
  4734. UniquePtr<BIO_METHOD> bio_method(BIO_meth_new(0, nullptr));
  4735. ASSERT_TRUE(bio_method);
  4736. ASSERT_TRUE(BIO_meth_set_read(
  4737. bio_method.get(), [](BIO *bio, char *out, int len) -> int {
  4738. SSL *ssl = static_cast<SSL *>(BIO_get_data(bio));
  4739. int ret = SSL_read(ssl, out, len);
  4740. int ssl_ret = SSL_get_error(ssl, ret);
  4741. if (ssl_ret == SSL_ERROR_WANT_READ) {
  4742. BIO_set_retry_read(bio);
  4743. }
  4744. return ret;
  4745. }));
  4746. ASSERT_TRUE(BIO_meth_set_write(
  4747. bio_method.get(), [](BIO *bio, const char *in, int len) -> int {
  4748. SSL *ssl = static_cast<SSL *>(BIO_get_data(bio));
  4749. int ret = SSL_write(ssl, in, len);
  4750. int ssl_ret = SSL_get_error(ssl, ret);
  4751. if (ssl_ret == SSL_ERROR_WANT_WRITE) {
  4752. BIO_set_retry_write(bio);
  4753. }
  4754. return ret;
  4755. }));
  4756. ASSERT_TRUE(BIO_meth_set_ctrl(
  4757. bio_method.get(), [](BIO *bio, int cmd, long larg, void *parg) -> long {
  4758. // |SSL| objects require |BIO_flush| support.
  4759. if (cmd == BIO_CTRL_FLUSH) {
  4760. return 1;
  4761. }
  4762. return 0;
  4763. }));
  4764. UniquePtr<BIO> client_bio(BIO_new(bio_method.get()));
  4765. ASSERT_TRUE(client_bio);
  4766. BIO_set_data(client_bio.get(), client_.get());
  4767. BIO_set_init(client_bio.get(), 1);
  4768. UniquePtr<BIO> server_bio(BIO_new(bio_method.get()));
  4769. ASSERT_TRUE(server_bio);
  4770. BIO_set_data(server_bio.get(), server_.get());
  4771. BIO_set_init(server_bio.get(), 1);
  4772. // Wrap the inner connections in another layer of SSL.
  4773. UniquePtr<SSL> client_outer(SSL_new(client_ctx_.get()));
  4774. ASSERT_TRUE(client_outer);
  4775. SSL_set_connect_state(client_outer.get());
  4776. SSL_set_bio(client_outer.get(), client_bio.get(), client_bio.get());
  4777. client_bio.release(); // |SSL_set_bio| takes ownership.
  4778. UniquePtr<SSL> server_outer(SSL_new(server_ctx_.get()));
  4779. ASSERT_TRUE(server_outer);
  4780. SSL_set_accept_state(server_outer.get());
  4781. SSL_set_bio(server_outer.get(), server_bio.get(), server_bio.get());
  4782. server_bio.release(); // |SSL_set_bio| takes ownership.
  4783. // Configure |client_outer| to reject the server certificate.
  4784. SSL_set_custom_verify(
  4785. client_outer.get(), SSL_VERIFY_PEER,
  4786. [](SSL *ssl, uint8_t *out_alert) -> ssl_verify_result_t {
  4787. return ssl_verify_invalid;
  4788. });
  4789. for (;;) {
  4790. int client_ret = SSL_do_handshake(client_outer.get());
  4791. int client_err = SSL_get_error(client_outer.get(), client_ret);
  4792. if (client_err != SSL_ERROR_WANT_READ &&
  4793. client_err != SSL_ERROR_WANT_WRITE) {
  4794. // The client handshake should terminate on a certificate verification
  4795. // error.
  4796. EXPECT_EQ(SSL_ERROR_SSL, client_err);
  4797. uint32_t err = ERR_peek_error();
  4798. EXPECT_EQ(ERR_LIB_SSL, ERR_GET_LIB(err));
  4799. EXPECT_EQ(SSL_R_CERTIFICATE_VERIFY_FAILED, ERR_GET_REASON(err));
  4800. break;
  4801. }
  4802. // Run the server handshake and continue.
  4803. int server_ret = SSL_do_handshake(server_outer.get());
  4804. int server_err = SSL_get_error(server_outer.get(), server_ret);
  4805. ASSERT_TRUE(server_err == SSL_ERROR_NONE ||
  4806. server_err == SSL_ERROR_WANT_READ ||
  4807. server_err == SSL_ERROR_WANT_WRITE);
  4808. }
  4809. }
  4810. } // namespace
  4811. BSSL_NAMESPACE_END