tls.c 268 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998
  1. /* tls.c
  2. *
  3. * Copyright (C) 2006-2017 wolfSSL Inc.
  4. *
  5. * This file is part of wolfSSL.
  6. *
  7. * wolfSSL is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * wolfSSL is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  20. */
  21. #ifdef HAVE_CONFIG_H
  22. #include <config.h>
  23. #endif
  24. #include <wolfssl/wolfcrypt/settings.h>
  25. #ifndef WOLFCRYPT_ONLY
  26. #include <wolfssl/ssl.h>
  27. #include <wolfssl/internal.h>
  28. #include <wolfssl/error-ssl.h>
  29. #include <wolfssl/wolfcrypt/hmac.h>
  30. #ifdef NO_INLINE
  31. #include <wolfssl/wolfcrypt/misc.h>
  32. #else
  33. #define WOLFSSL_MISC_INCLUDED
  34. #include <wolfcrypt/src/misc.c>
  35. #endif
  36. #ifdef HAVE_CURVE25519
  37. #include <wolfssl/wolfcrypt/curve25519.h>
  38. #endif
  39. #ifdef HAVE_NTRU
  40. #include "libntruencrypt/ntru_crypto.h"
  41. #include <wolfssl/wolfcrypt/random.h>
  42. #endif
  43. #ifdef HAVE_QSH
  44. static int TLSX_AddQSHKey(QSHKey** list, QSHKey* key);
  45. static byte* TLSX_QSHKeyFind_Pub(QSHKey* qsh, word16* pubLen, word16 name);
  46. #if defined(HAVE_NTRU)
  47. static int TLSX_CreateNtruKey(WOLFSSL* ssl, int type);
  48. #endif
  49. #endif /* HAVE_QSH */
  50. #ifndef NO_TLS
  51. /* Digest enable checks */
  52. #ifdef NO_OLD_TLS /* TLS 1.2 only */
  53. #if defined(NO_SHA256) && !defined(WOLFSSL_SHA384) && \
  54. !defined(WOLFSSL_SHA512)
  55. #error Must have SHA256, SHA384 or SHA512 enabled for TLS 1.2
  56. #endif
  57. #else /* TLS 1.1 or older */
  58. #if defined(NO_MD5) && defined(NO_SHA)
  59. #error Must have SHA1 and MD5 enabled for old TLS
  60. #endif
  61. #endif
  62. #ifdef WOLFSSL_SHA384
  63. #define P_HASH_MAX_SIZE WC_SHA384_DIGEST_SIZE
  64. #else
  65. #define P_HASH_MAX_SIZE WC_SHA256_DIGEST_SIZE
  66. #endif
  67. /* compute p_hash for MD5, SHA-1, SHA-256, or SHA-384 for TLSv1 PRF */
  68. static int p_hash(byte* result, word32 resLen, const byte* secret,
  69. word32 secLen, const byte* seed, word32 seedLen, int hash,
  70. void* heap, int devId)
  71. {
  72. word32 len = P_HASH_MAX_SIZE;
  73. word32 times;
  74. word32 lastLen;
  75. word32 lastTime;
  76. word32 i;
  77. word32 idx = 0;
  78. int ret = 0;
  79. #ifdef WOLFSSL_SMALL_STACK
  80. byte* previous;
  81. byte* current;
  82. Hmac* hmac;
  83. #else
  84. byte previous[P_HASH_MAX_SIZE]; /* max size */
  85. byte current[P_HASH_MAX_SIZE]; /* max size */
  86. Hmac hmac[1];
  87. #endif
  88. #ifdef WOLFSSL_SMALL_STACK
  89. previous = (byte*)XMALLOC(P_HASH_MAX_SIZE, heap, DYNAMIC_TYPE_DIGEST);
  90. current = (byte*)XMALLOC(P_HASH_MAX_SIZE, heap, DYNAMIC_TYPE_DIGEST);
  91. hmac = (Hmac*)XMALLOC(sizeof(Hmac), heap, DYNAMIC_TYPE_HMAC);
  92. if (previous == NULL || current == NULL || hmac == NULL) {
  93. if (previous) XFREE(previous, heap, DYNAMIC_TYPE_DIGEST);
  94. if (current) XFREE(current, heap, DYNAMIC_TYPE_DIGEST);
  95. if (hmac) XFREE(hmac, heap, DYNAMIC_TYPE_HMAC);
  96. return MEMORY_E;
  97. }
  98. #endif
  99. switch (hash) {
  100. #ifndef NO_MD5
  101. case md5_mac:
  102. hash = WC_MD5;
  103. len = WC_MD5_DIGEST_SIZE;
  104. break;
  105. #endif
  106. #ifndef NO_SHA256
  107. case sha256_mac:
  108. hash = WC_SHA256;
  109. len = WC_SHA256_DIGEST_SIZE;
  110. break;
  111. #endif
  112. #ifdef WOLFSSL_SHA384
  113. case sha384_mac:
  114. hash = WC_SHA384;
  115. len = WC_SHA384_DIGEST_SIZE;
  116. break;
  117. #endif
  118. #ifndef NO_SHA
  119. case sha_mac:
  120. default:
  121. hash = WC_SHA;
  122. len = WC_SHA_DIGEST_SIZE;
  123. break;
  124. #endif
  125. }
  126. times = resLen / len;
  127. lastLen = resLen % len;
  128. if (lastLen)
  129. times += 1;
  130. lastTime = times - 1;
  131. ret = wc_HmacInit(hmac, heap, devId);
  132. if (ret == 0) {
  133. ret = wc_HmacSetKey(hmac, hash, secret, secLen);
  134. if (ret == 0)
  135. ret = wc_HmacUpdate(hmac, seed, seedLen); /* A0 = seed */
  136. if (ret == 0)
  137. ret = wc_HmacFinal(hmac, previous); /* A1 */
  138. if (ret == 0) {
  139. for (i = 0; i < times; i++) {
  140. ret = wc_HmacUpdate(hmac, previous, len);
  141. if (ret != 0)
  142. break;
  143. ret = wc_HmacUpdate(hmac, seed, seedLen);
  144. if (ret != 0)
  145. break;
  146. ret = wc_HmacFinal(hmac, current);
  147. if (ret != 0)
  148. break;
  149. if ((i == lastTime) && lastLen)
  150. XMEMCPY(&result[idx], current,
  151. min(lastLen, P_HASH_MAX_SIZE));
  152. else {
  153. XMEMCPY(&result[idx], current, len);
  154. idx += len;
  155. ret = wc_HmacUpdate(hmac, previous, len);
  156. if (ret != 0)
  157. break;
  158. ret = wc_HmacFinal(hmac, previous);
  159. if (ret != 0)
  160. break;
  161. }
  162. }
  163. }
  164. wc_HmacFree(hmac);
  165. }
  166. ForceZero(previous, P_HASH_MAX_SIZE);
  167. ForceZero(current, P_HASH_MAX_SIZE);
  168. ForceZero(hmac, sizeof(Hmac));
  169. #ifdef WOLFSSL_SMALL_STACK
  170. XFREE(previous, heap, DYNAMIC_TYPE_DIGEST);
  171. XFREE(current, heap, DYNAMIC_TYPE_DIGEST);
  172. XFREE(hmac, heap, DYNAMIC_TYPE_HMAC);
  173. #endif
  174. return ret;
  175. }
  176. #undef P_HASH_MAX_SIZE
  177. #ifndef NO_OLD_TLS
  178. /* calculate XOR for TLSv1 PRF */
  179. static INLINE void get_xor(byte *digest, word32 digLen, byte* md5, byte* sha)
  180. {
  181. word32 i;
  182. for (i = 0; i < digLen; i++)
  183. digest[i] = md5[i] ^ sha[i];
  184. }
  185. /* compute TLSv1 PRF (pseudo random function using HMAC) */
  186. static int doPRF(byte* digest, word32 digLen, const byte* secret,word32 secLen,
  187. const byte* label, word32 labLen, const byte* seed,
  188. word32 seedLen, void* heap, int devId)
  189. {
  190. int ret = 0;
  191. word32 half = (secLen + 1) / 2;
  192. #ifdef WOLFSSL_SMALL_STACK
  193. byte* md5_half;
  194. byte* sha_half;
  195. byte* labelSeed;
  196. byte* md5_result;
  197. byte* sha_result;
  198. #else
  199. byte md5_half[MAX_PRF_HALF]; /* half is real size */
  200. byte sha_half[MAX_PRF_HALF]; /* half is real size */
  201. byte labelSeed[MAX_PRF_LABSEED]; /* labLen + seedLen is real size */
  202. byte md5_result[MAX_PRF_DIG]; /* digLen is real size */
  203. byte sha_result[MAX_PRF_DIG]; /* digLen is real size */
  204. #endif
  205. if (half > MAX_PRF_HALF)
  206. return BUFFER_E;
  207. if (labLen + seedLen > MAX_PRF_LABSEED)
  208. return BUFFER_E;
  209. if (digLen > MAX_PRF_DIG)
  210. return BUFFER_E;
  211. #ifdef WOLFSSL_SMALL_STACK
  212. md5_half = (byte*)XMALLOC(MAX_PRF_HALF, heap, DYNAMIC_TYPE_DIGEST);
  213. sha_half = (byte*)XMALLOC(MAX_PRF_HALF, heap, DYNAMIC_TYPE_DIGEST);
  214. labelSeed = (byte*)XMALLOC(MAX_PRF_LABSEED, heap, DYNAMIC_TYPE_SEED);
  215. md5_result = (byte*)XMALLOC(MAX_PRF_DIG, heap, DYNAMIC_TYPE_DIGEST);
  216. sha_result = (byte*)XMALLOC(MAX_PRF_DIG, heap, DYNAMIC_TYPE_DIGEST);
  217. if (md5_half == NULL || sha_half == NULL || labelSeed == NULL ||
  218. md5_result == NULL || sha_result == NULL) {
  219. if (md5_half) XFREE(md5_half, heap, DYNAMIC_TYPE_DIGEST);
  220. if (sha_half) XFREE(sha_half, heap, DYNAMIC_TYPE_DIGEST);
  221. if (labelSeed) XFREE(labelSeed, heap, DYNAMIC_TYPE_SEED);
  222. if (md5_result) XFREE(md5_result, heap, DYNAMIC_TYPE_DIGEST);
  223. if (sha_result) XFREE(sha_result, heap, DYNAMIC_TYPE_DIGEST);
  224. return MEMORY_E;
  225. }
  226. #endif
  227. XMEMSET(md5_result, 0, digLen);
  228. XMEMSET(sha_result, 0, digLen);
  229. XMEMCPY(md5_half, secret, half);
  230. XMEMCPY(sha_half, secret + half - secLen % 2, half);
  231. XMEMCPY(labelSeed, label, labLen);
  232. XMEMCPY(labelSeed + labLen, seed, seedLen);
  233. if ((ret = p_hash(md5_result, digLen, md5_half, half, labelSeed,
  234. labLen + seedLen, md5_mac, heap, devId)) == 0) {
  235. if ((ret = p_hash(sha_result, digLen, sha_half, half, labelSeed,
  236. labLen + seedLen, sha_mac, heap, devId)) == 0) {
  237. get_xor(digest, digLen, md5_result, sha_result);
  238. }
  239. }
  240. #ifdef WOLFSSL_SMALL_STACK
  241. XFREE(md5_half, heap, DYNAMIC_TYPE_DIGEST);
  242. XFREE(sha_half, heap, DYNAMIC_TYPE_DIGEST);
  243. XFREE(labelSeed, heap, DYNAMIC_TYPE_SEED);
  244. XFREE(md5_result, heap, DYNAMIC_TYPE_DIGEST);
  245. XFREE(sha_result, heap, DYNAMIC_TYPE_DIGEST);
  246. #endif
  247. return ret;
  248. }
  249. #endif
  250. /* Wrapper to call straight thru to p_hash in TSL 1.2 cases to remove stack
  251. use */
  252. static int PRF(byte* digest, word32 digLen, const byte* secret, word32 secLen,
  253. const byte* label, word32 labLen, const byte* seed, word32 seedLen,
  254. int useAtLeastSha256, int hash_type, void* heap, int devId)
  255. {
  256. int ret = 0;
  257. if (useAtLeastSha256) {
  258. #ifdef WOLFSSL_SMALL_STACK
  259. byte* labelSeed;
  260. #else
  261. byte labelSeed[MAX_PRF_LABSEED]; /* labLen + seedLen is real size */
  262. #endif
  263. if (labLen + seedLen > MAX_PRF_LABSEED)
  264. return BUFFER_E;
  265. #ifdef WOLFSSL_SMALL_STACK
  266. labelSeed = (byte*)XMALLOC(MAX_PRF_LABSEED, heap, DYNAMIC_TYPE_SEED);
  267. if (labelSeed == NULL)
  268. return MEMORY_E;
  269. #endif
  270. XMEMCPY(labelSeed, label, labLen);
  271. XMEMCPY(labelSeed + labLen, seed, seedLen);
  272. /* If a cipher suite wants an algorithm better than sha256, it
  273. * should use better. */
  274. if (hash_type < sha256_mac || hash_type == blake2b_mac)
  275. hash_type = sha256_mac;
  276. ret = p_hash(digest, digLen, secret, secLen, labelSeed,
  277. labLen + seedLen, hash_type, heap, devId);
  278. #ifdef WOLFSSL_SMALL_STACK
  279. XFREE(labelSeed, heap, DYNAMIC_TYPE_SEED);
  280. #endif
  281. }
  282. #ifndef NO_OLD_TLS
  283. else {
  284. ret = doPRF(digest, digLen, secret, secLen, label, labLen, seed,
  285. seedLen, heap, devId);
  286. }
  287. #endif
  288. return ret;
  289. }
  290. #ifdef WOLFSSL_SHA384
  291. #define HSHASH_SZ WC_SHA384_DIGEST_SIZE
  292. #else
  293. #define HSHASH_SZ FINISHED_SZ
  294. #endif
  295. int BuildTlsHandshakeHash(WOLFSSL* ssl, byte* hash, word32* hashLen)
  296. {
  297. word32 hashSz = FINISHED_SZ;
  298. if (ssl == NULL || hash == NULL || hashLen == NULL || *hashLen < HSHASH_SZ)
  299. return BAD_FUNC_ARG;
  300. #ifndef NO_OLD_TLS
  301. wc_Md5GetHash(&ssl->hsHashes->hashMd5, hash);
  302. wc_ShaGetHash(&ssl->hsHashes->hashSha, &hash[WC_MD5_DIGEST_SIZE]);
  303. #endif
  304. if (IsAtLeastTLSv1_2(ssl)) {
  305. #ifndef NO_SHA256
  306. if (ssl->specs.mac_algorithm <= sha256_mac ||
  307. ssl->specs.mac_algorithm == blake2b_mac) {
  308. int ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256, hash);
  309. if (ret != 0)
  310. return ret;
  311. hashSz = WC_SHA256_DIGEST_SIZE;
  312. }
  313. #endif
  314. #ifdef WOLFSSL_SHA384
  315. if (ssl->specs.mac_algorithm == sha384_mac) {
  316. int ret = wc_Sha384GetHash(&ssl->hsHashes->hashSha384, hash);
  317. if (ret != 0)
  318. return ret;
  319. hashSz = WC_SHA384_DIGEST_SIZE;
  320. }
  321. #endif
  322. }
  323. *hashLen = hashSz;
  324. return 0;
  325. }
  326. int BuildTlsFinished(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  327. {
  328. int ret;
  329. const byte* side;
  330. byte* handshake_hash;
  331. word32 hashSz = HSHASH_SZ;
  332. /* using allocate here to allow async hardware to use buffer directly */
  333. handshake_hash = (byte*)XMALLOC(hashSz, ssl->heap, DYNAMIC_TYPE_DIGEST);
  334. if (handshake_hash == NULL)
  335. return MEMORY_E;
  336. ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
  337. if (ret == 0) {
  338. if ( XSTRNCMP((const char*)sender, (const char*)client, SIZEOF_SENDER) == 0)
  339. side = tls_client;
  340. else
  341. side = tls_server;
  342. ret = PRF((byte*)hashes, TLS_FINISHED_SZ, ssl->arrays->masterSecret,
  343. SECRET_LEN, side, FINISHED_LABEL_SZ, handshake_hash, hashSz,
  344. IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
  345. ssl->heap, ssl->devId);
  346. }
  347. XFREE(handshake_hash, ssl->heap, DYNAMIC_TYPE_DIGEST);
  348. return ret;
  349. }
  350. #ifndef NO_OLD_TLS
  351. #ifdef WOLFSSL_ALLOW_TLSV10
  352. ProtocolVersion MakeTLSv1(void)
  353. {
  354. ProtocolVersion pv;
  355. pv.major = SSLv3_MAJOR;
  356. pv.minor = TLSv1_MINOR;
  357. return pv;
  358. }
  359. #endif /* WOLFSSL_ALLOW_TLSV10 */
  360. ProtocolVersion MakeTLSv1_1(void)
  361. {
  362. ProtocolVersion pv;
  363. pv.major = SSLv3_MAJOR;
  364. pv.minor = TLSv1_1_MINOR;
  365. return pv;
  366. }
  367. #endif /* !NO_OLD_TLS */
  368. ProtocolVersion MakeTLSv1_2(void)
  369. {
  370. ProtocolVersion pv;
  371. pv.major = SSLv3_MAJOR;
  372. pv.minor = TLSv1_2_MINOR;
  373. return pv;
  374. }
  375. #ifdef WOLFSSL_TLS13
  376. /* The TLS v1.3 protocol version.
  377. *
  378. * returns the protocol version data for TLS v1.3.
  379. */
  380. ProtocolVersion MakeTLSv1_3(void)
  381. {
  382. ProtocolVersion pv;
  383. pv.major = SSLv3_MAJOR;
  384. pv.minor = TLSv1_3_MINOR;
  385. return pv;
  386. }
  387. #endif
  388. #ifdef HAVE_EXTENDED_MASTER
  389. static const byte ext_master_label[EXT_MASTER_LABEL_SZ + 1] =
  390. "extended master secret";
  391. #endif
  392. static const byte master_label[MASTER_LABEL_SZ + 1] = "master secret";
  393. static const byte key_label [KEY_LABEL_SZ + 1] = "key expansion";
  394. static int _DeriveTlsKeys(byte* key_dig, word32 key_dig_len,
  395. const byte* ms, word32 msLen,
  396. const byte* sr, const byte* cr,
  397. int tls1_2, int hash_type,
  398. void* heap, int devId)
  399. {
  400. byte seed[SEED_LEN];
  401. XMEMCPY(seed, sr, RAN_LEN);
  402. XMEMCPY(seed + RAN_LEN, cr, RAN_LEN);
  403. return PRF(key_dig, key_dig_len, ms, msLen, key_label, KEY_LABEL_SZ,
  404. seed, SEED_LEN, tls1_2, hash_type, heap, devId);
  405. }
  406. /* External facing wrapper so user can call as well, 0 on success */
  407. int wolfSSL_DeriveTlsKeys(byte* key_dig, word32 key_dig_len,
  408. const byte* ms, word32 msLen,
  409. const byte* sr, const byte* cr,
  410. int tls1_2, int hash_type)
  411. {
  412. return _DeriveTlsKeys(key_dig, key_dig_len, ms, msLen, sr, cr, tls1_2,
  413. hash_type, NULL, INVALID_DEVID);
  414. }
  415. int DeriveTlsKeys(WOLFSSL* ssl)
  416. {
  417. int ret;
  418. int key_dig_len = 2 * ssl->specs.hash_size +
  419. 2 * ssl->specs.key_size +
  420. 2 * ssl->specs.iv_size;
  421. #ifdef WOLFSSL_SMALL_STACK
  422. byte* key_dig;
  423. #else
  424. byte key_dig[MAX_PRF_DIG];
  425. #endif
  426. #ifdef WOLFSSL_SMALL_STACK
  427. key_dig = (byte*)XMALLOC(MAX_PRF_DIG, ssl->heap, DYNAMIC_TYPE_DIGEST);
  428. if (key_dig == NULL) {
  429. return MEMORY_E;
  430. }
  431. #endif
  432. ret = _DeriveTlsKeys(key_dig, key_dig_len,
  433. ssl->arrays->masterSecret, SECRET_LEN,
  434. ssl->arrays->serverRandom, ssl->arrays->clientRandom,
  435. IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
  436. ssl->heap, ssl->devId);
  437. if (ret == 0)
  438. ret = StoreKeys(ssl, key_dig, PROVISION_CLIENT_SERVER);
  439. #ifdef WOLFSSL_SMALL_STACK
  440. XFREE(key_dig, ssl->heap, DYNAMIC_TYPE_DIGEST);
  441. #endif
  442. return ret;
  443. }
  444. static int _MakeTlsMasterSecret(byte* ms, word32 msLen,
  445. const byte* pms, word32 pmsLen,
  446. const byte* cr, const byte* sr,
  447. int tls1_2, int hash_type,
  448. void* heap, int devId)
  449. {
  450. byte seed[SEED_LEN];
  451. XMEMCPY(seed, cr, RAN_LEN);
  452. XMEMCPY(seed + RAN_LEN, sr, RAN_LEN);
  453. return PRF(ms, msLen, pms, pmsLen, master_label, MASTER_LABEL_SZ,
  454. seed, SEED_LEN, tls1_2, hash_type, heap, devId);
  455. }
  456. /* External facing wrapper so user can call as well, 0 on success */
  457. int wolfSSL_MakeTlsMasterSecret(byte* ms, word32 msLen,
  458. const byte* pms, word32 pmsLen,
  459. const byte* cr, const byte* sr,
  460. int tls1_2, int hash_type)
  461. {
  462. return _MakeTlsMasterSecret(ms, msLen, pms, pmsLen, cr, sr, tls1_2,
  463. hash_type, NULL, INVALID_DEVID);
  464. }
  465. #ifdef HAVE_EXTENDED_MASTER
  466. static int _MakeTlsExtendedMasterSecret(byte* ms, word32 msLen,
  467. const byte* pms, word32 pmsLen,
  468. const byte* sHash, word32 sHashLen,
  469. int tls1_2, int hash_type,
  470. void* heap, int devId)
  471. {
  472. return PRF(ms, msLen, pms, pmsLen, ext_master_label, EXT_MASTER_LABEL_SZ,
  473. sHash, sHashLen, tls1_2, hash_type, heap, devId);
  474. }
  475. /* External facing wrapper so user can call as well, 0 on success */
  476. int wolfSSL_MakeTlsExtendedMasterSecret(byte* ms, word32 msLen,
  477. const byte* pms, word32 pmsLen,
  478. const byte* sHash, word32 sHashLen,
  479. int tls1_2, int hash_type)
  480. {
  481. return _MakeTlsExtendedMasterSecret(ms, msLen, pms, pmsLen, sHash, sHashLen,
  482. tls1_2, hash_type, NULL, INVALID_DEVID);
  483. }
  484. #endif /* HAVE_EXTENDED_MASTER */
  485. int MakeTlsMasterSecret(WOLFSSL* ssl)
  486. {
  487. int ret;
  488. #ifdef HAVE_EXTENDED_MASTER
  489. if (ssl->options.haveEMS) {
  490. byte* handshake_hash;
  491. word32 hashSz = HSHASH_SZ;
  492. handshake_hash = (byte*)XMALLOC(HSHASH_SZ, ssl->heap,
  493. DYNAMIC_TYPE_DIGEST);
  494. if (handshake_hash == NULL)
  495. return MEMORY_E;
  496. ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
  497. if (ret < 0) {
  498. XFREE(handshake_hash, ssl->heap, DYNAMIC_TYPE_DIGEST);
  499. return ret;
  500. }
  501. ret = _MakeTlsExtendedMasterSecret(
  502. ssl->arrays->masterSecret, SECRET_LEN,
  503. ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz,
  504. handshake_hash, hashSz,
  505. IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
  506. ssl->heap, ssl->devId);
  507. XFREE(handshake_hash, ssl->heap, DYNAMIC_TYPE_DIGEST);
  508. } else
  509. #endif
  510. ret = _MakeTlsMasterSecret(ssl->arrays->masterSecret, SECRET_LEN,
  511. ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz,
  512. ssl->arrays->clientRandom, ssl->arrays->serverRandom,
  513. IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
  514. ssl->heap, ssl->devId);
  515. if (ret == 0) {
  516. #ifdef SHOW_SECRETS
  517. int i;
  518. printf("master secret: ");
  519. for (i = 0; i < SECRET_LEN; i++)
  520. printf("%02x", ssl->arrays->masterSecret[i]);
  521. printf("\n");
  522. #endif
  523. ret = DeriveTlsKeys(ssl);
  524. }
  525. return ret;
  526. }
  527. /* Used by EAP-TLS and EAP-TTLS to derive keying material from
  528. * the master_secret. */
  529. int wolfSSL_make_eap_keys(WOLFSSL* ssl, void* msk, unsigned int len,
  530. const char* label)
  531. {
  532. int ret;
  533. #ifdef WOLFSSL_SMALL_STACK
  534. byte* seed;
  535. #else
  536. byte seed[SEED_LEN];
  537. #endif
  538. #ifdef WOLFSSL_SMALL_STACK
  539. seed = (byte*)XMALLOC(SEED_LEN, ssl->heap, DYNAMIC_TYPE_SEED);
  540. if (seed == NULL)
  541. return MEMORY_E;
  542. #endif
  543. /*
  544. * As per RFC-5281, the order of the client and server randoms is reversed
  545. * from that used by the TLS protocol to derive keys.
  546. */
  547. XMEMCPY(seed, ssl->arrays->clientRandom, RAN_LEN);
  548. XMEMCPY(seed + RAN_LEN, ssl->arrays->serverRandom, RAN_LEN);
  549. ret = PRF((byte*)msk, len, ssl->arrays->masterSecret, SECRET_LEN,
  550. (const byte *)label, (word32)XSTRLEN(label), seed, SEED_LEN,
  551. IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
  552. ssl->heap, ssl->devId);
  553. #ifdef WOLFSSL_SMALL_STACK
  554. XFREE(seed, ssl->heap, DYNAMIC_TYPE_SEED);
  555. #endif
  556. return ret;
  557. }
  558. static INLINE void GetSEQIncrement(WOLFSSL* ssl, int verify, word32 seq[2])
  559. {
  560. if (verify) {
  561. seq[0] = ssl->keys.peer_sequence_number_hi;
  562. seq[1] = ssl->keys.peer_sequence_number_lo++;
  563. if (seq[1] > ssl->keys.peer_sequence_number_lo) {
  564. /* handle rollover */
  565. ssl->keys.peer_sequence_number_hi++;
  566. }
  567. }
  568. else {
  569. seq[0] = ssl->keys.sequence_number_hi;
  570. seq[1] = ssl->keys.sequence_number_lo++;
  571. if (seq[1] > ssl->keys.sequence_number_lo) {
  572. /* handle rollover */
  573. ssl->keys.sequence_number_hi++;
  574. }
  575. }
  576. }
  577. #ifdef WOLFSSL_DTLS
  578. static INLINE void DtlsGetSEQ(WOLFSSL* ssl, int order, word32 seq[2])
  579. {
  580. if (order == PREV_ORDER) {
  581. /* Previous epoch case */
  582. seq[0] = ((ssl->keys.dtls_epoch - 1) << 16) |
  583. (ssl->keys.dtls_prev_sequence_number_hi & 0xFFFF);
  584. seq[1] = ssl->keys.dtls_prev_sequence_number_lo;
  585. }
  586. else if (order == PEER_ORDER) {
  587. seq[0] = (ssl->keys.curEpoch << 16) |
  588. (ssl->keys.curSeq_hi & 0xFFFF);
  589. seq[1] = ssl->keys.curSeq_lo; /* explicit from peer */
  590. }
  591. else {
  592. seq[0] = (ssl->keys.dtls_epoch << 16) |
  593. (ssl->keys.dtls_sequence_number_hi & 0xFFFF);
  594. seq[1] = ssl->keys.dtls_sequence_number_lo;
  595. }
  596. }
  597. #endif /* WOLFSSL_DTLS */
  598. static INLINE void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out)
  599. {
  600. word32 seq[2] = {0, 0};
  601. if (!ssl->options.dtls) {
  602. GetSEQIncrement(ssl, verifyOrder, seq);
  603. }
  604. else {
  605. #ifdef WOLFSSL_DTLS
  606. DtlsGetSEQ(ssl, verifyOrder, seq);
  607. #endif
  608. }
  609. c32toa(seq[0], out);
  610. c32toa(seq[1], out + OPAQUE32_LEN);
  611. }
  612. /*** end copy ***/
  613. /* return HMAC digest type in wolfSSL format */
  614. int wolfSSL_GetHmacType(WOLFSSL* ssl)
  615. {
  616. if (ssl == NULL)
  617. return BAD_FUNC_ARG;
  618. switch (ssl->specs.mac_algorithm) {
  619. #ifndef NO_MD5
  620. case md5_mac:
  621. {
  622. return WC_MD5;
  623. }
  624. #endif
  625. #ifndef NO_SHA256
  626. case sha256_mac:
  627. {
  628. return WC_SHA256;
  629. }
  630. #endif
  631. #ifdef WOLFSSL_SHA384
  632. case sha384_mac:
  633. {
  634. return WC_SHA384;
  635. }
  636. #endif
  637. #ifndef NO_SHA
  638. case sha_mac:
  639. {
  640. return WC_SHA;
  641. }
  642. #endif
  643. #ifdef HAVE_BLAKE2
  644. case blake2b_mac:
  645. {
  646. return BLAKE2B_ID;
  647. }
  648. #endif
  649. default:
  650. {
  651. return WOLFSSL_FATAL_ERROR;
  652. }
  653. }
  654. }
  655. int wolfSSL_SetTlsHmacInner(WOLFSSL* ssl, byte* inner, word32 sz, int content,
  656. int verify)
  657. {
  658. if (ssl == NULL || inner == NULL)
  659. return BAD_FUNC_ARG;
  660. XMEMSET(inner, 0, WOLFSSL_TLS_HMAC_INNER_SZ);
  661. WriteSEQ(ssl, verify, inner);
  662. inner[SEQ_SZ] = (byte)content;
  663. inner[SEQ_SZ + ENUM_LEN] = ssl->version.major;
  664. inner[SEQ_SZ + ENUM_LEN + ENUM_LEN] = ssl->version.minor;
  665. c16toa((word16)sz, inner + SEQ_SZ + ENUM_LEN + VERSION_SZ);
  666. return 0;
  667. }
  668. /* TLS type HMAC */
  669. int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
  670. int content, int verify)
  671. {
  672. Hmac hmac;
  673. int ret = 0;
  674. byte myInner[WOLFSSL_TLS_HMAC_INNER_SZ];
  675. if (ssl == NULL)
  676. return BAD_FUNC_ARG;
  677. #ifdef HAVE_FUZZER
  678. if (ssl->fuzzerCb)
  679. ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
  680. #endif
  681. wolfSSL_SetTlsHmacInner(ssl, myInner, sz, content, verify);
  682. ret = wc_HmacInit(&hmac, ssl->heap, ssl->devId);
  683. if (ret != 0)
  684. return ret;
  685. ret = wc_HmacSetKey(&hmac, wolfSSL_GetHmacType(ssl),
  686. wolfSSL_GetMacSecret(ssl, verify), ssl->specs.hash_size);
  687. if (ret == 0) {
  688. ret = wc_HmacUpdate(&hmac, myInner, sizeof(myInner));
  689. if (ret == 0)
  690. ret = wc_HmacUpdate(&hmac, in, sz); /* content */
  691. if (ret == 0)
  692. ret = wc_HmacFinal(&hmac, digest);
  693. }
  694. wc_HmacFree(&hmac);
  695. return ret;
  696. }
  697. #ifdef HAVE_TLS_EXTENSIONS
  698. /**
  699. * The TLSX semaphore is used to calculate the size of the extensions to be sent
  700. * from one peer to another.
  701. */
  702. /** Supports up to 64 flags. Increase as needed. */
  703. #define SEMAPHORE_SIZE 8
  704. /**
  705. * Converts the extension type (id) to an index in the semaphore.
  706. *
  707. * Oficial reference for TLS extension types:
  708. * http://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xml
  709. *
  710. * Motivation:
  711. * Previously, we used the extension type itself as the index of that
  712. * extension in the semaphore as the extension types were declared
  713. * sequentially, but maintain a semaphore as big as the number of available
  714. * extensions is no longer an option since the release of renegotiation_info.
  715. *
  716. * How to update:
  717. * Assign extension types that extrapolate the number of available semaphores
  718. * to the first available index going backwards in the semaphore array.
  719. * When adding a new extension type that don't extrapolate the number of
  720. * available semaphores, check for a possible collision with with a
  721. * 'remapped' extension type.
  722. */
  723. static INLINE word16 TLSX_ToSemaphore(word16 type)
  724. {
  725. switch (type) {
  726. case TLSX_RENEGOTIATION_INFO: /* 0xFF01 */
  727. return 63;
  728. default:
  729. if (type > 62) {
  730. /* This message SHOULD only happens during the adding of
  731. new TLS extensions in which its IANA number overflows
  732. the current semaphore's range, or if its number already
  733. is assigned to be used by another extension.
  734. Use this check value for the new extension and decrement
  735. the check value by one. */
  736. WOLFSSL_MSG("### TLSX semaphore colision or overflow detected!");
  737. }
  738. }
  739. return type;
  740. }
  741. /** Checks if a specific light (tls extension) is not set in the semaphore. */
  742. #define IS_OFF(semaphore, light) \
  743. (!(((semaphore)[(light) / 8] & (byte) (0x01 << ((light) % 8)))))
  744. /** Turn on a specific light (tls extension) in the semaphore. */
  745. /* the semaphore marks the extensions already written to the message */
  746. #define TURN_ON(semaphore, light) \
  747. ((semaphore)[(light) / 8] |= (byte) (0x01 << ((light) % 8)))
  748. /** Turn off a specific light (tls extension) in the semaphore. */
  749. #define TURN_OFF(semaphore, light) \
  750. ((semaphore)[(light) / 8] &= (byte) ~(0x01 << ((light) % 8)))
  751. /** Creates a new extension. */
  752. static TLSX* TLSX_New(TLSX_Type type, void* data, void* heap)
  753. {
  754. TLSX* extension = (TLSX*)XMALLOC(sizeof(TLSX), heap, DYNAMIC_TYPE_TLSX);
  755. if (extension) {
  756. extension->type = type;
  757. extension->data = data;
  758. extension->resp = 0;
  759. extension->next = NULL;
  760. }
  761. return extension;
  762. }
  763. /**
  764. * Creates a new extension and pushes it to the provided list.
  765. * Checks for duplicate extensions, keeps the newest.
  766. */
  767. static int TLSX_Push(TLSX** list, TLSX_Type type, void* data, void* heap)
  768. {
  769. TLSX* extension = TLSX_New(type, data, heap);
  770. if (extension == NULL)
  771. return MEMORY_E;
  772. /* pushes the new extension on the list. */
  773. extension->next = *list;
  774. *list = extension;
  775. /* remove duplicate extensions, there should be only one of each type. */
  776. do {
  777. if (extension->next && extension->next->type == type) {
  778. TLSX *next = extension->next;
  779. extension->next = next->next;
  780. next->next = NULL;
  781. TLSX_FreeAll(next, heap);
  782. /* there is no way to occur more than
  783. * two extensions of the same type.
  784. */
  785. break;
  786. }
  787. } while ((extension = extension->next));
  788. return 0;
  789. }
  790. #ifndef NO_WOLFSSL_CLIENT
  791. int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type);
  792. int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type)
  793. {
  794. TLSX *extension = TLSX_Find(ssl->extensions, type);
  795. if (!extension)
  796. extension = TLSX_Find(ssl->ctx->extensions, type);
  797. return extension == NULL;
  798. }
  799. int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl);
  800. int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl)
  801. {
  802. SendAlert(ssl, alert_fatal, unsupported_extension);
  803. return UNSUPPORTED_EXTENSION;
  804. }
  805. #else
  806. #define TLSX_CheckUnsupportedExtension(ssl, type) 0
  807. #define TLSX_HandleUnsupportedExtension(ssl) 0
  808. #endif
  809. #ifndef NO_WOLFSSL_SERVER
  810. /** Mark an extension to be sent back to the client. */
  811. void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type);
  812. void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type)
  813. {
  814. TLSX *extension = TLSX_Find(ssl->extensions, type);
  815. if (extension)
  816. extension->resp = 1;
  817. }
  818. #endif
  819. /******************************************************************************/
  820. /* Application-Layer Protocol Negotiation */
  821. /******************************************************************************/
  822. #ifdef HAVE_ALPN
  823. /** Creates a new ALPN object, providing protocol name to use. */
  824. static ALPN* TLSX_ALPN_New(char *protocol_name, word16 protocol_nameSz,
  825. void* heap)
  826. {
  827. ALPN *alpn;
  828. WOLFSSL_ENTER("TLSX_ALPN_New");
  829. if (protocol_name == NULL ||
  830. protocol_nameSz > WOLFSSL_MAX_ALPN_PROTO_NAME_LEN) {
  831. WOLFSSL_MSG("Invalid arguments");
  832. return NULL;
  833. }
  834. alpn = (ALPN*)XMALLOC(sizeof(ALPN), heap, DYNAMIC_TYPE_TLSX);
  835. if (alpn == NULL) {
  836. WOLFSSL_MSG("Memory failure");
  837. return NULL;
  838. }
  839. alpn->next = NULL;
  840. alpn->negotiated = 0;
  841. alpn->options = 0;
  842. alpn->protocol_name = (char*)XMALLOC(protocol_nameSz + 1,
  843. heap, DYNAMIC_TYPE_TLSX);
  844. if (alpn->protocol_name == NULL) {
  845. WOLFSSL_MSG("Memory failure");
  846. XFREE(alpn, heap, DYNAMIC_TYPE_TLSX);
  847. return NULL;
  848. }
  849. XMEMCPY(alpn->protocol_name, protocol_name, protocol_nameSz);
  850. alpn->protocol_name[protocol_nameSz] = 0;
  851. return alpn;
  852. }
  853. /** Releases an ALPN object. */
  854. static void TLSX_ALPN_Free(ALPN *alpn, void* heap)
  855. {
  856. (void)heap;
  857. if (alpn == NULL)
  858. return;
  859. XFREE(alpn->protocol_name, heap, DYNAMIC_TYPE_TLSX);
  860. XFREE(alpn, heap, DYNAMIC_TYPE_TLSX);
  861. }
  862. /** Releases all ALPN objects in the provided list. */
  863. static void TLSX_ALPN_FreeAll(ALPN *list, void* heap)
  864. {
  865. ALPN* alpn;
  866. while ((alpn = list)) {
  867. list = alpn->next;
  868. TLSX_ALPN_Free(alpn, heap);
  869. }
  870. }
  871. /** Tells the buffered size of the ALPN objects in a list. */
  872. static word16 TLSX_ALPN_GetSize(ALPN *list)
  873. {
  874. ALPN* alpn;
  875. word16 length = OPAQUE16_LEN; /* list length */
  876. while ((alpn = list)) {
  877. list = alpn->next;
  878. length++; /* protocol name length is on one byte */
  879. length += (word16)XSTRLEN(alpn->protocol_name);
  880. }
  881. return length;
  882. }
  883. /** Writes the ALPN objects of a list in a buffer. */
  884. static word16 TLSX_ALPN_Write(ALPN *list, byte *output)
  885. {
  886. ALPN* alpn;
  887. word16 length = 0;
  888. word16 offset = OPAQUE16_LEN; /* list length offset */
  889. while ((alpn = list)) {
  890. list = alpn->next;
  891. length = (word16)XSTRLEN(alpn->protocol_name);
  892. /* protocol name length */
  893. output[offset++] = (byte)length;
  894. /* protocol name value */
  895. XMEMCPY(output + offset, alpn->protocol_name, length);
  896. offset += length;
  897. }
  898. /* writing list length */
  899. c16toa(offset - OPAQUE16_LEN, output);
  900. return offset;
  901. }
  902. /** Finds a protocol name in the provided ALPN list */
  903. static ALPN* TLSX_ALPN_Find(ALPN *list, char *protocol_name, word16 size)
  904. {
  905. ALPN *alpn;
  906. if (list == NULL || protocol_name == NULL)
  907. return NULL;
  908. alpn = list;
  909. while (alpn != NULL && (
  910. (word16)XSTRLEN(alpn->protocol_name) != size ||
  911. XSTRNCMP(alpn->protocol_name, protocol_name, size)))
  912. alpn = alpn->next;
  913. return alpn;
  914. }
  915. /** Set the ALPN matching client and server requirements */
  916. static int TLSX_SetALPN(TLSX** extensions, const void* data, word16 size,
  917. void* heap)
  918. {
  919. ALPN *alpn;
  920. int ret;
  921. if (extensions == NULL || data == NULL)
  922. return BAD_FUNC_ARG;
  923. alpn = TLSX_ALPN_New((char *)data, size, heap);
  924. if (alpn == NULL) {
  925. WOLFSSL_MSG("Memory failure");
  926. return MEMORY_E;
  927. }
  928. alpn->negotiated = 1;
  929. ret = TLSX_Push(extensions, TLSX_APPLICATION_LAYER_PROTOCOL, (void*)alpn,
  930. heap);
  931. if (ret != 0) {
  932. TLSX_ALPN_Free(alpn, heap);
  933. return ret;
  934. }
  935. return WOLFSSL_SUCCESS;
  936. }
  937. /** Parses a buffer of ALPN extensions and set the first one matching
  938. * client and server requirements */
  939. static int TLSX_ALPN_ParseAndSet(WOLFSSL *ssl, byte *input, word16 length,
  940. byte isRequest)
  941. {
  942. word16 size = 0, offset = 0, idx = 0;
  943. int r = BUFFER_ERROR;
  944. byte match = 0;
  945. TLSX *extension;
  946. ALPN *alpn = NULL, *list;
  947. if (OPAQUE16_LEN > length)
  948. return BUFFER_ERROR;
  949. ato16(input, &size);
  950. offset += OPAQUE16_LEN;
  951. extension = TLSX_Find(ssl->extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
  952. if (extension == NULL)
  953. extension = TLSX_Find(ssl->ctx->extensions,
  954. TLSX_APPLICATION_LAYER_PROTOCOL);
  955. #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  956. if (ssl->alpnSelect != NULL) {
  957. const byte* out;
  958. unsigned char outLen;
  959. if (ssl->alpnSelect(ssl, &out, &outLen, input + offset, size,
  960. ssl->alpnSelectArg) == 0) {
  961. WOLFSSL_MSG("ALPN protocol match");
  962. if (TLSX_UseALPN(&ssl->extensions, (char*)out, outLen, 0, ssl->heap)
  963. == WOLFSSL_SUCCESS) {
  964. if (extension == NULL) {
  965. extension = TLSX_Find(ssl->extensions,
  966. TLSX_APPLICATION_LAYER_PROTOCOL);
  967. }
  968. }
  969. }
  970. }
  971. #endif
  972. if (extension == NULL || extension->data == NULL) {
  973. return isRequest ? 0
  974. : TLSX_HandleUnsupportedExtension(ssl);
  975. }
  976. /* validating alpn list length */
  977. if (length != OPAQUE16_LEN + size)
  978. return BUFFER_ERROR;
  979. list = (ALPN*)extension->data;
  980. /* keep the list sent by client */
  981. if (isRequest) {
  982. if (ssl->alpn_client_list != NULL)
  983. XFREE(ssl->alpn_client_list, ssl->heap, DYNAMIC_TYPE_ALPN);
  984. ssl->alpn_client_list = (char *)XMALLOC(size, ssl->heap,
  985. DYNAMIC_TYPE_ALPN);
  986. if (ssl->alpn_client_list == NULL)
  987. return MEMORY_ERROR;
  988. }
  989. for (size = 0; offset < length; offset += size) {
  990. size = input[offset++];
  991. if (offset + size > length)
  992. return BUFFER_ERROR;
  993. if (isRequest) {
  994. XMEMCPY(ssl->alpn_client_list+idx, (char*)input + offset, size);
  995. idx += size;
  996. ssl->alpn_client_list[idx++] = ',';
  997. }
  998. if (!match) {
  999. alpn = TLSX_ALPN_Find(list, (char*)input + offset, size);
  1000. if (alpn != NULL) {
  1001. WOLFSSL_MSG("ALPN protocol match");
  1002. match = 1;
  1003. /* skip reading other values if not required */
  1004. if (!isRequest)
  1005. break;
  1006. }
  1007. }
  1008. }
  1009. if (isRequest)
  1010. ssl->alpn_client_list[idx-1] = 0;
  1011. if (!match) {
  1012. WOLFSSL_MSG("No ALPN protocol match");
  1013. /* do nothing if no protocol match between client and server and option
  1014. is set to continue (like OpenSSL) */
  1015. if (list->options & WOLFSSL_ALPN_CONTINUE_ON_MISMATCH) {
  1016. WOLFSSL_MSG("Continue on mismatch");
  1017. return 0;
  1018. }
  1019. SendAlert(ssl, alert_fatal, no_application_protocol);
  1020. return UNKNOWN_ALPN_PROTOCOL_NAME_E;
  1021. }
  1022. /* set the matching negotiated protocol */
  1023. r = TLSX_SetALPN(&ssl->extensions,
  1024. alpn->protocol_name,
  1025. (word16)XSTRLEN(alpn->protocol_name),
  1026. ssl->heap);
  1027. if (r != WOLFSSL_SUCCESS) {
  1028. WOLFSSL_MSG("TLSX_UseALPN failed");
  1029. return BUFFER_ERROR;
  1030. }
  1031. /* reply to ALPN extension sent from client */
  1032. if (isRequest) {
  1033. #ifndef NO_WOLFSSL_SERVER
  1034. TLSX_SetResponse(ssl, TLSX_APPLICATION_LAYER_PROTOCOL);
  1035. #endif
  1036. }
  1037. return 0;
  1038. }
  1039. /** Add a protocol name to the list of accepted usable ones */
  1040. int TLSX_UseALPN(TLSX** extensions, const void* data, word16 size, byte options,
  1041. void* heap)
  1042. {
  1043. ALPN *alpn;
  1044. TLSX *extension;
  1045. int ret;
  1046. if (extensions == NULL || data == NULL)
  1047. return BAD_FUNC_ARG;
  1048. alpn = TLSX_ALPN_New((char *)data, size, heap);
  1049. if (alpn == NULL) {
  1050. WOLFSSL_MSG("Memory failure");
  1051. return MEMORY_E;
  1052. }
  1053. /* Set Options of ALPN */
  1054. alpn->options = options;
  1055. extension = TLSX_Find(*extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
  1056. if (extension == NULL) {
  1057. ret = TLSX_Push(extensions, TLSX_APPLICATION_LAYER_PROTOCOL,
  1058. (void*)alpn, heap);
  1059. if (ret != 0) {
  1060. TLSX_ALPN_Free(alpn, heap);
  1061. return ret;
  1062. }
  1063. }
  1064. else {
  1065. /* push new ALPN object to extension data. */
  1066. alpn->next = (ALPN*)extension->data;
  1067. extension->data = (void*)alpn;
  1068. }
  1069. return WOLFSSL_SUCCESS;
  1070. }
  1071. /** Get the protocol name set by the server */
  1072. int TLSX_ALPN_GetRequest(TLSX* extensions, void** data, word16 *dataSz)
  1073. {
  1074. TLSX *extension;
  1075. ALPN *alpn;
  1076. if (extensions == NULL || data == NULL || dataSz == NULL)
  1077. return BAD_FUNC_ARG;
  1078. extension = TLSX_Find(extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
  1079. if (extension == NULL) {
  1080. WOLFSSL_MSG("TLS extension not found");
  1081. return WOLFSSL_ALPN_NOT_FOUND;
  1082. }
  1083. alpn = (ALPN *)extension->data;
  1084. if (alpn == NULL) {
  1085. WOLFSSL_MSG("ALPN extension not found");
  1086. *data = NULL;
  1087. *dataSz = 0;
  1088. return WOLFSSL_FATAL_ERROR;
  1089. }
  1090. if (alpn->negotiated != 1) {
  1091. /* consider as an error */
  1092. if (alpn->options & WOLFSSL_ALPN_FAILED_ON_MISMATCH) {
  1093. WOLFSSL_MSG("No protocol match with peer -> Failed");
  1094. return WOLFSSL_FATAL_ERROR;
  1095. }
  1096. /* continue without negotiated protocol */
  1097. WOLFSSL_MSG("No protocol match with peer -> Continue");
  1098. return WOLFSSL_ALPN_NOT_FOUND;
  1099. }
  1100. if (alpn->next != NULL) {
  1101. WOLFSSL_MSG("Only one protocol name must be accepted");
  1102. return WOLFSSL_FATAL_ERROR;
  1103. }
  1104. *data = alpn->protocol_name;
  1105. *dataSz = (word16)XSTRLEN((char*)*data);
  1106. return WOLFSSL_SUCCESS;
  1107. }
  1108. #define ALPN_FREE_ALL TLSX_ALPN_FreeAll
  1109. #define ALPN_GET_SIZE TLSX_ALPN_GetSize
  1110. #define ALPN_WRITE TLSX_ALPN_Write
  1111. #define ALPN_PARSE TLSX_ALPN_ParseAndSet
  1112. #else /* HAVE_ALPN */
  1113. #define ALPN_FREE_ALL(list, heap)
  1114. #define ALPN_GET_SIZE(list) 0
  1115. #define ALPN_WRITE(a, b) 0
  1116. #define ALPN_PARSE(a, b, c, d) 0
  1117. #endif /* HAVE_ALPN */
  1118. /******************************************************************************/
  1119. /* Server Name Indication */
  1120. /******************************************************************************/
  1121. #ifdef HAVE_SNI
  1122. /** Creates a new SNI object. */
  1123. static SNI* TLSX_SNI_New(byte type, const void* data, word16 size, void* heap)
  1124. {
  1125. SNI* sni = (SNI*)XMALLOC(sizeof(SNI), heap, DYNAMIC_TYPE_TLSX);
  1126. if (sni) {
  1127. sni->type = type;
  1128. sni->next = NULL;
  1129. #ifndef NO_WOLFSSL_SERVER
  1130. sni->options = 0;
  1131. sni->status = WOLFSSL_SNI_NO_MATCH;
  1132. #endif
  1133. switch (sni->type) {
  1134. case WOLFSSL_SNI_HOST_NAME:
  1135. sni->data.host_name = (char*)XMALLOC(size + 1, heap,
  1136. DYNAMIC_TYPE_TLSX);
  1137. if (sni->data.host_name) {
  1138. XSTRNCPY(sni->data.host_name, (const char*)data, size);
  1139. sni->data.host_name[size] = 0;
  1140. } else {
  1141. XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
  1142. sni = NULL;
  1143. }
  1144. break;
  1145. default: /* invalid type */
  1146. XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
  1147. sni = NULL;
  1148. }
  1149. }
  1150. return sni;
  1151. }
  1152. /** Releases a SNI object. */
  1153. static void TLSX_SNI_Free(SNI* sni, void* heap)
  1154. {
  1155. if (sni) {
  1156. switch (sni->type) {
  1157. case WOLFSSL_SNI_HOST_NAME:
  1158. XFREE(sni->data.host_name, heap, DYNAMIC_TYPE_TLSX);
  1159. break;
  1160. }
  1161. XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
  1162. }
  1163. (void)heap;
  1164. }
  1165. /** Releases all SNI objects in the provided list. */
  1166. static void TLSX_SNI_FreeAll(SNI* list, void* heap)
  1167. {
  1168. SNI* sni;
  1169. while ((sni = list)) {
  1170. list = sni->next;
  1171. TLSX_SNI_Free(sni, heap);
  1172. }
  1173. }
  1174. /** Tells the buffered size of the SNI objects in a list. */
  1175. static word16 TLSX_SNI_GetSize(SNI* list)
  1176. {
  1177. SNI* sni;
  1178. word16 length = OPAQUE16_LEN; /* list length */
  1179. while ((sni = list)) {
  1180. list = sni->next;
  1181. length += ENUM_LEN + OPAQUE16_LEN; /* sni type + sni length */
  1182. switch (sni->type) {
  1183. case WOLFSSL_SNI_HOST_NAME:
  1184. length += (word16)XSTRLEN((char*)sni->data.host_name);
  1185. break;
  1186. }
  1187. }
  1188. return length;
  1189. }
  1190. /** Writes the SNI objects of a list in a buffer. */
  1191. static word16 TLSX_SNI_Write(SNI* list, byte* output)
  1192. {
  1193. SNI* sni;
  1194. word16 length = 0;
  1195. word16 offset = OPAQUE16_LEN; /* list length offset */
  1196. while ((sni = list)) {
  1197. list = sni->next;
  1198. output[offset++] = sni->type; /* sni type */
  1199. switch (sni->type) {
  1200. case WOLFSSL_SNI_HOST_NAME:
  1201. length = (word16)XSTRLEN((char*)sni->data.host_name);
  1202. c16toa(length, output + offset); /* sni length */
  1203. offset += OPAQUE16_LEN;
  1204. XMEMCPY(output + offset, sni->data.host_name, length);
  1205. offset += length;
  1206. break;
  1207. }
  1208. }
  1209. c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
  1210. return offset;
  1211. }
  1212. /** Finds a SNI object in the provided list. */
  1213. static SNI* TLSX_SNI_Find(SNI *list, byte type)
  1214. {
  1215. SNI* sni = list;
  1216. while (sni && sni->type != type)
  1217. sni = sni->next;
  1218. return sni;
  1219. }
  1220. /** Sets the status of a SNI object. */
  1221. static void TLSX_SNI_SetStatus(TLSX* extensions, byte type, byte status)
  1222. {
  1223. TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
  1224. SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
  1225. if (sni)
  1226. sni->status = status;
  1227. }
  1228. /** Gets the status of a SNI object. */
  1229. byte TLSX_SNI_Status(TLSX* extensions, byte type)
  1230. {
  1231. TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
  1232. SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
  1233. if (sni)
  1234. return sni->status;
  1235. return 0;
  1236. }
  1237. /** Parses a buffer of SNI extensions. */
  1238. static int TLSX_SNI_Parse(WOLFSSL* ssl, byte* input, word16 length,
  1239. byte isRequest)
  1240. {
  1241. #ifndef NO_WOLFSSL_SERVER
  1242. word16 size = 0;
  1243. word16 offset = 0;
  1244. int cacheOnly = 0;
  1245. #endif
  1246. TLSX *extension = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
  1247. if (!extension)
  1248. extension = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
  1249. if (!isRequest) {
  1250. #ifndef NO_WOLFSSL_CLIENT
  1251. if (!extension || !extension->data)
  1252. return TLSX_HandleUnsupportedExtension(ssl);
  1253. if (length > 0)
  1254. return BUFFER_ERROR; /* SNI response MUST be empty. */
  1255. /* This call enables wolfSSL_SNI_GetRequest() to be called in the
  1256. * client side to fetch the used SNI. It will only work if the SNI
  1257. * was set at the SSL object level. Right now we only support one
  1258. * name type, WOLFSSL_SNI_HOST_NAME, but in the future, the
  1259. * inclusion of other name types will turn this method inaccurate,
  1260. * as the extension response doesn't contains information of which
  1261. * name was accepted.
  1262. */
  1263. TLSX_SNI_SetStatus(ssl->extensions, WOLFSSL_SNI_HOST_NAME,
  1264. WOLFSSL_SNI_REAL_MATCH);
  1265. return 0;
  1266. #endif
  1267. }
  1268. #ifndef NO_WOLFSSL_SERVER
  1269. if (!extension || !extension->data) {
  1270. #if defined(WOLFSSL_ALWAYS_KEEP_SNI) && !defined(NO_WOLFSSL_SERVER)
  1271. /* This will keep SNI even though TLSX_UseSNI has not been called.
  1272. * Enable it so that the received sni is available to functions
  1273. * that use a custom callback when SNI is received.
  1274. */
  1275. cacheOnly = 1;
  1276. WOLFSSL_MSG("Forcing SSL object to store SNI parameter");
  1277. #else
  1278. /* Skipping, SNI not enabled at server side. */
  1279. return 0;
  1280. #endif
  1281. }
  1282. if (OPAQUE16_LEN > length)
  1283. return BUFFER_ERROR;
  1284. ato16(input, &size);
  1285. offset += OPAQUE16_LEN;
  1286. /* validating sni list length */
  1287. if (length != OPAQUE16_LEN + size)
  1288. return BUFFER_ERROR;
  1289. for (size = 0; offset < length; offset += size) {
  1290. SNI *sni = NULL;
  1291. byte type = input[offset++];
  1292. if (offset + OPAQUE16_LEN > length)
  1293. return BUFFER_ERROR;
  1294. ato16(input + offset, &size);
  1295. offset += OPAQUE16_LEN;
  1296. if (offset + size > length)
  1297. return BUFFER_ERROR;
  1298. if (!cacheOnly && !(sni = TLSX_SNI_Find((SNI*)extension->data, type)))
  1299. continue; /* not using this type of SNI. */
  1300. switch(type) {
  1301. case WOLFSSL_SNI_HOST_NAME: {
  1302. int matchStat;
  1303. byte matched;
  1304. #ifdef WOLFSSL_TLS13
  1305. /* Don't process the second ClientHello SNI extension if there
  1306. * was problems with the first.
  1307. */
  1308. if (!cacheOnly && sni->status != 0)
  1309. break;
  1310. #endif
  1311. matched = cacheOnly ||
  1312. ((XSTRLEN(sni->data.host_name) == size) &&
  1313. (XSTRNCMP(sni->data.host_name,
  1314. (const char*)input + offset, size) == 0));
  1315. if (matched || sni->options & WOLFSSL_SNI_ANSWER_ON_MISMATCH) {
  1316. int r = TLSX_UseSNI(&ssl->extensions,
  1317. type, input + offset, size, ssl->heap);
  1318. if (r != WOLFSSL_SUCCESS)
  1319. return r; /* throws error. */
  1320. if(cacheOnly) {
  1321. WOLFSSL_MSG("Forcing storage of SNI, Fake match");
  1322. matchStat = WOLFSSL_SNI_FORCE_KEEP;
  1323. } else if(matched) {
  1324. WOLFSSL_MSG("SNI did match!");
  1325. matchStat = WOLFSSL_SNI_REAL_MATCH;
  1326. } else {
  1327. WOLFSSL_MSG("fake SNI match from ANSWER_ON_MISMATCH");
  1328. matchStat = WOLFSSL_SNI_FAKE_MATCH;
  1329. }
  1330. TLSX_SNI_SetStatus(ssl->extensions, type, (byte)matchStat);
  1331. if(!cacheOnly)
  1332. TLSX_SetResponse(ssl, TLSX_SERVER_NAME);
  1333. } else if (!(sni->options & WOLFSSL_SNI_CONTINUE_ON_MISMATCH)) {
  1334. SendAlert(ssl, alert_fatal, unrecognized_name);
  1335. return UNKNOWN_SNI_HOST_NAME_E;
  1336. }
  1337. break;
  1338. }
  1339. }
  1340. }
  1341. #else
  1342. (void)input;
  1343. #endif
  1344. return 0;
  1345. }
  1346. static int TLSX_SNI_VerifyParse(WOLFSSL* ssl, byte isRequest)
  1347. {
  1348. (void)ssl;
  1349. if (isRequest) {
  1350. #ifndef NO_WOLFSSL_SERVER
  1351. TLSX* ctx_ext = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
  1352. TLSX* ssl_ext = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
  1353. SNI* ctx_sni = ctx_ext ? (SNI*)ctx_ext->data : NULL;
  1354. SNI* ssl_sni = ssl_ext ? (SNI*)ssl_ext->data : NULL;
  1355. SNI* sni = NULL;
  1356. for (; ctx_sni; ctx_sni = ctx_sni->next) {
  1357. if (ctx_sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) {
  1358. sni = TLSX_SNI_Find(ssl_sni, ctx_sni->type);
  1359. if (sni) {
  1360. if (sni->status != WOLFSSL_SNI_NO_MATCH)
  1361. continue;
  1362. /* if ssl level overrides ctx level, it is ok. */
  1363. if ((sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) == 0)
  1364. continue;
  1365. }
  1366. SendAlert(ssl, alert_fatal, handshake_failure);
  1367. return SNI_ABSENT_ERROR;
  1368. }
  1369. }
  1370. for (; ssl_sni; ssl_sni = ssl_sni->next) {
  1371. if (ssl_sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) {
  1372. if (ssl_sni->status != WOLFSSL_SNI_NO_MATCH)
  1373. continue;
  1374. SendAlert(ssl, alert_fatal, handshake_failure);
  1375. return SNI_ABSENT_ERROR;
  1376. }
  1377. }
  1378. #endif /* NO_WOLFSSL_SERVER */
  1379. }
  1380. return 0;
  1381. }
  1382. int TLSX_UseSNI(TLSX** extensions, byte type, const void* data, word16 size,
  1383. void* heap)
  1384. {
  1385. TLSX* extension;
  1386. SNI* sni = NULL;
  1387. if (extensions == NULL || data == NULL)
  1388. return BAD_FUNC_ARG;
  1389. if ((sni = TLSX_SNI_New(type, data, size, heap)) == NULL)
  1390. return MEMORY_E;
  1391. extension = TLSX_Find(*extensions, TLSX_SERVER_NAME);
  1392. if (!extension) {
  1393. int ret = TLSX_Push(extensions, TLSX_SERVER_NAME, (void*)sni, heap);
  1394. if (ret != 0) {
  1395. TLSX_SNI_Free(sni, heap);
  1396. return ret;
  1397. }
  1398. }
  1399. else {
  1400. /* push new SNI object to extension data. */
  1401. sni->next = (SNI*)extension->data;
  1402. extension->data = (void*)sni;
  1403. /* remove duplicate SNI, there should be only one of each type. */
  1404. do {
  1405. if (sni->next && sni->next->type == type) {
  1406. SNI* next = sni->next;
  1407. sni->next = next->next;
  1408. TLSX_SNI_Free(next, heap);
  1409. /* there is no way to occur more than
  1410. * two SNIs of the same type.
  1411. */
  1412. break;
  1413. }
  1414. } while ((sni = sni->next));
  1415. }
  1416. return WOLFSSL_SUCCESS;
  1417. }
  1418. #ifndef NO_WOLFSSL_SERVER
  1419. /** Tells the SNI requested by the client. */
  1420. word16 TLSX_SNI_GetRequest(TLSX* extensions, byte type, void** data)
  1421. {
  1422. TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
  1423. SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
  1424. if (sni && sni->status != WOLFSSL_SNI_NO_MATCH) {
  1425. switch (sni->type) {
  1426. case WOLFSSL_SNI_HOST_NAME:
  1427. if (data) {
  1428. *data = sni->data.host_name;
  1429. return (word16)XSTRLEN((char*)*data);
  1430. }
  1431. }
  1432. }
  1433. return 0;
  1434. }
  1435. /** Sets the options for a SNI object. */
  1436. void TLSX_SNI_SetOptions(TLSX* extensions, byte type, byte options)
  1437. {
  1438. TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
  1439. SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
  1440. if (sni)
  1441. sni->options = options;
  1442. }
  1443. /** Retrieves a SNI request from a client hello buffer. */
  1444. int TLSX_SNI_GetFromBuffer(const byte* clientHello, word32 helloSz,
  1445. byte type, byte* sni, word32* inOutSz)
  1446. {
  1447. word32 offset = 0;
  1448. word32 len32 = 0;
  1449. word16 len16 = 0;
  1450. if (helloSz < RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + CLIENT_HELLO_FIRST)
  1451. return INCOMPLETE_DATA;
  1452. /* TLS record header */
  1453. if ((enum ContentType) clientHello[offset++] != handshake) {
  1454. /* checking for SSLv2.0 client hello according to: */
  1455. /* http://tools.ietf.org/html/rfc4346#appendix-E.1 */
  1456. if ((enum HandShakeType) clientHello[++offset] == client_hello) {
  1457. offset += ENUM_LEN + VERSION_SZ; /* skip version */
  1458. ato16(clientHello + offset, &len16);
  1459. offset += OPAQUE16_LEN;
  1460. if (len16 % 3) /* cipher_spec_length must be multiple of 3 */
  1461. return BUFFER_ERROR;
  1462. ato16(clientHello + offset, &len16);
  1463. /* Returning SNI_UNSUPPORTED do not increment offset here */
  1464. if (len16 != 0) /* session_id_length must be 0 */
  1465. return BUFFER_ERROR;
  1466. return SNI_UNSUPPORTED;
  1467. }
  1468. return BUFFER_ERROR;
  1469. }
  1470. if (clientHello[offset++] != SSLv3_MAJOR)
  1471. return BUFFER_ERROR;
  1472. if (clientHello[offset++] < TLSv1_MINOR)
  1473. return SNI_UNSUPPORTED;
  1474. ato16(clientHello + offset, &len16);
  1475. offset += OPAQUE16_LEN;
  1476. if (offset + len16 > helloSz)
  1477. return INCOMPLETE_DATA;
  1478. /* Handshake header */
  1479. if ((enum HandShakeType) clientHello[offset] != client_hello)
  1480. return BUFFER_ERROR;
  1481. c24to32(clientHello + offset + 1, &len32);
  1482. offset += HANDSHAKE_HEADER_SZ;
  1483. if (offset + len32 > helloSz)
  1484. return BUFFER_ERROR;
  1485. /* client hello */
  1486. offset += VERSION_SZ + RAN_LEN; /* version, random */
  1487. if (helloSz < offset + clientHello[offset])
  1488. return BUFFER_ERROR;
  1489. offset += ENUM_LEN + clientHello[offset]; /* skip session id */
  1490. /* cypher suites */
  1491. if (helloSz < offset + OPAQUE16_LEN)
  1492. return BUFFER_ERROR;
  1493. ato16(clientHello + offset, &len16);
  1494. offset += OPAQUE16_LEN;
  1495. if (helloSz < offset + len16)
  1496. return BUFFER_ERROR;
  1497. offset += len16; /* skip cypher suites */
  1498. /* compression methods */
  1499. if (helloSz < offset + 1)
  1500. return BUFFER_ERROR;
  1501. if (helloSz < offset + clientHello[offset])
  1502. return BUFFER_ERROR;
  1503. offset += ENUM_LEN + clientHello[offset]; /* skip compression methods */
  1504. /* extensions */
  1505. if (helloSz < offset + OPAQUE16_LEN)
  1506. return 0; /* no extensions in client hello. */
  1507. ato16(clientHello + offset, &len16);
  1508. offset += OPAQUE16_LEN;
  1509. if (helloSz < offset + len16)
  1510. return BUFFER_ERROR;
  1511. while (len16 >= OPAQUE16_LEN + OPAQUE16_LEN) {
  1512. word16 extType;
  1513. word16 extLen;
  1514. ato16(clientHello + offset, &extType);
  1515. offset += OPAQUE16_LEN;
  1516. ato16(clientHello + offset, &extLen);
  1517. offset += OPAQUE16_LEN;
  1518. if (helloSz < offset + extLen)
  1519. return BUFFER_ERROR;
  1520. if (extType != TLSX_SERVER_NAME) {
  1521. offset += extLen; /* skip extension */
  1522. } else {
  1523. word16 listLen;
  1524. ato16(clientHello + offset, &listLen);
  1525. offset += OPAQUE16_LEN;
  1526. if (helloSz < offset + listLen)
  1527. return BUFFER_ERROR;
  1528. while (listLen > ENUM_LEN + OPAQUE16_LEN) {
  1529. byte sniType = clientHello[offset++];
  1530. word16 sniLen;
  1531. ato16(clientHello + offset, &sniLen);
  1532. offset += OPAQUE16_LEN;
  1533. if (helloSz < offset + sniLen)
  1534. return BUFFER_ERROR;
  1535. if (sniType != type) {
  1536. offset += sniLen;
  1537. listLen -= min(ENUM_LEN + OPAQUE16_LEN + sniLen, listLen);
  1538. continue;
  1539. }
  1540. *inOutSz = min(sniLen, *inOutSz);
  1541. XMEMCPY(sni, clientHello + offset, *inOutSz);
  1542. return WOLFSSL_SUCCESS;
  1543. }
  1544. }
  1545. len16 -= min(2 * OPAQUE16_LEN + extLen, len16);
  1546. }
  1547. return len16 ? BUFFER_ERROR : 0;
  1548. }
  1549. #endif
  1550. #define SNI_FREE_ALL TLSX_SNI_FreeAll
  1551. #define SNI_GET_SIZE TLSX_SNI_GetSize
  1552. #define SNI_WRITE TLSX_SNI_Write
  1553. #define SNI_PARSE TLSX_SNI_Parse
  1554. #define SNI_VERIFY_PARSE TLSX_SNI_VerifyParse
  1555. #else
  1556. #define SNI_FREE_ALL(list, heap)
  1557. #define SNI_GET_SIZE(list) 0
  1558. #define SNI_WRITE(a, b) 0
  1559. #define SNI_PARSE(a, b, c, d) 0
  1560. #define SNI_VERIFY_PARSE(a, b) 0
  1561. #endif /* HAVE_SNI */
  1562. /******************************************************************************/
  1563. /* Max Fragment Length Negotiation */
  1564. /******************************************************************************/
  1565. #ifdef HAVE_MAX_FRAGMENT
  1566. static word16 TLSX_MFL_Write(byte* data, byte* output)
  1567. {
  1568. output[0] = data[0];
  1569. return ENUM_LEN;
  1570. }
  1571. static int TLSX_MFL_Parse(WOLFSSL* ssl, byte* input, word16 length,
  1572. byte isRequest)
  1573. {
  1574. if (length != ENUM_LEN)
  1575. return BUFFER_ERROR;
  1576. #ifdef WOLFSSL_OLD_UNSUPPORTED_EXTENSION
  1577. (void) isRequest;
  1578. #else
  1579. if (!isRequest)
  1580. if (TLSX_CheckUnsupportedExtension(ssl, TLSX_MAX_FRAGMENT_LENGTH))
  1581. return TLSX_HandleUnsupportedExtension(ssl);
  1582. #endif
  1583. switch (*input) {
  1584. case WOLFSSL_MFL_2_9 : ssl->max_fragment = 512; break;
  1585. case WOLFSSL_MFL_2_10: ssl->max_fragment = 1024; break;
  1586. case WOLFSSL_MFL_2_11: ssl->max_fragment = 2048; break;
  1587. case WOLFSSL_MFL_2_12: ssl->max_fragment = 4096; break;
  1588. case WOLFSSL_MFL_2_13: ssl->max_fragment = 8192; break;
  1589. default:
  1590. SendAlert(ssl, alert_fatal, illegal_parameter);
  1591. return UNKNOWN_MAX_FRAG_LEN_E;
  1592. }
  1593. #ifndef NO_WOLFSSL_SERVER
  1594. if (isRequest) {
  1595. int ret = TLSX_UseMaxFragment(&ssl->extensions, *input, ssl->heap);
  1596. if (ret != WOLFSSL_SUCCESS)
  1597. return ret; /* throw error */
  1598. TLSX_SetResponse(ssl, TLSX_MAX_FRAGMENT_LENGTH);
  1599. }
  1600. #endif
  1601. return 0;
  1602. }
  1603. int TLSX_UseMaxFragment(TLSX** extensions, byte mfl, void* heap)
  1604. {
  1605. byte* data = NULL;
  1606. int ret = 0;
  1607. if (extensions == NULL || mfl < WOLFSSL_MFL_2_9 || WOLFSSL_MFL_2_13 < mfl)
  1608. return BAD_FUNC_ARG;
  1609. data = (byte*)XMALLOC(ENUM_LEN, heap, DYNAMIC_TYPE_TLSX);
  1610. if (data == NULL)
  1611. return MEMORY_E;
  1612. data[0] = mfl;
  1613. ret = TLSX_Push(extensions, TLSX_MAX_FRAGMENT_LENGTH, data, heap);
  1614. if (ret != 0) {
  1615. XFREE(data, heap, DYNAMIC_TYPE_TLSX);
  1616. return ret;
  1617. }
  1618. return WOLFSSL_SUCCESS;
  1619. }
  1620. #define MFL_FREE_ALL(data, heap) XFREE(data, (heap), DYNAMIC_TYPE_TLSX)
  1621. #define MFL_GET_SIZE(data) ENUM_LEN
  1622. #define MFL_WRITE TLSX_MFL_Write
  1623. #define MFL_PARSE TLSX_MFL_Parse
  1624. #else
  1625. #define MFL_FREE_ALL(a, b)
  1626. #define MFL_GET_SIZE(a) 0
  1627. #define MFL_WRITE(a, b) 0
  1628. #define MFL_PARSE(a, b, c, d) 0
  1629. #endif /* HAVE_MAX_FRAGMENT */
  1630. /******************************************************************************/
  1631. /* Truncated HMAC */
  1632. /******************************************************************************/
  1633. #ifdef HAVE_TRUNCATED_HMAC
  1634. static int TLSX_THM_Parse(WOLFSSL* ssl, byte* input, word16 length,
  1635. byte isRequest)
  1636. {
  1637. if (length != 0 || input == NULL)
  1638. return BUFFER_ERROR;
  1639. if (!isRequest) {
  1640. #ifndef WOLFSSL_OLD_UNSUPPORTED_EXTENSION
  1641. if (TLSX_CheckUnsupportedExtension(ssl, TLSX_TRUNCATED_HMAC))
  1642. return TLSX_HandleUnsupportedExtension(ssl);
  1643. #endif
  1644. }
  1645. else {
  1646. #ifndef NO_WOLFSSL_SERVER
  1647. int ret = TLSX_UseTruncatedHMAC(&ssl->extensions, ssl->heap);
  1648. if (ret != WOLFSSL_SUCCESS)
  1649. return ret; /* throw error */
  1650. TLSX_SetResponse(ssl, TLSX_TRUNCATED_HMAC);
  1651. #endif
  1652. }
  1653. ssl->truncated_hmac = 1;
  1654. return 0;
  1655. }
  1656. int TLSX_UseTruncatedHMAC(TLSX** extensions, void* heap)
  1657. {
  1658. int ret = 0;
  1659. if (extensions == NULL)
  1660. return BAD_FUNC_ARG;
  1661. ret = TLSX_Push(extensions, TLSX_TRUNCATED_HMAC, NULL, heap);
  1662. if (ret != 0)
  1663. return ret;
  1664. return WOLFSSL_SUCCESS;
  1665. }
  1666. #define THM_PARSE TLSX_THM_Parse
  1667. #else
  1668. #define THM_PARSE(a, b, c, d) 0
  1669. #endif /* HAVE_TRUNCATED_HMAC */
  1670. /******************************************************************************/
  1671. /* Certificate Status Request */
  1672. /******************************************************************************/
  1673. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  1674. static void TLSX_CSR_Free(CertificateStatusRequest* csr, void* heap)
  1675. {
  1676. switch (csr->status_type) {
  1677. case WOLFSSL_CSR_OCSP:
  1678. FreeOcspRequest(&csr->request.ocsp);
  1679. break;
  1680. }
  1681. XFREE(csr, heap, DYNAMIC_TYPE_TLSX);
  1682. (void)heap;
  1683. }
  1684. static word16 TLSX_CSR_GetSize(CertificateStatusRequest* csr, byte isRequest)
  1685. {
  1686. word16 size = 0;
  1687. /* shut up compiler warnings */
  1688. (void) csr; (void) isRequest;
  1689. #ifndef NO_WOLFSSL_CLIENT
  1690. if (isRequest) {
  1691. switch (csr->status_type) {
  1692. case WOLFSSL_CSR_OCSP:
  1693. size += ENUM_LEN + 2 * OPAQUE16_LEN;
  1694. if (csr->request.ocsp.nonceSz)
  1695. size += OCSP_NONCE_EXT_SZ;
  1696. break;
  1697. }
  1698. }
  1699. #endif
  1700. return size;
  1701. }
  1702. static word16 TLSX_CSR_Write(CertificateStatusRequest* csr, byte* output,
  1703. byte isRequest)
  1704. {
  1705. /* shut up compiler warnings */
  1706. (void) csr; (void) output; (void) isRequest;
  1707. #ifndef NO_WOLFSSL_CLIENT
  1708. if (isRequest) {
  1709. word16 offset = 0;
  1710. word16 length = 0;
  1711. /* type */
  1712. output[offset++] = csr->status_type;
  1713. switch (csr->status_type) {
  1714. case WOLFSSL_CSR_OCSP:
  1715. /* responder id list */
  1716. c16toa(0, output + offset);
  1717. offset += OPAQUE16_LEN;
  1718. /* request extensions */
  1719. if (csr->request.ocsp.nonceSz)
  1720. length = (word16)EncodeOcspRequestExtensions(
  1721. &csr->request.ocsp,
  1722. output + offset + OPAQUE16_LEN,
  1723. OCSP_NONCE_EXT_SZ);
  1724. c16toa(length, output + offset);
  1725. offset += OPAQUE16_LEN + length;
  1726. break;
  1727. }
  1728. return offset;
  1729. }
  1730. #endif
  1731. return 0;
  1732. }
  1733. static int TLSX_CSR_Parse(WOLFSSL* ssl, byte* input, word16 length,
  1734. byte isRequest)
  1735. {
  1736. int ret;
  1737. /* shut up compiler warnings */
  1738. (void) ssl; (void) input;
  1739. if (!isRequest) {
  1740. #ifndef NO_WOLFSSL_CLIENT
  1741. TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
  1742. CertificateStatusRequest* csr = extension ?
  1743. (CertificateStatusRequest*)extension->data : NULL;
  1744. if (!csr) {
  1745. /* look at context level */
  1746. extension = TLSX_Find(ssl->ctx->extensions, TLSX_STATUS_REQUEST);
  1747. csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
  1748. if (!csr) /* unexpected extension */
  1749. return TLSX_HandleUnsupportedExtension(ssl);
  1750. /* enable extension at ssl level */
  1751. ret = TLSX_UseCertificateStatusRequest(&ssl->extensions,
  1752. csr->status_type, csr->options, ssl->heap,
  1753. ssl->devId);
  1754. if (ret != WOLFSSL_SUCCESS)
  1755. return ret;
  1756. switch (csr->status_type) {
  1757. case WOLFSSL_CSR_OCSP:
  1758. /* propagate nonce */
  1759. if (csr->request.ocsp.nonceSz) {
  1760. OcspRequest* request =
  1761. (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
  1762. if (request) {
  1763. XMEMCPY(request->nonce, csr->request.ocsp.nonce,
  1764. csr->request.ocsp.nonceSz);
  1765. request->nonceSz = csr->request.ocsp.nonceSz;
  1766. }
  1767. }
  1768. break;
  1769. }
  1770. }
  1771. ssl->status_request = 1;
  1772. return length ? BUFFER_ERROR : 0; /* extension_data MUST be empty. */
  1773. #endif
  1774. }
  1775. else {
  1776. #ifndef NO_WOLFSSL_SERVER
  1777. byte status_type;
  1778. word16 offset = 0;
  1779. word16 size = 0;
  1780. if (length < ENUM_LEN)
  1781. return BUFFER_ERROR;
  1782. status_type = input[offset++];
  1783. switch (status_type) {
  1784. case WOLFSSL_CSR_OCSP: {
  1785. /* skip responder_id_list */
  1786. if (length - offset < OPAQUE16_LEN)
  1787. return BUFFER_ERROR;
  1788. ato16(input + offset, &size);
  1789. offset += OPAQUE16_LEN + size;
  1790. /* skip request_extensions */
  1791. if (length - offset < OPAQUE16_LEN)
  1792. return BUFFER_ERROR;
  1793. ato16(input + offset, &size);
  1794. offset += OPAQUE16_LEN + size;
  1795. if (offset > length)
  1796. return BUFFER_ERROR;
  1797. /* is able to send OCSP response? */
  1798. if (ssl->ctx->cm == NULL || !ssl->ctx->cm->ocspStaplingEnabled)
  1799. return 0;
  1800. }
  1801. break;
  1802. /* unknown status type */
  1803. default:
  1804. return 0;
  1805. }
  1806. /* if using status_request and already sending it, skip this one */
  1807. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  1808. if (ssl->status_request_v2)
  1809. return 0;
  1810. #endif
  1811. /* accept the first good status_type and return */
  1812. ret = TLSX_UseCertificateStatusRequest(&ssl->extensions, status_type,
  1813. 0, ssl->heap, ssl->devId);
  1814. if (ret != WOLFSSL_SUCCESS)
  1815. return ret; /* throw error */
  1816. TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST);
  1817. ssl->status_request = status_type;
  1818. #endif
  1819. }
  1820. return 0;
  1821. }
  1822. int TLSX_CSR_InitRequest(TLSX* extensions, DecodedCert* cert, void* heap)
  1823. {
  1824. TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST);
  1825. CertificateStatusRequest* csr = extension ?
  1826. (CertificateStatusRequest*)extension->data : NULL;
  1827. int ret = 0;
  1828. if (csr) {
  1829. switch (csr->status_type) {
  1830. case WOLFSSL_CSR_OCSP: {
  1831. byte nonce[MAX_OCSP_NONCE_SZ];
  1832. int nonceSz = csr->request.ocsp.nonceSz;
  1833. /* preserve nonce */
  1834. XMEMCPY(nonce, csr->request.ocsp.nonce, nonceSz);
  1835. if ((ret = InitOcspRequest(&csr->request.ocsp, cert, 0, heap))
  1836. != 0)
  1837. return ret;
  1838. /* restore nonce */
  1839. XMEMCPY(csr->request.ocsp.nonce, nonce, nonceSz);
  1840. csr->request.ocsp.nonceSz = nonceSz;
  1841. }
  1842. break;
  1843. }
  1844. }
  1845. return ret;
  1846. }
  1847. void* TLSX_CSR_GetRequest(TLSX* extensions)
  1848. {
  1849. TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST);
  1850. CertificateStatusRequest* csr = extension ?
  1851. (CertificateStatusRequest*)extension->data : NULL;
  1852. if (csr) {
  1853. switch (csr->status_type) {
  1854. case WOLFSSL_CSR_OCSP:
  1855. return &csr->request.ocsp;
  1856. break;
  1857. }
  1858. }
  1859. return NULL;
  1860. }
  1861. int TLSX_CSR_ForceRequest(WOLFSSL* ssl)
  1862. {
  1863. TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
  1864. CertificateStatusRequest* csr = extension ?
  1865. (CertificateStatusRequest*)extension->data : NULL;
  1866. if (csr) {
  1867. switch (csr->status_type) {
  1868. case WOLFSSL_CSR_OCSP:
  1869. if (ssl->ctx->cm->ocspEnabled) {
  1870. csr->request.ocsp.ssl = ssl;
  1871. return CheckOcspRequest(ssl->ctx->cm->ocsp,
  1872. &csr->request.ocsp, NULL);
  1873. }
  1874. else
  1875. return OCSP_LOOKUP_FAIL;
  1876. }
  1877. }
  1878. return 0;
  1879. }
  1880. int TLSX_UseCertificateStatusRequest(TLSX** extensions, byte status_type,
  1881. byte options, void* heap, int devId)
  1882. {
  1883. CertificateStatusRequest* csr = NULL;
  1884. int ret = 0;
  1885. if (!extensions || status_type != WOLFSSL_CSR_OCSP)
  1886. return BAD_FUNC_ARG;
  1887. csr = (CertificateStatusRequest*)
  1888. XMALLOC(sizeof(CertificateStatusRequest), heap, DYNAMIC_TYPE_TLSX);
  1889. if (!csr)
  1890. return MEMORY_E;
  1891. ForceZero(csr, sizeof(CertificateStatusRequest));
  1892. csr->status_type = status_type;
  1893. csr->options = options;
  1894. switch (csr->status_type) {
  1895. case WOLFSSL_CSR_OCSP:
  1896. if (options & WOLFSSL_CSR_OCSP_USE_NONCE) {
  1897. WC_RNG rng;
  1898. #ifndef HAVE_FIPS
  1899. ret = wc_InitRng_ex(&rng, heap, devId);
  1900. #else
  1901. ret = wc_InitRng(&rng);
  1902. (void)devId;
  1903. #endif
  1904. if (ret == 0) {
  1905. if (wc_RNG_GenerateBlock(&rng, csr->request.ocsp.nonce,
  1906. MAX_OCSP_NONCE_SZ) == 0)
  1907. csr->request.ocsp.nonceSz = MAX_OCSP_NONCE_SZ;
  1908. wc_FreeRng(&rng);
  1909. }
  1910. }
  1911. break;
  1912. }
  1913. if ((ret = TLSX_Push(extensions, TLSX_STATUS_REQUEST, csr, heap)) != 0) {
  1914. XFREE(csr, heap, DYNAMIC_TYPE_TLSX);
  1915. return ret;
  1916. }
  1917. return WOLFSSL_SUCCESS;
  1918. }
  1919. #define CSR_FREE_ALL TLSX_CSR_Free
  1920. #define CSR_GET_SIZE TLSX_CSR_GetSize
  1921. #define CSR_WRITE TLSX_CSR_Write
  1922. #define CSR_PARSE TLSX_CSR_Parse
  1923. #else
  1924. #define CSR_FREE_ALL(data, heap)
  1925. #define CSR_GET_SIZE(a, b) 0
  1926. #define CSR_WRITE(a, b, c) 0
  1927. #define CSR_PARSE(a, b, c, d) 0
  1928. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  1929. /******************************************************************************/
  1930. /* Certificate Status Request v2 */
  1931. /******************************************************************************/
  1932. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  1933. static void TLSX_CSR2_FreeAll(CertificateStatusRequestItemV2* csr2, void* heap)
  1934. {
  1935. CertificateStatusRequestItemV2* next;
  1936. for (; csr2; csr2 = next) {
  1937. next = csr2->next;
  1938. switch (csr2->status_type) {
  1939. case WOLFSSL_CSR2_OCSP:
  1940. case WOLFSSL_CSR2_OCSP_MULTI:
  1941. while(csr2->requests--)
  1942. FreeOcspRequest(&csr2->request.ocsp[csr2->requests]);
  1943. break;
  1944. }
  1945. XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
  1946. }
  1947. (void)heap;
  1948. }
  1949. static word16 TLSX_CSR2_GetSize(CertificateStatusRequestItemV2* csr2,
  1950. byte isRequest)
  1951. {
  1952. word16 size = 0;
  1953. /* shut up compiler warnings */
  1954. (void) csr2; (void) isRequest;
  1955. #ifndef NO_WOLFSSL_CLIENT
  1956. if (isRequest) {
  1957. CertificateStatusRequestItemV2* next;
  1958. for (size = OPAQUE16_LEN; csr2; csr2 = next) {
  1959. next = csr2->next;
  1960. switch (csr2->status_type) {
  1961. case WOLFSSL_CSR2_OCSP:
  1962. case WOLFSSL_CSR2_OCSP_MULTI:
  1963. size += ENUM_LEN + 3 * OPAQUE16_LEN;
  1964. if (csr2->request.ocsp[0].nonceSz)
  1965. size += OCSP_NONCE_EXT_SZ;
  1966. break;
  1967. }
  1968. }
  1969. }
  1970. #endif
  1971. return size;
  1972. }
  1973. static word16 TLSX_CSR2_Write(CertificateStatusRequestItemV2* csr2,
  1974. byte* output, byte isRequest)
  1975. {
  1976. /* shut up compiler warnings */
  1977. (void) csr2; (void) output; (void) isRequest;
  1978. #ifndef NO_WOLFSSL_CLIENT
  1979. if (isRequest) {
  1980. word16 offset;
  1981. word16 length;
  1982. for (offset = OPAQUE16_LEN; csr2 != NULL; csr2 = csr2->next) {
  1983. /* status_type */
  1984. output[offset++] = csr2->status_type;
  1985. /* request */
  1986. switch (csr2->status_type) {
  1987. case WOLFSSL_CSR2_OCSP:
  1988. case WOLFSSL_CSR2_OCSP_MULTI:
  1989. /* request_length */
  1990. length = 2 * OPAQUE16_LEN;
  1991. if (csr2->request.ocsp[0].nonceSz)
  1992. length += OCSP_NONCE_EXT_SZ;
  1993. c16toa(length, output + offset);
  1994. offset += OPAQUE16_LEN;
  1995. /* responder id list */
  1996. c16toa(0, output + offset);
  1997. offset += OPAQUE16_LEN;
  1998. /* request extensions */
  1999. length = 0;
  2000. if (csr2->request.ocsp[0].nonceSz)
  2001. length = (word16)EncodeOcspRequestExtensions(
  2002. &csr2->request.ocsp[0],
  2003. output + offset + OPAQUE16_LEN,
  2004. OCSP_NONCE_EXT_SZ);
  2005. c16toa(length, output + offset);
  2006. offset += OPAQUE16_LEN + length;
  2007. break;
  2008. }
  2009. }
  2010. /* list size */
  2011. c16toa(offset - OPAQUE16_LEN, output);
  2012. return offset;
  2013. }
  2014. #endif
  2015. return 0;
  2016. }
  2017. static int TLSX_CSR2_Parse(WOLFSSL* ssl, byte* input, word16 length,
  2018. byte isRequest)
  2019. {
  2020. int ret;
  2021. /* shut up compiler warnings */
  2022. (void) ssl; (void) input;
  2023. if (!isRequest) {
  2024. #ifndef NO_WOLFSSL_CLIENT
  2025. TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST_V2);
  2026. CertificateStatusRequestItemV2* csr2 = extension ?
  2027. (CertificateStatusRequestItemV2*)extension->data : NULL;
  2028. if (!csr2) {
  2029. /* look at context level */
  2030. extension = TLSX_Find(ssl->ctx->extensions, TLSX_STATUS_REQUEST_V2);
  2031. csr2 = extension ?
  2032. (CertificateStatusRequestItemV2*)extension->data : NULL;
  2033. if (!csr2) /* unexpected extension */
  2034. return TLSX_HandleUnsupportedExtension(ssl);
  2035. /* enable extension at ssl level */
  2036. for (; csr2; csr2 = csr2->next) {
  2037. ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
  2038. csr2->status_type, csr2->options, ssl->heap, ssl->devId);
  2039. if (ret != WOLFSSL_SUCCESS)
  2040. return ret;
  2041. switch (csr2->status_type) {
  2042. case WOLFSSL_CSR2_OCSP:
  2043. /* followed by */
  2044. case WOLFSSL_CSR2_OCSP_MULTI:
  2045. /* propagate nonce */
  2046. if (csr2->request.ocsp[0].nonceSz) {
  2047. OcspRequest* request =
  2048. (OcspRequest*)TLSX_CSR2_GetRequest(ssl->extensions,
  2049. csr2->status_type, 0);
  2050. if (request) {
  2051. XMEMCPY(request->nonce,
  2052. csr2->request.ocsp[0].nonce,
  2053. csr2->request.ocsp[0].nonceSz);
  2054. request->nonceSz =
  2055. csr2->request.ocsp[0].nonceSz;
  2056. }
  2057. }
  2058. break;
  2059. }
  2060. }
  2061. }
  2062. ssl->status_request_v2 = 1;
  2063. return length ? BUFFER_ERROR : 0; /* extension_data MUST be empty. */
  2064. #endif
  2065. }
  2066. else {
  2067. #ifndef NO_WOLFSSL_SERVER
  2068. byte status_type;
  2069. word16 request_length;
  2070. word16 offset = 0;
  2071. word16 size = 0;
  2072. /* list size */
  2073. ato16(input + offset, &request_length);
  2074. offset += OPAQUE16_LEN;
  2075. if (length - OPAQUE16_LEN != request_length)
  2076. return BUFFER_ERROR;
  2077. while (length > offset) {
  2078. if (length - offset < ENUM_LEN + OPAQUE16_LEN)
  2079. return BUFFER_ERROR;
  2080. status_type = input[offset++];
  2081. ato16(input + offset, &request_length);
  2082. offset += OPAQUE16_LEN;
  2083. if (length - offset < request_length)
  2084. return BUFFER_ERROR;
  2085. switch (status_type) {
  2086. case WOLFSSL_CSR2_OCSP:
  2087. case WOLFSSL_CSR2_OCSP_MULTI:
  2088. /* skip responder_id_list */
  2089. if (length - offset < OPAQUE16_LEN)
  2090. return BUFFER_ERROR;
  2091. ato16(input + offset, &size);
  2092. offset += OPAQUE16_LEN + size;
  2093. /* skip request_extensions */
  2094. if (length - offset < OPAQUE16_LEN)
  2095. return BUFFER_ERROR;
  2096. ato16(input + offset, &size);
  2097. offset += OPAQUE16_LEN + size;
  2098. if (offset > length)
  2099. return BUFFER_ERROR;
  2100. /* is able to send OCSP response? */
  2101. if (ssl->ctx->cm == NULL
  2102. || !ssl->ctx->cm->ocspStaplingEnabled)
  2103. continue;
  2104. break;
  2105. default:
  2106. /* unknown status type, skipping! */
  2107. offset += request_length;
  2108. continue;
  2109. }
  2110. /* if using status_request and already sending it, skip this one */
  2111. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  2112. if (ssl->status_request)
  2113. return 0;
  2114. #endif
  2115. /* accept the first good status_type and return */
  2116. ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
  2117. status_type, 0, ssl->heap, ssl->devId);
  2118. if (ret != WOLFSSL_SUCCESS)
  2119. return ret; /* throw error */
  2120. TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST_V2);
  2121. ssl->status_request_v2 = status_type;
  2122. return 0;
  2123. }
  2124. #endif
  2125. }
  2126. return 0;
  2127. }
  2128. int TLSX_CSR2_InitRequests(TLSX* extensions, DecodedCert* cert, byte isPeer,
  2129. void* heap)
  2130. {
  2131. TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
  2132. CertificateStatusRequestItemV2* csr2 = extension ?
  2133. (CertificateStatusRequestItemV2*)extension->data : NULL;
  2134. int ret = 0;
  2135. for (; csr2; csr2 = csr2->next) {
  2136. switch (csr2->status_type) {
  2137. case WOLFSSL_CSR2_OCSP:
  2138. if (!isPeer || csr2->requests != 0)
  2139. break;
  2140. FALL_THROUGH; /* followed by */
  2141. case WOLFSSL_CSR2_OCSP_MULTI: {
  2142. if (csr2->requests < 1 + MAX_CHAIN_DEPTH) {
  2143. byte nonce[MAX_OCSP_NONCE_SZ];
  2144. int nonceSz = csr2->request.ocsp[0].nonceSz;
  2145. /* preserve nonce, replicating nonce of ocsp[0] */
  2146. XMEMCPY(nonce, csr2->request.ocsp[0].nonce, nonceSz);
  2147. if ((ret = InitOcspRequest(
  2148. &csr2->request.ocsp[csr2->requests], cert,
  2149. 0, heap)) != 0)
  2150. return ret;
  2151. /* restore nonce */
  2152. XMEMCPY(csr2->request.ocsp[csr2->requests].nonce,
  2153. nonce, nonceSz);
  2154. csr2->request.ocsp[csr2->requests].nonceSz = nonceSz;
  2155. csr2->requests++;
  2156. }
  2157. }
  2158. break;
  2159. }
  2160. }
  2161. (void)cert;
  2162. return ret;
  2163. }
  2164. void* TLSX_CSR2_GetRequest(TLSX* extensions, byte status_type, byte idx)
  2165. {
  2166. TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
  2167. CertificateStatusRequestItemV2* csr2 = extension ?
  2168. (CertificateStatusRequestItemV2*)extension->data : NULL;
  2169. for (; csr2; csr2 = csr2->next) {
  2170. if (csr2->status_type == status_type) {
  2171. switch (csr2->status_type) {
  2172. case WOLFSSL_CSR2_OCSP:
  2173. /* followed by */
  2174. case WOLFSSL_CSR2_OCSP_MULTI:
  2175. /* requests are initialized in the reverse order */
  2176. return idx < csr2->requests
  2177. ? &csr2->request.ocsp[csr2->requests - idx - 1]
  2178. : NULL;
  2179. break;
  2180. }
  2181. }
  2182. }
  2183. return NULL;
  2184. }
  2185. int TLSX_CSR2_ForceRequest(WOLFSSL* ssl)
  2186. {
  2187. TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST_V2);
  2188. CertificateStatusRequestItemV2* csr2 = extension ?
  2189. (CertificateStatusRequestItemV2*)extension->data : NULL;
  2190. /* forces only the first one */
  2191. if (csr2) {
  2192. switch (csr2->status_type) {
  2193. case WOLFSSL_CSR2_OCSP:
  2194. /* followed by */
  2195. case WOLFSSL_CSR2_OCSP_MULTI:
  2196. if (ssl->ctx->cm->ocspEnabled) {
  2197. csr2->request.ocsp[0].ssl = ssl;
  2198. return CheckOcspRequest(ssl->ctx->cm->ocsp,
  2199. &csr2->request.ocsp[0], NULL);
  2200. }
  2201. else
  2202. return OCSP_LOOKUP_FAIL;
  2203. }
  2204. }
  2205. return 0;
  2206. }
  2207. int TLSX_UseCertificateStatusRequestV2(TLSX** extensions, byte status_type,
  2208. byte options, void* heap, int devId)
  2209. {
  2210. TLSX* extension = NULL;
  2211. CertificateStatusRequestItemV2* csr2 = NULL;
  2212. int ret = 0;
  2213. if (!extensions)
  2214. return BAD_FUNC_ARG;
  2215. if (status_type != WOLFSSL_CSR2_OCSP
  2216. && status_type != WOLFSSL_CSR2_OCSP_MULTI)
  2217. return BAD_FUNC_ARG;
  2218. csr2 = (CertificateStatusRequestItemV2*)
  2219. XMALLOC(sizeof(CertificateStatusRequestItemV2), heap, DYNAMIC_TYPE_TLSX);
  2220. if (!csr2)
  2221. return MEMORY_E;
  2222. ForceZero(csr2, sizeof(CertificateStatusRequestItemV2));
  2223. csr2->status_type = status_type;
  2224. csr2->options = options;
  2225. csr2->next = NULL;
  2226. switch (csr2->status_type) {
  2227. case WOLFSSL_CSR2_OCSP:
  2228. case WOLFSSL_CSR2_OCSP_MULTI:
  2229. if (options & WOLFSSL_CSR2_OCSP_USE_NONCE) {
  2230. WC_RNG rng;
  2231. #ifndef HAVE_FIPS
  2232. ret = wc_InitRng_ex(&rng, heap, devId);
  2233. #else
  2234. ret = wc_InitRng(&rng);
  2235. (void)devId;
  2236. #endif
  2237. if (ret == 0) {
  2238. if (wc_RNG_GenerateBlock(&rng, csr2->request.ocsp[0].nonce,
  2239. MAX_OCSP_NONCE_SZ) == 0)
  2240. csr2->request.ocsp[0].nonceSz = MAX_OCSP_NONCE_SZ;
  2241. wc_FreeRng(&rng);
  2242. }
  2243. }
  2244. break;
  2245. }
  2246. /* append new item */
  2247. if ((extension = TLSX_Find(*extensions, TLSX_STATUS_REQUEST_V2))) {
  2248. CertificateStatusRequestItemV2* last =
  2249. (CertificateStatusRequestItemV2*)extension->data;
  2250. for (; last->next; last = last->next);
  2251. last->next = csr2;
  2252. }
  2253. else if ((ret = TLSX_Push(extensions, TLSX_STATUS_REQUEST_V2, csr2,heap))) {
  2254. XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
  2255. return ret;
  2256. }
  2257. return WOLFSSL_SUCCESS;
  2258. }
  2259. #define CSR2_FREE_ALL TLSX_CSR2_FreeAll
  2260. #define CSR2_GET_SIZE TLSX_CSR2_GetSize
  2261. #define CSR2_WRITE TLSX_CSR2_Write
  2262. #define CSR2_PARSE TLSX_CSR2_Parse
  2263. #else
  2264. #define CSR2_FREE_ALL(data, heap)
  2265. #define CSR2_GET_SIZE(a, b) 0
  2266. #define CSR2_WRITE(a, b, c) 0
  2267. #define CSR2_PARSE(a, b, c, d) 0
  2268. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  2269. /******************************************************************************/
  2270. /* Supported Elliptic Curves */
  2271. /******************************************************************************/
  2272. #ifdef HAVE_SUPPORTED_CURVES
  2273. #if !defined(HAVE_ECC) && !defined(WOLFSSL_TLS13)
  2274. #error Elliptic Curves Extension requires Elliptic Curve Cryptography. \
  2275. Use --enable-ecc in the configure script or define HAVE_ECC.
  2276. #endif
  2277. static int TLSX_SupportedCurve_New(SupportedCurve** curve, word16 name,
  2278. void* heap)
  2279. {
  2280. if (curve == NULL)
  2281. return BAD_FUNC_ARG;
  2282. *curve = (SupportedCurve*)XMALLOC(sizeof(SupportedCurve), heap,
  2283. DYNAMIC_TYPE_TLSX);
  2284. if (*curve == NULL)
  2285. return MEMORY_E;
  2286. (*curve)->name = name;
  2287. (*curve)->next = NULL;
  2288. return 0;
  2289. }
  2290. static int TLSX_PointFormat_New(PointFormat** point, byte format, void* heap)
  2291. {
  2292. if (point == NULL)
  2293. return BAD_FUNC_ARG;
  2294. *point = (PointFormat*)XMALLOC(sizeof(PointFormat), heap,
  2295. DYNAMIC_TYPE_TLSX);
  2296. if (*point == NULL)
  2297. return MEMORY_E;
  2298. (*point)->format = format;
  2299. (*point)->next = NULL;
  2300. return 0;
  2301. }
  2302. static void TLSX_SupportedCurve_FreeAll(SupportedCurve* list, void* heap)
  2303. {
  2304. SupportedCurve* curve;
  2305. while ((curve = list)) {
  2306. list = curve->next;
  2307. XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
  2308. }
  2309. (void)heap;
  2310. }
  2311. static void TLSX_PointFormat_FreeAll(PointFormat* list, void* heap)
  2312. {
  2313. PointFormat* point;
  2314. while ((point = list)) {
  2315. list = point->next;
  2316. XFREE(point, heap, DYNAMIC_TYPE_TLSX);
  2317. }
  2318. (void)heap;
  2319. }
  2320. static int TLSX_SupportedCurve_Append(SupportedCurve* list, word16 name,
  2321. void* heap)
  2322. {
  2323. int ret = BAD_FUNC_ARG;
  2324. while (list) {
  2325. if (list->name == name) {
  2326. ret = 0; /* curve alreay in use */
  2327. break;
  2328. }
  2329. if (list->next == NULL) {
  2330. ret = TLSX_SupportedCurve_New(&list->next, name, heap);
  2331. break;
  2332. }
  2333. list = list->next;
  2334. }
  2335. return ret;
  2336. }
  2337. static int TLSX_PointFormat_Append(PointFormat* list, byte format, void* heap)
  2338. {
  2339. int ret = BAD_FUNC_ARG;
  2340. while (list) {
  2341. if (list->format == format) {
  2342. ret = 0; /* format already in use */
  2343. break;
  2344. }
  2345. if (list->next == NULL) {
  2346. ret = TLSX_PointFormat_New(&list->next, format, heap);
  2347. break;
  2348. }
  2349. list = list->next;
  2350. }
  2351. return ret;
  2352. }
  2353. #ifndef NO_WOLFSSL_CLIENT
  2354. static void TLSX_SupportedCurve_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
  2355. {
  2356. int i;
  2357. for (i = 0; i < ssl->suites->suiteSz; i+= 2)
  2358. if (ssl->suites->suites[i] == ECC_BYTE ||
  2359. ssl->suites->suites[i] == CHACHA_BYTE ||
  2360. ssl->suites->suites[i] == TLS13_BYTE)
  2361. return;
  2362. /* turns semaphore on to avoid sending this extension. */
  2363. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_GROUPS));
  2364. }
  2365. static void TLSX_PointFormat_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
  2366. {
  2367. int i;
  2368. for (i = 0; i < ssl->suites->suiteSz; i+= 2)
  2369. if (ssl->suites->suites[i] == ECC_BYTE ||
  2370. ssl->suites->suites[i] == CHACHA_BYTE ||
  2371. ssl->suites->suites[i] == TLS13_BYTE)
  2372. return;
  2373. /* turns semaphore on to avoid sending this extension. */
  2374. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
  2375. }
  2376. #endif
  2377. #ifndef NO_WOLFSSL_SERVER
  2378. static void TLSX_PointFormat_ValidateResponse(WOLFSSL* ssl, byte* semaphore)
  2379. {
  2380. if (ssl->options.cipherSuite0 == ECC_BYTE ||
  2381. ssl->options.cipherSuite0 == CHACHA_BYTE ||
  2382. ssl->options.cipherSuite0 == TLS13_BYTE)
  2383. return;
  2384. /* turns semaphore on to avoid sending this extension. */
  2385. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
  2386. }
  2387. #endif
  2388. #ifndef NO_WOLFSSL_CLIENT
  2389. static word16 TLSX_SupportedCurve_GetSize(SupportedCurve* list)
  2390. {
  2391. SupportedCurve* curve;
  2392. word16 length = OPAQUE16_LEN; /* list length */
  2393. while ((curve = list)) {
  2394. list = curve->next;
  2395. length += OPAQUE16_LEN; /* curve length */
  2396. }
  2397. return length;
  2398. }
  2399. #endif
  2400. static word16 TLSX_PointFormat_GetSize(PointFormat* list)
  2401. {
  2402. PointFormat* point;
  2403. word16 length = ENUM_LEN; /* list length */
  2404. while ((point = list)) {
  2405. list = point->next;
  2406. length += ENUM_LEN; /* format length */
  2407. }
  2408. return length;
  2409. }
  2410. #ifndef NO_WOLFSSL_CLIENT
  2411. static word16 TLSX_SupportedCurve_Write(SupportedCurve* list, byte* output)
  2412. {
  2413. word16 offset = OPAQUE16_LEN;
  2414. while (list) {
  2415. c16toa(list->name, output + offset);
  2416. offset += OPAQUE16_LEN;
  2417. list = list->next;
  2418. }
  2419. c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
  2420. return offset;
  2421. }
  2422. #endif
  2423. static word16 TLSX_PointFormat_Write(PointFormat* list, byte* output)
  2424. {
  2425. word16 offset = ENUM_LEN;
  2426. while (list) {
  2427. output[offset++] = list->format;
  2428. list = list->next;
  2429. }
  2430. output[0] = (byte)(offset - ENUM_LEN);
  2431. return offset;
  2432. }
  2433. #ifndef NO_WOLFSSL_SERVER
  2434. static int TLSX_SupportedCurve_Parse(WOLFSSL* ssl, byte* input, word16 length,
  2435. byte isRequest)
  2436. {
  2437. word16 offset;
  2438. word16 name;
  2439. int ret;
  2440. if(!isRequest && !IsAtLeastTLSv1_3(ssl->version))
  2441. return BUFFER_ERROR; /* servers doesn't send this extension. */
  2442. if (OPAQUE16_LEN > length || length % OPAQUE16_LEN)
  2443. return BUFFER_ERROR;
  2444. ato16(input, &offset);
  2445. /* validating curve list length */
  2446. if (length != OPAQUE16_LEN + offset)
  2447. return BUFFER_ERROR;
  2448. for (offset = OPAQUE16_LEN; offset < length; offset += OPAQUE16_LEN) {
  2449. ato16(input + offset, &name);
  2450. ret = TLSX_UseSupportedCurve(&ssl->extensions, name, ssl->heap);
  2451. if (ret != WOLFSSL_SUCCESS)
  2452. return ret; /* throw error */
  2453. }
  2454. return 0;
  2455. }
  2456. static int TLSX_PointFormat_Parse(WOLFSSL* ssl, byte* input, word16 length,
  2457. byte isRequest)
  2458. {
  2459. int ret;
  2460. /* validating formats list length */
  2461. if (ENUM_LEN > length || length != ENUM_LEN + input[0])
  2462. return BUFFER_ERROR;
  2463. if (isRequest) {
  2464. /* adding uncompressed point format to response */
  2465. ret = TLSX_UsePointFormat(&ssl->extensions, WOLFSSL_EC_PF_UNCOMPRESSED,
  2466. ssl->heap);
  2467. if (ret != WOLFSSL_SUCCESS)
  2468. return ret; /* throw error */
  2469. TLSX_SetResponse(ssl, TLSX_EC_POINT_FORMATS);
  2470. }
  2471. return 0;
  2472. }
  2473. #ifdef HAVE_ECC
  2474. int TLSX_ValidateSupportedCurves(WOLFSSL* ssl, byte first, byte second) {
  2475. TLSX* extension = (first == ECC_BYTE || first == CHACHA_BYTE)
  2476. ? TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS)
  2477. : NULL;
  2478. SupportedCurve* curve = NULL;
  2479. word32 oid = 0;
  2480. word32 pkOid = 0;
  2481. word32 defOid = 0;
  2482. word32 defSz = 80; /* Maximum known curve size is 66. */
  2483. word32 nextOid = 0;
  2484. word32 nextSz = 80; /* Maximum known curve size is 66. */
  2485. word32 currOid = ssl->ecdhCurveOID;
  2486. int ephmSuite = 0;
  2487. word16 octets = 0; /* according to 'ecc_set_type ecc_sets[];' */
  2488. int sig = 0; /* validate signature */
  2489. int key = 0; /* validate key */
  2490. (void)oid;
  2491. if (!extension)
  2492. return 1; /* no suite restriction */
  2493. for (curve = (SupportedCurve*)extension->data;
  2494. curve && !(sig && key);
  2495. curve = curve->next) {
  2496. #ifdef OPENSSL_EXTRA
  2497. if (ssl->ctx->disabledCurves & (1 << curve->name))
  2498. continue;
  2499. #endif
  2500. /* find supported curve */
  2501. switch (curve->name) {
  2502. #if defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)
  2503. #ifndef NO_ECC_SECP
  2504. case WOLFSSL_ECC_SECP160R1:
  2505. pkOid = oid = ECC_SECP160R1_OID;
  2506. octets = 20;
  2507. break;
  2508. #endif /* !NO_ECC_SECP */
  2509. #ifdef HAVE_ECC_SECPR2
  2510. case WOLFSSL_ECC_SECP160R2:
  2511. pkOid = oid = ECC_SECP160R2_OID;
  2512. octets = 20;
  2513. break;
  2514. #endif /* HAVE_ECC_SECPR2 */
  2515. #ifdef HAVE_ECC_KOBLITZ
  2516. case WOLFSSL_ECC_SECP160K1:
  2517. pkOid = oid = ECC_SECP160K1_OID;
  2518. octets = 20;
  2519. break;
  2520. #endif /* HAVE_ECC_KOBLITZ */
  2521. #endif
  2522. #if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)
  2523. #ifndef NO_ECC_SECP
  2524. case WOLFSSL_ECC_SECP192R1:
  2525. pkOid = oid = ECC_SECP192R1_OID;
  2526. octets = 24;
  2527. break;
  2528. #endif /* !NO_ECC_SECP */
  2529. #ifdef HAVE_ECC_KOBLITZ
  2530. case WOLFSSL_ECC_SECP192K1:
  2531. pkOid = oid = ECC_SECP192K1_OID;
  2532. octets = 24;
  2533. break;
  2534. #endif /* HAVE_ECC_KOBLITZ */
  2535. #endif
  2536. #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)
  2537. #ifndef NO_ECC_SECP
  2538. case WOLFSSL_ECC_SECP224R1:
  2539. pkOid = oid = ECC_SECP224R1_OID;
  2540. octets = 28;
  2541. break;
  2542. #endif /* !NO_ECC_SECP */
  2543. #ifdef HAVE_ECC_KOBLITZ
  2544. case WOLFSSL_ECC_SECP224K1:
  2545. pkOid = oid = ECC_SECP224K1_OID;
  2546. octets = 28;
  2547. break;
  2548. #endif /* HAVE_ECC_KOBLITZ */
  2549. #endif
  2550. #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES)
  2551. #ifndef NO_ECC_SECP
  2552. case WOLFSSL_ECC_SECP256R1:
  2553. pkOid = oid = ECC_SECP256R1_OID;
  2554. octets = 32;
  2555. break;
  2556. #endif /* !NO_ECC_SECP */
  2557. #ifdef HAVE_CURVE25519
  2558. case WOLFSSL_ECC_X25519:
  2559. oid = ECC_X25519_OID;
  2560. #ifdef HAVE_ED25519
  2561. pkOid = ECC_ED25519_OID;
  2562. #else
  2563. pkOid = ECC_X25519_OID;
  2564. #endif
  2565. octets = 32;
  2566. break;
  2567. #endif /* HAVE_CURVE25519 */
  2568. #ifdef HAVE_ECC_KOBLITZ
  2569. case WOLFSSL_ECC_SECP256K1:
  2570. pkOid = oid = ECC_SECP256K1_OID;
  2571. octets = 32;
  2572. break;
  2573. #endif /* HAVE_ECC_KOBLITZ */
  2574. #ifdef HAVE_ECC_BRAINPOOL
  2575. case WOLFSSL_ECC_BRAINPOOLP256R1:
  2576. pkOid = oid = ECC_BRAINPOOLP256R1_OID;
  2577. octets = 32;
  2578. break;
  2579. #endif /* HAVE_ECC_BRAINPOOL */
  2580. #endif
  2581. #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
  2582. #ifndef NO_ECC_SECP
  2583. case WOLFSSL_ECC_SECP384R1:
  2584. pkOid = oid = ECC_SECP384R1_OID;
  2585. octets = 48;
  2586. break;
  2587. #endif /* !NO_ECC_SECP */
  2588. #ifdef HAVE_ECC_BRAINPOOL
  2589. case WOLFSSL_ECC_BRAINPOOLP384R1:
  2590. pkOid = oid = ECC_BRAINPOOLP384R1_OID;
  2591. octets = 48;
  2592. break;
  2593. #endif /* HAVE_ECC_BRAINPOOL */
  2594. #endif
  2595. #if defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)
  2596. #ifdef HAVE_ECC_BRAINPOOL
  2597. case WOLFSSL_ECC_BRAINPOOLP512R1:
  2598. pkOid = oid = ECC_BRAINPOOLP512R1_OID;
  2599. octets = 64;
  2600. break;
  2601. #endif /* HAVE_ECC_BRAINPOOL */
  2602. #endif
  2603. #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
  2604. #ifndef NO_ECC_SECP
  2605. case WOLFSSL_ECC_SECP521R1:
  2606. pkOid = oid = ECC_SECP521R1_OID;
  2607. octets = 66;
  2608. break;
  2609. #endif /* !NO_ECC_SECP */
  2610. #endif
  2611. default: continue; /* unsupported curve */
  2612. }
  2613. /* Set default Oid */
  2614. if (defOid == 0 && ssl->eccTempKeySz <= octets && defSz > octets) {
  2615. defOid = oid;
  2616. defSz = octets;
  2617. }
  2618. if (currOid == 0 && ssl->eccTempKeySz == octets)
  2619. currOid = oid;
  2620. if ((nextOid == 0 || nextSz > octets) && ssl->eccTempKeySz <= octets) {
  2621. nextOid = oid;
  2622. nextSz = octets;
  2623. }
  2624. if (first == ECC_BYTE) {
  2625. switch (second) {
  2626. /* ECDHE_ECDSA */
  2627. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
  2628. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:
  2629. case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:
  2630. case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:
  2631. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
  2632. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
  2633. case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
  2634. case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
  2635. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
  2636. case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8:
  2637. sig |= ssl->pkCurveOID == pkOid;
  2638. key |= ssl->ecdhCurveOID == oid;
  2639. ephmSuite = 1;
  2640. break;
  2641. #ifdef WOLFSSL_STATIC_DH
  2642. /* ECDH_ECDSA */
  2643. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
  2644. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:
  2645. case TLS_ECDH_ECDSA_WITH_RC4_128_SHA:
  2646. case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:
  2647. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
  2648. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
  2649. case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
  2650. case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
  2651. if (oid == ECC_X25519_OID && defOid == oid) {
  2652. defOid = 0;
  2653. defSz = 80;
  2654. }
  2655. sig |= ssl->pkCurveOID == pkOid;
  2656. key |= ssl->pkCurveOID == oid;
  2657. break;
  2658. #endif /* WOLFSSL_STATIC_DH */
  2659. #ifndef NO_RSA
  2660. /* ECDHE_RSA */
  2661. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
  2662. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
  2663. case TLS_ECDHE_RSA_WITH_RC4_128_SHA:
  2664. case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:
  2665. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
  2666. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
  2667. case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
  2668. case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
  2669. sig = 1;
  2670. key |= ssl->ecdhCurveOID == oid;
  2671. ephmSuite = 1;
  2672. break;
  2673. #ifdef WOLFSSL_STATIC_DH
  2674. /* ECDH_RSA */
  2675. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:
  2676. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:
  2677. case TLS_ECDH_RSA_WITH_RC4_128_SHA:
  2678. case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:
  2679. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
  2680. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
  2681. case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
  2682. case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
  2683. if (oid == ECC_X25519_OID && defOid == oid) {
  2684. defOid = 0;
  2685. defSz = 80;
  2686. }
  2687. sig = 1;
  2688. key |= ssl->pkCurveOID == pkOid;
  2689. break;
  2690. #endif /* WOLFSSL_STATIC_DH */
  2691. #endif
  2692. default:
  2693. if (oid == ECC_X25519_OID && defOid == oid) {
  2694. defOid = 0;
  2695. defSz = 80;
  2696. }
  2697. if (oid != ECC_X25519_OID)
  2698. sig = 1;
  2699. key = 1;
  2700. break;
  2701. }
  2702. }
  2703. /* ChaCha20-Poly1305 ECC cipher suites */
  2704. if (first == CHACHA_BYTE) {
  2705. switch (second) {
  2706. /* ECDHE_ECDSA */
  2707. case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
  2708. case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  2709. sig |= ssl->pkCurveOID == pkOid;
  2710. key |= ssl->ecdhCurveOID == oid;
  2711. ephmSuite = 1;
  2712. break;
  2713. #ifndef NO_RSA
  2714. /* ECDHE_RSA */
  2715. case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
  2716. case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  2717. sig = 1;
  2718. key |= ssl->ecdhCurveOID == oid;
  2719. ephmSuite = 1;
  2720. break;
  2721. #endif
  2722. default:
  2723. sig = 1;
  2724. key = 1;
  2725. break;
  2726. }
  2727. }
  2728. }
  2729. /* Choose the default if it is at the required strength. */
  2730. if (ssl->ecdhCurveOID == 0 && defSz == ssl->eccTempKeySz) {
  2731. key = 1;
  2732. ssl->ecdhCurveOID = defOid;
  2733. }
  2734. /* Choose any curve at the required strength. */
  2735. if (ssl->ecdhCurveOID == 0) {
  2736. key = 1;
  2737. ssl->ecdhCurveOID = currOid;
  2738. }
  2739. /* Choose the default if it is at the next highest strength. */
  2740. if (ssl->ecdhCurveOID == 0 && defSz == nextSz)
  2741. ssl->ecdhCurveOID = defOid;
  2742. /* Choose any curve at the next highest strength. */
  2743. if (ssl->ecdhCurveOID == 0)
  2744. ssl->ecdhCurveOID = nextOid;
  2745. /* No curve and ephemeral ECC suite requires a matching curve. */
  2746. if (ssl->ecdhCurveOID == 0 && ephmSuite)
  2747. key = 0;
  2748. return sig && key;
  2749. }
  2750. #endif
  2751. #endif /* NO_WOLFSSL_SERVER */
  2752. int TLSX_UseSupportedCurve(TLSX** extensions, word16 name, void* heap)
  2753. {
  2754. TLSX* extension = NULL;
  2755. SupportedCurve* curve = NULL;
  2756. int ret = 0;
  2757. if (extensions == NULL)
  2758. return BAD_FUNC_ARG;
  2759. extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
  2760. if (!extension) {
  2761. ret = TLSX_SupportedCurve_New(&curve, name, heap);
  2762. if (ret != 0)
  2763. return ret;
  2764. ret = TLSX_Push(extensions, TLSX_SUPPORTED_GROUPS, curve, heap);
  2765. if (ret != 0) {
  2766. XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
  2767. return ret;
  2768. }
  2769. }
  2770. else {
  2771. ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data, name,
  2772. heap);
  2773. if (ret != 0)
  2774. return ret;
  2775. }
  2776. return (TLSX_Find(*extensions, TLSX_EC_POINT_FORMATS) == NULL)
  2777. ? TLSX_UsePointFormat(extensions, WOLFSSL_EC_PF_UNCOMPRESSED, heap)
  2778. : WOLFSSL_SUCCESS;
  2779. }
  2780. int TLSX_UsePointFormat(TLSX** extensions, byte format, void* heap)
  2781. {
  2782. TLSX* extension = NULL;
  2783. PointFormat* point = NULL;
  2784. int ret = 0;
  2785. if (extensions == NULL)
  2786. return BAD_FUNC_ARG;
  2787. extension = TLSX_Find(*extensions, TLSX_EC_POINT_FORMATS);
  2788. if (!extension) {
  2789. ret = TLSX_PointFormat_New(&point, format, heap);
  2790. if (ret != 0)
  2791. return ret;
  2792. ret = TLSX_Push(extensions, TLSX_EC_POINT_FORMATS, point, heap);
  2793. if (ret != 0) {
  2794. XFREE(point, heap, DYNAMIC_TYPE_TLSX);
  2795. return ret;
  2796. }
  2797. }
  2798. else {
  2799. ret = TLSX_PointFormat_Append((PointFormat*)extension->data, format,
  2800. heap);
  2801. if (ret != 0)
  2802. return ret;
  2803. }
  2804. return WOLFSSL_SUCCESS;
  2805. }
  2806. #define EC_FREE_ALL TLSX_SupportedCurve_FreeAll
  2807. #define EC_VALIDATE_REQUEST TLSX_SupportedCurve_ValidateRequest
  2808. #ifndef NO_WOLFSSL_CLIENT
  2809. #define EC_GET_SIZE TLSX_SupportedCurve_GetSize
  2810. #define EC_WRITE TLSX_SupportedCurve_Write
  2811. #else
  2812. #define EC_GET_SIZE(list) 0
  2813. #define EC_WRITE(a, b) 0
  2814. #endif
  2815. #ifndef NO_WOLFSSL_SERVER
  2816. #define EC_PARSE TLSX_SupportedCurve_Parse
  2817. #else
  2818. #define EC_PARSE(a, b, c, d) 0
  2819. #endif
  2820. #define PF_FREE_ALL TLSX_PointFormat_FreeAll
  2821. #define PF_VALIDATE_REQUEST TLSX_PointFormat_ValidateRequest
  2822. #define PF_VALIDATE_RESPONSE TLSX_PointFormat_ValidateResponse
  2823. #define PF_GET_SIZE TLSX_PointFormat_GetSize
  2824. #define PF_WRITE TLSX_PointFormat_Write
  2825. #ifndef NO_WOLFSSL_SERVER
  2826. #define PF_PARSE TLSX_PointFormat_Parse
  2827. #else
  2828. #define PF_PARSE(a, b, c, d) 0
  2829. #endif
  2830. #else
  2831. #define EC_FREE_ALL(list, heap)
  2832. #define EC_GET_SIZE(list) 0
  2833. #define EC_WRITE(a, b) 0
  2834. #define EC_PARSE(a, b, c, d) 0
  2835. #define EC_VALIDATE_REQUEST(a, b)
  2836. #define PF_FREE_ALL(list, heap)
  2837. #define PF_GET_SIZE(list) 0
  2838. #define PF_WRITE(a, b) 0
  2839. #define PF_PARSE(a, b, c, d) 0
  2840. #define PF_VALIDATE_REQUEST(a, b)
  2841. #define PF_VALIDATE_RESPONSE(a, b)
  2842. #endif /* HAVE_SUPPORTED_CURVES */
  2843. /******************************************************************************/
  2844. /* Renegotiation Indication */
  2845. /******************************************************************************/
  2846. #if defined(HAVE_SECURE_RENEGOTIATION) \
  2847. || defined(HAVE_SERVER_RENEGOTIATION_INFO)
  2848. static byte TLSX_SecureRenegotiation_GetSize(SecureRenegotiation* data,
  2849. int isRequest)
  2850. {
  2851. byte length = OPAQUE8_LEN; /* empty info length */
  2852. /* data will be NULL for HAVE_SERVER_RENEGOTIATION_INFO only */
  2853. if (data && data->enabled) {
  2854. /* client sends client_verify_data only */
  2855. length += TLS_FINISHED_SZ;
  2856. /* server also sends server_verify_data */
  2857. if (!isRequest)
  2858. length += TLS_FINISHED_SZ;
  2859. }
  2860. return length;
  2861. }
  2862. static word16 TLSX_SecureRenegotiation_Write(SecureRenegotiation* data,
  2863. byte* output, int isRequest)
  2864. {
  2865. word16 offset = OPAQUE8_LEN; /* RenegotiationInfo length */
  2866. if (data && data->enabled) {
  2867. /* client sends client_verify_data only */
  2868. XMEMCPY(output + offset, data->client_verify_data, TLS_FINISHED_SZ);
  2869. offset += TLS_FINISHED_SZ;
  2870. /* server also sends server_verify_data */
  2871. if (!isRequest) {
  2872. XMEMCPY(output + offset, data->server_verify_data, TLS_FINISHED_SZ);
  2873. offset += TLS_FINISHED_SZ;
  2874. }
  2875. }
  2876. output[0] = (byte)(offset - 1); /* info length - self */
  2877. return offset;
  2878. }
  2879. static int TLSX_SecureRenegotiation_Parse(WOLFSSL* ssl, byte* input,
  2880. word16 length, byte isRequest)
  2881. {
  2882. int ret = SECURE_RENEGOTIATION_E;
  2883. if (length >= OPAQUE8_LEN) {
  2884. if (ssl->secure_renegotiation == NULL) {
  2885. #ifndef NO_WOLFSSL_SERVER
  2886. if (isRequest && *input == 0) {
  2887. #ifdef HAVE_SERVER_RENEGOTIATION_INFO
  2888. if (length == OPAQUE8_LEN) {
  2889. if (TLSX_Find(ssl->extensions,
  2890. TLSX_RENEGOTIATION_INFO) == NULL) {
  2891. ret = TLSX_AddEmptyRenegotiationInfo(&ssl->extensions,
  2892. ssl->heap);
  2893. if (ret == WOLFSSL_SUCCESS)
  2894. ret = 0;
  2895. } else {
  2896. ret = 0;
  2897. }
  2898. }
  2899. #else
  2900. ret = 0; /* don't reply, user didn't enable */
  2901. #endif /* HAVE_SERVER_RENEGOTIATION_INFO */
  2902. }
  2903. #ifdef HAVE_SERVER_RENEGOTIATION_INFO
  2904. else if (!isRequest) {
  2905. /* don't do anything on client side */
  2906. ret = 0;
  2907. }
  2908. #endif
  2909. #endif
  2910. }
  2911. else if (isRequest) {
  2912. #ifndef NO_WOLFSSL_SERVER
  2913. if (*input == TLS_FINISHED_SZ) {
  2914. /* TODO compare client_verify_data */
  2915. ret = 0;
  2916. }
  2917. #endif
  2918. }
  2919. else {
  2920. #ifndef NO_WOLFSSL_CLIENT
  2921. if (!ssl->secure_renegotiation->enabled) {
  2922. if (*input == 0) {
  2923. ssl->secure_renegotiation->enabled = 1;
  2924. ret = 0;
  2925. }
  2926. }
  2927. else if (*input == 2 * TLS_FINISHED_SZ &&
  2928. length == 2 * TLS_FINISHED_SZ + OPAQUE8_LEN) {
  2929. input++; /* get past size */
  2930. /* validate client and server verify data */
  2931. if (XMEMCMP(input,
  2932. ssl->secure_renegotiation->client_verify_data,
  2933. TLS_FINISHED_SZ) == 0 &&
  2934. XMEMCMP(input + TLS_FINISHED_SZ,
  2935. ssl->secure_renegotiation->server_verify_data,
  2936. TLS_FINISHED_SZ) == 0) {
  2937. WOLFSSL_MSG("SCR client and server verify data match");
  2938. ret = 0; /* verified */
  2939. } else {
  2940. /* already in error state */
  2941. WOLFSSL_MSG("SCR client and server verify data Failure");
  2942. }
  2943. }
  2944. #endif
  2945. }
  2946. }
  2947. if (ret != 0) {
  2948. SendAlert(ssl, alert_fatal, handshake_failure);
  2949. }
  2950. return ret;
  2951. }
  2952. int TLSX_UseSecureRenegotiation(TLSX** extensions, void* heap)
  2953. {
  2954. int ret = 0;
  2955. SecureRenegotiation* data = NULL;
  2956. data = (SecureRenegotiation*)XMALLOC(sizeof(SecureRenegotiation), heap,
  2957. DYNAMIC_TYPE_TLSX);
  2958. if (data == NULL)
  2959. return MEMORY_E;
  2960. XMEMSET(data, 0, sizeof(SecureRenegotiation));
  2961. ret = TLSX_Push(extensions, TLSX_RENEGOTIATION_INFO, data, heap);
  2962. if (ret != 0) {
  2963. XFREE(data, heap, DYNAMIC_TYPE_TLSX);
  2964. return ret;
  2965. }
  2966. return WOLFSSL_SUCCESS;
  2967. }
  2968. #ifdef HAVE_SERVER_RENEGOTIATION_INFO
  2969. int TLSX_AddEmptyRenegotiationInfo(TLSX** extensions, void* heap)
  2970. {
  2971. int ret;
  2972. ret = TLSX_Push(extensions, TLSX_RENEGOTIATION_INFO, NULL, heap);
  2973. if (ret != 0)
  2974. return ret;
  2975. /* send empty renegotiation_info extension */
  2976. TLSX* ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
  2977. if (ext)
  2978. ext->resp = 1;
  2979. return WOLFSSL_SUCCESS;
  2980. }
  2981. #endif /* HAVE_SERVER_RENEGOTIATION_INFO */
  2982. #define SCR_FREE_ALL(data, heap) XFREE(data, (heap), DYNAMIC_TYPE_TLSX)
  2983. #define SCR_GET_SIZE TLSX_SecureRenegotiation_GetSize
  2984. #define SCR_WRITE TLSX_SecureRenegotiation_Write
  2985. #define SCR_PARSE TLSX_SecureRenegotiation_Parse
  2986. #else
  2987. #define SCR_FREE_ALL(a, heap)
  2988. #define SCR_GET_SIZE(a, b) 0
  2989. #define SCR_WRITE(a, b, c) 0
  2990. #define SCR_PARSE(a, b, c, d) 0
  2991. #endif /* HAVE_SECURE_RENEGOTIATION */
  2992. /******************************************************************************/
  2993. /* Session Tickets */
  2994. /******************************************************************************/
  2995. #ifdef HAVE_SESSION_TICKET
  2996. #ifndef NO_WOLFSSL_CLIENT
  2997. static void TLSX_SessionTicket_ValidateRequest(WOLFSSL* ssl)
  2998. {
  2999. TLSX* extension = TLSX_Find(ssl->extensions, TLSX_SESSION_TICKET);
  3000. SessionTicket* ticket = extension ?
  3001. (SessionTicket*)extension->data : NULL;
  3002. if (ticket) {
  3003. /* TODO validate ticket timeout here! */
  3004. if (ticket->lifetime == 0xfffffff) {
  3005. /* send empty ticket on timeout */
  3006. TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
  3007. }
  3008. }
  3009. }
  3010. #endif /* NO_WOLFSSL_CLIENT */
  3011. static word16 TLSX_SessionTicket_GetSize(SessionTicket* ticket, int isRequest)
  3012. {
  3013. (void)isRequest;
  3014. return ticket ? ticket->size : 0;
  3015. }
  3016. static word16 TLSX_SessionTicket_Write(SessionTicket* ticket, byte* output,
  3017. int isRequest)
  3018. {
  3019. word16 offset = 0; /* empty ticket */
  3020. if (isRequest && ticket) {
  3021. XMEMCPY(output + offset, ticket->data, ticket->size);
  3022. offset += ticket->size;
  3023. }
  3024. return offset;
  3025. }
  3026. static int TLSX_SessionTicket_Parse(WOLFSSL* ssl, byte* input, word16 length,
  3027. byte isRequest)
  3028. {
  3029. int ret = 0;
  3030. (void) input; /* avoid unused parameter if NO_WOLFSSL_SERVER defined */
  3031. if (!isRequest) {
  3032. if (TLSX_CheckUnsupportedExtension(ssl, TLSX_SESSION_TICKET))
  3033. return TLSX_HandleUnsupportedExtension(ssl);
  3034. if (length != 0)
  3035. return BUFFER_ERROR;
  3036. #ifndef NO_WOLFSSL_CLIENT
  3037. ssl->expect_session_ticket = 1;
  3038. #endif
  3039. }
  3040. #ifndef NO_WOLFSSL_SERVER
  3041. else {
  3042. /* server side */
  3043. if (ssl->ctx->ticketEncCb == NULL) {
  3044. WOLFSSL_MSG("Client sent session ticket, server has no callback");
  3045. return 0;
  3046. }
  3047. if (length == 0) {
  3048. /* blank ticket */
  3049. ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
  3050. if (ret == WOLFSSL_SUCCESS) {
  3051. ret = 0;
  3052. TLSX_SetResponse(ssl, TLSX_SESSION_TICKET); /* send blank ticket */
  3053. ssl->options.createTicket = 1; /* will send ticket msg */
  3054. ssl->options.useTicket = 1;
  3055. ssl->options.resuming = 0; /* no standard resumption */
  3056. ssl->arrays->sessionIDSz = 0; /* no echo on blank ticket */
  3057. }
  3058. } else {
  3059. /* got actual ticket from client */
  3060. ret = DoClientTicket(ssl, input, length);
  3061. if (ret == WOLFSSL_TICKET_RET_OK) { /* use ticket to resume */
  3062. WOLFSSL_MSG("Using exisitng client ticket");
  3063. ssl->options.useTicket = 1;
  3064. ssl->options.resuming = 1;
  3065. } else if (ret == WOLFSSL_TICKET_RET_CREATE) {
  3066. WOLFSSL_MSG("Using existing client ticket, creating new one");
  3067. ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
  3068. if (ret == WOLFSSL_SUCCESS) {
  3069. ret = 0;
  3070. TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
  3071. /* send blank ticket */
  3072. ssl->options.createTicket = 1; /* will send ticket msg */
  3073. ssl->options.useTicket = 1;
  3074. ssl->options.resuming = 1;
  3075. }
  3076. } else if (ret == WOLFSSL_TICKET_RET_REJECT) {
  3077. WOLFSSL_MSG("Process client ticket rejected, not using");
  3078. ssl->options.rejectTicket = 1;
  3079. ret = 0; /* not fatal */
  3080. } else if (ret == WOLFSSL_TICKET_RET_FATAL || ret < 0) {
  3081. WOLFSSL_MSG("Process client ticket fatal error, not using");
  3082. }
  3083. }
  3084. }
  3085. #endif /* NO_WOLFSSL_SERVER */
  3086. return ret;
  3087. }
  3088. WOLFSSL_LOCAL SessionTicket* TLSX_SessionTicket_Create(word32 lifetime,
  3089. byte* data, word16 size, void* heap)
  3090. {
  3091. SessionTicket* ticket = (SessionTicket*)XMALLOC(sizeof(SessionTicket),
  3092. heap, DYNAMIC_TYPE_TLSX);
  3093. if (ticket) {
  3094. ticket->data = (byte*)XMALLOC(size, heap, DYNAMIC_TYPE_TLSX);
  3095. if (ticket->data == NULL) {
  3096. XFREE(ticket, heap, DYNAMIC_TYPE_TLSX);
  3097. return NULL;
  3098. }
  3099. XMEMCPY(ticket->data, data, size);
  3100. ticket->size = size;
  3101. ticket->lifetime = lifetime;
  3102. }
  3103. return ticket;
  3104. }
  3105. WOLFSSL_LOCAL void TLSX_SessionTicket_Free(SessionTicket* ticket, void* heap)
  3106. {
  3107. if (ticket) {
  3108. XFREE(ticket->data, heap, DYNAMIC_TYPE_TLSX);
  3109. XFREE(ticket, heap, DYNAMIC_TYPE_TLSX);
  3110. }
  3111. (void)heap;
  3112. }
  3113. int TLSX_UseSessionTicket(TLSX** extensions, SessionTicket* ticket, void* heap)
  3114. {
  3115. int ret = 0;
  3116. if (extensions == NULL)
  3117. return BAD_FUNC_ARG;
  3118. /* If the ticket is NULL, the client will request a new ticket from the
  3119. server. Otherwise, the client will use it in the next client hello. */
  3120. if ((ret = TLSX_Push(extensions, TLSX_SESSION_TICKET, (void*)ticket, heap))
  3121. != 0)
  3122. return ret;
  3123. return WOLFSSL_SUCCESS;
  3124. }
  3125. #define WOLF_STK_VALIDATE_REQUEST TLSX_SessionTicket_ValidateRequest
  3126. #define WOLF_STK_GET_SIZE TLSX_SessionTicket_GetSize
  3127. #define WOLF_STK_WRITE TLSX_SessionTicket_Write
  3128. #define WOLF_STK_PARSE TLSX_SessionTicket_Parse
  3129. #define WOLF_STK_FREE(stk, heap) TLSX_SessionTicket_Free((SessionTicket*)stk,(heap))
  3130. #else
  3131. #define WOLF_STK_FREE(a, b)
  3132. #define WOLF_STK_VALIDATE_REQUEST(a)
  3133. #define WOLF_STK_GET_SIZE(a, b) 0
  3134. #define WOLF_STK_WRITE(a, b, c) 0
  3135. #define WOLF_STK_PARSE(a, b, c, d) 0
  3136. #endif /* HAVE_SESSION_TICKET */
  3137. /******************************************************************************/
  3138. /* Quantum-Safe-Hybrid */
  3139. /******************************************************************************/
  3140. #ifdef HAVE_QSH
  3141. #if defined(HAVE_NTRU)
  3142. static WC_RNG* gRng;
  3143. static wolfSSL_Mutex* gRngMutex;
  3144. #endif
  3145. static void TLSX_QSH_FreeAll(QSHScheme* list, void* heap)
  3146. {
  3147. QSHScheme* current;
  3148. while ((current = list)) {
  3149. list = current->next;
  3150. XFREE(current, heap, DYNAMIC_TYPE_TLSX);
  3151. }
  3152. (void)heap;
  3153. }
  3154. static int TLSX_QSH_Append(QSHScheme** list, word16 name, byte* pub,
  3155. word16 pubLen)
  3156. {
  3157. QSHScheme* temp;
  3158. if (list == NULL)
  3159. return BAD_FUNC_ARG;
  3160. if ((temp = (QSHScheme*)XMALLOC(sizeof(QSHScheme), NULL,
  3161. DYNAMIC_TYPE_TLSX)) == NULL)
  3162. return MEMORY_E;
  3163. temp->name = name;
  3164. temp->PK = pub;
  3165. temp->PKLen = pubLen;
  3166. temp->next = *list;
  3167. *list = temp;
  3168. return 0;
  3169. }
  3170. /* request for server's public key : 02 indicates 0-2 requested */
  3171. static byte TLSX_QSH_SerPKReq(byte* output, byte isRequest)
  3172. {
  3173. if (isRequest) {
  3174. /* only request one public key from the server */
  3175. output[0] = 0x01;
  3176. return OPAQUE8_LEN;
  3177. }
  3178. else {
  3179. return 0;
  3180. }
  3181. }
  3182. #ifndef NO_WOLFSSL_CLIENT
  3183. /* check for TLS_QSH suite */
  3184. static void TLSX_QSH_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
  3185. {
  3186. int i;
  3187. for (i = 0; i < ssl->suites->suiteSz; i+= 2)
  3188. if (ssl->suites->suites[i] == QSH_BYTE)
  3189. return;
  3190. /* No QSH suite found */
  3191. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_QUANTUM_SAFE_HYBRID));
  3192. }
  3193. /* return the size of the QSH hello extension
  3194. list the list of QSHScheme structs containing id and key
  3195. isRequest if 1 then is being sent to the server
  3196. */
  3197. word16 TLSX_QSH_GetSize(QSHScheme* list, byte isRequest)
  3198. {
  3199. QSHScheme* temp = list;
  3200. word16 length = 0;
  3201. /* account for size of scheme list and public key list */
  3202. if (isRequest)
  3203. length = OPAQUE16_LEN;
  3204. length += OPAQUE24_LEN;
  3205. /* for each non null element in list add size */
  3206. while ((temp)) {
  3207. /* add public key info Scheme | Key Length | Key */
  3208. length += OPAQUE16_LEN;
  3209. length += OPAQUE16_LEN;
  3210. length += temp->PKLen;
  3211. /* if client add name size for scheme list
  3212. advance to next QSHScheme struct in list */
  3213. if (isRequest)
  3214. length += OPAQUE16_LEN;
  3215. temp = temp->next;
  3216. }
  3217. /* add length for request server public keys */
  3218. if (isRequest)
  3219. length += OPAQUE8_LEN;
  3220. return length;
  3221. }
  3222. /* write out a list of QSHScheme IDs */
  3223. static word16 TLSX_QSH_Write(QSHScheme* list, byte* output)
  3224. {
  3225. QSHScheme* current = list;
  3226. word16 length = 0;
  3227. length += OPAQUE16_LEN;
  3228. while (current) {
  3229. c16toa(current->name, output + length);
  3230. length += OPAQUE16_LEN;
  3231. current = (QSHScheme*)current->next;
  3232. }
  3233. c16toa(length - OPAQUE16_LEN, output); /* writing list length */
  3234. return length;
  3235. }
  3236. /* write public key list in extension */
  3237. static word16 TLSX_QSHPK_WriteR(QSHScheme* format, byte* output);
  3238. static word16 TLSX_QSHPK_WriteR(QSHScheme* format, byte* output)
  3239. {
  3240. word32 offset = 0;
  3241. word16 public_len = 0;
  3242. if (!format)
  3243. return offset;
  3244. /* write scheme ID */
  3245. c16toa(format->name, output + offset);
  3246. offset += OPAQUE16_LEN;
  3247. /* write public key matching scheme */
  3248. public_len = format->PKLen;
  3249. c16toa(public_len, output + offset);
  3250. offset += OPAQUE16_LEN;
  3251. if (format->PK) {
  3252. XMEMCPY(output+offset, format->PK, public_len);
  3253. }
  3254. return public_len + offset;
  3255. }
  3256. word16 TLSX_QSHPK_Write(QSHScheme* list, byte* output)
  3257. {
  3258. QSHScheme* current = list;
  3259. word32 length = 0;
  3260. word24 toWire;
  3261. length += OPAQUE24_LEN;
  3262. while (current) {
  3263. length += TLSX_QSHPK_WriteR(current, output + length);
  3264. current = (QSHScheme*)current->next;
  3265. }
  3266. /* length of public keys sent */
  3267. c32to24(length - OPAQUE24_LEN, toWire);
  3268. output[0] = toWire[0];
  3269. output[1] = toWire[1];
  3270. output[2] = toWire[2];
  3271. return length;
  3272. }
  3273. #endif /* NO_WOLFSSL_CLIENT */
  3274. #ifndef NO_WOLFSSL_SERVER
  3275. static void TLSX_QSHAgreement(TLSX** extensions, void* heap)
  3276. {
  3277. TLSX* extension = TLSX_Find(*extensions, TLSX_QUANTUM_SAFE_HYBRID);
  3278. QSHScheme* format = NULL;
  3279. QSHScheme* del = NULL;
  3280. QSHScheme* prev = NULL;
  3281. if (extension == NULL)
  3282. return;
  3283. format = (QSHScheme*)extension->data;
  3284. while (format) {
  3285. if (format->PKLen == 0) {
  3286. /* case of head */
  3287. if (format == extension->data) {
  3288. extension->data = format->next;
  3289. }
  3290. if (prev)
  3291. prev->next = format->next;
  3292. del = format;
  3293. format = format->next;
  3294. XFREE(del, heap, DYNAMIC_TYPE_TMP_BUFFER);
  3295. del = NULL;
  3296. } else {
  3297. prev = format;
  3298. format = format->next;
  3299. }
  3300. }
  3301. (void)heap;
  3302. }
  3303. /* Parse in hello extension
  3304. input the byte stream to process
  3305. length length of total extension found
  3306. isRequest set to 1 if being sent to the server
  3307. */
  3308. static int TLSX_QSH_Parse(WOLFSSL* ssl, byte* input, word16 length,
  3309. byte isRequest)
  3310. {
  3311. byte numKeys = 0;
  3312. word16 offset = 0;
  3313. word16 schemSz = 0;
  3314. word16 offset_len = 0;
  3315. word32 offset_pk = 0;
  3316. word16 name = 0;
  3317. word16 PKLen = 0;
  3318. byte* PK = NULL;
  3319. int r;
  3320. if (OPAQUE16_LEN > length)
  3321. return BUFFER_ERROR;
  3322. if (isRequest) {
  3323. ato16(input, &schemSz);
  3324. /* list of public keys available for QSH schemes */
  3325. offset_len = schemSz + OPAQUE16_LEN;
  3326. }
  3327. offset_pk = ((input[offset_len] << 16) & 0xFF00000) |
  3328. (((input[offset_len + 1]) << 8) & 0xFF00) |
  3329. (input[offset_len + 2] & 0xFF);
  3330. offset_len += OPAQUE24_LEN;
  3331. /* check buffer size */
  3332. if (offset_pk > length)
  3333. return BUFFER_ERROR;
  3334. /* set maximum number of keys the client will accept */
  3335. if (!isRequest)
  3336. numKeys = (ssl->maxRequest < 1)? 1 : ssl->maxRequest;
  3337. /* hello extension read list of scheme ids */
  3338. if (isRequest) {
  3339. /* read in request for public keys */
  3340. ssl->minRequest = (input[length -1] >> 4) & 0xFF;
  3341. ssl->maxRequest = input[length -1] & 0x0F;
  3342. /* choose the min between min requested by client and 1 */
  3343. numKeys = (ssl->minRequest > 1) ? ssl->minRequest : 1;
  3344. if (ssl->minRequest > ssl->maxRequest)
  3345. return BAD_FUNC_ARG;
  3346. offset += OPAQUE16_LEN;
  3347. schemSz += offset;
  3348. /* check buffer size */
  3349. if (schemSz > length)
  3350. return BUFFER_ERROR;
  3351. while ((offset < schemSz) && numKeys) {
  3352. /* Scheme ID list */
  3353. ato16(input + offset, &name);
  3354. offset += OPAQUE16_LEN;
  3355. /* validate we have scheme id */
  3356. if (ssl->user_set_QSHSchemes &&
  3357. !TLSX_ValidateQSHScheme(&ssl->extensions, name)) {
  3358. continue;
  3359. }
  3360. /* server create keys on demand */
  3361. if ((r = TLSX_CreateNtruKey(ssl, name)) != 0) {
  3362. WOLFSSL_MSG("Error creating ntru keys");
  3363. return r;
  3364. }
  3365. /* peer sent an agreed upon scheme */
  3366. r = TLSX_UseQSHScheme(&ssl->extensions, name, NULL, 0, ssl->heap);
  3367. if (r != WOLFSSL_SUCCESS) return r; /* throw error */
  3368. numKeys--;
  3369. }
  3370. /* choose the min between min requested by client and 1 */
  3371. numKeys = (ssl->minRequest > 1) ? ssl->minRequest : 1;
  3372. }
  3373. /* QSHPK struct */
  3374. offset_pk += offset_len;
  3375. while ((offset_len < offset_pk) && numKeys) {
  3376. QSHKey * temp;
  3377. if ((temp = (QSHKey*)XMALLOC(sizeof(QSHKey), ssl->heap,
  3378. DYNAMIC_TYPE_TLSX)) == NULL)
  3379. return MEMORY_E;
  3380. /* initialize */
  3381. temp->next = NULL;
  3382. temp->pub.buffer = NULL;
  3383. temp->pub.length = 0;
  3384. temp->pri.buffer = NULL;
  3385. temp->pri.length = 0;
  3386. /* scheme id */
  3387. ato16(input + offset_len, &(temp->name));
  3388. offset_len += OPAQUE16_LEN;
  3389. /* public key length */
  3390. ato16(input + offset_len, &PKLen);
  3391. temp->pub.length = PKLen;
  3392. offset_len += OPAQUE16_LEN;
  3393. if (isRequest) {
  3394. /* validate we have scheme id */
  3395. if (ssl->user_set_QSHSchemes &&
  3396. (!TLSX_ValidateQSHScheme(&ssl->extensions, temp->name))) {
  3397. offset_len += PKLen;
  3398. XFREE(temp, ssl->heap, DYNAMIC_TYPE_TLSX);
  3399. continue;
  3400. }
  3401. }
  3402. /* read in public key */
  3403. if (PKLen > 0) {
  3404. temp->pub.buffer = (byte*)XMALLOC(temp->pub.length,
  3405. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  3406. XMEMCPY(temp->pub.buffer, input + offset_len, temp->pub.length);
  3407. offset_len += PKLen;
  3408. }
  3409. else {
  3410. PK = NULL;
  3411. }
  3412. /* use own key when adding to extensions list for sending reply */
  3413. PKLen = 0;
  3414. PK = TLSX_QSHKeyFind_Pub(ssl->QSH_Key, &PKLen, temp->name);
  3415. r = TLSX_UseQSHScheme(&ssl->extensions, temp->name, PK, PKLen,
  3416. ssl->heap);
  3417. /* store peers key */
  3418. ssl->peerQSHKeyPresent = 1;
  3419. if (TLSX_AddQSHKey(&ssl->peerQSHKey, temp) != 0)
  3420. return MEMORY_E;
  3421. if (temp->pub.length == 0) {
  3422. XFREE(temp, ssl->heap, DYNAMIC_TYPE_TLSX);
  3423. }
  3424. if (r != WOLFSSL_SUCCESS) {return r;} /* throw error */
  3425. numKeys--;
  3426. }
  3427. /* reply to a QSH extension sent from client */
  3428. if (isRequest) {
  3429. TLSX_SetResponse(ssl, TLSX_QUANTUM_SAFE_HYBRID);
  3430. /* only use schemes we have key generated for -- free the rest */
  3431. TLSX_QSHAgreement(&ssl->extensions, ssl->heap);
  3432. }
  3433. return 0;
  3434. }
  3435. /* Used for parsing in QSHCipher structs on Key Exchange */
  3436. int TLSX_QSHCipher_Parse(WOLFSSL* ssl, const byte* input, word16 length,
  3437. byte isServer)
  3438. {
  3439. QSHKey* key;
  3440. word16 Max_Secret_Len = 48;
  3441. word16 offset = 0;
  3442. word16 offset_len = 0;
  3443. word32 offset_pk = 0;
  3444. word16 name = 0;
  3445. word16 secretLen = 0;
  3446. byte* secret = NULL;
  3447. word16 buffLen = 0;
  3448. byte buff[145]; /* size enough for 3 secrets */
  3449. buffer* buf;
  3450. /* pointer to location where secret should be stored */
  3451. if (isServer) {
  3452. buf = ssl->QSH_secret->CliSi;
  3453. }
  3454. else {
  3455. buf = ssl->QSH_secret->SerSi;
  3456. }
  3457. offset_pk = ((input[offset_len] << 16) & 0xFF0000) |
  3458. (((input[offset_len + 1]) << 8) & 0xFF00) |
  3459. (input[offset_len + 2] & 0xFF);
  3460. offset_len += OPAQUE24_LEN;
  3461. /* validating extension list length -- check if trying to read over edge
  3462. of buffer */
  3463. if (length < (offset_pk + OPAQUE24_LEN)) {
  3464. return BUFFER_ERROR;
  3465. }
  3466. /* QSHCipherList struct */
  3467. offset_pk += offset_len;
  3468. while (offset_len < offset_pk) {
  3469. /* scheme id */
  3470. ato16(input + offset_len, &name);
  3471. offset_len += OPAQUE16_LEN;
  3472. /* public key length */
  3473. ato16(input + offset_len, &secretLen);
  3474. offset_len += OPAQUE16_LEN;
  3475. /* read in public key */
  3476. if (secretLen > 0) {
  3477. secret = (byte*)(input + offset_len);
  3478. offset_len += secretLen;
  3479. }
  3480. else {
  3481. secret = NULL;
  3482. }
  3483. /* no secret sent */
  3484. if (secret == NULL)
  3485. continue;
  3486. /* find corresponding key */
  3487. key = ssl->QSH_Key;
  3488. while (key) {
  3489. if (key->name == name)
  3490. break;
  3491. else
  3492. key = (QSHKey*)key->next;
  3493. }
  3494. /* if we do not have the key than there was a big issue negotiation */
  3495. if (key == NULL) {
  3496. WOLFSSL_MSG("key was null for decryption!!!\n");
  3497. return MEMORY_E;
  3498. }
  3499. /* Decrypt sent secret */
  3500. buffLen = Max_Secret_Len;
  3501. QSH_Decrypt(key, secret, secretLen, buff + offset, &buffLen);
  3502. offset += buffLen;
  3503. }
  3504. /* allocate memory for buffer */
  3505. buf->length = offset;
  3506. buf->buffer = (byte*)XMALLOC(offset, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  3507. if (buf->buffer == NULL)
  3508. return MEMORY_E;
  3509. /* store secrets */
  3510. XMEMCPY(buf->buffer, buff, offset);
  3511. ForceZero(buff, offset);
  3512. return offset_len;
  3513. }
  3514. /* return 1 on success */
  3515. int TLSX_ValidateQSHScheme(TLSX** extensions, word16 theirs) {
  3516. TLSX* extension = TLSX_Find(*extensions, TLSX_QUANTUM_SAFE_HYBRID);
  3517. QSHScheme* format = NULL;
  3518. /* if no extension is sent then do not use QSH */
  3519. if (!extension) {
  3520. WOLFSSL_MSG("No QSH Extension");
  3521. return 0;
  3522. }
  3523. for (format = (QSHScheme*)extension->data; format; format = format->next) {
  3524. if (format->name == theirs) {
  3525. WOLFSSL_MSG("Found Matching QSH Scheme");
  3526. return 1; /* have QSH */
  3527. }
  3528. }
  3529. return 0;
  3530. }
  3531. #endif /* NO_WOLFSSL_SERVER */
  3532. /* test if the QSH Scheme is implemented
  3533. return 1 if yes 0 if no */
  3534. static int TLSX_HaveQSHScheme(word16 name)
  3535. {
  3536. switch(name) {
  3537. #ifdef HAVE_NTRU
  3538. case WOLFSSL_NTRU_EESS439:
  3539. case WOLFSSL_NTRU_EESS593:
  3540. case WOLFSSL_NTRU_EESS743:
  3541. return 1;
  3542. #endif
  3543. case WOLFSSL_LWE_XXX:
  3544. case WOLFSSL_HFE_XXX:
  3545. return 0; /* not supported yet */
  3546. default:
  3547. return 0;
  3548. }
  3549. }
  3550. /* Add a QSHScheme struct to list of usable ones */
  3551. int TLSX_UseQSHScheme(TLSX** extensions, word16 name, byte* pKey, word16 pkeySz,
  3552. void* heap)
  3553. {
  3554. TLSX* extension = TLSX_Find(*extensions, TLSX_QUANTUM_SAFE_HYBRID);
  3555. QSHScheme* format = NULL;
  3556. int ret = 0;
  3557. /* sanity check */
  3558. if (extensions == NULL || (pKey == NULL && pkeySz != 0))
  3559. return BAD_FUNC_ARG;
  3560. /* if scheme is implemented than add */
  3561. if (TLSX_HaveQSHScheme(name)) {
  3562. if ((ret = TLSX_QSH_Append(&format, name, pKey, pkeySz)) != 0)
  3563. return ret;
  3564. if (!extension) {
  3565. if ((ret = TLSX_Push(extensions, TLSX_QUANTUM_SAFE_HYBRID, format,
  3566. heap)) != 0) {
  3567. XFREE(format, 0, DYNAMIC_TYPE_TLSX);
  3568. return ret;
  3569. }
  3570. }
  3571. else {
  3572. /* push new QSH object to extension data. */
  3573. format->next = (QSHScheme*)extension->data;
  3574. extension->data = (void*)format;
  3575. /* look for another format of the same name to remove (replacement) */
  3576. do {
  3577. if (format->next && (format->next->name == name)) {
  3578. QSHScheme* next = format->next;
  3579. format->next = next->next;
  3580. XFREE(next, 0, DYNAMIC_TYPE_TLSX);
  3581. break;
  3582. }
  3583. } while ((format = format->next));
  3584. }
  3585. }
  3586. return WOLFSSL_SUCCESS;
  3587. }
  3588. #define QSH_FREE_ALL TLSX_QSH_FreeAll
  3589. #define QSH_VALIDATE_REQUEST TLSX_QSH_ValidateRequest
  3590. #ifndef NO_WOLFSSL_CLIENT
  3591. #define QSH_GET_SIZE TLSX_QSH_GetSize
  3592. #define QSH_WRITE TLSX_QSH_Write
  3593. #else
  3594. #define QSH_GET_SIZE(list) 0
  3595. #define QSH_WRITE(a, b) 0
  3596. #endif
  3597. #ifndef NO_WOLFSSL_SERVER
  3598. #define QSH_PARSE TLSX_QSH_Parse
  3599. #else
  3600. #define QSH_PARSE(a, b, c, d) 0
  3601. #endif
  3602. #define QSHPK_WRITE TLSX_QSHPK_Write
  3603. #define QSH_SERREQ TLSX_QSH_SerPKReq
  3604. #else
  3605. #define QSH_FREE_ALL(list, heap)
  3606. #define QSH_GET_SIZE(list, a) 0
  3607. #define QSH_WRITE(a, b) 0
  3608. #define QSH_PARSE(a, b, c, d) 0
  3609. #define QSHPK_WRITE(a, b) 0
  3610. #define QSH_SERREQ(a, b) 0
  3611. #define QSH_VALIDATE_REQUEST(a, b)
  3612. #endif /* HAVE_QSH */
  3613. /******************************************************************************/
  3614. /* Supported Versions */
  3615. /******************************************************************************/
  3616. #ifdef WOLFSSL_TLS13
  3617. /* Return the size of the SupportedVersions extension's data.
  3618. *
  3619. * data The SSL/TLS object.
  3620. * msgType The type of the message this extension is being written into.
  3621. * returns the length of data that will be in the extension.
  3622. */
  3623. static word16 TLSX_SupportedVersions_GetSize(void* data, byte msgType)
  3624. {
  3625. WOLFSSL* ssl = (WOLFSSL*)data;
  3626. if (msgType == client_hello) {
  3627. /* TLS v1.2 and TLS v1.3 */
  3628. int cnt = 2;
  3629. #ifndef NO_OLD_TLS
  3630. /* TLS v1 and TLS v1.1 */
  3631. cnt += 2;
  3632. #endif
  3633. if (!ssl->options.downgrade)
  3634. cnt = 1;
  3635. return (word16)(OPAQUE8_LEN + cnt * OPAQUE16_LEN);
  3636. }
  3637. #ifndef WOLFSSL_TLS13_DRAFT_18
  3638. else if (msgType == server_hello || msgType == hello_retry_request)
  3639. return OPAQUE16_LEN;
  3640. #endif
  3641. else
  3642. return SANITY_MSG_E;
  3643. }
  3644. /* Writes the SupportedVersions extension into the buffer.
  3645. *
  3646. * data The SSL/TLS object.
  3647. * output The buffer to write the extension into.
  3648. * msgType The type of the message this extension is being written into.
  3649. * returns the length of data that was written.
  3650. */
  3651. static word16 TLSX_SupportedVersions_Write(void* data, byte* output,
  3652. byte msgType)
  3653. {
  3654. WOLFSSL* ssl = (WOLFSSL*)data;
  3655. ProtocolVersion pv;
  3656. int i;
  3657. int cnt;
  3658. if (msgType == client_hello) {
  3659. pv = ssl->ctx->method->version;
  3660. /* TLS v1.2 and TLS v1.3 */
  3661. cnt = 2;
  3662. #ifndef NO_OLD_TLS
  3663. /* TLS v1 and TLS v1.1 */
  3664. cnt += 2;
  3665. #endif
  3666. if (!ssl->options.downgrade)
  3667. cnt = 1;
  3668. *(output++) = (byte)(cnt * OPAQUE16_LEN);
  3669. for (i = 0; i < cnt; i++) {
  3670. /* TODO: [TLS13] Remove code when TLS v1.3 becomes an RFC. */
  3671. if (pv.minor - i == TLSv1_3_MINOR) {
  3672. /* The TLS draft major number. */
  3673. *(output++) = TLS_DRAFT_MAJOR;
  3674. /* Version of draft supported. */
  3675. *(output++) = TLS_DRAFT_MINOR;
  3676. continue;
  3677. }
  3678. *(output++) = pv.major;
  3679. *(output++) = pv.minor - i;
  3680. }
  3681. return (word16)(OPAQUE8_LEN + cnt * OPAQUE16_LEN);
  3682. }
  3683. #ifndef WOLFSSL_TLS13_DRAFT_18
  3684. else if (msgType == server_hello || msgType == hello_retry_request) {
  3685. output[0] = ssl->version.major;
  3686. output[1] = ssl->version.minor;
  3687. return OPAQUE16_LEN;
  3688. }
  3689. #endif
  3690. else
  3691. return SANITY_MSG_E;
  3692. }
  3693. /* Parse the SupportedVersions extension.
  3694. *
  3695. * ssl The SSL/TLS object.
  3696. * input The buffer with the extension data.
  3697. * length The length of the extension data.
  3698. * msgType The type of the message this extension is being parsed from.
  3699. * returns 0 on success, otherwise failure.
  3700. */
  3701. static int TLSX_SupportedVersions_Parse(WOLFSSL *ssl, byte* input,
  3702. word16 length, byte msgType)
  3703. {
  3704. ProtocolVersion pv = ssl->ctx->method->version;
  3705. int i;
  3706. int ret = VERSION_ERROR;
  3707. int len;
  3708. byte major, minor;
  3709. if (msgType == client_hello) {
  3710. /* Must contain a length and at least one version. */
  3711. if (length < OPAQUE8_LEN + OPAQUE16_LEN || (length & 1) != 1)
  3712. return BUFFER_ERROR;
  3713. len = *input;
  3714. /* Protocol version array must fill rest of data. */
  3715. if (length != OPAQUE8_LEN + len)
  3716. return BUFFER_ERROR;
  3717. input++;
  3718. /* Find first match. */
  3719. for (i = 0; i < len; i += OPAQUE16_LEN) {
  3720. major = input[i];
  3721. minor = input[i + OPAQUE8_LEN];
  3722. /* TODO: [TLS13] Remove code when TLS v1.3 becomes an RFC. */
  3723. if (major == TLS_DRAFT_MAJOR && minor == TLS_DRAFT_MINOR) {
  3724. major = SSLv3_MAJOR;
  3725. minor = TLSv1_3_MINOR;
  3726. }
  3727. if (major != pv.major)
  3728. continue;
  3729. /* No upgrade allowed. */
  3730. if (ssl->version.minor > minor)
  3731. continue;
  3732. /* Check downgrade. */
  3733. if (ssl->version.minor < minor) {
  3734. if (!ssl->options.downgrade)
  3735. continue;
  3736. #ifdef NO_OLD_TLS
  3737. if (minor < TLSv1_2_MINOR)
  3738. continue;
  3739. #endif
  3740. /* Downgrade the version. */
  3741. ssl->version.minor = minor;
  3742. }
  3743. if (minor >= TLSv1_3_MINOR) {
  3744. ssl->options.tls1_3 = 1;
  3745. TLSX_Push(&ssl->extensions, TLSX_SUPPORTED_VERSIONS, ssl,
  3746. ssl->heap);
  3747. #ifndef WOLFSSL_TLS13_DRAFT_18
  3748. TLSX_SetResponse(ssl, TLSX_SUPPORTED_VERSIONS);
  3749. #endif
  3750. }
  3751. ret = 0;
  3752. break;
  3753. }
  3754. }
  3755. #ifndef WOLFSSL_TLS13_DRAFT_18
  3756. else if (msgType == server_hello || msgType == hello_retry_request) {
  3757. /* Must contain one version. */
  3758. if (length != OPAQUE16_LEN)
  3759. return BUFFER_ERROR;
  3760. major = input[0];
  3761. minor = input[OPAQUE8_LEN];
  3762. /* TODO: [TLS13] Remove code when TLS v1.3 becomes an RFC. */
  3763. if (major == TLS_DRAFT_MAJOR && minor == TLS_DRAFT_MINOR) {
  3764. major = SSLv3_MAJOR;
  3765. minor = TLSv1_3_MINOR;
  3766. }
  3767. if (major != pv.major)
  3768. return VERSION_ERROR;
  3769. /* No upgrade allowed. */
  3770. if (ssl->version.minor < minor)
  3771. return VERSION_ERROR;
  3772. /* Check downgrade. */
  3773. if (ssl->version.minor > minor) {
  3774. if (!ssl->options.downgrade)
  3775. return VERSION_ERROR;
  3776. #ifdef NO_OLD_TLS
  3777. if (minor < TLSv1_2_MINOR)
  3778. return VERSION_ERROR;
  3779. #endif
  3780. /* Downgrade the version. */
  3781. ssl->version.minor = minor;
  3782. }
  3783. ret = 0;
  3784. }
  3785. #endif
  3786. else
  3787. return SANITY_MSG_E;
  3788. return ret;
  3789. }
  3790. /* Sets a new SupportedVersions extension into the extension list.
  3791. *
  3792. * extensions The list of extensions.
  3793. * data The extensions specific data.
  3794. * heap The heap used for allocation.
  3795. * returns 0 on success, otherwise failure.
  3796. */
  3797. static int TLSX_SetSupportedVersions(TLSX** extensions, const void* data,
  3798. void* heap)
  3799. {
  3800. if (extensions == NULL || data == NULL)
  3801. return BAD_FUNC_ARG;
  3802. return TLSX_Push(extensions, TLSX_SUPPORTED_VERSIONS, (void *)data, heap);
  3803. }
  3804. #define SV_GET_SIZE TLSX_SupportedVersions_GetSize
  3805. #define SV_WRITE TLSX_SupportedVersions_Write
  3806. #define SV_PARSE TLSX_SupportedVersions_Parse
  3807. #else
  3808. #define SV_GET_SIZE(a, b) 0
  3809. #define SV_WRITE(a, b, c) 0
  3810. #define SV_PARSE(a, b, c, d) 0
  3811. #endif /* WOLFSSL_TLS13 */
  3812. #if defined(WOLFSSL_TLS13)
  3813. /******************************************************************************/
  3814. /* Cookie */
  3815. /******************************************************************************/
  3816. /* Free the cookie data.
  3817. *
  3818. * cookie Cookie data.
  3819. * heap The heap used for allocation.
  3820. */
  3821. static void TLSX_Cookie_FreeAll(Cookie* cookie, void* heap)
  3822. {
  3823. (void)heap;
  3824. if (cookie != NULL)
  3825. XFREE(cookie, heap, DYNAMIC_TYPE_TLSX);
  3826. }
  3827. /* Get the size of the encoded Cookie extension.
  3828. * In messages: ClientHello and HelloRetryRequest.
  3829. *
  3830. * cookie The cookie to write.
  3831. * msgType The type of the message this extension is being written into.
  3832. * returns the number of bytes of the encoded Cookie extension.
  3833. */
  3834. static word16 TLSX_Cookie_GetSize(Cookie* cookie, byte msgType)
  3835. {
  3836. if (msgType == client_hello || msgType == hello_retry_request)
  3837. return OPAQUE16_LEN + cookie->len;
  3838. return SANITY_MSG_E;
  3839. }
  3840. /* Writes the Cookie extension into the output buffer.
  3841. * Assumes that the the output buffer is big enough to hold data.
  3842. * In messages: ClientHello and HelloRetryRequest.
  3843. *
  3844. * cookie The cookie to write.
  3845. * output The buffer to write into.
  3846. * msgType The type of the message this extension is being written into.
  3847. * returns the number of bytes written into the buffer.
  3848. */
  3849. static word16 TLSX_Cookie_Write(Cookie* cookie, byte* output, byte msgType)
  3850. {
  3851. if (msgType == client_hello || msgType == hello_retry_request) {
  3852. c16toa(cookie->len, output);
  3853. output += OPAQUE16_LEN;
  3854. XMEMCPY(output, &cookie->data, cookie->len);
  3855. return OPAQUE16_LEN + cookie->len;
  3856. }
  3857. return SANITY_MSG_E; /* ! */
  3858. }
  3859. /* Parse the Cookie extension.
  3860. * In messages: ClientHello and HelloRetryRequest.
  3861. *
  3862. * ssl The SSL/TLS object.
  3863. * input The extension data.
  3864. * length The length of the extension data.
  3865. * msgType The type of the message this extension is being parsed from.
  3866. * returns 0 on success and other values indicate failure.
  3867. */
  3868. static int TLSX_Cookie_Parse(WOLFSSL* ssl, byte* input, word16 length,
  3869. byte msgType)
  3870. {
  3871. word16 len;
  3872. word16 idx = 0;
  3873. TLSX* extension;
  3874. Cookie* cookie;
  3875. if (msgType != client_hello && msgType != hello_retry_request)
  3876. return SANITY_MSG_E;
  3877. /* Message contains length and Cookie which must be at least one byte
  3878. * in length.
  3879. */
  3880. if (length < OPAQUE16_LEN + 1)
  3881. return BUFFER_E;
  3882. ato16(input + idx, &len);
  3883. idx += OPAQUE16_LEN;
  3884. if (length - idx != len)
  3885. return BUFFER_E;
  3886. if (msgType == hello_retry_request)
  3887. return TLSX_Cookie_Use(ssl, input + idx, len, NULL, 0, 0);
  3888. /* client_hello */
  3889. extension = TLSX_Find(ssl->extensions, TLSX_COOKIE);
  3890. if (extension == NULL)
  3891. return HRR_COOKIE_ERROR;
  3892. cookie = (Cookie*)extension->data;
  3893. if (cookie->len != len || XMEMCMP(&cookie->data, input + idx, len) != 0)
  3894. return HRR_COOKIE_ERROR;
  3895. /* Request seen. */
  3896. extension->resp = 0;
  3897. return 0;
  3898. }
  3899. /* Use the data to create a new Cookie object in the extensions.
  3900. *
  3901. * ssl SSL/TLS object.
  3902. * data Cookie data.
  3903. * len Length of cookie data in bytes.
  3904. * mac MAC data.
  3905. * macSz Length of MAC data in bytes.
  3906. * resp Indicates the extension will go into a response (HelloRetryRequest).
  3907. * returns 0 on success and other values indicate failure.
  3908. */
  3909. int TLSX_Cookie_Use(WOLFSSL* ssl, byte* data, word16 len, byte* mac,
  3910. byte macSz, int resp)
  3911. {
  3912. int ret = 0;
  3913. TLSX* extension;
  3914. Cookie* cookie;
  3915. /* Find the cookie extension if it exists. */
  3916. extension = TLSX_Find(ssl->extensions, TLSX_COOKIE);
  3917. if (extension == NULL) {
  3918. /* Push new cookie extension. */
  3919. ret = TLSX_Push(&ssl->extensions, TLSX_COOKIE, NULL, ssl->heap);
  3920. if (ret != 0)
  3921. return ret;
  3922. extension = TLSX_Find(ssl->extensions, TLSX_COOKIE);
  3923. if (extension == NULL)
  3924. return MEMORY_E;
  3925. }
  3926. /* The Cookie structure has one byte for cookie data already. */
  3927. cookie = (Cookie*)XMALLOC(sizeof(Cookie) + len + macSz - 1, ssl->heap,
  3928. DYNAMIC_TYPE_TLSX);
  3929. if (cookie == NULL)
  3930. return MEMORY_E;
  3931. cookie->len = len + macSz;
  3932. XMEMCPY(&cookie->data, data, len);
  3933. if (mac != NULL)
  3934. XMEMCPY(&cookie->data + len, mac, macSz);
  3935. extension->data = (void*)cookie;
  3936. extension->resp = (byte)resp;
  3937. return 0;
  3938. }
  3939. #define CKE_FREE_ALL TLSX_Cookie_FreeAll
  3940. #define CKE_GET_SIZE TLSX_Cookie_GetSize
  3941. #define CKE_WRITE TLSX_Cookie_Write
  3942. #define CKE_PARSE TLSX_Cookie_Parse
  3943. #else
  3944. #define CKE_FREE_ALL(a, b) 0
  3945. #define CKE_GET_SIZE(a, b) 0
  3946. #define CKE_WRITE(a, b, c) 0
  3947. #define CKE_PARSE(a, b, c, d) 0
  3948. #endif
  3949. /******************************************************************************/
  3950. /* Sugnature Algorithms */
  3951. /******************************************************************************/
  3952. /* Return the size of the SignatureAlgorithms extension's data.
  3953. *
  3954. * data Unused
  3955. * returns the length of data that will be in the extension.
  3956. */
  3957. static word16 TLSX_SignatureAlgorithms_GetSize(void* data)
  3958. {
  3959. WOLFSSL* ssl = (WOLFSSL*)data;
  3960. return OPAQUE16_LEN + ssl->suites->hashSigAlgoSz;
  3961. }
  3962. /* Creates a bit string of supported hash algorithms with RSA PSS.
  3963. * The bit string is used when determining which signature algorithm to use
  3964. * when creating the CertificateVerify message.
  3965. * Note: Valid data has an even length as each signature algorithm is two bytes.
  3966. *
  3967. * ssl The SSL/TLS object.
  3968. * input The buffer with the list of supported signature algorithms.
  3969. * length The length of the list in bytes.
  3970. * returns 0 on success, BUFFER_ERROR when the length is not even.
  3971. */
  3972. static int TLSX_SignatureAlgorithms_MapPss(WOLFSSL *ssl, byte* input,
  3973. word16 length)
  3974. {
  3975. word16 i;
  3976. if ((length & 1) == 1)
  3977. return BUFFER_ERROR;
  3978. ssl->pssAlgo = 0;
  3979. for (i = 0; i < length; i += 2) {
  3980. if (input[i] == rsa_pss_sa_algo && input[i + 1] <= sha512_mac)
  3981. ssl->pssAlgo |= 1 << input[i + 1];
  3982. }
  3983. return 0;
  3984. }
  3985. /* Writes the SignatureAlgorithms extension into the buffer.
  3986. *
  3987. * data Unused
  3988. * output The buffer to write the extension into.
  3989. * returns the length of data that was written.
  3990. */
  3991. static word16 TLSX_SignatureAlgorithms_Write(void* data, byte* output)
  3992. {
  3993. WOLFSSL* ssl = (WOLFSSL*)data;
  3994. c16toa(ssl->suites->hashSigAlgoSz, output);
  3995. XMEMCPY(output + OPAQUE16_LEN, ssl->suites->hashSigAlgo,
  3996. ssl->suites->hashSigAlgoSz);
  3997. TLSX_SignatureAlgorithms_MapPss(ssl, output + OPAQUE16_LEN,
  3998. ssl->suites->hashSigAlgoSz);
  3999. return OPAQUE16_LEN + ssl->suites->hashSigAlgoSz;
  4000. }
  4001. /* Parse the SignatureAlgorithms extension.
  4002. *
  4003. * ssl The SSL/TLS object.
  4004. * input The buffer with the extension data.
  4005. * length The length of the extension data.
  4006. * returns 0 on success, otherwise failure.
  4007. */
  4008. static int TLSX_SignatureAlgorithms_Parse(WOLFSSL *ssl, byte* input,
  4009. word16 length, byte isRequest, Suites* suites)
  4010. {
  4011. word16 len;
  4012. if (!isRequest)
  4013. return BUFFER_ERROR;
  4014. /* Must contain a length and at least algorithm. */
  4015. if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
  4016. return BUFFER_ERROR;
  4017. ato16(input, &len);
  4018. input += OPAQUE16_LEN;
  4019. /* Algorithm array must fill rest of data. */
  4020. if (length != OPAQUE16_LEN + len)
  4021. return BUFFER_ERROR;
  4022. /* truncate hashSigAlgo list if too long */
  4023. suites->hashSigAlgoSz = len;
  4024. if (suites->hashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
  4025. WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
  4026. suites->hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
  4027. }
  4028. XMEMCPY(suites->hashSigAlgo, input, suites->hashSigAlgoSz);
  4029. return TLSX_SignatureAlgorithms_MapPss(ssl, input, len);
  4030. }
  4031. /* Sets a new SupportedVersions extension into the extension list.
  4032. *
  4033. * extensions The list of extensions.
  4034. * data The extensions specific data.
  4035. * heap The heap used for allocation.
  4036. * returns 0 on success, otherwise failure.
  4037. */
  4038. static int TLSX_SetSignatureAlgorithms(TLSX** extensions, const void* data,
  4039. void* heap)
  4040. {
  4041. if (extensions == NULL)
  4042. return BAD_FUNC_ARG;
  4043. return TLSX_Push(extensions, TLSX_SIGNATURE_ALGORITHMS, (void *)data, heap);
  4044. }
  4045. #define SA_GET_SIZE TLSX_SignatureAlgorithms_GetSize
  4046. #define SA_WRITE TLSX_SignatureAlgorithms_Write
  4047. #define SA_PARSE TLSX_SignatureAlgorithms_Parse
  4048. /******************************************************************************/
  4049. /* Key Share */
  4050. /******************************************************************************/
  4051. #ifdef WOLFSSL_TLS13
  4052. #ifndef NO_DH
  4053. /* Create a key share entry using named Diffie-Hellman parameters group.
  4054. * Generates a key pair.
  4055. *
  4056. * ssl The SSL/TLS object.
  4057. * kse The key share entry object.
  4058. * returns 0 on success, otherwise failure.
  4059. */
  4060. static int TLSX_KeyShare_GenDhKey(WOLFSSL *ssl, KeyShareEntry* kse)
  4061. {
  4062. int ret;
  4063. byte* keyData;
  4064. void* key = NULL;
  4065. word32 keySz;
  4066. word32 dataSz;
  4067. const DhParams* params;
  4068. DhKey dhKey;
  4069. /* TODO: [TLS13] The key size should come from wolfcrypt. */
  4070. /* Pick the parameters from the named group. */
  4071. switch (kse->group) {
  4072. #ifdef HAVE_FFDHE_2048
  4073. case WOLFSSL_FFDHE_2048:
  4074. params = wc_Dh_ffdhe2048_Get();
  4075. keySz = 29;
  4076. break;
  4077. #endif
  4078. #ifdef HAVE_FFDHE_3072
  4079. case WOLFSSL_FFDHE_3072:
  4080. params = wc_Dh_ffdhe3072_Get();
  4081. keySz = 34;
  4082. break;
  4083. #endif
  4084. #ifdef HAVE_FFDHE_4096
  4085. case WOLFSSL_FFDHE_4096:
  4086. params = wc_Dh_ffdhe4096_Get();
  4087. keySz = 39;
  4088. break;
  4089. #endif
  4090. #ifdef HAVE_FFDHE_6144
  4091. case WOLFSSL_FFDHE_6144:
  4092. params = wc_Dh_ffdhe6144_Get();
  4093. keySz = 46;
  4094. break;
  4095. #endif
  4096. #ifdef HAVE_FFDHE_8192
  4097. case WOLFSSL_FFDHE_8192:
  4098. params = wc_Dh_ffdhe8192_Get();
  4099. keySz = 52;
  4100. break;
  4101. #endif
  4102. default:
  4103. return BAD_FUNC_ARG;
  4104. }
  4105. ret = wc_InitDhKey_ex(&dhKey, ssl->heap, ssl->devId);
  4106. if (ret != 0)
  4107. return ret;
  4108. /* Allocate space for the public key. */
  4109. dataSz = params->p_len;
  4110. keyData = (byte*)XMALLOC(dataSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  4111. if (keyData == NULL) {
  4112. ret = MEMORY_E;
  4113. goto end;
  4114. }
  4115. /* Allocate space for the private key. */
  4116. key = (byte*)XMALLOC(keySz, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  4117. if (key == NULL) {
  4118. ret = MEMORY_E;
  4119. goto end;
  4120. }
  4121. /* Set key */
  4122. ret = wc_DhSetKey(&dhKey,
  4123. (byte*)params->p, params->p_len,
  4124. (byte*)params->g, params->g_len);
  4125. if (ret != 0)
  4126. goto end;
  4127. /* Generate a new key pair. */
  4128. ret = wc_DhGenerateKeyPair(&dhKey, ssl->rng, (byte*)key, &keySz, keyData,
  4129. &dataSz);
  4130. #ifdef WOLFSSL_ASYNC_CRYPT
  4131. /* TODO: Make this function non-blocking */
  4132. if (ret == WC_PENDING_E) {
  4133. ret = wc_AsyncWait(ret, &dhKey.asyncDev, WC_ASYNC_FLAG_NONE);
  4134. }
  4135. #endif
  4136. if (ret != 0)
  4137. goto end;
  4138. if (params->p_len != dataSz) {
  4139. /* Pad the front of the key data with zeros. */
  4140. XMEMMOVE(keyData + params->p_len - dataSz, keyData, dataSz);
  4141. XMEMSET(keyData, 0, params->p_len - dataSz);
  4142. }
  4143. kse->ke = keyData;
  4144. kse->keLen = params->p_len;
  4145. kse->key = key;
  4146. kse->keyLen = keySz;
  4147. #ifdef WOLFSSL_DEBUG_TLS
  4148. WOLFSSL_MSG("Public DH Key");
  4149. WOLFSSL_BUFFER(keyData, params->p_len);
  4150. #endif
  4151. end:
  4152. wc_FreeDhKey(&dhKey);
  4153. if (ret != 0) {
  4154. /* Data owned by key share entry otherwise. */
  4155. if (keyData != NULL)
  4156. XFREE(keyData, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  4157. if (key != NULL)
  4158. XFREE(key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  4159. }
  4160. return ret;
  4161. }
  4162. #endif
  4163. #ifdef HAVE_ECC
  4164. /* Create a key share entry using named elliptic curve parameters group.
  4165. * Generates a key pair.
  4166. *
  4167. * ssl The SSL/TLS object.
  4168. * kse The key share entry object.
  4169. * returns 0 on success, otherwise failure.
  4170. */
  4171. static int TLSX_KeyShare_GenEccKey(WOLFSSL *ssl, KeyShareEntry* kse)
  4172. {
  4173. int ret;
  4174. byte* keyData = NULL;
  4175. word32 dataSize;
  4176. word32 keySize;
  4177. ecc_key* eccKey = NULL;
  4178. word16 curveId;
  4179. /* TODO: [TLS13] The key sizes should come from wolfcrypt. */
  4180. /* Translate named group to a curve id. */
  4181. switch (kse->group) {
  4182. #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES)
  4183. #ifndef NO_ECC_SECP
  4184. case WOLFSSL_ECC_SECP256R1:
  4185. curveId = ECC_SECP256R1;
  4186. keySize = 32;
  4187. dataSize = keySize * 2 + 1;
  4188. break;
  4189. #endif /* !NO_ECC_SECP */
  4190. #endif
  4191. #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
  4192. #ifndef NO_ECC_SECP
  4193. case WOLFSSL_ECC_SECP384R1:
  4194. curveId = ECC_SECP384R1;
  4195. keySize = 48;
  4196. dataSize = keySize * 2 + 1;
  4197. break;
  4198. #endif /* !NO_ECC_SECP */
  4199. #endif
  4200. #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
  4201. #ifndef NO_ECC_SECP
  4202. case WOLFSSL_ECC_SECP521R1:
  4203. curveId = ECC_SECP521R1;
  4204. keySize = 66;
  4205. dataSize = keySize * 2 + 1;
  4206. break;
  4207. #endif /* !NO_ECC_SECP */
  4208. #endif
  4209. #ifdef HAVE_CURVE25519
  4210. case WOLFSSL_ECC_X25519:
  4211. {
  4212. curve25519_key* key;
  4213. /* Allocate an ECC key to hold private key. */
  4214. key = (curve25519_key*)XMALLOC(sizeof(curve25519_key),
  4215. ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  4216. if (key == NULL) {
  4217. WOLFSSL_MSG("EccTempKey Memory error");
  4218. return MEMORY_E;
  4219. }
  4220. dataSize = keySize = 32;
  4221. /* Make an ECC key. */
  4222. ret = wc_curve25519_init(key);
  4223. if (ret != 0)
  4224. goto end;
  4225. ret = wc_curve25519_make_key(ssl->rng, keySize, key);
  4226. if (ret != 0)
  4227. goto end;
  4228. /* Allocate space for the public key. */
  4229. keyData = (byte*)XMALLOC(dataSize, ssl->heap,
  4230. DYNAMIC_TYPE_PUBLIC_KEY);
  4231. if (keyData == NULL) {
  4232. WOLFSSL_MSG("Key data Memory error");
  4233. ret = MEMORY_E;
  4234. goto end;
  4235. }
  4236. /* Export public key. */
  4237. if (wc_curve25519_export_public_ex(key, keyData, &dataSize,
  4238. EC25519_LITTLE_ENDIAN) != 0) {
  4239. ret = ECC_EXPORT_ERROR;
  4240. goto end;
  4241. }
  4242. kse->ke = keyData;
  4243. kse->keLen = dataSize;
  4244. kse->key = key;
  4245. #ifdef WOLFSSL_DEBUG_TLS
  4246. WOLFSSL_MSG("Public Curve25519 Key");
  4247. WOLFSSL_BUFFER(keyData, dataSize);
  4248. #endif
  4249. goto end;
  4250. }
  4251. #endif
  4252. #ifdef HAVE_X448
  4253. case WOLFSSL_ECC_X448:
  4254. curveId = ECC_X448;
  4255. dataSize = keySize = 56;
  4256. break;
  4257. #endif
  4258. default:
  4259. return BAD_FUNC_ARG;
  4260. }
  4261. /* Allocate an ECC key to hold private key. */
  4262. eccKey = (ecc_key*)XMALLOC(sizeof(ecc_key), ssl->heap,
  4263. DYNAMIC_TYPE_PRIVATE_KEY);
  4264. if (eccKey == NULL) {
  4265. WOLFSSL_MSG("EccTempKey Memory error");
  4266. return MEMORY_E;
  4267. }
  4268. /* Make an ECC key. */
  4269. ret = wc_ecc_init_ex(eccKey, ssl->heap, ssl->devId);
  4270. if (ret != 0)
  4271. goto end;
  4272. ret = wc_ecc_make_key_ex(ssl->rng, keySize, eccKey, curveId);
  4273. #ifdef WOLFSSL_ASYNC_CRYPT
  4274. /* TODO: Make this function non-blocking */
  4275. if (ret == WC_PENDING_E) {
  4276. ret = wc_AsyncWait(ret, &eccKey->asyncDev, WC_ASYNC_FLAG_NONE);
  4277. }
  4278. #endif
  4279. if (ret != 0)
  4280. goto end;
  4281. /* Allocate space for the public key. */
  4282. keyData = (byte*)XMALLOC(dataSize, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  4283. if (keyData == NULL) {
  4284. WOLFSSL_MSG("Key data Memory error");
  4285. ret = MEMORY_E;
  4286. goto end;
  4287. }
  4288. /* Export public key. */
  4289. if (wc_ecc_export_x963(eccKey, keyData, &dataSize) != 0) {
  4290. ret = ECC_EXPORT_ERROR;
  4291. goto end;
  4292. }
  4293. kse->ke = keyData;
  4294. kse->keLen = dataSize;
  4295. kse->key = eccKey;
  4296. #ifdef WOLFSSL_DEBUG_TLS
  4297. WOLFSSL_MSG("Public ECC Key");
  4298. WOLFSSL_BUFFER(keyData, dataSize);
  4299. #endif
  4300. end:
  4301. if (ret != 0) {
  4302. /* Data owned by key share entry otherwise. */
  4303. if (eccKey != NULL)
  4304. XFREE(eccKey, ssl->heap, DYNAMIC_TYPE_TLSX);
  4305. if (keyData != NULL)
  4306. XFREE(keyData, ssl->heap, DYNAMIC_TYPE_TLSX);
  4307. }
  4308. return ret;
  4309. }
  4310. #endif /* HAVE_ECC */
  4311. /* Generate a secret/key using the key share entry.
  4312. *
  4313. * ssl The SSL/TLS object.
  4314. * kse The key share entry holding peer data.
  4315. */
  4316. static int TLSX_KeyShare_GenKey(WOLFSSL *ssl, KeyShareEntry *kse)
  4317. {
  4318. #ifndef NO_DH
  4319. /* Named FFHE groups have a bit set to identify them. */
  4320. if ((kse->group & NAMED_DH_MASK) == NAMED_DH_MASK)
  4321. return TLSX_KeyShare_GenDhKey(ssl, kse);
  4322. #endif
  4323. #ifdef HAVE_ECC
  4324. return TLSX_KeyShare_GenEccKey(ssl, kse);
  4325. #else
  4326. return NOT_COMPILED_IN;
  4327. #endif
  4328. }
  4329. /* Free the key share dynamic data.
  4330. *
  4331. * list The linked list of key share entry objects.
  4332. * heap The heap used for allocation.
  4333. */
  4334. static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap)
  4335. {
  4336. KeyShareEntry* current;
  4337. while ((current = list) != NULL) {
  4338. list = current->next;
  4339. #ifdef HAVE_ECC
  4340. if ((current->group & NAMED_DH_MASK) == 0) {
  4341. if (current->group == WOLFSSL_ECC_X25519) {
  4342. #ifdef HAVE_CURVE25519
  4343. #endif
  4344. }
  4345. else {
  4346. #ifdef HAVE_ECC
  4347. wc_ecc_free((ecc_key*)(current->key));
  4348. #endif
  4349. }
  4350. }
  4351. #endif
  4352. XFREE(current->key, heap, DYNAMIC_TYPE_PRIVATE_KEY);
  4353. XFREE(current->ke, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  4354. XFREE(current, heap, DYNAMIC_TYPE_TLSX);
  4355. }
  4356. (void)heap;
  4357. }
  4358. /* Get the size of the encoded key share extension.
  4359. *
  4360. * list The linked list of key share extensions.
  4361. * msgType The type of the message this extension is being written into.
  4362. * returns the number of bytes of the encoded key share extension.
  4363. */
  4364. static word16 TLSX_KeyShare_GetSize(KeyShareEntry* list, byte msgType)
  4365. {
  4366. int len = 0;
  4367. byte isRequest = (msgType == client_hello);
  4368. KeyShareEntry* current;
  4369. /* The named group the server wants to use. */
  4370. if (msgType == hello_retry_request)
  4371. return OPAQUE16_LEN;
  4372. /* List of key exchange groups. */
  4373. if (isRequest)
  4374. len += OPAQUE16_LEN;
  4375. while ((current = list) != NULL) {
  4376. list = current->next;
  4377. if (!isRequest && current->key == NULL)
  4378. continue;
  4379. len += (int)(KE_GROUP_LEN + OPAQUE16_LEN + current->keLen);
  4380. }
  4381. return (word16)len;
  4382. }
  4383. /* Writes the key share extension into the output buffer.
  4384. * Assumes that the the output buffer is big enough to hold data.
  4385. *
  4386. * list The linked list of key share entries.
  4387. * output The buffer to write into.
  4388. * msgType The type of the message this extension is being written into.
  4389. * returns the number of bytes written into the buffer.
  4390. */
  4391. static word16 TLSX_KeyShare_Write(KeyShareEntry* list, byte* output,
  4392. byte msgType)
  4393. {
  4394. word16 i = 0;
  4395. byte isRequest = (msgType == client_hello);
  4396. KeyShareEntry* current;
  4397. if (msgType == hello_retry_request) {
  4398. c16toa(list->group, output);
  4399. return OPAQUE16_LEN;
  4400. }
  4401. /* ClientHello has a list but ServerHello is only the chosen. */
  4402. if (isRequest)
  4403. i += OPAQUE16_LEN;
  4404. /* Write out all in the list. */
  4405. while ((current = list) != NULL) {
  4406. list = current->next;
  4407. if (!isRequest && current->key == NULL)
  4408. continue;
  4409. c16toa(current->group, &output[i]);
  4410. i += KE_GROUP_LEN;
  4411. c16toa(current->keLen, &output[i]);
  4412. i += OPAQUE16_LEN;
  4413. XMEMCPY(&output[i], current->ke, current->keLen);
  4414. i += current->keLen;
  4415. }
  4416. /* Write the length of the list if required. */
  4417. if (isRequest)
  4418. c16toa(i - OPAQUE16_LEN, output);
  4419. return i;
  4420. }
  4421. /* Process the DH key share extension on the client side.
  4422. *
  4423. * ssl The SSL/TLS object.
  4424. * keyShareEntry The key share entry object to use to calculate shared secret.
  4425. * returns 0 on success and other values indicate failure.
  4426. */
  4427. static int TLSX_KeyShare_ProcessDh(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
  4428. {
  4429. #ifndef NO_DH
  4430. int ret;
  4431. const DhParams* params;
  4432. word16 i;
  4433. byte b;
  4434. DhKey dhKey;
  4435. switch (keyShareEntry->group) {
  4436. #ifdef HAVE_FFDHE_2048
  4437. case WOLFSSL_FFDHE_2048:
  4438. params = wc_Dh_ffdhe2048_Get();
  4439. break;
  4440. #endif
  4441. #ifdef HAVE_FFDHE_3072
  4442. case WOLFSSL_FFDHE_3072:
  4443. params = wc_Dh_ffdhe3072_Get();
  4444. break;
  4445. #endif
  4446. #ifdef HAVE_FFDHE_4096
  4447. case WOLFSSL_FFDHE_4096:
  4448. params = wc_Dh_ffdhe4096_Get();
  4449. break;
  4450. #endif
  4451. #ifdef HAVE_FFDHE_6144
  4452. case WOLFSSL_FFDHE_6144:
  4453. params = wc_Dh_ffdhe6144_Get();
  4454. break;
  4455. #endif
  4456. #ifdef HAVE_FFDHE_8192
  4457. case WOLFSSL_FFDHE_8192:
  4458. params = wc_Dh_ffdhe8192_Get();
  4459. break;
  4460. #endif
  4461. default:
  4462. return PEER_KEY_ERROR;
  4463. }
  4464. #ifdef WOLFSSL_DEBUG_TLS
  4465. WOLFSSL_MSG("Peer DH Key");
  4466. WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
  4467. #endif
  4468. if (params->p_len != keyShareEntry->keLen)
  4469. return BUFFER_ERROR;
  4470. ssl->options.dhKeySz = params->p_len;
  4471. /* TODO: [TLS13] move this check down into wolfcrypt. */
  4472. /* Check that public DH key is not 0 or 1. */
  4473. b = 0;
  4474. for (i = 0; i < params->p_len - 1; i++)
  4475. b |= keyShareEntry->ke[i];
  4476. if (b == 0 && (keyShareEntry->ke[i] == 0x00 ||
  4477. keyShareEntry->ke[i] == 0x01)) {
  4478. return PEER_KEY_ERROR;
  4479. }
  4480. /* Check that public DH key is not mod, mod + 1 or mod - 1. */
  4481. b = 0;
  4482. for (i = 0; i < params->p_len - 1; i++)
  4483. b |= params->p[i] ^ keyShareEntry->ke[i];
  4484. if (b == 0 && (params->p[i] == keyShareEntry->ke[i] ||
  4485. params->p[i] - 1 == keyShareEntry->ke[i] ||
  4486. params->p[i] + 1 == keyShareEntry->ke[i])) {
  4487. return PEER_KEY_ERROR;
  4488. }
  4489. ret = wc_InitDhKey_ex(&dhKey, ssl->heap, ssl->devId);
  4490. if (ret != 0)
  4491. return ret;
  4492. /* Set key */
  4493. ret = wc_DhSetKey(&dhKey,
  4494. (byte*)params->p, params->p_len,
  4495. (byte*)params->g, params->g_len);
  4496. if (ret != 0) {
  4497. wc_FreeDhKey(&dhKey);
  4498. return ret;
  4499. }
  4500. /* Derive secret from private key and peer's public key. */
  4501. ret = wc_DhAgree(&dhKey,
  4502. ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz,
  4503. (const byte*)keyShareEntry->key, keyShareEntry->keyLen,
  4504. keyShareEntry->ke, keyShareEntry->keLen);
  4505. #ifdef WOLFSSL_ASYNC_CRYPT
  4506. /* TODO: Make this function non-blocking */
  4507. if (ret == WC_PENDING_E) {
  4508. ret = wc_AsyncWait(ret, &dhKey.asyncDev, WC_ASYNC_FLAG_NONE);
  4509. }
  4510. #endif
  4511. wc_FreeDhKey(&dhKey);
  4512. return ret;
  4513. #else
  4514. (void)ssl;
  4515. (void)keyShareEntry;
  4516. return PEER_KEY_ERROR;
  4517. #endif
  4518. }
  4519. /* Process the ECC key share extension on the client side.
  4520. *
  4521. * ssl The SSL/TLS object.
  4522. * keyShareEntry The key share entry object to use to calculate shared secret.
  4523. * returns 0 on success and other values indicate failure.
  4524. */
  4525. static int TLSX_KeyShare_ProcessEcc(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
  4526. {
  4527. int ret;
  4528. #ifdef HAVE_ECC
  4529. int curveId;
  4530. ecc_key* keyShareKey = (ecc_key*)keyShareEntry->key;
  4531. if (ssl->peerEccKey != NULL)
  4532. wc_ecc_free(ssl->peerEccKey);
  4533. ssl->peerEccKey = (ecc_key*)XMALLOC(sizeof(ecc_key), ssl->heap,
  4534. DYNAMIC_TYPE_ECC);
  4535. if (ssl->peerEccKey == NULL) {
  4536. WOLFSSL_MSG("PeerEccKey Memory error");
  4537. return MEMORY_ERROR;
  4538. }
  4539. ret = wc_ecc_init_ex(ssl->peerEccKey, ssl->heap, ssl->devId);
  4540. if (ret != 0)
  4541. return ret;
  4542. /* find supported curve */
  4543. switch (keyShareEntry->group) {
  4544. #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES)
  4545. #ifndef NO_ECC_SECP
  4546. case WOLFSSL_ECC_SECP256R1:
  4547. curveId = ECC_SECP256R1;
  4548. break;
  4549. #endif /* !NO_ECC_SECP */
  4550. #endif
  4551. #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
  4552. #ifndef NO_ECC_SECP
  4553. case WOLFSSL_ECC_SECP384R1:
  4554. curveId = ECC_SECP384R1;
  4555. break;
  4556. #endif /* !NO_ECC_SECP */
  4557. #endif
  4558. #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
  4559. #ifndef NO_ECC_SECP
  4560. case WOLFSSL_ECC_SECP521R1:
  4561. curveId = ECC_SECP521R1;
  4562. break;
  4563. #endif /* !NO_ECC_SECP */
  4564. #endif
  4565. #ifdef HAVE_CURVE25519
  4566. case WOLFSSL_ECC_X25519:
  4567. {
  4568. curve25519_key* key = (curve25519_key*)keyShareEntry->key;
  4569. curve25519_key* peerEccKey;
  4570. if (ssl->peerEccKey != NULL)
  4571. wc_ecc_free(ssl->peerEccKey);
  4572. peerEccKey = (curve25519_key*)XMALLOC(sizeof(curve25519_key),
  4573. ssl->heap, DYNAMIC_TYPE_TLSX);
  4574. if (peerEccKey == NULL) {
  4575. WOLFSSL_MSG("PeerEccKey Memory error");
  4576. return MEMORY_ERROR;
  4577. }
  4578. ret = wc_curve25519_init(peerEccKey);
  4579. if (ret != 0)
  4580. return ret;
  4581. #ifdef WOLFSSL_DEBUG_TLS
  4582. WOLFSSL_MSG("Peer Curve25519 Key");
  4583. WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
  4584. #endif
  4585. /* Point is validated by import function. */
  4586. if (wc_curve25519_import_public_ex(keyShareEntry->ke,
  4587. keyShareEntry->keLen, peerEccKey,
  4588. EC25519_LITTLE_ENDIAN) != 0) {
  4589. return ECC_PEERKEY_ERROR;
  4590. }
  4591. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  4592. ret = wc_curve25519_shared_secret_ex(key, peerEccKey,
  4593. ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz,
  4594. EC25519_LITTLE_ENDIAN);
  4595. wc_curve25519_free(peerEccKey);
  4596. XFREE(peerEccKey, ssl->heap, DYNAMIC_TYPE_TLSX);
  4597. ssl->ecdhCurveOID = ECC_X25519_OID;
  4598. return ret;
  4599. }
  4600. #endif
  4601. #ifdef HAVE_X448
  4602. case WOLFSSL_ECC_X448:
  4603. curveId = ECC_X448;
  4604. break;
  4605. #endif
  4606. default:
  4607. /* unsupported curve */
  4608. return ECC_PEERKEY_ERROR;
  4609. }
  4610. #ifdef WOLFSSL_DEBUG_TLS
  4611. WOLFSSL_MSG("Peer ECC Key");
  4612. WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
  4613. #endif
  4614. /* Point is validated by import function. */
  4615. if (wc_ecc_import_x963_ex(keyShareEntry->ke, keyShareEntry->keLen,
  4616. ssl->peerEccKey, curveId) != 0) {
  4617. return ECC_PEERKEY_ERROR;
  4618. }
  4619. ssl->ecdhCurveOID = ssl->peerEccKey->dp->oidSum;
  4620. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  4621. do {
  4622. #if defined(WOLFSSL_ASYNC_CRYPT)
  4623. ret = wc_AsyncWait(ret, &keyShareKey->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4624. #endif
  4625. if (ret >= 0)
  4626. ret = wc_ecc_shared_secret(keyShareKey, ssl->peerEccKey,
  4627. ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
  4628. } while (ret == WC_PENDING_E);
  4629. #if 0
  4630. /* TODO: Switch to support async here and use: */
  4631. ret = EccSharedSecret(ssl, keyShareEntry->key, ssl->peerEccKey,
  4632. keyShareEntry->ke, &keyShareEntry->keLen,
  4633. ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz,
  4634. ssl->options.side,
  4635. #ifdef HAVE_PK_CALLBACKS
  4636. ssl->EccSharedSecretCtx
  4637. #else
  4638. NULL
  4639. #endif
  4640. );
  4641. #endif
  4642. #else
  4643. (void)ssl;
  4644. (void)keyShareEntry;
  4645. ret = PEER_KEY_ERROR;
  4646. #endif /* HAVE_ECC */
  4647. return ret;
  4648. }
  4649. /* Process the key share extension on the client side.
  4650. *
  4651. * ssl The SSL/TLS object.
  4652. * keyShareEntry The key share entry object to use to calculate shared secret.
  4653. * returns 0 on success and other values indicate failure.
  4654. */
  4655. static int TLSX_KeyShare_Process(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
  4656. {
  4657. int ret;
  4658. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  4659. ssl->session.namedGroup = (byte)keyShareEntry->group;
  4660. #endif
  4661. /* Use Key Share Data from server. */
  4662. if (keyShareEntry->group & NAMED_DH_MASK)
  4663. ret = TLSX_KeyShare_ProcessDh(ssl, keyShareEntry);
  4664. else
  4665. ret = TLSX_KeyShare_ProcessEcc(ssl, keyShareEntry);
  4666. #ifdef WOLFSSL_DEBUG_TLS
  4667. WOLFSSL_MSG("KE Secret");
  4668. WOLFSSL_BUFFER(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  4669. #endif
  4670. return ret;
  4671. }
  4672. /* Parse an entry of the KeyShare extension.
  4673. *
  4674. * ssl The SSL/TLS object.
  4675. * input The extension data.
  4676. * length The length of the extension data.
  4677. * kse The new key share entry object.
  4678. * returns a positive number to indicate amount of data parsed and a negative
  4679. * number on error.
  4680. */
  4681. static int TLSX_KeyShareEntry_Parse(WOLFSSL* ssl, byte* input, word16 length,
  4682. KeyShareEntry **kse)
  4683. {
  4684. int ret;
  4685. word16 group;
  4686. word16 keLen;
  4687. int offset = 0;
  4688. byte* ke;
  4689. if (length < OPAQUE16_LEN + OPAQUE16_LEN)
  4690. return BUFFER_ERROR;
  4691. /* Named group */
  4692. ato16(&input[offset], &group);
  4693. offset += OPAQUE16_LEN;
  4694. /* Key exchange data - public key. */
  4695. ato16(&input[offset], &keLen);
  4696. offset += OPAQUE16_LEN;
  4697. if (keLen < 1 || keLen > length - offset)
  4698. return BUFFER_ERROR;
  4699. /* Store a copy in the key share object. */
  4700. ke = (byte*)XMALLOC(keLen, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  4701. if (ke == NULL)
  4702. return MEMORY_E;
  4703. XMEMCPY(ke, &input[offset], keLen);
  4704. /* Populate a key share object in the extension. */
  4705. ret = TLSX_KeyShare_Use(ssl, group, keLen, ke, kse);
  4706. if (ret != 0) {
  4707. XFREE(ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  4708. return ret;
  4709. }
  4710. /* Total length of the parsed data. */
  4711. return offset + keLen;
  4712. }
  4713. /* Searches the groups sent for the specified named group.
  4714. *
  4715. * ssl The SSL/TLS object.
  4716. * name The group name to match.
  4717. * returns 1 when the extension has the group name and 0 otherwise.
  4718. */
  4719. static int TLSX_KeyShare_Find(WOLFSSL* ssl, word16 group)
  4720. {
  4721. TLSX* extension;
  4722. KeyShareEntry* list;
  4723. extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
  4724. if (extension == NULL)
  4725. return 0;
  4726. list = (KeyShareEntry*)extension->data;
  4727. while (list != NULL) {
  4728. if (list->group == group) {
  4729. return 1;
  4730. }
  4731. list = list->next;
  4732. }
  4733. return 0;
  4734. }
  4735. /* Searches the supported groups extension for the specified named group.
  4736. *
  4737. * ssl The SSL/TLS object.
  4738. * name The group name to match.
  4739. * returns 1 when the extension has the group name and 0 otherwise.
  4740. */
  4741. static int TLSX_SupportedGroups_Find(WOLFSSL* ssl, word16 name)
  4742. {
  4743. #ifdef HAVE_SUPPORTED_CURVES
  4744. TLSX* extension;
  4745. SupportedCurve* curve = NULL;
  4746. if ((extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS)) == NULL)
  4747. return 0;
  4748. for (curve = (SupportedCurve*)extension->data; curve; curve = curve->next) {
  4749. if (curve->name == name)
  4750. return 1;
  4751. }
  4752. #endif
  4753. (void)ssl;
  4754. (void)name;
  4755. return 0;
  4756. }
  4757. /* Parse the KeyShare extension.
  4758. * Different formats in different messages.
  4759. *
  4760. * ssl The SSL/TLS object.
  4761. * input The extension data.
  4762. * length The length of the extension data.
  4763. * msgType The type of the message this extension is being parsed from.
  4764. * returns 0 on success and other values indicate failure.
  4765. */
  4766. static int TLSX_KeyShare_Parse(WOLFSSL* ssl, byte* input, word16 length,
  4767. byte msgType)
  4768. {
  4769. int ret;
  4770. KeyShareEntry *keyShareEntry;
  4771. if (msgType == client_hello) {
  4772. int offset = 0;
  4773. word16 len;
  4774. if (length < OPAQUE16_LEN)
  4775. return BUFFER_ERROR;
  4776. /* ClientHello contains zero or more key share entries. */
  4777. ato16(input, &len);
  4778. if (len != length - OPAQUE16_LEN)
  4779. return BUFFER_ERROR;
  4780. offset += OPAQUE16_LEN;
  4781. while (offset < length) {
  4782. ret = TLSX_KeyShareEntry_Parse(ssl, &input[offset], length,
  4783. &keyShareEntry);
  4784. if (ret < 0)
  4785. return ret;
  4786. offset += ret;
  4787. }
  4788. ret = 0;
  4789. }
  4790. else if (msgType == server_hello) {
  4791. int len;
  4792. /* ServerHello contains one key share entry. */
  4793. len = TLSX_KeyShareEntry_Parse(ssl, input, length, &keyShareEntry);
  4794. if (len != length)
  4795. return BUFFER_ERROR;
  4796. /* Not in list sent if there isn't a private key. */
  4797. if (keyShareEntry->key == NULL)
  4798. return BAD_KEY_SHARE_DATA;
  4799. /* Process the entry to calculate the secret. */
  4800. ret = TLSX_KeyShare_Process(ssl, keyShareEntry);
  4801. }
  4802. else if (msgType == hello_retry_request) {
  4803. word16 group;
  4804. if (length != OPAQUE16_LEN)
  4805. return BUFFER_ERROR;
  4806. /* The data is the named group the server wants to use. */
  4807. ato16(input, &group);
  4808. /* Check the selected group was supported by ClientHello extensions. */
  4809. if (!TLSX_SupportedGroups_Find(ssl, group))
  4810. return BAD_KEY_SHARE_DATA;
  4811. /* Check if the group was sent. */
  4812. if (TLSX_KeyShare_Find(ssl, group))
  4813. return BAD_KEY_SHARE_DATA;
  4814. /* Try to use the server's group. */
  4815. ret = TLSX_KeyShare_Use(ssl, group, 0, NULL, NULL);
  4816. }
  4817. else {
  4818. /* Not a message type that is allowed to have this extension. */
  4819. return SANITY_MSG_E;
  4820. }
  4821. return ret;
  4822. }
  4823. /* Create a new key share entry and put it into the list.
  4824. *
  4825. * list The linked list of key share entries.
  4826. * group The named group.
  4827. * heap The memory to allocate with.
  4828. * keyShareEntry The new key share entry object.
  4829. * returns 0 on success and other values indicate failure.
  4830. */
  4831. static int TLSX_KeyShare_New(KeyShareEntry** list, int group, void *heap,
  4832. KeyShareEntry** keyShareEntry)
  4833. {
  4834. KeyShareEntry* kse;
  4835. kse = (KeyShareEntry*)XMALLOC(sizeof(KeyShareEntry), heap,
  4836. DYNAMIC_TYPE_TLSX);
  4837. if (kse == NULL)
  4838. return MEMORY_E;
  4839. XMEMSET(kse, 0, sizeof(*kse));
  4840. kse->group = group;
  4841. /* Add it to the back and maintain the links. */
  4842. while (*list != NULL)
  4843. list = &((*list)->next);
  4844. *list = kse;
  4845. *keyShareEntry = kse;
  4846. return 0;
  4847. }
  4848. /* Use the data to create a new key share object in the extensions.
  4849. *
  4850. * ssl The SSL/TLS object.
  4851. * group The named group.
  4852. * len The length of the public key data.
  4853. * data The public key data.
  4854. * kse The new key share entry object.
  4855. * returns 0 on success and other values indicate failure.
  4856. */
  4857. int TLSX_KeyShare_Use(WOLFSSL* ssl, word16 group, word16 len, byte* data,
  4858. KeyShareEntry **kse)
  4859. {
  4860. int ret = 0;
  4861. TLSX* extension;
  4862. KeyShareEntry* keyShareEntry = NULL;
  4863. /* Find the KeyShare extension if it exists. */
  4864. extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
  4865. if (extension == NULL) {
  4866. /* Push new KeyShare extension. */
  4867. ret = TLSX_Push(&ssl->extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
  4868. if (ret != 0)
  4869. return ret;
  4870. extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
  4871. if (extension == NULL)
  4872. return MEMORY_E;
  4873. }
  4874. extension->resp = 0;
  4875. /* Try to find the key share entry with this group. */
  4876. keyShareEntry = (KeyShareEntry*)extension->data;
  4877. while (keyShareEntry != NULL) {
  4878. if (keyShareEntry->group == group)
  4879. break;
  4880. keyShareEntry = keyShareEntry->next;
  4881. }
  4882. /* Create a new key share entry if not found. */
  4883. if (keyShareEntry == NULL) {
  4884. ret = TLSX_KeyShare_New((KeyShareEntry**)&extension->data, group,
  4885. ssl->heap, &keyShareEntry);
  4886. if (ret != 0)
  4887. return ret;
  4888. }
  4889. if (data != NULL) {
  4890. /* Keep the public key data and free when finished. */
  4891. if (keyShareEntry->ke != NULL)
  4892. XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  4893. keyShareEntry->ke = data;
  4894. keyShareEntry->keLen = len;
  4895. }
  4896. else {
  4897. /* Generate a key pair. */
  4898. ret = TLSX_KeyShare_GenKey(ssl, keyShareEntry);
  4899. if (ret != 0)
  4900. return ret;
  4901. }
  4902. if (kse != NULL)
  4903. *kse = keyShareEntry;
  4904. return 0;
  4905. }
  4906. /* Set an empty Key Share extension.
  4907. *
  4908. * ssl The SSL/TLS object.
  4909. * returns 0 on success and other values indicate failure.
  4910. */
  4911. int TLSX_KeyShare_Empty(WOLFSSL* ssl)
  4912. {
  4913. int ret = 0;
  4914. TLSX* extension;
  4915. /* Find the KeyShare extension if it exists. */
  4916. extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
  4917. if (extension == NULL) {
  4918. /* Push new KeyShare extension. */
  4919. ret = TLSX_Push(&ssl->extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
  4920. }
  4921. else if (extension->data != NULL) {
  4922. TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
  4923. extension->data = NULL;
  4924. }
  4925. return ret;
  4926. }
  4927. /* Returns whether this group is supported.
  4928. *
  4929. * namedGroup The named group to check.
  4930. * returns 1 when supported or 0 otherwise.
  4931. */
  4932. static int TLSX_KeyShare_IsSupported(int namedGroup)
  4933. {
  4934. switch (namedGroup) {
  4935. #ifdef HAVE_FFDHE_2048
  4936. case WOLFSSL_FFDHE_2048:
  4937. break;
  4938. #endif
  4939. #ifdef HAVE_FFDHE_3072
  4940. case WOLFSSL_FFDHE_3072:
  4941. break;
  4942. #endif
  4943. #ifdef HAVE_FFDHE_4096
  4944. case WOLFSSL_FFDHE_4096:
  4945. break;
  4946. #endif
  4947. #ifdef HAVE_FFDHE_6144
  4948. case WOLFSSL_FFDHE_6144:
  4949. break;
  4950. #endif
  4951. #ifdef HAVE_FFDHE_8192
  4952. case WOLFSSL_FFDHE_8192:
  4953. break;
  4954. #endif
  4955. #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES)
  4956. #ifndef NO_ECC_SECP
  4957. case WOLFSSL_ECC_SECP256R1:
  4958. break;
  4959. #endif /* !NO_ECC_SECP */
  4960. #endif
  4961. #ifdef HAVE_CURVE25519
  4962. case WOLFSSL_ECC_X25519:
  4963. break;
  4964. #endif
  4965. #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
  4966. #ifndef NO_ECC_SECP
  4967. case WOLFSSL_ECC_SECP384R1:
  4968. break;
  4969. #endif /* !NO_ECC_SECP */
  4970. #endif
  4971. #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
  4972. #ifndef NO_ECC_SECP
  4973. case WOLFSSL_ECC_SECP521R1:
  4974. break;
  4975. #endif /* !NO_ECC_SECP */
  4976. #endif
  4977. #ifdef HAVE_X448
  4978. case WOLFSSL_ECC_X448:
  4979. break;
  4980. #endif
  4981. default:
  4982. return 0;
  4983. }
  4984. return 1;
  4985. }
  4986. /* Set a key share that is supported by the client into extensions.
  4987. *
  4988. * ssl The SSL/TLS object.
  4989. * returns BAD_KEY_SHARE_DATA if no supported group has a key share,
  4990. * 0 if a supported group has a key share and other values indicate an error.
  4991. */
  4992. static int TLSX_KeyShare_SetSupported(WOLFSSL* ssl)
  4993. {
  4994. int ret;
  4995. #ifdef HAVE_SUPPORTED_CURVES
  4996. TLSX* extension;
  4997. SupportedCurve* curve = NULL;
  4998. /* Use SupportedGroup's order. */
  4999. extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
  5000. if (extension != NULL)
  5001. curve = (SupportedCurve*)extension->data;
  5002. for (; curve != NULL; curve = curve->next) {
  5003. if (TLSX_KeyShare_IsSupported(curve->name) &&
  5004. !TLSX_KeyShare_Find(ssl, curve->name)) {
  5005. break;
  5006. }
  5007. }
  5008. if (curve == NULL)
  5009. return BAD_KEY_SHARE_DATA;
  5010. /* Delete the old key share data list. */
  5011. extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
  5012. if (extension != NULL) {
  5013. TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
  5014. extension->data = NULL;
  5015. }
  5016. /* Add in the chosen group. */
  5017. ret = TLSX_KeyShare_Use(ssl, curve->name, 0, NULL, NULL);
  5018. if (ret != 0)
  5019. return ret;
  5020. /* Set extension to be in reponse. */
  5021. extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
  5022. extension->resp = 1;
  5023. #else
  5024. (void)ssl;
  5025. ret = NOT_COMPILED_IN;
  5026. #endif
  5027. return ret;
  5028. }
  5029. /* Establish the secret based on the key shares received from the client.
  5030. *
  5031. * ssl The SSL/TLS object.
  5032. * returns 0 on success and other values indicate failure.
  5033. */
  5034. int TLSX_KeyShare_Establish(WOLFSSL *ssl)
  5035. {
  5036. int ret;
  5037. TLSX* extension;
  5038. KeyShareEntry* clientKSE = NULL;
  5039. KeyShareEntry* serverKSE;
  5040. KeyShareEntry* list = NULL;
  5041. byte* ke;
  5042. word16 keLen;
  5043. /* Find the KeyShare extension if it exists. */
  5044. extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
  5045. if (extension != NULL)
  5046. list = (KeyShareEntry*)extension->data;
  5047. if (extension && extension->resp == 1)
  5048. return 0;
  5049. /* TODO: [TLS13] Server's preference and sending back SupportedGroups */
  5050. /* Use client's preference. */
  5051. for (clientKSE = list; clientKSE != NULL; clientKSE = clientKSE->next) {
  5052. /* Check consistency now - extensions in any order. */
  5053. if (!TLSX_SupportedGroups_Find(ssl, clientKSE->group))
  5054. return BAD_KEY_SHARE_DATA;
  5055. #ifdef OPENSSL_EXTRA
  5056. /* Check if server supports group. */
  5057. if (ssl->ctx->disabledCurves & (1 << clientKSE->group))
  5058. continue;
  5059. #endif
  5060. if (TLSX_KeyShare_IsSupported(clientKSE->group))
  5061. break;
  5062. }
  5063. /* No supported group found - send HelloRetryRequest. */
  5064. if (clientKSE == NULL) {
  5065. ret = TLSX_KeyShare_SetSupported(ssl);
  5066. /* Return KEY_SHARE_ERROR to indicate HelloRetryRequest required. */
  5067. if (ret == 0)
  5068. return KEY_SHARE_ERROR;
  5069. return ret;
  5070. }
  5071. list = NULL;
  5072. /* Generate a new key pair. */
  5073. ret = TLSX_KeyShare_New(&list, clientKSE->group, ssl->heap, &serverKSE);
  5074. if (ret != 0)
  5075. return ret;
  5076. ret = TLSX_KeyShare_GenKey(ssl, serverKSE);
  5077. if (ret != 0)
  5078. return ret;
  5079. /* Move private key to client entry. */
  5080. if (clientKSE->key != NULL)
  5081. XFREE(clientKSE->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  5082. clientKSE->key = serverKSE->key;
  5083. serverKSE->key = NULL;
  5084. clientKSE->keyLen = serverKSE->keyLen;
  5085. /* Calculate secret. */
  5086. ret = TLSX_KeyShare_Process(ssl, clientKSE);
  5087. if (ret != 0)
  5088. return ret;
  5089. /* Swap public keys for sending to client. */
  5090. ke = serverKSE->ke;
  5091. keLen = serverKSE->keLen;
  5092. serverKSE->ke = clientKSE->ke;
  5093. serverKSE->keLen = clientKSE->keLen;
  5094. clientKSE->ke = ke;
  5095. clientKSE->keLen = keLen;
  5096. extension->resp = 1;
  5097. /* Dispose of temporary server extension. */
  5098. TLSX_KeyShare_FreeAll(list, ssl->heap);
  5099. return 0;
  5100. }
  5101. #define KS_FREE_ALL TLSX_KeyShare_FreeAll
  5102. #define KS_GET_SIZE TLSX_KeyShare_GetSize
  5103. #define KS_WRITE TLSX_KeyShare_Write
  5104. #define KS_PARSE TLSX_KeyShare_Parse
  5105. #else
  5106. #define KS_FREE_ALL(a, b)
  5107. #define KS_GET_SIZE(a, b) 0
  5108. #define KS_WRITE(a, b, c) 0
  5109. #define KS_PARSE(a, b, c, d) 0
  5110. #endif /* WOLFSSL_TLS13 */
  5111. /******************************************************************************/
  5112. /* Pre-Shared Key */
  5113. /******************************************************************************/
  5114. #if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
  5115. /* Free the pre-shared key dynamic data.
  5116. *
  5117. * list The linked list of key share entry objects.
  5118. * heap The heap used for allocation.
  5119. */
  5120. static void TLSX_PreSharedKey_FreeAll(PreSharedKey* list, void* heap)
  5121. {
  5122. PreSharedKey* current;
  5123. while ((current = list) != NULL) {
  5124. list = current->next;
  5125. XFREE(current->identity, heap, DYNAMIC_TYPE_TLSX);
  5126. XFREE(current, heap, DYNAMIC_TYPE_TLSX);
  5127. }
  5128. (void)heap;
  5129. }
  5130. /* Get the size of the encoded pre shared key extension.
  5131. *
  5132. * list The linked list of pre-shared key extensions.
  5133. * msgType The type of the message this extension is being written into.
  5134. * returns the number of bytes of the encoded pre-shared key extension or
  5135. * SANITY_MSG_E to indicate invalid message type.
  5136. */
  5137. static word16 TLSX_PreSharedKey_GetSize(PreSharedKey* list, byte msgType)
  5138. {
  5139. if (msgType == client_hello) {
  5140. /* Length of identities + Length of binders. */
  5141. word16 len = OPAQUE16_LEN + OPAQUE16_LEN;
  5142. while (list != NULL) {
  5143. /* Each entry has: identity, ticket age and binder. */
  5144. len += OPAQUE16_LEN + list->identityLen + OPAQUE32_LEN +
  5145. OPAQUE8_LEN + list->binderLen;
  5146. list = list->next;
  5147. }
  5148. return len;
  5149. }
  5150. if (msgType == server_hello) {
  5151. return OPAQUE16_LEN;
  5152. }
  5153. return 0;
  5154. }
  5155. /* The number of bytes to be written for the binders.
  5156. *
  5157. * list The linked list of pre-shared key extensions.
  5158. * msgType The type of the message this extension is being written into.
  5159. * returns the number of bytes of the encoded pre-shared key extension or
  5160. * SANITY_MSG_E to indicate invalid message type.
  5161. */
  5162. word16 TLSX_PreSharedKey_GetSizeBinders(PreSharedKey* list, byte msgType)
  5163. {
  5164. word16 len;
  5165. if (msgType != client_hello)
  5166. return SANITY_MSG_E;
  5167. /* Length of all binders. */
  5168. len = OPAQUE16_LEN;
  5169. while (list != NULL) {
  5170. len += OPAQUE8_LEN + list->binderLen;
  5171. list = list->next;
  5172. }
  5173. return len;
  5174. }
  5175. /* Writes the pre-shared key extension into the output buffer - binders only.
  5176. * Assumes that the the output buffer is big enough to hold data.
  5177. *
  5178. * list The linked list of key share entries.
  5179. * output The buffer to write into.
  5180. * msgType The type of the message this extension is being written into.
  5181. * returns the number of bytes written into the buffer.
  5182. */
  5183. word16 TLSX_PreSharedKey_WriteBinders(PreSharedKey* list, byte* output,
  5184. byte msgType)
  5185. {
  5186. PreSharedKey* current = list;
  5187. word16 idx = 0;
  5188. word16 lenIdx;
  5189. word16 len;
  5190. if (msgType != client_hello)
  5191. return SANITY_MSG_E;
  5192. /* Skip length of all binders. */
  5193. lenIdx = idx;
  5194. idx += OPAQUE16_LEN;
  5195. while (current != NULL) {
  5196. /* Binder data length. */
  5197. output[idx++] = current->binderLen;
  5198. /* Binder data. */
  5199. XMEMCPY(output + idx, current->binder, current->binderLen);
  5200. idx += current->binderLen;
  5201. current = current->next;
  5202. }
  5203. /* Length of the binders. */
  5204. len = idx - lenIdx - OPAQUE16_LEN;
  5205. c16toa(len, output + lenIdx);
  5206. return idx;
  5207. }
  5208. /* Writes the pre-shared key extension into the output buffer.
  5209. * Assumes that the the output buffer is big enough to hold data.
  5210. *
  5211. * list The linked list of key share entries.
  5212. * output The buffer to write into.
  5213. * msgType The type of the message this extension is being written into.
  5214. * returns the number of bytes written into the buffer.
  5215. */
  5216. static word16 TLSX_PreSharedKey_Write(PreSharedKey* list, byte* output,
  5217. byte msgType)
  5218. {
  5219. if (msgType == client_hello) {
  5220. PreSharedKey* current = list;
  5221. word16 idx = 0;
  5222. word16 lenIdx;
  5223. word16 len;
  5224. /* Write identites only. Binders after HMACing over this. */
  5225. lenIdx = idx;
  5226. idx += OPAQUE16_LEN;
  5227. while (current != NULL) {
  5228. /* Identity length */
  5229. c16toa(current->identityLen, output + idx);
  5230. idx += OPAQUE16_LEN;
  5231. /* Identity data */
  5232. XMEMCPY(output + idx, current->identity, current->identityLen);
  5233. idx += current->identityLen;
  5234. /* Obfuscated ticket age. */
  5235. c32toa(current->ticketAge, output + idx);
  5236. idx += OPAQUE32_LEN;
  5237. current = current->next;
  5238. }
  5239. /* Length of the identites. */
  5240. len = idx - lenIdx - OPAQUE16_LEN;
  5241. c16toa(len, output + lenIdx);
  5242. /* Don't include binders here.
  5243. * The binders are based on the hash of all the ClientHello data up to
  5244. * and include the identities written above.
  5245. */
  5246. idx += TLSX_PreSharedKey_GetSizeBinders(list, msgType);
  5247. return idx;
  5248. }
  5249. if (msgType == server_hello) {
  5250. word16 i;
  5251. /* Find the index of the chosen identity. */
  5252. for (i=0; list != NULL && !list->chosen; i++)
  5253. list = list->next;
  5254. if (list == NULL)
  5255. return BUILD_MSG_ERROR;
  5256. /* The index of the identity chosen by the server from the list supplied
  5257. * by the client.
  5258. */
  5259. c16toa(i, output);
  5260. return OPAQUE16_LEN;
  5261. }
  5262. return 0;
  5263. }
  5264. /* Parse the pre-shared key extension.
  5265. * Different formats in different messages.
  5266. *
  5267. * ssl The SSL/TLS object.
  5268. * input The extension data.
  5269. * length The length of the extension data.
  5270. * msgType The type of the message this extension is being parsed from.
  5271. * returns 0 on success and other values indicate failure.
  5272. */
  5273. static int TLSX_PreSharedKey_Parse(WOLFSSL* ssl, byte* input, word16 length,
  5274. byte msgType)
  5275. {
  5276. TLSX* extension;
  5277. PreSharedKey* list;
  5278. if (msgType == client_hello) {
  5279. int ret;
  5280. word16 len;
  5281. word16 idx = 0;
  5282. /* Length of identities and of binders. */
  5283. if (length - idx < OPAQUE16_LEN + OPAQUE16_LEN)
  5284. return BUFFER_E;
  5285. /* Length of identities. */
  5286. ato16(input + idx, &len);
  5287. idx += OPAQUE16_LEN;
  5288. if (len < MIN_PSK_ID_LEN || length - idx < len)
  5289. return BUFFER_E;
  5290. /* Create a pre-shared key object for each identity. */
  5291. while (len > 0) {
  5292. byte* identity;
  5293. word16 identityLen;
  5294. word32 age;
  5295. if (len < OPAQUE16_LEN)
  5296. return BUFFER_E;
  5297. /* Length of identity. */
  5298. ato16(input + idx, &identityLen);
  5299. idx += OPAQUE16_LEN;
  5300. if (len < OPAQUE16_LEN + identityLen + OPAQUE32_LEN)
  5301. return BUFFER_E;
  5302. /* Cache identity pointer. */
  5303. identity = input + idx;
  5304. idx += identityLen;
  5305. /* Ticket age. */
  5306. ato32(input + idx, &age);
  5307. idx += OPAQUE32_LEN;
  5308. ret = TLSX_PreSharedKey_Use(ssl, identity, identityLen, age, no_mac,
  5309. 0, 0, 1, NULL);
  5310. if (ret != 0)
  5311. return ret;
  5312. /* Done with this identity. */
  5313. len -= OPAQUE16_LEN + identityLen + OPAQUE32_LEN;
  5314. }
  5315. /* Find the list of identities sent to server. */
  5316. extension = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
  5317. if (extension == NULL)
  5318. return PSK_KEY_ERROR;
  5319. list = (PreSharedKey*)extension->data;
  5320. /* Length of binders. */
  5321. ato16(input + idx, &len);
  5322. idx += OPAQUE16_LEN;
  5323. if (len < MIN_PSK_BINDERS_LEN || length - idx < len)
  5324. return BUFFER_E;
  5325. /* Set binder for each identity. */
  5326. while (list != NULL && len > 0) {
  5327. /* Length of binder */
  5328. list->binderLen = input[idx++];
  5329. if (list->binderLen < WC_SHA256_DIGEST_SIZE ||
  5330. list->binderLen > WC_MAX_DIGEST_SIZE)
  5331. return BUFFER_E;
  5332. if (len < OPAQUE8_LEN + list->binderLen)
  5333. return BUFFER_E;
  5334. /* Copy binder into static buffer. */
  5335. XMEMCPY(list->binder, input + idx, list->binderLen);
  5336. idx += list->binderLen;
  5337. /* Done with binder entry. */
  5338. len -= OPAQUE8_LEN + list->binderLen;
  5339. /* Next identity. */
  5340. list = list->next;
  5341. }
  5342. if (list != NULL || len != 0)
  5343. return BUFFER_E;
  5344. return 0;
  5345. }
  5346. if (msgType == server_hello) {
  5347. word16 idx;
  5348. /* Index of identity chosen by server. */
  5349. if (length != OPAQUE16_LEN)
  5350. return BUFFER_E;
  5351. ato16(input, &idx);
  5352. /* Find the list of identities sent to server. */
  5353. extension = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
  5354. if (extension == NULL)
  5355. return PSK_KEY_ERROR;
  5356. list = (PreSharedKey*)extension->data;
  5357. /* Mark the identity as chosen. */
  5358. for (; list != NULL && idx > 0; idx--)
  5359. list = list->next;
  5360. if (list == NULL)
  5361. return PSK_KEY_ERROR;
  5362. list->chosen = 1;
  5363. #ifdef HAVE_SESSION_TICKET
  5364. if (list->resumption) {
  5365. /* Check that the session's details are the same as the server's. */
  5366. if (ssl->options.cipherSuite0 != ssl->session.cipherSuite0 ||
  5367. ssl->options.cipherSuite != ssl->session.cipherSuite ||
  5368. ssl->session.version.major != ssl->version.major ||
  5369. ssl->session.version.minor != ssl->version.minor ) {
  5370. return PSK_KEY_ERROR;
  5371. }
  5372. }
  5373. #endif
  5374. /* TODO: [TLS13] More checks of consistency.
  5375. * the "key_share", and "signature_algorithms" extensions are
  5376. * consistent with the indicated ke_modes and auth_modes values
  5377. */
  5378. return 0;
  5379. }
  5380. return SANITY_MSG_E;
  5381. }
  5382. /* Create a new pre-shared key and put it into the list.
  5383. *
  5384. * list The linked list of pre-shared key.
  5385. * identity The identity.
  5386. * len The length of the identity data.
  5387. * heap The memory to allocate with.
  5388. * preSharedKey The new pre-shared key object.
  5389. * returns 0 on success and other values indicate failure.
  5390. */
  5391. static int TLSX_PreSharedKey_New(PreSharedKey** list, byte* identity,
  5392. word16 len, void *heap,
  5393. PreSharedKey** preSharedKey)
  5394. {
  5395. PreSharedKey* psk;
  5396. psk = (PreSharedKey*)XMALLOC(sizeof(PreSharedKey), heap, DYNAMIC_TYPE_TLSX);
  5397. if (psk == NULL)
  5398. return MEMORY_E;
  5399. XMEMSET(psk, 0, sizeof(*psk));
  5400. /* Make a copy of the identity data. */
  5401. psk->identity = (byte*)XMALLOC(len, heap, DYNAMIC_TYPE_TLSX);
  5402. if (psk->identity == NULL) {
  5403. XFREE(psk, heap, DYNAMIC_TYPE_TLSX);
  5404. return MEMORY_E;
  5405. }
  5406. XMEMCPY(psk->identity, identity, len);
  5407. psk->identityLen = len;
  5408. /* Add it to the end and maintain the links. */
  5409. while (*list != NULL)
  5410. list = &((*list)->next);
  5411. *list = psk;
  5412. *preSharedKey = psk;
  5413. return 0;
  5414. }
  5415. static INLINE byte GetHmacLength(int hmac)
  5416. {
  5417. switch (hmac) {
  5418. #ifndef NO_SHA256
  5419. case sha256_mac:
  5420. return WC_SHA256_DIGEST_SIZE;
  5421. #endif
  5422. #ifdef WOLFSSL_SHA384
  5423. case sha384_mac:
  5424. return WC_SHA384_DIGEST_SIZE;
  5425. #endif
  5426. #ifdef WOLFSSL_SHA512
  5427. case sha512_mac:
  5428. return WC_SHA512_DIGEST_SIZE;
  5429. #endif
  5430. }
  5431. return 0;
  5432. }
  5433. /* Use the data to create a new pre-shared key object in the extensions.
  5434. *
  5435. * ssl The SSL/TLS object.
  5436. * identity The identity.
  5437. * len The length of the identity data.
  5438. * age The age of the identity.
  5439. * hmac The HMAC algorithm.
  5440. * ciphersuite0 The first byte of the ciphersuite to use.
  5441. * ciphersuite The second byte of the ciphersuite to use.
  5442. * resumption The PSK is for resumption of a session.
  5443. * preSharedKey The new pre-shared key object.
  5444. * returns 0 on success and other values indicate failure.
  5445. */
  5446. int TLSX_PreSharedKey_Use(WOLFSSL* ssl, byte* identity, word16 len, word32 age,
  5447. byte hmac, byte cipherSuite0,
  5448. byte cipherSuite, byte resumption,
  5449. PreSharedKey **preSharedKey)
  5450. {
  5451. int ret = 0;
  5452. TLSX* extension;
  5453. PreSharedKey* psk = NULL;
  5454. /* Find the pre-shared key extension if it exists. */
  5455. extension = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
  5456. if (extension == NULL) {
  5457. /* Push new pre-shared key extension. */
  5458. ret = TLSX_Push(&ssl->extensions, TLSX_PRE_SHARED_KEY, NULL, ssl->heap);
  5459. if (ret != 0)
  5460. return ret;
  5461. extension = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
  5462. if (extension == NULL)
  5463. return MEMORY_E;
  5464. }
  5465. /* Try to find the pre-shared key with this identity. */
  5466. psk = (PreSharedKey*)extension->data;
  5467. while (psk != NULL) {
  5468. if ((psk->identityLen == len) &&
  5469. (XMEMCMP(psk->identity, identity, len) == 0)) {
  5470. break;
  5471. }
  5472. psk = psk->next;
  5473. }
  5474. /* Create a new pre-shared key object if not found. */
  5475. if (psk == NULL) {
  5476. ret = TLSX_PreSharedKey_New((PreSharedKey**)&extension->data, identity,
  5477. len, ssl->heap, &psk);
  5478. if (ret != 0)
  5479. return ret;
  5480. }
  5481. /* Update/set age and HMAC algorithm. */
  5482. psk->ticketAge = age;
  5483. psk->hmac = hmac;
  5484. psk->cipherSuite0 = cipherSuite0;
  5485. psk->cipherSuite = cipherSuite;
  5486. psk->resumption = resumption;
  5487. psk->binderLen = GetHmacLength(psk->hmac);
  5488. if (preSharedKey != NULL)
  5489. *preSharedKey = psk;
  5490. return 0;
  5491. }
  5492. #define PSK_FREE_ALL TLSX_PreSharedKey_FreeAll
  5493. #define PSK_GET_SIZE TLSX_PreSharedKey_GetSize
  5494. #define PSK_WRITE TLSX_PreSharedKey_Write
  5495. #define PSK_PARSE TLSX_PreSharedKey_Parse
  5496. #else
  5497. #define PSK_FREE_ALL(a, b)
  5498. #define PSK_GET_SIZE(a, b) 0
  5499. #define PSK_WRITE(a, b, c) 0
  5500. #define PSK_PARSE(a, b, c, d) 0
  5501. #endif
  5502. /******************************************************************************/
  5503. /* PSK Key Exchange Modes */
  5504. /******************************************************************************/
  5505. #if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
  5506. /* Get the size of the encoded PSK KE modes extension.
  5507. * Only in ClientHello.
  5508. *
  5509. * modes The PSK KE mode bit string.
  5510. * msgType The type of the message this extension is being written into.
  5511. * returns the number of bytes of the encoded PSK KE mode extension.
  5512. */
  5513. static word16 TLSX_PskKeModes_GetSize(byte modes, byte msgType)
  5514. {
  5515. if (msgType == client_hello) {
  5516. /* Format: Len | Modes* */
  5517. word16 len = OPAQUE8_LEN;
  5518. /* Check whether each possible mode is to be written. */
  5519. if (modes & (1 << PSK_KE))
  5520. len += OPAQUE8_LEN;
  5521. if (modes & (1 << PSK_DHE_KE))
  5522. len += OPAQUE8_LEN;
  5523. return len;
  5524. }
  5525. return SANITY_MSG_E;
  5526. }
  5527. /* Writes the PSK KE modes extension into the output buffer.
  5528. * Assumes that the the output buffer is big enough to hold data.
  5529. * Only in ClientHello.
  5530. *
  5531. * modes The PSK KE mode bit string.
  5532. * output The buffer to write into.
  5533. * msgType The type of the message this extension is being written into.
  5534. * returns the number of bytes written into the buffer.
  5535. */
  5536. static word16 TLSX_PskKeModes_Write(byte modes, byte* output, byte msgType)
  5537. {
  5538. if (msgType == client_hello) {
  5539. /* Format: Len | Modes* */
  5540. int idx = OPAQUE8_LEN;
  5541. /* Write out each possible mode. */
  5542. if (modes & (1 << PSK_KE))
  5543. output[idx++] = PSK_KE;
  5544. if (modes & (1 << PSK_DHE_KE))
  5545. output[idx++] = PSK_DHE_KE;
  5546. /* Write out length of mode list. */
  5547. output[0] = idx - OPAQUE8_LEN;
  5548. return idx;
  5549. }
  5550. return SANITY_MSG_E;
  5551. }
  5552. /* Parse the PSK KE modes extension.
  5553. * Only in ClientHello.
  5554. *
  5555. * ssl The SSL/TLS object.
  5556. * input The extension data.
  5557. * length The length of the extension data.
  5558. * msgType The type of the message this extension is being parsed from.
  5559. * returns 0 on success and other values indicate failure.
  5560. */
  5561. static int TLSX_PskKeModes_Parse(WOLFSSL* ssl, byte* input, word16 length,
  5562. byte msgType)
  5563. {
  5564. int ret;
  5565. if (msgType == client_hello) {
  5566. /* Format: Len | Modes* */
  5567. int idx = 0;
  5568. int len;
  5569. byte modes = 0;
  5570. /* Ensure length byte exists. */
  5571. if (length < OPAQUE8_LEN)
  5572. return BUFFER_E;
  5573. /* Get length of mode list and ensure that is the only data. */
  5574. len = input[0];
  5575. if (length - OPAQUE8_LEN != len)
  5576. return BUFFER_E;
  5577. idx = OPAQUE8_LEN;
  5578. /* Set a bit for each recognized modes. */
  5579. while (len > 0) {
  5580. /* Ignore unrecognized modes. */
  5581. if (input[idx] <= PSK_DHE_KE)
  5582. modes |= 1 << input[idx];
  5583. idx++;
  5584. len--;
  5585. }
  5586. ret = TLSX_PskKeModes_Use(ssl, modes);
  5587. if (ret != 0)
  5588. return ret;
  5589. return 0;
  5590. }
  5591. return SANITY_MSG_E;
  5592. }
  5593. /* Use the data to create a new PSK Key Exchange Modes object in the extensions.
  5594. *
  5595. * ssl The SSL/TLS object.
  5596. * modes The PSK key exchange modes.
  5597. * returns 0 on success and other values indicate failure.
  5598. */
  5599. int TLSX_PskKeModes_Use(WOLFSSL* ssl, byte modes)
  5600. {
  5601. int ret = 0;
  5602. TLSX* extension;
  5603. /* Find the PSK key exchange modes extension if it exists. */
  5604. extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
  5605. if (extension == NULL) {
  5606. /* Push new PSK key exchange modes extension. */
  5607. ret = TLSX_Push(&ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES, NULL,
  5608. ssl->heap);
  5609. if (ret != 0)
  5610. return ret;
  5611. extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
  5612. if (extension == NULL)
  5613. return MEMORY_E;
  5614. }
  5615. extension->val = modes;
  5616. return 0;
  5617. }
  5618. #define PKM_GET_SIZE TLSX_PskKeModes_GetSize
  5619. #define PKM_WRITE TLSX_PskKeModes_Write
  5620. #define PKM_PARSE TLSX_PskKeModes_Parse
  5621. #else
  5622. #define PKM_GET_SIZE(a, b) 0
  5623. #define PKM_WRITE(a, b, c) 0
  5624. #define PKM_PARSE(a, b, c, d) 0
  5625. #endif
  5626. /******************************************************************************/
  5627. /* Post-Handshake Authentication */
  5628. /******************************************************************************/
  5629. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5630. /* Get the size of the encoded Post-Hanshake Authentication extension.
  5631. * Only in ClientHello.
  5632. *
  5633. * msgType The type of the message this extension is being written into.
  5634. * returns the number of bytes of the encoded Post-Hanshake Authentication
  5635. * extension.
  5636. */
  5637. static word16 TLSX_PostHandAuth_GetSize(byte msgType)
  5638. {
  5639. if (msgType == client_hello)
  5640. return OPAQUE8_LEN;
  5641. return SANITY_MSG_E;
  5642. }
  5643. /* Writes the Post-Handshake Authentication extension into the output buffer.
  5644. * Assumes that the the output buffer is big enough to hold data.
  5645. * Only in ClientHello.
  5646. *
  5647. * output The buffer to write into.
  5648. * msgType The type of the message this extension is being written into.
  5649. * returns the number of bytes written into the buffer.
  5650. */
  5651. static word16 TLSX_PostHandAuth_Write(byte* output, byte msgType)
  5652. {
  5653. if (msgType == client_hello) {
  5654. *output = 0;
  5655. return OPAQUE8_LEN;
  5656. }
  5657. return SANITY_MSG_E;
  5658. }
  5659. /* Parse the Post-Handshake Authentication extension.
  5660. * Only in ClientHello.
  5661. *
  5662. * ssl The SSL/TLS object.
  5663. * input The extension data.
  5664. * length The length of the extension data.
  5665. * msgType The type of the message this extension is being parsed from.
  5666. * returns 0 on success and other values indicate failure.
  5667. */
  5668. static int TLSX_PostHandAuth_Parse(WOLFSSL* ssl, byte* input, word16 length,
  5669. byte msgType)
  5670. {
  5671. byte len;
  5672. if (msgType == client_hello) {
  5673. /* Ensure length byte exists. */
  5674. if (length < OPAQUE8_LEN)
  5675. return BUFFER_E;
  5676. len = input[0];
  5677. if (length - OPAQUE8_LEN != len || len != 0)
  5678. return BUFFER_E;
  5679. ssl->options.postHandshakeAuth = 1;
  5680. return 0;
  5681. }
  5682. return SANITY_MSG_E;
  5683. }
  5684. /* Create a new Post-handshake authentication object in the extensions.
  5685. *
  5686. * ssl The SSL/TLS object.
  5687. * returns 0 on success and other values indicate failure.
  5688. */
  5689. static int TLSX_PostHandAuth_Use(WOLFSSL* ssl)
  5690. {
  5691. int ret = 0;
  5692. TLSX* extension;
  5693. /* Find the PSK key exchange modes extension if it exists. */
  5694. extension = TLSX_Find(ssl->extensions, TLSX_POST_HANDSHAKE_AUTH);
  5695. if (extension == NULL) {
  5696. /* Push new Post-handshake Authentication extension. */
  5697. ret = TLSX_Push(&ssl->extensions, TLSX_POST_HANDSHAKE_AUTH, NULL,
  5698. ssl->heap);
  5699. if (ret != 0)
  5700. return ret;
  5701. }
  5702. return 0;
  5703. }
  5704. #define PHA_GET_SIZE TLSX_PostHandAuth_GetSize
  5705. #define PHA_WRITE TLSX_PostHandAuth_Write
  5706. #define PHA_PARSE TLSX_PostHandAuth_Parse
  5707. #else
  5708. #define PHA_GET_SIZE(a) 0
  5709. #define PHA_WRITE(a, b) 0
  5710. #define PHA_PARSE(a, b, c, d) 0
  5711. #endif
  5712. /******************************************************************************/
  5713. /* Early Data Indication */
  5714. /******************************************************************************/
  5715. #ifdef WOLFSSL_EARLY_DATA
  5716. /* Get the size of the encoded Early Data Indication extension.
  5717. * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
  5718. *
  5719. * msgType The type of the message this extension is being written into.
  5720. * returns the number of bytes of the encoded Early Data Indication extension.
  5721. */
  5722. static word16 TLSX_EarlyData_GetSize(byte msgType)
  5723. {
  5724. if (msgType == client_hello || msgType == encrypted_extensions)
  5725. return 0;
  5726. if (msgType == session_ticket)
  5727. return OPAQUE32_LEN;
  5728. return SANITY_MSG_E;
  5729. }
  5730. /* Writes the Early Data Indicator extension into the output buffer.
  5731. * Assumes that the the output buffer is big enough to hold data.
  5732. * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
  5733. *
  5734. * max The maximum early data size.
  5735. * output The buffer to write into.
  5736. * msgType The type of the message this extension is being written into.
  5737. * returns the number of bytes written into the buffer.
  5738. */
  5739. static word16 TLSX_EarlyData_Write(word32 max, byte* output, byte msgType)
  5740. {
  5741. if (msgType == client_hello || msgType == encrypted_extensions) {
  5742. return 0;
  5743. }
  5744. if (msgType == session_ticket) {
  5745. c32toa(max, output);
  5746. return OPAQUE32_LEN;
  5747. }
  5748. return SANITY_MSG_E;
  5749. }
  5750. /* Parse the Early Data Indicator extension.
  5751. * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
  5752. *
  5753. * ssl The SSL/TLS object.
  5754. * input The extension data.
  5755. * length The length of the extension data.
  5756. * msgType The type of the message this extension is being parsed from.
  5757. * returns 0 on success and other values indicate failure.
  5758. */
  5759. static int TLSX_EarlyData_Parse(WOLFSSL* ssl, byte* input, word16 length,
  5760. byte msgType)
  5761. {
  5762. if (msgType == client_hello) {
  5763. if (length != 0)
  5764. return BUFFER_E;
  5765. return TLSX_EarlyData_Use(ssl, 0);
  5766. }
  5767. if (msgType == encrypted_extensions) {
  5768. if (length != 0)
  5769. return BUFFER_E;
  5770. return TLSX_EarlyData_Use(ssl, 1);
  5771. }
  5772. if (msgType == session_ticket) {
  5773. word32 max;
  5774. if (length != OPAQUE32_LEN)
  5775. return BUFFER_E;
  5776. ato32(input, &max);
  5777. ssl->session.maxEarlyDataSz = max;
  5778. return 0;
  5779. }
  5780. return SANITY_MSG_E;
  5781. }
  5782. /* Use the data to create a new Early Data object in the extensions.
  5783. *
  5784. * ssl The SSL/TLS object.
  5785. * max The maximum early data size.
  5786. * returns 0 on success and other values indicate failure.
  5787. */
  5788. int TLSX_EarlyData_Use(WOLFSSL* ssl, word32 max)
  5789. {
  5790. int ret = 0;
  5791. TLSX* extension;
  5792. /* Find the early data extension if it exists. */
  5793. extension = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
  5794. if (extension == NULL) {
  5795. /* Push new early data extension. */
  5796. ret = TLSX_Push(&ssl->extensions, TLSX_EARLY_DATA, NULL, ssl->heap);
  5797. if (ret != 0)
  5798. return ret;
  5799. extension = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
  5800. if (extension == NULL)
  5801. return MEMORY_E;
  5802. }
  5803. extension->resp = 1;
  5804. extension->val = max;
  5805. return 0;
  5806. }
  5807. #define EDI_GET_SIZE TLSX_EarlyData_GetSize
  5808. #define EDI_WRITE TLSX_EarlyData_Write
  5809. #define EDI_PARSE TLSX_EarlyData_Parse
  5810. #else
  5811. #define EDI_GET_SIZE(a) 0
  5812. #define EDI_WRITE(a, b, c) 0
  5813. #define EDI_PARSE(a, b, c, d) 0
  5814. #endif
  5815. /******************************************************************************/
  5816. /* TLS Extensions Framework */
  5817. /******************************************************************************/
  5818. /** Finds an extension in the provided list. */
  5819. TLSX* TLSX_Find(TLSX* list, TLSX_Type type)
  5820. {
  5821. TLSX* extension = list;
  5822. while (extension && extension->type != type)
  5823. extension = extension->next;
  5824. return extension;
  5825. }
  5826. /** Releases all extensions in the provided list. */
  5827. void TLSX_FreeAll(TLSX* list, void* heap)
  5828. {
  5829. TLSX* extension;
  5830. while ((extension = list)) {
  5831. list = extension->next;
  5832. switch (extension->type) {
  5833. case TLSX_SERVER_NAME:
  5834. SNI_FREE_ALL((SNI*)extension->data, heap);
  5835. break;
  5836. case TLSX_MAX_FRAGMENT_LENGTH:
  5837. MFL_FREE_ALL(extension->data, heap);
  5838. break;
  5839. case TLSX_TRUNCATED_HMAC:
  5840. /* Nothing to do. */
  5841. break;
  5842. case TLSX_SUPPORTED_GROUPS:
  5843. EC_FREE_ALL((SupportedCurve*)extension->data, heap);
  5844. break;
  5845. case TLSX_EC_POINT_FORMATS:
  5846. PF_FREE_ALL((PointFormat*)extension->data, heap);
  5847. break;
  5848. case TLSX_STATUS_REQUEST:
  5849. CSR_FREE_ALL((CertificateStatusRequest*)extension->data, heap);
  5850. break;
  5851. case TLSX_STATUS_REQUEST_V2:
  5852. CSR2_FREE_ALL((CertificateStatusRequestItemV2*)extension->data,
  5853. heap);
  5854. break;
  5855. case TLSX_RENEGOTIATION_INFO:
  5856. SCR_FREE_ALL(extension->data, heap);
  5857. break;
  5858. case TLSX_SESSION_TICKET:
  5859. WOLF_STK_FREE(extension->data, heap);
  5860. break;
  5861. case TLSX_QUANTUM_SAFE_HYBRID:
  5862. QSH_FREE_ALL((QSHScheme*)extension->data, heap);
  5863. break;
  5864. case TLSX_APPLICATION_LAYER_PROTOCOL:
  5865. ALPN_FREE_ALL((ALPN*)extension->data, heap);
  5866. break;
  5867. case TLSX_SIGNATURE_ALGORITHMS:
  5868. break;
  5869. #ifdef WOLFSSL_TLS13
  5870. case TLSX_SUPPORTED_VERSIONS:
  5871. break;
  5872. case TLSX_COOKIE:
  5873. CKE_FREE_ALL((Cookie*)extension->data, heap);
  5874. break;
  5875. case TLSX_KEY_SHARE:
  5876. KS_FREE_ALL((KeyShareEntry*)extension->data, heap);
  5877. break;
  5878. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  5879. case TLSX_PRE_SHARED_KEY:
  5880. PSK_FREE_ALL((PreSharedKey*)extension->data, heap);
  5881. break;
  5882. case TLSX_PSK_KEY_EXCHANGE_MODES:
  5883. break;
  5884. #endif
  5885. #ifdef WOLFSSL_EARLY_DATA
  5886. case TLSX_EARLY_DATA:
  5887. break;
  5888. #endif
  5889. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  5890. case TLSX_POST_HANDSHAKE_AUTH:
  5891. break;
  5892. #endif
  5893. #endif
  5894. }
  5895. XFREE(extension, heap, DYNAMIC_TYPE_TLSX);
  5896. }
  5897. (void)heap;
  5898. }
  5899. /** Checks if the tls extensions are supported based on the protocol version. */
  5900. int TLSX_SupportExtensions(WOLFSSL* ssl) {
  5901. return ssl && (IsTLS(ssl) || ssl->version.major == DTLS_MAJOR);
  5902. }
  5903. /** Tells the buffered size of the extensions in a list. */
  5904. static word16 TLSX_GetSize(TLSX* list, byte* semaphore, byte msgType)
  5905. {
  5906. TLSX* extension;
  5907. word16 length = 0;
  5908. byte isRequest = (msgType == client_hello ||
  5909. msgType == certificate_request);
  5910. while ((extension = list)) {
  5911. list = extension->next;
  5912. /* only extensions marked as response are sent back to the client. */
  5913. if (!isRequest && !extension->resp)
  5914. continue; /* skip! */
  5915. /* ssl level extensions are expected to override ctx level ones. */
  5916. if (!IS_OFF(semaphore, TLSX_ToSemaphore(extension->type)))
  5917. continue; /* skip! */
  5918. /* extension type + extension data length. */
  5919. length += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
  5920. switch (extension->type) {
  5921. case TLSX_SERVER_NAME:
  5922. /* SNI only sends the name on the request. */
  5923. if (isRequest)
  5924. length += SNI_GET_SIZE((SNI*)extension->data);
  5925. break;
  5926. case TLSX_MAX_FRAGMENT_LENGTH:
  5927. length += MFL_GET_SIZE(extension->data);
  5928. break;
  5929. case TLSX_TRUNCATED_HMAC:
  5930. /* always empty. */
  5931. break;
  5932. case TLSX_SUPPORTED_GROUPS:
  5933. length += EC_GET_SIZE((SupportedCurve*)extension->data);
  5934. break;
  5935. case TLSX_EC_POINT_FORMATS:
  5936. length += PF_GET_SIZE((PointFormat*)extension->data);
  5937. break;
  5938. case TLSX_STATUS_REQUEST:
  5939. length += CSR_GET_SIZE(
  5940. (CertificateStatusRequest*)extension->data, isRequest);
  5941. break;
  5942. case TLSX_STATUS_REQUEST_V2:
  5943. length += CSR2_GET_SIZE(
  5944. (CertificateStatusRequestItemV2*)extension->data,
  5945. isRequest);
  5946. break;
  5947. case TLSX_RENEGOTIATION_INFO:
  5948. length += SCR_GET_SIZE((SecureRenegotiation*)extension->data,
  5949. isRequest);
  5950. break;
  5951. case TLSX_SESSION_TICKET:
  5952. length += WOLF_STK_GET_SIZE((SessionTicket*)extension->data,
  5953. isRequest);
  5954. break;
  5955. case TLSX_QUANTUM_SAFE_HYBRID:
  5956. length += QSH_GET_SIZE((QSHScheme*)extension->data, isRequest);
  5957. break;
  5958. case TLSX_APPLICATION_LAYER_PROTOCOL:
  5959. length += ALPN_GET_SIZE((ALPN*)extension->data);
  5960. break;
  5961. case TLSX_SIGNATURE_ALGORITHMS:
  5962. length += SA_GET_SIZE(extension->data);
  5963. break;
  5964. #ifdef WOLFSSL_TLS13
  5965. case TLSX_SUPPORTED_VERSIONS:
  5966. length += SV_GET_SIZE(extension->data, msgType);
  5967. break;
  5968. case TLSX_COOKIE:
  5969. length += CKE_GET_SIZE((Cookie*)extension->data, msgType);
  5970. break;
  5971. case TLSX_KEY_SHARE:
  5972. length += KS_GET_SIZE((KeyShareEntry*)extension->data, msgType);
  5973. break;
  5974. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  5975. case TLSX_PRE_SHARED_KEY:
  5976. length += PSK_GET_SIZE((PreSharedKey*)extension->data, msgType);
  5977. break;
  5978. case TLSX_PSK_KEY_EXCHANGE_MODES:
  5979. length += PKM_GET_SIZE(extension->val, msgType);
  5980. break;
  5981. #endif
  5982. #ifdef WOLFSSL_EARLY_DATA
  5983. case TLSX_EARLY_DATA:
  5984. length += EDI_GET_SIZE(msgType);
  5985. break;
  5986. #endif
  5987. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  5988. case TLSX_POST_HANDSHAKE_AUTH:
  5989. length += PHA_GET_SIZE(msgType);
  5990. break;
  5991. #endif
  5992. #endif
  5993. }
  5994. /* marks the extension as processed so ctx level */
  5995. /* extensions don't overlap with ssl level ones. */
  5996. TURN_ON(semaphore, TLSX_ToSemaphore(extension->type));
  5997. }
  5998. return length;
  5999. }
  6000. /** Writes the extensions of a list in a buffer. */
  6001. static word16 TLSX_Write(TLSX* list, byte* output, byte* semaphore,
  6002. byte msgType)
  6003. {
  6004. TLSX* extension;
  6005. word16 offset = 0;
  6006. word16 length_offset = 0;
  6007. byte isRequest = (msgType == client_hello ||
  6008. msgType == certificate_request);
  6009. while ((extension = list)) {
  6010. list = extension->next;
  6011. /* only extensions marked as response are written in a response. */
  6012. if (!isRequest && !extension->resp)
  6013. continue; /* skip! */
  6014. /* ssl level extensions are expected to override ctx level ones. */
  6015. if (!IS_OFF(semaphore, TLSX_ToSemaphore(extension->type)))
  6016. continue; /* skip! */
  6017. /* writes extension type. */
  6018. c16toa(extension->type, output + offset);
  6019. offset += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
  6020. length_offset = offset;
  6021. /* extension data should be written internally. */
  6022. switch (extension->type) {
  6023. case TLSX_SERVER_NAME:
  6024. if (isRequest) {
  6025. WOLFSSL_MSG("SNI extension to write");
  6026. offset += SNI_WRITE((SNI*)extension->data, output + offset);
  6027. }
  6028. break;
  6029. case TLSX_MAX_FRAGMENT_LENGTH:
  6030. WOLFSSL_MSG("Max Fragment Length extension to write");
  6031. offset += MFL_WRITE((byte*)extension->data, output + offset);
  6032. break;
  6033. case TLSX_TRUNCATED_HMAC:
  6034. WOLFSSL_MSG("Truncated HMAC extension to write");
  6035. /* always empty. */
  6036. break;
  6037. case TLSX_SUPPORTED_GROUPS:
  6038. WOLFSSL_MSG("Elliptic Curves extension to write");
  6039. offset += EC_WRITE((SupportedCurve*)extension->data,
  6040. output + offset);
  6041. break;
  6042. case TLSX_EC_POINT_FORMATS:
  6043. WOLFSSL_MSG("Point Formats extension to write");
  6044. offset += PF_WRITE((PointFormat*)extension->data,
  6045. output + offset);
  6046. break;
  6047. case TLSX_STATUS_REQUEST:
  6048. WOLFSSL_MSG("Certificate Status Request extension to write");
  6049. offset += CSR_WRITE((CertificateStatusRequest*)extension->data,
  6050. output + offset, isRequest);
  6051. break;
  6052. case TLSX_STATUS_REQUEST_V2:
  6053. WOLFSSL_MSG("Certificate Status Request v2 extension to write");
  6054. offset += CSR2_WRITE(
  6055. (CertificateStatusRequestItemV2*)extension->data,
  6056. output + offset, isRequest);
  6057. break;
  6058. case TLSX_RENEGOTIATION_INFO:
  6059. WOLFSSL_MSG("Secure Renegotiation extension to write");
  6060. offset += SCR_WRITE((SecureRenegotiation*)extension->data,
  6061. output + offset, isRequest);
  6062. break;
  6063. case TLSX_SESSION_TICKET:
  6064. WOLFSSL_MSG("Session Ticket extension to write");
  6065. offset += WOLF_STK_WRITE((SessionTicket*)extension->data,
  6066. output + offset, isRequest);
  6067. break;
  6068. case TLSX_QUANTUM_SAFE_HYBRID:
  6069. WOLFSSL_MSG("Quantum-Safe-Hybrid extension to write");
  6070. if (isRequest) {
  6071. offset += QSH_WRITE((QSHScheme*)extension->data, output + offset);
  6072. }
  6073. offset += QSHPK_WRITE((QSHScheme*)extension->data, output + offset);
  6074. offset += QSH_SERREQ(output + offset, isRequest);
  6075. break;
  6076. case TLSX_APPLICATION_LAYER_PROTOCOL:
  6077. WOLFSSL_MSG("ALPN extension to write");
  6078. offset += ALPN_WRITE((ALPN*)extension->data, output + offset);
  6079. break;
  6080. case TLSX_SIGNATURE_ALGORITHMS:
  6081. WOLFSSL_MSG("Signature Algorithms extension to write");
  6082. offset += SA_WRITE(extension->data, output + offset);
  6083. break;
  6084. #ifdef WOLFSSL_TLS13
  6085. case TLSX_SUPPORTED_VERSIONS:
  6086. WOLFSSL_MSG("Supported Versions extension to write");
  6087. offset += SV_WRITE(extension->data, output + offset, msgType);
  6088. break;
  6089. case TLSX_COOKIE:
  6090. WOLFSSL_MSG("Cookie extension to write");
  6091. offset += CKE_WRITE((Cookie*)extension->data, output + offset,
  6092. msgType);
  6093. break;
  6094. case TLSX_KEY_SHARE:
  6095. WOLFSSL_MSG("Key Share extension to write");
  6096. offset += KS_WRITE((KeyShareEntry*)extension->data,
  6097. output + offset, msgType);
  6098. break;
  6099. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  6100. case TLSX_PRE_SHARED_KEY:
  6101. WOLFSSL_MSG("Pre-Shared Key extension to write");
  6102. offset += PSK_WRITE((PreSharedKey*)extension->data,
  6103. output + offset, msgType);
  6104. break;
  6105. case TLSX_PSK_KEY_EXCHANGE_MODES:
  6106. WOLFSSL_MSG("PSK Key Exchange Modes extension to write");
  6107. offset += PKM_WRITE(extension->val, output + offset, msgType);
  6108. break;
  6109. #endif
  6110. #ifdef WOLFSSL_EARLY_DATA
  6111. case TLSX_EARLY_DATA:
  6112. WOLFSSL_MSG("Early Data extension to write");
  6113. offset += EDI_WRITE(extension->val, output + offset, msgType);
  6114. break;
  6115. #endif
  6116. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  6117. case TLSX_POST_HANDSHAKE_AUTH:
  6118. WOLFSSL_MSG("Post-Handshake Authentication extension to write");
  6119. offset += PHA_WRITE(output + offset, msgType);
  6120. break;
  6121. #endif
  6122. #endif
  6123. }
  6124. /* writes extension data length. */
  6125. c16toa(offset - length_offset, output + length_offset - OPAQUE16_LEN);
  6126. /* marks the extension as processed so ctx level */
  6127. /* extensions don't overlap with ssl level ones. */
  6128. TURN_ON(semaphore, TLSX_ToSemaphore(extension->type));
  6129. }
  6130. return offset;
  6131. }
  6132. #if defined(HAVE_NTRU) && defined(HAVE_QSH)
  6133. static word32 GetEntropy(unsigned char* out, word32 num_bytes)
  6134. {
  6135. int ret = 0;
  6136. if (gRng == NULL) {
  6137. if ((gRng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL,
  6138. DYNAMIC_TYPE_TLSX)) == NULL)
  6139. return DRBG_OUT_OF_MEMORY;
  6140. wc_InitRng(gRng);
  6141. }
  6142. if (gRngMutex == NULL) {
  6143. if ((gRngMutex = (wolfSSL_Mutex*)XMALLOC(sizeof(wolfSSL_Mutex), NULL,
  6144. DYNAMIC_TYPE_TLSX)) == NULL)
  6145. return DRBG_OUT_OF_MEMORY;
  6146. wc_InitMutex(gRngMutex);
  6147. }
  6148. ret |= wc_LockMutex(gRngMutex);
  6149. ret |= wc_RNG_GenerateBlock(gRng, out, num_bytes);
  6150. ret |= wc_UnLockMutex(gRngMutex);
  6151. if (ret != 0)
  6152. return DRBG_ENTROPY_FAIL;
  6153. return DRBG_OK;
  6154. }
  6155. #endif
  6156. #ifdef HAVE_QSH
  6157. static int TLSX_CreateQSHKey(WOLFSSL* ssl, int type)
  6158. {
  6159. int ret;
  6160. (void)ssl;
  6161. switch (type) {
  6162. #ifdef HAVE_NTRU
  6163. case WOLFSSL_NTRU_EESS439:
  6164. case WOLFSSL_NTRU_EESS593:
  6165. case WOLFSSL_NTRU_EESS743:
  6166. ret = TLSX_CreateNtruKey(ssl, type);
  6167. break;
  6168. #endif
  6169. default:
  6170. WOLFSSL_MSG("Unknown type for creating NTRU key");
  6171. return -1;
  6172. }
  6173. return ret;
  6174. }
  6175. static int TLSX_AddQSHKey(QSHKey** list, QSHKey* key)
  6176. {
  6177. QSHKey* current;
  6178. if (key == NULL)
  6179. return BAD_FUNC_ARG;
  6180. /* if no public key stored in key then do not add */
  6181. if (key->pub.length == 0 || key->pub.buffer == NULL)
  6182. return 0;
  6183. /* first element to be added to the list */
  6184. current = *list;
  6185. if (current == NULL) {
  6186. *list = key;
  6187. return 0;
  6188. }
  6189. while (current->next) {
  6190. /* can only have one of the key in the list */
  6191. if (current->name == key->name)
  6192. return -1;
  6193. current = (QSHKey*)current->next;
  6194. }
  6195. current->next = (struct QSHKey*)key;
  6196. return 0;
  6197. }
  6198. #if defined(HAVE_NTRU)
  6199. int TLSX_CreateNtruKey(WOLFSSL* ssl, int type)
  6200. {
  6201. int ret = -1;
  6202. int ntruType;
  6203. /* variable declarations for NTRU*/
  6204. QSHKey* temp = NULL;
  6205. byte public_key[1027];
  6206. word16 public_key_len = sizeof(public_key);
  6207. byte private_key[1120];
  6208. word16 private_key_len = sizeof(private_key);
  6209. DRBG_HANDLE drbg;
  6210. if (ssl == NULL)
  6211. return BAD_FUNC_ARG;
  6212. switch (type) {
  6213. case WOLFSSL_NTRU_EESS439:
  6214. ntruType = NTRU_EES439EP1;
  6215. break;
  6216. case WOLFSSL_NTRU_EESS593:
  6217. ntruType = NTRU_EES593EP1;
  6218. break;
  6219. case WOLFSSL_NTRU_EESS743:
  6220. ntruType = NTRU_EES743EP1;
  6221. break;
  6222. default:
  6223. WOLFSSL_MSG("Unknown type for creating NTRU key");
  6224. return -1;
  6225. }
  6226. ret = ntru_crypto_drbg_external_instantiate(GetEntropy, &drbg);
  6227. if (ret != DRBG_OK) {
  6228. WOLFSSL_MSG("NTRU drbg instantiate failed\n");
  6229. return ret;
  6230. }
  6231. if ((ret = ntru_crypto_ntru_encrypt_keygen(drbg, ntruType,
  6232. &public_key_len, NULL, &private_key_len, NULL)) != NTRU_OK)
  6233. return ret;
  6234. if ((ret = ntru_crypto_ntru_encrypt_keygen(drbg, ntruType,
  6235. &public_key_len, public_key, &private_key_len, private_key)) != NTRU_OK)
  6236. return ret;
  6237. ret = ntru_crypto_drbg_uninstantiate(drbg);
  6238. if (ret != NTRU_OK) {
  6239. WOLFSSL_MSG("NTRU drbg uninstantiate failed\n");
  6240. return ret;
  6241. }
  6242. if ((temp = (QSHKey*)XMALLOC(sizeof(QSHKey), ssl->heap,
  6243. DYNAMIC_TYPE_TLSX)) == NULL)
  6244. return MEMORY_E;
  6245. temp->name = type;
  6246. temp->pub.length = public_key_len;
  6247. temp->pub.buffer = (byte*)XMALLOC(public_key_len, ssl->heap,
  6248. DYNAMIC_TYPE_PUBLIC_KEY);
  6249. XMEMCPY(temp->pub.buffer, public_key, public_key_len);
  6250. temp->pri.length = private_key_len;
  6251. temp->pri.buffer = (byte*)XMALLOC(private_key_len, ssl->heap,
  6252. DYNAMIC_TYPE_ARRAYS);
  6253. XMEMCPY(temp->pri.buffer, private_key, private_key_len);
  6254. temp->next = NULL;
  6255. TLSX_AddQSHKey(&ssl->QSH_Key, temp);
  6256. (void)ssl;
  6257. (void)type;
  6258. return ret;
  6259. }
  6260. #endif
  6261. /*
  6262. Used to find a public key from the list of keys
  6263. pubLen length of array
  6264. name input the name of the scheme looking for ie WOLFSSL_NTRU_ESSXXX
  6265. returns a pointer to public key byte* or NULL if not found
  6266. */
  6267. static byte* TLSX_QSHKeyFind_Pub(QSHKey* qsh, word16* pubLen, word16 name)
  6268. {
  6269. QSHKey* current = qsh;
  6270. if (qsh == NULL || pubLen == NULL)
  6271. return NULL;
  6272. *pubLen = 0;
  6273. while(current) {
  6274. if (current->name == name) {
  6275. *pubLen = current->pub.length;
  6276. return current->pub.buffer;
  6277. }
  6278. current = (QSHKey*)current->next;
  6279. }
  6280. return NULL;
  6281. }
  6282. #endif /* HAVE_QSH */
  6283. int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer)
  6284. {
  6285. int ret = 0;
  6286. byte* public_key = NULL;
  6287. word16 public_key_len = 0;
  6288. #if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
  6289. int usingPSK = 0;
  6290. #endif
  6291. #ifdef HAVE_QSH
  6292. TLSX* extension;
  6293. QSHScheme* qsh;
  6294. QSHScheme* next;
  6295. /* add supported QSHSchemes */
  6296. WOLFSSL_MSG("Adding supported QSH Schemes");
  6297. #endif
  6298. /* server will add extension depending on whats parsed from client */
  6299. if (!isServer) {
  6300. #ifdef HAVE_QSH
  6301. /* test if user has set a specific scheme already */
  6302. if (!ssl->user_set_QSHSchemes) {
  6303. if (ssl->sendQSHKeys && ssl->QSH_Key == NULL) {
  6304. if ((ret = TLSX_CreateQSHKey(ssl, WOLFSSL_NTRU_EESS743)) != 0) {
  6305. WOLFSSL_MSG("Error creating ntru keys");
  6306. return ret;
  6307. }
  6308. if ((ret = TLSX_CreateQSHKey(ssl, WOLFSSL_NTRU_EESS593)) != 0) {
  6309. WOLFSSL_MSG("Error creating ntru keys");
  6310. return ret;
  6311. }
  6312. if ((ret = TLSX_CreateQSHKey(ssl, WOLFSSL_NTRU_EESS439)) != 0) {
  6313. WOLFSSL_MSG("Error creating ntru keys");
  6314. return ret;
  6315. }
  6316. /* add NTRU 256 */
  6317. public_key = TLSX_QSHKeyFind_Pub(ssl->QSH_Key,
  6318. &public_key_len, WOLFSSL_NTRU_EESS743);
  6319. }
  6320. if (TLSX_UseQSHScheme(&ssl->extensions, WOLFSSL_NTRU_EESS743,
  6321. public_key, public_key_len, ssl->heap)
  6322. != WOLFSSL_SUCCESS)
  6323. ret = -1;
  6324. /* add NTRU 196 */
  6325. if (ssl->sendQSHKeys) {
  6326. public_key = TLSX_QSHKeyFind_Pub(ssl->QSH_Key,
  6327. &public_key_len, WOLFSSL_NTRU_EESS593);
  6328. }
  6329. if (TLSX_UseQSHScheme(&ssl->extensions, WOLFSSL_NTRU_EESS593,
  6330. public_key, public_key_len, ssl->heap)
  6331. != WOLFSSL_SUCCESS)
  6332. ret = -1;
  6333. /* add NTRU 128 */
  6334. if (ssl->sendQSHKeys) {
  6335. public_key = TLSX_QSHKeyFind_Pub(ssl->QSH_Key,
  6336. &public_key_len, WOLFSSL_NTRU_EESS439);
  6337. }
  6338. if (TLSX_UseQSHScheme(&ssl->extensions, WOLFSSL_NTRU_EESS439,
  6339. public_key, public_key_len, ssl->heap)
  6340. != WOLFSSL_SUCCESS)
  6341. ret = -1;
  6342. }
  6343. else if (ssl->sendQSHKeys && ssl->QSH_Key == NULL) {
  6344. /* for each scheme make a client key */
  6345. extension = TLSX_Find(ssl->extensions, TLSX_QUANTUM_SAFE_HYBRID);
  6346. if (extension) {
  6347. qsh = (QSHScheme*)extension->data;
  6348. while (qsh) {
  6349. if ((ret = TLSX_CreateQSHKey(ssl, qsh->name)) != 0)
  6350. return ret;
  6351. /* get next now because qsh could be freed */
  6352. next = qsh->next;
  6353. /* find the public key created and add to extension*/
  6354. public_key = TLSX_QSHKeyFind_Pub(ssl->QSH_Key,
  6355. &public_key_len, qsh->name);
  6356. if (TLSX_UseQSHScheme(&ssl->extensions, qsh->name,
  6357. public_key, public_key_len,
  6358. ssl->heap) != WOLFSSL_SUCCESS)
  6359. ret = -1;
  6360. qsh = next;
  6361. }
  6362. }
  6363. }
  6364. #endif
  6365. #if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
  6366. if (!ssl->options.userCurves && !ssl->ctx->userCurves &&
  6367. TLSX_Find(ssl->ctx->extensions, TLSX_SUPPORTED_GROUPS) == NULL) {
  6368. #ifndef HAVE_FIPS
  6369. #if defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)
  6370. #ifndef NO_ECC_SECP
  6371. ret = TLSX_UseSupportedCurve(&ssl->extensions,
  6372. WOLFSSL_ECC_SECP160R1, ssl->heap);
  6373. if (ret != WOLFSSL_SUCCESS) return ret;
  6374. #endif
  6375. #ifdef HAVE_ECC_SECPR2
  6376. ret = TLSX_UseSupportedCurve(&ssl->extensions,
  6377. WOLFSSL_ECC_SECP160R2, ssl->heap);
  6378. if (ret != WOLFSSL_SUCCESS) return ret;
  6379. #endif
  6380. #ifdef HAVE_ECC_KOBLITZ
  6381. ret = TLSX_UseSupportedCurve(&ssl->extensions,
  6382. WOLFSSL_ECC_SECP160K1, ssl->heap);
  6383. if (ret != WOLFSSL_SUCCESS) return ret;
  6384. #endif
  6385. #endif
  6386. #if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)
  6387. #ifndef NO_ECC_SECP
  6388. ret = TLSX_UseSupportedCurve(&ssl->extensions,
  6389. WOLFSSL_ECC_SECP192R1, ssl->heap);
  6390. if (ret != WOLFSSL_SUCCESS) return ret;
  6391. #endif
  6392. #ifdef HAVE_ECC_KOBLITZ
  6393. ret = TLSX_UseSupportedCurve(&ssl->extensions,
  6394. WOLFSSL_ECC_SECP192K1, ssl->heap);
  6395. if (ret != WOLFSSL_SUCCESS) return ret;
  6396. #endif
  6397. #endif
  6398. #endif
  6399. #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)
  6400. #ifndef NO_ECC_SECP
  6401. ret = TLSX_UseSupportedCurve(&ssl->extensions,
  6402. WOLFSSL_ECC_SECP224R1, ssl->heap);
  6403. if (ret != WOLFSSL_SUCCESS) return ret;
  6404. #endif
  6405. #ifdef HAVE_ECC_KOBLITZ
  6406. ret = TLSX_UseSupportedCurve(&ssl->extensions,
  6407. WOLFSSL_ECC_SECP224K1, ssl->heap);
  6408. if (ret != WOLFSSL_SUCCESS) return ret;
  6409. #endif
  6410. #endif
  6411. #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES)
  6412. #ifndef NO_ECC_SECP
  6413. ret = TLSX_UseSupportedCurve(&ssl->extensions,
  6414. WOLFSSL_ECC_SECP256R1, ssl->heap);
  6415. if (ret != WOLFSSL_SUCCESS) return ret;
  6416. #endif
  6417. #if defined(HAVE_CURVE25519)
  6418. ret = TLSX_UseSupportedCurve(&ssl->extensions,
  6419. WOLFSSL_ECC_X25519, ssl->heap);
  6420. if (ret != WOLFSSL_SUCCESS) return ret;
  6421. #endif
  6422. #ifdef HAVE_ECC_KOBLITZ
  6423. ret = TLSX_UseSupportedCurve(&ssl->extensions,
  6424. WOLFSSL_ECC_SECP256K1, ssl->heap);
  6425. if (ret != WOLFSSL_SUCCESS) return ret;
  6426. #endif
  6427. #ifdef HAVE_ECC_BRAINPOOL
  6428. ret = TLSX_UseSupportedCurve(&ssl->extensions,
  6429. WOLFSSL_ECC_BRAINPOOLP256R1, ssl->heap);
  6430. if (ret != WOLFSSL_SUCCESS) return ret;
  6431. #endif
  6432. #endif
  6433. #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
  6434. #ifndef NO_ECC_SECP
  6435. ret = TLSX_UseSupportedCurve(&ssl->extensions,
  6436. WOLFSSL_ECC_SECP384R1, ssl->heap);
  6437. if (ret != WOLFSSL_SUCCESS) return ret;
  6438. #endif
  6439. #ifdef HAVE_ECC_BRAINPOOL
  6440. ret = TLSX_UseSupportedCurve(&ssl->extensions,
  6441. WOLFSSL_ECC_BRAINPOOLP384R1, ssl->heap);
  6442. if (ret != WOLFSSL_SUCCESS) return ret;
  6443. #endif
  6444. #endif
  6445. #if defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)
  6446. #ifdef HAVE_ECC_BRAINPOOL
  6447. ret = TLSX_UseSupportedCurve(&ssl->extensions,
  6448. WOLFSSL_ECC_BRAINPOOLP512R1, ssl->heap);
  6449. if (ret != WOLFSSL_SUCCESS) return ret;
  6450. #endif
  6451. #endif
  6452. #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
  6453. #ifndef NO_ECC_SECP
  6454. ret = TLSX_UseSupportedCurve(&ssl->extensions,
  6455. WOLFSSL_ECC_SECP521R1, ssl->heap);
  6456. if (ret != WOLFSSL_SUCCESS) return ret;
  6457. #endif
  6458. #endif
  6459. }
  6460. #endif /* HAVE_ECC && HAVE_SUPPORTED_CURVES */
  6461. } /* is not server */
  6462. WOLFSSL_MSG("Adding signature algorithms extension");
  6463. if ((ret = TLSX_SetSignatureAlgorithms(&ssl->extensions, ssl, ssl->heap))
  6464. != 0) {
  6465. return ret;
  6466. }
  6467. #ifdef WOLFSSL_TLS13
  6468. if (!isServer && IsAtLeastTLSv1_3(ssl->version)) {
  6469. /* Add mandatory TLS v1.3 extension: supported version */
  6470. WOLFSSL_MSG("Adding supported versions extension");
  6471. if ((ret = TLSX_SetSupportedVersions(&ssl->extensions, ssl,
  6472. ssl->heap)) != 0)
  6473. return ret;
  6474. #ifdef HAVE_SUPPORTED_CURVES
  6475. if (!ssl->options.userCurves && !ssl->ctx->userCurves &&
  6476. TLSX_Find(ssl->ctx->extensions, TLSX_SUPPORTED_GROUPS)
  6477. == NULL) {
  6478. /* Add FFDHE supported groups. */
  6479. #ifdef HAVE_FFDHE_2048
  6480. ret = TLSX_UseSupportedCurve(&ssl->extensions,
  6481. WOLFSSL_FFDHE_2048, ssl->heap);
  6482. if (ret != WOLFSSL_SUCCESS)
  6483. return ret;
  6484. #endif
  6485. #ifdef HAVE_FFDHE_3072
  6486. ret = TLSX_UseSupportedCurve(&ssl->extensions,
  6487. WOLFSSL_FFDHE_3072, ssl->heap);
  6488. if (ret != WOLFSSL_SUCCESS)
  6489. return ret;
  6490. #endif
  6491. #ifdef HAVE_FFDHE_4096
  6492. ret = TLSX_UseSupportedCurve(&ssl->extensions,
  6493. WOLFSSL_FFDHE_4096, ssl->heap);
  6494. if (ret != WOLFSSL_SUCCESS)
  6495. return ret;
  6496. #endif
  6497. #ifdef HAVE_FFDHE_6144
  6498. ret = TLSX_UseSupportedCurve(&ssl->extensions,
  6499. WOLFSSL_FFDHE_6144, ssl->heap);
  6500. if (ret != WOLFSSL_SUCCESS)
  6501. return ret;
  6502. #endif
  6503. #ifdef HAVE_FFDHE_8192
  6504. ret = TLSX_UseSupportedCurve(&ssl->extensions,
  6505. WOLFSSL_FFDHE_8192, ssl->heap);
  6506. if (ret != WOLFSSL_SUCCESS)
  6507. return ret;
  6508. #endif
  6509. ret = 0;
  6510. }
  6511. #endif
  6512. if (TLSX_Find(ssl->extensions, TLSX_KEY_SHARE) == NULL) {
  6513. #if defined(HAVE_ECC) && (!defined(NO_ECC256) || \
  6514. defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP)
  6515. ret = TLSX_KeyShare_Use(ssl, WOLFSSL_ECC_SECP256R1, 0, NULL,
  6516. NULL);
  6517. #elif defined(HAVE_ECC) && defined(HAVE_CURVE25519)
  6518. ret = TLSX_KeyShare_Use(ssl, WOLFSSL_ECC_X25519, 0, NULL, NULL);
  6519. #elif defined(HAVE_ECC) && (!defined(NO_ECC384) || \
  6520. defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP)
  6521. ret = TLSX_KeyShare_Use(ssl, WOLFSSL_ECC_SECP384R1, 0, NULL,
  6522. NULL);
  6523. #elif defined(HAVE_ECC) && (!defined(NO_ECC521) || \
  6524. defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP)
  6525. ret = TLSX_KeyShare_Use(ssl, WOLFSSL_ECC_SECP521R1, 0, NULL,
  6526. NULL);
  6527. #elif defined(HAVE_FFDHE_2048)
  6528. ret = TLSX_KeyShare_Use(ssl, WOLFSSL_FFDHE_2048, 0, NULL, NULL);
  6529. #elif defined(HAVE_FFDHE_3072)
  6530. ret = TLSX_KeyShare_Use(ssl, WOLFSSL_FFDHE_3072, 0, NULL, NULL);
  6531. #elif defined(HAVE_FFDHE_4096)
  6532. ret = TLSX_KeyShare_Use(ssl, WOLFSSL_FFDHE_4096, 0, NULL, NULL);
  6533. #elif defined(HAVE_FFDHE_6144)
  6534. ret = TLSX_KeyShare_Use(ssl, WOLFSSL_FFDHE_6144, 0, NULL, NULL);
  6535. #elif defined(HAVE_FFDHE_8192)
  6536. ret = TLSX_KeyShare_Use(ssl, WOLFSSL_FFDHE_8192, 0, NULL, NULL);
  6537. #else
  6538. ret = KEY_SHARE_ERROR;
  6539. #endif
  6540. if (ret != 0)
  6541. return ret;
  6542. }
  6543. #if defined(HAVE_SESSION_TICKET)
  6544. if (ssl->options.resuming) {
  6545. WOLFSSL_SESSION* sess = &ssl->session;
  6546. word32 milli;
  6547. /* Determine the MAC algorithm for the cipher suite used. */
  6548. ssl->options.cipherSuite0 = sess->cipherSuite0;
  6549. ssl->options.cipherSuite = sess->cipherSuite;
  6550. ret = SetCipherSpecs(ssl);
  6551. if (ret != 0)
  6552. return ret;
  6553. milli = TimeNowInMilliseconds() - sess->ticketSeen +
  6554. sess->ticketAdd;
  6555. /* Pre-shared key is mandatory extension for resumption. */
  6556. ret = TLSX_PreSharedKey_Use(ssl, sess->ticket, sess->ticketLen,
  6557. milli, ssl->specs.mac_algorithm,
  6558. ssl->options.cipherSuite0,
  6559. ssl->options.cipherSuite, 1,
  6560. NULL);
  6561. if (ret != 0)
  6562. return ret;
  6563. usingPSK = 1;
  6564. }
  6565. #endif
  6566. #ifndef NO_PSK
  6567. if (ssl->options.client_psk_cb != NULL) {
  6568. /* Default ciphersuite. */
  6569. byte cipherSuite0 = TLS13_BYTE;
  6570. byte cipherSuite = WOLFSSL_DEF_PSK_CIPHER;
  6571. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  6572. ssl->arrays->server_hint, ssl->arrays->client_identity,
  6573. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  6574. if (ssl->arrays->psk_keySz == 0 ||
  6575. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  6576. return PSK_KEY_ERROR;
  6577. }
  6578. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
  6579. /* TODO: Callback should be able to change ciphersuite. */
  6580. ssl->options.cipherSuite0 = cipherSuite0;
  6581. ssl->options.cipherSuite = cipherSuite;
  6582. ret = SetCipherSpecs(ssl);
  6583. if (ret != 0)
  6584. return ret;
  6585. ret = TLSX_PreSharedKey_Use(ssl,
  6586. (byte*)ssl->arrays->client_identity,
  6587. (word16)XSTRLEN(ssl->arrays->client_identity),
  6588. 0, ssl->specs.mac_algorithm,
  6589. cipherSuite0, cipherSuite, 0,
  6590. NULL);
  6591. if (ret != 0)
  6592. return ret;
  6593. usingPSK = 1;
  6594. }
  6595. #endif
  6596. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  6597. if (usingPSK) {
  6598. byte modes;
  6599. /* Pre-shared key modes: mandatory extension for resumption. */
  6600. modes = 1 << PSK_KE;
  6601. #if !defined(NO_DH) || defined(HAVE_ECC)
  6602. if (!ssl->options.noPskDheKe)
  6603. modes |= 1 << PSK_DHE_KE;
  6604. #endif
  6605. ret = TLSX_PskKeModes_Use(ssl, modes);
  6606. if (ret != 0)
  6607. return ret;
  6608. }
  6609. #endif
  6610. #if defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6611. if (!isServer && ssl->options.postHandshakeAuth) {
  6612. ret = TLSX_PostHandAuth_Use(ssl);
  6613. if (ret != 0)
  6614. return ret;
  6615. }
  6616. #endif
  6617. }
  6618. #endif
  6619. (void)isServer;
  6620. (void)public_key;
  6621. (void)public_key_len;
  6622. (void)ssl;
  6623. if (ret == WOLFSSL_SUCCESS)
  6624. ret = 0;
  6625. return ret;
  6626. }
  6627. #ifndef NO_WOLFSSL_CLIENT
  6628. /** Tells the buffered size of extensions to be sent into the client hello. */
  6629. word16 TLSX_GetRequestSize(WOLFSSL* ssl, byte msgType)
  6630. {
  6631. word16 length = 0;
  6632. byte semaphore[SEMAPHORE_SIZE] = {0};
  6633. if (!TLSX_SupportExtensions(ssl))
  6634. return 0;
  6635. if (msgType == client_hello) {
  6636. EC_VALIDATE_REQUEST(ssl, semaphore);
  6637. PF_VALIDATE_REQUEST(ssl, semaphore);
  6638. QSH_VALIDATE_REQUEST(ssl, semaphore);
  6639. WOLF_STK_VALIDATE_REQUEST(ssl);
  6640. if (ssl->suites->hashSigAlgoSz == 0)
  6641. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
  6642. #if defined(WOLFSSL_TLS13)
  6643. if (!IsAtLeastTLSv1_2(ssl))
  6644. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
  6645. if (!IsAtLeastTLSv1_3(ssl->version)) {
  6646. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
  6647. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  6648. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
  6649. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
  6650. #endif
  6651. #ifdef WOLFSSL_EARLY_DATA
  6652. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
  6653. #endif
  6654. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
  6655. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  6656. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
  6657. #endif
  6658. }
  6659. #endif
  6660. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  6661. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  6662. if (!ssl->ctx->cm->ocspStaplingEnabled) {
  6663. /* mark already sent, so it won't send it */
  6664. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
  6665. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
  6666. }
  6667. #endif
  6668. }
  6669. #ifdef WOLFSSL_TLS13
  6670. #ifndef NO_CERTS
  6671. else if (msgType == certificate_request) {
  6672. XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
  6673. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
  6674. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
  6675. /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
  6676. * TLSX_CERTIFICATE_AUTHORITIES, OID_FILTERS
  6677. */
  6678. }
  6679. #endif
  6680. #endif
  6681. if (ssl->extensions)
  6682. length += TLSX_GetSize(ssl->extensions, semaphore, msgType);
  6683. if (ssl->ctx && ssl->ctx->extensions)
  6684. length += TLSX_GetSize(ssl->ctx->extensions, semaphore, msgType);
  6685. #ifdef HAVE_EXTENDED_MASTER
  6686. if (msgType == client_hello && ssl->options.haveEMS &&
  6687. !IsAtLeastTLSv1_3(ssl->version)) {
  6688. length += HELLO_EXT_SZ;
  6689. }
  6690. #endif
  6691. if (length)
  6692. length += OPAQUE16_LEN; /* for total length storage. */
  6693. return length;
  6694. }
  6695. /** Writes the extensions to be sent into the client hello. */
  6696. word16 TLSX_WriteRequest(WOLFSSL* ssl, byte* output, byte msgType)
  6697. {
  6698. word16 offset = 0;
  6699. byte semaphore[SEMAPHORE_SIZE] = {0};
  6700. if (!TLSX_SupportExtensions(ssl) || output == NULL)
  6701. return 0;
  6702. offset += OPAQUE16_LEN; /* extensions length */
  6703. if (msgType == client_hello) {
  6704. EC_VALIDATE_REQUEST(ssl, semaphore);
  6705. PF_VALIDATE_REQUEST(ssl, semaphore);
  6706. WOLF_STK_VALIDATE_REQUEST(ssl);
  6707. QSH_VALIDATE_REQUEST(ssl, semaphore);
  6708. if (ssl->suites->hashSigAlgoSz == 0)
  6709. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
  6710. #ifdef WOLFSSL_TLS13
  6711. if (!IsAtLeastTLSv1_2(ssl))
  6712. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
  6713. if (!IsAtLeastTLSv1_3(ssl->version)) {
  6714. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
  6715. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  6716. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
  6717. #endif
  6718. #ifdef WOLFSSL_EARLY_DATA
  6719. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
  6720. #endif
  6721. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
  6722. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  6723. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
  6724. #endif
  6725. }
  6726. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  6727. /* Must write Pre-shared Key extension at the end in TLS v1.3.
  6728. * Must not write out Pre-shared Key extension in earlier versions of
  6729. * protocol.
  6730. */
  6731. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
  6732. #endif
  6733. #endif
  6734. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  6735. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  6736. /* mark already sent, so it won't send it */
  6737. if (!ssl->ctx->cm->ocspStaplingEnabled) {
  6738. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
  6739. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
  6740. }
  6741. #endif
  6742. }
  6743. #ifdef WOLFSSL_TLS13
  6744. #ifndef NO_CERT
  6745. else if (msgType == certificate_request) {
  6746. XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
  6747. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
  6748. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
  6749. /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
  6750. * TLSX_CERTIFICATE_AUTHORITIES, TLSX_OID_FILTERS
  6751. */
  6752. }
  6753. #endif
  6754. #endif
  6755. if (ssl->extensions) {
  6756. offset += TLSX_Write(ssl->extensions, output + offset, semaphore,
  6757. msgType);
  6758. }
  6759. if (ssl->ctx && ssl->ctx->extensions) {
  6760. offset += TLSX_Write(ssl->ctx->extensions, output + offset, semaphore,
  6761. msgType);
  6762. }
  6763. #ifdef HAVE_EXTENDED_MASTER
  6764. if (msgType == client_hello && ssl->options.haveEMS &&
  6765. !IsAtLeastTLSv1_3(ssl->version)) {
  6766. c16toa(HELLO_EXT_EXTMS, output + offset);
  6767. offset += HELLO_EXT_TYPE_SZ;
  6768. c16toa(0, output + offset);
  6769. offset += HELLO_EXT_SZ_SZ;
  6770. }
  6771. #endif
  6772. #ifdef WOLFSSL_TLS13
  6773. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  6774. if (msgType == client_hello && IsAtLeastTLSv1_3(ssl->version)) {
  6775. /* Write out what we can of Pre-shared key extension. */
  6776. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
  6777. offset += TLSX_Write(ssl->extensions, output + offset, semaphore,
  6778. client_hello);
  6779. }
  6780. #endif
  6781. #endif
  6782. if (offset > OPAQUE16_LEN || msgType != client_hello)
  6783. c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
  6784. return offset;
  6785. }
  6786. #endif /* NO_WOLFSSL_CLIENT */
  6787. #ifndef NO_WOLFSSL_SERVER
  6788. /** Tells the buffered size of extensions to be sent into the server hello. */
  6789. word16 TLSX_GetResponseSize(WOLFSSL* ssl, byte msgType)
  6790. {
  6791. word16 length = 0;
  6792. byte semaphore[SEMAPHORE_SIZE] = {0};
  6793. switch (msgType) {
  6794. case server_hello:
  6795. PF_VALIDATE_RESPONSE(ssl, semaphore);
  6796. #ifdef WOLFSSL_TLS13
  6797. if (ssl->options.tls1_3) {
  6798. XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
  6799. #ifndef WOLFSSL_TLS13_DRAFT_18
  6800. TURN_OFF(semaphore,
  6801. TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
  6802. #endif
  6803. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
  6804. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  6805. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
  6806. #endif
  6807. }
  6808. else {
  6809. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
  6810. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  6811. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
  6812. #endif
  6813. }
  6814. #endif
  6815. break;
  6816. #ifdef WOLFSSL_TLS13
  6817. case hello_retry_request:
  6818. XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
  6819. #ifndef WOLFSSL_TLS13_DRAFT_18
  6820. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
  6821. #endif
  6822. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
  6823. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
  6824. break;
  6825. #endif
  6826. #ifdef WOLFSSL_TLS13
  6827. case encrypted_extensions:
  6828. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
  6829. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
  6830. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
  6831. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
  6832. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  6833. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
  6834. #endif
  6835. break;
  6836. #ifdef WOLFSSL_EARLY_DATA
  6837. case session_ticket:
  6838. if (ssl->options.tls1_3) {
  6839. XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
  6840. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
  6841. }
  6842. break;
  6843. #endif
  6844. #ifndef NO_CERT
  6845. case certificate:
  6846. XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
  6847. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
  6848. /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
  6849. * TLSX_SERVER_CERTIFICATE_TYPE
  6850. */
  6851. break;
  6852. #endif
  6853. #endif
  6854. }
  6855. #ifdef HAVE_QSH
  6856. /* change response if not using TLS_QSH */
  6857. if (!ssl->options.haveQSH) {
  6858. TLSX* ext = TLSX_Find(ssl->extensions, TLSX_QUANTUM_SAFE_HYBRID);
  6859. if (ext)
  6860. ext->resp = 0;
  6861. }
  6862. #endif
  6863. #ifdef HAVE_EXTENDED_MASTER
  6864. if (ssl->options.haveEMS && msgType == server_hello)
  6865. length += HELLO_EXT_SZ;
  6866. #endif
  6867. if (TLSX_SupportExtensions(ssl))
  6868. length += TLSX_GetSize(ssl->extensions, semaphore, msgType);
  6869. /* All the response data is set at the ssl object only, so no ctx here. */
  6870. if (length || msgType != server_hello)
  6871. length += OPAQUE16_LEN; /* for total length storage. */
  6872. return length;
  6873. }
  6874. /** Writes the server hello extensions into a buffer. */
  6875. word16 TLSX_WriteResponse(WOLFSSL *ssl, byte* output, byte msgType)
  6876. {
  6877. word16 offset = 0;
  6878. if (TLSX_SupportExtensions(ssl) && output) {
  6879. byte semaphore[SEMAPHORE_SIZE] = {0};
  6880. switch (msgType) {
  6881. case server_hello:
  6882. PF_VALIDATE_RESPONSE(ssl, semaphore);
  6883. #ifdef WOLFSSL_TLS13
  6884. if (ssl->options.tls1_3) {
  6885. XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
  6886. #ifndef WOLFSSL_TLS13_DRAFT_18
  6887. TURN_OFF(semaphore,
  6888. TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
  6889. #endif
  6890. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
  6891. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  6892. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
  6893. #endif
  6894. }
  6895. else {
  6896. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
  6897. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  6898. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
  6899. #endif
  6900. }
  6901. #endif
  6902. break;
  6903. #ifdef WOLFSSL_TLS13
  6904. case hello_retry_request:
  6905. XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
  6906. #ifndef WOLFSSL_TLS13_DRAFT_18
  6907. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
  6908. #endif
  6909. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
  6910. break;
  6911. #endif
  6912. #ifdef WOLFSSL_TLS13
  6913. case encrypted_extensions:
  6914. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
  6915. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
  6916. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
  6917. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
  6918. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  6919. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
  6920. #endif
  6921. break;
  6922. #ifndef NO_CERTS
  6923. case certificate:
  6924. XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
  6925. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
  6926. /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
  6927. * TLSX_SERVER_CERTIFICATE_TYPE
  6928. */
  6929. break;
  6930. #endif
  6931. #ifdef WOLFSSL_EARLY_DATA
  6932. case session_ticket:
  6933. if (ssl->options.tls1_3) {
  6934. XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
  6935. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
  6936. }
  6937. break;
  6938. #endif
  6939. #endif
  6940. }
  6941. offset += OPAQUE16_LEN; /* extensions length */
  6942. offset += TLSX_Write(ssl->extensions, output + offset, semaphore,
  6943. msgType);
  6944. #ifdef WOLFSSL_TLS13
  6945. if (msgType == hello_retry_request) {
  6946. XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
  6947. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
  6948. offset += TLSX_Write(ssl->extensions, output + offset, semaphore,
  6949. msgType);
  6950. }
  6951. #endif
  6952. #ifdef HAVE_EXTENDED_MASTER
  6953. if (ssl->options.haveEMS && msgType == server_hello) {
  6954. c16toa(HELLO_EXT_EXTMS, output + offset);
  6955. offset += HELLO_EXT_TYPE_SZ;
  6956. c16toa(0, output + offset);
  6957. offset += HELLO_EXT_SZ_SZ;
  6958. }
  6959. #endif
  6960. if (offset > OPAQUE16_LEN || msgType != server_hello)
  6961. c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
  6962. }
  6963. return offset;
  6964. }
  6965. #endif /* NO_WOLFSSL_SERVER */
  6966. /** Parses a buffer of TLS extensions. */
  6967. int TLSX_Parse(WOLFSSL* ssl, byte* input, word16 length, byte msgType,
  6968. Suites *suites)
  6969. {
  6970. int ret = 0;
  6971. word16 offset = 0;
  6972. byte isRequest = (msgType == client_hello ||
  6973. msgType == certificate_request);
  6974. #ifdef HAVE_EXTENDED_MASTER
  6975. byte pendingEMS = 0;
  6976. #endif
  6977. if (!ssl || !input || (isRequest && !suites))
  6978. return BAD_FUNC_ARG;
  6979. while (ret == 0 && offset < length) {
  6980. word16 type;
  6981. word16 size;
  6982. if (length - offset < HELLO_EXT_TYPE_SZ + OPAQUE16_LEN)
  6983. return BUFFER_ERROR;
  6984. ato16(input + offset, &type);
  6985. offset += HELLO_EXT_TYPE_SZ;
  6986. ato16(input + offset, &size);
  6987. offset += OPAQUE16_LEN;
  6988. if (offset + size > length)
  6989. return BUFFER_ERROR;
  6990. switch (type) {
  6991. case TLSX_SERVER_NAME:
  6992. WOLFSSL_MSG("SNI extension received");
  6993. #ifdef WOLFSSL_TLS13
  6994. if (IsAtLeastTLSv1_3(ssl->version) &&
  6995. msgType != client_hello &&
  6996. msgType != encrypted_extensions) {
  6997. return EXT_NOT_ALLOWED;
  6998. }
  6999. #endif
  7000. ret = SNI_PARSE(ssl, input + offset, size, isRequest);
  7001. break;
  7002. case TLSX_MAX_FRAGMENT_LENGTH:
  7003. WOLFSSL_MSG("Max Fragment Length extension received");
  7004. #ifdef WOLFSSL_TLS13
  7005. if (IsAtLeastTLSv1_3(ssl->version) &&
  7006. msgType != client_hello &&
  7007. msgType != encrypted_extensions) {
  7008. return EXT_NOT_ALLOWED;
  7009. }
  7010. #endif
  7011. ret = MFL_PARSE(ssl, input + offset, size, isRequest);
  7012. break;
  7013. case TLSX_TRUNCATED_HMAC:
  7014. WOLFSSL_MSG("Truncated HMAC extension received");
  7015. #ifdef WOLFSSL_TLS13
  7016. if (IsAtLeastTLSv1_3(ssl->version))
  7017. return EXT_NOT_ALLOWED;
  7018. #endif
  7019. ret = THM_PARSE(ssl, input + offset, size, isRequest);
  7020. break;
  7021. case TLSX_SUPPORTED_GROUPS:
  7022. WOLFSSL_MSG("Elliptic Curves extension received");
  7023. #ifdef WOLFSSL_TLS13
  7024. if (IsAtLeastTLSv1_3(ssl->version) &&
  7025. msgType != client_hello &&
  7026. msgType != encrypted_extensions) {
  7027. return EXT_NOT_ALLOWED;
  7028. }
  7029. #endif
  7030. ret = EC_PARSE(ssl, input + offset, size, isRequest);
  7031. break;
  7032. case TLSX_EC_POINT_FORMATS:
  7033. WOLFSSL_MSG("Point Formats extension received");
  7034. #ifdef WOLFSSL_TLS13
  7035. if (IsAtLeastTLSv1_3(ssl->version) &&
  7036. msgType != client_hello &&
  7037. msgType != encrypted_extensions) {
  7038. return EXT_NOT_ALLOWED;
  7039. }
  7040. #endif
  7041. ret = PF_PARSE(ssl, input + offset, size, isRequest);
  7042. break;
  7043. case TLSX_STATUS_REQUEST:
  7044. WOLFSSL_MSG("Certificate Status Request extension received");
  7045. #ifdef WOLFSSL_TLS13
  7046. if (IsAtLeastTLSv1_3(ssl->version) &&
  7047. msgType != client_hello &&
  7048. msgType != encrypted_extensions) {
  7049. return EXT_NOT_ALLOWED;
  7050. }
  7051. #endif
  7052. ret = CSR_PARSE(ssl, input + offset, size, isRequest);
  7053. break;
  7054. case TLSX_STATUS_REQUEST_V2:
  7055. WOLFSSL_MSG("Certificate Status Request v2 extension received");
  7056. #ifdef WOLFSSL_TLS13
  7057. if (IsAtLeastTLSv1_3(ssl->version) &&
  7058. msgType != client_hello &&
  7059. msgType != encrypted_extensions) {
  7060. return EXT_NOT_ALLOWED;
  7061. }
  7062. #endif
  7063. ret = CSR2_PARSE(ssl, input + offset, size, isRequest);
  7064. break;
  7065. #ifdef HAVE_EXTENDED_MASTER
  7066. case HELLO_EXT_EXTMS:
  7067. WOLFSSL_MSG("Extended Master Secret extension received");
  7068. #ifdef WOLFSSL_TLS13
  7069. if (IsAtLeastTLSv1_3(ssl->version) &&
  7070. msgType != client_hello) {
  7071. return EXT_NOT_ALLOWED;
  7072. }
  7073. #endif
  7074. #ifndef NO_WOLFSSL_SERVER
  7075. if (isRequest && !IsAtLeastTLSv1_3(ssl->version))
  7076. ssl->options.haveEMS = 1;
  7077. #endif
  7078. pendingEMS = 1;
  7079. break;
  7080. #endif
  7081. case TLSX_RENEGOTIATION_INFO:
  7082. WOLFSSL_MSG("Secure Renegotiation extension received");
  7083. ret = SCR_PARSE(ssl, input + offset, size, isRequest);
  7084. break;
  7085. case TLSX_SESSION_TICKET:
  7086. WOLFSSL_MSG("Session Ticket extension received");
  7087. #ifdef WOLFSSL_TLS13
  7088. if (IsAtLeastTLSv1_3(ssl->version) &&
  7089. msgType != client_hello) {
  7090. return EXT_NOT_ALLOWED;
  7091. }
  7092. #endif
  7093. ret = WOLF_STK_PARSE(ssl, input + offset, size, isRequest);
  7094. break;
  7095. case TLSX_QUANTUM_SAFE_HYBRID:
  7096. WOLFSSL_MSG("Quantum-Safe-Hybrid extension received");
  7097. #ifdef WOLFSSL_TLS13
  7098. if (IsAtLeastTLSv1_3(ssl->version))
  7099. return EXT_NOT_ALLOWED;
  7100. #endif
  7101. ret = QSH_PARSE(ssl, input + offset, size, isRequest);
  7102. break;
  7103. case TLSX_APPLICATION_LAYER_PROTOCOL:
  7104. WOLFSSL_MSG("ALPN extension received");
  7105. #ifdef WOLFSSL_TLS13
  7106. if (IsAtLeastTLSv1_3(ssl->version) &&
  7107. msgType != client_hello &&
  7108. msgType != encrypted_extensions) {
  7109. return EXT_NOT_ALLOWED;
  7110. }
  7111. #endif
  7112. ret = ALPN_PARSE(ssl, input + offset, size, isRequest);
  7113. break;
  7114. case TLSX_SIGNATURE_ALGORITHMS:
  7115. WOLFSSL_MSG("Signature Algorithms extension received");
  7116. if (!IsAtLeastTLSv1_2(ssl))
  7117. break;
  7118. #ifdef WOLFSSL_TLS13
  7119. if (IsAtLeastTLSv1_3(ssl->version) &&
  7120. msgType != client_hello &&
  7121. msgType != certificate_request) {
  7122. return EXT_NOT_ALLOWED;
  7123. }
  7124. #endif
  7125. ret = SA_PARSE(ssl, input + offset, size, isRequest, suites);
  7126. break;
  7127. #ifdef WOLFSSL_TLS13
  7128. case TLSX_SUPPORTED_VERSIONS:
  7129. WOLFSSL_MSG("Supported Versions extension received");
  7130. if (IsAtLeastTLSv1_3(ssl->version) &&
  7131. #ifdef WOLFSSL_TLS13_DRAFT_18
  7132. msgType != client_hello
  7133. #else
  7134. msgType != client_hello && msgType != server_hello &&
  7135. msgType != hello_retry_request
  7136. #endif
  7137. ) {
  7138. return EXT_NOT_ALLOWED;
  7139. }
  7140. ret = SV_PARSE(ssl, input + offset, size, msgType);
  7141. break;
  7142. case TLSX_COOKIE:
  7143. WOLFSSL_MSG("Cookie extension received");
  7144. if (!IsAtLeastTLSv1_3(ssl->version))
  7145. break;
  7146. if (IsAtLeastTLSv1_3(ssl->version) &&
  7147. msgType != client_hello &&
  7148. msgType != hello_retry_request) {
  7149. return EXT_NOT_ALLOWED;
  7150. }
  7151. ret = CKE_PARSE(ssl, input + offset, size, msgType);
  7152. break;
  7153. case TLSX_KEY_SHARE:
  7154. WOLFSSL_MSG("Key Share extension received");
  7155. if (!IsAtLeastTLSv1_3(ssl->version))
  7156. break;
  7157. if (IsAtLeastTLSv1_3(ssl->version) &&
  7158. msgType != client_hello && msgType != server_hello &&
  7159. msgType != hello_retry_request) {
  7160. return EXT_NOT_ALLOWED;
  7161. }
  7162. ret = KS_PARSE(ssl, input + offset, size, msgType);
  7163. break;
  7164. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  7165. case TLSX_PRE_SHARED_KEY:
  7166. WOLFSSL_MSG("Pre-Shared Key extension received");
  7167. if (!IsAtLeastTLSv1_3(ssl->version))
  7168. break;
  7169. if (IsAtLeastTLSv1_3(ssl->version) &&
  7170. msgType != client_hello && msgType != server_hello) {
  7171. return EXT_NOT_ALLOWED;
  7172. }
  7173. ret = PSK_PARSE(ssl, input + offset, size, msgType);
  7174. break;
  7175. case TLSX_PSK_KEY_EXCHANGE_MODES:
  7176. WOLFSSL_MSG("PSK Key Exchange Modes extension received");
  7177. if (!IsAtLeastTLSv1_3(ssl->version))
  7178. break;
  7179. if (IsAtLeastTLSv1_3(ssl->version) &&
  7180. msgType != client_hello) {
  7181. return EXT_NOT_ALLOWED;
  7182. }
  7183. ret = PKM_PARSE(ssl, input + offset, size, msgType);
  7184. break;
  7185. #endif
  7186. #ifdef WOLFSSL_EARLY_DATA
  7187. case TLSX_EARLY_DATA:
  7188. WOLFSSL_MSG("Early Data extension received");
  7189. if (!IsAtLeastTLSv1_3(ssl->version))
  7190. break;
  7191. if (IsAtLeastTLSv1_3(ssl->version) &&
  7192. msgType != client_hello && msgType != session_ticket &&
  7193. msgType != encrypted_extensions) {
  7194. return EXT_NOT_ALLOWED;
  7195. }
  7196. ret = EDI_PARSE(ssl, input + offset, size, msgType);
  7197. break;
  7198. #endif
  7199. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  7200. case TLSX_POST_HANDSHAKE_AUTH:
  7201. WOLFSSL_MSG("PSK Key Exchange Modes extension received");
  7202. if (!IsAtLeastTLSv1_3(ssl->version))
  7203. break;
  7204. if (IsAtLeastTLSv1_3(ssl->version) &&
  7205. msgType != client_hello) {
  7206. return EXT_NOT_ALLOWED;
  7207. }
  7208. ret = PHA_PARSE(ssl, input + offset, size, msgType);
  7209. break;
  7210. #endif
  7211. #endif
  7212. }
  7213. /* offset should be updated here! */
  7214. offset += size;
  7215. }
  7216. #ifdef HAVE_EXTENDED_MASTER
  7217. if (!isRequest && ssl->options.haveEMS && !pendingEMS)
  7218. ssl->options.haveEMS = 0;
  7219. #endif
  7220. if (ret == 0)
  7221. ret = SNI_VERIFY_PARSE(ssl, isRequest);
  7222. return ret;
  7223. }
  7224. /* undefining semaphore macros */
  7225. #undef IS_OFF
  7226. #undef TURN_ON
  7227. #undef SEMAPHORE_SIZE
  7228. #endif /* HAVE_TLS_EXTENSIONS */
  7229. #ifndef NO_WOLFSSL_CLIENT
  7230. #ifndef NO_OLD_TLS
  7231. #ifdef WOLFSSL_ALLOW_TLSV10
  7232. #ifdef OPENSSL_EXTRA
  7233. /* Gets a WOLFSL_METHOD type that is not set as client or server
  7234. *
  7235. * Returns a pointer to a WOLFSSL_METHOD struct
  7236. */
  7237. WOLFSSL_METHOD* wolfTLSv1_method(void) {
  7238. WOLFSSL_METHOD* m;
  7239. WOLFSSL_ENTER("wolfTLSv1_method");
  7240. #ifndef NO_WOLFSSL_CLIENT
  7241. m = wolfTLSv1_client_method();
  7242. #else
  7243. m = wolfTLSv1_server_method();
  7244. #endif
  7245. if (m != NULL) {
  7246. m->side = WOLFSSL_NEITHER_END;
  7247. }
  7248. return m;
  7249. }
  7250. #endif /* OPENSSL_EXTRA */
  7251. WOLFSSL_METHOD* wolfTLSv1_client_method(void)
  7252. {
  7253. return wolfTLSv1_client_method_ex(NULL);
  7254. }
  7255. WOLFSSL_METHOD* wolfTLSv1_client_method_ex(void* heap)
  7256. {
  7257. WOLFSSL_METHOD* method =
  7258. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  7259. heap, DYNAMIC_TYPE_METHOD);
  7260. if (method)
  7261. InitSSL_Method(method, MakeTLSv1());
  7262. return method;
  7263. }
  7264. #endif /* WOLFSSL_ALLOW_TLSV10 */
  7265. WOLFSSL_METHOD* wolfTLSv1_1_client_method(void)
  7266. {
  7267. return wolfTLSv1_1_client_method_ex(NULL);
  7268. }
  7269. WOLFSSL_METHOD* wolfTLSv1_1_client_method_ex(void* heap)
  7270. {
  7271. WOLFSSL_METHOD* method =
  7272. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  7273. heap, DYNAMIC_TYPE_METHOD);
  7274. if (method)
  7275. InitSSL_Method(method, MakeTLSv1_1());
  7276. return method;
  7277. }
  7278. #endif /* !NO_OLD_TLS */
  7279. WOLFSSL_METHOD* wolfTLSv1_2_client_method(void)
  7280. {
  7281. return wolfTLSv1_2_client_method_ex(NULL);
  7282. }
  7283. WOLFSSL_METHOD* wolfTLSv1_2_client_method_ex(void* heap)
  7284. {
  7285. WOLFSSL_METHOD* method =
  7286. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  7287. heap, DYNAMIC_TYPE_METHOD);
  7288. (void)heap;
  7289. if (method)
  7290. InitSSL_Method(method, MakeTLSv1_2());
  7291. return method;
  7292. }
  7293. #ifdef WOLFSSL_TLS13
  7294. /* The TLS v1.3 client method data.
  7295. *
  7296. * returns the method data for a TLS v1.3 client.
  7297. */
  7298. WOLFSSL_METHOD* wolfTLSv1_3_client_method(void)
  7299. {
  7300. return wolfTLSv1_3_client_method_ex(NULL);
  7301. }
  7302. /* The TLS v1.3 client method data.
  7303. *
  7304. * heap The heap used for allocation.
  7305. * returns the method data for a TLS v1.3 client.
  7306. */
  7307. WOLFSSL_METHOD* wolfTLSv1_3_client_method_ex(void* heap)
  7308. {
  7309. WOLFSSL_METHOD* method = (WOLFSSL_METHOD*)
  7310. XMALLOC(sizeof(WOLFSSL_METHOD), heap,
  7311. DYNAMIC_TYPE_METHOD);
  7312. (void)heap;
  7313. if (method)
  7314. InitSSL_Method(method, MakeTLSv1_3());
  7315. return method;
  7316. }
  7317. #endif /* WOLFSSL_TLS13 */
  7318. WOLFSSL_METHOD* wolfSSLv23_client_method(void)
  7319. {
  7320. return wolfSSLv23_client_method_ex(NULL);
  7321. }
  7322. WOLFSSL_METHOD* wolfSSLv23_client_method_ex(void* heap)
  7323. {
  7324. WOLFSSL_METHOD* method =
  7325. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  7326. heap, DYNAMIC_TYPE_METHOD);
  7327. (void)heap;
  7328. if (method) {
  7329. #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)
  7330. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NGINX)
  7331. InitSSL_Method(method, MakeTLSv1_3());
  7332. #else
  7333. InitSSL_Method(method, MakeTLSv1_2());
  7334. #endif
  7335. #else
  7336. #ifndef NO_OLD_TLS
  7337. InitSSL_Method(method, MakeTLSv1_1());
  7338. #endif
  7339. #endif
  7340. #ifndef NO_OLD_TLS
  7341. method->downgrade = 1;
  7342. #endif
  7343. }
  7344. return method;
  7345. }
  7346. #endif /* NO_WOLFSSL_CLIENT */
  7347. #ifndef NO_WOLFSSL_SERVER
  7348. #ifndef NO_OLD_TLS
  7349. #ifdef WOLFSSL_ALLOW_TLSV10
  7350. WOLFSSL_METHOD* wolfTLSv1_server_method(void)
  7351. {
  7352. return wolfTLSv1_server_method_ex(NULL);
  7353. }
  7354. WOLFSSL_METHOD* wolfTLSv1_server_method_ex(void* heap)
  7355. {
  7356. WOLFSSL_METHOD* method =
  7357. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  7358. heap, DYNAMIC_TYPE_METHOD);
  7359. if (method) {
  7360. InitSSL_Method(method, MakeTLSv1());
  7361. method->side = WOLFSSL_SERVER_END;
  7362. }
  7363. return method;
  7364. }
  7365. #endif /* WOLFSSL_ALLOW_TLSV10 */
  7366. WOLFSSL_METHOD* wolfTLSv1_1_server_method(void)
  7367. {
  7368. return wolfTLSv1_1_server_method_ex(NULL);
  7369. }
  7370. WOLFSSL_METHOD* wolfTLSv1_1_server_method_ex(void* heap)
  7371. {
  7372. WOLFSSL_METHOD* method =
  7373. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  7374. heap, DYNAMIC_TYPE_METHOD);
  7375. if (method) {
  7376. InitSSL_Method(method, MakeTLSv1_1());
  7377. method->side = WOLFSSL_SERVER_END;
  7378. }
  7379. return method;
  7380. }
  7381. #endif /* !NO_OLD_TLS */
  7382. WOLFSSL_METHOD* wolfTLSv1_2_server_method(void)
  7383. {
  7384. return wolfTLSv1_2_server_method_ex(NULL);
  7385. }
  7386. WOLFSSL_METHOD* wolfTLSv1_2_server_method_ex(void* heap)
  7387. {
  7388. WOLFSSL_METHOD* method =
  7389. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  7390. heap, DYNAMIC_TYPE_METHOD);
  7391. (void)heap;
  7392. if (method) {
  7393. InitSSL_Method(method, MakeTLSv1_2());
  7394. method->side = WOLFSSL_SERVER_END;
  7395. }
  7396. return method;
  7397. }
  7398. #ifdef WOLFSSL_TLS13
  7399. /* The TLS v1.3 server method data.
  7400. *
  7401. * returns the method data for a TLS v1.3 server.
  7402. */
  7403. WOLFSSL_METHOD* wolfTLSv1_3_server_method(void)
  7404. {
  7405. return wolfTLSv1_3_server_method_ex(NULL);
  7406. }
  7407. /* The TLS v1.3 server method data.
  7408. *
  7409. * heap The heap used for allocation.
  7410. * returns the method data for a TLS v1.3 server.
  7411. */
  7412. WOLFSSL_METHOD* wolfTLSv1_3_server_method_ex(void* heap)
  7413. {
  7414. WOLFSSL_METHOD* method =
  7415. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  7416. heap, DYNAMIC_TYPE_METHOD);
  7417. (void)heap;
  7418. if (method) {
  7419. InitSSL_Method(method, MakeTLSv1_3());
  7420. method->side = WOLFSSL_SERVER_END;
  7421. }
  7422. return method;
  7423. }
  7424. #endif /* WOLFSSL_TLS13 */
  7425. WOLFSSL_METHOD* wolfSSLv23_server_method(void)
  7426. {
  7427. return wolfSSLv23_server_method_ex(NULL);
  7428. }
  7429. WOLFSSL_METHOD* wolfSSLv23_server_method_ex(void* heap)
  7430. {
  7431. WOLFSSL_METHOD* method =
  7432. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  7433. heap, DYNAMIC_TYPE_METHOD);
  7434. (void)heap;
  7435. if (method) {
  7436. #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)
  7437. #ifdef WOLFSSL_TLS13
  7438. InitSSL_Method(method, MakeTLSv1_3());
  7439. #else
  7440. InitSSL_Method(method, MakeTLSv1_2());
  7441. #endif
  7442. #else
  7443. #ifndef NO_OLD_TLS
  7444. InitSSL_Method(method, MakeTLSv1_1());
  7445. #else
  7446. #error Must have SHA256, SHA384 or SHA512 enabled for TLS 1.2
  7447. #endif
  7448. #endif
  7449. #ifndef NO_OLD_TLS
  7450. method->downgrade = 1;
  7451. #endif
  7452. method->side = WOLFSSL_SERVER_END;
  7453. }
  7454. return method;
  7455. }
  7456. #endif /* NO_WOLFSSL_SERVER */
  7457. #endif /* NO_TLS */
  7458. #endif /* WOLFCRYPT_ONLY */