internal.c 1.3 MB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987179881798917990179911799217993179941799517996179971799817999180001800118002180031800418005180061800718008180091801018011180121801318014180151801618017180181801918020180211802218023180241802518026180271802818029180301803118032180331803418035180361803718038180391804018041180421804318044180451804618047180481804918050180511805218053180541805518056180571805818059180601806118062180631806418065180661806718068180691807018071180721807318074180751807618077180781807918080180811808218083180841808518086180871808818089180901809118092180931809418095180961809718098180991810018101181021810318104181051810618107181081810918110181111811218113181141811518116181171811818119181201812118122181231812418125181261812718128181291813018131181321813318134181351813618137181381813918140181411814218143181441814518146181471814818149181501815118152181531815418155181561815718158181591816018161181621816318164181651816618167181681816918170181711817218173181741817518176181771817818179181801818118182181831818418185181861818718188181891819018191181921819318194181951819618197181981819918200182011820218203182041820518206182071820818209182101821118212182131821418215182161821718218182191822018221182221822318224182251822618227182281822918230182311823218233182341823518236182371823818239182401824118242182431824418245182461824718248182491825018251182521825318254182551825618257182581825918260182611826218263182641826518266182671826818269182701827118272182731827418275182761827718278182791828018281182821828318284182851828618287182881828918290182911829218293182941829518296182971829818299183001830118302183031830418305183061830718308183091831018311183121831318314183151831618317183181831918320183211832218323183241832518326183271832818329183301833118332183331833418335183361833718338183391834018341183421834318344183451834618347183481834918350183511835218353183541835518356183571835818359183601836118362183631836418365183661836718368183691837018371183721837318374183751837618377183781837918380183811838218383183841838518386183871838818389183901839118392183931839418395183961839718398183991840018401184021840318404184051840618407184081840918410184111841218413184141841518416184171841818419184201842118422184231842418425184261842718428184291843018431184321843318434184351843618437184381843918440184411844218443184441844518446184471844818449184501845118452184531845418455184561845718458184591846018461184621846318464184651846618467184681846918470184711847218473184741847518476184771847818479184801848118482184831848418485184861848718488184891849018491184921849318494184951849618497184981849918500185011850218503185041850518506185071850818509185101851118512185131851418515185161851718518185191852018521185221852318524185251852618527185281852918530185311853218533185341853518536185371853818539185401854118542185431854418545185461854718548185491855018551185521855318554185551855618557185581855918560185611856218563185641856518566185671856818569185701857118572185731857418575185761857718578185791858018581185821858318584185851858618587185881858918590185911859218593185941859518596185971859818599186001860118602186031860418605186061860718608186091861018611186121861318614186151861618617186181861918620186211862218623186241862518626186271862818629186301863118632186331863418635186361863718638186391864018641186421864318644186451864618647186481864918650186511865218653186541865518656186571865818659186601866118662186631866418665186661866718668186691867018671186721867318674186751867618677186781867918680186811868218683186841868518686186871868818689186901869118692186931869418695186961869718698186991870018701187021870318704187051870618707187081870918710187111871218713187141871518716187171871818719187201872118722187231872418725187261872718728187291873018731187321873318734187351873618737187381873918740187411874218743187441874518746187471874818749187501875118752187531875418755187561875718758187591876018761187621876318764187651876618767187681876918770187711877218773187741877518776187771877818779187801878118782187831878418785187861878718788187891879018791187921879318794187951879618797187981879918800188011880218803188041880518806188071880818809188101881118812188131881418815188161881718818188191882018821188221882318824188251882618827188281882918830188311883218833188341883518836188371883818839188401884118842188431884418845188461884718848188491885018851188521885318854188551885618857188581885918860188611886218863188641886518866188671886818869188701887118872188731887418875188761887718878188791888018881188821888318884188851888618887188881888918890188911889218893188941889518896188971889818899189001890118902189031890418905189061890718908189091891018911189121891318914189151891618917189181891918920189211892218923189241892518926189271892818929189301893118932189331893418935189361893718938189391894018941189421894318944189451894618947189481894918950189511895218953189541895518956189571895818959189601896118962189631896418965189661896718968189691897018971189721897318974189751897618977189781897918980189811898218983189841898518986189871898818989189901899118992189931899418995189961899718998189991900019001190021900319004190051900619007190081900919010190111901219013190141901519016190171901819019190201902119022190231902419025190261902719028190291903019031190321903319034190351903619037190381903919040190411904219043190441904519046190471904819049190501905119052190531905419055190561905719058190591906019061190621906319064190651906619067190681906919070190711907219073190741907519076190771907819079190801908119082190831908419085190861908719088190891909019091190921909319094190951909619097190981909919100191011910219103191041910519106191071910819109191101911119112191131911419115191161911719118191191912019121191221912319124191251912619127191281912919130191311913219133191341913519136191371913819139191401914119142191431914419145191461914719148191491915019151191521915319154191551915619157191581915919160191611916219163191641916519166191671916819169191701917119172191731917419175191761917719178191791918019181191821918319184191851918619187191881918919190191911919219193191941919519196191971919819199192001920119202192031920419205192061920719208192091921019211192121921319214192151921619217192181921919220192211922219223192241922519226192271922819229192301923119232192331923419235192361923719238192391924019241192421924319244192451924619247192481924919250192511925219253192541925519256192571925819259192601926119262192631926419265192661926719268192691927019271192721927319274192751927619277192781927919280192811928219283192841928519286192871928819289192901929119292192931929419295192961929719298192991930019301193021930319304193051930619307193081930919310193111931219313193141931519316193171931819319193201932119322193231932419325193261932719328193291933019331193321933319334193351933619337193381933919340193411934219343193441934519346193471934819349193501935119352193531935419355193561935719358193591936019361193621936319364193651936619367193681936919370193711937219373193741937519376193771937819379193801938119382193831938419385193861938719388193891939019391193921939319394193951939619397193981939919400194011940219403194041940519406194071940819409194101941119412194131941419415194161941719418194191942019421194221942319424194251942619427194281942919430194311943219433194341943519436194371943819439194401944119442194431944419445194461944719448194491945019451194521945319454194551945619457194581945919460194611946219463194641946519466194671946819469194701947119472194731947419475194761947719478194791948019481194821948319484194851948619487194881948919490194911949219493194941949519496194971949819499195001950119502195031950419505195061950719508195091951019511195121951319514195151951619517195181951919520195211952219523195241952519526195271952819529195301953119532195331953419535195361953719538195391954019541195421954319544195451954619547195481954919550195511955219553195541955519556195571955819559195601956119562195631956419565195661956719568195691957019571195721957319574195751957619577195781957919580195811958219583195841958519586195871958819589195901959119592195931959419595195961959719598195991960019601196021960319604196051960619607196081960919610196111961219613196141961519616196171961819619196201962119622196231962419625196261962719628196291963019631196321963319634196351963619637196381963919640196411964219643196441964519646196471964819649196501965119652196531965419655196561965719658196591966019661196621966319664196651966619667196681966919670196711967219673196741967519676196771967819679196801968119682196831968419685196861968719688196891969019691196921969319694196951969619697196981969919700197011970219703197041970519706197071970819709197101971119712197131971419715197161971719718197191972019721197221972319724197251972619727197281972919730197311973219733197341973519736197371973819739197401974119742197431974419745197461974719748197491975019751197521975319754197551975619757197581975919760197611976219763197641976519766197671976819769197701977119772197731977419775197761977719778197791978019781197821978319784197851978619787197881978919790197911979219793197941979519796197971979819799198001980119802198031980419805198061980719808198091981019811198121981319814198151981619817198181981919820198211982219823198241982519826198271982819829198301983119832198331983419835198361983719838198391984019841198421984319844198451984619847198481984919850198511985219853198541985519856198571985819859198601986119862198631986419865198661986719868198691987019871198721987319874198751987619877198781987919880198811988219883198841988519886198871988819889198901989119892198931989419895198961989719898198991990019901199021990319904199051990619907199081990919910199111991219913199141991519916199171991819919199201992119922199231992419925199261992719928199291993019931199321993319934199351993619937199381993919940199411994219943199441994519946199471994819949199501995119952199531995419955199561995719958199591996019961199621996319964199651996619967199681996919970199711997219973199741997519976199771997819979199801998119982199831998419985199861998719988199891999019991199921999319994199951999619997199981999920000200012000220003200042000520006200072000820009200102001120012200132001420015200162001720018200192002020021200222002320024200252002620027200282002920030200312003220033200342003520036200372003820039200402004120042200432004420045200462004720048200492005020051200522005320054200552005620057200582005920060200612006220063200642006520066200672006820069200702007120072200732007420075200762007720078200792008020081200822008320084200852008620087200882008920090200912009220093200942009520096200972009820099201002010120102201032010420105201062010720108201092011020111201122011320114201152011620117201182011920120201212012220123201242012520126201272012820129201302013120132201332013420135201362013720138201392014020141201422014320144201452014620147201482014920150201512015220153201542015520156201572015820159201602016120162201632016420165201662016720168201692017020171201722017320174201752017620177201782017920180201812018220183201842018520186201872018820189201902019120192201932019420195201962019720198201992020020201202022020320204202052020620207202082020920210202112021220213202142021520216202172021820219202202022120222202232022420225202262022720228202292023020231202322023320234202352023620237202382023920240202412024220243202442024520246202472024820249202502025120252202532025420255202562025720258202592026020261202622026320264202652026620267202682026920270202712027220273202742027520276202772027820279202802028120282202832028420285202862028720288202892029020291202922029320294202952029620297202982029920300203012030220303203042030520306203072030820309203102031120312203132031420315203162031720318203192032020321203222032320324203252032620327203282032920330203312033220333203342033520336203372033820339203402034120342203432034420345203462034720348203492035020351203522035320354203552035620357203582035920360203612036220363203642036520366203672036820369203702037120372203732037420375203762037720378203792038020381203822038320384203852038620387203882038920390203912039220393203942039520396203972039820399204002040120402204032040420405204062040720408204092041020411204122041320414204152041620417204182041920420204212042220423204242042520426204272042820429204302043120432204332043420435204362043720438204392044020441204422044320444204452044620447204482044920450204512045220453204542045520456204572045820459204602046120462204632046420465204662046720468204692047020471204722047320474204752047620477204782047920480204812048220483204842048520486204872048820489204902049120492204932049420495204962049720498204992050020501205022050320504205052050620507205082050920510205112051220513205142051520516205172051820519205202052120522205232052420525205262052720528205292053020531205322053320534205352053620537205382053920540205412054220543205442054520546205472054820549205502055120552205532055420555205562055720558205592056020561205622056320564205652056620567205682056920570205712057220573205742057520576205772057820579205802058120582205832058420585205862058720588205892059020591205922059320594205952059620597205982059920600206012060220603206042060520606206072060820609206102061120612206132061420615206162061720618206192062020621206222062320624206252062620627206282062920630206312063220633206342063520636206372063820639206402064120642206432064420645206462064720648206492065020651206522065320654206552065620657206582065920660206612066220663206642066520666206672066820669206702067120672206732067420675206762067720678206792068020681206822068320684206852068620687206882068920690206912069220693206942069520696206972069820699207002070120702207032070420705207062070720708207092071020711207122071320714207152071620717207182071920720207212072220723207242072520726207272072820729207302073120732207332073420735207362073720738207392074020741207422074320744207452074620747207482074920750207512075220753207542075520756207572075820759207602076120762207632076420765207662076720768207692077020771207722077320774207752077620777207782077920780207812078220783207842078520786207872078820789207902079120792207932079420795207962079720798207992080020801208022080320804208052080620807208082080920810208112081220813208142081520816208172081820819208202082120822208232082420825208262082720828208292083020831208322083320834208352083620837208382083920840208412084220843208442084520846208472084820849208502085120852208532085420855208562085720858208592086020861208622086320864208652086620867208682086920870208712087220873208742087520876208772087820879208802088120882208832088420885208862088720888208892089020891208922089320894208952089620897208982089920900209012090220903209042090520906209072090820909209102091120912209132091420915209162091720918209192092020921209222092320924209252092620927209282092920930209312093220933209342093520936209372093820939209402094120942209432094420945209462094720948209492095020951209522095320954209552095620957209582095920960209612096220963209642096520966209672096820969209702097120972209732097420975209762097720978209792098020981209822098320984209852098620987209882098920990209912099220993209942099520996209972099820999210002100121002210032100421005210062100721008210092101021011210122101321014210152101621017210182101921020210212102221023210242102521026210272102821029210302103121032210332103421035210362103721038210392104021041210422104321044210452104621047210482104921050210512105221053210542105521056210572105821059210602106121062210632106421065210662106721068210692107021071210722107321074210752107621077210782107921080210812108221083210842108521086210872108821089210902109121092210932109421095210962109721098210992110021101211022110321104211052110621107211082110921110211112111221113211142111521116211172111821119211202112121122211232112421125211262112721128211292113021131211322113321134211352113621137211382113921140211412114221143211442114521146211472114821149211502115121152211532115421155211562115721158211592116021161211622116321164211652116621167211682116921170211712117221173211742117521176211772117821179211802118121182211832118421185211862118721188211892119021191211922119321194211952119621197211982119921200212012120221203212042120521206212072120821209212102121121212212132121421215212162121721218212192122021221212222122321224212252122621227212282122921230212312123221233212342123521236212372123821239212402124121242212432124421245212462124721248212492125021251212522125321254212552125621257212582125921260212612126221263212642126521266212672126821269212702127121272212732127421275212762127721278212792128021281212822128321284212852128621287212882128921290212912129221293212942129521296212972129821299213002130121302213032130421305213062130721308213092131021311213122131321314213152131621317213182131921320213212132221323213242132521326213272132821329213302133121332213332133421335213362133721338213392134021341213422134321344213452134621347213482134921350213512135221353213542135521356213572135821359213602136121362213632136421365213662136721368213692137021371213722137321374213752137621377213782137921380213812138221383213842138521386213872138821389213902139121392213932139421395213962139721398213992140021401214022140321404214052140621407214082140921410214112141221413214142141521416214172141821419214202142121422214232142421425214262142721428214292143021431214322143321434214352143621437214382143921440214412144221443214442144521446214472144821449214502145121452214532145421455214562145721458214592146021461214622146321464214652146621467214682146921470214712147221473214742147521476214772147821479214802148121482214832148421485214862148721488214892149021491214922149321494214952149621497214982149921500215012150221503215042150521506215072150821509215102151121512215132151421515215162151721518215192152021521215222152321524215252152621527215282152921530215312153221533215342153521536215372153821539215402154121542215432154421545215462154721548215492155021551215522155321554215552155621557215582155921560215612156221563215642156521566215672156821569215702157121572215732157421575215762157721578215792158021581215822158321584215852158621587215882158921590215912159221593215942159521596215972159821599216002160121602216032160421605216062160721608216092161021611216122161321614216152161621617216182161921620216212162221623216242162521626216272162821629216302163121632216332163421635216362163721638216392164021641216422164321644216452164621647216482164921650216512165221653216542165521656216572165821659216602166121662216632166421665216662166721668216692167021671216722167321674216752167621677216782167921680216812168221683216842168521686216872168821689216902169121692216932169421695216962169721698216992170021701217022170321704217052170621707217082170921710217112171221713217142171521716217172171821719217202172121722217232172421725217262172721728217292173021731217322173321734217352173621737217382173921740217412174221743217442174521746217472174821749217502175121752217532175421755217562175721758217592176021761217622176321764217652176621767217682176921770217712177221773217742177521776217772177821779217802178121782217832178421785217862178721788217892179021791217922179321794217952179621797217982179921800218012180221803218042180521806218072180821809218102181121812218132181421815218162181721818218192182021821218222182321824218252182621827218282182921830218312183221833218342183521836218372183821839218402184121842218432184421845218462184721848218492185021851218522185321854218552185621857218582185921860218612186221863218642186521866218672186821869218702187121872218732187421875218762187721878218792188021881218822188321884218852188621887218882188921890218912189221893218942189521896218972189821899219002190121902219032190421905219062190721908219092191021911219122191321914219152191621917219182191921920219212192221923219242192521926219272192821929219302193121932219332193421935219362193721938219392194021941219422194321944219452194621947219482194921950219512195221953219542195521956219572195821959219602196121962219632196421965219662196721968219692197021971219722197321974219752197621977219782197921980219812198221983219842198521986219872198821989219902199121992219932199421995219962199721998219992200022001220022200322004220052200622007220082200922010220112201222013220142201522016220172201822019220202202122022220232202422025220262202722028220292203022031220322203322034220352203622037220382203922040220412204222043220442204522046220472204822049220502205122052220532205422055220562205722058220592206022061220622206322064220652206622067220682206922070220712207222073220742207522076220772207822079220802208122082220832208422085220862208722088220892209022091220922209322094220952209622097220982209922100221012210222103221042210522106221072210822109221102211122112221132211422115221162211722118221192212022121221222212322124221252212622127221282212922130221312213222133221342213522136221372213822139221402214122142221432214422145221462214722148221492215022151221522215322154221552215622157221582215922160221612216222163221642216522166221672216822169221702217122172221732217422175221762217722178221792218022181221822218322184221852218622187221882218922190221912219222193221942219522196221972219822199222002220122202222032220422205222062220722208222092221022211222122221322214222152221622217222182221922220222212222222223222242222522226222272222822229222302223122232222332223422235222362223722238222392224022241222422224322244222452224622247222482224922250222512225222253222542225522256222572225822259222602226122262222632226422265222662226722268222692227022271222722227322274222752227622277222782227922280222812228222283222842228522286222872228822289222902229122292222932229422295222962229722298222992230022301223022230322304223052230622307223082230922310223112231222313223142231522316223172231822319223202232122322223232232422325223262232722328223292233022331223322233322334223352233622337223382233922340223412234222343223442234522346223472234822349223502235122352223532235422355223562235722358223592236022361223622236322364223652236622367223682236922370223712237222373223742237522376223772237822379223802238122382223832238422385223862238722388223892239022391223922239322394223952239622397223982239922400224012240222403224042240522406224072240822409224102241122412224132241422415224162241722418224192242022421224222242322424224252242622427224282242922430224312243222433224342243522436224372243822439224402244122442224432244422445224462244722448224492245022451224522245322454224552245622457224582245922460224612246222463224642246522466224672246822469224702247122472224732247422475224762247722478224792248022481224822248322484224852248622487224882248922490224912249222493224942249522496224972249822499225002250122502225032250422505225062250722508225092251022511225122251322514225152251622517225182251922520225212252222523225242252522526225272252822529225302253122532225332253422535225362253722538225392254022541225422254322544225452254622547225482254922550225512255222553225542255522556225572255822559225602256122562225632256422565225662256722568225692257022571225722257322574225752257622577225782257922580225812258222583225842258522586225872258822589225902259122592225932259422595225962259722598225992260022601226022260322604226052260622607226082260922610226112261222613226142261522616226172261822619226202262122622226232262422625226262262722628226292263022631226322263322634226352263622637226382263922640226412264222643226442264522646226472264822649226502265122652226532265422655226562265722658226592266022661226622266322664226652266622667226682266922670226712267222673226742267522676226772267822679226802268122682226832268422685226862268722688226892269022691226922269322694226952269622697226982269922700227012270222703227042270522706227072270822709227102271122712227132271422715227162271722718227192272022721227222272322724227252272622727227282272922730227312273222733227342273522736227372273822739227402274122742227432274422745227462274722748227492275022751227522275322754227552275622757227582275922760227612276222763227642276522766227672276822769227702277122772227732277422775227762277722778227792278022781227822278322784227852278622787227882278922790227912279222793227942279522796227972279822799228002280122802228032280422805228062280722808228092281022811228122281322814228152281622817228182281922820228212282222823228242282522826228272282822829228302283122832228332283422835228362283722838228392284022841228422284322844228452284622847228482284922850228512285222853228542285522856228572285822859228602286122862228632286422865228662286722868228692287022871228722287322874228752287622877228782287922880228812288222883228842288522886228872288822889228902289122892228932289422895228962289722898228992290022901229022290322904229052290622907229082290922910229112291222913229142291522916229172291822919229202292122922229232292422925229262292722928229292293022931229322293322934229352293622937229382293922940229412294222943229442294522946229472294822949229502295122952229532295422955229562295722958229592296022961229622296322964229652296622967229682296922970229712297222973229742297522976229772297822979229802298122982229832298422985229862298722988229892299022991229922299322994229952299622997229982299923000230012300223003230042300523006230072300823009230102301123012230132301423015230162301723018230192302023021230222302323024230252302623027230282302923030230312303223033230342303523036230372303823039230402304123042230432304423045230462304723048230492305023051230522305323054230552305623057230582305923060230612306223063230642306523066230672306823069230702307123072230732307423075230762307723078230792308023081230822308323084230852308623087230882308923090230912309223093230942309523096230972309823099231002310123102231032310423105231062310723108231092311023111231122311323114231152311623117231182311923120231212312223123231242312523126231272312823129231302313123132231332313423135231362313723138231392314023141231422314323144231452314623147231482314923150231512315223153231542315523156231572315823159231602316123162231632316423165231662316723168231692317023171231722317323174231752317623177231782317923180231812318223183231842318523186231872318823189231902319123192231932319423195231962319723198231992320023201232022320323204232052320623207232082320923210232112321223213232142321523216232172321823219232202322123222232232322423225232262322723228232292323023231232322323323234232352323623237232382323923240232412324223243232442324523246232472324823249232502325123252232532325423255232562325723258232592326023261232622326323264232652326623267232682326923270232712327223273232742327523276232772327823279232802328123282232832328423285232862328723288232892329023291232922329323294232952329623297232982329923300233012330223303233042330523306233072330823309233102331123312233132331423315233162331723318233192332023321233222332323324233252332623327233282332923330233312333223333233342333523336233372333823339233402334123342233432334423345233462334723348233492335023351233522335323354233552335623357233582335923360233612336223363233642336523366233672336823369233702337123372233732337423375233762337723378233792338023381233822338323384233852338623387233882338923390233912339223393233942339523396233972339823399234002340123402234032340423405234062340723408234092341023411234122341323414234152341623417234182341923420234212342223423234242342523426234272342823429234302343123432234332343423435234362343723438234392344023441234422344323444234452344623447234482344923450234512345223453234542345523456234572345823459234602346123462234632346423465234662346723468234692347023471234722347323474234752347623477234782347923480234812348223483234842348523486234872348823489234902349123492234932349423495234962349723498234992350023501235022350323504235052350623507235082350923510235112351223513235142351523516235172351823519235202352123522235232352423525235262352723528235292353023531235322353323534235352353623537235382353923540235412354223543235442354523546235472354823549235502355123552235532355423555235562355723558235592356023561235622356323564235652356623567235682356923570235712357223573235742357523576235772357823579235802358123582235832358423585235862358723588235892359023591235922359323594235952359623597235982359923600236012360223603236042360523606236072360823609236102361123612236132361423615236162361723618236192362023621236222362323624236252362623627236282362923630236312363223633236342363523636236372363823639236402364123642236432364423645236462364723648236492365023651236522365323654236552365623657236582365923660236612366223663236642366523666236672366823669236702367123672236732367423675236762367723678236792368023681236822368323684236852368623687236882368923690236912369223693236942369523696236972369823699237002370123702237032370423705237062370723708237092371023711237122371323714237152371623717237182371923720237212372223723237242372523726237272372823729237302373123732237332373423735237362373723738237392374023741237422374323744237452374623747237482374923750237512375223753237542375523756237572375823759237602376123762237632376423765237662376723768237692377023771237722377323774237752377623777237782377923780237812378223783237842378523786237872378823789237902379123792237932379423795237962379723798237992380023801238022380323804238052380623807238082380923810238112381223813238142381523816238172381823819238202382123822238232382423825238262382723828238292383023831238322383323834238352383623837238382383923840238412384223843238442384523846238472384823849238502385123852238532385423855238562385723858238592386023861238622386323864238652386623867238682386923870238712387223873238742387523876238772387823879238802388123882238832388423885238862388723888238892389023891238922389323894238952389623897238982389923900239012390223903239042390523906239072390823909239102391123912239132391423915239162391723918239192392023921239222392323924239252392623927239282392923930239312393223933239342393523936239372393823939239402394123942239432394423945239462394723948239492395023951239522395323954239552395623957239582395923960239612396223963239642396523966239672396823969239702397123972239732397423975239762397723978239792398023981239822398323984239852398623987239882398923990239912399223993239942399523996239972399823999240002400124002240032400424005240062400724008240092401024011240122401324014240152401624017240182401924020240212402224023240242402524026240272402824029240302403124032240332403424035240362403724038240392404024041240422404324044240452404624047240482404924050240512405224053240542405524056240572405824059240602406124062240632406424065240662406724068240692407024071240722407324074240752407624077240782407924080240812408224083240842408524086240872408824089240902409124092240932409424095240962409724098240992410024101241022410324104241052410624107241082410924110241112411224113241142411524116241172411824119241202412124122241232412424125241262412724128241292413024131241322413324134241352413624137241382413924140241412414224143241442414524146241472414824149241502415124152241532415424155241562415724158241592416024161241622416324164241652416624167241682416924170241712417224173241742417524176241772417824179241802418124182241832418424185241862418724188241892419024191241922419324194241952419624197241982419924200242012420224203242042420524206242072420824209242102421124212242132421424215242162421724218242192422024221242222422324224242252422624227242282422924230242312423224233242342423524236242372423824239242402424124242242432424424245242462424724248242492425024251242522425324254242552425624257242582425924260242612426224263242642426524266242672426824269242702427124272242732427424275242762427724278242792428024281242822428324284242852428624287242882428924290242912429224293242942429524296242972429824299243002430124302243032430424305243062430724308243092431024311243122431324314243152431624317243182431924320243212432224323243242432524326243272432824329243302433124332243332433424335243362433724338243392434024341243422434324344243452434624347243482434924350243512435224353243542435524356243572435824359243602436124362243632436424365243662436724368243692437024371243722437324374243752437624377243782437924380243812438224383243842438524386243872438824389243902439124392243932439424395243962439724398243992440024401244022440324404244052440624407244082440924410244112441224413244142441524416244172441824419244202442124422244232442424425244262442724428244292443024431244322443324434244352443624437244382443924440244412444224443244442444524446244472444824449244502445124452244532445424455244562445724458244592446024461244622446324464244652446624467244682446924470244712447224473244742447524476244772447824479244802448124482244832448424485244862448724488244892449024491244922449324494244952449624497244982449924500245012450224503245042450524506245072450824509245102451124512245132451424515245162451724518245192452024521245222452324524245252452624527245282452924530245312453224533245342453524536245372453824539245402454124542245432454424545245462454724548245492455024551245522455324554245552455624557245582455924560245612456224563245642456524566245672456824569245702457124572245732457424575245762457724578245792458024581245822458324584245852458624587245882458924590245912459224593245942459524596245972459824599246002460124602246032460424605246062460724608246092461024611246122461324614246152461624617246182461924620246212462224623246242462524626246272462824629246302463124632246332463424635246362463724638246392464024641246422464324644246452464624647246482464924650246512465224653246542465524656246572465824659246602466124662246632466424665246662466724668246692467024671246722467324674246752467624677246782467924680246812468224683246842468524686246872468824689246902469124692246932469424695246962469724698246992470024701247022470324704247052470624707247082470924710247112471224713247142471524716247172471824719247202472124722247232472424725247262472724728247292473024731247322473324734247352473624737247382473924740247412474224743247442474524746247472474824749247502475124752247532475424755247562475724758247592476024761247622476324764247652476624767247682476924770247712477224773247742477524776247772477824779247802478124782247832478424785247862478724788247892479024791247922479324794247952479624797247982479924800248012480224803248042480524806248072480824809248102481124812248132481424815248162481724818248192482024821248222482324824248252482624827248282482924830248312483224833248342483524836248372483824839248402484124842248432484424845248462484724848248492485024851248522485324854248552485624857248582485924860248612486224863248642486524866248672486824869248702487124872248732487424875248762487724878248792488024881248822488324884248852488624887248882488924890248912489224893248942489524896248972489824899249002490124902249032490424905249062490724908249092491024911249122491324914249152491624917249182491924920249212492224923249242492524926249272492824929249302493124932249332493424935249362493724938249392494024941249422494324944249452494624947249482494924950249512495224953249542495524956249572495824959249602496124962249632496424965249662496724968249692497024971249722497324974249752497624977249782497924980249812498224983249842498524986249872498824989249902499124992249932499424995249962499724998249992500025001250022500325004250052500625007250082500925010250112501225013250142501525016250172501825019250202502125022250232502425025250262502725028250292503025031250322503325034250352503625037250382503925040250412504225043250442504525046250472504825049250502505125052250532505425055250562505725058250592506025061250622506325064250652506625067250682506925070250712507225073250742507525076250772507825079250802508125082250832508425085250862508725088250892509025091250922509325094250952509625097250982509925100251012510225103251042510525106251072510825109251102511125112251132511425115251162511725118251192512025121251222512325124251252512625127251282512925130251312513225133251342513525136251372513825139251402514125142251432514425145251462514725148251492515025151251522515325154251552515625157251582515925160251612516225163251642516525166251672516825169251702517125172251732517425175251762517725178251792518025181251822518325184251852518625187251882518925190251912519225193251942519525196251972519825199252002520125202252032520425205252062520725208252092521025211252122521325214252152521625217252182521925220252212522225223252242522525226252272522825229252302523125232252332523425235252362523725238252392524025241252422524325244252452524625247252482524925250252512525225253252542525525256252572525825259252602526125262252632526425265252662526725268252692527025271252722527325274252752527625277252782527925280252812528225283252842528525286252872528825289252902529125292252932529425295252962529725298252992530025301253022530325304253052530625307253082530925310253112531225313253142531525316253172531825319253202532125322253232532425325253262532725328253292533025331253322533325334253352533625337253382533925340253412534225343253442534525346253472534825349253502535125352253532535425355253562535725358253592536025361253622536325364253652536625367253682536925370253712537225373253742537525376253772537825379253802538125382253832538425385253862538725388253892539025391253922539325394253952539625397253982539925400254012540225403254042540525406254072540825409254102541125412254132541425415254162541725418254192542025421254222542325424254252542625427254282542925430254312543225433254342543525436254372543825439254402544125442254432544425445254462544725448254492545025451254522545325454254552545625457254582545925460254612546225463254642546525466254672546825469254702547125472254732547425475254762547725478254792548025481254822548325484254852548625487254882548925490254912549225493254942549525496254972549825499255002550125502255032550425505255062550725508255092551025511255122551325514255152551625517255182551925520255212552225523255242552525526255272552825529255302553125532255332553425535255362553725538255392554025541255422554325544255452554625547255482554925550255512555225553255542555525556255572555825559255602556125562255632556425565255662556725568255692557025571255722557325574255752557625577255782557925580255812558225583255842558525586255872558825589255902559125592255932559425595255962559725598255992560025601256022560325604256052560625607256082560925610256112561225613256142561525616256172561825619256202562125622256232562425625256262562725628256292563025631256322563325634256352563625637256382563925640256412564225643256442564525646256472564825649256502565125652256532565425655256562565725658256592566025661256622566325664256652566625667256682566925670256712567225673256742567525676256772567825679256802568125682256832568425685256862568725688256892569025691256922569325694256952569625697256982569925700257012570225703257042570525706257072570825709257102571125712257132571425715257162571725718257192572025721257222572325724257252572625727257282572925730257312573225733257342573525736257372573825739257402574125742257432574425745257462574725748257492575025751257522575325754257552575625757257582575925760257612576225763257642576525766257672576825769257702577125772257732577425775257762577725778257792578025781257822578325784257852578625787257882578925790257912579225793257942579525796257972579825799258002580125802258032580425805258062580725808258092581025811258122581325814258152581625817258182581925820258212582225823258242582525826258272582825829258302583125832258332583425835258362583725838258392584025841258422584325844258452584625847258482584925850258512585225853258542585525856258572585825859258602586125862258632586425865258662586725868258692587025871258722587325874258752587625877258782587925880258812588225883258842588525886258872588825889258902589125892258932589425895258962589725898258992590025901259022590325904259052590625907259082590925910259112591225913259142591525916259172591825919259202592125922259232592425925259262592725928259292593025931259322593325934259352593625937259382593925940259412594225943259442594525946259472594825949259502595125952259532595425955259562595725958259592596025961259622596325964259652596625967259682596925970259712597225973259742597525976259772597825979259802598125982259832598425985259862598725988259892599025991259922599325994259952599625997259982599926000260012600226003260042600526006260072600826009260102601126012260132601426015260162601726018260192602026021260222602326024260252602626027260282602926030260312603226033260342603526036260372603826039260402604126042260432604426045260462604726048260492605026051260522605326054260552605626057260582605926060260612606226063260642606526066260672606826069260702607126072260732607426075260762607726078260792608026081260822608326084260852608626087260882608926090260912609226093260942609526096260972609826099261002610126102261032610426105261062610726108261092611026111261122611326114261152611626117261182611926120261212612226123261242612526126261272612826129261302613126132261332613426135261362613726138261392614026141261422614326144261452614626147261482614926150261512615226153261542615526156261572615826159261602616126162261632616426165261662616726168261692617026171261722617326174261752617626177261782617926180261812618226183261842618526186261872618826189261902619126192261932619426195261962619726198261992620026201262022620326204262052620626207262082620926210262112621226213262142621526216262172621826219262202622126222262232622426225262262622726228262292623026231262322623326234262352623626237262382623926240262412624226243262442624526246262472624826249262502625126252262532625426255262562625726258262592626026261262622626326264262652626626267262682626926270262712627226273262742627526276262772627826279262802628126282262832628426285262862628726288262892629026291262922629326294262952629626297262982629926300263012630226303263042630526306263072630826309263102631126312263132631426315263162631726318263192632026321263222632326324263252632626327263282632926330263312633226333263342633526336263372633826339263402634126342263432634426345263462634726348263492635026351263522635326354263552635626357263582635926360263612636226363263642636526366263672636826369263702637126372263732637426375263762637726378263792638026381263822638326384263852638626387263882638926390263912639226393263942639526396263972639826399264002640126402264032640426405264062640726408264092641026411264122641326414264152641626417264182641926420264212642226423264242642526426264272642826429264302643126432264332643426435264362643726438264392644026441264422644326444264452644626447264482644926450264512645226453264542645526456264572645826459264602646126462264632646426465264662646726468264692647026471264722647326474264752647626477264782647926480264812648226483264842648526486264872648826489264902649126492264932649426495264962649726498264992650026501265022650326504265052650626507265082650926510265112651226513265142651526516265172651826519265202652126522265232652426525265262652726528265292653026531265322653326534265352653626537265382653926540265412654226543265442654526546265472654826549265502655126552265532655426555265562655726558265592656026561265622656326564265652656626567265682656926570265712657226573265742657526576265772657826579265802658126582265832658426585265862658726588265892659026591265922659326594265952659626597265982659926600266012660226603266042660526606266072660826609266102661126612266132661426615266162661726618266192662026621266222662326624266252662626627266282662926630266312663226633266342663526636266372663826639266402664126642266432664426645266462664726648266492665026651266522665326654266552665626657266582665926660266612666226663266642666526666266672666826669266702667126672266732667426675266762667726678266792668026681266822668326684266852668626687266882668926690266912669226693266942669526696266972669826699267002670126702267032670426705267062670726708267092671026711267122671326714267152671626717267182671926720267212672226723267242672526726267272672826729267302673126732267332673426735267362673726738267392674026741267422674326744267452674626747267482674926750267512675226753267542675526756267572675826759267602676126762267632676426765267662676726768267692677026771267722677326774267752677626777267782677926780267812678226783267842678526786267872678826789267902679126792267932679426795267962679726798267992680026801268022680326804268052680626807268082680926810268112681226813268142681526816268172681826819268202682126822268232682426825268262682726828268292683026831268322683326834268352683626837268382683926840268412684226843268442684526846268472684826849268502685126852268532685426855268562685726858268592686026861268622686326864268652686626867268682686926870268712687226873268742687526876268772687826879268802688126882268832688426885268862688726888268892689026891268922689326894268952689626897268982689926900269012690226903269042690526906269072690826909269102691126912269132691426915269162691726918269192692026921269222692326924269252692626927269282692926930269312693226933269342693526936269372693826939269402694126942269432694426945269462694726948269492695026951269522695326954269552695626957269582695926960269612696226963269642696526966269672696826969269702697126972269732697426975269762697726978269792698026981269822698326984269852698626987269882698926990269912699226993269942699526996269972699826999270002700127002270032700427005270062700727008270092701027011270122701327014270152701627017270182701927020270212702227023270242702527026270272702827029270302703127032270332703427035270362703727038270392704027041270422704327044270452704627047270482704927050270512705227053270542705527056270572705827059270602706127062270632706427065270662706727068270692707027071270722707327074270752707627077270782707927080270812708227083270842708527086270872708827089270902709127092270932709427095270962709727098270992710027101271022710327104271052710627107271082710927110271112711227113271142711527116271172711827119271202712127122271232712427125271262712727128271292713027131271322713327134271352713627137271382713927140271412714227143271442714527146271472714827149271502715127152271532715427155271562715727158271592716027161271622716327164271652716627167271682716927170271712717227173271742717527176271772717827179271802718127182271832718427185271862718727188271892719027191271922719327194271952719627197271982719927200272012720227203272042720527206272072720827209272102721127212272132721427215272162721727218272192722027221272222722327224272252722627227272282722927230272312723227233272342723527236272372723827239272402724127242272432724427245272462724727248272492725027251272522725327254272552725627257272582725927260272612726227263272642726527266272672726827269272702727127272272732727427275272762727727278272792728027281272822728327284272852728627287272882728927290272912729227293272942729527296272972729827299273002730127302273032730427305273062730727308273092731027311273122731327314273152731627317273182731927320273212732227323273242732527326273272732827329273302733127332273332733427335273362733727338273392734027341273422734327344273452734627347273482734927350273512735227353273542735527356273572735827359273602736127362273632736427365273662736727368273692737027371273722737327374273752737627377273782737927380273812738227383273842738527386273872738827389273902739127392273932739427395273962739727398273992740027401274022740327404274052740627407274082740927410274112741227413274142741527416274172741827419274202742127422274232742427425274262742727428274292743027431274322743327434274352743627437274382743927440274412744227443274442744527446274472744827449274502745127452274532745427455274562745727458274592746027461274622746327464274652746627467274682746927470274712747227473274742747527476274772747827479274802748127482274832748427485274862748727488274892749027491274922749327494274952749627497274982749927500275012750227503275042750527506275072750827509275102751127512275132751427515275162751727518275192752027521275222752327524275252752627527275282752927530275312753227533275342753527536275372753827539275402754127542275432754427545275462754727548275492755027551275522755327554275552755627557275582755927560275612756227563275642756527566275672756827569275702757127572275732757427575275762757727578275792758027581275822758327584275852758627587275882758927590275912759227593275942759527596275972759827599276002760127602276032760427605276062760727608276092761027611276122761327614276152761627617276182761927620276212762227623276242762527626276272762827629276302763127632276332763427635276362763727638276392764027641276422764327644276452764627647276482764927650276512765227653276542765527656276572765827659276602766127662276632766427665276662766727668276692767027671276722767327674276752767627677276782767927680276812768227683276842768527686276872768827689276902769127692276932769427695276962769727698276992770027701277022770327704277052770627707277082770927710277112771227713277142771527716277172771827719277202772127722277232772427725277262772727728277292773027731277322773327734277352773627737277382773927740277412774227743277442774527746277472774827749277502775127752277532775427755277562775727758277592776027761277622776327764277652776627767277682776927770277712777227773277742777527776277772777827779277802778127782277832778427785277862778727788277892779027791277922779327794277952779627797277982779927800278012780227803278042780527806278072780827809278102781127812278132781427815278162781727818278192782027821278222782327824278252782627827278282782927830278312783227833278342783527836278372783827839278402784127842278432784427845278462784727848278492785027851278522785327854278552785627857278582785927860278612786227863278642786527866278672786827869278702787127872278732787427875278762787727878278792788027881278822788327884278852788627887278882788927890278912789227893278942789527896278972789827899279002790127902279032790427905279062790727908279092791027911279122791327914279152791627917279182791927920279212792227923279242792527926279272792827929279302793127932279332793427935279362793727938279392794027941279422794327944279452794627947279482794927950279512795227953279542795527956279572795827959279602796127962279632796427965279662796727968279692797027971279722797327974279752797627977279782797927980279812798227983279842798527986279872798827989279902799127992279932799427995279962799727998279992800028001280022800328004280052800628007280082800928010280112801228013280142801528016280172801828019280202802128022280232802428025280262802728028280292803028031280322803328034280352803628037280382803928040280412804228043280442804528046280472804828049280502805128052280532805428055280562805728058280592806028061280622806328064280652806628067280682806928070280712807228073280742807528076280772807828079280802808128082280832808428085280862808728088280892809028091280922809328094280952809628097280982809928100281012810228103281042810528106281072810828109281102811128112281132811428115281162811728118281192812028121281222812328124281252812628127281282812928130281312813228133281342813528136281372813828139281402814128142281432814428145281462814728148281492815028151281522815328154281552815628157281582815928160281612816228163281642816528166281672816828169281702817128172281732817428175281762817728178281792818028181281822818328184281852818628187281882818928190281912819228193281942819528196281972819828199282002820128202282032820428205282062820728208282092821028211282122821328214282152821628217282182821928220282212822228223282242822528226282272822828229282302823128232282332823428235282362823728238282392824028241282422824328244282452824628247282482824928250282512825228253282542825528256282572825828259282602826128262282632826428265282662826728268282692827028271282722827328274282752827628277282782827928280282812828228283282842828528286282872828828289282902829128292282932829428295282962829728298282992830028301283022830328304283052830628307283082830928310283112831228313283142831528316283172831828319283202832128322283232832428325283262832728328283292833028331283322833328334283352833628337283382833928340283412834228343283442834528346283472834828349283502835128352283532835428355283562835728358283592836028361283622836328364283652836628367283682836928370283712837228373283742837528376283772837828379283802838128382283832838428385283862838728388283892839028391283922839328394283952839628397283982839928400284012840228403284042840528406284072840828409284102841128412284132841428415284162841728418284192842028421284222842328424284252842628427284282842928430284312843228433284342843528436284372843828439284402844128442284432844428445284462844728448284492845028451284522845328454284552845628457284582845928460284612846228463284642846528466284672846828469284702847128472284732847428475284762847728478284792848028481284822848328484284852848628487284882848928490284912849228493284942849528496284972849828499285002850128502285032850428505285062850728508285092851028511285122851328514285152851628517285182851928520285212852228523285242852528526285272852828529285302853128532285332853428535285362853728538285392854028541285422854328544285452854628547285482854928550285512855228553285542855528556285572855828559285602856128562285632856428565285662856728568285692857028571285722857328574285752857628577285782857928580285812858228583285842858528586285872858828589285902859128592285932859428595285962859728598285992860028601286022860328604286052860628607286082860928610286112861228613286142861528616286172861828619286202862128622286232862428625286262862728628286292863028631286322863328634286352863628637286382863928640286412864228643286442864528646286472864828649286502865128652286532865428655286562865728658286592866028661286622866328664286652866628667286682866928670286712867228673286742867528676286772867828679286802868128682286832868428685286862868728688286892869028691286922869328694286952869628697286982869928700287012870228703287042870528706287072870828709287102871128712287132871428715287162871728718287192872028721287222872328724287252872628727287282872928730287312873228733287342873528736287372873828739287402874128742287432874428745287462874728748287492875028751287522875328754287552875628757287582875928760287612876228763287642876528766287672876828769287702877128772287732877428775287762877728778287792878028781287822878328784287852878628787287882878928790287912879228793287942879528796287972879828799288002880128802288032880428805288062880728808288092881028811288122881328814288152881628817288182881928820288212882228823288242882528826288272882828829288302883128832288332883428835288362883728838288392884028841288422884328844288452884628847288482884928850288512885228853288542885528856288572885828859288602886128862288632886428865288662886728868288692887028871288722887328874288752887628877288782887928880288812888228883288842888528886288872888828889288902889128892288932889428895288962889728898288992890028901289022890328904289052890628907289082890928910289112891228913289142891528916289172891828919289202892128922289232892428925289262892728928289292893028931289322893328934289352893628937289382893928940289412894228943289442894528946289472894828949289502895128952289532895428955289562895728958289592896028961289622896328964289652896628967289682896928970289712897228973289742897528976289772897828979289802898128982289832898428985289862898728988289892899028991289922899328994289952899628997289982899929000290012900229003290042900529006290072900829009290102901129012290132901429015290162901729018290192902029021290222902329024290252902629027290282902929030290312903229033290342903529036290372903829039290402904129042290432904429045290462904729048290492905029051290522905329054290552905629057290582905929060290612906229063290642906529066290672906829069290702907129072290732907429075290762907729078290792908029081290822908329084290852908629087290882908929090290912909229093290942909529096290972909829099291002910129102291032910429105291062910729108291092911029111291122911329114291152911629117291182911929120291212912229123291242912529126291272912829129291302913129132291332913429135291362913729138291392914029141291422914329144291452914629147291482914929150291512915229153291542915529156291572915829159291602916129162291632916429165291662916729168291692917029171291722917329174291752917629177291782917929180291812918229183291842918529186291872918829189291902919129192291932919429195291962919729198291992920029201292022920329204292052920629207292082920929210292112921229213292142921529216292172921829219292202922129222292232922429225292262922729228292292923029231292322923329234292352923629237292382923929240292412924229243292442924529246292472924829249292502925129252292532925429255292562925729258292592926029261292622926329264292652926629267292682926929270292712927229273292742927529276292772927829279292802928129282292832928429285292862928729288292892929029291292922929329294292952929629297292982929929300293012930229303293042930529306293072930829309293102931129312293132931429315293162931729318293192932029321293222932329324293252932629327293282932929330293312933229333293342933529336293372933829339293402934129342293432934429345293462934729348293492935029351293522935329354293552935629357293582935929360293612936229363293642936529366293672936829369293702937129372293732937429375293762937729378293792938029381293822938329384293852938629387293882938929390293912939229393293942939529396293972939829399294002940129402294032940429405294062940729408294092941029411294122941329414294152941629417294182941929420294212942229423294242942529426294272942829429294302943129432294332943429435294362943729438294392944029441294422944329444294452944629447294482944929450294512945229453294542945529456294572945829459294602946129462294632946429465294662946729468294692947029471294722947329474294752947629477294782947929480294812948229483294842948529486294872948829489294902949129492294932949429495294962949729498294992950029501295022950329504295052950629507295082950929510295112951229513295142951529516295172951829519295202952129522295232952429525295262952729528295292953029531295322953329534295352953629537295382953929540295412954229543295442954529546295472954829549295502955129552295532955429555295562955729558295592956029561295622956329564295652956629567295682956929570295712957229573295742957529576295772957829579295802958129582295832958429585295862958729588295892959029591295922959329594295952959629597295982959929600296012960229603296042960529606296072960829609296102961129612296132961429615296162961729618296192962029621296222962329624296252962629627296282962929630296312963229633296342963529636296372963829639296402964129642296432964429645296462964729648296492965029651296522965329654296552965629657296582965929660296612966229663296642966529666296672966829669296702967129672296732967429675296762967729678296792968029681296822968329684296852968629687296882968929690296912969229693296942969529696296972969829699297002970129702297032970429705297062970729708297092971029711297122971329714297152971629717297182971929720297212972229723297242972529726297272972829729297302973129732297332973429735297362973729738297392974029741297422974329744297452974629747297482974929750297512975229753297542975529756297572975829759297602976129762297632976429765297662976729768297692977029771297722977329774297752977629777297782977929780297812978229783297842978529786297872978829789297902979129792297932979429795297962979729798297992980029801298022980329804298052980629807298082980929810298112981229813298142981529816298172981829819298202982129822298232982429825298262982729828298292983029831298322983329834298352983629837298382983929840298412984229843298442984529846298472984829849298502985129852298532985429855298562985729858298592986029861298622986329864298652986629867298682986929870298712987229873298742987529876298772987829879298802988129882298832988429885298862988729888298892989029891298922989329894298952989629897298982989929900299012990229903299042990529906299072990829909299102991129912299132991429915299162991729918299192992029921299222992329924299252992629927299282992929930299312993229933299342993529936299372993829939299402994129942299432994429945299462994729948299492995029951299522995329954299552995629957299582995929960299612996229963299642996529966299672996829969299702997129972299732997429975299762997729978299792998029981299822998329984299852998629987299882998929990299912999229993299942999529996299972999829999300003000130002300033000430005300063000730008300093001030011300123001330014300153001630017300183001930020300213002230023300243002530026300273002830029300303003130032300333003430035300363003730038300393004030041300423004330044300453004630047300483004930050300513005230053300543005530056300573005830059300603006130062300633006430065300663006730068300693007030071300723007330074300753007630077300783007930080300813008230083300843008530086300873008830089300903009130092300933009430095300963009730098300993010030101301023010330104301053010630107301083010930110301113011230113301143011530116301173011830119301203012130122301233012430125301263012730128301293013030131301323013330134301353013630137301383013930140301413014230143301443014530146301473014830149301503015130152301533015430155301563015730158301593016030161301623016330164301653016630167301683016930170301713017230173301743017530176301773017830179301803018130182301833018430185301863018730188301893019030191301923019330194301953019630197301983019930200302013020230203302043020530206302073020830209302103021130212302133021430215302163021730218302193022030221302223022330224302253022630227302283022930230302313023230233302343023530236302373023830239302403024130242302433024430245302463024730248302493025030251302523025330254302553025630257302583025930260302613026230263302643026530266302673026830269302703027130272302733027430275302763027730278302793028030281302823028330284302853028630287302883028930290302913029230293302943029530296302973029830299303003030130302303033030430305303063030730308303093031030311303123031330314303153031630317303183031930320303213032230323303243032530326303273032830329303303033130332303333033430335303363033730338303393034030341303423034330344303453034630347303483034930350303513035230353303543035530356303573035830359303603036130362303633036430365303663036730368303693037030371303723037330374303753037630377303783037930380303813038230383303843038530386303873038830389303903039130392303933039430395303963039730398303993040030401304023040330404304053040630407304083040930410304113041230413304143041530416304173041830419304203042130422304233042430425304263042730428304293043030431304323043330434304353043630437304383043930440304413044230443304443044530446304473044830449304503045130452304533045430455304563045730458304593046030461304623046330464304653046630467304683046930470304713047230473304743047530476304773047830479304803048130482304833048430485304863048730488304893049030491304923049330494304953049630497304983049930500305013050230503305043050530506305073050830509305103051130512305133051430515305163051730518305193052030521305223052330524305253052630527305283052930530305313053230533305343053530536305373053830539305403054130542305433054430545305463054730548305493055030551305523055330554305553055630557305583055930560305613056230563305643056530566305673056830569305703057130572305733057430575305763057730578305793058030581305823058330584305853058630587305883058930590305913059230593305943059530596305973059830599306003060130602306033060430605306063060730608306093061030611306123061330614306153061630617306183061930620306213062230623306243062530626306273062830629306303063130632306333063430635306363063730638306393064030641306423064330644306453064630647306483064930650306513065230653306543065530656306573065830659306603066130662306633066430665306663066730668306693067030671306723067330674306753067630677306783067930680306813068230683306843068530686306873068830689306903069130692306933069430695306963069730698306993070030701307023070330704307053070630707307083070930710307113071230713307143071530716307173071830719307203072130722307233072430725307263072730728307293073030731307323073330734307353073630737307383073930740307413074230743307443074530746307473074830749307503075130752307533075430755307563075730758307593076030761307623076330764307653076630767307683076930770307713077230773307743077530776307773077830779307803078130782307833078430785307863078730788307893079030791307923079330794307953079630797307983079930800308013080230803308043080530806308073080830809308103081130812308133081430815308163081730818308193082030821308223082330824308253082630827308283082930830308313083230833308343083530836308373083830839308403084130842308433084430845308463084730848308493085030851308523085330854308553085630857308583085930860308613086230863308643086530866308673086830869308703087130872308733087430875308763087730878308793088030881308823088330884308853088630887308883088930890308913089230893308943089530896308973089830899309003090130902309033090430905309063090730908309093091030911309123091330914309153091630917309183091930920309213092230923309243092530926309273092830929309303093130932309333093430935309363093730938309393094030941309423094330944309453094630947309483094930950309513095230953309543095530956309573095830959309603096130962309633096430965309663096730968309693097030971309723097330974309753097630977309783097930980309813098230983309843098530986309873098830989309903099130992309933099430995309963099730998309993100031001310023100331004310053100631007310083100931010310113101231013310143101531016310173101831019310203102131022310233102431025310263102731028310293103031031310323103331034310353103631037310383103931040310413104231043310443104531046310473104831049310503105131052310533105431055310563105731058310593106031061310623106331064310653106631067310683106931070310713107231073310743107531076310773107831079310803108131082310833108431085310863108731088310893109031091310923109331094310953109631097310983109931100311013110231103311043110531106311073110831109311103111131112311133111431115311163111731118311193112031121311223112331124311253112631127311283112931130311313113231133311343113531136311373113831139311403114131142311433114431145311463114731148311493115031151311523115331154311553115631157311583115931160311613116231163311643116531166311673116831169311703117131172311733117431175311763117731178311793118031181311823118331184311853118631187311883118931190311913119231193311943119531196311973119831199312003120131202312033120431205312063120731208312093121031211312123121331214312153121631217312183121931220312213122231223312243122531226312273122831229312303123131232312333123431235312363123731238312393124031241312423124331244312453124631247312483124931250312513125231253312543125531256312573125831259312603126131262312633126431265312663126731268312693127031271312723127331274312753127631277312783127931280312813128231283312843128531286312873128831289312903129131292312933129431295312963129731298312993130031301313023130331304313053130631307313083130931310313113131231313313143131531316313173131831319313203132131322313233132431325313263132731328313293133031331313323133331334313353133631337313383133931340313413134231343313443134531346313473134831349313503135131352313533135431355313563135731358313593136031361313623136331364313653136631367313683136931370313713137231373313743137531376313773137831379313803138131382313833138431385313863138731388313893139031391313923139331394313953139631397313983139931400314013140231403314043140531406314073140831409314103141131412314133141431415314163141731418314193142031421314223142331424314253142631427314283142931430314313143231433314343143531436314373143831439314403144131442314433144431445314463144731448314493145031451314523145331454314553145631457314583145931460314613146231463314643146531466314673146831469314703147131472314733147431475314763147731478314793148031481314823148331484314853148631487314883148931490314913149231493314943149531496314973149831499315003150131502315033150431505315063150731508315093151031511315123151331514315153151631517315183151931520315213152231523315243152531526315273152831529315303153131532315333153431535315363153731538315393154031541315423154331544315453154631547315483154931550315513155231553315543155531556315573155831559315603156131562315633156431565315663156731568315693157031571315723157331574315753157631577315783157931580315813158231583315843158531586315873158831589315903159131592315933159431595315963159731598315993160031601316023160331604316053160631607316083160931610316113161231613316143161531616316173161831619316203162131622316233162431625316263162731628316293163031631316323163331634316353163631637316383163931640316413164231643316443164531646316473164831649316503165131652316533165431655316563165731658316593166031661316623166331664316653166631667316683166931670316713167231673316743167531676316773167831679316803168131682316833168431685316863168731688316893169031691316923169331694316953169631697316983169931700317013170231703317043170531706317073170831709317103171131712317133171431715317163171731718317193172031721317223172331724317253172631727317283172931730317313173231733317343173531736317373173831739317403174131742317433174431745317463174731748317493175031751317523175331754317553175631757317583175931760317613176231763317643176531766317673176831769317703177131772317733177431775317763177731778317793178031781317823178331784317853178631787317883178931790317913179231793317943179531796317973179831799318003180131802318033180431805318063180731808318093181031811318123181331814318153181631817318183181931820318213182231823318243182531826318273182831829318303183131832318333183431835318363183731838318393184031841318423184331844318453184631847318483184931850318513185231853318543185531856318573185831859318603186131862318633186431865318663186731868318693187031871318723187331874318753187631877318783187931880318813188231883318843188531886318873188831889318903189131892318933189431895318963189731898318993190031901319023190331904319053190631907319083190931910319113191231913319143191531916319173191831919319203192131922319233192431925319263192731928319293193031931319323193331934319353193631937319383193931940319413194231943319443194531946319473194831949319503195131952319533195431955319563195731958319593196031961319623196331964319653196631967319683196931970319713197231973319743197531976319773197831979319803198131982319833198431985319863198731988319893199031991319923199331994319953199631997319983199932000320013200232003320043200532006320073200832009320103201132012320133201432015320163201732018320193202032021320223202332024320253202632027320283202932030320313203232033320343203532036320373203832039320403204132042320433204432045320463204732048320493205032051320523205332054320553205632057320583205932060320613206232063320643206532066320673206832069320703207132072320733207432075320763207732078320793208032081320823208332084320853208632087320883208932090320913209232093320943209532096320973209832099321003210132102321033210432105321063210732108321093211032111321123211332114321153211632117321183211932120321213212232123321243212532126321273212832129321303213132132321333213432135321363213732138321393214032141321423214332144321453214632147321483214932150321513215232153321543215532156321573215832159321603216132162321633216432165321663216732168321693217032171321723217332174321753217632177321783217932180321813218232183321843218532186321873218832189321903219132192321933219432195321963219732198321993220032201322023220332204322053220632207322083220932210322113221232213322143221532216322173221832219322203222132222322233222432225322263222732228322293223032231322323223332234322353223632237322383223932240322413224232243322443224532246322473224832249322503225132252322533225432255322563225732258322593226032261322623226332264322653226632267322683226932270322713227232273322743227532276322773227832279322803228132282322833228432285322863228732288322893229032291322923229332294322953229632297322983229932300323013230232303323043230532306323073230832309323103231132312323133231432315323163231732318323193232032321323223232332324323253232632327323283232932330323313233232333323343233532336323373233832339323403234132342323433234432345323463234732348323493235032351323523235332354323553235632357323583235932360323613236232363323643236532366323673236832369323703237132372323733237432375323763237732378323793238032381323823238332384323853238632387323883238932390323913239232393323943239532396323973239832399324003240132402324033240432405324063240732408324093241032411324123241332414324153241632417324183241932420324213242232423324243242532426324273242832429324303243132432324333243432435324363243732438324393244032441324423244332444324453244632447324483244932450324513245232453324543245532456324573245832459324603246132462324633246432465324663246732468324693247032471324723247332474324753247632477324783247932480324813248232483324843248532486324873248832489324903249132492324933249432495324963249732498324993250032501325023250332504325053250632507325083250932510325113251232513325143251532516325173251832519325203252132522325233252432525325263252732528325293253032531325323253332534325353253632537325383253932540325413254232543325443254532546325473254832549325503255132552325533255432555325563255732558325593256032561325623256332564325653256632567325683256932570325713257232573325743257532576325773257832579325803258132582325833258432585325863258732588325893259032591325923259332594325953259632597325983259932600326013260232603326043260532606326073260832609326103261132612326133261432615326163261732618326193262032621326223262332624326253262632627326283262932630326313263232633326343263532636326373263832639326403264132642326433264432645326463264732648326493265032651326523265332654326553265632657326583265932660326613266232663326643266532666326673266832669326703267132672326733267432675326763267732678326793268032681326823268332684326853268632687326883268932690326913269232693326943269532696326973269832699327003270132702327033270432705327063270732708327093271032711327123271332714327153271632717327183271932720327213272232723327243272532726327273272832729327303273132732327333273432735327363273732738327393274032741327423274332744327453274632747327483274932750327513275232753327543275532756327573275832759327603276132762327633276432765327663276732768327693277032771327723277332774327753277632777327783277932780327813278232783327843278532786327873278832789327903279132792327933279432795327963279732798327993280032801328023280332804328053280632807328083280932810328113281232813328143281532816328173281832819328203282132822328233282432825328263282732828328293283032831328323283332834328353283632837328383283932840328413284232843328443284532846328473284832849328503285132852328533285432855328563285732858328593286032861328623286332864328653286632867328683286932870328713287232873328743287532876328773287832879328803288132882328833288432885328863288732888328893289032891328923289332894328953289632897328983289932900329013290232903329043290532906329073290832909329103291132912329133291432915329163291732918329193292032921329223292332924329253292632927329283292932930329313293232933329343293532936329373293832939329403294132942329433294432945329463294732948329493295032951329523295332954329553295632957329583295932960329613296232963329643296532966329673296832969329703297132972329733297432975329763297732978329793298032981329823298332984329853298632987329883298932990329913299232993329943299532996329973299832999330003300133002330033300433005330063300733008330093301033011330123301333014330153301633017330183301933020330213302233023330243302533026330273302833029330303303133032330333303433035330363303733038330393304033041330423304333044330453304633047330483304933050330513305233053330543305533056330573305833059330603306133062330633306433065330663306733068330693307033071330723307333074330753307633077330783307933080330813308233083330843308533086330873308833089330903309133092330933309433095330963309733098330993310033101331023310333104331053310633107331083310933110331113311233113331143311533116331173311833119331203312133122331233312433125331263312733128331293313033131331323313333134331353313633137331383313933140331413314233143331443314533146331473314833149331503315133152331533315433155331563315733158331593316033161331623316333164331653316633167331683316933170331713317233173331743317533176331773317833179331803318133182331833318433185331863318733188331893319033191331923319333194331953319633197331983319933200332013320233203332043320533206332073320833209332103321133212332133321433215332163321733218332193322033221332223322333224332253322633227332283322933230332313323233233332343323533236332373323833239332403324133242332433324433245332463324733248332493325033251332523325333254332553325633257332583325933260332613326233263332643326533266332673326833269332703327133272332733327433275332763327733278332793328033281332823328333284332853328633287332883328933290332913329233293332943329533296332973329833299333003330133302333033330433305333063330733308333093331033311333123331333314333153331633317333183331933320333213332233323333243332533326333273332833329333303333133332333333333433335333363333733338333393334033341333423334333344333453334633347333483334933350333513335233353333543335533356333573335833359333603336133362333633336433365333663336733368333693337033371333723337333374333753337633377333783337933380333813338233383333843338533386333873338833389333903339133392333933339433395333963339733398333993340033401334023340333404334053340633407334083340933410334113341233413334143341533416334173341833419334203342133422334233342433425334263342733428334293343033431334323343333434334353343633437334383343933440334413344233443334443344533446334473344833449334503345133452334533345433455334563345733458334593346033461334623346333464334653346633467334683346933470334713347233473334743347533476334773347833479334803348133482334833348433485334863348733488334893349033491334923349333494334953349633497334983349933500335013350233503335043350533506335073350833509335103351133512335133351433515335163351733518335193352033521335223352333524335253352633527335283352933530335313353233533335343353533536335373353833539335403354133542335433354433545335463354733548335493355033551335523355333554335553355633557335583355933560335613356233563335643356533566335673356833569335703357133572335733357433575335763357733578335793358033581335823358333584335853358633587335883358933590335913359233593335943359533596335973359833599336003360133602336033360433605336063360733608336093361033611336123361333614336153361633617336183361933620336213362233623336243362533626336273362833629336303363133632336333363433635336363363733638336393364033641336423364333644336453364633647336483364933650336513365233653336543365533656336573365833659336603366133662336633366433665336663366733668336693367033671336723367333674336753367633677336783367933680336813368233683336843368533686336873368833689336903369133692336933369433695336963369733698336993370033701337023370333704337053370633707337083370933710337113371233713337143371533716337173371833719337203372133722337233372433725337263372733728337293373033731337323373333734337353373633737337383373933740337413374233743337443374533746337473374833749337503375133752337533375433755337563375733758337593376033761337623376333764337653376633767337683376933770337713377233773337743377533776337773377833779337803378133782337833378433785337863378733788337893379033791337923379333794337953379633797337983379933800338013380233803338043380533806338073380833809338103381133812338133381433815338163381733818338193382033821338223382333824338253382633827338283382933830338313383233833338343383533836338373383833839338403384133842338433384433845338463384733848338493385033851338523385333854338553385633857338583385933860338613386233863338643386533866338673386833869338703387133872338733387433875338763387733878338793388033881338823388333884338853388633887338883388933890338913389233893338943389533896338973389833899339003390133902339033390433905339063390733908339093391033911339123391333914339153391633917339183391933920339213392233923339243392533926339273392833929339303393133932339333393433935339363393733938339393394033941339423394333944339453394633947339483394933950339513395233953339543395533956339573395833959339603396133962339633396433965339663396733968339693397033971339723397333974339753397633977339783397933980339813398233983339843398533986339873398833989339903399133992339933399433995339963399733998339993400034001340023400334004340053400634007340083400934010340113401234013340143401534016340173401834019340203402134022340233402434025340263402734028340293403034031340323403334034340353403634037340383403934040340413404234043340443404534046340473404834049340503405134052340533405434055340563405734058340593406034061340623406334064340653406634067340683406934070340713407234073340743407534076340773407834079340803408134082340833408434085340863408734088340893409034091340923409334094340953409634097340983409934100341013410234103341043410534106341073410834109341103411134112341133411434115341163411734118341193412034121341223412334124341253412634127341283412934130341313413234133341343413534136341373413834139341403414134142341433414434145341463414734148341493415034151341523415334154341553415634157341583415934160341613416234163341643416534166341673416834169341703417134172341733417434175341763417734178341793418034181341823418334184341853418634187341883418934190341913419234193341943419534196341973419834199342003420134202342033420434205342063420734208342093421034211342123421334214342153421634217342183421934220342213422234223342243422534226342273422834229342303423134232342333423434235342363423734238342393424034241342423424334244342453424634247342483424934250342513425234253342543425534256342573425834259342603426134262342633426434265342663426734268342693427034271342723427334274342753427634277342783427934280342813428234283342843428534286342873428834289342903429134292342933429434295342963429734298342993430034301343023430334304343053430634307343083430934310343113431234313343143431534316343173431834319343203432134322343233432434325343263432734328343293433034331343323433334334343353433634337343383433934340343413434234343343443434534346343473434834349343503435134352343533435434355343563435734358343593436034361343623436334364343653436634367343683436934370343713437234373343743437534376343773437834379343803438134382343833438434385343863438734388343893439034391343923439334394343953439634397343983439934400344013440234403344043440534406344073440834409344103441134412344133441434415344163441734418344193442034421344223442334424344253442634427344283442934430344313443234433344343443534436344373443834439344403444134442344433444434445344463444734448344493445034451344523445334454344553445634457344583445934460344613446234463344643446534466344673446834469344703447134472344733447434475344763447734478344793448034481344823448334484344853448634487344883448934490344913449234493344943449534496344973449834499345003450134502345033450434505345063450734508345093451034511345123451334514345153451634517345183451934520345213452234523345243452534526345273452834529345303453134532345333453434535345363453734538345393454034541345423454334544345453454634547345483454934550345513455234553345543455534556345573455834559345603456134562345633456434565345663456734568345693457034571345723457334574345753457634577345783457934580345813458234583345843458534586345873458834589345903459134592345933459434595345963459734598345993460034601346023460334604346053460634607346083460934610346113461234613346143461534616346173461834619346203462134622346233462434625346263462734628346293463034631346323463334634346353463634637346383463934640346413464234643346443464534646346473464834649346503465134652346533465434655346563465734658346593466034661346623466334664346653466634667346683466934670346713467234673346743467534676346773467834679346803468134682346833468434685346863468734688346893469034691346923469334694346953469634697346983469934700347013470234703347043470534706347073470834709347103471134712347133471434715347163471734718347193472034721347223472334724347253472634727347283472934730347313473234733347343473534736347373473834739347403474134742347433474434745347463474734748347493475034751347523475334754347553475634757347583475934760347613476234763347643476534766347673476834769347703477134772347733477434775347763477734778347793478034781347823478334784347853478634787347883478934790347913479234793347943479534796347973479834799348003480134802348033480434805348063480734808348093481034811348123481334814348153481634817348183481934820348213482234823348243482534826348273482834829348303483134832348333483434835348363483734838348393484034841348423484334844348453484634847348483484934850348513485234853348543485534856348573485834859348603486134862348633486434865348663486734868348693487034871348723487334874348753487634877348783487934880348813488234883348843488534886348873488834889348903489134892348933489434895348963489734898348993490034901349023490334904349053490634907349083490934910349113491234913349143491534916349173491834919349203492134922349233492434925349263492734928349293493034931349323493334934349353493634937349383493934940349413494234943349443494534946349473494834949349503495134952349533495434955349563495734958349593496034961349623496334964349653496634967349683496934970349713497234973349743497534976349773497834979349803498134982349833498434985349863498734988349893499034991349923499334994349953499634997349983499935000350013500235003350043500535006350073500835009350103501135012350133501435015350163501735018350193502035021350223502335024350253502635027350283502935030350313503235033350343503535036350373503835039350403504135042350433504435045350463504735048350493505035051350523505335054350553505635057350583505935060350613506235063350643506535066350673506835069350703507135072350733507435075350763507735078350793508035081350823508335084350853508635087350883508935090350913509235093350943509535096350973509835099351003510135102351033510435105351063510735108351093511035111351123511335114351153511635117351183511935120351213512235123351243512535126351273512835129351303513135132351333513435135351363513735138351393514035141351423514335144351453514635147351483514935150351513515235153351543515535156351573515835159351603516135162351633516435165351663516735168351693517035171351723517335174351753517635177351783517935180351813518235183351843518535186351873518835189351903519135192351933519435195351963519735198351993520035201352023520335204352053520635207352083520935210352113521235213352143521535216352173521835219352203522135222352233522435225352263522735228352293523035231352323523335234352353523635237352383523935240352413524235243352443524535246352473524835249352503525135252352533525435255352563525735258352593526035261352623526335264352653526635267352683526935270352713527235273352743527535276352773527835279352803528135282352833528435285352863528735288352893529035291352923529335294352953529635297352983529935300353013530235303353043530535306353073530835309353103531135312353133531435315353163531735318353193532035321353223532335324353253532635327353283532935330353313533235333353343533535336353373533835339353403534135342353433534435345353463534735348353493535035351353523535335354353553535635357353583535935360353613536235363353643536535366353673536835369353703537135372353733537435375353763537735378353793538035381353823538335384353853538635387353883538935390353913539235393353943539535396353973539835399354003540135402354033540435405354063540735408354093541035411354123541335414354153541635417354183541935420354213542235423354243542535426354273542835429354303543135432354333543435435354363543735438354393544035441354423544335444354453544635447354483544935450354513545235453354543545535456354573545835459354603546135462354633546435465354663546735468354693547035471354723547335474354753547635477354783547935480354813548235483354843548535486354873548835489354903549135492354933549435495354963549735498354993550035501355023550335504355053550635507355083550935510355113551235513355143551535516355173551835519355203552135522355233552435525355263552735528355293553035531355323553335534355353553635537355383553935540355413554235543355443554535546355473554835549355503555135552355533555435555355563555735558355593556035561355623556335564355653556635567355683556935570355713557235573355743557535576355773557835579355803558135582355833558435585355863558735588355893559035591355923559335594355953559635597355983559935600356013560235603356043560535606356073560835609356103561135612356133561435615356163561735618356193562035621356223562335624356253562635627356283562935630356313563235633356343563535636356373563835639356403564135642356433564435645356463564735648356493565035651356523565335654356553565635657356583565935660356613566235663356643566535666356673566835669356703567135672356733567435675356763567735678356793568035681356823568335684356853568635687356883568935690356913569235693356943569535696356973569835699357003570135702357033570435705357063570735708357093571035711357123571335714357153571635717357183571935720357213572235723357243572535726357273572835729357303573135732357333573435735357363573735738357393574035741357423574335744357453574635747357483574935750357513575235753357543575535756357573575835759357603576135762357633576435765357663576735768357693577035771357723577335774357753577635777357783577935780357813578235783357843578535786357873578835789357903579135792357933579435795357963579735798357993580035801358023580335804358053580635807358083580935810358113581235813358143581535816358173581835819358203582135822358233582435825358263582735828358293583035831358323583335834358353583635837358383583935840358413584235843358443584535846358473584835849358503585135852358533585435855358563585735858358593586035861358623586335864358653586635867358683586935870358713587235873358743587535876358773587835879358803588135882358833588435885358863588735888358893589035891358923589335894358953589635897358983589935900359013590235903359043590535906359073590835909359103591135912359133591435915359163591735918359193592035921359223592335924359253592635927359283592935930359313593235933359343593535936359373593835939359403594135942359433594435945359463594735948359493595035951359523595335954359553595635957359583595935960359613596235963359643596535966359673596835969359703597135972359733597435975359763597735978359793598035981359823598335984359853598635987359883598935990359913599235993359943599535996359973599835999360003600136002360033600436005360063600736008360093601036011360123601336014360153601636017360183601936020360213602236023360243602536026360273602836029360303603136032360333603436035360363603736038360393604036041360423604336044360453604636047360483604936050360513605236053360543605536056360573605836059360603606136062360633606436065360663606736068360693607036071360723607336074360753607636077360783607936080360813608236083360843608536086360873608836089360903609136092360933609436095360963609736098360993610036101361023610336104361053610636107361083610936110361113611236113361143611536116361173611836119361203612136122361233612436125361263612736128361293613036131361323613336134361353613636137361383613936140361413614236143361443614536146361473614836149361503615136152361533615436155361563615736158361593616036161361623616336164361653616636167361683616936170361713617236173361743617536176361773617836179361803618136182361833618436185361863618736188361893619036191361923619336194361953619636197361983619936200362013620236203362043620536206362073620836209362103621136212362133621436215362163621736218362193622036221362223622336224362253622636227362283622936230362313623236233362343623536236362373623836239362403624136242362433624436245362463624736248362493625036251362523625336254362553625636257362583625936260362613626236263362643626536266362673626836269362703627136272362733627436275362763627736278362793628036281362823628336284362853628636287362883628936290362913629236293362943629536296362973629836299363003630136302363033630436305363063630736308363093631036311363123631336314363153631636317363183631936320363213632236323363243632536326363273632836329363303633136332363333633436335363363633736338363393634036341363423634336344363453634636347363483634936350363513635236353363543635536356363573635836359363603636136362363633636436365363663636736368363693637036371363723637336374363753637636377363783637936380363813638236383363843638536386363873638836389363903639136392363933639436395363963639736398363993640036401364023640336404364053640636407364083640936410364113641236413364143641536416364173641836419364203642136422364233642436425364263642736428364293643036431364323643336434364353643636437364383643936440364413644236443364443644536446364473644836449364503645136452364533645436455364563645736458364593646036461364623646336464364653646636467364683646936470364713647236473364743647536476364773647836479364803648136482364833648436485364863648736488364893649036491364923649336494364953649636497364983649936500365013650236503365043650536506365073650836509365103651136512365133651436515365163651736518365193652036521365223652336524365253652636527365283652936530365313653236533365343653536536365373653836539365403654136542365433654436545365463654736548365493655036551365523655336554365553655636557365583655936560365613656236563365643656536566365673656836569365703657136572365733657436575365763657736578365793658036581365823658336584365853658636587365883658936590365913659236593365943659536596365973659836599366003660136602366033660436605366063660736608366093661036611366123661336614366153661636617366183661936620366213662236623366243662536626366273662836629366303663136632366333663436635366363663736638366393664036641366423664336644366453664636647366483664936650366513665236653366543665536656366573665836659366603666136662366633666436665366663666736668366693667036671366723667336674366753667636677366783667936680366813668236683366843668536686366873668836689366903669136692366933669436695366963669736698366993670036701367023670336704367053670636707367083670936710367113671236713367143671536716367173671836719367203672136722367233672436725367263672736728367293673036731367323673336734367353673636737367383673936740367413674236743367443674536746367473674836749367503675136752367533675436755367563675736758367593676036761367623676336764367653676636767367683676936770367713677236773367743677536776367773677836779367803678136782367833678436785367863678736788367893679036791367923679336794367953679636797367983679936800368013680236803368043680536806368073680836809368103681136812368133681436815368163681736818368193682036821368223682336824368253682636827368283682936830368313683236833368343683536836368373683836839368403684136842368433684436845368463684736848368493685036851368523685336854368553685636857368583685936860368613686236863368643686536866368673686836869368703687136872368733687436875368763687736878368793688036881368823688336884368853688636887368883688936890368913689236893368943689536896368973689836899369003690136902369033690436905369063690736908369093691036911369123691336914369153691636917369183691936920369213692236923369243692536926369273692836929369303693136932369333693436935369363693736938369393694036941369423694336944369453694636947369483694936950369513695236953369543695536956369573695836959369603696136962369633696436965369663696736968369693697036971369723697336974369753697636977369783697936980369813698236983369843698536986369873698836989369903699136992369933699436995369963699736998369993700037001370023700337004370053700637007370083700937010370113701237013370143701537016370173701837019370203702137022370233702437025370263702737028370293703037031370323703337034370353703637037370383703937040370413704237043370443704537046370473704837049370503705137052370533705437055370563705737058370593706037061370623706337064370653706637067370683706937070370713707237073370743707537076370773707837079370803708137082370833708437085370863708737088370893709037091370923709337094370953709637097370983709937100371013710237103371043710537106371073710837109371103711137112371133711437115371163711737118371193712037121371223712337124371253712637127371283712937130371313713237133371343713537136371373713837139371403714137142371433714437145371463714737148371493715037151371523715337154371553715637157371583715937160371613716237163371643716537166371673716837169371703717137172371733717437175371763717737178371793718037181371823718337184371853718637187371883718937190371913719237193371943719537196371973719837199372003720137202372033720437205372063720737208372093721037211372123721337214372153721637217372183721937220372213722237223372243722537226372273722837229372303723137232372333723437235372363723737238372393724037241372423724337244372453724637247372483724937250372513725237253372543725537256372573725837259372603726137262372633726437265372663726737268372693727037271372723727337274372753727637277372783727937280372813728237283372843728537286372873728837289372903729137292372933729437295372963729737298372993730037301373023730337304373053730637307373083730937310373113731237313373143731537316373173731837319373203732137322373233732437325373263732737328373293733037331373323733337334373353733637337373383733937340373413734237343373443734537346373473734837349373503735137352373533735437355373563735737358373593736037361373623736337364373653736637367373683736937370373713737237373373743737537376373773737837379373803738137382373833738437385373863738737388373893739037391373923739337394373953739637397373983739937400374013740237403374043740537406374073740837409374103741137412374133741437415374163741737418374193742037421374223742337424374253742637427374283742937430374313743237433374343743537436374373743837439374403744137442374433744437445374463744737448374493745037451374523745337454374553745637457374583745937460374613746237463374643746537466374673746837469374703747137472374733747437475374763747737478374793748037481374823748337484374853748637487374883748937490374913749237493374943749537496374973749837499375003750137502375033750437505375063750737508375093751037511375123751337514375153751637517375183751937520375213752237523375243752537526375273752837529375303753137532375333753437535375363753737538375393754037541375423754337544375453754637547375483754937550375513755237553375543755537556375573755837559375603756137562375633756437565375663756737568375693757037571375723757337574375753757637577375783757937580375813758237583375843758537586375873758837589375903759137592375933759437595375963759737598375993760037601376023760337604376053760637607376083760937610376113761237613376143761537616376173761837619376203762137622376233762437625376263762737628376293763037631376323763337634376353763637637376383763937640376413764237643376443764537646376473764837649376503765137652376533765437655376563765737658376593766037661376623766337664376653766637667376683766937670376713767237673376743767537676376773767837679376803768137682376833768437685376863768737688376893769037691376923769337694376953769637697376983769937700377013770237703377043770537706377073770837709377103771137712377133771437715377163771737718377193772037721377223772337724377253772637727377283772937730377313773237733377343773537736377373773837739377403774137742377433774437745377463774737748377493775037751377523775337754377553775637757377583775937760
  1. /* internal.c
  2. *
  3. * Copyright (C) 2006-2023 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. /*
  26. * WOLFSSL_SMALL_CERT_VERIFY:
  27. * Verify the certificate signature without using DecodedCert. Doubles up
  28. * on some code but allows smaller peak heap memory usage.
  29. * Cannot be used with WOLFSSL_NONBLOCK_OCSP.
  30. * WOLFSSL_ALT_CERT_CHAINS:
  31. * Allows CA's to be presented by peer, but not part of a valid chain.
  32. * Default wolfSSL behavior is to require validation of all presented peer
  33. * certificates. This also allows loading intermediate CA's as trusted
  34. * and ignoring no signer failures for CA's up the chain to root.
  35. * WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT:
  36. * Enable resending the previous DTLS handshake flight only on a network
  37. * read timeout. By default we resend in two more cases, when we receive:
  38. * - an out of order last msg of the peer's flight
  39. * - a duplicate of the first msg from the peer's flight
  40. * WOLFSSL_NO_DEF_TICKET_ENC_CB:
  41. * No default ticket encryption callback.
  42. * Server only.
  43. * Application must set its own callback to use session tickets.
  44. * WOLFSSL_TICKET_ENC_CHACHA20_POLY1305
  45. * Use ChaCha20-Poly1305 to encrypt/decrypt session tickets in default
  46. * callback. Default algorithm if none defined and algorithms compiled in.
  47. * Server only.
  48. * WOLFSSL_TICKET_ENC_AES128_GCM
  49. * Use AES128-GCM to encrypt/decrypt session tickets in default callback.
  50. * Server only. Default algorithm if ChaCha20/Poly1305 not compiled in.
  51. * WOLFSSL_TICKET_ENC_AES256_GCM
  52. * Use AES256-GCM to encrypt/decrypt session tickets in default callback.
  53. * Server only.
  54. * WOLFSSL_TICKET_DECRYPT_NO_CREATE
  55. * Default callback will not request creation of new ticket on successful
  56. * decryption.
  57. * Server only.
  58. * WOLFSSL_TLS13_NO_PEEK_HANDSHAKE_DONE
  59. * Once a normal TLS 1.3 handshake is complete, a session ticket message
  60. * may be received by a client. To support detecting this, peek will
  61. * return WOLFSSL_ERROR_WANT_READ.
  62. * This define turns off this behaviour.
  63. * WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY
  64. * Verify hostname/ip address using alternate name (SAN) only and do not
  65. * use the common name. Forces use of the alternate name, so certificates
  66. * missing SAN will be rejected during the handshake
  67. * WOLFSSL_CHECK_SIG_FAULTS
  68. * Verifies the ECC signature after signing in case of faults in the
  69. * calculation of the signature. Useful when signature fault injection is a
  70. * possible attack.
  71. * WOLFSSL_TLS13_IGNORE_AEAD_LIMITS
  72. * Ignore the AEAD limits for messages specified in the RFC. After
  73. * reaching the limit, we initiate a key update. We enforce the AEAD limits
  74. * by default.
  75. * https://www.rfc-editor.org/rfc/rfc8446#section-5.5
  76. * https://www.rfc-editor.org/rfc/rfc9147.html#name-aead-limits
  77. * WOLFSSL_HARDEN_TLS
  78. * Implement the recommendations specified in RFC9325. This macro needs to
  79. * be defined to the desired number of bits of security. The currently
  80. * implemented values are 112 and 128 bits. The following macros disable
  81. * certain checks.
  82. * - WOLFSSL_HARDEN_TLS_ALLOW_TRUNCATED_HMAC
  83. * - WOLFSSL_HARDEN_TLS_ALLOW_OLD_TLS
  84. * - WOLFSSL_HARDEN_TLS_NO_SCR_CHECK
  85. * - WOLFSSL_HARDEN_TLS_NO_PKEY_CHECK
  86. * - WOLFSSL_HARDEN_TLS_ALLOW_ALL_CIPHERSUITES
  87. */
  88. #ifdef EXTERNAL_OPTS_OPENVPN
  89. #error EXTERNAL_OPTS_OPENVPN should not be defined\
  90. when building wolfSSL
  91. #endif
  92. #ifndef WOLFCRYPT_ONLY
  93. #include <wolfssl/internal.h>
  94. #include <wolfssl/error-ssl.h>
  95. #include <wolfssl/wolfcrypt/asn.h>
  96. #include <wolfssl/wolfcrypt/dh.h>
  97. #ifdef NO_INLINE
  98. #include <wolfssl/wolfcrypt/misc.h>
  99. #else
  100. #define WOLFSSL_MISC_INCLUDED
  101. #include <wolfcrypt/src/misc.c>
  102. #endif
  103. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA)
  104. #include <wolfssl/wolfcrypt/srp.h>
  105. #endif
  106. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  107. #include <wolfssl/wolfcrypt/coding.h>
  108. #endif
  109. #ifdef HAVE_LIBZ
  110. #include "zlib.h"
  111. #endif
  112. #ifdef WOLFSSL_QNX_CAAM
  113. /* included to get CAAM devId value */
  114. #include <wolfssl/wolfcrypt/port/caam/wolfcaam.h>
  115. #endif
  116. #if defined(DEBUG_WOLFSSL) || defined(SHOW_SECRETS) || \
  117. defined(CHACHA_AEAD_TEST) || defined(WOLFSSL_SESSION_EXPORT_DEBUG)
  118. #ifndef NO_STDIO_FILESYSTEM
  119. #ifdef FUSION_RTOS
  120. #include <fclstdio.h>
  121. #else
  122. #include <stdio.h>
  123. #endif
  124. #endif
  125. #endif
  126. #ifdef __sun
  127. #include <sys/filio.h>
  128. #endif
  129. #define ERROR_OUT(err, eLabel) { ret = (err); goto eLabel; }
  130. #ifdef _MSC_VER
  131. /* disable for while(0) cases at the .c level for now */
  132. #pragma warning(disable:4127)
  133. #endif
  134. #if defined(WOLFSSL_CALLBACKS) && !defined(LARGE_STATIC_BUFFERS)
  135. #error \
  136. WOLFSSL_CALLBACKS needs LARGE_STATIC_BUFFERS, please add LARGE_STATIC_BUFFERS
  137. #endif
  138. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(HAVE_RENEGOTIATION_INDICATION)
  139. #error Cannot use both secure-renegotiation and renegotiation-indication
  140. #endif
  141. #ifndef WOLFSSL_NO_TLS12
  142. #ifndef NO_WOLFSSL_CLIENT
  143. static int DoServerKeyExchange(WOLFSSL* ssl, const byte* input,
  144. word32* inOutIdx, word32 size);
  145. #ifndef NO_CERTS
  146. static int DoCertificateRequest(WOLFSSL* ssl, const byte* input,
  147. word32* inOutIdx, word32 size);
  148. #endif
  149. #ifdef HAVE_SESSION_TICKET
  150. static int DoSessionTicket(WOLFSSL* ssl, const byte* input,
  151. word32* inOutIdx, word32 size);
  152. #endif
  153. #endif
  154. #ifndef NO_WOLFSSL_SERVER
  155. static int DoClientKeyExchange(WOLFSSL* ssl, byte* input,
  156. word32* inOutIdx, word32 size);
  157. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  158. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  159. static int DoCertificateVerify(WOLFSSL* ssl, byte* input,
  160. word32* inOutIdx, word32 size);
  161. #endif
  162. #endif /* !NO_WOLFSSL_SERVER */
  163. #endif /* !WOLFSSL_NO_TLS12 */
  164. #ifndef NO_WOLFSSL_SERVER
  165. #if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB)
  166. static int TicketEncCbCtx_Init(WOLFSSL_CTX* ctx,
  167. TicketEncCbCtx* keyCtx);
  168. static void TicketEncCbCtx_Free(TicketEncCbCtx* keyCtx);
  169. static int DefTicketEncCb(WOLFSSL* ssl,
  170. byte key_name[WOLFSSL_TICKET_NAME_SZ],
  171. byte iv[WOLFSSL_TICKET_IV_SZ],
  172. byte mac[WOLFSSL_TICKET_MAC_SZ],
  173. int enc, byte* ticket, int inLen, int* outLen,
  174. void* userCtx);
  175. #endif
  176. #endif
  177. #ifdef WOLFSSL_DTLS
  178. static int _DtlsCheckWindow(WOLFSSL* ssl);
  179. static int _DtlsUpdateWindow(WOLFSSL* ssl);
  180. #endif
  181. #ifdef WOLFSSL_DTLS13
  182. #ifndef WOLFSSL_DTLS13_SEND_MOREACK_DEFAULT
  183. #define WOLFSSL_DTLS13_SEND_MOREACK_DEFAULT 0
  184. #endif
  185. #endif /* WOLFSSL_DTLS13 */
  186. enum processReply {
  187. doProcessInit = 0,
  188. #ifndef NO_WOLFSSL_SERVER
  189. runProcessOldClientHello,
  190. #endif
  191. getRecordLayerHeader,
  192. getData,
  193. verifyEncryptedMessage,
  194. decryptMessage,
  195. verifyMessage,
  196. runProcessingOneRecord,
  197. runProcessingOneMessage
  198. };
  199. #ifndef WOLFSSL_NO_TLS12
  200. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  201. /* Server random bytes for TLS v1.3 described downgrade protection mechanism. */
  202. static const byte tls13Downgrade[7] = {
  203. 0x44, 0x4f, 0x57, 0x4e, 0x47, 0x52, 0x44
  204. };
  205. #define TLS13_DOWNGRADE_SZ sizeof(tls13Downgrade)
  206. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  207. #if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
  208. static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
  209. int padLen, int content, int verify, int epochOrder);
  210. #endif
  211. #endif /* !WOLFSSL_NO_TLS12 */
  212. #if defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_TSIP_TLS)
  213. #include <wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h>
  214. #endif
  215. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  216. static int SessionSecret_callback(WOLFSSL* ssl, void* secret,
  217. int* secretSz, void* ctx);
  218. #ifdef WOLFSSL_TLS13
  219. static int SessionSecret_callback_Tls13(WOLFSSL* ssl, int id,
  220. const unsigned char* secret, int secretSz, void* ctx);
  221. #endif
  222. /* Label string for client random. */
  223. #define SSC_CR "CLIENT_RANDOM"
  224. /*
  225. * This function builds up string for key-logging then call user's
  226. * key-log-callback to pass the string for TLS1.2 and older.
  227. * The user's key-logging callback has been set via
  228. * wolfSSL_CTX_set_keylog_callback function. The logging string format is:
  229. * "CLIENT_RANDOM <hex-encoded client random> <hex-encoded master-secret>"
  230. * parameter
  231. * - ssl: WOLFSSL object
  232. * - secret: pointer to the buffer holding master-secret
  233. * - secretSz: size of secret
  234. * - ctx: not used
  235. * returns 0 on success, negative value on failure.
  236. */
  237. static int SessionSecret_callback(WOLFSSL* ssl, void* secret,
  238. int* secretSz, void* ctx)
  239. {
  240. wolfSSL_CTX_keylog_cb_func logCb = NULL;
  241. int msSz;
  242. int hasVal;
  243. int i;
  244. const char* label = SSC_CR;
  245. int labelSz = sizeof(SSC_CR);
  246. int buffSz;
  247. byte* log = NULL;
  248. word32 outSz;
  249. int idx;
  250. int ret;
  251. (void)ctx;
  252. if (ssl == NULL || secret == NULL || *secretSz == 0)
  253. return BAD_FUNC_ARG;
  254. if (ssl->arrays == NULL)
  255. return BAD_FUNC_ARG;
  256. /* get the user-callback func from CTX*/
  257. logCb = ssl->ctx->keyLogCb;
  258. if (logCb == NULL)
  259. return 0;
  260. /* need to make sure the given master-secret has a meaningful value */
  261. msSz = *secretSz;
  262. hasVal = 0;
  263. for (i = 0; i < msSz; i++) {
  264. if (*((byte*)secret) != 0) {
  265. hasVal = 1;
  266. break;
  267. }
  268. }
  269. if (hasVal == 0)
  270. return 0; /* master-secret looks invalid */
  271. /* build up a hex-decoded keylog string
  272. "CLIENT_RANDOM <hex-encoded client random> <hex-encoded master-secret>"
  273. note that each keylog string does not have CR/LF.
  274. */
  275. buffSz = labelSz + (RAN_LEN * 2) + 1 + ((*secretSz) * 2) + 1;
  276. log = XMALLOC(buffSz, ssl->heap, DYNAMIC_TYPE_SECRET);
  277. if (log == NULL)
  278. return MEMORY_E;
  279. #ifdef WOLFSSL_CHECK_MEM_ZERO
  280. wc_MemZero_Add("SessionSecret log", log, buffSz);
  281. #endif
  282. XMEMSET(log, 0, buffSz);
  283. XMEMCPY(log, label, labelSz -1); /* put label w/o terminator */
  284. log[labelSz - 1] = ' '; /* '\0' -> ' ' */
  285. idx = labelSz;
  286. outSz = buffSz - idx;
  287. if ((ret = Base16_Encode(ssl->arrays->clientRandom, RAN_LEN,
  288. log + idx, &outSz)) == 0) {
  289. idx += (outSz - 1); /* reduce terminator byte */
  290. outSz = buffSz - idx;
  291. if (outSz > 1) {
  292. log[idx++] = ' '; /* add space*/
  293. outSz = buffSz - idx;
  294. if ((ret = Base16_Encode((byte*)secret, *secretSz,
  295. log + idx, &outSz)) == 0) {
  296. /* pass the log to the client callback*/
  297. logCb(ssl, (char*)log);
  298. ret = 0;
  299. }
  300. }
  301. else
  302. ret = MEMORY_E;
  303. }
  304. /* Zero out Base16 encoded secret and other data. */
  305. ForceZero(log, buffSz);
  306. XFREE(log, ssl->heap, DYNAMIC_TYPE_SECRET);
  307. return ret;
  308. }
  309. #if defined(WOLFSSL_TLS13)
  310. /* Label string for client early traffic secret. */
  311. #define SSC_TLS13_CETS "CLIENT_EARLY_TRAFFIC_SECRET"
  312. /* Label string for client handshake traffic secret. */
  313. #define SSC_TLS13_CHTS "CLIENT_HANDSHAKE_TRAFFIC_SECRET"
  314. /* Label string for server handshake traffic secret. */
  315. #define SSC_TLS13_SHTS "SERVER_HANDSHAKE_TRAFFIC_SECRET"
  316. /* Label string for client traffic secret. */
  317. #define SSC_TLS13_CTS "CLIENT_TRAFFIC_SECRET_0"
  318. /* Label string for server traffic secret. */
  319. #define SSC_TLS13_STS "SERVER_TRAFFIC_SECRET_0"
  320. /* Label string for early exporter secret. */
  321. #define SSC_TLS13_EES "EARLY_EXPORTER_SECRET"
  322. /* Label string for exporter secret. */
  323. #define SSC_TLS13_ES "EXPORTER_SECRET"
  324. /*
  325. * This function builds up string for key-logging then call user's
  326. * key-log-callback to pass the string for TLS1.3.
  327. * The user's key-logging callback has been set via
  328. * wolfSSL_CTX_set_keylog_callback function. The logging string format is:
  329. * "<Label> <hex-encoded client random> <hex-encoded secret>"
  330. *
  331. * parameter
  332. * - ssl: WOLFSSL object
  333. * - id: type of secret for logging
  334. * - secret: pointer to the buffer holding secret
  335. * - secretSz: size of secret
  336. * - ctx: not used
  337. * returns 0 on success, negative value on failure.
  338. */
  339. static int SessionSecret_callback_Tls13(WOLFSSL* ssl, int id,
  340. const unsigned char* secret, int secretSz, void* ctx)
  341. {
  342. wolfSSL_CTX_keylog_cb_func logCb = NULL;
  343. const char* label;
  344. int labelSz = 0;
  345. int buffSz = 0;
  346. byte* log = NULL;
  347. word32 outSz;
  348. int idx;
  349. int ret;
  350. (void)ctx;
  351. if (ssl == NULL || secret == NULL || secretSz == 0)
  352. return BAD_FUNC_ARG;
  353. if (ssl->arrays == NULL)
  354. return BAD_FUNC_ARG;
  355. /* get the user-callback func from CTX*/
  356. logCb = ssl->ctx->keyLogCb;
  357. if (logCb == NULL)
  358. return 0;
  359. switch (id) {
  360. case CLIENT_EARLY_TRAFFIC_SECRET:
  361. labelSz = sizeof(SSC_TLS13_CETS);
  362. label = SSC_TLS13_CETS;
  363. break;
  364. case CLIENT_HANDSHAKE_TRAFFIC_SECRET:
  365. labelSz = sizeof(SSC_TLS13_CHTS);
  366. label = SSC_TLS13_CHTS;
  367. break;
  368. case SERVER_HANDSHAKE_TRAFFIC_SECRET:
  369. labelSz = sizeof(SSC_TLS13_SHTS);
  370. label = SSC_TLS13_SHTS;
  371. break;
  372. case CLIENT_TRAFFIC_SECRET:
  373. labelSz = sizeof(SSC_TLS13_CTS);
  374. label = SSC_TLS13_CTS;
  375. break;
  376. case SERVER_TRAFFIC_SECRET:
  377. labelSz = sizeof(SSC_TLS13_STS);
  378. label = SSC_TLS13_STS;
  379. break;
  380. case EARLY_EXPORTER_SECRET:
  381. labelSz = sizeof(SSC_TLS13_EES);
  382. label = SSC_TLS13_EES;
  383. break;
  384. case EXPORTER_SECRET:
  385. labelSz = sizeof(SSC_TLS13_ES);
  386. label = SSC_TLS13_ES;
  387. break;
  388. default:
  389. return BAD_FUNC_ARG;
  390. }
  391. /* prepare a log string for passing user callback
  392. * "<Label> <hex-encoded client random> <hex-encoded secret>" */
  393. buffSz = labelSz + (RAN_LEN * 2) + 1 + secretSz * 2 + 1;
  394. log = XMALLOC(buffSz, ssl->heap, DYNAMIC_TYPE_SECRET);
  395. if (log == NULL)
  396. return MEMORY_E;
  397. #ifdef WOLFSSL_CHECK_MEM_ZERO
  398. wc_MemZero_Add("SessionSecret log", log, buffSz);
  399. #endif
  400. XMEMSET(log, 0, buffSz);
  401. XMEMCPY(log, label, labelSz - 1); /* put label w/o terminator */
  402. log[labelSz - 1] = ' '; /* '\0' -> ' ' */
  403. idx = labelSz;
  404. outSz = buffSz - idx;
  405. if ((ret = Base16_Encode(ssl->arrays->clientRandom, RAN_LEN,
  406. log + idx, &outSz)) == 0) {
  407. idx += (outSz - 1); /* reduce terminator byte */
  408. outSz = buffSz - idx;
  409. if (outSz >1) {
  410. log[idx++] = ' '; /* add space*/
  411. outSz = buffSz - idx;
  412. if ((ret = Base16_Encode((byte*)secret, secretSz,
  413. log + idx, &outSz)) == 0) {
  414. logCb(ssl, (char*)log);
  415. ret = 0;
  416. }
  417. }
  418. else
  419. ret = MEMORY_E;
  420. }
  421. /* Zero out Base16 encoded secret and other data. */
  422. ForceZero(log, buffSz);
  423. XFREE(log, ssl->heap, DYNAMIC_TYPE_SECRET);
  424. return ret;
  425. }
  426. #endif /* WOLFSSL_TLS13*/
  427. #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK*/
  428. int IsTLS(const WOLFSSL* ssl)
  429. {
  430. if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_MINOR)
  431. return 1;
  432. return 0;
  433. }
  434. int IsAtLeastTLSv1_2(const WOLFSSL* ssl)
  435. {
  436. if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_2_MINOR)
  437. return 1;
  438. #ifdef WOLFSSL_DTLS
  439. if (ssl->version.major == DTLS_MAJOR && ssl->version.minor <= DTLSv1_2_MINOR)
  440. return 1;
  441. #endif
  442. return 0;
  443. }
  444. int IsAtLeastTLSv1_3(const ProtocolVersion pv)
  445. {
  446. int ret;
  447. ret = (pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_3_MINOR);
  448. #ifdef WOLFSSL_DTLS13
  449. if (ret == 0 && pv.major == DTLS_MAJOR && pv.minor <= DTLSv1_3_MINOR)
  450. return 1;
  451. #endif
  452. return ret;
  453. }
  454. int IsEncryptionOn(WOLFSSL* ssl, int isSend)
  455. {
  456. #ifdef WOLFSSL_DTLS
  457. /* For DTLS, epoch 0 is always not encrypted. */
  458. if (ssl->options.dtls && !isSend) {
  459. if (!IsAtLeastTLSv1_3(ssl->version) && ssl->keys.curEpoch == 0)
  460. return 0;
  461. #ifdef WOLFSSL_DTLS13
  462. else if (IsAtLeastTLSv1_3(ssl->version)
  463. && w64IsZero(ssl->keys.curEpoch64))
  464. return 0;
  465. #endif /* WOLFSSL_DTLS13 */
  466. }
  467. #endif /* WOLFSSL_DTLS */
  468. #ifdef WOLFSSL_QUIC
  469. if (WOLFSSL_IS_QUIC(ssl) && IsAtLeastTLSv1_3(ssl->version)) {
  470. return 0;
  471. }
  472. #endif
  473. return ssl->keys.encryptionOn &&
  474. (isSend ? ssl->encrypt.setup : ssl->decrypt.setup);
  475. }
  476. #ifdef WOLFSSL_DTLS
  477. /* Stream Control Transmission Protocol */
  478. /* If SCTP is not enabled returns the state of the dtls option.
  479. * If SCTP is enabled returns dtls && !sctp. */
  480. int IsDtlsNotSctpMode(WOLFSSL* ssl)
  481. {
  482. #ifdef WOLFSSL_SCTP
  483. return ssl->options.dtls && !ssl->options.dtlsSctp;
  484. #else
  485. return ssl->options.dtls;
  486. #endif
  487. }
  488. #if !defined(WOLFSSL_NO_TLS12) && !defined(NO_WOLFSSL_SERVER)
  489. /* Secure Real-time Transport Protocol */
  490. /* If SRTP is not enabled returns the state of the dtls option.
  491. * If SRTP is enabled returns dtls && !dtlsSrtpProfiles. */
  492. int IsDtlsNotSrtpMode(WOLFSSL* ssl)
  493. {
  494. #ifdef WOLFSSL_SRTP
  495. return ssl->options.dtls && !ssl->dtlsSrtpProfiles;
  496. #else
  497. return ssl->options.dtls;
  498. #endif
  499. }
  500. #endif /* !WOLFSSL_NO_TLS12 && !NO_WOLFSSL_SERVER */
  501. #endif /* WOLFSSL_DTLS */
  502. #ifdef HAVE_LIBZ
  503. /* alloc user allocs to work with zlib */
  504. static void* myAlloc(void* opaque, unsigned int item, unsigned int size)
  505. {
  506. (void)opaque;
  507. return (void *)XMALLOC(item * size, opaque, DYNAMIC_TYPE_LIBZ);
  508. }
  509. static void myFree(void* opaque, void* memory)
  510. {
  511. (void)opaque;
  512. XFREE(memory, opaque, DYNAMIC_TYPE_LIBZ);
  513. }
  514. /* init zlib comp/decomp streams, 0 on success */
  515. static int InitStreams(WOLFSSL* ssl)
  516. {
  517. ssl->c_stream.zalloc = (alloc_func)myAlloc;
  518. ssl->c_stream.zfree = (free_func)myFree;
  519. ssl->c_stream.opaque = (voidpf)ssl->heap;
  520. if (deflateInit(&ssl->c_stream, Z_DEFAULT_COMPRESSION) != Z_OK)
  521. return ZLIB_INIT_ERROR;
  522. ssl->didStreamInit = 1;
  523. ssl->d_stream.zalloc = (alloc_func)myAlloc;
  524. ssl->d_stream.zfree = (free_func)myFree;
  525. ssl->d_stream.opaque = (voidpf)ssl->heap;
  526. if (inflateInit(&ssl->d_stream) != Z_OK) return ZLIB_INIT_ERROR;
  527. return 0;
  528. }
  529. static void FreeStreams(WOLFSSL* ssl)
  530. {
  531. if (ssl->didStreamInit) {
  532. deflateEnd(&ssl->c_stream);
  533. inflateEnd(&ssl->d_stream);
  534. }
  535. }
  536. /* compress in to out, return out size or error */
  537. static int myCompress(WOLFSSL* ssl, byte* in, int inSz, byte* out, int outSz)
  538. {
  539. int err;
  540. int currTotal = (int)ssl->c_stream.total_out;
  541. ssl->c_stream.next_in = in;
  542. ssl->c_stream.avail_in = inSz;
  543. ssl->c_stream.next_out = out;
  544. ssl->c_stream.avail_out = outSz;
  545. err = deflate(&ssl->c_stream, Z_SYNC_FLUSH);
  546. if (err != Z_OK && err != Z_STREAM_END) return ZLIB_COMPRESS_ERROR;
  547. return (int)ssl->c_stream.total_out - currTotal;
  548. }
  549. /* decompress in to out, return out size or error */
  550. static int myDeCompress(WOLFSSL* ssl, byte* in,int inSz, byte* out,int outSz)
  551. {
  552. int err;
  553. int currTotal = (int)ssl->d_stream.total_out;
  554. ssl->d_stream.next_in = in;
  555. ssl->d_stream.avail_in = inSz;
  556. ssl->d_stream.next_out = out;
  557. ssl->d_stream.avail_out = outSz;
  558. err = inflate(&ssl->d_stream, Z_SYNC_FLUSH);
  559. if (err != Z_OK && err != Z_STREAM_END) return ZLIB_DECOMPRESS_ERROR;
  560. return (int)ssl->d_stream.total_out - currTotal;
  561. }
  562. #endif /* HAVE_LIBZ */
  563. #ifdef WOLFSSL_SESSION_EXPORT
  564. /**
  565. * serializes the cipher specs struct for exporting
  566. * @return the amount written to 'exp' buffer
  567. */
  568. static int ExportCipherSpecState(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  569. int type)
  570. {
  571. word32 idx = 0;
  572. CipherSpecs* specs;
  573. WOLFSSL_ENTER("ExportCipherSpecState");
  574. if (exp == NULL || ssl == NULL) {
  575. return BAD_FUNC_ARG;
  576. }
  577. specs = &ssl->specs;
  578. if (WOLFSSL_EXPORT_SPC_SZ > len) {
  579. return BUFFER_E;
  580. }
  581. XMEMSET(exp, 0, WOLFSSL_EXPORT_SPC_SZ);
  582. c16toa(specs->key_size, exp + idx); idx += OPAQUE16_LEN;
  583. c16toa(specs->iv_size, exp + idx); idx += OPAQUE16_LEN;
  584. c16toa(specs->block_size, exp + idx); idx += OPAQUE16_LEN;
  585. c16toa(specs->aead_mac_size, exp + idx); idx += OPAQUE16_LEN;
  586. exp[idx++] = specs->bulk_cipher_algorithm;
  587. exp[idx++] = specs->cipher_type;
  588. exp[idx++] = specs->mac_algorithm;
  589. exp[idx++] = specs->kea;
  590. exp[idx++] = specs->sig_algo;
  591. exp[idx++] = specs->hash_size;
  592. exp[idx++] = specs->pad_size;
  593. exp[idx++] = specs->static_ecdh;
  594. if (idx != WOLFSSL_EXPORT_SPC_SZ) {
  595. WOLFSSL_MSG("WOLFSSL_EXPORT_SPC_SZ needs updated and export version");
  596. return DTLS_EXPORT_VER_E;
  597. }
  598. /* send over state of AES too */
  599. if (type == WOLFSSL_EXPORT_TLS &&
  600. ssl->specs.bulk_cipher_algorithm == wolfssl_aes) {
  601. byte *pt = (byte*)ssl->encrypt.aes->reg;
  602. if ((idx + 2*AES_BLOCK_SIZE) > len) {
  603. WOLFSSL_MSG("Can not fit AES state into buffer");
  604. return BUFFER_E;
  605. }
  606. XMEMCPY(exp + idx, pt, AES_BLOCK_SIZE);
  607. idx += AES_BLOCK_SIZE;
  608. pt = (byte*)ssl->decrypt.aes->reg;
  609. XMEMCPY(exp + idx, pt, AES_BLOCK_SIZE);
  610. idx += AES_BLOCK_SIZE;
  611. }
  612. WOLFSSL_LEAVE("ExportCipherSpecState", idx);
  613. (void)ver;
  614. return idx;
  615. }
  616. /* serializes the key struct for exporting */
  617. static int ExportKeyState(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  618. byte small, int type)
  619. {
  620. word32 idx = 0;
  621. byte sz;
  622. Keys* keys;
  623. WOLFSSL_ENTER("ExportKeyState");
  624. if (exp == NULL || ssl == NULL) {
  625. return BAD_FUNC_ARG;
  626. }
  627. keys = &(ssl->keys);
  628. if (DTLS_EXPORT_MIN_KEY_SZ > len) {
  629. WOLFSSL_MSG("Buffer not large enough for minimum key struct size");
  630. return BUFFER_E;
  631. }
  632. XMEMSET(exp, 0, DTLS_EXPORT_MIN_KEY_SZ);
  633. c32toa(keys->peer_sequence_number_hi, exp + idx); idx += OPAQUE32_LEN;
  634. c32toa(keys->peer_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  635. c32toa(keys->sequence_number_hi, exp + idx); idx += OPAQUE32_LEN;
  636. c32toa(keys->sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  637. #if defined(WOLFSSL_DTLS)
  638. if (type == WOLFSSL_EXPORT_DTLS) {
  639. c16toa(keys->peerSeq[0].nextEpoch, exp + idx); idx += OPAQUE16_LEN;
  640. c16toa(keys->peerSeq[0].nextSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  641. c32toa(keys->peerSeq[0].nextSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  642. c16toa(keys->curEpoch, exp + idx); idx += OPAQUE16_LEN;
  643. c16toa(keys->curSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  644. c32toa(keys->curSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  645. c16toa(keys->peerSeq[0].prevSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  646. c32toa(keys->peerSeq[0].prevSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  647. c16toa(keys->dtls_peer_handshake_number, exp + idx);
  648. idx += OPAQUE16_LEN;
  649. c16toa(keys->dtls_expected_peer_handshake_number, exp + idx);
  650. idx += OPAQUE16_LEN;
  651. c16toa(keys->dtls_sequence_number_hi, exp + idx); idx += OPAQUE16_LEN;
  652. c32toa(keys->dtls_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  653. c16toa(keys->dtls_prev_sequence_number_hi, exp + idx);
  654. idx += OPAQUE16_LEN;
  655. c32toa(keys->dtls_prev_sequence_number_lo, exp + idx);
  656. idx += OPAQUE32_LEN;
  657. c16toa(keys->dtls_epoch, exp + idx); idx += OPAQUE16_LEN;
  658. c16toa(keys->dtls_handshake_number, exp + idx); idx += OPAQUE16_LEN;
  659. }
  660. #endif
  661. c32toa(keys->encryptSz, exp + idx); idx += OPAQUE32_LEN;
  662. c32toa(keys->padSz, exp + idx); idx += OPAQUE32_LEN;
  663. exp[idx++] = keys->encryptionOn;
  664. exp[idx++] = keys->decryptedCur;
  665. /* from here on the buffer needs checked because is variable length that
  666. * can be larger than DTLS_EXPORT_MIN_KEY_SZ */
  667. #ifdef WOLFSSL_DTLS
  668. if (type == WOLFSSL_EXPORT_DTLS) {
  669. word32 i;
  670. if ((OPAQUE16_LEN * 2) + idx +
  671. (2 * (WOLFSSL_DTLS_WINDOW_WORDS * OPAQUE32_LEN)) > len) {
  672. WOLFSSL_MSG("Buffer not large enough for WOLFSSL_DTLS_WINDOW_WORDS");
  673. return BUFFER_E;
  674. }
  675. c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
  676. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  677. c32toa(keys->peerSeq[0].window[i], exp + idx);
  678. idx += OPAQUE32_LEN;
  679. }
  680. c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
  681. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  682. c32toa(keys->peerSeq[0].prevWindow[i], exp + idx);
  683. idx += OPAQUE32_LEN;
  684. }
  685. }
  686. #endif
  687. if (idx >= len) {
  688. WOLFSSL_MSG("Buffer not large enough for truncated hmac flag");
  689. return BUFFER_E;
  690. }
  691. #ifdef HAVE_TRUNCATED_HMAC
  692. sz = ssl->truncated_hmac ? TRUNCATED_HMAC_SZ: ssl->specs.hash_size;
  693. exp[idx++] = ssl->truncated_hmac;
  694. #else
  695. sz = ssl->specs.hash_size;
  696. exp[idx++] = 0; /* no truncated hmac */
  697. #endif
  698. sz = (small)? 0: sz;
  699. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  700. WOLFSSL_MSG("Buffer not large enough for MAC secret");
  701. return BUFFER_E;
  702. }
  703. exp[idx++] = sz;
  704. if (sz > 0) {
  705. #ifndef WOLFSSL_AEAD_ONLY
  706. XMEMCPY(exp + idx, keys->client_write_MAC_secret, sz); idx += sz;
  707. XMEMCPY(exp + idx, keys->server_write_MAC_secret, sz); idx += sz;
  708. #else
  709. XMEMSET(exp + idx, 0, sz); idx += sz;
  710. XMEMSET(exp + idx, 0, sz); idx += sz;
  711. #endif
  712. }
  713. sz = (small)? 0: ssl->specs.key_size;
  714. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  715. WOLFSSL_MSG("Buffer not large enough for write key");
  716. return BUFFER_E;
  717. }
  718. exp[idx++] = sz;
  719. if (sz > 0) {
  720. XMEMCPY(exp + idx, keys->client_write_key, sz); idx += sz;
  721. XMEMCPY(exp + idx, keys->server_write_key, sz); idx += sz;
  722. }
  723. sz = (small)? 0: ssl->specs.iv_size;
  724. if (idx + (sz * 2) + OPAQUE8_LEN + AEAD_MAX_EXP_SZ > len) {
  725. WOLFSSL_MSG("Buffer not large enough for IVs");
  726. return BUFFER_E;
  727. }
  728. exp[idx++] = sz;
  729. if (sz > 0) {
  730. XMEMCPY(exp + idx, keys->client_write_IV, sz); idx += sz;
  731. XMEMCPY(exp + idx, keys->server_write_IV, sz); idx += sz;
  732. }
  733. XMEMCPY(exp + idx, keys->aead_exp_IV, AEAD_MAX_EXP_SZ);
  734. idx += AEAD_MAX_EXP_SZ;
  735. sz = (small)? 0: AEAD_MAX_IMP_SZ;
  736. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  737. WOLFSSL_MSG("Buffer not large enough for imp IVs");
  738. return BUFFER_E;
  739. }
  740. exp[idx++] = sz;
  741. if (sz > 0) {
  742. XMEMCPY(exp + idx, keys->aead_enc_imp_IV, sz); idx += sz;
  743. XMEMCPY(exp + idx, keys->aead_dec_imp_IV, sz); idx += sz;
  744. }
  745. /* DTLS_EXPORT_KEY_SZ is max value. idx size can vary */
  746. if (idx > DTLS_EXPORT_KEY_SZ) {
  747. WOLFSSL_MSG("DTLS_EXPORT_KEY_SZ needs updated and export version");
  748. return DTLS_EXPORT_VER_E;
  749. }
  750. WOLFSSL_LEAVE("ExportKeyState", idx);
  751. (void)ver;
  752. (void)type;
  753. return idx;
  754. }
  755. /**
  756. * Imports the buffer 'exp' into the 'ssl' CipherSpec structure.
  757. * @param ssl WOLFSSL structure to import into
  758. * @param exp input buffer to read from
  759. * @param len length of exp buffer
  760. * @param ver version of import buffer found
  761. * @param type flag for importing a TLS session or DTLS
  762. *
  763. * @return size of exp buffer consumed on success and negative value on fail
  764. */
  765. static int ImportCipherSpecState(WOLFSSL* ssl, const byte* exp, word32 len,
  766. byte ver, int type)
  767. {
  768. word32 idx = 0;
  769. CipherSpecs* specs;
  770. word32 tmp_seq_peer_lo;
  771. word32 tmp_seq_peer_hi;
  772. word32 tmp_seq_lo;
  773. word32 tmp_seq_hi;
  774. WOLFSSL_ENTER("ImportCipherSpecState");
  775. if (exp == NULL || ssl == NULL) {
  776. return BAD_FUNC_ARG;
  777. }
  778. specs= &(ssl->specs);
  779. if (WOLFSSL_EXPORT_SPC_SZ > len) {
  780. WOLFSSL_MSG("Buffer not large enough for max spec struct size");
  781. return BUFFER_E;
  782. }
  783. ato16(exp + idx, &specs->key_size); idx += OPAQUE16_LEN;
  784. ato16(exp + idx, &specs->iv_size); idx += OPAQUE16_LEN;
  785. ato16(exp + idx, &specs->block_size); idx += OPAQUE16_LEN;
  786. ato16(exp + idx, &specs->aead_mac_size); idx += OPAQUE16_LEN;
  787. specs->bulk_cipher_algorithm = exp[idx++];
  788. specs->cipher_type = exp[idx++];
  789. specs->mac_algorithm = exp[idx++];
  790. specs->kea = exp[idx++];
  791. specs->sig_algo = exp[idx++];
  792. specs->hash_size = exp[idx++];
  793. specs->pad_size = exp[idx++];
  794. specs->static_ecdh = exp[idx++];
  795. if (specs->pad_size != PAD_MD5 && specs->pad_size != PAD_SHA) {
  796. WOLFSSL_MSG("Importing bad or unknown pad size");
  797. return BAD_STATE_E;
  798. }
  799. /* temporarily save the sequence numbers */
  800. tmp_seq_peer_lo = ssl->keys.peer_sequence_number_lo;
  801. tmp_seq_peer_hi = ssl->keys.peer_sequence_number_hi;
  802. tmp_seq_lo = ssl->keys.sequence_number_lo;
  803. tmp_seq_hi = ssl->keys.sequence_number_hi;
  804. SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE);
  805. /* reset sequence numbers after setting keys */
  806. ssl->keys.peer_sequence_number_lo = tmp_seq_peer_lo;
  807. ssl->keys.peer_sequence_number_hi = tmp_seq_peer_hi;
  808. ssl->keys.sequence_number_lo = tmp_seq_lo;
  809. ssl->keys.sequence_number_hi = tmp_seq_hi;
  810. if (type == WOLFSSL_EXPORT_TLS &&
  811. ssl->specs.bulk_cipher_algorithm == wolfssl_aes) {
  812. byte *pt = (byte*)ssl->encrypt.aes->reg;
  813. XMEMCPY(pt, exp + idx, AES_BLOCK_SIZE);
  814. idx += AES_BLOCK_SIZE;
  815. pt = (byte*)ssl->decrypt.aes->reg;
  816. XMEMCPY(pt, exp + idx, AES_BLOCK_SIZE);
  817. idx += AES_BLOCK_SIZE;
  818. }
  819. WOLFSSL_LEAVE("ImportCipherSpecState", idx);
  820. (void)ver;
  821. return idx;
  822. }
  823. /**
  824. * Import the Key structure
  825. *
  826. * @param ssl WOLFSSL structure to import into
  827. * @param exp buffer to read Key values from
  828. * @param len max length of buffer 'exp'
  829. * @param ver version of import buffer found
  830. * @param type flag for TLS vs DTLS
  831. *
  832. * @return amount of data read from exp on success or negative on fail
  833. */
  834. static int ImportKeyState(WOLFSSL* ssl, const byte* exp, word32 len, byte ver,
  835. int type)
  836. {
  837. word32 idx = 0;
  838. byte sz;
  839. Keys *keys;
  840. WOLFSSL_ENTER("ImportKeyState");
  841. if (exp == NULL || ssl == NULL) {
  842. return BAD_FUNC_ARG;
  843. }
  844. keys = &(ssl->keys);
  845. /* check minimum length -- includes byte used for size indicators */
  846. if (len < DTLS_EXPORT_MIN_KEY_SZ) {
  847. WOLFSSL_MSG("Buffer not large enough for minimum expected size");
  848. return BUFFER_E;
  849. }
  850. ato32(exp + idx, &keys->peer_sequence_number_hi); idx += OPAQUE32_LEN;
  851. ato32(exp + idx, &keys->peer_sequence_number_lo); idx += OPAQUE32_LEN;
  852. ato32(exp + idx, &keys->sequence_number_hi); idx += OPAQUE32_LEN;
  853. ato32(exp + idx, &keys->sequence_number_lo); idx += OPAQUE32_LEN;
  854. #if defined(WOLFSSL_DTLS)
  855. if (type == WOLFSSL_EXPORT_DTLS) {
  856. ato16(exp + idx, &keys->peerSeq[0].nextEpoch); idx += OPAQUE16_LEN;
  857. ato16(exp + idx, &keys->peerSeq[0].nextSeq_hi); idx += OPAQUE16_LEN;
  858. ato32(exp + idx, &keys->peerSeq[0].nextSeq_lo); idx += OPAQUE32_LEN;
  859. ato16(exp + idx, &keys->curEpoch); idx += OPAQUE16_LEN;
  860. ato16(exp + idx, &keys->curSeq_hi); idx += OPAQUE16_LEN;
  861. ato32(exp + idx, &keys->curSeq_lo); idx += OPAQUE32_LEN;
  862. ato16(exp + idx, &keys->peerSeq[0].prevSeq_hi); idx += OPAQUE16_LEN;
  863. ato32(exp + idx, &keys->peerSeq[0].prevSeq_lo); idx += OPAQUE32_LEN;
  864. ato16(exp + idx, &keys->dtls_peer_handshake_number);
  865. idx += OPAQUE16_LEN;
  866. ato16(exp + idx, &keys->dtls_expected_peer_handshake_number);
  867. idx += OPAQUE16_LEN;
  868. ato16(exp + idx, &keys->dtls_sequence_number_hi); idx += OPAQUE16_LEN;
  869. ato32(exp + idx, &keys->dtls_sequence_number_lo); idx += OPAQUE32_LEN;
  870. ato16(exp + idx, &keys->dtls_prev_sequence_number_hi);
  871. idx += OPAQUE16_LEN;
  872. ato32(exp + idx, &keys->dtls_prev_sequence_number_lo);
  873. idx += OPAQUE32_LEN;
  874. ato16(exp + idx, &keys->dtls_epoch); idx += OPAQUE16_LEN;
  875. ato16(exp + idx, &keys->dtls_handshake_number); idx += OPAQUE16_LEN;
  876. }
  877. #endif
  878. ato32(exp + idx, &keys->encryptSz); idx += OPAQUE32_LEN;
  879. ato32(exp + idx, &keys->padSz); idx += OPAQUE32_LEN;
  880. keys->encryptionOn = exp[idx++];
  881. keys->decryptedCur = exp[idx++];
  882. #if defined(WOLFSSL_DTLS)
  883. if (type == WOLFSSL_EXPORT_DTLS) {
  884. word16 i, wordCount, wordAdj = 0;
  885. /* do window */
  886. ato16(exp + idx, &wordCount);
  887. idx += OPAQUE16_LEN;
  888. if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
  889. wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
  890. wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
  891. }
  892. XMEMSET(keys->peerSeq[0].window, 0xFF, DTLS_SEQ_SZ);
  893. for (i = 0; i < wordCount; i++) {
  894. ato32(exp + idx, &keys->peerSeq[0].window[i]);
  895. idx += OPAQUE32_LEN;
  896. }
  897. idx += wordAdj;
  898. /* do prevWindow */
  899. ato16(exp + idx, &wordCount);
  900. idx += OPAQUE16_LEN;
  901. if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
  902. wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
  903. wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
  904. }
  905. XMEMSET(keys->peerSeq[0].prevWindow, 0xFF, DTLS_SEQ_SZ);
  906. for (i = 0; i < wordCount; i++) {
  907. ato32(exp + idx, &keys->peerSeq[0].prevWindow[i]);
  908. idx += OPAQUE32_LEN;
  909. }
  910. idx += wordAdj;
  911. }
  912. #endif
  913. #ifdef HAVE_TRUNCATED_HMAC
  914. ssl->truncated_hmac = exp[idx++];
  915. #else
  916. idx++; /* no truncated hmac */
  917. #endif
  918. sz = exp[idx++];
  919. #ifndef WOLFSSL_AEAD_ONLY
  920. if (sz > sizeof(keys->client_write_MAC_secret) || (sz * 2) + idx > len) {
  921. WOLFSSL_MSG("Buffer not large enough for MAC import");
  922. return BUFFER_E;
  923. }
  924. if (sz > 0) {
  925. XMEMCPY(keys->client_write_MAC_secret, exp + idx, sz); idx += sz;
  926. XMEMCPY(keys->server_write_MAC_secret, exp + idx, sz); idx += sz;
  927. }
  928. #else
  929. if (sz + idx > len) {
  930. return BUFFER_E;
  931. }
  932. idx += sz; idx += sz;
  933. #endif
  934. sz = exp[idx++];
  935. if (sz > sizeof(keys->client_write_key) || (sz * 2) + idx > len) {
  936. WOLFSSL_MSG("Buffer not large enough for key import");
  937. return BUFFER_E;
  938. }
  939. if (sz > 0) {
  940. XMEMCPY(keys->client_write_key, exp + idx, sz); idx += sz;
  941. XMEMCPY(keys->server_write_key, exp + idx, sz); idx += sz;
  942. }
  943. sz = exp[idx++];
  944. if (sz > sizeof(keys->client_write_IV) || (sz * 2) + idx > len) {
  945. WOLFSSL_MSG("Buffer not large enough for write IV import");
  946. return BUFFER_E;
  947. }
  948. if (sz > 0) {
  949. XMEMCPY(keys->client_write_IV, exp + idx, sz); idx += sz;
  950. XMEMCPY(keys->server_write_IV, exp + idx, sz); idx += sz;
  951. }
  952. XMEMCPY(keys->aead_exp_IV, exp + idx, AEAD_MAX_EXP_SZ);
  953. idx += AEAD_MAX_EXP_SZ;
  954. sz = exp[idx++];
  955. if (sz > sizeof(keys->aead_enc_imp_IV) || (sz * 2) + idx > len) {
  956. WOLFSSL_MSG("Buffer not large enough for imp IV import");
  957. return BUFFER_E;
  958. }
  959. if (sz > 0) {
  960. XMEMCPY(keys->aead_enc_imp_IV, exp + idx, sz); idx += sz;
  961. XMEMCPY(keys->aead_dec_imp_IV, exp + idx, sz); idx += sz;
  962. }
  963. WOLFSSL_LEAVE("ImportKeyState", idx);
  964. (void)ver;
  965. (void)type;
  966. return idx;
  967. }
  968. /* copy over necessary information from Options struct to buffer
  969. * On success returns size of buffer used on failure returns a negative value */
  970. static int ExportOptions(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  971. int type)
  972. {
  973. int idx = 0;
  974. word16 zero = 0;
  975. Options *options;
  976. WOLFSSL_ENTER("ExportOptions");
  977. if (ssl == NULL || exp == NULL || len < DTLS_EXPORT_OPT_SZ) {
  978. return BAD_FUNC_ARG;
  979. }
  980. options = &ssl->options;
  981. if (options == NULL) {
  982. return BAD_FUNC_ARG;
  983. }
  984. XMEMSET(exp, 0, DTLS_EXPORT_OPT_SZ);
  985. /* these options are kept and sent to indicate verify status and strength
  986. * of handshake */
  987. exp[idx++] = options->sendVerify;
  988. exp[idx++] = options->verifyPeer;
  989. exp[idx++] = options->verifyNone;
  990. exp[idx++] = options->downgrade;
  991. #ifndef NO_DH
  992. c16toa(options->minDhKeySz, exp + idx); idx += OPAQUE16_LEN;
  993. c16toa(options->maxDhKeySz, exp + idx); idx += OPAQUE16_LEN;
  994. c16toa(options->dhKeySz, exp + idx); idx += OPAQUE16_LEN;
  995. #else
  996. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  997. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  998. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  999. #endif
  1000. #ifndef NO_RSA
  1001. c16toa((word16)(options->minRsaKeySz), exp + idx); idx += OPAQUE16_LEN;
  1002. #else
  1003. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  1004. #endif
  1005. #ifdef HAVE_ECC
  1006. c16toa((word16)(options->minEccKeySz), exp + idx); idx += OPAQUE16_LEN;
  1007. #else
  1008. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  1009. #endif
  1010. /* these options are kept to indicate state and behavior */
  1011. #ifndef NO_PSK
  1012. exp[idx++] = options->havePSK;
  1013. #else
  1014. exp[idx++] = 0;
  1015. #endif
  1016. exp[idx++] = options->sessionCacheOff;
  1017. exp[idx++] = options->sessionCacheFlushOff;
  1018. exp[idx++] = options->side;
  1019. exp[idx++] = options->resuming;
  1020. exp[idx++] = options->haveSessionId;
  1021. exp[idx++] = options->tls;
  1022. exp[idx++] = options->tls1_1;
  1023. exp[idx++] = options->dtls;
  1024. exp[idx++] = options->connReset;
  1025. exp[idx++] = options->isClosed;
  1026. exp[idx++] = options->closeNotify;
  1027. exp[idx++] = options->sentNotify;
  1028. exp[idx++] = options->usingCompression;
  1029. exp[idx++] = options->haveRSA;
  1030. exp[idx++] = options->haveECC;
  1031. exp[idx++] = options->haveDH;
  1032. exp[idx++] = 0; /* Historical: haveNTRU */
  1033. exp[idx++] = 0; /* Historical: haveQSH */
  1034. exp[idx++] = options->haveECDSAsig;
  1035. exp[idx++] = options->haveStaticECC;
  1036. exp[idx++] = options->havePeerVerify;
  1037. exp[idx++] = options->usingPSK_cipher;
  1038. exp[idx++] = options->usingAnon_cipher;
  1039. exp[idx++] = 0; /* Historical: options->sendAlertState */
  1040. exp[idx++] = options->partialWrite;
  1041. exp[idx++] = options->quietShutdown;
  1042. exp[idx++] = options->groupMessages;
  1043. #ifdef HAVE_POLY1305
  1044. exp[idx++] = options->oldPoly;
  1045. #else
  1046. exp[idx++] = 0;
  1047. #endif
  1048. #ifdef HAVE_ANON
  1049. exp[idx++] = options->haveAnon;
  1050. #else
  1051. exp[idx++] = 0;
  1052. #endif
  1053. #ifdef HAVE_SESSION_TICKET
  1054. exp[idx++] = options->createTicket;
  1055. exp[idx++] = options->useTicket;
  1056. exp[idx++] = options->noTicketTls12;
  1057. #ifdef WOLFSSL_TLS13
  1058. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1059. exp[idx++] = options->noTicketTls13;
  1060. }
  1061. #else
  1062. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1063. exp[idx++] = 0;
  1064. }
  1065. #endif
  1066. #else
  1067. exp[idx++] = 0;
  1068. exp[idx++] = 0;
  1069. exp[idx++] = 0;
  1070. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1071. exp[idx++] = 0;
  1072. }
  1073. #endif
  1074. exp[idx++] = options->processReply;
  1075. exp[idx++] = options->cipherSuite0;
  1076. exp[idx++] = options->cipherSuite;
  1077. exp[idx++] = options->serverState;
  1078. exp[idx++] = options->clientState;
  1079. exp[idx++] = options->handShakeState;
  1080. exp[idx++] = options->handShakeDone;
  1081. exp[idx++] = options->minDowngrade;
  1082. exp[idx++] = options->connectState;
  1083. exp[idx++] = options->acceptState;
  1084. exp[idx++] = options->asyncState;
  1085. if (type == WOLFSSL_EXPORT_TLS) {
  1086. #ifdef HAVE_ENCRYPT_THEN_MAC
  1087. exp[idx++] = options->disallowEncThenMac;
  1088. exp[idx++] = options->encThenMac;
  1089. exp[idx++] = options->startedETMRead;
  1090. exp[idx++] = options->startedETMWrite;
  1091. #else
  1092. exp[idx++] = 0;
  1093. exp[idx++] = 0;
  1094. exp[idx++] = 0;
  1095. exp[idx++] = 0;
  1096. #endif
  1097. }
  1098. /* version of connection */
  1099. exp[idx++] = ssl->version.major;
  1100. exp[idx++] = ssl->version.minor;
  1101. (void)zero;
  1102. /* check if changes were made and notify of need to update export version */
  1103. switch (ver) {
  1104. case WOLFSSL_EXPORT_VERSION_3:
  1105. if (idx != DTLS_EXPORT_OPT_SZ_3) {
  1106. WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
  1107. return DTLS_EXPORT_VER_E;
  1108. }
  1109. break;
  1110. case WOLFSSL_EXPORT_VERSION:
  1111. if (idx != DTLS_EXPORT_OPT_SZ && type == WOLFSSL_EXPORT_DTLS) {
  1112. WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
  1113. return DTLS_EXPORT_VER_E;
  1114. }
  1115. break;
  1116. default:
  1117. WOLFSSL_MSG("New version case needs added to wolfSSL export");
  1118. return DTLS_EXPORT_VER_E;
  1119. }
  1120. WOLFSSL_LEAVE("ExportOptions", idx);
  1121. (void)type;
  1122. return idx;
  1123. }
  1124. /* copy items from Export struct to Options struct
  1125. * On success returns size of buffer used on failure returns a negative value */
  1126. static int ImportOptions(WOLFSSL* ssl, const byte* exp, word32 len, byte ver,
  1127. int type)
  1128. {
  1129. int idx = 0;
  1130. Options* options = &ssl->options;
  1131. switch (ver) {
  1132. case WOLFSSL_EXPORT_VERSION:
  1133. if (len < DTLS_EXPORT_OPT_SZ) {
  1134. WOLFSSL_MSG("Sanity check on buffer size failed");
  1135. return BAD_FUNC_ARG;
  1136. }
  1137. break;
  1138. case WOLFSSL_EXPORT_VERSION_3:
  1139. if (len < DTLS_EXPORT_OPT_SZ_3) {
  1140. WOLFSSL_MSG("Sanity check on buffer size failed");
  1141. return BAD_FUNC_ARG;
  1142. }
  1143. break;
  1144. default:
  1145. WOLFSSL_MSG("Export version not supported");
  1146. return BAD_FUNC_ARG;
  1147. }
  1148. if (exp == NULL || options == NULL) {
  1149. return BAD_FUNC_ARG;
  1150. }
  1151. /* these options are kept and sent to indicate verify status and strength
  1152. * of handshake */
  1153. options->sendVerify = exp[idx++];
  1154. options->verifyPeer = exp[idx++];
  1155. options->verifyNone = exp[idx++];
  1156. options->downgrade = exp[idx++];
  1157. #ifndef NO_DH
  1158. ato16(exp + idx, &(options->minDhKeySz)); idx += OPAQUE16_LEN;
  1159. ato16(exp + idx, &(options->maxDhKeySz)); idx += OPAQUE16_LEN;
  1160. ato16(exp + idx, &(options->dhKeySz)); idx += OPAQUE16_LEN;
  1161. #else
  1162. idx += OPAQUE16_LEN;
  1163. idx += OPAQUE16_LEN;
  1164. idx += OPAQUE16_LEN;
  1165. #endif
  1166. #ifndef NO_RSA
  1167. ato16(exp + idx, (word16*)&(options->minRsaKeySz)); idx += OPAQUE16_LEN;
  1168. #else
  1169. idx += OPAQUE16_LEN;
  1170. #endif
  1171. #ifdef HAVE_ECC
  1172. ato16(exp + idx, (word16*)&(options->minEccKeySz)); idx += OPAQUE16_LEN;
  1173. #else
  1174. idx += OPAQUE16_LEN;
  1175. #endif
  1176. /* these options are kept to indicate state and behavior */
  1177. #ifndef NO_PSK
  1178. options->havePSK = exp[idx++];
  1179. #else
  1180. idx++;
  1181. #endif
  1182. options->sessionCacheOff = exp[idx++];
  1183. options->sessionCacheFlushOff = exp[idx++];
  1184. options->side = exp[idx++];
  1185. options->resuming = exp[idx++];
  1186. options->haveSessionId = exp[idx++];
  1187. options->tls = exp[idx++];
  1188. options->tls1_1 = exp[idx++];
  1189. options->dtls = exp[idx++];
  1190. options->connReset = exp[idx++];
  1191. options->isClosed = exp[idx++];
  1192. options->closeNotify = exp[idx++];
  1193. options->sentNotify = exp[idx++];
  1194. options->usingCompression = exp[idx++];
  1195. options->haveRSA = exp[idx++];
  1196. options->haveECC = exp[idx++];
  1197. options->haveDH = exp[idx++];
  1198. idx++; /* Historical: haveNTRU */
  1199. idx++; /* Historical: haveQSH */
  1200. options->haveECDSAsig = exp[idx++];
  1201. options->haveStaticECC = exp[idx++];
  1202. options->havePeerVerify = exp[idx++];
  1203. options->usingPSK_cipher = exp[idx++];
  1204. options->usingAnon_cipher = exp[idx++];
  1205. idx++; /* Historical: options->sendAlertState */
  1206. options->partialWrite = exp[idx++];
  1207. options->quietShutdown = exp[idx++];
  1208. options->groupMessages = exp[idx++];
  1209. #ifdef HAVE_POLY1305
  1210. options->oldPoly = exp[idx++]; /* set when to use old rfc way of poly*/
  1211. #else
  1212. idx++;
  1213. #endif
  1214. #ifdef HAVE_ANON
  1215. options->haveAnon = exp[idx++]; /* User wants to allow Anon suites */
  1216. #else
  1217. idx++;
  1218. #endif
  1219. #ifdef HAVE_SESSION_TICKET
  1220. options->createTicket = exp[idx++]; /* Server to create new Ticket */
  1221. options->useTicket = exp[idx++]; /* Use Ticket not session cache */
  1222. options->noTicketTls12 = exp[idx++]; /* Server won't create new Ticket */
  1223. #ifdef WOLFSSL_TLS13
  1224. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1225. options->noTicketTls13 = exp[idx++];/* Server won't create new Ticket */
  1226. }
  1227. #else
  1228. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1229. idx++;
  1230. }
  1231. #endif
  1232. #else
  1233. idx++;
  1234. idx++;
  1235. idx++;
  1236. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1237. idx++;
  1238. }
  1239. #endif
  1240. options->processReply = exp[idx++];
  1241. options->cipherSuite0 = exp[idx++];
  1242. options->cipherSuite = exp[idx++];
  1243. options->serverState = exp[idx++];
  1244. options->clientState = exp[idx++];
  1245. options->handShakeState = exp[idx++];
  1246. options->handShakeDone = exp[idx++];
  1247. options->minDowngrade = exp[idx++];
  1248. options->connectState = exp[idx++];
  1249. options->acceptState = exp[idx++];
  1250. options->asyncState = exp[idx++];
  1251. if (type == WOLFSSL_EXPORT_TLS) {
  1252. #ifdef HAVE_ENCRYPT_THEN_MAC
  1253. options->disallowEncThenMac = exp[idx++];
  1254. options->encThenMac = exp[idx++];
  1255. options->startedETMRead = exp[idx++];
  1256. options->startedETMWrite = exp[idx++];
  1257. #else
  1258. idx++;
  1259. idx++;
  1260. idx++;
  1261. idx++;
  1262. #endif
  1263. }
  1264. /* version of connection */
  1265. if (ssl->version.major != exp[idx++] || ssl->version.minor != exp[idx++]) {
  1266. WOLFSSL_MSG("Version mismatch ie DTLS v1 vs v1.2");
  1267. return VERSION_ERROR;
  1268. }
  1269. /* set TLS 1.3 flag in options if this was a TLS 1.3 connection */
  1270. if (ssl->version.major == SSLv3_MAJOR &&
  1271. ssl->version.minor == TLSv1_3_MINOR) {
  1272. options->tls1_3 = 1;
  1273. }
  1274. return idx;
  1275. }
  1276. #ifndef WOLFSSL_SESSION_EXPORT_NOPEER
  1277. static int ExportPeerInfo(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  1278. {
  1279. int idx = 0;
  1280. int ipSz = MAX_EXPORT_IP; /* start as max size */
  1281. int fam = 0;
  1282. word16 port = 0;
  1283. char ip[MAX_EXPORT_IP];
  1284. if (ver != WOLFSSL_EXPORT_VERSION) {
  1285. WOLFSSL_MSG("Export version not supported");
  1286. return BAD_FUNC_ARG;
  1287. }
  1288. if (ssl == NULL || exp == NULL ||
  1289. len < (sizeof(ip) + 3 * WOLFSSL_EXPORT_LEN)) {
  1290. return BAD_FUNC_ARG;
  1291. }
  1292. if (ssl->ctx->CBGetPeer == NULL) {
  1293. WOLFSSL_MSG("No get peer call back set");
  1294. return BAD_FUNC_ARG;
  1295. }
  1296. if (ssl->ctx->CBGetPeer(ssl, ip, &ipSz, &port, &fam) != WOLFSSL_SUCCESS) {
  1297. WOLFSSL_MSG("Get peer callback error");
  1298. return SOCKET_ERROR_E;
  1299. }
  1300. /* check that ipSz/fam is not negative or too large since user can set cb */
  1301. if (ipSz < 0 || ipSz > MAX_EXPORT_IP || fam < 0) {
  1302. WOLFSSL_MSG("Bad ipSz or fam returned from get peer callback");
  1303. return SOCKET_ERROR_E;
  1304. }
  1305. c16toa((word16)fam, exp + idx); idx += WOLFSSL_EXPORT_LEN;
  1306. c16toa((word16)ipSz, exp + idx); idx += WOLFSSL_EXPORT_LEN;
  1307. XMEMCPY(exp + idx, ip, ipSz); idx += ipSz;
  1308. c16toa(port, exp + idx); idx += WOLFSSL_EXPORT_LEN;
  1309. return idx;
  1310. }
  1311. #endif /* !WOLFSSL_SESSION_EXPORT_NOPEER */
  1312. static int ImportPeerInfo(WOLFSSL* ssl, const byte* buf, word32 len, byte ver)
  1313. {
  1314. word16 idx = 0;
  1315. word16 ipSz;
  1316. word16 fam;
  1317. word16 port;
  1318. char ip[MAX_EXPORT_IP];
  1319. if (ver != WOLFSSL_EXPORT_VERSION && ver != WOLFSSL_EXPORT_VERSION_3) {
  1320. WOLFSSL_MSG("Export version not supported");
  1321. return BAD_FUNC_ARG;
  1322. }
  1323. if (len == 0) {
  1324. WOLFSSL_MSG("No peer info sent");
  1325. return 0;
  1326. }
  1327. if (ssl == NULL || buf == NULL || len < 3 * WOLFSSL_EXPORT_LEN) {
  1328. return BAD_FUNC_ARG;
  1329. }
  1330. /* import sin family */
  1331. ato16(buf + idx, &fam); idx += WOLFSSL_EXPORT_LEN;
  1332. /* import ip address idx, and ipSz are unsigned but cast for enum */
  1333. ato16(buf + idx, &ipSz); idx += WOLFSSL_EXPORT_LEN;
  1334. if (ipSz >= sizeof(ip) || (word16)(idx + ipSz + WOLFSSL_EXPORT_LEN) > len) {
  1335. return BUFFER_E;
  1336. }
  1337. XMEMSET(ip, 0, sizeof(ip));
  1338. XMEMCPY(ip, buf + idx, ipSz); idx += ipSz;
  1339. ip[ipSz] = '\0'; /* with check that ipSz less than ip this is valid */
  1340. ato16(buf + idx, &port); idx += WOLFSSL_EXPORT_LEN;
  1341. /* sanity check for a function to call, then use it to import peer info */
  1342. if (ssl->ctx->CBSetPeer == NULL) {
  1343. WOLFSSL_MSG("No set peer function");
  1344. return BAD_FUNC_ARG;
  1345. }
  1346. if (ssl->ctx->CBSetPeer(ssl, ip, ipSz, port, fam) != WOLFSSL_SUCCESS) {
  1347. WOLFSSL_MSG("Error setting peer info");
  1348. return SOCKET_ERROR_E;
  1349. }
  1350. return idx;
  1351. }
  1352. #ifdef WOLFSSL_DTLS
  1353. /* WOLFSSL_LOCAL function that serializes the current WOLFSSL session state only
  1354. * buf is used to hold the serialized WOLFSSL struct and sz is the size of buf
  1355. * passed in.
  1356. * On success returns the size of serialized session state.*/
  1357. int wolfSSL_dtls_export_state_internal(WOLFSSL* ssl, byte* buf, word32 sz)
  1358. {
  1359. int ret;
  1360. word32 idx = 0;
  1361. word32 totalLen = 0;
  1362. WOLFSSL_ENTER("wolfSSL_dtls_export_state_internal");
  1363. if (buf == NULL || ssl == NULL) {
  1364. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", BAD_FUNC_ARG);
  1365. return BAD_FUNC_ARG;
  1366. }
  1367. totalLen += WOLFSSL_EXPORT_LEN * 2; /* 2 protocol bytes and 2 length bytes */
  1368. /* each of the following have a 2 byte length before data */
  1369. totalLen += WOLFSSL_EXPORT_LEN + DTLS_EXPORT_MIN_KEY_SZ;
  1370. if (totalLen > sz) {
  1371. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", BUFFER_E);
  1372. return BUFFER_E;
  1373. }
  1374. buf[idx++] = (byte)DTLS_EXPORT_STATE_PRO;
  1375. buf[idx++] = ((byte)DTLS_EXPORT_STATE_PRO & 0xF0) |
  1376. ((byte)WOLFSSL_EXPORT_VERSION & 0X0F);
  1377. idx += WOLFSSL_EXPORT_LEN; /* leave room for total length */
  1378. /* export keys struct and dtls state -- variable length stored in ret */
  1379. idx += WOLFSSL_EXPORT_LEN; /* leave room for length */
  1380. if ((ret = ExportKeyState(ssl, buf + idx, sz - idx,
  1381. WOLFSSL_EXPORT_VERSION, 1, WOLFSSL_EXPORT_DTLS)) < 0) {
  1382. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", ret);
  1383. return ret;
  1384. }
  1385. c16toa((word16)ret, buf + idx - WOLFSSL_EXPORT_LEN); idx += ret;
  1386. /* place total length of exported buffer minus 2 bytes protocol/version */
  1387. c16toa((word16)(idx - WOLFSSL_EXPORT_LEN), buf + WOLFSSL_EXPORT_LEN);
  1388. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1389. /* if compiled with debug options then print the version, protocol, size */
  1390. {
  1391. char debug[256];
  1392. XSNPRINTF(debug, sizeof(debug), "Exporting DTLS session state\n"
  1393. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1394. , (int)WOLFSSL_EXPORT_VERSION, buf[0], (buf[1] >> 4), idx - 2);
  1395. WOLFSSL_MSG(debug);
  1396. }
  1397. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1398. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", idx);
  1399. return idx;
  1400. }
  1401. /* On success return amount of buffer consumed */
  1402. int wolfSSL_dtls_import_state_internal(WOLFSSL* ssl, const byte* buf, word32 sz)
  1403. {
  1404. word32 idx = 0;
  1405. word16 length = 0;
  1406. int version;
  1407. int ret;
  1408. WOLFSSL_ENTER("wolfSSL_dtls_import_state_internal");
  1409. /* check at least enough room for protocol and length */
  1410. if (sz < WOLFSSL_EXPORT_LEN * 2 || ssl == NULL) {
  1411. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", BAD_FUNC_ARG);
  1412. return BAD_FUNC_ARG;
  1413. }
  1414. if (buf[idx++] != (byte)DTLS_EXPORT_STATE_PRO ||
  1415. (buf[idx] & 0xF0) != ((byte)DTLS_EXPORT_PRO & 0xF0)) {
  1416. WOLFSSL_MSG("Incorrect protocol");
  1417. return BAD_FUNC_ARG;
  1418. }
  1419. version = buf[idx++] & 0x0F;
  1420. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1421. if (length > sz - WOLFSSL_EXPORT_LEN) { /* subtract 2 for protocol */
  1422. WOLFSSL_MSG("Buffer size sanity check failed");
  1423. return BUFFER_E;
  1424. }
  1425. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1426. /* if compiled with debug options then print the version, protocol, size */
  1427. {
  1428. char debug[256];
  1429. XSNPRINTF(debug, sizeof(debug), "Importing DTLS session state\n"
  1430. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1431. , (int)version, buf[0], (buf[1] >> 4), length);
  1432. WOLFSSL_MSG(debug);
  1433. }
  1434. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1435. /* perform sanity checks and extract Options information used */
  1436. switch (version) {
  1437. case WOLFSSL_EXPORT_VERSION:
  1438. break;
  1439. default:
  1440. WOLFSSL_MSG("Bad export state version");
  1441. return BAD_FUNC_ARG;
  1442. }
  1443. /* perform sanity checks and extract Keys struct */
  1444. if (WOLFSSL_EXPORT_LEN + idx > sz) {
  1445. WOLFSSL_MSG("Import Key struct error");
  1446. return BUFFER_E;
  1447. }
  1448. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1449. if (length > DTLS_EXPORT_KEY_SZ || length + idx > sz) {
  1450. WOLFSSL_MSG("Import Key struct error");
  1451. return BUFFER_E;
  1452. }
  1453. if ((ret = ImportKeyState(ssl, buf + idx, length, version,
  1454. WOLFSSL_EXPORT_DTLS)) < 0) {
  1455. WOLFSSL_MSG("Import Key struct error");
  1456. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
  1457. return ret;
  1458. }
  1459. idx += ret;
  1460. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
  1461. return idx;
  1462. }
  1463. #endif /* WOLFSSL_DTLS */
  1464. /**
  1465. * Imports a serialized buffer (both TLS and DTLS)
  1466. *
  1467. * @param ssl WOLFSSL structure to import into
  1468. * @param buf buffer containing serialized session
  1469. * @param sz size of buffer 'buf'
  1470. * @param type flag for TLS or DTLS
  1471. *
  1472. * @return the size of serialized buffer on success
  1473. */
  1474. int wolfSSL_session_import_internal(WOLFSSL* ssl, const unsigned char* buf,
  1475. unsigned int sz, int type)
  1476. {
  1477. word32 idx = 0;
  1478. word16 length = 0;
  1479. int version = 0;
  1480. int ret = 0;
  1481. int optSz = 0;
  1482. int rc;
  1483. WOLFSSL_ENTER("wolfSSL_session_import_internal");
  1484. /* check at least enough room for protocol and length */
  1485. if (sz < WOLFSSL_EXPORT_LEN * 2 || ssl == NULL) {
  1486. ret = BAD_FUNC_ARG;
  1487. }
  1488. /* Check if is TLS export protocol */
  1489. if (ret == 0) {
  1490. byte validProto = 0; /* did we find a valid protocol */
  1491. if (buf[idx] == (byte)TLS_EXPORT_PRO &&
  1492. (buf[idx + 1] & 0xF0) == ((byte)TLS_EXPORT_PRO & 0xF0)) {
  1493. validProto = 1;
  1494. }
  1495. /* Check if is DTLS export protocol */
  1496. if (buf[idx] == (byte)DTLS_EXPORT_PRO &&
  1497. (buf[idx + 1] & 0xF0) == ((byte)DTLS_EXPORT_PRO & 0xF0)) {
  1498. validProto = 1;
  1499. }
  1500. if (validProto == 0) {
  1501. #ifdef WOLFSSL_DTLS
  1502. /* check if importing state only */
  1503. return wolfSSL_dtls_import_state_internal(ssl, buf, sz);
  1504. #else
  1505. WOLFSSL_MSG("Invalid serialized session protocol value");
  1506. ret = BAD_FUNC_ARG;
  1507. #endif
  1508. }
  1509. idx += 1;
  1510. }
  1511. if (ret == 0) {
  1512. version = buf[idx++] & 0x0F;
  1513. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1514. if (length > sz - WOLFSSL_EXPORT_LEN) { /* subtract 2 for protocol */
  1515. ret = BUFFER_E;
  1516. }
  1517. }
  1518. /* if compiled with debug options then print the version, protocol, size */
  1519. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1520. {
  1521. char debug[256];
  1522. XSNPRINTF(debug, sizeof(debug), "Importing DTLS session\n"
  1523. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1524. , (int)version, buf[0], (buf[1] >> 4), length);
  1525. WOLFSSL_MSG(debug);
  1526. }
  1527. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1528. /* perform sanity checks and extract Options information used */
  1529. if (ret == 0) {
  1530. switch (version) {
  1531. case WOLFSSL_EXPORT_VERSION:
  1532. if (type == WOLFSSL_EXPORT_DTLS) {
  1533. optSz = DTLS_EXPORT_OPT_SZ;
  1534. }
  1535. else {
  1536. optSz = TLS_EXPORT_OPT_SZ;
  1537. }
  1538. break;
  1539. case WOLFSSL_EXPORT_VERSION_3:
  1540. WOLFSSL_MSG("Importing older version 3");
  1541. optSz = DTLS_EXPORT_OPT_SZ_3;
  1542. break;
  1543. default:
  1544. WOLFSSL_MSG("Bad export version");
  1545. ret = BAD_FUNC_ARG;
  1546. }
  1547. }
  1548. if (ret == 0 && (WOLFSSL_EXPORT_LEN + optSz + idx > sz)) {
  1549. WOLFSSL_MSG("Import Options struct error");
  1550. ret = BUFFER_E;
  1551. }
  1552. if (ret == 0) {
  1553. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1554. if (length != optSz) {
  1555. WOLFSSL_MSG("Import Options struct error");
  1556. ret = BUFFER_E;
  1557. }
  1558. }
  1559. if (ret == 0) {
  1560. rc = ImportOptions(ssl, buf + idx, length, version, type);
  1561. if (rc < 0) {
  1562. WOLFSSL_MSG("Import Options struct error");
  1563. ret = rc;
  1564. }
  1565. else {
  1566. idx += length;
  1567. }
  1568. }
  1569. /* perform sanity checks and extract Keys struct */
  1570. if (ret == 0 && (WOLFSSL_EXPORT_LEN + idx > sz)) {
  1571. WOLFSSL_MSG("Import Key struct error");
  1572. ret = BUFFER_E;
  1573. }
  1574. if (ret == 0) {
  1575. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1576. if (length > DTLS_EXPORT_KEY_SZ || length + idx > sz) {
  1577. WOLFSSL_MSG("Import Key struct error");
  1578. ret = BUFFER_E;
  1579. }
  1580. }
  1581. if (ret == 0) {
  1582. rc = ImportKeyState(ssl, buf + idx, length, version, type);
  1583. if (rc < 0) {
  1584. WOLFSSL_MSG("Import Key struct error");
  1585. ret = rc;
  1586. }
  1587. else {
  1588. idx += rc;
  1589. }
  1590. }
  1591. /* perform sanity checks and extract CipherSpecs struct */
  1592. if (ret == 0 && (WOLFSSL_EXPORT_LEN + WOLFSSL_EXPORT_SPC_SZ + idx > sz)) {
  1593. WOLFSSL_MSG("Import CipherSpecs struct error");
  1594. ret = BUFFER_E;
  1595. }
  1596. if (ret == 0) {
  1597. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1598. if (length != WOLFSSL_EXPORT_SPC_SZ) {
  1599. WOLFSSL_MSG("Import CipherSpecs struct error");
  1600. ret = BUFFER_E;
  1601. }
  1602. }
  1603. if (ret == 0) {
  1604. rc = ImportCipherSpecState(ssl, buf + idx, length, version, type);
  1605. if (rc < 0) {
  1606. WOLFSSL_MSG("Import CipherSpecs struct error");
  1607. ret = rc;
  1608. }
  1609. else {
  1610. idx += rc;
  1611. }
  1612. }
  1613. /* perform sanity checks and extract DTLS peer info */
  1614. if (ret == 0 && (WOLFSSL_EXPORT_LEN + idx > sz)) {
  1615. WOLFSSL_MSG("Import DTLS peer info error");
  1616. ret = BUFFER_E;
  1617. }
  1618. if (ret == 0) {
  1619. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1620. if (idx + length > sz) {
  1621. WOLFSSL_MSG("Import DTLS peer info error");
  1622. ret = BUFFER_E;
  1623. }
  1624. }
  1625. if (ret == 0) {
  1626. rc = ImportPeerInfo(ssl, buf + idx, length, version);
  1627. if (rc < 0) {
  1628. WOLFSSL_MSG("Import Peer Addr error");
  1629. ret = rc;
  1630. }
  1631. else {
  1632. idx += rc;
  1633. }
  1634. }
  1635. /* make sure is a valid suite used */
  1636. if (ret == 0 && wolfSSL_get_cipher(ssl) == NULL) {
  1637. WOLFSSL_MSG("Can not match cipher suite imported");
  1638. ret = MATCH_SUITE_ERROR;
  1639. }
  1640. #ifndef WOLFSSL_AEAD_ONLY
  1641. /* set hmac function to use when verifying */
  1642. if (ret == 0 && (ssl->options.tls == 1 || ssl->options.tls1_1 == 1 ||
  1643. ssl->options.dtls == 1)) {
  1644. #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \
  1645. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  1646. ssl->hmac = TLS_hmac;
  1647. #else
  1648. ssl->hmac = Renesas_cmn_TLS_hmac;
  1649. #endif
  1650. }
  1651. /* do not allow stream ciphers with DTLS, except for NULL cipher */
  1652. if (ret == 0 && ssl->specs.cipher_type == stream &&
  1653. ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) {
  1654. WOLFSSL_MSG("Can not import stream ciphers for DTLS");
  1655. ret = SANITY_CIPHER_E;
  1656. }
  1657. #endif /* !WOLFSSL_AEAD_ONLY */
  1658. if (ret != 0) {
  1659. idx = ret;
  1660. }
  1661. WOLFSSL_LEAVE("wolfSSL_session_import_internal", idx);
  1662. return idx;
  1663. }
  1664. /**
  1665. * Handles serializing the session information.
  1666. *
  1667. * @param ssl WOLFSSL structure to serialize session from
  1668. * @param buf output buffer to hold serialized session
  1669. * @param sz the size of buffer 'buf', if too small then gets updated
  1670. * @param type if the input WOLFSSL structure is expected to be TLS or DTLS
  1671. * 1 for yes is TLS and 0 for no is DTLS
  1672. *
  1673. * @return the size of serialized buffer on success and negative values on fail
  1674. */
  1675. int wolfSSL_session_export_internal(WOLFSSL* ssl, byte* buf, word32* sz,
  1676. int type)
  1677. {
  1678. int ret = 0;
  1679. word32 idx = 0;
  1680. word32 totalLen = 0;
  1681. WOLFSSL_ENTER("wolfSSL_session_export_internal");
  1682. if (ssl == NULL) {
  1683. WOLFSSL_MSG("unexpected null argument");
  1684. ret = BAD_FUNC_ARG;
  1685. }
  1686. if (ret == 0) {
  1687. totalLen += WOLFSSL_EXPORT_LEN * 2; /* 2 protocol bytes and 2 length bytes */
  1688. /* each of the following have a 2 byte length before data */
  1689. totalLen += WOLFSSL_EXPORT_LEN + DTLS_EXPORT_OPT_SZ;
  1690. totalLen += WOLFSSL_EXPORT_LEN + DTLS_EXPORT_KEY_SZ;
  1691. totalLen += WOLFSSL_EXPORT_LEN + WOLFSSL_EXPORT_SPC_SZ;
  1692. #ifdef WOLFSSL_DTLS
  1693. if (type == WOLFSSL_EXPORT_DTLS) {
  1694. totalLen += WOLFSSL_EXPORT_LEN + ssl->buffers.dtlsCtx.peer.sz;
  1695. }
  1696. #endif
  1697. }
  1698. /* check is at least the minimum size needed, TLS cipher states add more */
  1699. if (ret == 0 && (totalLen > *sz || buf == NULL)) {
  1700. WOLFSSL_MSG("export buffer was too small or null");
  1701. *sz = totalLen;
  1702. /* possible AES state needed */
  1703. if (type == WOLFSSL_EXPORT_TLS) {
  1704. *sz += AES_BLOCK_SIZE*2;
  1705. }
  1706. ret = LENGTH_ONLY_E;
  1707. }
  1708. if (ret == 0) {
  1709. buf[idx++] = (byte)(type == WOLFSSL_EXPORT_TLS)? TLS_EXPORT_PRO :
  1710. DTLS_EXPORT_PRO;
  1711. buf[idx++] = ((byte)((type == WOLFSSL_EXPORT_TLS)? TLS_EXPORT_PRO :
  1712. DTLS_EXPORT_PRO) & 0xF0)
  1713. | ((byte)WOLFSSL_EXPORT_VERSION & 0X0F);
  1714. idx += WOLFSSL_EXPORT_LEN; /* leave spot for length of total buffer */
  1715. idx += WOLFSSL_EXPORT_LEN;
  1716. ret = ExportOptions(ssl, buf + idx, *sz - idx, WOLFSSL_EXPORT_VERSION,
  1717. type);
  1718. if (ret >= 0) {
  1719. c16toa((word16)ret, buf + idx - WOLFSSL_EXPORT_LEN);
  1720. idx += ret;
  1721. ret = 0;
  1722. }
  1723. }
  1724. /* export keys struct and dtls state -- variable length stored in ret */
  1725. if (ret == 0) {
  1726. idx += WOLFSSL_EXPORT_LEN; /* leave room for length */
  1727. ret = ExportKeyState(ssl, buf + idx, *sz - idx, WOLFSSL_EXPORT_VERSION,
  1728. 0, type);
  1729. if (ret >= 0) {
  1730. c16toa((word16)ret, buf + idx - WOLFSSL_EXPORT_LEN); idx += ret;
  1731. ret = 0;
  1732. }
  1733. }
  1734. /* export of cipher specs struct */
  1735. if (ret == 0) {
  1736. c16toa((word16)WOLFSSL_EXPORT_SPC_SZ, buf + idx);
  1737. idx += WOLFSSL_EXPORT_LEN;
  1738. ret = ExportCipherSpecState(ssl, buf + idx, *sz - idx,
  1739. WOLFSSL_EXPORT_VERSION, type);
  1740. if (ret >= 0) {
  1741. idx += ret;
  1742. ret = 0;
  1743. }
  1744. }
  1745. /* export of peer information */
  1746. if (ret == 0) {
  1747. idx += WOLFSSL_EXPORT_LEN;
  1748. #ifdef WOLFSSL_SESSION_EXPORT_NOPEER
  1749. ret = 0; /* not saving peer port/ip information */
  1750. #else
  1751. ret = ExportPeerInfo(ssl, buf + idx, *sz - idx, WOLFSSL_EXPORT_VERSION);
  1752. #endif
  1753. if (ret >= 0) {
  1754. c16toa(ret, buf + idx - WOLFSSL_EXPORT_LEN);
  1755. idx += ret;
  1756. ret = 0;
  1757. }
  1758. }
  1759. if (ret != 0 && ret != LENGTH_ONLY_E && buf != NULL) {
  1760. /*in a fail case clear the buffer which could contain partial key info*/
  1761. XMEMSET(buf, 0, *sz);
  1762. }
  1763. /* place total length of exported buffer minus 2 bytes protocol/version */
  1764. if (ret == 0) {
  1765. c16toa((word16)(idx - WOLFSSL_EXPORT_LEN), buf + WOLFSSL_EXPORT_LEN);
  1766. ret = idx;
  1767. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1768. {
  1769. char debug[256];
  1770. XSNPRINTF(debug, sizeof(debug), "Exporting TLS session\n"
  1771. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1772. ,(int)WOLFSSL_EXPORT_VERSION, buf[0], (buf[1] >> 4), idx - 2);
  1773. WOLFSSL_MSG(debug);
  1774. }
  1775. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1776. }
  1777. if (ret >= 0) {
  1778. *sz = ret;
  1779. }
  1780. WOLFSSL_LEAVE("wolfSSL_session_export_internal", ret);
  1781. return ret;
  1782. }
  1783. #endif /* WOLFSSL_SESSION_EXPORT */
  1784. void InitSSL_Method(WOLFSSL_METHOD* method, ProtocolVersion pv)
  1785. {
  1786. method->version = pv;
  1787. method->side = WOLFSSL_CLIENT_END;
  1788. method->downgrade = 0;
  1789. }
  1790. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE) || \
  1791. defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  1792. int InitSSL_Side(WOLFSSL* ssl, word16 side)
  1793. {
  1794. if (ssl == NULL)
  1795. return BAD_FUNC_ARG;
  1796. /* set side */
  1797. ssl->options.side = side;
  1798. /* reset options that are side specific */
  1799. #ifdef HAVE_ECC
  1800. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1801. ssl->options.haveECDSAsig = 1; /* always on client side */
  1802. ssl->options.haveECC = 1; /* server turns on with ECC key cert */
  1803. ssl->options.haveStaticECC = 1; /* server can turn on by loading key */
  1804. }
  1805. #elif defined(HAVE_ED25519) || defined(HAVE_ED448)
  1806. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1807. ssl->options.haveECDSAsig = 1; /* always on client side */
  1808. ssl->options.haveECC = 1; /* server turns on with ECC key cert */
  1809. }
  1810. #endif
  1811. #ifdef HAVE_PQC
  1812. #ifdef HAVE_FALCON
  1813. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1814. ssl->options.haveFalconSig = 1; /* always on client side */
  1815. }
  1816. #endif /* HAVE_FALCON */
  1817. #ifdef HAVE_DILITHIUM
  1818. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1819. ssl->options.haveDilithiumSig = 1; /* always on client side */
  1820. }
  1821. #endif /* HAVE_DILITHIUM */
  1822. #endif /* HAVE_PQC */
  1823. #if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
  1824. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1825. if ((ssl->ctx->method->version.major == SSLv3_MAJOR) &&
  1826. (ssl->ctx->method->version.minor >= TLSv1_MINOR)) {
  1827. ssl->options.haveEMS = 1;
  1828. }
  1829. #ifdef WOLFSSL_DTLS
  1830. if (ssl->ctx->method->version.major == DTLS_MAJOR)
  1831. ssl->options.haveEMS = 1;
  1832. #endif /* WOLFSSL_DTLS */
  1833. }
  1834. #endif /* HAVE_EXTENDED_MASTER && !NO_WOLFSSL_CLIENT */
  1835. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  1836. if (ssl->options.dtls && ssl->options.side == WOLFSSL_SERVER_END) {
  1837. int ret;
  1838. ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0);
  1839. if (ret != 0) {
  1840. WOLFSSL_MSG("DTLS Cookie Secret error");
  1841. return ret;
  1842. }
  1843. }
  1844. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  1845. return InitSSL_Suites(ssl);
  1846. }
  1847. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  1848. /* Initialize SSL context, return 0 on success */
  1849. int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap)
  1850. {
  1851. int ret = 0;
  1852. XMEMSET(ctx, 0, sizeof(WOLFSSL_CTX));
  1853. ctx->method = method;
  1854. ctx->heap = ctx; /* defaults to self */
  1855. ctx->timeout = WOLFSSL_SESSION_TIMEOUT;
  1856. #ifdef WOLFSSL_DTLS
  1857. if (method->version.major == DTLS_MAJOR) {
  1858. ctx->minDowngrade = WOLFSSL_MIN_DTLS_DOWNGRADE;
  1859. }
  1860. else
  1861. #endif /* WOLFSSL_DTLS */
  1862. {
  1863. /* current default: TLSv1_MINOR */
  1864. ctx->minDowngrade = WOLFSSL_MIN_DOWNGRADE;
  1865. }
  1866. wolfSSL_RefInit(&ctx->ref, &ret);
  1867. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  1868. if (ret < 0) {
  1869. WOLFSSL_MSG("Mutex error on CTX init");
  1870. ctx->err = CTX_INIT_MUTEX_E;
  1871. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  1872. return BAD_MUTEX_E;
  1873. }
  1874. #else
  1875. (void)ret;
  1876. #endif
  1877. #ifndef NO_CERTS
  1878. ctx->privateKeyDevId = INVALID_DEVID;
  1879. #endif
  1880. #ifndef NO_DH
  1881. ctx->minDhKeySz = MIN_DHKEY_SZ;
  1882. ctx->maxDhKeySz = MAX_DHKEY_SZ;
  1883. #endif
  1884. #ifndef NO_RSA
  1885. ctx->minRsaKeySz = MIN_RSAKEY_SZ;
  1886. #endif
  1887. #ifdef HAVE_ECC
  1888. ctx->minEccKeySz = MIN_ECCKEY_SZ;
  1889. ctx->eccTempKeySz = ECDHE_SIZE;
  1890. #endif
  1891. #ifdef HAVE_PQC
  1892. #ifdef HAVE_FALCON
  1893. ctx->minFalconKeySz = MIN_FALCONKEY_SZ;
  1894. #endif /* HAVE_FALCON */
  1895. #ifdef HAVE_DILITHIUM
  1896. ctx->minDilithiumKeySz = MIN_DILITHIUMKEY_SZ;
  1897. #endif /* HAVE_DILITHIUM */
  1898. #endif /* HAVE_PQC */
  1899. ctx->verifyDepth = MAX_CHAIN_DEPTH;
  1900. #ifdef OPENSSL_EXTRA
  1901. ctx->cbioFlag = WOLFSSL_CBIO_NONE;
  1902. #endif
  1903. #ifdef HAVE_NETX
  1904. ctx->CBIORecv = NetX_Receive;
  1905. ctx->CBIOSend = NetX_Send;
  1906. #elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  1907. ctx->CBIORecv = Mynewt_Receive;
  1908. ctx->CBIOSend = Mynewt_Send;
  1909. #elif defined WOLFSSL_LWIP_NATIVE
  1910. ctx->CBIORecv = LwIPNativeReceive;
  1911. ctx->CBIOSend = LwIPNativeSend;
  1912. #elif defined(WOLFSSL_GNRC)
  1913. ctx->CBIORecv = GNRC_ReceiveFrom;
  1914. ctx->CBIOSend = GNRC_SendTo;
  1915. #elif defined WOLFSSL_ISOTP
  1916. ctx->CBIORecv = ISOTP_Receive;
  1917. ctx->CBIOSend = ISOTP_Send;
  1918. #elif !defined(WOLFSSL_USER_IO)
  1919. #ifdef MICRIUM
  1920. ctx->CBIORecv = MicriumReceive;
  1921. ctx->CBIOSend = MicriumSend;
  1922. #ifdef WOLFSSL_DTLS
  1923. if (method->version.major == DTLS_MAJOR) {
  1924. ctx->CBIORecv = MicriumReceiveFrom;
  1925. ctx->CBIOSend = MicriumSendTo;
  1926. }
  1927. #ifdef WOLFSSL_SESSION_EXPORT
  1928. #error Micrium port does not support DTLS session export yet
  1929. #endif
  1930. #endif
  1931. #elif defined WOLFSSL_UIP
  1932. ctx->CBIORecv = uIPReceive;
  1933. ctx->CBIOSend = uIPSend;
  1934. #ifdef WOLFSSL_DTLS
  1935. if (method->version.major == DTLS_MAJOR) {
  1936. ctx->CBIOSendTo = uIPSendTo;
  1937. ctx->CBIORecvFrom = uIPRecvFrom;
  1938. }
  1939. #endif
  1940. #else
  1941. ctx->CBIORecv = EmbedReceive;
  1942. ctx->CBIOSend = EmbedSend;
  1943. #ifdef WOLFSSL_SESSION_EXPORT
  1944. ctx->CBGetPeer = EmbedGetPeer;
  1945. ctx->CBSetPeer = EmbedSetPeer;
  1946. #endif
  1947. #ifdef WOLFSSL_DTLS
  1948. if (method->version.major == DTLS_MAJOR) {
  1949. ctx->CBIORecv = EmbedReceiveFrom;
  1950. ctx->CBIOSend = EmbedSendTo;
  1951. }
  1952. #endif
  1953. #endif /* MICRIUM */
  1954. #endif /* WOLFSSL_USER_IO */
  1955. #ifdef HAVE_PQC
  1956. #ifdef HAVE_FALCON
  1957. if (method->side == WOLFSSL_CLIENT_END)
  1958. ctx->haveFalconSig = 1; /* always on client side */
  1959. /* server can turn on by loading key */
  1960. #endif /* HAVE_FALCON */
  1961. #ifdef HAVE_DILITHIUM
  1962. if (method->side == WOLFSSL_CLIENT_END)
  1963. ctx->haveDilithiumSig = 1; /* always on client side */
  1964. /* server can turn on by loading key */
  1965. #endif /* HAVE_DILITHIUM */
  1966. #endif /* HAVE_PQC */
  1967. #ifdef HAVE_ECC
  1968. if (method->side == WOLFSSL_CLIENT_END) {
  1969. ctx->haveECDSAsig = 1; /* always on client side */
  1970. ctx->haveECC = 1; /* server turns on with ECC key cert */
  1971. ctx->haveStaticECC = 1; /* server can turn on by loading key */
  1972. }
  1973. #elif defined(HAVE_ED25519) || defined(HAVE_ED448)
  1974. if (method->side == WOLFSSL_CLIENT_END) {
  1975. ctx->haveECDSAsig = 1; /* always on client side */
  1976. ctx->haveECC = 1; /* server turns on with ECC key cert */
  1977. }
  1978. #endif
  1979. #ifdef WOLFSSL_QNX_CAAM
  1980. /* default to try using CAAM when built */
  1981. ctx->devId = WOLFSSL_CAAM_DEVID;
  1982. #else
  1983. ctx->devId = INVALID_DEVID;
  1984. #endif
  1985. #if defined(WOLFSSL_DTLS)
  1986. #ifdef WOLFSSL_SCTP
  1987. ctx->dtlsMtuSz = MAX_RECORD_SIZE;
  1988. #elif defined(WOLFSSL_DTLS_MTU)
  1989. ctx->dtlsMtuSz = MAX_MTU;
  1990. #endif
  1991. #endif
  1992. #ifndef NO_CERTS
  1993. ctx->cm = wolfSSL_CertManagerNew_ex(heap);
  1994. if (ctx->cm == NULL) {
  1995. WOLFSSL_MSG("Bad Cert Manager New");
  1996. WOLFSSL_ERROR_VERBOSE(BAD_CERT_MANAGER_ERROR);
  1997. return BAD_CERT_MANAGER_ERROR;
  1998. }
  1999. #ifdef OPENSSL_EXTRA
  2000. /* setup WOLFSSL_X509_STORE */
  2001. ctx->x509_store.cm = ctx->cm;
  2002. /* set pointer back to x509 store */
  2003. ctx->cm->x509_store_p = &ctx->x509_store;
  2004. /* WOLFSSL_X509_VERIFY_PARAM */
  2005. if ((ctx->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  2006. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  2007. heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  2008. WOLFSSL_MSG("ctx->param memory error");
  2009. return MEMORY_E;
  2010. }
  2011. XMEMSET(ctx->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  2012. /* WOLFSSL_X509_LOOKUP */
  2013. if ((ctx->x509_store.lookup.dirs =
  2014. (WOLFSSL_BY_DIR*)XMALLOC(sizeof(WOLFSSL_BY_DIR),
  2015. heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  2016. WOLFSSL_MSG("ctx-x509_store.lookup.dir memory allocation error");
  2017. XFREE(ctx->param, heap, DYNAMIC_TYPE_OPENSSL);
  2018. ctx->param = NULL;
  2019. return MEMORY_E;
  2020. }
  2021. XMEMSET(ctx->x509_store.lookup.dirs, 0, sizeof(WOLFSSL_BY_DIR));
  2022. if (wc_InitMutex(&ctx->x509_store.lookup.dirs->lock) != 0) {
  2023. WOLFSSL_MSG("Bad mutex init");
  2024. XFREE(ctx->param, heap, DYNAMIC_TYPE_OPENSSL);
  2025. ctx->param = NULL;
  2026. XFREE(ctx->x509_store.lookup.dirs, heap, DYNAMIC_TYPE_OPENSSL);
  2027. ctx->x509_store.lookup.dirs = NULL;
  2028. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  2029. return BAD_MUTEX_E;
  2030. }
  2031. #endif
  2032. #endif
  2033. #if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
  2034. if (method->side == WOLFSSL_CLIENT_END) {
  2035. if ((method->version.major == SSLv3_MAJOR) &&
  2036. (method->version.minor >= TLSv1_MINOR)) {
  2037. ctx->haveEMS = 1;
  2038. }
  2039. #ifdef WOLFSSL_DTLS
  2040. if (method->version.major == DTLS_MAJOR)
  2041. ctx->haveEMS = 1;
  2042. #endif /* WOLFSSL_DTLS */
  2043. }
  2044. #endif /* HAVE_EXTENDED_MASTER && !NO_WOLFSSL_CLIENT */
  2045. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  2046. #ifndef WOLFSSL_NO_DEF_TICKET_ENC_CB
  2047. ret = TicketEncCbCtx_Init(ctx, &ctx->ticketKeyCtx);
  2048. if (ret != 0) return ret;
  2049. ctx->ticketEncCb = DefTicketEncCb;
  2050. ctx->ticketEncCtx = (void*)&ctx->ticketKeyCtx;
  2051. #endif
  2052. ctx->ticketHint = SESSION_TICKET_HINT_DEFAULT;
  2053. #if defined(WOLFSSL_TLS13)
  2054. ctx->maxTicketTls13 = 1; /* default to sending a session ticket if compiled
  2055. in */
  2056. #endif
  2057. #endif
  2058. #ifdef WOLFSSL_EARLY_DATA
  2059. ctx->maxEarlyDataSz = MAX_EARLY_DATA_SZ;
  2060. #endif
  2061. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  2062. #if defined(WOLFSSL_TLS13) && !defined(HAVE_SUPPORTED_CURVES)
  2063. ctx->noPskDheKe = 1;
  2064. #endif
  2065. #endif
  2066. #if defined(WOLFSSL_QT) && !defined(NO_PSK)
  2067. /* Qt retrieves supported cipher list at initialization
  2068. * from get_cipher_compat().
  2069. * Qt doesn't allow to use a cipher if it is not in the supported list.
  2070. * Therefore, we need to enable PSK cipher at the beginning.
  2071. */
  2072. ctx->havePSK = 1;
  2073. #endif
  2074. ctx->heap = heap; /* wolfSSL_CTX_load_static_memory sets */
  2075. #ifdef HAVE_WOLF_EVENT
  2076. ret = wolfEventQueue_Init(&ctx->event_queue);
  2077. #endif /* HAVE_WOLF_EVENT */
  2078. #ifdef WOLFSSL_MAXQ10XX_TLS
  2079. /* Let maxq10xx know what TLS version we are using. */
  2080. ctx->devId = MAXQ_DEVICE_ID;
  2081. maxq10xx_SetupPkCallbacks(ctx, &method->version);
  2082. #endif /* WOLFSSL_MAXQ10XX_TLS */
  2083. return ret;
  2084. }
  2085. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  2086. void wolfSSL_CRYPTO_cleanup_ex_data(WOLFSSL_CRYPTO_EX_DATA* ex_data)
  2087. {
  2088. int n_ex_data = (int)(sizeof ex_data->ex_data / sizeof ex_data->ex_data[0]);
  2089. for (--n_ex_data; n_ex_data >= 0; --n_ex_data) {
  2090. if (ex_data->ex_data[n_ex_data] != NULL)
  2091. (void)wolfSSL_CRYPTO_set_ex_data_with_cleanup(ex_data, n_ex_data,
  2092. NULL, NULL);
  2093. }
  2094. }
  2095. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  2096. #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
  2097. /* free all ech configs in the list */
  2098. static void FreeEchConfigs(WOLFSSL_EchConfig* configs, void* heap)
  2099. {
  2100. WOLFSSL_EchConfig* working_config = configs;
  2101. WOLFSSL_EchConfig* next_config;
  2102. while (working_config != NULL) {
  2103. next_config = working_config->next;
  2104. XFREE(working_config->cipherSuites, heap, DYNAMIC_TYPE_TMP_BUFFER);
  2105. XFREE(working_config->publicName, heap, DYNAMIC_TYPE_TMP_BUFFER);
  2106. if (working_config->raw != NULL)
  2107. XFREE(working_config->raw, heap, DYNAMIC_TYPE_TMP_BUFFER);
  2108. if (working_config->receiverPrivkey != NULL) {
  2109. wc_HpkeFreeKey(NULL, working_config->kemId,
  2110. working_config->receiverPrivkey, heap);
  2111. }
  2112. XFREE(working_config, heap, DYNAMIC_TYPE_TMP_BUFFER);
  2113. working_config = next_config;
  2114. }
  2115. (void)heap;
  2116. }
  2117. #endif
  2118. /* In case contexts are held in array and don't want to free actual ctx. */
  2119. /* The allocations done in InitSSL_Ctx must be free'd with ctx->onHeapHint
  2120. * logic. A WOLFSSL_CTX can be assigned a static memory heap hint using
  2121. * wolfSSL_CTX_load_static_memory after CTX creation, which means variables
  2122. * allocated in InitSSL_Ctx were allocated from heap and should be free'd with
  2123. * a NULL heap hint. */
  2124. void SSL_CtxResourceFree(WOLFSSL_CTX* ctx)
  2125. {
  2126. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && \
  2127. defined(HAVE_TLS_EXTENSIONS) && !defined(NO_WOLFSSL_SERVER)
  2128. int i;
  2129. #endif
  2130. void* heapAtCTXInit = ctx->heap;
  2131. #ifdef WOLFSSL_STATIC_MEMORY
  2132. if (ctx->onHeapHint == 0) {
  2133. heapAtCTXInit = NULL;
  2134. }
  2135. #endif
  2136. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  2137. wolfSSL_CRYPTO_cleanup_ex_data(&ctx->ex_data);
  2138. #endif
  2139. #ifdef HAVE_WOLF_EVENT
  2140. wolfEventQueue_Free(&ctx->event_queue);
  2141. #endif /* HAVE_WOLF_EVENT */
  2142. XFREE(ctx->method, heapAtCTXInit, DYNAMIC_TYPE_METHOD);
  2143. ctx->method = NULL;
  2144. if (ctx->suites) {
  2145. XFREE(ctx->suites, ctx->heap, DYNAMIC_TYPE_SUITES);
  2146. ctx->suites = NULL;
  2147. }
  2148. #ifndef NO_DH
  2149. XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2150. ctx->serverDH_G.buffer = NULL;
  2151. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2152. ctx->serverDH_P.buffer = NULL;
  2153. #endif /* !NO_DH */
  2154. #ifdef SINGLE_THREADED
  2155. if (ctx->rng) {
  2156. wc_FreeRng(ctx->rng);
  2157. XFREE(ctx->rng, ctx->heap, DYNAMIC_TYPE_RNG);
  2158. ctx->rng = NULL;
  2159. }
  2160. #endif /* SINGLE_THREADED */
  2161. #ifndef NO_CERTS
  2162. if (ctx->privateKey != NULL && ctx->privateKey->buffer != NULL) {
  2163. ForceZero(ctx->privateKey->buffer, ctx->privateKey->length);
  2164. }
  2165. FreeDer(&ctx->privateKey);
  2166. #ifdef OPENSSL_ALL
  2167. wolfSSL_EVP_PKEY_free(ctx->privateKeyPKey);
  2168. #endif
  2169. FreeDer(&ctx->certificate);
  2170. #ifdef KEEP_OUR_CERT
  2171. if (ctx->ourCert && ctx->ownOurCert) {
  2172. wolfSSL_X509_free(ctx->ourCert);
  2173. ctx->ourCert = NULL;
  2174. }
  2175. #endif /* KEEP_OUR_CERT */
  2176. FreeDer(&ctx->certChain);
  2177. wolfSSL_CertManagerFree(ctx->cm);
  2178. ctx->cm = NULL;
  2179. #ifdef OPENSSL_ALL
  2180. if (ctx->x509_store.objs != NULL) {
  2181. wolfSSL_sk_X509_OBJECT_pop_free(ctx->x509_store.objs, NULL);
  2182. ctx->x509_store.objs = NULL;
  2183. }
  2184. #endif
  2185. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
  2186. defined(WOLFSSL_WPAS_SMALL)
  2187. wolfSSL_X509_STORE_free(ctx->x509_store_pt);
  2188. #endif
  2189. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(HAVE_LIGHTY)
  2190. wolfSSL_sk_X509_NAME_pop_free(ctx->ca_names, NULL);
  2191. ctx->ca_names = NULL;
  2192. #endif
  2193. #ifdef OPENSSL_EXTRA
  2194. if (ctx->x509Chain) {
  2195. wolfSSL_sk_X509_pop_free(ctx->x509Chain, NULL);
  2196. ctx->x509Chain = NULL;
  2197. }
  2198. #endif
  2199. #endif /* !NO_CERTS */
  2200. #ifdef HAVE_TLS_EXTENSIONS
  2201. #if !defined(NO_TLS)
  2202. TLSX_FreeAll(ctx->extensions, ctx->heap);
  2203. #endif /* !NO_TLS */
  2204. #ifndef NO_WOLFSSL_SERVER
  2205. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  2206. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  2207. if (ctx->certOcspRequest) {
  2208. FreeOcspRequest(ctx->certOcspRequest);
  2209. XFREE(ctx->certOcspRequest, ctx->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  2210. }
  2211. #endif
  2212. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  2213. for (i = 0; i < MAX_CHAIN_DEPTH; i++) {
  2214. if (ctx->chainOcspRequest[i]) {
  2215. FreeOcspRequest(ctx->chainOcspRequest[i]);
  2216. XFREE(ctx->chainOcspRequest[i], ctx->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  2217. ctx->chainOcspRequest[i] = NULL;
  2218. }
  2219. }
  2220. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  2221. #endif /* !NO_WOLFSSL_SERVER */
  2222. #endif /* HAVE_TLS_EXTENSIONS */
  2223. #ifdef OPENSSL_EXTRA
  2224. if (ctx->alpn_cli_protos) {
  2225. XFREE((void*)ctx->alpn_cli_protos, ctx->heap, DYNAMIC_TYPE_OPENSSL);
  2226. ctx->alpn_cli_protos = NULL;
  2227. }
  2228. if (ctx->param) {
  2229. XFREE(ctx->param, heapAtCTXInit, DYNAMIC_TYPE_OPENSSL);
  2230. ctx->param = NULL;
  2231. }
  2232. if (ctx->x509_store.lookup.dirs) {
  2233. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  2234. if (ctx->x509_store.lookup.dirs->dir_entry) {
  2235. wolfSSL_sk_BY_DIR_entry_free(ctx->x509_store.lookup.dirs->dir_entry);
  2236. }
  2237. #endif
  2238. wc_FreeMutex(&ctx->x509_store.lookup.dirs->lock);
  2239. XFREE(ctx->x509_store.lookup.dirs, heapAtCTXInit, DYNAMIC_TYPE_OPENSSL);
  2240. }
  2241. #endif
  2242. #ifdef WOLFSSL_STATIC_EPHEMERAL
  2243. #ifndef NO_DH
  2244. FreeDer(&ctx->staticKE.dhKey);
  2245. #endif
  2246. #ifdef HAVE_ECC
  2247. FreeDer(&ctx->staticKE.ecKey);
  2248. #endif
  2249. #ifdef HAVE_CURVE25519
  2250. FreeDer(&ctx->staticKE.x25519Key);
  2251. #endif
  2252. #ifdef HAVE_CURVE448
  2253. FreeDer(&ctx->staticKE.x448Key);
  2254. #endif
  2255. #ifndef SINGLE_THREADED
  2256. if (ctx->staticKELockInit) {
  2257. wc_FreeMutex(&ctx->staticKELock);
  2258. ctx->staticKELockInit = 0;
  2259. }
  2260. #endif
  2261. #endif
  2262. #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
  2263. FreeEchConfigs(ctx->echConfigs, ctx->heap);
  2264. ctx->echConfigs = NULL;
  2265. #endif
  2266. (void)heapAtCTXInit;
  2267. }
  2268. #ifdef WOLFSSL_STATIC_MEMORY
  2269. static void SSL_CtxResourceFreeStaticMem(void* heap)
  2270. {
  2271. if (heap != NULL
  2272. #ifdef WOLFSSL_HEAP_TEST
  2273. /* avoid dereferencing a test value */
  2274. && heap != (void*)WOLFSSL_HEAP_TEST
  2275. #endif
  2276. ) {
  2277. WOLFSSL_HEAP_HINT* hint = (WOLFSSL_HEAP_HINT*)heap;
  2278. WOLFSSL_HEAP* mem = hint->memory;
  2279. wc_FreeMutex(&mem->memory_mutex);
  2280. }
  2281. }
  2282. #endif /* WOLFSSL_STATIC_MEMORY */
  2283. void FreeSSL_Ctx(WOLFSSL_CTX* ctx)
  2284. {
  2285. int isZero;
  2286. int ret;
  2287. void* heap = ctx->heap;
  2288. #ifdef WOLFSSL_STATIC_MEMORY
  2289. if (ctx->onHeapHint == 0) {
  2290. heap = NULL;
  2291. }
  2292. #endif
  2293. /* decrement CTX reference count */
  2294. wolfSSL_RefDec(&ctx->ref, &isZero, &ret);
  2295. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  2296. if (ret < 0) {
  2297. /* check error state, if mutex error code then mutex init failed but
  2298. * CTX was still malloc'd */
  2299. if (ctx->err == CTX_INIT_MUTEX_E) {
  2300. SSL_CtxResourceFree(ctx);
  2301. XFREE(ctx, heap, DYNAMIC_TYPE_CTX);
  2302. #ifdef WOLFSSL_STATIC_MEMORY
  2303. SSL_CtxResourceFreeStaticMem(heap);
  2304. #endif
  2305. }
  2306. return;
  2307. }
  2308. #else
  2309. (void)ret;
  2310. #endif
  2311. if (isZero) {
  2312. WOLFSSL_MSG("CTX ref count down to 0, doing full free");
  2313. SSL_CtxResourceFree(ctx);
  2314. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \
  2315. !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB)
  2316. TicketEncCbCtx_Free(&ctx->ticketKeyCtx);
  2317. #endif
  2318. wolfSSL_RefFree(&ctx->ref);
  2319. XFREE(ctx, heap, DYNAMIC_TYPE_CTX);
  2320. #ifdef WOLFSSL_STATIC_MEMORY
  2321. SSL_CtxResourceFreeStaticMem(heap);
  2322. #endif
  2323. }
  2324. else {
  2325. WOLFSSL_MSG("CTX ref count not 0 yet, no free");
  2326. }
  2327. (void)heap; /* not used in some builds */
  2328. }
  2329. /* Set cipher pointers to null */
  2330. void InitCiphers(WOLFSSL* ssl)
  2331. {
  2332. #ifdef BUILD_ARC4
  2333. ssl->encrypt.arc4 = NULL;
  2334. ssl->decrypt.arc4 = NULL;
  2335. #endif
  2336. #ifdef BUILD_DES3
  2337. ssl->encrypt.des3 = NULL;
  2338. ssl->decrypt.des3 = NULL;
  2339. #endif
  2340. #ifdef BUILD_AES
  2341. ssl->encrypt.aes = NULL;
  2342. ssl->decrypt.aes = NULL;
  2343. #endif
  2344. #ifdef HAVE_CAMELLIA
  2345. ssl->encrypt.cam = NULL;
  2346. ssl->decrypt.cam = NULL;
  2347. #endif
  2348. #ifdef HAVE_CHACHA
  2349. ssl->encrypt.chacha = NULL;
  2350. ssl->decrypt.chacha = NULL;
  2351. #endif
  2352. #if defined(HAVE_POLY1305) && defined(HAVE_ONE_TIME_AUTH)
  2353. ssl->auth.poly1305 = NULL;
  2354. #endif
  2355. ssl->encrypt.setup = 0;
  2356. ssl->decrypt.setup = 0;
  2357. #ifdef HAVE_ONE_TIME_AUTH
  2358. ssl->auth.setup = 0;
  2359. #endif
  2360. #ifdef WOLFSSL_DTLS13
  2361. XMEMSET(&ssl->dtlsRecordNumberEncrypt, 0,
  2362. sizeof(ssl->dtlsRecordNumberEncrypt));
  2363. XMEMSET(&ssl->dtlsRecordNumberDecrypt, 0,
  2364. sizeof(ssl->dtlsRecordNumberEncrypt));
  2365. #endif /* WOLFSSL_DTLS13 */
  2366. }
  2367. /* Free ciphers */
  2368. void FreeCiphers(WOLFSSL* ssl)
  2369. {
  2370. (void)ssl;
  2371. #ifdef BUILD_ARC4
  2372. wc_Arc4Free(ssl->encrypt.arc4);
  2373. wc_Arc4Free(ssl->decrypt.arc4);
  2374. XFREE(ssl->encrypt.arc4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2375. XFREE(ssl->decrypt.arc4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2376. #endif
  2377. #ifdef BUILD_DES3
  2378. wc_Des3Free(ssl->encrypt.des3);
  2379. wc_Des3Free(ssl->decrypt.des3);
  2380. XFREE(ssl->encrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2381. XFREE(ssl->decrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2382. #endif
  2383. #if defined(BUILD_AES) || defined(BUILD_AESGCM) /* See: InitKeys() in keys.c
  2384. * on addition of BUILD_AESGCM
  2385. * check (enc->aes, dec->aes) */
  2386. wc_AesFree(ssl->encrypt.aes);
  2387. wc_AesFree(ssl->decrypt.aes);
  2388. #if (defined(BUILD_AESGCM) || defined(HAVE_AESCCM)) && \
  2389. !defined(WOLFSSL_NO_TLS12)
  2390. XFREE(ssl->decrypt.additional, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  2391. XFREE(ssl->encrypt.additional, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  2392. #endif
  2393. XFREE(ssl->encrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2394. XFREE(ssl->decrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2395. #endif
  2396. #ifdef CIPHER_NONCE
  2397. XFREE(ssl->decrypt.nonce, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  2398. XFREE(ssl->encrypt.nonce, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  2399. #endif
  2400. #ifdef HAVE_CAMELLIA
  2401. XFREE(ssl->encrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2402. XFREE(ssl->decrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2403. #endif
  2404. #ifdef HAVE_CHACHA
  2405. if (ssl->encrypt.chacha)
  2406. ForceZero(ssl->encrypt.chacha, sizeof(ChaCha));
  2407. if (ssl->decrypt.chacha)
  2408. ForceZero(ssl->decrypt.chacha, sizeof(ChaCha));
  2409. XFREE(ssl->encrypt.chacha, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2410. XFREE(ssl->decrypt.chacha, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2411. #endif
  2412. #if defined(HAVE_POLY1305) && defined(HAVE_ONE_TIME_AUTH)
  2413. if (ssl->auth.poly1305)
  2414. ForceZero(ssl->auth.poly1305, sizeof(Poly1305));
  2415. XFREE(ssl->auth.poly1305, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2416. #endif
  2417. #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)
  2418. wc_HmacFree(ssl->encrypt.hmac);
  2419. wc_HmacFree(ssl->decrypt.hmac);
  2420. XFREE(ssl->encrypt.hmac, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2421. XFREE(ssl->decrypt.hmac, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2422. #endif
  2423. #ifdef WOLFSSL_DTLS13
  2424. #ifdef BUILD_AES
  2425. if (ssl->dtlsRecordNumberEncrypt.aes != NULL) {
  2426. wc_AesFree(ssl->dtlsRecordNumberEncrypt.aes);
  2427. XFREE(ssl->dtlsRecordNumberEncrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2428. ssl->dtlsRecordNumberEncrypt.aes = NULL;
  2429. }
  2430. if (ssl->dtlsRecordNumberDecrypt.aes != NULL) {
  2431. wc_AesFree(ssl->dtlsRecordNumberDecrypt.aes);
  2432. XFREE(ssl->dtlsRecordNumberDecrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2433. ssl->dtlsRecordNumberDecrypt.aes = NULL;
  2434. }
  2435. #endif /* BUILD_AES */
  2436. #ifdef HAVE_CHACHA
  2437. XFREE(ssl->dtlsRecordNumberEncrypt.chacha,
  2438. ssl->heap, DYNAMIC_TYPE_CIPHER);
  2439. XFREE(ssl->dtlsRecordNumberDecrypt.chacha,
  2440. ssl->heap, DYNAMIC_TYPE_CIPHER);
  2441. ssl->dtlsRecordNumberEncrypt.chacha = NULL;
  2442. ssl->dtlsRecordNumberDecrypt.chacha = NULL;
  2443. #endif /* HAVE_CHACHA */
  2444. #endif /* WOLFSSL_DTLS13 */
  2445. }
  2446. void InitCipherSpecs(CipherSpecs* cs)
  2447. {
  2448. XMEMSET(cs, 0, sizeof(CipherSpecs));
  2449. cs->bulk_cipher_algorithm = INVALID_BYTE;
  2450. cs->cipher_type = INVALID_BYTE;
  2451. cs->mac_algorithm = INVALID_BYTE;
  2452. cs->kea = INVALID_BYTE;
  2453. cs->sig_algo = INVALID_BYTE;
  2454. }
  2455. #if defined(USE_ECDSA_KEYSZ_HASH_ALGO) || (defined(WOLFSSL_TLS13) && \
  2456. defined(HAVE_ECC))
  2457. static int GetMacDigestSize(byte macAlgo)
  2458. {
  2459. switch (macAlgo) {
  2460. #ifndef NO_SHA
  2461. case sha_mac:
  2462. return WC_SHA_DIGEST_SIZE;
  2463. #endif
  2464. #ifndef NO_SHA256
  2465. case sha256_mac:
  2466. return WC_SHA256_DIGEST_SIZE;
  2467. #endif
  2468. #ifdef WOLFSSL_SHA384
  2469. case sha384_mac:
  2470. return WC_SHA384_DIGEST_SIZE;
  2471. #endif
  2472. #ifdef WOLFSSL_SHA512
  2473. case sha512_mac:
  2474. return WC_SHA512_DIGEST_SIZE;
  2475. #endif
  2476. default:
  2477. break;
  2478. }
  2479. return NOT_COMPILED_IN;
  2480. }
  2481. #endif /* USE_ECDSA_KEYSZ_HASH_ALGO */
  2482. #define ADD_HASH_SIG_ALGO(out, inOutIdx, major, minor) \
  2483. do { \
  2484. if ((out) != NULL) { \
  2485. (out)[*(inOutIdx) ] = (major); \
  2486. (out)[*(inOutIdx) + 1] = (minor); \
  2487. } \
  2488. *(inOutIdx) += 2; \
  2489. } while (0)
  2490. static WC_INLINE void AddSuiteHashSigAlgo(byte* hashSigAlgo, byte macAlgo,
  2491. byte sigAlgo, int keySz, word16* inOutIdx)
  2492. {
  2493. int addSigAlgo = 1;
  2494. #ifdef USE_ECDSA_KEYSZ_HASH_ALGO
  2495. if (sigAlgo == ecc_dsa_sa_algo) {
  2496. int digestSz = GetMacDigestSize(macAlgo);
  2497. /* do not add sig/algos with digest size larger than key size */
  2498. if (digestSz <= 0 || (keySz > 0 && digestSz > keySz)) {
  2499. addSigAlgo = 0;
  2500. }
  2501. }
  2502. #else
  2503. (void)keySz;
  2504. #endif /* USE_ECDSA_KEYSZ_HASH_ALGO */
  2505. if (addSigAlgo) {
  2506. #ifdef HAVE_ED25519
  2507. if (sigAlgo == ed25519_sa_algo) {
  2508. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
  2509. ED25519_SA_MAJOR, ED25519_SA_MINOR);
  2510. }
  2511. else
  2512. #endif
  2513. #ifdef HAVE_ED448
  2514. if (sigAlgo == ed448_sa_algo) {
  2515. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
  2516. ED448_SA_MAJOR, ED448_SA_MINOR);
  2517. }
  2518. else
  2519. #endif
  2520. #ifdef HAVE_PQC
  2521. #ifdef HAVE_FALCON
  2522. if (sigAlgo == falcon_level1_sa_algo) {
  2523. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
  2524. FALCON_LEVEL1_SA_MAJOR, FALCON_LEVEL1_SA_MINOR);
  2525. }
  2526. else
  2527. if (sigAlgo == falcon_level5_sa_algo) {
  2528. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
  2529. FALCON_LEVEL5_SA_MAJOR, FALCON_LEVEL5_SA_MINOR);
  2530. }
  2531. else
  2532. #endif /* HAVE_FALCON */
  2533. #ifdef HAVE_DILITHIUM
  2534. if (sigAlgo == dilithium_level2_sa_algo) {
  2535. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
  2536. DILITHIUM_LEVEL2_SA_MAJOR, DILITHIUM_LEVEL2_SA_MINOR);
  2537. }
  2538. else
  2539. if (sigAlgo == dilithium_level3_sa_algo) {
  2540. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
  2541. DILITHIUM_LEVEL3_SA_MAJOR, DILITHIUM_LEVEL3_SA_MINOR);
  2542. }
  2543. else
  2544. if (sigAlgo == dilithium_level5_sa_algo) {
  2545. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
  2546. DILITHIUM_LEVEL5_SA_MAJOR, DILITHIUM_LEVEL5_SA_MINOR);
  2547. }
  2548. else
  2549. #endif /* HAVE_DILITHIUM */
  2550. #endif /* HAVE_PQC */
  2551. #ifdef WC_RSA_PSS
  2552. if (sigAlgo == rsa_pss_sa_algo) {
  2553. /* RSA PSS is sig then mac */
  2554. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx, sigAlgo, macAlgo);
  2555. #ifdef WOLFSSL_TLS13
  2556. /* Add the certificate algorithm as well */
  2557. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx, sigAlgo,
  2558. PSS_RSAE_TO_PSS_PSS(macAlgo));
  2559. #endif
  2560. }
  2561. else
  2562. #endif
  2563. {
  2564. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx, macAlgo, sigAlgo);
  2565. }
  2566. }
  2567. }
  2568. void InitSuitesHashSigAlgo(Suites* suites, int haveECDSAsig, int haveRSAsig,
  2569. int haveFalconSig, int haveDilithiumSig, int haveAnon, int tls1_2,
  2570. int keySz)
  2571. {
  2572. InitSuitesHashSigAlgo_ex(suites->hashSigAlgo, haveECDSAsig, haveRSAsig,
  2573. haveFalconSig, haveDilithiumSig, haveAnon, tls1_2, keySz,
  2574. &suites->hashSigAlgoSz);
  2575. }
  2576. void InitSuitesHashSigAlgo_ex(byte* hashSigAlgo, int haveECDSAsig,
  2577. int haveRSAsig, int haveFalconSig, int haveDilithiumSig, int haveAnon,
  2578. int tls1_2, int keySz, word16* len)
  2579. {
  2580. word16 idx = 0;
  2581. (void)tls1_2;
  2582. (void)keySz;
  2583. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  2584. if (haveECDSAsig) {
  2585. #ifdef HAVE_ECC
  2586. #ifdef WOLFSSL_SHA512
  2587. AddSuiteHashSigAlgo(hashSigAlgo, sha512_mac, ecc_dsa_sa_algo, keySz,
  2588. &idx);
  2589. #endif
  2590. #ifdef WOLFSSL_SHA384
  2591. AddSuiteHashSigAlgo(hashSigAlgo, sha384_mac, ecc_dsa_sa_algo, keySz,
  2592. &idx);
  2593. #endif
  2594. #ifndef NO_SHA256
  2595. AddSuiteHashSigAlgo(hashSigAlgo, sha256_mac, ecc_dsa_sa_algo, keySz,
  2596. &idx);
  2597. #endif
  2598. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  2599. defined(WOLFSSL_ALLOW_TLS_SHA1))
  2600. AddSuiteHashSigAlgo(hashSigAlgo, sha_mac, ecc_dsa_sa_algo, keySz, &idx);
  2601. #endif
  2602. #endif
  2603. #ifdef HAVE_ED25519
  2604. AddSuiteHashSigAlgo(hashSigAlgo, no_mac, ed25519_sa_algo, keySz, &idx);
  2605. #endif
  2606. #ifdef HAVE_ED448
  2607. AddSuiteHashSigAlgo(hashSigAlgo, no_mac, ed448_sa_algo, keySz, &idx);
  2608. #endif
  2609. }
  2610. #endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
  2611. if (haveFalconSig) {
  2612. #if defined(HAVE_PQC)
  2613. #ifdef HAVE_FALCON
  2614. AddSuiteHashSigAlgo(hashSigAlgo, no_mac, falcon_level1_sa_algo, keySz,
  2615. &idx);
  2616. AddSuiteHashSigAlgo(hashSigAlgo, no_mac, falcon_level5_sa_algo, keySz,
  2617. &idx);
  2618. #endif /* HAVE_FALCON */
  2619. #endif /* HAVE_PQC */
  2620. }
  2621. if (haveDilithiumSig) {
  2622. #if defined(HAVE_PQC)
  2623. #ifdef HAVE_DILITHIUM
  2624. AddSuiteHashSigAlgo(hashSigAlgo, no_mac, dilithium_level2_sa_algo,
  2625. keySz, &idx);
  2626. AddSuiteHashSigAlgo(hashSigAlgo, no_mac, dilithium_level3_sa_algo,
  2627. keySz, &idx);
  2628. AddSuiteHashSigAlgo(hashSigAlgo, no_mac, dilithium_level5_sa_algo,
  2629. keySz, &idx);
  2630. #endif /* HAVE_DILITHIUM */
  2631. #endif /* HAVE_PQC */
  2632. }
  2633. if (haveRSAsig) {
  2634. #ifdef WC_RSA_PSS
  2635. if (tls1_2) {
  2636. #ifdef WOLFSSL_SHA512
  2637. AddSuiteHashSigAlgo(hashSigAlgo, sha512_mac, rsa_pss_sa_algo, keySz,
  2638. &idx);
  2639. #endif
  2640. #ifdef WOLFSSL_SHA384
  2641. AddSuiteHashSigAlgo(hashSigAlgo, sha384_mac, rsa_pss_sa_algo, keySz,
  2642. &idx);
  2643. #endif
  2644. #ifndef NO_SHA256
  2645. AddSuiteHashSigAlgo(hashSigAlgo, sha256_mac, rsa_pss_sa_algo, keySz,
  2646. &idx);
  2647. #endif
  2648. }
  2649. #endif
  2650. #ifdef WOLFSSL_SHA512
  2651. AddSuiteHashSigAlgo(hashSigAlgo, sha512_mac, rsa_sa_algo, keySz, &idx);
  2652. #endif
  2653. #ifdef WOLFSSL_SHA384
  2654. AddSuiteHashSigAlgo(hashSigAlgo, sha384_mac, rsa_sa_algo, keySz, &idx);
  2655. #endif
  2656. #ifndef NO_SHA256
  2657. AddSuiteHashSigAlgo(hashSigAlgo, sha256_mac, rsa_sa_algo, keySz, &idx);
  2658. #endif
  2659. #ifdef WOLFSSL_SHA224
  2660. AddSuiteHashSigAlgo(hashSigAlgo, sha224_mac, rsa_sa_algo, keySz, &idx);
  2661. #endif
  2662. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  2663. defined(WOLFSSL_ALLOW_TLS_SHA1))
  2664. AddSuiteHashSigAlgo(hashSigAlgo, sha_mac, rsa_sa_algo, keySz, &idx);
  2665. #endif
  2666. }
  2667. #ifdef HAVE_ANON
  2668. if (haveAnon) {
  2669. AddSuiteHashSigAlgo(hashSigAlgo, sha_mac, anonymous_sa_algo, keySz,
  2670. &idx);
  2671. }
  2672. #endif
  2673. (void)haveAnon;
  2674. (void)haveECDSAsig;
  2675. *len = idx;
  2676. }
  2677. int AllocateCtxSuites(WOLFSSL_CTX* ctx)
  2678. {
  2679. if (ctx->suites == NULL) {
  2680. ctx->suites = (Suites*)XMALLOC(sizeof(Suites), ctx->heap,
  2681. DYNAMIC_TYPE_SUITES);
  2682. if (ctx->suites == NULL) {
  2683. WOLFSSL_MSG("Memory alloc for Suites failed");
  2684. return MEMORY_ERROR;
  2685. }
  2686. XMEMSET(ctx->suites, 0, sizeof(Suites));
  2687. }
  2688. return 0;
  2689. }
  2690. /* Call this when the ssl object needs to have its own ssl->suites object */
  2691. int AllocateSuites(WOLFSSL* ssl)
  2692. {
  2693. if (ssl->suites == NULL) {
  2694. ssl->suites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  2695. DYNAMIC_TYPE_SUITES);
  2696. if (ssl->suites == NULL) {
  2697. WOLFSSL_MSG("Suites Memory error");
  2698. return MEMORY_ERROR;
  2699. }
  2700. if (ssl->ctx != NULL && ssl->ctx->suites != NULL)
  2701. XMEMCPY(ssl->suites, ssl->ctx->suites, sizeof(Suites));
  2702. else
  2703. XMEMSET(ssl->suites, 0, sizeof(Suites));
  2704. }
  2705. return 0;
  2706. }
  2707. void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
  2708. word16 havePSK, word16 haveDH, word16 haveECDSAsig,
  2709. word16 haveECC, word16 haveStaticRSA, word16 haveStaticECC,
  2710. word16 haveFalconSig, word16 haveDilithiumSig, word16 haveAnon,
  2711. word16 haveNull, int side)
  2712. {
  2713. word16 idx = 0;
  2714. int tls = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_MINOR;
  2715. int tls1_2 = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_2_MINOR;
  2716. #ifdef WOLFSSL_TLS13
  2717. int tls1_3 = IsAtLeastTLSv1_3(pv);
  2718. #endif
  2719. int dtls = 0;
  2720. int haveRSAsig = 1;
  2721. #ifdef WOLFSSL_DTLS
  2722. /* If DTLS v1.2 or later than set tls1_2 flag */
  2723. if (pv.major == DTLS_MAJOR && pv.minor <= DTLSv1_2_MINOR) {
  2724. tls1_2 = 1;
  2725. }
  2726. #endif
  2727. (void)tls; /* shut up compiler */
  2728. (void)tls1_2;
  2729. (void)dtls;
  2730. (void)haveDH;
  2731. (void)havePSK;
  2732. (void)haveStaticRSA;
  2733. (void)haveStaticECC;
  2734. (void)haveECC;
  2735. (void)side;
  2736. (void)haveRSA; /* some builds won't read */
  2737. (void)haveRSAsig; /* non ecc builds won't read */
  2738. (void)haveAnon; /* anon ciphers optional */
  2739. (void)haveNull;
  2740. (void)haveFalconSig;
  2741. (void)haveDilithiumSig;
  2742. if (suites == NULL) {
  2743. WOLFSSL_MSG("InitSuites pointer error");
  2744. return;
  2745. }
  2746. if (suites->setSuites)
  2747. return; /* trust user settings, don't override */
  2748. #ifdef WOLFSSL_TLS13
  2749. #ifdef BUILD_TLS_AES_128_GCM_SHA256
  2750. if (tls1_3) {
  2751. suites->suites[idx++] = TLS13_BYTE;
  2752. suites->suites[idx++] = TLS_AES_128_GCM_SHA256;
  2753. }
  2754. #endif
  2755. #ifdef BUILD_TLS_AES_256_GCM_SHA384
  2756. if (tls1_3) {
  2757. suites->suites[idx++] = TLS13_BYTE;
  2758. suites->suites[idx++] = TLS_AES_256_GCM_SHA384;
  2759. }
  2760. #endif
  2761. #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
  2762. if (tls1_3) {
  2763. suites->suites[idx++] = TLS13_BYTE;
  2764. suites->suites[idx++] = TLS_CHACHA20_POLY1305_SHA256;
  2765. }
  2766. #endif
  2767. #ifdef BUILD_TLS_AES_128_CCM_SHA256
  2768. if (tls1_3) {
  2769. suites->suites[idx++] = TLS13_BYTE;
  2770. suites->suites[idx++] = TLS_AES_128_CCM_SHA256;
  2771. }
  2772. #endif
  2773. #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
  2774. if (tls1_3) {
  2775. suites->suites[idx++] = TLS13_BYTE;
  2776. suites->suites[idx++] = TLS_AES_128_CCM_8_SHA256;
  2777. }
  2778. #endif
  2779. #ifdef HAVE_NULL_CIPHER
  2780. #ifdef BUILD_TLS_SHA256_SHA256
  2781. if (tls1_3 && haveNull) {
  2782. suites->suites[idx++] = ECC_BYTE;
  2783. suites->suites[idx++] = TLS_SHA256_SHA256;
  2784. }
  2785. #endif
  2786. #ifdef BUILD_TLS_SHA384_SHA384
  2787. if (tls1_3 && haveNull) {
  2788. suites->suites[idx++] = ECC_BYTE;
  2789. suites->suites[idx++] = TLS_SHA384_SHA384;
  2790. }
  2791. #endif
  2792. #endif
  2793. #endif /* WOLFSSL_TLS13 */
  2794. #ifndef WOLFSSL_NO_TLS12
  2795. #if !defined(NO_WOLFSSL_SERVER) && !defined(NO_RSA)
  2796. if (side == WOLFSSL_SERVER_END && haveStaticECC) {
  2797. haveRSA = 0; /* can't do RSA with ECDSA key */
  2798. }
  2799. if (side == WOLFSSL_SERVER_END && haveECDSAsig) {
  2800. haveRSAsig = 0; /* can't have RSA sig if signed by ECDSA */
  2801. }
  2802. #endif /* !NO_WOLFSSL_SERVER */
  2803. #ifdef WOLFSSL_DTLS
  2804. if (pv.major == DTLS_MAJOR) {
  2805. dtls = 1;
  2806. tls = 1;
  2807. /* May be dead assignments dependent upon configuration */
  2808. (void) dtls;
  2809. (void) tls;
  2810. tls1_2 = pv.minor <= DTLSv1_2_MINOR;
  2811. }
  2812. #endif
  2813. #ifdef HAVE_RENEGOTIATION_INDICATION
  2814. if (side == WOLFSSL_CLIENT_END) {
  2815. suites->suites[idx++] = CIPHER_BYTE;
  2816. suites->suites[idx++] = TLS_EMPTY_RENEGOTIATION_INFO_SCSV;
  2817. }
  2818. #endif
  2819. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  2820. if (tls1_2 && haveECC) {
  2821. suites->suites[idx++] = ECC_BYTE;
  2822. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384;
  2823. }
  2824. #endif
  2825. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  2826. if (tls1_2 && haveECC) {
  2827. suites->suites[idx++] = ECC_BYTE;
  2828. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256;
  2829. }
  2830. #endif
  2831. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  2832. if (tls1_2 && haveRSA) {
  2833. suites->suites[idx++] = ECC_BYTE;
  2834. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384;
  2835. }
  2836. #endif
  2837. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  2838. if (tls1_2 && haveRSA) {
  2839. suites->suites[idx++] = ECC_BYTE;
  2840. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256;
  2841. }
  2842. #endif
  2843. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  2844. if (tls1_2 && haveDH && haveRSA) {
  2845. suites->suites[idx++] = CIPHER_BYTE;
  2846. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_GCM_SHA384;
  2847. }
  2848. #endif
  2849. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  2850. if (tls1_2 && haveDH && haveRSA) {
  2851. suites->suites[idx++] = CIPHER_BYTE;
  2852. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_GCM_SHA256;
  2853. }
  2854. #endif
  2855. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  2856. if (tls1_2 && haveRSA && haveStaticRSA) {
  2857. suites->suites[idx++] = CIPHER_BYTE;
  2858. suites->suites[idx++] = TLS_RSA_WITH_AES_256_GCM_SHA384;
  2859. }
  2860. #endif
  2861. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  2862. if (tls1_2 && haveRSA && haveStaticRSA) {
  2863. suites->suites[idx++] = CIPHER_BYTE;
  2864. suites->suites[idx++] = TLS_RSA_WITH_AES_128_GCM_SHA256;
  2865. }
  2866. #endif
  2867. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  2868. if (tls1_2 && haveECC && haveStaticECC) {
  2869. suites->suites[idx++] = ECC_BYTE;
  2870. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384;
  2871. }
  2872. #endif
  2873. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  2874. if (tls1_2 && haveECC && haveStaticECC) {
  2875. suites->suites[idx++] = ECC_BYTE;
  2876. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256;
  2877. }
  2878. #endif
  2879. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  2880. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2881. suites->suites[idx++] = ECC_BYTE;
  2882. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384;
  2883. }
  2884. #endif
  2885. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  2886. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2887. suites->suites[idx++] = ECC_BYTE;
  2888. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256;
  2889. }
  2890. #endif
  2891. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
  2892. if (tls1_2 && haveDH && havePSK) {
  2893. suites->suites[idx++] = CIPHER_BYTE;
  2894. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_GCM_SHA384;
  2895. }
  2896. #endif
  2897. #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
  2898. if (tls1_2 && haveDH && haveAnon) {
  2899. suites->suites[idx++] = CIPHER_BYTE;
  2900. suites->suites[idx++] = TLS_DH_anon_WITH_AES_128_CBC_SHA;
  2901. }
  2902. #endif
  2903. #ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384
  2904. if (tls1_2 && haveDH && haveAnon) {
  2905. suites->suites[idx++] = CIPHER_BYTE;
  2906. suites->suites[idx++] = TLS_DH_anon_WITH_AES_256_GCM_SHA384;
  2907. }
  2908. #endif
  2909. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
  2910. if (tls1_2 && haveDH && havePSK) {
  2911. suites->suites[idx++] = CIPHER_BYTE;
  2912. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_GCM_SHA256;
  2913. }
  2914. #endif
  2915. #ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
  2916. if (tls1_2 && havePSK) {
  2917. suites->suites[idx++] = CIPHER_BYTE;
  2918. suites->suites[idx++] = TLS_PSK_WITH_AES_256_GCM_SHA384;
  2919. }
  2920. #endif
  2921. #ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
  2922. if (tls1_2 && havePSK) {
  2923. suites->suites[idx++] = CIPHER_BYTE;
  2924. suites->suites[idx++] = TLS_PSK_WITH_AES_128_GCM_SHA256;
  2925. }
  2926. #endif
  2927. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  2928. if (tls1_2 && haveECC) {
  2929. suites->suites[idx++] = CHACHA_BYTE;
  2930. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256;
  2931. }
  2932. #endif
  2933. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  2934. if (tls1_2 && haveRSA) {
  2935. suites->suites[idx++] = CHACHA_BYTE;
  2936. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
  2937. }
  2938. #endif
  2939. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  2940. if (tls1_2 && haveRSA) {
  2941. suites->suites[idx++] = CHACHA_BYTE;
  2942. suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
  2943. }
  2944. #endif
  2945. /* Place as higher priority for MYSQL */
  2946. #if defined(WOLFSSL_MYSQL_COMPATIBLE)
  2947. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  2948. if (tls && haveDH && haveRSA) {
  2949. suites->suites[idx++] = CIPHER_BYTE;
  2950. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
  2951. }
  2952. #endif
  2953. #endif
  2954. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  2955. if (tls1_2 && haveRSA) {
  2956. suites->suites[idx++] = ECC_BYTE;
  2957. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256;
  2958. }
  2959. #endif
  2960. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  2961. if (tls1_2 && haveECC) {
  2962. suites->suites[idx++] = ECC_BYTE;
  2963. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256;
  2964. }
  2965. #endif
  2966. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  2967. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2968. suites->suites[idx++] = ECC_BYTE;
  2969. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256;
  2970. }
  2971. #endif
  2972. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  2973. if (tls1_2 && haveECC && haveStaticECC) {
  2974. suites->suites[idx++] = ECC_BYTE;
  2975. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256;
  2976. }
  2977. #endif
  2978. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  2979. if (tls1_2 && haveRSA) {
  2980. suites->suites[idx++] = ECC_BYTE;
  2981. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384;
  2982. }
  2983. #endif
  2984. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  2985. if (tls1_2 && haveECC) {
  2986. suites->suites[idx++] = ECC_BYTE;
  2987. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384;
  2988. }
  2989. #endif
  2990. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  2991. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2992. suites->suites[idx++] = ECC_BYTE;
  2993. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384;
  2994. }
  2995. #endif
  2996. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  2997. if (tls1_2 && haveECC && haveStaticECC) {
  2998. suites->suites[idx++] = ECC_BYTE;
  2999. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384;
  3000. }
  3001. #endif
  3002. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  3003. if (tls && haveECC) {
  3004. suites->suites[idx++] = ECC_BYTE;
  3005. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA;
  3006. }
  3007. #endif
  3008. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  3009. if (tls && haveECC && haveStaticECC) {
  3010. suites->suites[idx++] = ECC_BYTE;
  3011. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA;
  3012. }
  3013. #endif
  3014. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  3015. if (tls && haveECC) {
  3016. suites->suites[idx++] = ECC_BYTE;
  3017. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA;
  3018. }
  3019. #endif
  3020. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  3021. if (tls && haveECC && haveStaticECC) {
  3022. suites->suites[idx++] = ECC_BYTE;
  3023. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA;
  3024. }
  3025. #endif
  3026. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  3027. if (!dtls && tls && haveECC) {
  3028. suites->suites[idx++] = ECC_BYTE;
  3029. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_RC4_128_SHA;
  3030. }
  3031. #endif
  3032. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  3033. if (!dtls && tls && haveECC && haveStaticECC) {
  3034. suites->suites[idx++] = ECC_BYTE;
  3035. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_RC4_128_SHA;
  3036. }
  3037. #endif
  3038. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  3039. if (tls && haveECC) {
  3040. suites->suites[idx++] = ECC_BYTE;
  3041. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA;
  3042. }
  3043. #endif
  3044. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  3045. if (tls && haveECC && haveStaticECC) {
  3046. suites->suites[idx++] = ECC_BYTE;
  3047. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA;
  3048. }
  3049. #endif
  3050. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  3051. if (tls && haveRSA) {
  3052. suites->suites[idx++] = ECC_BYTE;
  3053. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA;
  3054. }
  3055. #endif
  3056. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  3057. if (tls && haveRSAsig && haveStaticECC) {
  3058. suites->suites[idx++] = ECC_BYTE;
  3059. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA;
  3060. }
  3061. #endif
  3062. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  3063. if (tls && haveRSA) {
  3064. suites->suites[idx++] = ECC_BYTE;
  3065. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA;
  3066. }
  3067. #endif
  3068. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  3069. if (tls && haveRSAsig && haveStaticECC) {
  3070. suites->suites[idx++] = ECC_BYTE;
  3071. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA;
  3072. }
  3073. #endif
  3074. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  3075. if (!dtls && tls && haveRSA) {
  3076. suites->suites[idx++] = ECC_BYTE;
  3077. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_RC4_128_SHA;
  3078. }
  3079. #endif
  3080. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  3081. if (!dtls && tls && haveRSAsig && haveStaticECC) {
  3082. suites->suites[idx++] = ECC_BYTE;
  3083. suites->suites[idx++] = TLS_ECDH_RSA_WITH_RC4_128_SHA;
  3084. }
  3085. #endif
  3086. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  3087. if (tls && haveRSA) {
  3088. suites->suites[idx++] = ECC_BYTE;
  3089. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA;
  3090. }
  3091. #endif
  3092. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  3093. if (tls && haveRSAsig && haveStaticECC) {
  3094. suites->suites[idx++] = ECC_BYTE;
  3095. suites->suites[idx++] = TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA;
  3096. }
  3097. #endif
  3098. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
  3099. if (tls1_2 && haveECC) {
  3100. suites->suites[idx++] = ECC_BYTE;
  3101. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM;
  3102. }
  3103. #endif
  3104. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
  3105. if (tls1_2 && haveECC) {
  3106. suites->suites[idx++] = ECC_BYTE;
  3107. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8;
  3108. }
  3109. #endif
  3110. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
  3111. if (tls1_2 && haveECC) {
  3112. suites->suites[idx++] = ECC_BYTE;
  3113. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8;
  3114. }
  3115. #endif
  3116. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
  3117. if (tls1_2 && haveRSA && haveStaticRSA) {
  3118. suites->suites[idx++] = ECC_BYTE;
  3119. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CCM_8;
  3120. }
  3121. #endif
  3122. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
  3123. if (tls1_2 && haveRSA && haveStaticRSA) {
  3124. suites->suites[idx++] = ECC_BYTE;
  3125. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CCM_8;
  3126. }
  3127. #endif
  3128. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  3129. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3130. if (tls1_2 && haveDH && haveRSA)
  3131. #else
  3132. if (tls && haveDH && haveRSA)
  3133. #endif
  3134. {
  3135. suites->suites[idx++] = CIPHER_BYTE;
  3136. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA256;
  3137. }
  3138. #endif
  3139. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  3140. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3141. if (tls1_2 && haveDH && haveRSA)
  3142. #else
  3143. if (tls && haveDH && haveRSA)
  3144. #endif
  3145. {
  3146. suites->suites[idx++] = CIPHER_BYTE;
  3147. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA256;
  3148. }
  3149. #endif
  3150. /* Place as higher priority for MYSQL testing */
  3151. #if !defined(WOLFSSL_MYSQL_COMPATIBLE)
  3152. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  3153. if (tls && haveDH && haveRSA) {
  3154. suites->suites[idx++] = CIPHER_BYTE;
  3155. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
  3156. }
  3157. #endif
  3158. #endif
  3159. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  3160. if (tls && haveDH && haveRSA) {
  3161. suites->suites[idx++] = CIPHER_BYTE;
  3162. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA;
  3163. }
  3164. #endif
  3165. #ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  3166. if (tls && haveDH && haveRSA) {
  3167. suites->suites[idx++] = CIPHER_BYTE;
  3168. suites->suites[idx++] = TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA;
  3169. }
  3170. #endif
  3171. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  3172. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3173. if (tls1_2 && haveRSA && haveStaticRSA)
  3174. #else
  3175. if (tls && haveRSA && haveStaticRSA)
  3176. #endif
  3177. {
  3178. suites->suites[idx++] = CIPHER_BYTE;
  3179. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA256;
  3180. }
  3181. #endif
  3182. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  3183. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3184. if (tls1_2 && haveRSA && haveStaticRSA)
  3185. #else
  3186. if (tls && haveRSA && haveStaticRSA)
  3187. #endif
  3188. {
  3189. suites->suites[idx++] = CIPHER_BYTE;
  3190. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA256;
  3191. }
  3192. #endif
  3193. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  3194. if (tls && haveRSA && haveStaticRSA) {
  3195. suites->suites[idx++] = CIPHER_BYTE;
  3196. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA;
  3197. }
  3198. #endif
  3199. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  3200. if (tls && haveRSA && haveStaticRSA) {
  3201. suites->suites[idx++] = CIPHER_BYTE;
  3202. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA;
  3203. }
  3204. #endif
  3205. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  3206. if (tls1_2 && haveECC) {
  3207. suites->suites[idx++] = CHACHA_BYTE;
  3208. suites->suites[idx++] =
  3209. TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  3210. }
  3211. #endif
  3212. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  3213. if (tls1_2 && haveRSA) {
  3214. suites->suites[idx++] = CHACHA_BYTE;
  3215. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  3216. }
  3217. #endif
  3218. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  3219. if (tls1_2 && haveRSA) {
  3220. suites->suites[idx++] = CHACHA_BYTE;
  3221. suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  3222. }
  3223. #endif
  3224. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
  3225. if (tls && haveECC && haveNull) {
  3226. suites->suites[idx++] = ECC_BYTE;
  3227. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_NULL_SHA;
  3228. }
  3229. #endif
  3230. #ifdef BUILD_TLS_RSA_WITH_NULL_MD5
  3231. if (tls && haveRSA && haveNull && haveStaticRSA) {
  3232. suites->suites[idx++] = CIPHER_BYTE;
  3233. suites->suites[idx++] = TLS_RSA_WITH_NULL_MD5;
  3234. }
  3235. #endif
  3236. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  3237. if (tls && haveRSA && haveNull && haveStaticRSA) {
  3238. suites->suites[idx++] = CIPHER_BYTE;
  3239. suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA;
  3240. }
  3241. #endif
  3242. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  3243. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3244. if (tls1_2 && haveRSA && haveNull && haveStaticRSA)
  3245. #else
  3246. if (tls && haveRSA && haveNull && haveStaticRSA)
  3247. #endif
  3248. {
  3249. suites->suites[idx++] = CIPHER_BYTE;
  3250. suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA256;
  3251. }
  3252. #endif
  3253. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  3254. if (tls && havePSK) {
  3255. suites->suites[idx++] = CIPHER_BYTE;
  3256. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA;
  3257. }
  3258. #endif
  3259. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
  3260. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3261. if (tls1_2 && haveDH && havePSK)
  3262. #else
  3263. if (tls && haveDH && havePSK)
  3264. #endif
  3265. {
  3266. suites->suites[idx++] = CIPHER_BYTE;
  3267. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_CBC_SHA384;
  3268. }
  3269. #endif
  3270. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
  3271. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3272. if (tls1_2 && havePSK)
  3273. #else
  3274. if (tls && havePSK)
  3275. #endif
  3276. {
  3277. suites->suites[idx++] = CIPHER_BYTE;
  3278. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA384;
  3279. }
  3280. #endif
  3281. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
  3282. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3283. if (tls1_2 && haveDH && havePSK)
  3284. #else
  3285. if (tls && haveDH && havePSK)
  3286. #endif
  3287. {
  3288. suites->suites[idx++] = CIPHER_BYTE;
  3289. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CBC_SHA256;
  3290. }
  3291. #endif
  3292. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  3293. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3294. if (tls1_2 && havePSK)
  3295. #else
  3296. if (tls1 && havePSK)
  3297. #endif
  3298. {
  3299. suites->suites[idx++] = CIPHER_BYTE;
  3300. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA256;
  3301. }
  3302. #endif
  3303. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  3304. if (tls && havePSK) {
  3305. suites->suites[idx++] = CIPHER_BYTE;
  3306. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA;
  3307. }
  3308. #endif
  3309. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
  3310. if (tls && haveDH && havePSK) {
  3311. suites->suites[idx++] = ECC_BYTE;
  3312. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CCM;
  3313. }
  3314. #endif
  3315. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
  3316. if (tls && haveDH && havePSK) {
  3317. suites->suites[idx++] = ECC_BYTE;
  3318. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_CCM;
  3319. }
  3320. #endif
  3321. #ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256
  3322. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3323. if (tls1_2 && havePSK)
  3324. #else
  3325. if (tls && havePSK)
  3326. #endif
  3327. {
  3328. suites->suites[idx++] = CHACHA_BYTE;
  3329. suites->suites[idx++] = TLS_PSK_WITH_CHACHA20_POLY1305_SHA256;
  3330. }
  3331. #endif
  3332. #ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  3333. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3334. if (tls1_2 && havePSK)
  3335. #else
  3336. if (tls && havePSK)
  3337. #endif
  3338. {
  3339. suites->suites[idx++] = CHACHA_BYTE;
  3340. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256;
  3341. }
  3342. #endif
  3343. #ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  3344. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3345. if (tls1_2 && havePSK)
  3346. #else
  3347. if (tls && havePSK)
  3348. #endif
  3349. {
  3350. suites->suites[idx++] = CHACHA_BYTE;
  3351. suites->suites[idx++] = TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256;
  3352. }
  3353. #endif
  3354. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
  3355. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3356. if (tls1_2 && havePSK)
  3357. #else
  3358. if (tls && havePSK)
  3359. #endif
  3360. {
  3361. suites->suites[idx++] = ECC_BYTE;
  3362. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256;
  3363. }
  3364. #endif
  3365. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256
  3366. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3367. if (tls1_2 && havePSK)
  3368. #else
  3369. if (tls && havePSK)
  3370. #endif
  3371. {
  3372. suites->suites[idx++] = ECDHE_PSK_BYTE;
  3373. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256;
  3374. }
  3375. #endif
  3376. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
  3377. if (tls && havePSK) {
  3378. suites->suites[idx++] = ECC_BYTE;
  3379. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM;
  3380. }
  3381. #endif
  3382. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
  3383. if (tls && havePSK) {
  3384. suites->suites[idx++] = ECC_BYTE;
  3385. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CCM;
  3386. }
  3387. #endif
  3388. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
  3389. if (tls && havePSK) {
  3390. suites->suites[idx++] = ECC_BYTE;
  3391. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM_8;
  3392. }
  3393. #endif
  3394. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
  3395. if (tls && havePSK) {
  3396. suites->suites[idx++] = ECC_BYTE;
  3397. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CCM_8;
  3398. }
  3399. #endif
  3400. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
  3401. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3402. if (tls1_2 && haveDH && havePSK)
  3403. #else
  3404. if (tls && haveDH && havePSK && haveNull)
  3405. #endif
  3406. {
  3407. suites->suites[idx++] = CIPHER_BYTE;
  3408. suites->suites[idx++] = TLS_DHE_PSK_WITH_NULL_SHA384;
  3409. }
  3410. #endif
  3411. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
  3412. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3413. if (tls1_2 && havePSK && haveNull)
  3414. #else
  3415. if (tls && havePSK && haveNull)
  3416. #endif
  3417. {
  3418. suites->suites[idx++] = CIPHER_BYTE;
  3419. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA384;
  3420. }
  3421. #endif
  3422. #ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256
  3423. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3424. if (tls1_2 && havePSK && haveNull)
  3425. #else
  3426. if (tls && havePSK && haveNull)
  3427. #endif
  3428. {
  3429. suites->suites[idx++] = ECC_BYTE;
  3430. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_NULL_SHA256;
  3431. }
  3432. #endif
  3433. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
  3434. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3435. if (tls1_2 && haveDH && havePSK && haveNull)
  3436. #else
  3437. if (tls && haveDH && havePSK && haveNull)
  3438. #endif
  3439. {
  3440. suites->suites[idx++] = CIPHER_BYTE;
  3441. suites->suites[idx++] = TLS_DHE_PSK_WITH_NULL_SHA256;
  3442. }
  3443. #endif
  3444. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  3445. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3446. if (tls1_2 && havePSK && haveNull)
  3447. #else
  3448. if (tls && havePSK && haveNull)
  3449. #endif
  3450. {
  3451. suites->suites[idx++] = CIPHER_BYTE;
  3452. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA256;
  3453. }
  3454. #endif
  3455. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  3456. if (tls && havePSK && haveNull) {
  3457. suites->suites[idx++] = CIPHER_BYTE;
  3458. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA;
  3459. }
  3460. #endif
  3461. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  3462. if (!dtls && haveRSA && haveStaticRSA) {
  3463. suites->suites[idx++] = CIPHER_BYTE;
  3464. suites->suites[idx++] = SSL_RSA_WITH_RC4_128_SHA;
  3465. }
  3466. #endif
  3467. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  3468. if (!dtls && haveRSA && haveStaticRSA) {
  3469. suites->suites[idx++] = CIPHER_BYTE;
  3470. suites->suites[idx++] = SSL_RSA_WITH_RC4_128_MD5;
  3471. }
  3472. #endif
  3473. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  3474. if (haveRSA && haveStaticRSA) {
  3475. suites->suites[idx++] = CIPHER_BYTE;
  3476. suites->suites[idx++] = SSL_RSA_WITH_3DES_EDE_CBC_SHA;
  3477. }
  3478. #endif
  3479. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  3480. if (tls && haveRSA && haveStaticRSA) {
  3481. suites->suites[idx++] = CIPHER_BYTE;
  3482. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA;
  3483. }
  3484. #endif
  3485. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  3486. if (tls && haveDH && haveRSA && haveStaticRSA) {
  3487. suites->suites[idx++] = CIPHER_BYTE;
  3488. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA;
  3489. }
  3490. #endif
  3491. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  3492. if (tls && haveRSA && haveStaticRSA) {
  3493. suites->suites[idx++] = CIPHER_BYTE;
  3494. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA;
  3495. }
  3496. #endif
  3497. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  3498. if (tls && haveDH && haveRSA && haveStaticRSA) {
  3499. suites->suites[idx++] = CIPHER_BYTE;
  3500. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA;
  3501. }
  3502. #endif
  3503. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  3504. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3505. if (tls1_2 && haveRSA && haveStaticRSA)
  3506. #else
  3507. if (tls && haveRSA && haveStaticRSA)
  3508. #endif
  3509. {
  3510. suites->suites[idx++] = CIPHER_BYTE;
  3511. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256;
  3512. }
  3513. #endif
  3514. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  3515. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3516. if (tls1_2 && haveDH && haveRSA && haveStaticRSA)
  3517. #else
  3518. if (tls && haveDH && haveRSA && haveStaticRSA)
  3519. #endif
  3520. {
  3521. suites->suites[idx++] = CIPHER_BYTE;
  3522. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256;
  3523. }
  3524. #endif
  3525. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  3526. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3527. if (tls1_2 && haveRSA && haveStaticRSA)
  3528. #else
  3529. if (tls && haveRSA && haveStaticRSA)
  3530. #endif
  3531. {
  3532. suites->suites[idx++] = CIPHER_BYTE;
  3533. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256;
  3534. }
  3535. #endif
  3536. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  3537. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3538. if (tls1_2 && haveDH && haveRSA && haveStaticRSA)
  3539. #else
  3540. if (tls && haveDH && haveRSA && haveStaticRSA)
  3541. #endif
  3542. {
  3543. suites->suites[idx++] = CIPHER_BYTE;
  3544. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256;
  3545. }
  3546. #endif
  3547. #endif /* !WOLFSSL_NO_TLS12 */
  3548. suites->suiteSz = idx;
  3549. if (suites->hashSigAlgoSz == 0) {
  3550. InitSuitesHashSigAlgo(suites, haveECDSAsig | haveECC,
  3551. haveRSAsig | haveRSA, haveFalconSig,
  3552. haveDilithiumSig, 0, tls1_2, keySz);
  3553. }
  3554. }
  3555. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) || \
  3556. (!defined(NO_WOLFSSL_CLIENT) && (!defined(NO_DH) || defined(HAVE_ECC)))
  3557. /* Decode the signature algorithm.
  3558. *
  3559. * input The encoded signature algorithm.
  3560. * hashalgo The hash algorithm.
  3561. * hsType The signature type.
  3562. */
  3563. static WC_INLINE void DecodeSigAlg(const byte* input, byte* hashAlgo, byte* hsType)
  3564. {
  3565. *hsType = invalid_sa_algo;
  3566. switch (input[0]) {
  3567. case NEW_SA_MAJOR:
  3568. #ifdef HAVE_ED25519
  3569. /* ED25519: 0x0807 */
  3570. if (input[1] == ED25519_SA_MINOR) {
  3571. *hsType = ed25519_sa_algo;
  3572. /* Hash performed as part of sign/verify operation. */
  3573. *hashAlgo = sha512_mac;
  3574. }
  3575. else
  3576. #endif
  3577. #ifdef HAVE_ED448
  3578. /* ED448: 0x0808 */
  3579. if (input[1] == ED448_SA_MINOR) {
  3580. *hsType = ed448_sa_algo;
  3581. /* Hash performed as part of sign/verify operation. */
  3582. *hashAlgo = sha512_mac;
  3583. }
  3584. else
  3585. #endif
  3586. #ifdef WC_RSA_PSS
  3587. /* PSS PSS signatures: 0x080[9-b] */
  3588. if (input[1] >= pss_sha256 && input[1] <= pss_sha512) {
  3589. *hsType = rsa_pss_pss_algo;
  3590. *hashAlgo = PSS_PSS_HASH_TO_MAC(input[1]);
  3591. }
  3592. else
  3593. #endif
  3594. {
  3595. *hsType = input[0];
  3596. *hashAlgo = input[1];
  3597. }
  3598. break;
  3599. #ifdef HAVE_PQC
  3600. case PQC_SA_MAJOR:
  3601. /* Hash performed as part of sign/verify operation. */
  3602. #ifdef HAVE_FALCON
  3603. if (input[1] == FALCON_LEVEL1_SA_MINOR) {
  3604. *hsType = falcon_level1_sa_algo;
  3605. *hashAlgo = sha512_mac;
  3606. }
  3607. else if (input[1] == FALCON_LEVEL5_SA_MINOR) {
  3608. *hsType = falcon_level5_sa_algo;
  3609. *hashAlgo = sha512_mac;
  3610. }
  3611. #endif /* HAVE_FALCON */
  3612. #ifdef HAVE_DILITHIUM
  3613. if (input[1] == DILITHIUM_LEVEL2_SA_MINOR) {
  3614. *hsType = dilithium_level2_sa_algo;
  3615. *hashAlgo = sha512_mac;
  3616. }
  3617. else if (input[1] == DILITHIUM_LEVEL3_SA_MINOR) {
  3618. *hsType = dilithium_level3_sa_algo;
  3619. *hashAlgo = sha512_mac;
  3620. }
  3621. else if (input[1] == DILITHIUM_LEVEL5_SA_MINOR) {
  3622. *hsType = dilithium_level5_sa_algo;
  3623. *hashAlgo = sha512_mac;
  3624. }
  3625. #endif /* HAVE_DILITHIUM */
  3626. break;
  3627. #endif
  3628. default:
  3629. *hashAlgo = input[0];
  3630. *hsType = input[1];
  3631. break;
  3632. }
  3633. }
  3634. #endif /* !NO_WOLFSSL_SERVER || !NO_CERTS */
  3635. #ifndef WOLFSSL_NO_TLS12
  3636. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  3637. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  3638. defined(HAVE_CURVE448) || (!defined(NO_RSA) && defined(WC_RSA_PSS))
  3639. static enum wc_HashType HashAlgoToType(int hashAlgo)
  3640. {
  3641. switch (hashAlgo) {
  3642. #ifdef WOLFSSL_SHA512
  3643. case sha512_mac:
  3644. return WC_HASH_TYPE_SHA512;
  3645. #endif
  3646. #ifdef WOLFSSL_SHA384
  3647. case sha384_mac:
  3648. return WC_HASH_TYPE_SHA384;
  3649. #endif
  3650. #ifndef NO_SHA256
  3651. case sha256_mac:
  3652. return WC_HASH_TYPE_SHA256;
  3653. #endif
  3654. #ifdef WOLFSSL_SHA224
  3655. case sha224_mac:
  3656. return WC_HASH_TYPE_SHA224;
  3657. #endif
  3658. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  3659. defined(WOLFSSL_ALLOW_TLS_SHA1))
  3660. case sha_mac:
  3661. return WC_HASH_TYPE_SHA;
  3662. #endif
  3663. default:
  3664. WOLFSSL_MSG("Bad hash sig algo");
  3665. break;
  3666. }
  3667. return WC_HASH_TYPE_NONE;
  3668. }
  3669. #endif /* !NO_DH || HAVE_ECC || (!NO_RSA && WC_RSA_PSS) */
  3670. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  3671. #endif /* !WOLFSSL_NO_TLS12 */
  3672. #ifndef NO_CERTS
  3673. void InitX509Name(WOLFSSL_X509_NAME* name, int dynamicFlag, void* heap)
  3674. {
  3675. (void)dynamicFlag;
  3676. if (name != NULL) {
  3677. XMEMSET(name, 0, sizeof(WOLFSSL_X509_NAME));
  3678. name->name = name->staticName;
  3679. name->heap = heap;
  3680. name->dynamicName = 0;
  3681. }
  3682. }
  3683. void FreeX509Name(WOLFSSL_X509_NAME* name)
  3684. {
  3685. if (name != NULL) {
  3686. if (name->dynamicName) {
  3687. XFREE(name->name, name->heap, DYNAMIC_TYPE_SUBJECT_CN);
  3688. name->name = NULL;
  3689. }
  3690. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  3691. {
  3692. int i;
  3693. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  3694. if (name->entry[i].object != NULL)
  3695. wolfSSL_ASN1_OBJECT_free(name->entry[i].object);
  3696. if (name->entry[i].value != NULL)
  3697. wolfSSL_ASN1_STRING_free(name->entry[i].value);
  3698. XMEMSET(&name->entry[i], 0, sizeof(WOLFSSL_X509_NAME_ENTRY));
  3699. }
  3700. }
  3701. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  3702. #ifdef OPENSSL_ALL
  3703. if (name->entries) {
  3704. wolfSSL_sk_X509_NAME_ENTRY_free(name->entries);
  3705. name->entries = NULL;
  3706. }
  3707. #endif
  3708. }
  3709. }
  3710. /* Initialize wolfSSL X509 type */
  3711. void InitX509(WOLFSSL_X509* x509, int dynamicFlag, void* heap)
  3712. {
  3713. if (x509 == NULL) {
  3714. WOLFSSL_MSG("Null parameter passed in!");
  3715. return;
  3716. }
  3717. XMEMSET(x509, 0, sizeof(WOLFSSL_X509));
  3718. x509->heap = heap;
  3719. InitX509Name(&x509->issuer, 0, heap);
  3720. InitX509Name(&x509->subject, 0, heap);
  3721. x509->dynamicMemory = (byte)dynamicFlag;
  3722. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(OPENSSL_EXTRA)
  3723. {
  3724. int ret;
  3725. wolfSSL_RefInit(&x509->ref, &ret);
  3726. (void)ret;
  3727. }
  3728. #endif
  3729. }
  3730. /* Free wolfSSL X509 type */
  3731. void FreeX509(WOLFSSL_X509* x509)
  3732. {
  3733. #if defined(WOLFSSL_CERT_REQ) && defined(OPENSSL_ALL) \
  3734. && defined( WOLFSSL_CUSTOM_OID)
  3735. int idx;
  3736. #endif /* WOLFSSL_CERT_REQ && OPENSSL_ALL && WOLFSSL_CUSTOM_OID */
  3737. if (x509 == NULL)
  3738. return;
  3739. FreeX509Name(&x509->issuer);
  3740. FreeX509Name(&x509->subject);
  3741. if (x509->pubKey.buffer) {
  3742. XFREE(x509->pubKey.buffer, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  3743. x509->pubKey.buffer = NULL;
  3744. }
  3745. FreeDer(&x509->derCert);
  3746. XFREE(x509->sig.buffer, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  3747. x509->sig.buffer = NULL;
  3748. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  3749. if (x509->authKeyIdSrc != NULL) {
  3750. XFREE(x509->authKeyIdSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3751. }
  3752. else {
  3753. XFREE(x509->authKeyId, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3754. }
  3755. x509->authKeyIdSrc = NULL;
  3756. x509->authKeyId = NULL;
  3757. XFREE(x509->subjKeyId, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3758. x509->subjKeyId = NULL;
  3759. if (x509->authInfo != NULL) {
  3760. XFREE(x509->authInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3761. x509->authInfo = NULL;
  3762. }
  3763. if (x509->rawCRLInfo != NULL) {
  3764. XFREE(x509->rawCRLInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3765. x509->rawCRLInfo = NULL;
  3766. }
  3767. if (x509->CRLInfo != NULL) {
  3768. XFREE(x509->CRLInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3769. x509->CRLInfo = NULL;
  3770. }
  3771. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || \
  3772. defined(WOLFSSL_QT)
  3773. if (x509->authInfoCaIssuer != NULL) {
  3774. XFREE(x509->authInfoCaIssuer, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3775. }
  3776. if (x509->ext_sk != NULL) {
  3777. wolfSSL_sk_X509_EXTENSION_pop_free(x509->ext_sk, NULL);
  3778. }
  3779. if (x509->ext_sk_full != NULL) {
  3780. wolfSSL_sk_X509_EXTENSION_pop_free(x509->ext_sk_full, NULL);
  3781. }
  3782. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  3783. #ifdef OPENSSL_EXTRA
  3784. /* Free serialNumber that was set by wolfSSL_X509_get_serialNumber */
  3785. if (x509->serialNumber != NULL) {
  3786. wolfSSL_ASN1_INTEGER_free(x509->serialNumber);
  3787. }
  3788. #endif
  3789. if (x509->extKeyUsageSrc != NULL) {
  3790. XFREE(x509->extKeyUsageSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3791. x509->extKeyUsageSrc= NULL;
  3792. }
  3793. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  3794. #if defined(OPENSSL_ALL)
  3795. if (x509->algor.algorithm) {
  3796. wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm);
  3797. x509->algor.algorithm = NULL;
  3798. }
  3799. if (x509->key.algor) {
  3800. wolfSSL_X509_ALGOR_free(x509->key.algor);
  3801. x509->key.algor = NULL;
  3802. }
  3803. if (x509->key.pkey) {
  3804. wolfSSL_EVP_PKEY_free(x509->key.pkey);
  3805. x509->key.pkey = NULL;
  3806. }
  3807. if (x509->subjAltNameSrc != NULL) {
  3808. XFREE(x509->subjAltNameSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3809. x509->subjAltNameSrc= NULL;
  3810. }
  3811. #endif /* OPENSSL_ALL */
  3812. #if defined(WOLFSSL_CERT_REQ) && defined(OPENSSL_ALL)
  3813. if (x509->reqAttributes) {
  3814. wolfSSL_sk_pop_free(x509->reqAttributes, NULL);
  3815. }
  3816. #ifdef WOLFSSL_CUSTOM_OID
  3817. for (idx = 0; idx < x509->customExtCount; idx++) {
  3818. XFREE(x509->custom_exts[idx].oid, x509->heap,
  3819. DYNAMIC_TYPE_X509_EXT);
  3820. XFREE(x509->custom_exts[idx].val, x509->heap,
  3821. DYNAMIC_TYPE_X509_EXT);
  3822. }
  3823. #endif /* WOLFSSL_CUSTOM_OID */
  3824. #endif /* WOLFSSL_CERT_REQ && OPENSSL_ALL */
  3825. if (x509->altNames) {
  3826. FreeAltNames(x509->altNames, x509->heap);
  3827. x509->altNames = NULL;
  3828. }
  3829. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  3830. wolfSSL_RefFree(&x509->ref);
  3831. #endif
  3832. }
  3833. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  3834. #if !defined(WOLFSSL_NO_TLS12)
  3835. /* Encode the signature algorithm into buffer.
  3836. *
  3837. * hashalgo The hash algorithm.
  3838. * hsType The signature type.
  3839. * output The buffer to encode into.
  3840. */
  3841. static WC_INLINE void EncodeSigAlg(byte hashAlgo, byte hsType, byte* output)
  3842. {
  3843. switch (hsType) {
  3844. #ifdef HAVE_ECC
  3845. case ecc_dsa_sa_algo:
  3846. output[0] = hashAlgo;
  3847. output[1] = ecc_dsa_sa_algo;
  3848. break;
  3849. #endif
  3850. #ifdef HAVE_ED25519
  3851. case ed25519_sa_algo:
  3852. output[0] = ED25519_SA_MAJOR;
  3853. output[1] = ED25519_SA_MINOR;
  3854. (void)hashAlgo;
  3855. break;
  3856. #endif
  3857. #ifdef HAVE_ED448
  3858. case ed448_sa_algo:
  3859. output[0] = ED448_SA_MAJOR;
  3860. output[1] = ED448_SA_MINOR;
  3861. (void)hashAlgo;
  3862. break;
  3863. #endif
  3864. #ifndef NO_RSA
  3865. case rsa_sa_algo:
  3866. output[0] = hashAlgo;
  3867. output[1] = rsa_sa_algo;
  3868. break;
  3869. #ifdef WC_RSA_PSS
  3870. /* PSS signatures: 0x080[4-6] */
  3871. case rsa_pss_sa_algo:
  3872. output[0] = rsa_pss_sa_algo;
  3873. output[1] = hashAlgo;
  3874. break;
  3875. #endif
  3876. #endif
  3877. default:
  3878. break;
  3879. }
  3880. (void)hashAlgo;
  3881. (void)output;
  3882. }
  3883. #endif
  3884. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  3885. static void SetDigest(WOLFSSL* ssl, int hashAlgo)
  3886. {
  3887. switch (hashAlgo) {
  3888. #ifndef NO_SHA
  3889. case sha_mac:
  3890. ssl->options.dontFreeDigest = 1;
  3891. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha;
  3892. ssl->buffers.digest.length = WC_SHA_DIGEST_SIZE;
  3893. break;
  3894. #endif /* !NO_SHA */
  3895. #ifndef NO_SHA256
  3896. case sha256_mac:
  3897. ssl->options.dontFreeDigest = 1;
  3898. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha256;
  3899. ssl->buffers.digest.length = WC_SHA256_DIGEST_SIZE;
  3900. break;
  3901. #endif /* !NO_SHA256 */
  3902. #ifdef WOLFSSL_SHA384
  3903. case sha384_mac:
  3904. ssl->options.dontFreeDigest = 1;
  3905. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha384;
  3906. ssl->buffers.digest.length = WC_SHA384_DIGEST_SIZE;
  3907. break;
  3908. #endif /* WOLFSSL_SHA384 */
  3909. #ifdef WOLFSSL_SHA512
  3910. case sha512_mac:
  3911. ssl->options.dontFreeDigest = 1;
  3912. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha512;
  3913. ssl->buffers.digest.length = WC_SHA512_DIGEST_SIZE;
  3914. break;
  3915. #endif /* WOLFSSL_SHA512 */
  3916. default:
  3917. break;
  3918. } /* switch */
  3919. }
  3920. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_NO_CLIENT_AUTH */
  3921. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  3922. #endif /* !NO_CERTS */
  3923. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  3924. static word32 MacSize(WOLFSSL* ssl)
  3925. {
  3926. #ifdef HAVE_TRUNCATED_HMAC
  3927. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  3928. : ssl->specs.hash_size;
  3929. #else
  3930. word32 digestSz = ssl->specs.hash_size;
  3931. #endif
  3932. return digestSz;
  3933. }
  3934. #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
  3935. #ifndef NO_RSA
  3936. #if !defined(WOLFSSL_NO_TLS12) || \
  3937. (defined(WC_RSA_PSS) && defined(HAVE_PK_CALLBACKS))
  3938. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  3939. static int TypeHash(int hashAlgo)
  3940. {
  3941. switch (hashAlgo) {
  3942. #ifdef WOLFSSL_SHA512
  3943. case sha512_mac:
  3944. return SHA512h;
  3945. #endif
  3946. #ifdef WOLFSSL_SHA384
  3947. case sha384_mac:
  3948. return SHA384h;
  3949. #endif
  3950. #ifndef NO_SHA256
  3951. case sha256_mac:
  3952. return SHA256h;
  3953. #endif
  3954. #ifdef WOLFSSL_SHA224
  3955. case sha224_mac:
  3956. return SHA224h;
  3957. #endif
  3958. #ifndef NO_SHA
  3959. case sha_mac:
  3960. return SHAh;
  3961. #endif
  3962. default:
  3963. break;
  3964. }
  3965. return 0;
  3966. }
  3967. #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
  3968. #endif /* !WOLFSSL_NO_TLS12 */
  3969. #if defined(WC_RSA_PSS)
  3970. int ConvertHashPss(int hashAlgo, enum wc_HashType* hashType, int* mgf)
  3971. {
  3972. switch (hashAlgo) {
  3973. #ifdef WOLFSSL_SHA512
  3974. case sha512_mac:
  3975. *hashType = WC_HASH_TYPE_SHA512;
  3976. if (mgf != NULL)
  3977. *mgf = WC_MGF1SHA512;
  3978. break;
  3979. #endif
  3980. #ifdef WOLFSSL_SHA384
  3981. case sha384_mac:
  3982. *hashType = WC_HASH_TYPE_SHA384;
  3983. if (mgf != NULL)
  3984. *mgf = WC_MGF1SHA384;
  3985. break;
  3986. #endif
  3987. #ifndef NO_SHA256
  3988. case sha256_mac:
  3989. *hashType = WC_HASH_TYPE_SHA256;
  3990. if (mgf != NULL)
  3991. *mgf = WC_MGF1SHA256;
  3992. break;
  3993. #endif
  3994. default:
  3995. return BAD_FUNC_ARG;
  3996. }
  3997. return 0;
  3998. }
  3999. #endif
  4000. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  4001. int RsaSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  4002. word32* outSz, int sigAlgo, int hashAlgo, RsaKey* key,
  4003. DerBuffer* keyBufInfo)
  4004. {
  4005. int ret;
  4006. #ifdef HAVE_PK_CALLBACKS
  4007. const byte* keyBuf = NULL;
  4008. word32 keySz = 0;
  4009. if (keyBufInfo) {
  4010. keyBuf = keyBufInfo->buffer;
  4011. keySz = keyBufInfo->length;
  4012. }
  4013. #endif
  4014. (void)ssl;
  4015. (void)keyBufInfo;
  4016. (void)sigAlgo;
  4017. (void)hashAlgo;
  4018. WOLFSSL_ENTER("RsaSign");
  4019. #ifdef WOLFSSL_ASYNC_CRYPT
  4020. /* initialize event */
  4021. if (key) {
  4022. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4023. if (ret != 0)
  4024. return ret;
  4025. }
  4026. #endif
  4027. #if defined(WC_RSA_PSS)
  4028. if (sigAlgo == rsa_pss_sa_algo) {
  4029. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  4030. int mgf = 0;
  4031. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  4032. if (ret != 0)
  4033. return ret;
  4034. #if defined(HAVE_PK_CALLBACKS)
  4035. if (ssl->ctx->RsaPssSignCb) {
  4036. void* ctx = wolfSSL_GetRsaPssSignCtx(ssl);
  4037. ret = ssl->ctx->RsaPssSignCb(ssl, in, inSz, out, outSz,
  4038. TypeHash(hashAlgo), mgf,
  4039. keyBuf, keySz, ctx);
  4040. }
  4041. else
  4042. #endif
  4043. {
  4044. ret = wc_RsaPSS_Sign(in, inSz, out, *outSz, hashType, mgf, key,
  4045. ssl->rng);
  4046. }
  4047. }
  4048. else
  4049. #endif
  4050. #if defined(HAVE_PK_CALLBACKS)
  4051. if (ssl->ctx->RsaSignCb) {
  4052. void* ctx = wolfSSL_GetRsaSignCtx(ssl);
  4053. ret = ssl->ctx->RsaSignCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  4054. ctx);
  4055. }
  4056. else
  4057. #endif /*HAVE_PK_CALLBACKS */
  4058. ret = wc_RsaSSL_Sign(in, inSz, out, *outSz, key, ssl->rng);
  4059. /* Handle async pending response */
  4060. #ifdef WOLFSSL_ASYNC_CRYPT
  4061. if (key && ret == WC_PENDING_E) {
  4062. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4063. }
  4064. #endif /* WOLFSSL_ASYNC_CRYPT */
  4065. /* For positive response return in outSz */
  4066. if (ret > 0) {
  4067. *outSz = ret;
  4068. ret = 0;
  4069. }
  4070. WOLFSSL_LEAVE("RsaSign", ret);
  4071. return ret;
  4072. }
  4073. #endif
  4074. int RsaVerify(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, int sigAlgo,
  4075. int hashAlgo, RsaKey* key, buffer* keyBufInfo)
  4076. {
  4077. int ret = SIG_VERIFY_E;
  4078. #ifdef HAVE_PK_CALLBACKS
  4079. const byte* keyBuf = NULL;
  4080. word32 keySz = 0;
  4081. if (keyBufInfo) {
  4082. keyBuf = keyBufInfo->buffer;
  4083. keySz = keyBufInfo->length;
  4084. }
  4085. #endif
  4086. (void)ssl;
  4087. (void)keyBufInfo;
  4088. (void)sigAlgo;
  4089. (void)hashAlgo;
  4090. WOLFSSL_ENTER("RsaVerify");
  4091. #ifdef WOLFSSL_ASYNC_CRYPT
  4092. /* initialize event */
  4093. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4094. if (ret != 0)
  4095. return ret;
  4096. #endif
  4097. #if defined(WC_RSA_PSS)
  4098. if (sigAlgo == rsa_pss_sa_algo) {
  4099. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  4100. int mgf = 0;
  4101. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  4102. if (ret != 0)
  4103. return ret;
  4104. #ifdef HAVE_PK_CALLBACKS
  4105. if (ssl->ctx->RsaPssVerifyCb) {
  4106. void* ctx = wolfSSL_GetRsaPssVerifyCtx(ssl);
  4107. ret = ssl->ctx->RsaPssVerifyCb(ssl, in, inSz, out,
  4108. TypeHash(hashAlgo), mgf,
  4109. keyBuf, keySz, ctx);
  4110. }
  4111. else
  4112. #endif /*HAVE_PK_CALLBACKS */
  4113. ret = wc_RsaPSS_VerifyInline(in, inSz, out, hashType, mgf, key);
  4114. }
  4115. else
  4116. #endif
  4117. #ifdef HAVE_PK_CALLBACKS
  4118. if (ssl->ctx->RsaVerifyCb) {
  4119. void* ctx = wolfSSL_GetRsaVerifyCtx(ssl);
  4120. ret = ssl->ctx->RsaVerifyCb(ssl, in, inSz, out, keyBuf, keySz, ctx);
  4121. }
  4122. #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \
  4123. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  4124. else
  4125. #else
  4126. if (!ssl->ctx->RsaVerifyCb || ret == CRYPTOCB_UNAVAILABLE)
  4127. #endif
  4128. #endif /*HAVE_PK_CALLBACKS */
  4129. {
  4130. ret = wc_RsaSSL_VerifyInline(in, inSz, out, key);
  4131. }
  4132. /* Handle async pending response */
  4133. #ifdef WOLFSSL_ASYNC_CRYPT
  4134. if (ret == WC_PENDING_E) {
  4135. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4136. }
  4137. #endif /* WOLFSSL_ASYNC_CRYPT */
  4138. WOLFSSL_LEAVE("RsaVerify", ret);
  4139. return ret;
  4140. }
  4141. /* Verify RSA signature, 0 on success */
  4142. /* This function is used to check the sign result */
  4143. int VerifyRsaSign(WOLFSSL* ssl, byte* verifySig, word32 sigSz,
  4144. const byte* plain, word32 plainSz, int sigAlgo, int hashAlgo, RsaKey* key,
  4145. DerBuffer* keyBufInfo)
  4146. {
  4147. byte* out = NULL; /* inline result */
  4148. int ret;
  4149. #ifdef HAVE_PK_CALLBACKS
  4150. const byte* keyBuf = NULL;
  4151. word32 keySz = 0;
  4152. if (keyBufInfo) {
  4153. keyBuf = keyBufInfo->buffer;
  4154. keySz = keyBufInfo->length;
  4155. }
  4156. #endif
  4157. (void)ssl;
  4158. (void)keyBufInfo;
  4159. (void)sigAlgo;
  4160. (void)hashAlgo;
  4161. WOLFSSL_ENTER("VerifyRsaSign");
  4162. if (verifySig == NULL || plain == NULL) {
  4163. return BAD_FUNC_ARG;
  4164. }
  4165. if (sigSz > ENCRYPT_LEN) {
  4166. WOLFSSL_MSG("Signature buffer too big");
  4167. return BUFFER_E;
  4168. }
  4169. #ifdef WOLFSSL_ASYNC_CRYPT
  4170. /* initialize event */
  4171. if (key) {
  4172. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4173. if (ret != 0)
  4174. return ret;
  4175. }
  4176. #endif
  4177. #if defined(WC_RSA_PSS)
  4178. if (sigAlgo == rsa_pss_sa_algo) {
  4179. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  4180. int mgf = 0;
  4181. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  4182. if (ret != 0)
  4183. return ret;
  4184. #ifdef HAVE_PK_CALLBACKS
  4185. if (ssl->ctx->RsaPssSignCheckCb) {
  4186. /* The key buffer includes private/public portion,
  4187. but only public is used */
  4188. /* If HSM hardware is checking the signature result you can
  4189. optionally skip the sign check and return 0 */
  4190. /* The ctx here is the RsaSignCtx set using wolfSSL_SetRsaSignCtx */
  4191. void* ctx = wolfSSL_GetRsaPssSignCtx(ssl);
  4192. ret = ssl->ctx->RsaPssSignCheckCb(ssl, verifySig, sigSz, &out,
  4193. TypeHash(hashAlgo), mgf,
  4194. keyBuf, keySz, ctx);
  4195. if (ret > 0) {
  4196. ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, ret,
  4197. hashType);
  4198. if (ret != 0) {
  4199. ret = VERIFY_CERT_ERROR;
  4200. WOLFSSL_ERROR_VERBOSE(ret);
  4201. }
  4202. }
  4203. }
  4204. else
  4205. #endif /* HAVE_PK_CALLBACKS */
  4206. {
  4207. ret = wc_RsaPSS_VerifyInline(verifySig, sigSz, &out, hashType, mgf,
  4208. key);
  4209. if (ret > 0) {
  4210. #ifdef HAVE_SELFTEST
  4211. ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, ret,
  4212. hashType);
  4213. #else
  4214. ret = wc_RsaPSS_CheckPadding_ex(plain, plainSz, out, ret,
  4215. hashType, -1,
  4216. mp_count_bits(&key->n));
  4217. #endif
  4218. if (ret != 0) {
  4219. ret = VERIFY_CERT_ERROR;
  4220. WOLFSSL_ERROR_VERBOSE(ret);
  4221. }
  4222. }
  4223. }
  4224. }
  4225. else
  4226. #endif /* WC_RSA_PSS */
  4227. {
  4228. #ifdef HAVE_PK_CALLBACKS
  4229. if (ssl->ctx->RsaSignCheckCb) {
  4230. /* The key buffer includes private/public portion,
  4231. but only public is used */
  4232. /* If HSM hardware is checking the signature result you can
  4233. optionally skip the sign check and return 0 */
  4234. /* The ctx here is the RsaSignCtx set using wolfSSL_SetRsaSignCtx */
  4235. void* ctx = wolfSSL_GetRsaSignCtx(ssl);
  4236. ret = ssl->ctx->RsaSignCheckCb(ssl, verifySig, sigSz, &out,
  4237. keyBuf, keySz, ctx);
  4238. }
  4239. else
  4240. #endif /* HAVE_PK_CALLBACKS */
  4241. {
  4242. ret = wc_RsaSSL_VerifyInline(verifySig, sigSz, &out, key);
  4243. }
  4244. if (ret > 0) {
  4245. if (ret != (int)plainSz || !out ||
  4246. XMEMCMP(plain, out, plainSz) != 0) {
  4247. WOLFSSL_MSG("RSA Signature verification failed");
  4248. ret = RSA_SIGN_FAULT;
  4249. WOLFSSL_ERROR_VERBOSE(ret);
  4250. }
  4251. else {
  4252. ret = 0; /* RSA reset */
  4253. }
  4254. }
  4255. }
  4256. /* Handle async pending response */
  4257. #ifdef WOLFSSL_ASYNC_CRYPT
  4258. if (key && ret == WC_PENDING_E) {
  4259. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4260. }
  4261. #endif /* WOLFSSL_ASYNC_CRYPT */
  4262. WOLFSSL_LEAVE("VerifyRsaSign", ret);
  4263. return ret;
  4264. }
  4265. #ifndef WOLFSSL_NO_TLS12
  4266. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  4267. int RsaDec(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, word32* outSz,
  4268. RsaKey* key, DerBuffer* keyBufInfo)
  4269. {
  4270. byte *outTmp;
  4271. byte mask;
  4272. int ret;
  4273. #ifdef HAVE_PK_CALLBACKS
  4274. const byte* keyBuf = NULL;
  4275. word32 keySz = 0;
  4276. if (keyBufInfo) {
  4277. keyBuf = keyBufInfo->buffer;
  4278. keySz = keyBufInfo->length;
  4279. }
  4280. #endif
  4281. (void)ssl;
  4282. (void)keyBufInfo;
  4283. WOLFSSL_ENTER("RsaDec");
  4284. outTmp = *out;
  4285. #ifdef WOLFSSL_ASYNC_CRYPT
  4286. /* initialize event */
  4287. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4288. if (ret != 0)
  4289. return ret;
  4290. #endif
  4291. #ifdef HAVE_PK_CALLBACKS
  4292. if (ssl->ctx->RsaDecCb) {
  4293. void* ctx = wolfSSL_GetRsaDecCtx(ssl);
  4294. ret = ssl->ctx->RsaDecCb(ssl, in, inSz, &outTmp, keyBuf, keySz, ctx);
  4295. }
  4296. else
  4297. #endif /* HAVE_PK_CALLBACKS */
  4298. {
  4299. #ifdef WC_RSA_BLINDING
  4300. ret = wc_RsaSetRNG(key, ssl->rng);
  4301. if (ret != 0)
  4302. return ret;
  4303. #endif
  4304. ret = wc_RsaPrivateDecryptInline(in, inSz, &outTmp, key);
  4305. }
  4306. /* Handle async pending response */
  4307. #ifdef WOLFSSL_ASYNC_CRYPT
  4308. if (ret == WC_PENDING_E) {
  4309. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4310. }
  4311. #endif /* WOLFSSL_ASYNC_CRYPT */
  4312. mask = ctMaskGT(ret, 0);
  4313. *outSz = (word32)(ret & (int)(sword8)mask);
  4314. ret &= (int)(sword8)(~mask);
  4315. /* Copy pointer */
  4316. ctMaskCopy(mask, (byte*)out, (byte*)&outTmp, sizeof(*out));
  4317. WOLFSSL_LEAVE("RsaDec", ret);
  4318. return ret;
  4319. }
  4320. #endif /* !NO_WOLFSSL_SERVER) || !WOLFSSL_NO_CLIENT_AUTH */
  4321. int RsaEnc(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out, word32* outSz,
  4322. RsaKey* key, buffer* keyBufInfo)
  4323. {
  4324. int ret = BAD_FUNC_ARG;
  4325. #ifdef HAVE_PK_CALLBACKS
  4326. const byte* keyBuf = NULL;
  4327. word32 keySz = 0;
  4328. if (keyBufInfo) {
  4329. keyBuf = keyBufInfo->buffer;
  4330. keySz = keyBufInfo->length;
  4331. }
  4332. #endif
  4333. (void)ssl;
  4334. (void)keyBufInfo;
  4335. WOLFSSL_ENTER("RsaEnc");
  4336. #ifdef WOLFSSL_ASYNC_CRYPT
  4337. /* initialize event */
  4338. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4339. if (ret != 0)
  4340. return ret;
  4341. #endif
  4342. #ifdef HAVE_PK_CALLBACKS
  4343. if (ssl->ctx->RsaEncCb) {
  4344. void* ctx = wolfSSL_GetRsaEncCtx(ssl);
  4345. ret = ssl->ctx->RsaEncCb(ssl, in, inSz, out, outSz, keyBuf, keySz, ctx);
  4346. }
  4347. #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \
  4348. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  4349. else
  4350. #else
  4351. if (!ssl->ctx->RsaEncCb || ret == CRYPTOCB_UNAVAILABLE)
  4352. #endif
  4353. #endif /* HAVE_PK_CALLBACKS */
  4354. {
  4355. ret = wc_RsaPublicEncrypt(in, inSz, out, *outSz, key, ssl->rng);
  4356. }
  4357. /* Handle async pending response */
  4358. #ifdef WOLFSSL_ASYNC_CRYPT
  4359. if (ret == WC_PENDING_E) {
  4360. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4361. }
  4362. #endif /* WOLFSSL_ASYNC_CRYPT */
  4363. /* For positive response return in outSz */
  4364. if (ret > 0) {
  4365. *outSz = ret;
  4366. ret = 0;
  4367. }
  4368. WOLFSSL_LEAVE("RsaEnc", ret);
  4369. return ret;
  4370. }
  4371. #endif /* !WOLFSSL_NO_TLS12 */
  4372. #endif /* NO_RSA */
  4373. #ifdef HAVE_ECC
  4374. int EccSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  4375. word32* outSz, ecc_key* key, DerBuffer* keyBufInfo)
  4376. {
  4377. int ret;
  4378. #ifdef HAVE_PK_CALLBACKS
  4379. const byte* keyBuf = NULL;
  4380. word32 keySz = 0;
  4381. if (keyBufInfo) {
  4382. keyBuf = keyBufInfo->buffer;
  4383. keySz = keyBufInfo->length;
  4384. }
  4385. #endif
  4386. (void)ssl;
  4387. (void)keyBufInfo;
  4388. WOLFSSL_ENTER("EccSign");
  4389. #ifdef WOLFSSL_ASYNC_CRYPT
  4390. /* initialize event */
  4391. if (key) {
  4392. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4393. if (ret != 0)
  4394. return ret;
  4395. }
  4396. #endif
  4397. #if defined(HAVE_PK_CALLBACKS)
  4398. if (ssl->ctx->EccSignCb) {
  4399. void* ctx = wolfSSL_GetEccSignCtx(ssl);
  4400. if (ctx == NULL) {
  4401. /* Try to get the WOLFSSL_CTX EccSignCtx*/
  4402. ctx = wolfSSL_CTX_GetEccSignCtx(ssl->ctx);
  4403. }
  4404. ret = ssl->ctx->EccSignCb(ssl, in, inSz, out, outSz, keyBuf,
  4405. keySz, ctx);
  4406. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  4407. if (ret == CRYPTOCB_UNAVAILABLE) {
  4408. ret = wc_ecc_sign_hash(in, inSz, out, outSz, ssl->rng, key);
  4409. }
  4410. #endif /* WOLFSSL_RENESAS_TSIP_TLS */
  4411. }
  4412. else
  4413. #endif /* HAVE_PK_CALLBACKS */
  4414. {
  4415. ret = wc_ecc_sign_hash(in, inSz, out, outSz, ssl->rng, key);
  4416. }
  4417. /* Handle async pending response */
  4418. #ifdef WOLFSSL_ASYNC_CRYPT
  4419. if (key && ret == WC_PENDING_E) {
  4420. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4421. }
  4422. #endif /* WOLFSSL_ASYNC_CRYPT */
  4423. WOLFSSL_LEAVE("EccSign", ret);
  4424. return ret;
  4425. }
  4426. int EccVerify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* out,
  4427. word32 outSz, ecc_key* key, buffer* keyBufInfo)
  4428. {
  4429. int ret = SIG_VERIFY_E;
  4430. #ifdef HAVE_PK_CALLBACKS
  4431. const byte* keyBuf = NULL;
  4432. word32 keySz = 0;
  4433. if (keyBufInfo) {
  4434. keyBuf = keyBufInfo->buffer;
  4435. keySz = keyBufInfo->length;
  4436. }
  4437. #endif
  4438. (void)ssl;
  4439. (void)keyBufInfo;
  4440. WOLFSSL_ENTER("EccVerify");
  4441. #ifdef WOLFSSL_ASYNC_CRYPT
  4442. /* initialize event */
  4443. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4444. if (ret != 0)
  4445. return ret;
  4446. #endif
  4447. #ifdef HAVE_PK_CALLBACKS
  4448. if (ssl->ctx->EccVerifyCb) {
  4449. void* ctx = wolfSSL_GetEccVerifyCtx(ssl);
  4450. ret = ssl->ctx->EccVerifyCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  4451. &ssl->eccVerifyRes, ctx);
  4452. }
  4453. #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \
  4454. !defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  4455. !defined(WOLFSSL_MAXQ108X)
  4456. else
  4457. #else
  4458. if (!ssl->ctx->EccVerifyCb || ret == CRYPTOCB_UNAVAILABLE)
  4459. #endif
  4460. #endif /* HAVE_PK_CALLBACKS */
  4461. {
  4462. ret = wc_ecc_verify_hash(in, inSz, out, outSz, &ssl->eccVerifyRes, key);
  4463. }
  4464. /* Handle async pending response */
  4465. #ifdef WOLFSSL_ASYNC_CRYPT
  4466. if (ret == WC_PENDING_E) {
  4467. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4468. }
  4469. else
  4470. #endif /* WOLFSSL_ASYNC_CRYPT */
  4471. {
  4472. if (ret != 0 || ssl->eccVerifyRes == 0) {
  4473. if (ret == 0) {
  4474. ret = VERIFY_SIGN_ERROR;
  4475. }
  4476. WOLFSSL_ERROR_VERBOSE(ret);
  4477. }
  4478. else {
  4479. ret = 0;
  4480. }
  4481. }
  4482. WOLFSSL_LEAVE("EccVerify", ret);
  4483. return ret;
  4484. }
  4485. int EccSharedSecret(WOLFSSL* ssl, ecc_key* priv_key, ecc_key* pub_key,
  4486. byte* pubKeyDer, word32* pubKeySz, byte* out, word32* outlen,
  4487. int side)
  4488. {
  4489. int ret;
  4490. #ifdef WOLFSSL_ASYNC_CRYPT
  4491. WC_ASYNC_DEV* asyncDev = NULL;
  4492. #endif
  4493. (void)ssl;
  4494. (void)pubKeyDer;
  4495. (void)pubKeySz;
  4496. (void)side;
  4497. WOLFSSL_ENTER("EccSharedSecret");
  4498. #ifdef WOLFSSL_ASYNC_CRYPT
  4499. /* initialize event */
  4500. if (priv_key != NULL) {
  4501. asyncDev = &priv_key->asyncDev;
  4502. ret = wolfSSL_AsyncInit(ssl, asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4503. if (ret != 0)
  4504. return ret;
  4505. }
  4506. #endif
  4507. #ifdef HAVE_PK_CALLBACKS
  4508. if (ssl->ctx->EccSharedSecretCb) {
  4509. void* ctx = wolfSSL_GetEccSharedSecretCtx(ssl);
  4510. ecc_key* otherKey = (side == WOLFSSL_CLIENT_END) ? pub_key : priv_key;
  4511. ret = ssl->ctx->EccSharedSecretCb(ssl, otherKey, pubKeyDer,
  4512. pubKeySz, out, outlen, side, ctx);
  4513. }
  4514. else
  4515. #endif
  4516. {
  4517. #if defined(ECC_TIMING_RESISTANT) && (!defined(HAVE_FIPS) || \
  4518. !defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION != 2)) && \
  4519. !defined(HAVE_SELFTEST)
  4520. ret = wc_ecc_set_rng(priv_key, ssl->rng);
  4521. if (ret == 0)
  4522. #endif
  4523. {
  4524. PRIVATE_KEY_UNLOCK();
  4525. ret = wc_ecc_shared_secret(priv_key, pub_key, out, outlen);
  4526. PRIVATE_KEY_LOCK();
  4527. }
  4528. }
  4529. /* Handle async pending response */
  4530. #ifdef WOLFSSL_ASYNC_CRYPT
  4531. if (ret == WC_PENDING_E) {
  4532. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  4533. }
  4534. #endif /* WOLFSSL_ASYNC_CRYPT */
  4535. WOLFSSL_LEAVE("EccSharedSecret", ret);
  4536. return ret;
  4537. }
  4538. int EccMakeKey(WOLFSSL* ssl, ecc_key* key, ecc_key* peer)
  4539. {
  4540. int ret = 0;
  4541. int keySz = 0;
  4542. int ecc_curve = ECC_CURVE_DEF;
  4543. WOLFSSL_ENTER("EccMakeKey");
  4544. #ifdef WOLFSSL_ASYNC_CRYPT
  4545. /* initialize event */
  4546. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  4547. if (ret != 0)
  4548. return ret;
  4549. #endif
  4550. /* get key size */
  4551. if (peer == NULL || peer->dp == NULL) {
  4552. keySz = ssl->eccTempKeySz;
  4553. /* get curve type */
  4554. if (ssl->ecdhCurveOID > 0) {
  4555. ecc_curve = wc_ecc_get_oid(ssl->ecdhCurveOID, NULL, NULL);
  4556. }
  4557. }
  4558. else {
  4559. keySz = peer->dp->size;
  4560. ecc_curve = peer->dp->id;
  4561. }
  4562. #ifdef HAVE_PK_CALLBACKS
  4563. if (ssl->ctx->EccKeyGenCb) {
  4564. void* ctx = wolfSSL_GetEccKeyGenCtx(ssl);
  4565. ret = ssl->ctx->EccKeyGenCb(ssl, key, keySz, ecc_curve, ctx);
  4566. }
  4567. else
  4568. #endif
  4569. {
  4570. ret = wc_ecc_make_key_ex(ssl->rng, keySz, key, ecc_curve);
  4571. }
  4572. /* make sure the curve is set for TLS */
  4573. if (ret == 0 && key->dp) {
  4574. ssl->ecdhCurveOID = key->dp->oidSum;
  4575. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  4576. ssl->namedGroup = 0;
  4577. #endif
  4578. }
  4579. /* Handle async pending response */
  4580. #ifdef WOLFSSL_ASYNC_CRYPT
  4581. if (ret == WC_PENDING_E) {
  4582. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4583. }
  4584. #endif /* WOLFSSL_ASYNC_CRYPT */
  4585. WOLFSSL_LEAVE("EccMakeKey", ret);
  4586. return ret;
  4587. }
  4588. #endif /* HAVE_ECC */
  4589. #ifdef HAVE_ED25519
  4590. /* Check whether the key contains a public key.
  4591. * If not then pull it out of the leaf certificate.
  4592. *
  4593. * ssl SSL/TLS object.
  4594. * returns MEMORY_E when unable to allocate memory, a parsing error, otherwise
  4595. * 0 on success.
  4596. */
  4597. int Ed25519CheckPubKey(WOLFSSL* ssl)
  4598. {
  4599. #ifndef HAVE_ED25519_KEY_IMPORT
  4600. (void)ssl;
  4601. return NOT_COMPILED_IN;
  4602. #else /* HAVE_ED25519_KEY_IMPORT */
  4603. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  4604. int ret = 0;
  4605. /* Public key required for signing. */
  4606. if (key != NULL && !key->pubKeySet) {
  4607. const unsigned char* pubKey;
  4608. word32 pubKeySz;
  4609. ret = wc_CertGetPubKey(ssl->buffers.certificate->buffer,
  4610. ssl->buffers.certificate->length, &pubKey, &pubKeySz);
  4611. if (ret == 0) {
  4612. ret = wc_ed25519_import_public(pubKey, pubKeySz, key);
  4613. }
  4614. }
  4615. return ret;
  4616. #endif /* HAVE_ED25519_KEY_IMPORT */
  4617. }
  4618. /* Sign the data using EdDSA and key using Ed25519.
  4619. *
  4620. * ssl SSL object.
  4621. * in Data or message to sign.
  4622. * inSz Length of the data.
  4623. * out Buffer to hold signature.
  4624. * outSz On entry, size of the buffer. On exit, the size of the signature.
  4625. * key The private Ed25519 key data.
  4626. * keySz The length of the private key data in bytes.
  4627. * ctx The callback context.
  4628. * returns 0 on success, otherwise the value is an error.
  4629. */
  4630. int Ed25519Sign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  4631. word32* outSz, ed25519_key* key, DerBuffer* keyBufInfo)
  4632. {
  4633. #ifndef HAVE_ED25519_SIGN
  4634. (void)ssl;
  4635. (void)in;
  4636. (void)inSz;
  4637. (void)out;
  4638. (void)outSz;
  4639. (void)key;
  4640. (void)keyBufInfo;
  4641. return NOT_COMPILED_IN;
  4642. #else /* HAVE_ED25519_SIGN */
  4643. int ret;
  4644. #ifdef HAVE_PK_CALLBACKS
  4645. const byte* keyBuf = NULL;
  4646. word32 keySz = 0;
  4647. if (keyBufInfo) {
  4648. keyBuf = keyBufInfo->buffer;
  4649. keySz = keyBufInfo->length;
  4650. }
  4651. #endif
  4652. (void)ssl;
  4653. (void)keyBufInfo;
  4654. WOLFSSL_ENTER("Ed25519Sign");
  4655. #ifdef WOLFSSL_ASYNC_CRYPT
  4656. /* initialize event */
  4657. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4658. if (ret != 0)
  4659. return ret;
  4660. #endif
  4661. #if defined(HAVE_PK_CALLBACKS)
  4662. if (ssl->ctx->Ed25519SignCb) {
  4663. void* ctx = wolfSSL_GetEd25519SignCtx(ssl);
  4664. ret = ssl->ctx->Ed25519SignCb(ssl, in, inSz, out, outSz, keyBuf,
  4665. keySz, ctx);
  4666. }
  4667. else
  4668. #endif /* HAVE_PK_CALLBACKS */
  4669. {
  4670. ret = wc_ed25519_sign_msg(in, inSz, out, outSz, key);
  4671. }
  4672. /* Handle async pending response */
  4673. #ifdef WOLFSSL_ASYNC_CRYPT
  4674. if (ret == WC_PENDING_E) {
  4675. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4676. }
  4677. #endif /* WOLFSSL_ASYNC_CRYPT */
  4678. WOLFSSL_LEAVE("Ed25519Sign", ret);
  4679. return ret;
  4680. #endif /* HAVE_ED25519_SIGN */
  4681. }
  4682. /* Verify the data using EdDSA and key using Ed25519.
  4683. *
  4684. * ssl SSL object.
  4685. * in Signature data.
  4686. * inSz Length of the signature data in bytes.
  4687. * msg Message to verify.
  4688. * outSz Length of message in bytes.
  4689. * key The public Ed25519 key data.
  4690. * keySz The length of the private key data in bytes.
  4691. * ctx The callback context.
  4692. * returns 0 on success, otherwise the value is an error.
  4693. */
  4694. int Ed25519Verify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* msg,
  4695. word32 msgSz, ed25519_key* key, buffer* keyBufInfo)
  4696. {
  4697. #ifndef HAVE_ED25519_VERIFY
  4698. (void)ssl;
  4699. (void)in;
  4700. (void)inSz;
  4701. (void)msg;
  4702. (void)msgSz;
  4703. (void)key;
  4704. (void)keyBufInfo;
  4705. return NOT_COMPILED_IN;
  4706. #else /* HAVE_ED25519_VERIFY */
  4707. int ret;
  4708. #ifdef HAVE_PK_CALLBACKS
  4709. const byte* keyBuf = NULL;
  4710. word32 keySz = 0;
  4711. if (keyBufInfo) {
  4712. keyBuf = keyBufInfo->buffer;
  4713. keySz = keyBufInfo->length;
  4714. }
  4715. #endif
  4716. (void)ssl;
  4717. (void)keyBufInfo;
  4718. WOLFSSL_ENTER("Ed25519Verify");
  4719. #ifdef WOLFSSL_ASYNC_CRYPT
  4720. /* initialize event */
  4721. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4722. if (ret != 0)
  4723. return ret;
  4724. #endif
  4725. #ifdef HAVE_PK_CALLBACKS
  4726. if (ssl->ctx->Ed25519VerifyCb) {
  4727. void* ctx = wolfSSL_GetEd25519VerifyCtx(ssl);
  4728. ret = ssl->ctx->Ed25519VerifyCb(ssl, in, inSz, msg, msgSz, keyBuf,
  4729. keySz, &ssl->eccVerifyRes, ctx);
  4730. }
  4731. else
  4732. #endif /* HAVE_PK_CALLBACKS */
  4733. {
  4734. ret = wc_ed25519_verify_msg(in, inSz, msg, msgSz,
  4735. &ssl->eccVerifyRes, key);
  4736. }
  4737. /* Handle async pending response */
  4738. #ifdef WOLFSSL_ASYNC_CRYPT
  4739. if (ret == WC_PENDING_E) {
  4740. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4741. }
  4742. else
  4743. #endif /* WOLFSSL_ASYNC_CRYPT */
  4744. {
  4745. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  4746. }
  4747. WOLFSSL_LEAVE("Ed25519Verify", ret);
  4748. return ret;
  4749. #endif /* HAVE_ED25519_VERIFY */
  4750. }
  4751. #endif /* HAVE_ED25519 */
  4752. #ifndef WOLFSSL_NO_TLS12
  4753. #ifdef HAVE_CURVE25519
  4754. #ifdef HAVE_PK_CALLBACKS
  4755. /* Gets X25519 key for shared secret callback testing
  4756. * Client side: returns peer key
  4757. * Server side: returns private key
  4758. */
  4759. static int X25519GetKey(WOLFSSL* ssl, curve25519_key** otherKey)
  4760. {
  4761. int ret = NO_PEER_KEY;
  4762. struct curve25519_key* tmpKey = NULL;
  4763. if (ssl == NULL || otherKey == NULL) {
  4764. return BAD_FUNC_ARG;
  4765. }
  4766. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  4767. if (!ssl->peerX25519Key || !ssl->peerX25519KeyPresent ||
  4768. !ssl->peerX25519Key->dp) {
  4769. return NO_PEER_KEY;
  4770. }
  4771. tmpKey = (struct curve25519_key*)ssl->peerX25519Key;
  4772. }
  4773. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  4774. if (!ssl->eccTempKeyPresent) {
  4775. return NO_PRIVATE_KEY;
  4776. }
  4777. tmpKey = (struct curve25519_key*)ssl->eccTempKey;
  4778. }
  4779. if (tmpKey) {
  4780. *otherKey = (curve25519_key *)tmpKey;
  4781. ret = 0;
  4782. }
  4783. return ret;
  4784. }
  4785. #endif /* HAVE_PK_CALLBACKS */
  4786. static int X25519SharedSecret(WOLFSSL* ssl, curve25519_key* priv_key,
  4787. curve25519_key* pub_key, byte* pubKeyDer, word32* pubKeySz,
  4788. byte* out, word32* outlen, int side)
  4789. {
  4790. int ret;
  4791. (void)ssl;
  4792. (void)pubKeyDer;
  4793. (void)pubKeySz;
  4794. (void)side;
  4795. WOLFSSL_ENTER("X25519SharedSecret");
  4796. #ifdef WOLFSSL_ASYNC_CRYPT
  4797. /* initialize event */
  4798. ret = wolfSSL_AsyncInit(ssl, &priv_key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4799. if (ret != 0)
  4800. return ret;
  4801. #endif
  4802. #ifdef HAVE_PK_CALLBACKS
  4803. if (ssl->ctx->X25519SharedSecretCb) {
  4804. curve25519_key* otherKey = NULL;
  4805. ret = X25519GetKey(ssl, &otherKey);
  4806. if (ret == 0) {
  4807. void* ctx = wolfSSL_GetX25519SharedSecretCtx(ssl);
  4808. ret = ssl->ctx->X25519SharedSecretCb(ssl, otherKey, pubKeyDer,
  4809. pubKeySz, out, outlen, side, ctx);
  4810. }
  4811. }
  4812. else
  4813. #endif
  4814. {
  4815. ret = wc_curve25519_shared_secret_ex(priv_key, pub_key, out, outlen,
  4816. EC25519_LITTLE_ENDIAN);
  4817. }
  4818. /* Handle async pending response */
  4819. #ifdef WOLFSSL_ASYNC_CRYPT
  4820. if (ret == WC_PENDING_E) {
  4821. ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev);
  4822. }
  4823. #endif /* WOLFSSL_ASYNC_CRYPT */
  4824. WOLFSSL_LEAVE("X25519SharedSecret", ret);
  4825. return ret;
  4826. }
  4827. static int X25519MakeKey(WOLFSSL* ssl, curve25519_key* key,
  4828. curve25519_key* peer)
  4829. {
  4830. int ret = 0;
  4831. (void)peer;
  4832. WOLFSSL_ENTER("X25519MakeKey");
  4833. #ifdef WOLFSSL_ASYNC_CRYPT
  4834. /* initialize event */
  4835. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  4836. if (ret != 0)
  4837. return ret;
  4838. #endif
  4839. #ifdef HAVE_PK_CALLBACKS
  4840. if (ssl->ctx->X25519KeyGenCb) {
  4841. void* ctx = wolfSSL_GetX25519KeyGenCtx(ssl);
  4842. ret = ssl->ctx->X25519KeyGenCb(ssl, key, CURVE25519_KEYSIZE, ctx);
  4843. }
  4844. else
  4845. #endif
  4846. {
  4847. ret = wc_curve25519_make_key(ssl->rng, CURVE25519_KEYSIZE, key);
  4848. }
  4849. if (ret == 0) {
  4850. ssl->ecdhCurveOID = ECC_X25519_OID;
  4851. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  4852. ssl->namedGroup = 0;
  4853. #endif
  4854. }
  4855. /* Handle async pending response */
  4856. #ifdef WOLFSSL_ASYNC_CRYPT
  4857. if (ret == WC_PENDING_E) {
  4858. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4859. }
  4860. #endif /* WOLFSSL_ASYNC_CRYPT */
  4861. WOLFSSL_LEAVE("X25519MakeKey", ret);
  4862. return ret;
  4863. }
  4864. #endif /* HAVE_CURVE25519 */
  4865. #endif /* !WOLFSSL_NO_TLS12 */
  4866. #ifdef HAVE_ED448
  4867. /* Check whether the key contains a public key.
  4868. * If not then pull it out of the leaf certificate.
  4869. *
  4870. * ssl SSL/TLS object.
  4871. * returns MEMORY_E when unable to allocate memory, a parsing error, otherwise
  4872. * 0 on success.
  4873. */
  4874. int Ed448CheckPubKey(WOLFSSL* ssl)
  4875. {
  4876. #ifndef HAVE_ED448_KEY_IMPORT
  4877. (void)ssl;
  4878. return NOT_COMPILED_IN;
  4879. #else /* HAVE_ED448_KEY_IMPORT */
  4880. ed448_key* key = (ed448_key*)ssl->hsKey;
  4881. int ret = 0;
  4882. /* Public key required for signing. */
  4883. if (key != NULL && !key->pubKeySet) {
  4884. const unsigned char* pubKey;
  4885. word32 pubKeySz;
  4886. ret = wc_CertGetPubKey(ssl->buffers.certificate->buffer,
  4887. ssl->buffers.certificate->length, &pubKey, &pubKeySz);
  4888. if (ret == 0) {
  4889. ret = wc_ed448_import_public(pubKey, pubKeySz, key);
  4890. }
  4891. }
  4892. return ret;
  4893. #endif /* HAVE_ED448_KEY_IMPORT */
  4894. }
  4895. /* Sign the data using EdDSA and key using Ed448.
  4896. *
  4897. * ssl SSL object.
  4898. * in Data or message to sign.
  4899. * inSz Length of the data.
  4900. * out Buffer to hold signature.
  4901. * outSz On entry, size of the buffer. On exit, the size of the signature.
  4902. * key The private Ed448 key data.
  4903. * keySz The length of the private key data in bytes.
  4904. * ctx The callback context.
  4905. * returns 0 on success, otherwise the value is an error.
  4906. */
  4907. int Ed448Sign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  4908. word32* outSz, ed448_key* key, DerBuffer* keyBufInfo)
  4909. {
  4910. #ifndef HAVE_ED448_SIGN
  4911. (void)ssl;
  4912. (void)in;
  4913. (void)inSz;
  4914. (void)out;
  4915. (void)outSz;
  4916. (void)key;
  4917. (void)keyBufInfo;
  4918. return NOT_COMPILED_IN;
  4919. #else /* HAVE_ED448_SIGN */
  4920. int ret;
  4921. #ifdef HAVE_PK_CALLBACKS
  4922. const byte* keyBuf = NULL;
  4923. word32 keySz = 0;
  4924. if (keyBufInfo) {
  4925. keyBuf = keyBufInfo->buffer;
  4926. keySz = keyBufInfo->length;
  4927. }
  4928. #endif
  4929. (void)ssl;
  4930. (void)keyBufInfo;
  4931. WOLFSSL_ENTER("Ed448Sign");
  4932. #ifdef WOLFSSL_ASYNC_CRYPT
  4933. /* initialize event */
  4934. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4935. if (ret != 0)
  4936. return ret;
  4937. #endif
  4938. #if defined(HAVE_PK_CALLBACKS)
  4939. if (ssl->ctx->Ed448SignCb) {
  4940. void* ctx = wolfSSL_GetEd448SignCtx(ssl);
  4941. ret = ssl->ctx->Ed448SignCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  4942. ctx);
  4943. }
  4944. else
  4945. #endif /* HAVE_PK_CALLBACKS */
  4946. {
  4947. ret = wc_ed448_sign_msg(in, inSz, out, outSz, key, NULL, 0);
  4948. }
  4949. /* Handle async pending response */
  4950. #ifdef WOLFSSL_ASYNC_CRYPT
  4951. if (ret == WC_PENDING_E) {
  4952. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4953. }
  4954. #endif /* WOLFSSL_ASYNC_CRYPT */
  4955. WOLFSSL_LEAVE("Ed448Sign", ret);
  4956. return ret;
  4957. #endif /* HAVE_ED448_SIGN */
  4958. }
  4959. /* Verify the data using EdDSA and key using Ed448.
  4960. *
  4961. * ssl SSL object.
  4962. * in Signature data.
  4963. * inSz Length of the signature data in bytes.
  4964. * msg Message to verify.
  4965. * outSz Length of message in bytes.
  4966. * key The public Ed448 key data.
  4967. * keySz The length of the private key data in bytes.
  4968. * ctx The callback context.
  4969. * returns 0 on success, otherwise the value is an error.
  4970. */
  4971. int Ed448Verify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* msg,
  4972. word32 msgSz, ed448_key* key, buffer* keyBufInfo)
  4973. {
  4974. #ifndef HAVE_ED448_VERIFY
  4975. (void)ssl;
  4976. (void)in;
  4977. (void)inSz;
  4978. (void)msg;
  4979. (void)msgSz;
  4980. (void)key;
  4981. (void)keyBufInfo;
  4982. return NOT_COMPILED_IN;
  4983. #else /* HAVE_ED448_VERIFY */
  4984. int ret;
  4985. #ifdef HAVE_PK_CALLBACKS
  4986. const byte* keyBuf = NULL;
  4987. word32 keySz = 0;
  4988. if (keyBufInfo) {
  4989. keyBuf = keyBufInfo->buffer;
  4990. keySz = keyBufInfo->length;
  4991. }
  4992. #endif
  4993. (void)ssl;
  4994. (void)keyBufInfo;
  4995. WOLFSSL_ENTER("Ed448Verify");
  4996. #ifdef WOLFSSL_ASYNC_CRYPT
  4997. /* initialize event */
  4998. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4999. if (ret != 0)
  5000. return ret;
  5001. #endif
  5002. #ifdef HAVE_PK_CALLBACKS
  5003. if (ssl->ctx->Ed448VerifyCb) {
  5004. void* ctx = wolfSSL_GetEd448VerifyCtx(ssl);
  5005. ret = ssl->ctx->Ed448VerifyCb(ssl, in, inSz, msg, msgSz, keyBuf, keySz,
  5006. &ssl->eccVerifyRes, ctx);
  5007. }
  5008. else
  5009. #endif /* HAVE_PK_CALLBACKS */
  5010. {
  5011. ret = wc_ed448_verify_msg(in, inSz, msg, msgSz, &ssl->eccVerifyRes, key,
  5012. NULL, 0);
  5013. }
  5014. /* Handle async pending response */
  5015. #ifdef WOLFSSL_ASYNC_CRYPT
  5016. if (ret == WC_PENDING_E) {
  5017. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  5018. }
  5019. else
  5020. #endif /* WOLFSSL_ASYNC_CRYPT */
  5021. {
  5022. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  5023. }
  5024. WOLFSSL_LEAVE("Ed448Verify", ret);
  5025. return ret;
  5026. #endif /* HAVE_ED448_VERIFY */
  5027. }
  5028. #endif /* HAVE_ED448 */
  5029. #ifndef WOLFSSL_NO_TLS12
  5030. #ifdef HAVE_CURVE448
  5031. #ifdef HAVE_PK_CALLBACKS
  5032. /* Gets X448 key for shared secret callback testing
  5033. * Client side: returns peer key
  5034. * Server side: returns private key
  5035. */
  5036. static int X448GetKey(WOLFSSL* ssl, curve448_key** otherKey)
  5037. {
  5038. int ret = NO_PEER_KEY;
  5039. struct curve448_key* tmpKey = NULL;
  5040. if (ssl == NULL || otherKey == NULL) {
  5041. return BAD_FUNC_ARG;
  5042. }
  5043. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  5044. if (!ssl->peerX448Key || !ssl->peerX448KeyPresent) {
  5045. return NO_PEER_KEY;
  5046. }
  5047. tmpKey = (struct curve448_key*)ssl->peerX448Key;
  5048. }
  5049. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  5050. if (!ssl->eccTempKeyPresent) {
  5051. return NO_PRIVATE_KEY;
  5052. }
  5053. tmpKey = (struct curve448_key*)ssl->eccTempKey;
  5054. }
  5055. if (tmpKey) {
  5056. *otherKey = (curve448_key *)tmpKey;
  5057. ret = 0;
  5058. }
  5059. return ret;
  5060. }
  5061. #endif /* HAVE_PK_CALLBACKS */
  5062. static int X448SharedSecret(WOLFSSL* ssl, curve448_key* priv_key,
  5063. curve448_key* pub_key, byte* pubKeyDer,
  5064. word32* pubKeySz, byte* out, word32* outlen,
  5065. int side)
  5066. {
  5067. int ret;
  5068. (void)ssl;
  5069. (void)pubKeyDer;
  5070. (void)pubKeySz;
  5071. (void)side;
  5072. WOLFSSL_ENTER("X448SharedSecret");
  5073. #ifdef WOLFSSL_ASYNC_CRYPT
  5074. /* initialize event */
  5075. ret = wolfSSL_AsyncInit(ssl, &priv_key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  5076. if (ret != 0)
  5077. return ret;
  5078. #endif
  5079. #ifdef HAVE_PK_CALLBACKS
  5080. if (ssl->ctx->X448SharedSecretCb) {
  5081. curve448_key* otherKey = NULL;
  5082. ret = X448GetKey(ssl, &otherKey);
  5083. if (ret == 0) {
  5084. void* ctx = wolfSSL_GetX448SharedSecretCtx(ssl);
  5085. ret = ssl->ctx->X448SharedSecretCb(ssl, otherKey, pubKeyDer,
  5086. pubKeySz, out, outlen, side, ctx);
  5087. }
  5088. }
  5089. else
  5090. #endif
  5091. {
  5092. ret = wc_curve448_shared_secret_ex(priv_key, pub_key, out, outlen,
  5093. EC448_LITTLE_ENDIAN);
  5094. }
  5095. /* Handle async pending response */
  5096. #ifdef WOLFSSL_ASYNC_CRYPT
  5097. if (ret == WC_PENDING_E) {
  5098. ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev);
  5099. }
  5100. #endif /* WOLFSSL_ASYNC_CRYPT */
  5101. WOLFSSL_LEAVE("X448SharedSecret", ret);
  5102. return ret;
  5103. }
  5104. static int X448MakeKey(WOLFSSL* ssl, curve448_key* key, curve448_key* peer)
  5105. {
  5106. int ret = 0;
  5107. (void)peer;
  5108. WOLFSSL_ENTER("X448MakeKey");
  5109. #ifdef WOLFSSL_ASYNC_CRYPT
  5110. /* initialize event */
  5111. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  5112. if (ret != 0)
  5113. return ret;
  5114. #endif
  5115. #ifdef HAVE_PK_CALLBACKS
  5116. if (ssl->ctx->X448KeyGenCb) {
  5117. void* ctx = wolfSSL_GetX448KeyGenCtx(ssl);
  5118. ret = ssl->ctx->X448KeyGenCb(ssl, key, CURVE448_KEY_SIZE, ctx);
  5119. }
  5120. else
  5121. #endif
  5122. {
  5123. ret = wc_curve448_make_key(ssl->rng, CURVE448_KEY_SIZE, key);
  5124. }
  5125. if (ret == 0) {
  5126. ssl->ecdhCurveOID = ECC_X448_OID;
  5127. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  5128. ssl->namedGroup = 0;
  5129. #endif
  5130. }
  5131. /* Handle async pending response */
  5132. #ifdef WOLFSSL_ASYNC_CRYPT
  5133. if (ret == WC_PENDING_E) {
  5134. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  5135. }
  5136. #endif /* WOLFSSL_ASYNC_CRYPT */
  5137. WOLFSSL_LEAVE("X448MakeKey", ret);
  5138. return ret;
  5139. }
  5140. #endif /* HAVE_CURVE448 */
  5141. #endif /* !WOLFSSL_NO_TLS12 */
  5142. #if !defined(NO_CERTS) || !defined(NO_PSK)
  5143. #if !defined(NO_DH)
  5144. int DhGenKeyPair(WOLFSSL* ssl, DhKey* dhKey,
  5145. byte* priv, word32* privSz,
  5146. byte* pub, word32* pubSz)
  5147. {
  5148. int ret;
  5149. WOLFSSL_ENTER("DhGenKeyPair");
  5150. #ifdef WOLFSSL_ASYNC_CRYPT
  5151. /* initialize event */
  5152. ret = wolfSSL_AsyncInit(ssl, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
  5153. if (ret != 0)
  5154. return ret;
  5155. #endif
  5156. #if defined(HAVE_PK_CALLBACKS)
  5157. ret = NOT_COMPILED_IN;
  5158. if (ssl && ssl->ctx && ssl->ctx->DhGenerateKeyPairCb) {
  5159. ret = ssl->ctx->DhGenerateKeyPairCb(dhKey, ssl->rng, priv, privSz,
  5160. pub, pubSz);
  5161. }
  5162. if (ret == NOT_COMPILED_IN)
  5163. #endif
  5164. {
  5165. PRIVATE_KEY_UNLOCK();
  5166. ret = wc_DhGenerateKeyPair(dhKey, ssl->rng, priv, privSz, pub, pubSz);
  5167. PRIVATE_KEY_LOCK();
  5168. }
  5169. /* Handle async pending response */
  5170. #ifdef WOLFSSL_ASYNC_CRYPT
  5171. if (ret == WC_PENDING_E) {
  5172. ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev);
  5173. }
  5174. #endif /* WOLFSSL_ASYNC_CRYPT */
  5175. WOLFSSL_LEAVE("DhGenKeyPair", ret);
  5176. return ret;
  5177. }
  5178. int DhAgree(WOLFSSL* ssl, DhKey* dhKey,
  5179. const byte* priv, word32 privSz,
  5180. const byte* otherPub, word32 otherPubSz,
  5181. byte* agree, word32* agreeSz,
  5182. const byte* prime, word32 primeSz)
  5183. {
  5184. int ret;
  5185. (void)ssl;
  5186. WOLFSSL_ENTER("DhAgree");
  5187. #ifdef WOLFSSL_ASYNC_CRYPT
  5188. /* initialize event */
  5189. ret = wolfSSL_AsyncInit(ssl, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
  5190. if (ret != 0)
  5191. return ret;
  5192. #endif
  5193. #ifdef HAVE_PK_CALLBACKS
  5194. if (ssl->ctx->DhAgreeCb) {
  5195. void* ctx = wolfSSL_GetDhAgreeCtx(ssl);
  5196. WOLFSSL_MSG("Calling DhAgree Callback Function");
  5197. ret = ssl->ctx->DhAgreeCb(ssl, dhKey, priv, privSz,
  5198. otherPub, otherPubSz, agree, agreeSz, ctx);
  5199. }
  5200. else
  5201. #endif
  5202. {
  5203. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  5204. /* check the public key has valid number */
  5205. if (dhKey != NULL && (prime == NULL || primeSz == 0)) {
  5206. /* wc_DhCheckPubKey does not do exponentiation */
  5207. ret = wc_DhCheckPubKey(dhKey, otherPub, otherPubSz);
  5208. }
  5209. else {
  5210. ret = wc_DhCheckPubValue(prime, primeSz, otherPub, otherPubSz);
  5211. }
  5212. if (ret != 0) {
  5213. /* translate to valid error (wc_DhCheckPubValue returns MP_VAL -1) */
  5214. ret = PEER_KEY_ERROR;
  5215. WOLFSSL_ERROR_VERBOSE(ret);
  5216. #ifdef OPENSSL_EXTRA
  5217. SendAlert(ssl, alert_fatal, illegal_parameter);
  5218. #endif
  5219. }
  5220. else
  5221. #endif
  5222. {
  5223. PRIVATE_KEY_UNLOCK();
  5224. ret = wc_DhAgree(dhKey, agree, agreeSz, priv, privSz, otherPub,
  5225. otherPubSz);
  5226. PRIVATE_KEY_LOCK();
  5227. }
  5228. }
  5229. /* Handle async pending response */
  5230. #ifdef WOLFSSL_ASYNC_CRYPT
  5231. if (ret == WC_PENDING_E) {
  5232. ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev);
  5233. }
  5234. #endif /* WOLFSSL_ASYNC_CRYPT */
  5235. WOLFSSL_LEAVE("DhAgree", ret);
  5236. (void)prime;
  5237. (void)primeSz;
  5238. return ret;
  5239. }
  5240. #endif /* !NO_DH */
  5241. #endif /* !NO_CERTS || !NO_PSK */
  5242. #ifdef HAVE_PK_CALLBACKS
  5243. int wolfSSL_IsPrivatePkSet(WOLFSSL* ssl)
  5244. {
  5245. int pkcbset = 0;
  5246. (void)ssl;
  5247. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  5248. !defined(NO_RSA)
  5249. if (0
  5250. #ifdef HAVE_ECC
  5251. || (ssl->ctx->EccSignCb != NULL &&
  5252. ssl->buffers.keyType == ecc_dsa_sa_algo)
  5253. #endif
  5254. #ifdef HAVE_ED25519
  5255. || (ssl->ctx->Ed25519SignCb != NULL &&
  5256. ssl->buffers.keyType == ed25519_sa_algo)
  5257. #endif
  5258. #ifdef HAVE_ED448
  5259. || (ssl->ctx->Ed448SignCb != NULL &&
  5260. ssl->buffers.keyType == ed448_sa_algo)
  5261. #endif
  5262. #ifndef NO_RSA
  5263. || (ssl->ctx->RsaSignCb != NULL && ssl->buffers.keyType == rsa_sa_algo)
  5264. || (ssl->ctx->RsaDecCb != NULL && ssl->buffers.keyType == rsa_kea)
  5265. #ifdef WC_RSA_PSS
  5266. || (ssl->ctx->RsaPssSignCb != NULL &&
  5267. ssl->buffers.keyType == rsa_pss_sa_algo)
  5268. #endif
  5269. #endif
  5270. ) {
  5271. pkcbset = 1;
  5272. }
  5273. #endif
  5274. return pkcbset;
  5275. }
  5276. int wolfSSL_CTX_IsPrivatePkSet(WOLFSSL_CTX* ctx)
  5277. {
  5278. int pkcbset = 0;
  5279. (void)ctx;
  5280. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  5281. !defined(NO_RSA)
  5282. if (0
  5283. #ifdef HAVE_ECC
  5284. || ctx->EccSignCb != NULL
  5285. #endif
  5286. #ifdef HAVE_ED25519
  5287. || ctx->Ed25519SignCb != NULL
  5288. #endif
  5289. #ifdef HAVE_ED448
  5290. || ctx->Ed448SignCb != NULL
  5291. #endif
  5292. #ifndef NO_RSA
  5293. || ctx->RsaSignCb != NULL
  5294. || ctx->RsaDecCb != NULL
  5295. #ifdef WC_RSA_PSS
  5296. || ctx->RsaPssSignCb != NULL
  5297. #endif
  5298. #endif
  5299. ) {
  5300. pkcbset = 1;
  5301. }
  5302. #endif
  5303. return pkcbset;
  5304. }
  5305. #endif /* HAVE_PK_CALLBACKS */
  5306. static void InitSuites_EitherSide(Suites* suites, ProtocolVersion pv, int keySz,
  5307. word16 haveRSA, word16 havePSK, word16 haveDH, word16 haveECDSAsig,
  5308. word16 haveECC, word16 haveStaticECC,
  5309. word16 haveFalconSig, word16 haveDilithiumSig, word16 haveAnon,
  5310. int side)
  5311. {
  5312. /* make sure server has DH parms, and add PSK if there */
  5313. if (side == WOLFSSL_SERVER_END) {
  5314. InitSuites(suites, pv, keySz, haveRSA, havePSK, haveDH, haveECDSAsig,
  5315. haveECC, TRUE, haveStaticECC, haveFalconSig,
  5316. haveDilithiumSig, haveAnon, TRUE, side);
  5317. }
  5318. else {
  5319. InitSuites(suites, pv, keySz, haveRSA, havePSK, TRUE, haveECDSAsig,
  5320. haveECC, TRUE, haveStaticECC, haveFalconSig,
  5321. haveDilithiumSig, haveAnon, TRUE, side);
  5322. }
  5323. }
  5324. void InitSSL_CTX_Suites(WOLFSSL_CTX* ctx)
  5325. {
  5326. int keySz = 0;
  5327. byte havePSK = 0;
  5328. byte haveAnon = 0;
  5329. byte haveRSA = 0;
  5330. #ifndef NO_RSA
  5331. haveRSA = 1;
  5332. #endif
  5333. #ifndef NO_PSK
  5334. havePSK = ctx->havePSK;
  5335. #endif /* NO_PSK */
  5336. #ifdef HAVE_ANON
  5337. haveAnon = ctx->haveAnon;
  5338. #endif /* HAVE_ANON*/
  5339. #ifndef NO_CERTS
  5340. keySz = ctx->privateKeySz;
  5341. #endif
  5342. InitSuites_EitherSide(ctx->suites, ctx->method->version, keySz,
  5343. haveRSA, havePSK, ctx->haveDH, ctx->haveECDSAsig, ctx->haveECC,
  5344. ctx->haveStaticECC, ctx->haveFalconSig, ctx->haveDilithiumSig,
  5345. haveAnon, ctx->method->side);
  5346. }
  5347. int InitSSL_Suites(WOLFSSL* ssl)
  5348. {
  5349. int keySz = 0;
  5350. byte havePSK = 0;
  5351. byte haveAnon = 0;
  5352. byte haveRSA = 0;
  5353. byte haveMcast = 0;
  5354. (void)haveAnon; /* Squash unused var warnings */
  5355. (void)haveMcast;
  5356. if (!ssl)
  5357. return BAD_FUNC_ARG;
  5358. #ifndef NO_RSA
  5359. haveRSA = 1;
  5360. #endif
  5361. #ifndef NO_PSK
  5362. havePSK = (byte)ssl->options.havePSK;
  5363. #endif /* NO_PSK */
  5364. #if !defined(NO_CERTS) && !defined(WOLFSSL_SESSION_EXPORT)
  5365. #ifdef HAVE_ANON
  5366. haveAnon = (byte)ssl->options.haveAnon;
  5367. #endif /* HAVE_ANON*/
  5368. #ifdef WOLFSSL_MULTICAST
  5369. haveMcast = (byte)ssl->options.haveMcast;
  5370. #endif /* WOLFSSL_MULTICAST */
  5371. #endif /* !NO_CERTS && !WOLFSSL_SESSION_EXPORT */
  5372. #ifdef WOLFSSL_EARLY_DATA
  5373. if (ssl->options.side == WOLFSSL_SERVER_END)
  5374. ssl->options.maxEarlyDataSz = ssl->ctx->maxEarlyDataSz;
  5375. #endif
  5376. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  5377. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  5378. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  5379. ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END ||
  5380. ssl->buffers.keyType == ed25519_sa_algo ||
  5381. ssl->buffers.keyType == ed448_sa_algo;
  5382. #endif
  5383. #ifndef NO_CERTS
  5384. keySz = ssl->buffers.keySz;
  5385. #endif
  5386. if (ssl->suites != NULL) {
  5387. InitSuites_EitherSide(ssl->suites, ssl->version, keySz, haveRSA,
  5388. havePSK, ssl->options.haveDH, ssl->options.haveECDSAsig,
  5389. ssl->options.haveECC, ssl->options.haveStaticECC,
  5390. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  5391. ssl->options.haveAnon, ssl->options.side);
  5392. }
  5393. #if !defined(NO_CERTS) && !defined(WOLFSSL_SESSION_EXPORT)
  5394. /* make sure server has cert and key unless using PSK, Anon, or
  5395. * Multicast. This should be true even if just switching ssl ctx */
  5396. if (ssl->options.side == WOLFSSL_SERVER_END &&
  5397. !havePSK && !haveAnon && !haveMcast) {
  5398. /* server certificate must be loaded */
  5399. if (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer) {
  5400. WOLFSSL_MSG("Server missing certificate");
  5401. WOLFSSL_ERROR_VERBOSE(NO_PRIVATE_KEY);
  5402. return NO_PRIVATE_KEY;
  5403. }
  5404. if (!ssl->buffers.key || !ssl->buffers.key->buffer) {
  5405. /* allow no private key if using existing key */
  5406. #ifdef WOLF_PRIVATE_KEY_ID
  5407. if (ssl->devId != INVALID_DEVID
  5408. #ifdef HAVE_PK_CALLBACKS
  5409. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  5410. #endif
  5411. ) {
  5412. WOLFSSL_MSG("Allowing no server private key (external)");
  5413. }
  5414. else
  5415. #endif
  5416. {
  5417. WOLFSSL_MSG("Server missing private key");
  5418. WOLFSSL_ERROR_VERBOSE(NO_PRIVATE_KEY);
  5419. return NO_PRIVATE_KEY;
  5420. }
  5421. }
  5422. }
  5423. #endif
  5424. return WOLFSSL_SUCCESS;
  5425. }
  5426. /* This function inherits a WOLFSSL_CTX's fields into an SSL object.
  5427. It is used during initialization and to switch an ssl's CTX with
  5428. wolfSSL_Set_SSL_CTX. Requires ssl->suites alloc and ssl-arrays with PSK
  5429. unless writeDup is on.
  5430. ssl object to initialize
  5431. ctx parent factory
  5432. writeDup flag indicating this is a write dup only
  5433. WOLFSSL_SUCCESS return value on success */
  5434. int SetSSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  5435. {
  5436. int ret;
  5437. byte newSSL;
  5438. WOLFSSL_ENTER("SetSSL_CTX");
  5439. if (!ssl || !ctx)
  5440. return BAD_FUNC_ARG;
  5441. newSSL = ssl->ctx == NULL; /* Assign after null check */
  5442. #ifndef NO_PSK
  5443. if (ctx->server_hint[0] && ssl->arrays == NULL && !writeDup) {
  5444. return BAD_FUNC_ARG; /* needed for copy below */
  5445. }
  5446. #endif
  5447. /* decrement previous CTX reference count if exists.
  5448. * This should only happen if switching ctxs!*/
  5449. if (!newSSL) {
  5450. WOLFSSL_MSG("freeing old ctx to decrement reference count. Switching ctx.");
  5451. wolfSSL_CTX_free(ssl->ctx);
  5452. }
  5453. /* increment CTX reference count */
  5454. wolfSSL_RefInc(&ctx->ref, &ret);
  5455. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  5456. if (ret < 0) {
  5457. return ret;
  5458. }
  5459. #else
  5460. (void)ret;
  5461. #endif
  5462. ret = WOLFSSL_SUCCESS; /* set default ret */
  5463. ssl->ctx = ctx; /* only for passing to calls, options could change */
  5464. /* Don't change version on a SSL object that has already started a
  5465. * handshake */
  5466. if (!ssl->msgsReceived.got_client_hello &&
  5467. !ssl->msgsReceived.got_server_hello)
  5468. ssl->version = ctx->method->version;
  5469. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  5470. ssl->options.mask = ctx->mask;
  5471. ssl->options.minProto = ctx->minProto;
  5472. ssl->options.maxProto = ctx->maxProto;
  5473. #endif
  5474. #ifdef OPENSSL_EXTRA
  5475. #ifdef WOLFSSL_TLS13
  5476. if (ssl->version.minor == TLSv1_3_MINOR &&
  5477. (ssl->options.mask & SSL_OP_NO_TLSv1_3) == SSL_OP_NO_TLSv1_3) {
  5478. if (!ctx->method->downgrade) {
  5479. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.3 set but not "
  5480. "allowed and downgrading disabled.");
  5481. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5482. return VERSION_ERROR;
  5483. }
  5484. WOLFSSL_MSG("\tOption set to not allow TLSv1.3, Downgrading");
  5485. ssl->version.minor = TLSv1_2_MINOR;
  5486. }
  5487. #endif
  5488. if (ssl->version.minor == TLSv1_2_MINOR &&
  5489. (ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  5490. if (!ctx->method->downgrade) {
  5491. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.2 set but not "
  5492. "allowed and downgrading disabled.");
  5493. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5494. return VERSION_ERROR;
  5495. }
  5496. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  5497. ssl->version.minor = TLSv1_1_MINOR;
  5498. }
  5499. if (ssl->version.minor == TLSv1_1_MINOR &&
  5500. (ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  5501. if (!ctx->method->downgrade) {
  5502. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.1 set but not "
  5503. "allowed and downgrading disabled.");
  5504. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5505. return VERSION_ERROR;
  5506. }
  5507. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  5508. ssl->options.tls1_1 = 0;
  5509. ssl->version.minor = TLSv1_MINOR;
  5510. }
  5511. if (ssl->version.minor == TLSv1_MINOR &&
  5512. (ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  5513. if (!ctx->method->downgrade) {
  5514. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1 set but not "
  5515. "allowed and downgrading disabled.");
  5516. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5517. return VERSION_ERROR;
  5518. }
  5519. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  5520. ssl->options.tls = 0;
  5521. ssl->options.tls1_1 = 0;
  5522. ssl->version.minor = SSLv3_MINOR;
  5523. }
  5524. if (ssl->version.minor == SSLv3_MINOR &&
  5525. (ssl->options.mask & SSL_OP_NO_SSLv3) == SSL_OP_NO_SSLv3) {
  5526. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  5527. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5528. return VERSION_ERROR;
  5529. }
  5530. if (ssl->version.minor < ssl->options.minDowngrade) {
  5531. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  5532. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5533. return VERSION_ERROR;
  5534. }
  5535. #endif
  5536. #ifdef HAVE_ECC
  5537. ssl->eccTempKeySz = ctx->eccTempKeySz;
  5538. ssl->ecdhCurveOID = ctx->ecdhCurveOID;
  5539. #endif
  5540. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  5541. ssl->pkCurveOID = ctx->pkCurveOID;
  5542. #endif
  5543. #ifdef OPENSSL_EXTRA
  5544. ssl->CBIS = ctx->CBIS;
  5545. #endif
  5546. ssl->timeout = ctx->timeout;
  5547. ssl->verifyCallback = ctx->verifyCallback;
  5548. /* If we are setting the ctx on an already initialized SSL object
  5549. * then we possibly already have a side defined. Don't overwrite unless
  5550. * the context has a well defined role. */
  5551. if (newSSL || ctx->method->side != WOLFSSL_NEITHER_END)
  5552. ssl->options.side = ctx->method->side;
  5553. ssl->options.downgrade = ctx->method->downgrade;
  5554. ssl->options.minDowngrade = ctx->minDowngrade;
  5555. ssl->options.haveRSA = ctx->haveRSA;
  5556. ssl->options.haveDH = ctx->haveDH;
  5557. ssl->options.haveECDSAsig = ctx->haveECDSAsig;
  5558. ssl->options.haveECC = ctx->haveECC;
  5559. ssl->options.haveStaticECC = ctx->haveStaticECC;
  5560. ssl->options.haveFalconSig = ctx->haveFalconSig;
  5561. ssl->options.haveDilithiumSig = ctx->haveDilithiumSig;
  5562. #ifndef NO_PSK
  5563. ssl->options.havePSK = ctx->havePSK;
  5564. ssl->options.client_psk_cb = ctx->client_psk_cb;
  5565. ssl->options.server_psk_cb = ctx->server_psk_cb;
  5566. ssl->options.psk_ctx = ctx->psk_ctx;
  5567. #ifdef WOLFSSL_TLS13
  5568. ssl->options.client_psk_cs_cb = ctx->client_psk_cs_cb;
  5569. ssl->options.client_psk_tls13_cb = ctx->client_psk_tls13_cb;
  5570. ssl->options.server_psk_tls13_cb = ctx->server_psk_tls13_cb;
  5571. #endif
  5572. #endif /* NO_PSK */
  5573. #ifdef WOLFSSL_EARLY_DATA
  5574. if (ssl->options.side == WOLFSSL_SERVER_END)
  5575. ssl->options.maxEarlyDataSz = ctx->maxEarlyDataSz;
  5576. #endif
  5577. #ifdef HAVE_ANON
  5578. ssl->options.haveAnon = ctx->haveAnon;
  5579. #endif
  5580. #ifndef NO_DH
  5581. ssl->options.minDhKeySz = ctx->minDhKeySz;
  5582. ssl->options.maxDhKeySz = ctx->maxDhKeySz;
  5583. #endif
  5584. #ifndef NO_RSA
  5585. ssl->options.minRsaKeySz = ctx->minRsaKeySz;
  5586. #endif
  5587. #ifdef HAVE_ECC
  5588. ssl->options.minEccKeySz = ctx->minEccKeySz;
  5589. #endif
  5590. #ifdef HAVE_PQC
  5591. #ifdef HAVE_FALCON
  5592. ssl->options.minFalconKeySz = ctx->minFalconKeySz;
  5593. #endif /* HAVE_FALCON */
  5594. #ifdef HAVE_DILITHIUM
  5595. ssl->options.minDilithiumKeySz = ctx->minDilithiumKeySz;
  5596. #endif /* HAVE_DILITHIUM */
  5597. #endif /* HAVE_PQC */
  5598. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  5599. ssl->options.verifyDepth = ctx->verifyDepth;
  5600. #endif
  5601. ssl->options.sessionCacheOff = ctx->sessionCacheOff;
  5602. ssl->options.sessionCacheFlushOff = ctx->sessionCacheFlushOff;
  5603. #ifdef HAVE_EXT_CACHE
  5604. ssl->options.internalCacheOff = ctx->internalCacheOff;
  5605. ssl->options.internalCacheLookupOff = ctx->internalCacheLookupOff;
  5606. #endif
  5607. ssl->options.verifyPeer = ctx->verifyPeer;
  5608. ssl->options.verifyNone = ctx->verifyNone;
  5609. ssl->options.failNoCert = ctx->failNoCert;
  5610. ssl->options.failNoCertxPSK = ctx->failNoCertxPSK;
  5611. ssl->options.sendVerify = ctx->sendVerify;
  5612. ssl->options.partialWrite = ctx->partialWrite;
  5613. ssl->options.quietShutdown = ctx->quietShutdown;
  5614. ssl->options.groupMessages = ctx->groupMessages;
  5615. #ifndef NO_DH
  5616. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  5617. !defined(HAVE_SELFTEST)
  5618. ssl->options.dhKeyTested = ctx->dhKeyTested;
  5619. #endif
  5620. ssl->buffers.serverDH_P = ctx->serverDH_P;
  5621. ssl->buffers.serverDH_G = ctx->serverDH_G;
  5622. #endif
  5623. #ifndef NO_CERTS
  5624. /* ctx still owns certificate, certChain, key, dh, and cm */
  5625. ssl->buffers.certificate = ctx->certificate;
  5626. ssl->buffers.certChain = ctx->certChain;
  5627. #ifdef WOLFSSL_TLS13
  5628. ssl->buffers.certChainCnt = ctx->certChainCnt;
  5629. #endif
  5630. ssl->buffers.key = ctx->privateKey;
  5631. ssl->buffers.keyType = ctx->privateKeyType;
  5632. ssl->buffers.keyId = ctx->privateKeyId;
  5633. ssl->buffers.keyLabel = ctx->privateKeyLabel;
  5634. ssl->buffers.keySz = ctx->privateKeySz;
  5635. ssl->buffers.keyDevId = ctx->privateKeyDevId;
  5636. #endif
  5637. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  5638. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  5639. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  5640. ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END ||
  5641. ssl->buffers.keyType == ed25519_sa_algo ||
  5642. ssl->buffers.keyType == ed448_sa_algo;
  5643. #endif
  5644. #ifdef WOLFSSL_ASYNC_CRYPT
  5645. ssl->devId = ctx->devId;
  5646. #endif
  5647. if (writeDup == 0) {
  5648. #ifndef NO_PSK
  5649. if (ctx->server_hint[0]) { /* set in CTX */
  5650. XSTRNCPY(ssl->arrays->server_hint, ctx->server_hint,
  5651. sizeof(ssl->arrays->server_hint));
  5652. ssl->arrays->server_hint[MAX_PSK_ID_LEN] = '\0'; /* null term */
  5653. }
  5654. #endif /* NO_PSK */
  5655. if (ssl->suites != NULL) {
  5656. if (ctx->suites == NULL)
  5657. XMEMSET(ssl->suites, 0, sizeof(Suites));
  5658. else
  5659. XMEMCPY(ssl->suites, ctx->suites, sizeof(Suites));
  5660. }
  5661. if (ssl->options.side != WOLFSSL_NEITHER_END) {
  5662. /* Defer initializing suites until accept or connect */
  5663. ret = InitSSL_Suites(ssl);
  5664. }
  5665. } /* writeDup check */
  5666. if (ctx->mask != 0 && wolfSSL_set_options(ssl, ctx->mask) == 0) {
  5667. WOLFSSL_MSG("wolfSSL_set_options error");
  5668. return BAD_FUNC_ARG;
  5669. }
  5670. #ifdef WOLFSSL_SESSION_EXPORT
  5671. #ifdef WOLFSSL_DTLS
  5672. ssl->dtls_export = ctx->dtls_export; /* export function for session */
  5673. #endif
  5674. #endif
  5675. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  5676. ssl->AcceptFilter = ctx->AcceptFilter;
  5677. ssl->AcceptFilter_arg = ctx->AcceptFilter_arg;
  5678. ssl->ConnectFilter = ctx->ConnectFilter;
  5679. ssl->ConnectFilter_arg = ctx->ConnectFilter_arg;
  5680. #endif
  5681. #ifdef OPENSSL_EXTRA
  5682. ssl->readAhead = ctx->readAhead;
  5683. #endif
  5684. #if defined(OPENSSL_EXTRA) && !defined(NO_BIO)
  5685. /* Don't change recv callback if currently using BIO's */
  5686. if (ssl->CBIORecv != BioReceive)
  5687. #endif
  5688. ssl->CBIORecv = ctx->CBIORecv;
  5689. #if defined(OPENSSL_EXTRA) && !defined(NO_BIO)
  5690. /* Don't change send callback if currently using BIO's */
  5691. if (ssl->CBIOSend != BioSend)
  5692. #endif
  5693. ssl->CBIOSend = ctx->CBIOSend;
  5694. ssl->verifyDepth = ctx->verifyDepth;
  5695. return ret;
  5696. }
  5697. int InitHandshakeHashes(WOLFSSL* ssl)
  5698. {
  5699. int ret;
  5700. /* make sure existing handshake hashes are free'd */
  5701. if (ssl->hsHashes != NULL) {
  5702. FreeHandshakeHashes(ssl);
  5703. }
  5704. /* allocate handshake hashes */
  5705. ssl->hsHashes = (HS_Hashes*)XMALLOC(sizeof(HS_Hashes), ssl->heap,
  5706. DYNAMIC_TYPE_HASHES);
  5707. if (ssl->hsHashes == NULL) {
  5708. WOLFSSL_MSG("HS_Hashes Memory error");
  5709. return MEMORY_E;
  5710. }
  5711. XMEMSET(ssl->hsHashes, 0, sizeof(HS_Hashes));
  5712. #ifndef NO_OLD_TLS
  5713. #ifndef NO_MD5
  5714. ret = wc_InitMd5_ex(&ssl->hsHashes->hashMd5, ssl->heap, ssl->devId);
  5715. if (ret != 0)
  5716. return ret;
  5717. #ifdef WOLFSSL_HASH_FLAGS
  5718. wc_Md5SetFlags(&ssl->hsHashes->hashMd5, WC_HASH_FLAG_WILLCOPY);
  5719. #endif
  5720. #endif
  5721. #ifndef NO_SHA
  5722. ret = wc_InitSha_ex(&ssl->hsHashes->hashSha, ssl->heap, ssl->devId);
  5723. if (ret != 0)
  5724. return ret;
  5725. #ifdef WOLFSSL_HASH_FLAGS
  5726. wc_ShaSetFlags(&ssl->hsHashes->hashSha, WC_HASH_FLAG_WILLCOPY);
  5727. #endif
  5728. #endif
  5729. #endif /* !NO_OLD_TLS */
  5730. #ifndef NO_SHA256
  5731. ret = wc_InitSha256_ex(&ssl->hsHashes->hashSha256, ssl->heap, ssl->devId);
  5732. if (ret != 0)
  5733. return ret;
  5734. #ifdef WOLFSSL_HASH_FLAGS
  5735. wc_Sha256SetFlags(&ssl->hsHashes->hashSha256, WC_HASH_FLAG_WILLCOPY);
  5736. #endif
  5737. #endif
  5738. #ifdef WOLFSSL_SHA384
  5739. ret = wc_InitSha384_ex(&ssl->hsHashes->hashSha384, ssl->heap, ssl->devId);
  5740. if (ret != 0)
  5741. return ret;
  5742. #ifdef WOLFSSL_HASH_FLAGS
  5743. wc_Sha384SetFlags(&ssl->hsHashes->hashSha384, WC_HASH_FLAG_WILLCOPY);
  5744. #endif
  5745. #endif
  5746. #ifdef WOLFSSL_SHA512
  5747. ret = wc_InitSha512_ex(&ssl->hsHashes->hashSha512, ssl->heap, ssl->devId);
  5748. if (ret != 0)
  5749. return ret;
  5750. #ifdef WOLFSSL_HASH_FLAGS
  5751. wc_Sha512SetFlags(&ssl->hsHashes->hashSha512, WC_HASH_FLAG_WILLCOPY);
  5752. #endif
  5753. #endif
  5754. return ret;
  5755. }
  5756. void FreeHandshakeHashes(WOLFSSL* ssl)
  5757. {
  5758. if (ssl->hsHashes) {
  5759. #ifndef NO_OLD_TLS
  5760. #ifndef NO_MD5
  5761. wc_Md5Free(&ssl->hsHashes->hashMd5);
  5762. #endif
  5763. #ifndef NO_SHA
  5764. wc_ShaFree(&ssl->hsHashes->hashSha);
  5765. #endif
  5766. #endif /* !NO_OLD_TLS */
  5767. #ifndef NO_SHA256
  5768. wc_Sha256Free(&ssl->hsHashes->hashSha256);
  5769. #endif
  5770. #ifdef WOLFSSL_SHA384
  5771. wc_Sha384Free(&ssl->hsHashes->hashSha384);
  5772. #endif
  5773. #ifdef WOLFSSL_SHA512
  5774. wc_Sha512Free(&ssl->hsHashes->hashSha512);
  5775. #endif
  5776. #if (defined(HAVE_ED25519) || defined(HAVE_ED448)) && \
  5777. !defined(WOLFSSL_NO_CLIENT_AUTH)
  5778. if (ssl->hsHashes->messages != NULL) {
  5779. ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
  5780. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  5781. ssl->hsHashes->messages = NULL;
  5782. }
  5783. #endif
  5784. XFREE(ssl->hsHashes, ssl->heap, DYNAMIC_TYPE_HASHES);
  5785. ssl->hsHashes = NULL;
  5786. }
  5787. }
  5788. /* copy the hashes from source to a newly made destination return status */
  5789. int InitHandshakeHashesAndCopy(WOLFSSL* ssl, HS_Hashes* source,
  5790. HS_Hashes** destination)
  5791. {
  5792. int ret = 0;
  5793. HS_Hashes* tmpHashes;
  5794. if (source == NULL)
  5795. return BAD_FUNC_ARG;
  5796. /* save the original so we can put it back afterward */
  5797. tmpHashes = ssl->hsHashes;
  5798. ssl->hsHashes = NULL;
  5799. InitHandshakeHashes(ssl);
  5800. *destination = ssl->hsHashes;
  5801. ssl->hsHashes = tmpHashes;
  5802. /* now copy the source contents to the destination */
  5803. #ifndef NO_OLD_TLS
  5804. #ifndef NO_SHA
  5805. ret = wc_ShaCopy(&source->hashSha, &(*destination)->hashSha);
  5806. #endif
  5807. #ifndef NO_MD5
  5808. if (ret == 0)
  5809. ret = wc_Md5Copy(&source->hashMd5, &(*destination)->hashMd5);
  5810. #endif
  5811. #endif /* !NO_OLD_TLS */
  5812. #ifndef NO_SHA256
  5813. if (ret == 0)
  5814. ret = wc_Sha256Copy(&source->hashSha256,
  5815. &(*destination)->hashSha256);
  5816. #endif
  5817. #ifdef WOLFSSL_SHA384
  5818. if (ret == 0)
  5819. ret = wc_Sha384Copy(&source->hashSha384,
  5820. &(*destination)->hashSha384);
  5821. #endif
  5822. #ifdef WOLFSSL_SHA512
  5823. if (ret == 0)
  5824. ret = wc_Sha512Copy(&source->hashSha512,
  5825. &(*destination)->hashSha512);
  5826. #endif
  5827. #if (defined(HAVE_ED25519) || defined(HAVE_ED448)) && \
  5828. !defined(WOLFSSL_NO_CLIENT_AUTH)
  5829. if (ret == 0 && source->messages != NULL) {
  5830. (*destination)->messages = (byte*)XMALLOC(source->length, ssl->heap,
  5831. DYNAMIC_TYPE_HASHES);
  5832. (*destination)->length = source->length;
  5833. (*destination)->prevLen = source->prevLen;
  5834. if ((*destination)->messages == NULL) {
  5835. ret = MEMORY_E;
  5836. }
  5837. else {
  5838. XMEMCPY((*destination)->messages, source->messages,
  5839. source->length);
  5840. }
  5841. }
  5842. #endif
  5843. return ret;
  5844. }
  5845. /* called if user attempts to re-use WOLFSSL object for a new session.
  5846. * For example wolfSSL_clear() is called then wolfSSL_connect or accept */
  5847. int ReinitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  5848. {
  5849. int ret = 0;
  5850. WOLFSSL_ENTER("ReinitSSL");
  5851. /* arrays */
  5852. if (!writeDup && ssl->arrays == NULL) {
  5853. ssl->arrays = (Arrays*)XMALLOC(sizeof(Arrays), ssl->heap,
  5854. DYNAMIC_TYPE_ARRAYS);
  5855. if (ssl->arrays == NULL) {
  5856. WOLFSSL_MSG("Arrays Memory error");
  5857. return MEMORY_E;
  5858. }
  5859. #ifdef WOLFSSL_CHECK_MEM_ZERO
  5860. wc_MemZero_Add("SSL Arrays", ssl->arrays, sizeof(*ssl->arrays));
  5861. #endif
  5862. XMEMSET(ssl->arrays, 0, sizeof(Arrays));
  5863. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_SNIFFER)
  5864. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  5865. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN, ssl->heap,
  5866. DYNAMIC_TYPE_SECRET);
  5867. if (ssl->arrays->preMasterSecret == NULL) {
  5868. return MEMORY_E;
  5869. }
  5870. #ifdef WOLFSSL_CHECK_MEM_ZERO
  5871. wc_MemZero_Add("SSL Arrays", ssl->arrays->preMasterSecret, ENCRYPT_LEN);
  5872. #endif
  5873. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  5874. #endif
  5875. }
  5876. /* RNG */
  5877. #ifdef SINGLE_THREADED
  5878. if (ssl->rng == NULL) {
  5879. ssl->rng = ctx->rng; /* CTX may have one, if so use it */
  5880. }
  5881. #endif
  5882. if (ssl->rng == NULL) {
  5883. ssl->rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), ssl->heap,DYNAMIC_TYPE_RNG);
  5884. if (ssl->rng == NULL) {
  5885. WOLFSSL_MSG("RNG Memory error");
  5886. return MEMORY_E;
  5887. }
  5888. XMEMSET(ssl->rng, 0, sizeof(WC_RNG));
  5889. ssl->options.weOwnRng = 1;
  5890. /* FIPS RNG API does not accept a heap hint */
  5891. #ifndef HAVE_FIPS
  5892. if ( (ret = wc_InitRng_ex(ssl->rng, ssl->heap, ssl->devId)) != 0) {
  5893. WOLFSSL_MSG("RNG Init error");
  5894. return ret;
  5895. }
  5896. #else
  5897. if ( (ret = wc_InitRng(ssl->rng)) != 0) {
  5898. WOLFSSL_MSG("RNG Init error");
  5899. return ret;
  5900. }
  5901. #endif
  5902. }
  5903. (void)ctx;
  5904. ssl->options.shutdownDone = 0;
  5905. if (ssl->session != NULL)
  5906. ssl->session->side = (byte)ssl->options.side;
  5907. return ret;
  5908. }
  5909. /* init everything to 0, NULL, default values before calling anything that may
  5910. fail so that destructor has a "good" state to cleanup
  5911. ssl object to initialize
  5912. ctx parent factory
  5913. writeDup flag indicating this is a write dup only
  5914. 0 on success */
  5915. int InitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  5916. {
  5917. int ret;
  5918. XMEMSET(ssl, 0, sizeof(WOLFSSL));
  5919. #ifdef WOLFSSL_CHECK_MEM_ZERO
  5920. wc_MemZero_Add("SSL Keys", &ssl->keys, sizeof(ssl->keys));
  5921. #ifdef WOLFSSL_TLS13
  5922. wc_MemZero_Add("SSL client secret", &ssl->clientSecret,
  5923. sizeof(ssl->clientSecret));
  5924. wc_MemZero_Add("SSL client secret", &ssl->serverSecret,
  5925. sizeof(ssl->serverSecret));
  5926. #endif
  5927. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  5928. wc_MemZero_Add("ClientFinished hash", &ssl->clientFinished,
  5929. TLS_FINISHED_SZ_MAX);
  5930. wc_MemZero_Add("ServerFinished hash", &ssl->serverFinished,
  5931. TLS_FINISHED_SZ_MAX);
  5932. #endif
  5933. #endif
  5934. #if defined(WOLFSSL_STATIC_MEMORY)
  5935. if (ctx->heap != NULL) {
  5936. WOLFSSL_HEAP_HINT* ssl_hint;
  5937. WOLFSSL_HEAP_HINT* ctx_hint;
  5938. /* avoid dereferencing a test value */
  5939. #ifdef WOLFSSL_HEAP_TEST
  5940. if (ctx->heap == (void*)WOLFSSL_HEAP_TEST) {
  5941. ssl->heap = ctx->heap;
  5942. }
  5943. else {
  5944. #endif
  5945. ssl->heap = (WOLFSSL_HEAP_HINT*)XMALLOC(sizeof(WOLFSSL_HEAP_HINT),
  5946. ctx->heap, DYNAMIC_TYPE_SSL);
  5947. if (ssl->heap == NULL) {
  5948. return MEMORY_E;
  5949. }
  5950. XMEMSET(ssl->heap, 0, sizeof(WOLFSSL_HEAP_HINT));
  5951. ssl_hint = ((WOLFSSL_HEAP_HINT*)(ssl->heap));
  5952. ctx_hint = ((WOLFSSL_HEAP_HINT*)(ctx->heap));
  5953. /* lock and check IO count / handshake count */
  5954. if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) {
  5955. WOLFSSL_MSG("Bad memory_mutex lock");
  5956. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  5957. ssl->heap = NULL; /* free and set to NULL for IO counter */
  5958. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  5959. return BAD_MUTEX_E;
  5960. }
  5961. if (ctx_hint->memory->maxHa > 0 &&
  5962. ctx_hint->memory->maxHa <= ctx_hint->memory->curHa) {
  5963. WOLFSSL_MSG("At max number of handshakes for static memory");
  5964. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5965. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  5966. ssl->heap = NULL; /* free and set to NULL for IO counter */
  5967. return MEMORY_E;
  5968. }
  5969. if (ctx_hint->memory->maxIO > 0 &&
  5970. ctx_hint->memory->maxIO <= ctx_hint->memory->curIO) {
  5971. WOLFSSL_MSG("At max number of IO allowed for static memory");
  5972. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5973. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  5974. ssl->heap = NULL; /* free and set to NULL for IO counter */
  5975. return MEMORY_E;
  5976. }
  5977. ctx_hint->memory->curIO++;
  5978. ctx_hint->memory->curHa++;
  5979. ssl_hint->memory = ctx_hint->memory;
  5980. ssl_hint->haFlag = 1;
  5981. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5982. /* check if tracking stats */
  5983. if (ctx_hint->memory->flag & WOLFMEM_TRACK_STATS) {
  5984. ssl_hint->stats = (WOLFSSL_MEM_CONN_STATS*)XMALLOC(
  5985. sizeof(WOLFSSL_MEM_CONN_STATS), ctx->heap, DYNAMIC_TYPE_SSL);
  5986. if (ssl_hint->stats == NULL) {
  5987. return MEMORY_E;
  5988. }
  5989. XMEMSET(ssl_hint->stats, 0, sizeof(WOLFSSL_MEM_CONN_STATS));
  5990. }
  5991. /* check if using fixed IO buffers */
  5992. if (ctx_hint->memory->flag & WOLFMEM_IO_POOL_FIXED) {
  5993. if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) {
  5994. WOLFSSL_MSG("Bad memory_mutex lock");
  5995. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  5996. return BAD_MUTEX_E;
  5997. }
  5998. if (SetFixedIO(ctx_hint->memory, &(ssl_hint->inBuf)) != 1) {
  5999. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  6000. return MEMORY_E;
  6001. }
  6002. if (SetFixedIO(ctx_hint->memory, &(ssl_hint->outBuf)) != 1) {
  6003. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  6004. return MEMORY_E;
  6005. }
  6006. if (ssl_hint->outBuf == NULL || ssl_hint->inBuf == NULL) {
  6007. WOLFSSL_MSG("Not enough memory to create fixed IO buffers");
  6008. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  6009. return MEMORY_E;
  6010. }
  6011. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  6012. }
  6013. #ifdef WOLFSSL_HEAP_TEST
  6014. }
  6015. #endif
  6016. }
  6017. else {
  6018. ssl->heap = ctx->heap;
  6019. }
  6020. #else
  6021. ssl->heap = ctx->heap; /* carry over user heap without static memory */
  6022. #endif /* WOLFSSL_STATIC_MEMORY */
  6023. ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
  6024. ssl->buffers.inputBuffer.bufferSize = STATIC_BUFFER_LEN;
  6025. ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
  6026. ssl->buffers.outputBuffer.bufferSize = STATIC_BUFFER_LEN;
  6027. #ifdef KEEP_PEER_CERT
  6028. InitX509(&ssl->peerCert, 0, ssl->heap);
  6029. #endif
  6030. ssl->rfd = -1; /* set to invalid descriptor */
  6031. ssl->wfd = -1;
  6032. ssl->devId = ctx->devId; /* device for async HW (from wolfAsync_DevOpen) */
  6033. /* initialize states */
  6034. ssl->options.serverState = NULL_STATE;
  6035. ssl->options.clientState = NULL_STATE;
  6036. ssl->options.connectState = CONNECT_BEGIN;
  6037. ssl->options.acceptState = ACCEPT_BEGIN;
  6038. ssl->options.handShakeState = NULL_STATE;
  6039. ssl->options.processReply = doProcessInit;
  6040. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  6041. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  6042. ssl->encrypt.state = CIPHER_STATE_BEGIN;
  6043. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  6044. #ifndef NO_DH
  6045. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  6046. !defined(HAVE_SELFTEST)
  6047. ssl->options.dhDoKeyTest = 1;
  6048. #endif
  6049. #endif
  6050. #ifdef WOLFSSL_DTLS
  6051. #ifdef WOLFSSL_SCTP
  6052. ssl->options.dtlsSctp = ctx->dtlsSctp;
  6053. #endif
  6054. #ifdef WOLFSSL_SRTP
  6055. ssl->dtlsSrtpProfiles = ctx->dtlsSrtpProfiles;
  6056. #endif
  6057. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  6058. ssl->dtlsMtuSz = ctx->dtlsMtuSz;
  6059. /* Add some bytes so that we can operate with slight difference
  6060. * in set MTU size on each peer */
  6061. ssl->dtls_expected_rx = ssl->dtlsMtuSz +
  6062. DTLS_MTU_ADDITIONAL_READ_BUFFER;
  6063. #else
  6064. ssl->dtls_expected_rx = MAX_MTU;
  6065. #endif
  6066. ssl->dtls_timeout_init = DTLS_TIMEOUT_INIT;
  6067. ssl->dtls_timeout_max = DTLS_TIMEOUT_MAX;
  6068. ssl->dtls_timeout = ssl->dtls_timeout_init;
  6069. ssl->buffers.dtlsCtx.rfd = -1;
  6070. ssl->buffers.dtlsCtx.wfd = -1;
  6071. ssl->IOCB_ReadCtx = &ssl->buffers.dtlsCtx; /* prevent invalid pointer access if not */
  6072. ssl->IOCB_WriteCtx = &ssl->buffers.dtlsCtx; /* correctly set */
  6073. #else
  6074. #ifdef HAVE_NETX
  6075. ssl->IOCB_ReadCtx = &ssl->nxCtx; /* default NetX IO ctx, same for read */
  6076. ssl->IOCB_WriteCtx = &ssl->nxCtx; /* and write */
  6077. #elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  6078. ssl->mnCtx = mynewt_ctx_new();
  6079. if(!ssl->mnCtx) {
  6080. return MEMORY_E;
  6081. }
  6082. ssl->IOCB_ReadCtx = ssl->mnCtx; /* default Mynewt IO ctx, same for read */
  6083. ssl->IOCB_WriteCtx = ssl->mnCtx; /* and write */
  6084. #elif defined (WOLFSSL_GNRC)
  6085. ssl->IOCB_ReadCtx = ssl->gnrcCtx;
  6086. ssl->IOCB_WriteCtx = ssl->gnrcCtx;
  6087. #else
  6088. ssl->IOCB_ReadCtx = &ssl->rfd; /* prevent invalid pointer access if not */
  6089. ssl->IOCB_WriteCtx = &ssl->wfd; /* correctly set */
  6090. #endif
  6091. #endif
  6092. #ifndef WOLFSSL_AEAD_ONLY
  6093. #ifndef NO_OLD_TLS
  6094. ssl->hmac = SSL_hmac; /* default to SSLv3 */
  6095. #elif !defined(WOLFSSL_NO_TLS12) && !defined(NO_TLS)
  6096. #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \
  6097. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  6098. ssl->hmac = TLS_hmac;
  6099. #else
  6100. ssl->hmac = Renesas_cmn_TLS_hmac;
  6101. #endif
  6102. #endif
  6103. #endif
  6104. #if defined(WOLFSSL_OPENVPN) && defined(HAVE_KEYING_MATERIAL)
  6105. /* Save arrays by default for OpenVPN */
  6106. ssl->options.saveArrays = 1;
  6107. #endif
  6108. ssl->cipher.ssl = ssl;
  6109. #ifdef HAVE_EXTENDED_MASTER
  6110. ssl->options.haveEMS = ctx->haveEMS;
  6111. #endif
  6112. ssl->options.useClientOrder = ctx->useClientOrder;
  6113. ssl->options.mutualAuth = ctx->mutualAuth;
  6114. #ifdef WOLFSSL_TLS13
  6115. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  6116. ssl->options.maxTicketTls13 = ctx->maxTicketTls13;
  6117. #endif
  6118. #ifdef HAVE_SESSION_TICKET
  6119. ssl->options.noTicketTls13 = ctx->noTicketTls13;
  6120. #endif
  6121. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  6122. ssl->options.noPskDheKe = ctx->noPskDheKe;
  6123. #ifdef HAVE_SUPPORTED_CURVES
  6124. ssl->options.onlyPskDheKe = ctx->onlyPskDheKe;
  6125. #endif /* HAVE_SUPPORTED_CURVES */
  6126. #endif /* HAVE_SESSION_TICKET || !NO_PSK */
  6127. #if defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6128. ssl->options.postHandshakeAuth = ctx->postHandshakeAuth;
  6129. ssl->options.verifyPostHandshake = ctx->verifyPostHandshake;
  6130. #endif
  6131. if (ctx->numGroups > 0) {
  6132. XMEMCPY(ssl->group, ctx->group, sizeof(*ctx->group) * ctx->numGroups);
  6133. ssl->numGroups = ctx->numGroups;
  6134. }
  6135. #endif
  6136. #ifdef HAVE_TLS_EXTENSIONS
  6137. #ifdef HAVE_MAX_FRAGMENT
  6138. ssl->max_fragment = MAX_RECORD_SIZE;
  6139. #endif
  6140. #ifdef HAVE_ALPN
  6141. ssl->alpn_peer_requested = NULL;
  6142. ssl->alpn_peer_requested_length = 0;
  6143. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  6144. ssl->alpnSelect = ctx->alpnSelect;
  6145. ssl->alpnSelectArg = ctx->alpnSelectArg;
  6146. #endif
  6147. #if !defined(NO_BIO) && defined(OPENSSL_EXTRA)
  6148. if (ctx->alpn_cli_protos != NULL && ctx->alpn_cli_protos_len > 0) {
  6149. ret = wolfSSL_set_alpn_protos(ssl, ctx->alpn_cli_protos,
  6150. ctx->alpn_cli_protos_len);
  6151. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  6152. if (ret) {
  6153. #else
  6154. if (!ret) {
  6155. #endif
  6156. WOLFSSL_MSG("failed to set alpn protos to ssl object");
  6157. return ret;
  6158. }
  6159. }
  6160. #endif
  6161. #endif
  6162. #ifdef HAVE_SUPPORTED_CURVES
  6163. ssl->options.userCurves = ctx->userCurves;
  6164. #endif
  6165. #endif /* HAVE_TLS_EXTENSIONS */
  6166. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  6167. ssl->options.disallowEncThenMac = ctx->disallowEncThenMac;
  6168. #endif
  6169. /* default alert state (none) */
  6170. ssl->alert_history.last_rx.code = -1;
  6171. ssl->alert_history.last_rx.level = -1;
  6172. ssl->alert_history.last_tx.code = -1;
  6173. ssl->alert_history.last_tx.level = -1;
  6174. #ifdef OPENSSL_EXTRA
  6175. /* copy over application session context ID */
  6176. ssl->sessionCtxSz = ctx->sessionCtxSz;
  6177. XMEMCPY(ssl->sessionCtx, ctx->sessionCtx, ctx->sessionCtxSz);
  6178. ssl->cbioFlag = ctx->cbioFlag;
  6179. ssl->protoMsgCb = ctx->protoMsgCb;
  6180. ssl->protoMsgCtx = ctx->protoMsgCtx;
  6181. /* follow default behavior of setting toInfoOn similar to
  6182. * wolfSSL_set_msg_callback when the callback is set */
  6183. if (ctx->protoMsgCb != NULL) {
  6184. ssl->toInfoOn = 1;
  6185. }
  6186. ssl->disabledCurves = ctx->disabledCurves;
  6187. #endif
  6188. InitCiphers(ssl);
  6189. InitCipherSpecs(&ssl->specs);
  6190. /* all done with init, now can return errors, call other stuff */
  6191. if ((ret = ReinitSSL(ssl, ctx, writeDup)) != 0) {
  6192. return ret;
  6193. }
  6194. if (!writeDup) {
  6195. #ifdef OPENSSL_EXTRA
  6196. if ((ssl->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  6197. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  6198. ssl->heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  6199. WOLFSSL_MSG("ssl->param memory error");
  6200. return MEMORY_E;
  6201. }
  6202. XMEMSET(ssl->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  6203. #endif
  6204. if (ctx->suites == NULL) {
  6205. /* suites */
  6206. ret = AllocateCtxSuites(ctx);
  6207. if (ret != 0)
  6208. return ret;
  6209. InitSSL_CTX_Suites(ctx);
  6210. }
  6211. #ifdef OPENSSL_ALL
  6212. ssl->suitesStack = NULL;
  6213. #endif
  6214. } /* !writeDup */
  6215. /* Initialize SSL with the appropriate fields from it's ctx */
  6216. /* requires valid arrays and suites unless writeDup ing */
  6217. if ((ret = SetSSL_CTX(ssl, ctx, writeDup)) != WOLFSSL_SUCCESS)
  6218. return ret;
  6219. ssl->options.dtls = ssl->version.major == DTLS_MAJOR;
  6220. #ifdef HAVE_WRITE_DUP
  6221. if (writeDup) {
  6222. /* all done */
  6223. return 0;
  6224. }
  6225. #endif
  6226. /* hsHashes */
  6227. ret = InitHandshakeHashes(ssl);
  6228. if (ret != 0)
  6229. return ret;
  6230. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  6231. if (ssl->options.dtls && ssl->options.side == WOLFSSL_SERVER_END) {
  6232. if (!IsAtLeastTLSv1_3(ssl->version)) {
  6233. ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0);
  6234. if (ret != 0) {
  6235. WOLFSSL_MSG("DTLS Cookie Secret error");
  6236. return ret;
  6237. }
  6238. }
  6239. #if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
  6240. else {
  6241. ret = wolfSSL_send_hrr_cookie(ssl, NULL, 0);
  6242. if (ret != WOLFSSL_SUCCESS) {
  6243. WOLFSSL_MSG("DTLS1.3 Cookie secret error");
  6244. return ret;
  6245. }
  6246. }
  6247. #endif /* WOLFSSL_DTLS13 && WOLFSSL_SEND_HRR_COOKIE */
  6248. }
  6249. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  6250. #ifdef HAVE_SECRET_CALLBACK
  6251. ssl->sessionSecretCb = NULL;
  6252. ssl->sessionSecretCtx = NULL;
  6253. #ifdef WOLFSSL_TLS13
  6254. ssl->tls13SecretCb = NULL;
  6255. ssl->tls13SecretCtx = NULL;
  6256. #endif
  6257. #endif
  6258. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  6259. if (ctx->keyLogCb != NULL) {
  6260. ssl->keyLogCb = SessionSecret_callback;
  6261. #if defined(WOLFSSL_TLS13)
  6262. ssl->tls13KeyLogCb = SessionSecret_callback_Tls13;
  6263. #endif /*WOLFSSL_TLS13*/
  6264. }
  6265. #endif /*OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */
  6266. ssl->session = wolfSSL_NewSession(ssl->heap);
  6267. if (ssl->session == NULL) {
  6268. WOLFSSL_MSG("SSL Session Memory error");
  6269. return MEMORY_E;
  6270. }
  6271. #ifdef HAVE_SESSION_TICKET
  6272. ssl->options.noTicketTls12 = ctx->noTicketTls12;
  6273. #endif
  6274. #ifdef WOLFSSL_MULTICAST
  6275. if (ctx->haveMcast) {
  6276. int i;
  6277. ssl->options.haveMcast = 1;
  6278. ssl->options.mcastID = ctx->mcastID;
  6279. /* Force the state to look like handshake has completed. */
  6280. /* Keying material is supplied externally. */
  6281. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  6282. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  6283. ssl->options.connectState = SECOND_REPLY_DONE;
  6284. ssl->options.acceptState = ACCEPT_THIRD_REPLY_DONE;
  6285. ssl->options.handShakeState = HANDSHAKE_DONE;
  6286. ssl->options.handShakeDone = 1;
  6287. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++)
  6288. ssl->keys.peerSeq[i].peerId = INVALID_PEER_ID;
  6289. }
  6290. #endif
  6291. #if defined(HAVE_SECURE_RENEGOTIATION) || \
  6292. defined(HAVE_SERVER_RENEGOTIATION_INFO)
  6293. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  6294. int useSecureReneg = ssl->ctx->useSecureReneg;
  6295. /* use secure renegotiation by default (not recommend) */
  6296. #if defined(WOLFSSL_SECURE_RENEGOTIATION_ON_BY_DEFAULT) || \
  6297. (defined(WOLFSSL_HARDEN_TLS) && !defined(WOLFSSL_NO_TLS12) && \
  6298. !defined(WOLFSSL_HARDEN_TLS_NO_SCR_CHECK))
  6299. useSecureReneg = 1;
  6300. #endif
  6301. if (useSecureReneg) {
  6302. ret = wolfSSL_UseSecureRenegotiation(ssl);
  6303. if (ret != WOLFSSL_SUCCESS)
  6304. return ret;
  6305. }
  6306. }
  6307. #endif /* HAVE_SECURE_RENEGOTIATION */
  6308. #ifdef WOLFSSL_DTLS13
  6309. /* setup 0 (un-protected) epoch */
  6310. ssl->dtls13Epochs[0].isValid = 1;
  6311. ssl->dtls13Epochs[0].side = ENCRYPT_AND_DECRYPT_SIDE;
  6312. ssl->dtls13EncryptEpoch = &ssl->dtls13Epochs[0];
  6313. ssl->dtls13DecryptEpoch = &ssl->dtls13Epochs[0];
  6314. ssl->options.dtls13SendMoreAcks = WOLFSSL_DTLS13_SEND_MOREACK_DEFAULT;
  6315. ssl->dtls13Rtx.rtxRecordTailPtr = &ssl->dtls13Rtx.rtxRecords;
  6316. #endif /* WOLFSSL_DTLS13 */
  6317. #ifdef WOLFSSL_QUIC
  6318. if (ctx->quic.method) {
  6319. ret = wolfSSL_set_quic_method(ssl, ctx->quic.method);
  6320. if (ret != WOLFSSL_SUCCESS)
  6321. return ret;
  6322. }
  6323. #endif
  6324. #if defined(WOLFSSL_MAXQ10XX_TLS)
  6325. ret = wolfSSL_maxq10xx_load_certificate(ssl);
  6326. if (ret != WOLFSSL_SUCCESS)
  6327. return ret;
  6328. #endif
  6329. return 0;
  6330. }
  6331. /* free use of temporary arrays */
  6332. void FreeArrays(WOLFSSL* ssl, int keep)
  6333. {
  6334. if (ssl->arrays) {
  6335. if (keep && !IsAtLeastTLSv1_3(ssl->version)) {
  6336. /* keeps session id for user retrieval */
  6337. XMEMCPY(ssl->session->sessionID, ssl->arrays->sessionID, ID_LEN);
  6338. ssl->session->sessionIDSz = ssl->arrays->sessionIDSz;
  6339. }
  6340. if (ssl->arrays->preMasterSecret) {
  6341. ForceZero(ssl->arrays->preMasterSecret, ENCRYPT_LEN);
  6342. XFREE(ssl->arrays->preMasterSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
  6343. ssl->arrays->preMasterSecret = NULL;
  6344. }
  6345. XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  6346. ssl->arrays->pendingMsg = NULL;
  6347. ForceZero(ssl->arrays, sizeof(Arrays)); /* clear arrays struct */
  6348. }
  6349. XFREE(ssl->arrays, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  6350. ssl->arrays = NULL;
  6351. }
  6352. void FreeKey(WOLFSSL* ssl, int type, void** pKey)
  6353. {
  6354. if (ssl && pKey && *pKey) {
  6355. switch (type) {
  6356. #ifndef NO_RSA
  6357. case DYNAMIC_TYPE_RSA:
  6358. wc_FreeRsaKey((RsaKey*)*pKey);
  6359. break;
  6360. #endif /* ! NO_RSA */
  6361. #ifdef HAVE_ECC
  6362. case DYNAMIC_TYPE_ECC:
  6363. #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
  6364. defined(WC_ASYNC_ENABLE_ECC)
  6365. if (((ecc_key*)*pKey)->nb_ctx != NULL) {
  6366. XFREE(((ecc_key*)*pKey)->nb_ctx, ((ecc_key*)*pKey)->heap,
  6367. DYNAMIC_TYPE_TMP_BUFFER);
  6368. }
  6369. #endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
  6370. WC_ASYNC_ENABLE_ECC */
  6371. wc_ecc_free((ecc_key*)*pKey);
  6372. break;
  6373. #endif /* HAVE_ECC */
  6374. #ifdef HAVE_ED25519
  6375. case DYNAMIC_TYPE_ED25519:
  6376. wc_ed25519_free((ed25519_key*)*pKey);
  6377. break;
  6378. #endif /* HAVE_ED25519 */
  6379. #ifdef HAVE_CURVE25519
  6380. case DYNAMIC_TYPE_CURVE25519:
  6381. wc_curve25519_free((curve25519_key*)*pKey);
  6382. break;
  6383. #endif /* HAVE_CURVE25519 */
  6384. #ifdef HAVE_ED448
  6385. case DYNAMIC_TYPE_ED448:
  6386. wc_ed448_free((ed448_key*)*pKey);
  6387. break;
  6388. #endif /* HAVE_ED448 */
  6389. #ifdef HAVE_CURVE448
  6390. case DYNAMIC_TYPE_CURVE448:
  6391. wc_curve448_free((curve448_key*)*pKey);
  6392. break;
  6393. #endif /* HAVE_CURVE448 */
  6394. #if defined(HAVE_PQC)
  6395. #if defined(HAVE_FALCON)
  6396. case DYNAMIC_TYPE_FALCON:
  6397. wc_falcon_free((falcon_key*)*pKey);
  6398. break;
  6399. #endif /* HAVE_FALCON */
  6400. #if defined(HAVE_DILITHIUM)
  6401. case DYNAMIC_TYPE_DILITHIUM:
  6402. wc_dilithium_free((dilithium_key*)*pKey);
  6403. break;
  6404. #endif /* HAVE_DILITHIUM */
  6405. #endif /* HAVE_PQC */
  6406. #ifndef NO_DH
  6407. case DYNAMIC_TYPE_DH:
  6408. wc_FreeDhKey((DhKey*)*pKey);
  6409. break;
  6410. #endif /* !NO_DH */
  6411. default:
  6412. break;
  6413. }
  6414. XFREE(*pKey, ssl->heap, type);
  6415. /* Reset pointer */
  6416. *pKey = NULL;
  6417. }
  6418. }
  6419. int AllocKey(WOLFSSL* ssl, int type, void** pKey)
  6420. {
  6421. int ret = BAD_FUNC_ARG;
  6422. int sz = 0;
  6423. #ifdef HAVE_ECC
  6424. ecc_key* eccKey;
  6425. #endif /* HAVE_ECC */
  6426. #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
  6427. defined(WC_ASYNC_ENABLE_ECC)
  6428. ecc_nb_ctx_t* nbCtx;
  6429. #endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW && WC_ASYNC_ENABLE_ECC*/
  6430. if (ssl == NULL || pKey == NULL) {
  6431. return BAD_FUNC_ARG;
  6432. }
  6433. /* Sanity check key destination */
  6434. if (*pKey != NULL) {
  6435. WOLFSSL_MSG("Key already present!");
  6436. return BAD_STATE_E;
  6437. }
  6438. /* Determine size */
  6439. switch (type) {
  6440. #ifndef NO_RSA
  6441. case DYNAMIC_TYPE_RSA:
  6442. sz = sizeof(RsaKey);
  6443. break;
  6444. #endif /* ! NO_RSA */
  6445. #ifdef HAVE_ECC
  6446. case DYNAMIC_TYPE_ECC:
  6447. sz = sizeof(ecc_key);
  6448. break;
  6449. #endif /* HAVE_ECC */
  6450. #ifdef HAVE_ED25519
  6451. case DYNAMIC_TYPE_ED25519:
  6452. sz = sizeof(ed25519_key);
  6453. break;
  6454. #endif /* HAVE_ED25519 */
  6455. #ifdef HAVE_CURVE25519
  6456. case DYNAMIC_TYPE_CURVE25519:
  6457. sz = sizeof(curve25519_key);
  6458. break;
  6459. #endif /* HAVE_CURVE25519 */
  6460. #ifdef HAVE_ED448
  6461. case DYNAMIC_TYPE_ED448:
  6462. sz = sizeof(ed448_key);
  6463. break;
  6464. #endif /* HAVE_ED448 */
  6465. #ifdef HAVE_CURVE448
  6466. case DYNAMIC_TYPE_CURVE448:
  6467. sz = sizeof(curve448_key);
  6468. break;
  6469. #endif /* HAVE_CURVE448 */
  6470. #if defined(HAVE_PQC)
  6471. #if defined(HAVE_FALCON)
  6472. case DYNAMIC_TYPE_FALCON:
  6473. sz = sizeof(falcon_key);
  6474. break;
  6475. #endif /* HAVE_FALCON */
  6476. #if defined(HAVE_DILITHIUM)
  6477. case DYNAMIC_TYPE_DILITHIUM:
  6478. sz = sizeof(dilithium_key);
  6479. break;
  6480. #endif /* HAVE_DILITHIUM */
  6481. #endif /* HAVE_PQC */
  6482. #ifndef NO_DH
  6483. case DYNAMIC_TYPE_DH:
  6484. sz = sizeof(DhKey);
  6485. break;
  6486. #endif /* !NO_DH */
  6487. default:
  6488. return BAD_FUNC_ARG;
  6489. }
  6490. /* Allocate memory for key */
  6491. *pKey = (void *)XMALLOC(sz, ssl->heap, type);
  6492. if (*pKey == NULL) {
  6493. return MEMORY_E;
  6494. }
  6495. /* Initialize key */
  6496. switch (type) {
  6497. #ifndef NO_RSA
  6498. case DYNAMIC_TYPE_RSA:
  6499. ret = wc_InitRsaKey_ex((RsaKey*)*pKey, ssl->heap, ssl->devId);
  6500. break;
  6501. #endif /* ! NO_RSA */
  6502. #ifdef HAVE_ECC
  6503. case DYNAMIC_TYPE_ECC:
  6504. eccKey = (ecc_key*)*pKey;
  6505. ret = wc_ecc_init_ex(eccKey, ssl->heap, ssl->devId);
  6506. if (ret == 0) {
  6507. #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
  6508. defined(WC_ASYNC_ENABLE_ECC)
  6509. nbCtx = (ecc_nb_ctx_t*)XMALLOC(sizeof(ecc_nb_ctx_t),
  6510. eccKey->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6511. if (nbCtx == NULL) {
  6512. ret = MEMORY_E;
  6513. }
  6514. else {
  6515. ret = wc_ecc_set_nonblock(eccKey, nbCtx);
  6516. if (ret != 0) {
  6517. XFREE(nbCtx, eccKey->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6518. }
  6519. }
  6520. #endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
  6521. WC_ASYNC_ENABLE_ECC */
  6522. }
  6523. break;
  6524. #endif /* HAVE_ECC */
  6525. #ifdef HAVE_ED25519
  6526. case DYNAMIC_TYPE_ED25519:
  6527. wc_ed25519_init_ex((ed25519_key*)*pKey, ssl->heap, ssl->devId);
  6528. ret = 0;
  6529. break;
  6530. #endif /* HAVE_CURVE25519 */
  6531. #ifdef HAVE_CURVE25519
  6532. case DYNAMIC_TYPE_CURVE25519:
  6533. wc_curve25519_init_ex((curve25519_key*)*pKey, ssl->heap, ssl->devId);
  6534. ret = 0;
  6535. break;
  6536. #endif /* HAVE_CURVE25519 */
  6537. #ifdef HAVE_ED448
  6538. case DYNAMIC_TYPE_ED448:
  6539. wc_ed448_init_ex((ed448_key*)*pKey, ssl->heap, ssl->devId);
  6540. ret = 0;
  6541. break;
  6542. #endif /* HAVE_CURVE448 */
  6543. #if defined(HAVE_PQC)
  6544. #if defined(HAVE_FALCON)
  6545. case DYNAMIC_TYPE_FALCON:
  6546. wc_falcon_init((falcon_key*)*pKey);
  6547. ret = 0;
  6548. break;
  6549. #endif /* HAVE_FALCON */
  6550. #if defined(HAVE_DILITHIUM)
  6551. case DYNAMIC_TYPE_DILITHIUM:
  6552. wc_dilithium_init((dilithium_key*)*pKey);
  6553. ret = 0;
  6554. break;
  6555. #endif /* HAVE_DILITHIUM */
  6556. #endif /* HAVE_PQC */
  6557. #ifdef HAVE_CURVE448
  6558. case DYNAMIC_TYPE_CURVE448:
  6559. wc_curve448_init((curve448_key*)*pKey);
  6560. ret = 0;
  6561. break;
  6562. #endif /* HAVE_CURVE448 */
  6563. #ifndef NO_DH
  6564. case DYNAMIC_TYPE_DH:
  6565. ret = wc_InitDhKey_ex((DhKey*)*pKey, ssl->heap, ssl->devId);
  6566. break;
  6567. #endif /* !NO_DH */
  6568. default:
  6569. return BAD_FUNC_ARG;
  6570. }
  6571. /* On error free handshake key */
  6572. if (ret != 0) {
  6573. FreeKey(ssl, type, pKey);
  6574. }
  6575. return ret;
  6576. }
  6577. #if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  6578. defined(HAVE_CURVE25519) || defined(HAVE_ED448) || \
  6579. defined(HAVE_CURVE448) || (defined(HAVE_PQC) && defined(HAVE_FALCON)) || \
  6580. (defined(HAVE_PQC) && defined(HAVE_DILITHIUM))
  6581. static int ReuseKey(WOLFSSL* ssl, int type, void* pKey)
  6582. {
  6583. int ret = 0;
  6584. (void)ssl;
  6585. switch (type) {
  6586. #ifndef NO_RSA
  6587. case DYNAMIC_TYPE_RSA:
  6588. wc_FreeRsaKey((RsaKey*)pKey);
  6589. ret = wc_InitRsaKey_ex((RsaKey*)pKey, ssl->heap, ssl->devId);
  6590. break;
  6591. #endif /* ! NO_RSA */
  6592. #ifdef HAVE_ECC
  6593. case DYNAMIC_TYPE_ECC:
  6594. wc_ecc_free((ecc_key*)pKey);
  6595. ret = wc_ecc_init_ex((ecc_key*)pKey, ssl->heap, ssl->devId);
  6596. break;
  6597. #endif /* HAVE_ECC */
  6598. #ifdef HAVE_ED25519
  6599. case DYNAMIC_TYPE_ED25519:
  6600. wc_ed25519_free((ed25519_key*)pKey);
  6601. ret = wc_ed25519_init_ex((ed25519_key*)pKey, ssl->heap,
  6602. ssl->devId);
  6603. break;
  6604. #endif /* HAVE_CURVE25519 */
  6605. #ifdef HAVE_CURVE25519
  6606. case DYNAMIC_TYPE_CURVE25519:
  6607. wc_curve25519_free((curve25519_key*)pKey);
  6608. ret = wc_curve25519_init_ex((curve25519_key*)pKey, ssl->heap,
  6609. ssl->devId);
  6610. break;
  6611. #endif /* HAVE_CURVE25519 */
  6612. #ifdef HAVE_ED448
  6613. case DYNAMIC_TYPE_ED448:
  6614. wc_ed448_free((ed448_key*)pKey);
  6615. ret = wc_ed448_init_ex((ed448_key*)pKey, ssl->heap, ssl->devId);
  6616. break;
  6617. #endif /* HAVE_CURVE448 */
  6618. #ifdef HAVE_CURVE448
  6619. case DYNAMIC_TYPE_CURVE448:
  6620. wc_curve448_free((curve448_key*)pKey);
  6621. ret = wc_curve448_init((curve448_key*)pKey);
  6622. break;
  6623. #endif /* HAVE_CURVE448 */
  6624. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  6625. case DYNAMIC_TYPE_FALCON:
  6626. wc_falcon_free((falcon_key*)pKey);
  6627. ret = wc_falcon_init((falcon_key*)pKey);
  6628. break;
  6629. #endif /* HAVE_PQC && HAVE_FALCON */
  6630. #ifndef NO_DH
  6631. case DYNAMIC_TYPE_DH:
  6632. wc_FreeDhKey((DhKey*)pKey);
  6633. ret = wc_InitDhKey_ex((DhKey*)pKey, ssl->heap, ssl->devId);
  6634. break;
  6635. #endif /* !NO_DH */
  6636. default:
  6637. return BAD_FUNC_ARG;
  6638. }
  6639. return ret;
  6640. }
  6641. #endif
  6642. #ifdef WOLFSSL_ASYNC_IO
  6643. void FreeAsyncCtx(WOLFSSL* ssl, byte freeAsync)
  6644. {
  6645. if (ssl->async != NULL) {
  6646. if (ssl->async->freeArgs != NULL) {
  6647. ssl->async->freeArgs(ssl, ssl->async->args);
  6648. ssl->async->freeArgs = NULL;
  6649. }
  6650. #if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WOLFSSL_NO_TLS12)
  6651. if (ssl->options.buildArgsSet) {
  6652. FreeBuildMsgArgs(ssl, &ssl->async->buildArgs);
  6653. ssl->options.buildArgsSet = 0;
  6654. }
  6655. #endif
  6656. if (freeAsync) {
  6657. XFREE(ssl->async, ssl->heap, DYNAMIC_TYPE_ASYNC);
  6658. ssl->async = NULL;
  6659. }
  6660. }
  6661. }
  6662. #endif
  6663. void FreeKeyExchange(WOLFSSL* ssl)
  6664. {
  6665. /* Cleanup signature buffer */
  6666. if (ssl->buffers.sig.buffer) {
  6667. XFREE(ssl->buffers.sig.buffer, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  6668. ssl->buffers.sig.buffer = NULL;
  6669. ssl->buffers.sig.length = 0;
  6670. }
  6671. /* Cleanup digest buffer */
  6672. if (ssl->buffers.digest.buffer) {
  6673. /* Only free if digest buffer was not set using SetDigest */
  6674. if (!ssl->options.dontFreeDigest) {
  6675. XFREE(ssl->buffers.digest.buffer, ssl->heap, DYNAMIC_TYPE_DIGEST);
  6676. }
  6677. ssl->buffers.digest.buffer = NULL;
  6678. ssl->buffers.digest.length = 0;
  6679. ssl->options.dontFreeDigest = 0;
  6680. }
  6681. /* Free handshake key */
  6682. FreeKey(ssl, ssl->hsType, &ssl->hsKey);
  6683. #ifndef NO_DH
  6684. /* Free temp DH key */
  6685. FreeKey(ssl, DYNAMIC_TYPE_DH, (void**)&ssl->buffers.serverDH_Key);
  6686. #endif
  6687. }
  6688. /* Free up all memory used by Suites structure from WOLFSSL */
  6689. void FreeSuites(WOLFSSL* ssl)
  6690. {
  6691. #ifdef OPENSSL_ALL
  6692. if (ssl->suitesStack != NULL) {
  6693. /* Enough to free stack structure since WOLFSSL_CIPHER
  6694. * isn't allocated separately. */
  6695. wolfSSL_sk_SSL_CIPHER_free(ssl->suitesStack);
  6696. ssl->suitesStack = NULL;
  6697. }
  6698. #endif
  6699. XFREE(ssl->suites, ssl->heap, DYNAMIC_TYPE_SUITES);
  6700. ssl->suites = NULL;
  6701. }
  6702. /* In case holding SSL object in array and don't want to free actual ssl */
  6703. void SSL_ResourceFree(WOLFSSL* ssl)
  6704. {
  6705. /* Note: any resources used during the handshake should be released in the
  6706. * function FreeHandshakeResources(). Be careful with the special cases
  6707. * like the RNG which may optionally be kept for the whole session. (For
  6708. * example with the RNG, it isn't used beyond the handshake except when
  6709. * using stream ciphers where it is retained. */
  6710. if (ssl->options.side == WOLFSSL_SERVER_END) {
  6711. WOLFSSL_MSG("Free'ing server ssl");
  6712. }
  6713. else {
  6714. WOLFSSL_MSG("Free'ing client ssl");
  6715. }
  6716. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  6717. wolfSSL_CRYPTO_cleanup_ex_data(&ssl->ex_data);
  6718. #endif
  6719. FreeCiphers(ssl);
  6720. FreeArrays(ssl, 0);
  6721. FreeKeyExchange(ssl);
  6722. #ifdef WOLFSSL_ASYNC_IO
  6723. /* Cleanup async */
  6724. FreeAsyncCtx(ssl, 1);
  6725. #endif
  6726. if (ssl->options.weOwnRng) {
  6727. wc_FreeRng(ssl->rng);
  6728. XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
  6729. }
  6730. FreeSuites(ssl);
  6731. FreeHandshakeHashes(ssl);
  6732. XFREE(ssl->buffers.domainName.buffer, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  6733. /* clear keys struct after session */
  6734. ForceZero(&ssl->keys, sizeof(Keys));
  6735. #ifdef WOLFSSL_TLS13
  6736. ForceZero(&ssl->clientSecret, sizeof(ssl->clientSecret));
  6737. ForceZero(&ssl->serverSecret, sizeof(ssl->serverSecret));
  6738. #if defined(HAVE_ECH)
  6739. if (ssl->options.useEch == 1) {
  6740. FreeEchConfigs(ssl->echConfigs, ssl->heap);
  6741. ssl->echConfigs = NULL;
  6742. /* free the ech specific hashes */
  6743. ssl->hsHashes = ssl->hsHashesEch;
  6744. FreeHandshakeHashes(ssl);
  6745. ssl->options.useEch = 0;
  6746. }
  6747. #endif /* HAVE_ECH */
  6748. #endif /* WOLFSSL_TLS13 */
  6749. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  6750. ForceZero(&ssl->clientFinished, TLS_FINISHED_SZ_MAX);
  6751. ForceZero(&ssl->serverFinished, TLS_FINISHED_SZ_MAX);
  6752. ssl->serverFinished_len = 0;
  6753. ssl->clientFinished_len = 0;
  6754. #endif
  6755. #ifndef NO_DH
  6756. if (ssl->buffers.serverDH_Priv.buffer != NULL) {
  6757. ForceZero(ssl->buffers.serverDH_Priv.buffer,
  6758. ssl->buffers.serverDH_Priv.length);
  6759. }
  6760. XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  6761. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6762. /* parameters (p,g) may be owned by ctx */
  6763. if (ssl->buffers.weOwnDH) {
  6764. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6765. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6766. }
  6767. #endif /* !NO_DH */
  6768. #ifndef NO_CERTS
  6769. ssl->keepCert = 0; /* make sure certificate is free'd */
  6770. wolfSSL_UnloadCertsKeys(ssl);
  6771. #endif
  6772. #ifndef NO_RSA
  6773. FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
  6774. ssl->peerRsaKeyPresent = 0;
  6775. #endif
  6776. #if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_SCEPROTECT)
  6777. XFREE(ssl->peerSceTsipEncRsaKeyIndex, ssl->heap, DYNAMIC_TYPE_RSA);
  6778. Renesas_cmn_Cleanup(ssl);
  6779. #endif
  6780. if (ssl->buffers.inputBuffer.dynamicFlag)
  6781. ShrinkInputBuffer(ssl, FORCED_FREE);
  6782. if (ssl->buffers.outputBuffer.dynamicFlag)
  6783. ShrinkOutputBuffer(ssl);
  6784. #if defined(WOLFSSL_SEND_HRR_COOKIE) && !defined(NO_WOLFSSL_SERVER)
  6785. if (ssl->buffers.tls13CookieSecret.buffer != NULL) {
  6786. ForceZero(ssl->buffers.tls13CookieSecret.buffer,
  6787. ssl->buffers.tls13CookieSecret.length);
  6788. }
  6789. XFREE(ssl->buffers.tls13CookieSecret.buffer, ssl->heap,
  6790. DYNAMIC_TYPE_COOKIE_PWD);
  6791. #endif
  6792. #ifdef WOLFSSL_DTLS
  6793. DtlsMsgPoolReset(ssl);
  6794. if (ssl->dtls_rx_msg_list != NULL) {
  6795. DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
  6796. ssl->dtls_rx_msg_list = NULL;
  6797. ssl->dtls_rx_msg_list_sz = 0;
  6798. }
  6799. XFREE(ssl->buffers.dtlsCtx.peer.sa, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
  6800. ssl->buffers.dtlsCtx.peer.sa = NULL;
  6801. #ifndef NO_WOLFSSL_SERVER
  6802. if (ssl->buffers.dtlsCookieSecret.buffer != NULL) {
  6803. ForceZero(ssl->buffers.dtlsCookieSecret.buffer,
  6804. ssl->buffers.dtlsCookieSecret.length);
  6805. }
  6806. XFREE(ssl->buffers.dtlsCookieSecret.buffer, ssl->heap,
  6807. DYNAMIC_TYPE_COOKIE_PWD);
  6808. #endif
  6809. #ifdef WOLFSSL_DTLS13
  6810. if (ssl->dtls13ClientHello != NULL) {
  6811. XFREE(ssl->dtls13ClientHello, ssl->heap, DYNAMIC_TYPE_DTLS_MSG);
  6812. ssl->dtls13ClientHello = NULL;
  6813. ssl->dtls13ClientHelloSz = 0;
  6814. }
  6815. #endif /* WOLFSSL_DTLS13 */
  6816. #endif /* WOLFSSL_DTLS */
  6817. #ifdef OPENSSL_EXTRA
  6818. #ifndef NO_BIO
  6819. /* Don't free if there was/is a previous element in the chain.
  6820. * This means that this BIO was part of a chain that will be
  6821. * free'd separately. */
  6822. if (ssl->biord != ssl->biowr) /* only free write if different */
  6823. if (ssl->biowr != NULL && ssl->biowr->prev == NULL)
  6824. wolfSSL_BIO_free(ssl->biowr);
  6825. if (ssl->biord != NULL && ssl->biord->prev == NULL)
  6826. wolfSSL_BIO_free(ssl->biord);
  6827. ssl->biowr = NULL;
  6828. ssl->biord = NULL;
  6829. #endif
  6830. #endif
  6831. #ifdef HAVE_LIBZ
  6832. FreeStreams(ssl);
  6833. #endif
  6834. #ifdef HAVE_ECC
  6835. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
  6836. ssl->peerEccKeyPresent = 0;
  6837. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
  6838. ssl->peerEccDsaKeyPresent = 0;
  6839. #endif
  6840. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) ||defined(HAVE_CURVE448)
  6841. {
  6842. int dtype = 0;
  6843. #ifdef HAVE_ECC
  6844. dtype = DYNAMIC_TYPE_ECC;
  6845. #endif
  6846. #ifdef HAVE_CURVE25519
  6847. if (ssl->peerX25519KeyPresent
  6848. #ifdef HAVE_ECC
  6849. || ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519
  6850. #endif /* HAVE_ECC */
  6851. )
  6852. {
  6853. dtype = DYNAMIC_TYPE_CURVE25519;
  6854. }
  6855. #endif /* HAVE_CURVE25519 */
  6856. #ifdef HAVE_CURVE448
  6857. if (ssl->peerX448KeyPresent
  6858. #ifdef HAVE_ECC
  6859. || ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE448
  6860. #endif /* HAVE_ECC */
  6861. )
  6862. {
  6863. dtype = DYNAMIC_TYPE_CURVE448;
  6864. }
  6865. #endif /* HAVE_CURVE448 */
  6866. FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
  6867. ssl->eccTempKeyPresent = 0;
  6868. }
  6869. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  6870. #ifdef HAVE_CURVE25519
  6871. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
  6872. ssl->peerX25519KeyPresent = 0;
  6873. #endif
  6874. #ifdef HAVE_ED25519
  6875. FreeKey(ssl, DYNAMIC_TYPE_ED25519, (void**)&ssl->peerEd25519Key);
  6876. ssl->peerEd25519KeyPresent = 0;
  6877. #ifdef HAVE_PK_CALLBACKS
  6878. if (ssl->buffers.peerEd25519Key.buffer != NULL) {
  6879. XFREE(ssl->buffers.peerEd25519Key.buffer, ssl->heap,
  6880. DYNAMIC_TYPE_ED25519);
  6881. ssl->buffers.peerEd25519Key.buffer = NULL;
  6882. }
  6883. #endif
  6884. #endif
  6885. #ifdef HAVE_CURVE448
  6886. FreeKey(ssl, DYNAMIC_TYPE_CURVE448, (void**)&ssl->peerX448Key);
  6887. ssl->peerX448KeyPresent = 0;
  6888. #endif
  6889. #ifdef HAVE_ED448
  6890. FreeKey(ssl, DYNAMIC_TYPE_ED448, (void**)&ssl->peerEd448Key);
  6891. ssl->peerEd448KeyPresent = 0;
  6892. #ifdef HAVE_PK_CALLBACKS
  6893. if (ssl->buffers.peerEd448Key.buffer != NULL) {
  6894. XFREE(ssl->buffers.peerEd448Key.buffer, ssl->heap,
  6895. DYNAMIC_TYPE_ED448);
  6896. ssl->buffers.peerEd448Key.buffer = NULL;
  6897. }
  6898. #endif
  6899. #endif
  6900. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  6901. FreeKey(ssl, DYNAMIC_TYPE_FALCON, (void**)&ssl->peerFalconKey);
  6902. ssl->peerFalconKeyPresent = 0;
  6903. #endif
  6904. #ifdef HAVE_PK_CALLBACKS
  6905. #ifdef HAVE_ECC
  6906. XFREE(ssl->buffers.peerEccDsaKey.buffer, ssl->heap, DYNAMIC_TYPE_ECC);
  6907. #endif /* HAVE_ECC */
  6908. #ifndef NO_RSA
  6909. XFREE(ssl->buffers.peerRsaKey.buffer, ssl->heap, DYNAMIC_TYPE_RSA);
  6910. #endif /* NO_RSA */
  6911. #endif /* HAVE_PK_CALLBACKS */
  6912. #ifdef HAVE_TLS_EXTENSIONS
  6913. #if !defined(NO_TLS)
  6914. TLSX_FreeAll(ssl->extensions, ssl->heap);
  6915. #endif /* !NO_TLS */
  6916. #ifdef HAVE_ALPN
  6917. if (ssl->alpn_peer_requested != NULL) {
  6918. XFREE(ssl->alpn_peer_requested, ssl->heap, DYNAMIC_TYPE_ALPN);
  6919. ssl->alpn_peer_requested = NULL;
  6920. ssl->alpn_peer_requested_length = 0;
  6921. }
  6922. #endif
  6923. #endif /* HAVE_TLS_EXTENSIONS */
  6924. #if defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  6925. if (ssl->mnCtx) {
  6926. mynewt_ctx_clear(ssl->mnCtx);
  6927. ssl->mnCtx = NULL;
  6928. }
  6929. #endif
  6930. #ifdef HAVE_NETX
  6931. if (ssl->nxCtx.nxPacket)
  6932. nx_packet_release(ssl->nxCtx.nxPacket);
  6933. #endif
  6934. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  6935. if (ssl->x509_store_pt)
  6936. wolfSSL_X509_STORE_free(ssl->x509_store_pt);
  6937. #endif
  6938. #ifdef KEEP_PEER_CERT
  6939. FreeX509(&ssl->peerCert);
  6940. #endif
  6941. if (ssl->session != NULL)
  6942. wolfSSL_FreeSession(ssl->ctx, ssl->session);
  6943. #ifdef HAVE_WRITE_DUP
  6944. if (ssl->dupWrite) {
  6945. FreeWriteDup(ssl);
  6946. }
  6947. #endif
  6948. #ifdef OPENSSL_EXTRA
  6949. if (ssl->param) {
  6950. XFREE(ssl->param, ssl->heap, DYNAMIC_TYPE_OPENSSL);
  6951. }
  6952. #endif
  6953. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6954. while (ssl->certReqCtx != NULL) {
  6955. CertReqCtx* curr = ssl->certReqCtx;
  6956. ssl->certReqCtx = curr->next;
  6957. XFREE(curr, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6958. }
  6959. #endif
  6960. #ifdef WOLFSSL_STATIC_EPHEMERAL
  6961. #ifndef NO_DH
  6962. FreeDer(&ssl->staticKE.dhKey);
  6963. #endif
  6964. #ifdef HAVE_ECC
  6965. FreeDer(&ssl->staticKE.ecKey);
  6966. #endif
  6967. #ifdef HAVE_CURVE25519
  6968. FreeDer(&ssl->staticKE.x25519Key);
  6969. #endif
  6970. #ifdef HAVE_CURVE448
  6971. FreeDer(&ssl->staticKE.x448Key);
  6972. #endif
  6973. #endif
  6974. #ifdef WOLFSSL_STATIC_MEMORY
  6975. /* check if using fixed io buffers and free them */
  6976. if (ssl->heap != NULL) {
  6977. #ifdef WOLFSSL_HEAP_TEST
  6978. /* avoid dereferencing a test value */
  6979. if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) {
  6980. #endif
  6981. WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
  6982. WOLFSSL_HEAP* ctx_heap;
  6983. void* heap = ssl->ctx ? ssl->ctx->heap : ssl->heap;
  6984. ctx_heap = ssl_hint->memory;
  6985. if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
  6986. WOLFSSL_MSG("Bad memory_mutex lock");
  6987. }
  6988. ctx_heap->curIO--;
  6989. if (FreeFixedIO(ctx_heap, &(ssl_hint->outBuf)) != 1) {
  6990. WOLFSSL_MSG("Error freeing fixed output buffer");
  6991. }
  6992. if (FreeFixedIO(ctx_heap, &(ssl_hint->inBuf)) != 1) {
  6993. WOLFSSL_MSG("Error freeing fixed output buffer");
  6994. }
  6995. if (ssl_hint->haFlag) { /* check if handshake count has been decreased*/
  6996. ctx_heap->curHa--;
  6997. }
  6998. wc_UnLockMutex(&(ctx_heap->memory_mutex));
  6999. /* check if tracking stats */
  7000. if (ctx_heap->flag & WOLFMEM_TRACK_STATS) {
  7001. XFREE(ssl_hint->stats, heap, DYNAMIC_TYPE_SSL);
  7002. }
  7003. XFREE(ssl->heap, heap, DYNAMIC_TYPE_SSL);
  7004. #ifdef WOLFSSL_HEAP_TEST
  7005. }
  7006. #endif
  7007. }
  7008. #endif /* WOLFSSL_STATIC_MEMORY */
  7009. #ifdef OPENSSL_EXTRA
  7010. /* Enough to free stack structure since WOLFSSL_CIPHER
  7011. * isn't allocated separately. */
  7012. wolfSSL_sk_CIPHER_free(ssl->supportedCiphers);
  7013. wolfSSL_sk_X509_pop_free(ssl->peerCertChain, NULL);
  7014. #ifdef KEEP_OUR_CERT
  7015. wolfSSL_sk_X509_pop_free(ssl->ourCertChain, NULL);
  7016. #endif
  7017. #endif
  7018. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(HAVE_LIGHTY)
  7019. wolfSSL_sk_X509_NAME_pop_free(ssl->ca_names, NULL);
  7020. ssl->ca_names = NULL;
  7021. #endif
  7022. #ifdef WOLFSSL_DTLS13
  7023. Dtls13FreeFsmResources(ssl);
  7024. #endif /* WOLFSSL_DTLS13 */
  7025. #ifdef WOLFSSL_QUIC
  7026. wolfSSL_quic_free(ssl);
  7027. #endif
  7028. }
  7029. /* Free any handshake resources no longer needed */
  7030. void FreeHandshakeResources(WOLFSSL* ssl)
  7031. {
  7032. WOLFSSL_ENTER("FreeHandshakeResources");
  7033. #ifdef WOLFSSL_DTLS
  7034. if (ssl->options.dtls) {
  7035. /* DTLS_POOL (DTLSv1.3 flushes the queue autonomously) */
  7036. if(!IsAtLeastTLSv1_3(ssl->version)) {
  7037. DtlsMsgPoolReset(ssl);
  7038. DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
  7039. ssl->dtls_rx_msg_list = NULL;
  7040. ssl->dtls_rx_msg_list_sz = 0;
  7041. }
  7042. #ifdef WOLFSSL_DTLS13
  7043. if (ssl->dtls13ClientHello != NULL) {
  7044. XFREE(ssl->dtls13ClientHello, ssl->heap, DYNAMIC_TYPE_DTLS_MSG);
  7045. ssl->dtls13ClientHello = NULL;
  7046. ssl->dtls13ClientHelloSz = 0;
  7047. }
  7048. #endif /* WOLFSSL_DTLS13 */
  7049. }
  7050. #endif
  7051. #ifdef HAVE_SECURE_RENEGOTIATION
  7052. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  7053. WOLFSSL_MSG("Secure Renegotiation needs to retain handshake resources");
  7054. return;
  7055. }
  7056. #endif
  7057. /* input buffer */
  7058. if (ssl->buffers.inputBuffer.dynamicFlag)
  7059. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  7060. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  7061. if (!ssl->options.tls1_3)
  7062. #endif
  7063. {
  7064. #ifndef OPENSSL_EXTRA
  7065. /* free suites unless using compatibility layer */
  7066. FreeSuites(ssl);
  7067. #endif
  7068. /* hsHashes */
  7069. FreeHandshakeHashes(ssl);
  7070. }
  7071. /* RNG */
  7072. if (ssl->options.tls1_1 == 0
  7073. #ifndef WOLFSSL_AEAD_ONLY
  7074. || ssl->specs.cipher_type == stream
  7075. #endif
  7076. #if defined(WOLFSSL_TLS13)
  7077. /* Post-handshake auth requires random on client side for TLS 1.3.
  7078. * Session ticket requires random on server side.
  7079. */
  7080. #if !defined(WOLFSSL_POST_HANDSHAKE_AUTH) && !defined(HAVE_SESSION_TICKET)
  7081. || ssl->options.tls1_3
  7082. #elif !defined(WOLFSSL_POST_HANDSHAKE_AUTH) && defined(HAVE_SESSION_TICKET)
  7083. || (ssl->options.tls1_3 && ssl->options.side == WOLFSSL_CLIENT_END)
  7084. #elif !defined(HAVE_SESSION_TICKET)
  7085. || (ssl->options.tls1_3 && ssl->options.side == WOLFSSL_SERVER_END)
  7086. #endif
  7087. #endif
  7088. ) {
  7089. if (ssl->options.weOwnRng) {
  7090. wc_FreeRng(ssl->rng);
  7091. XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
  7092. ssl->rng = NULL;
  7093. ssl->options.weOwnRng = 0;
  7094. }
  7095. }
  7096. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH) && \
  7097. defined(HAVE_SESSION_TICKET)
  7098. if (!ssl->options.tls1_3)
  7099. #endif
  7100. /* arrays */
  7101. if (ssl->options.saveArrays == 0)
  7102. FreeArrays(ssl, 1);
  7103. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  7104. if (!ssl->options.tls1_3 || ssl->options.side == WOLFSSL_CLIENT_END)
  7105. #endif
  7106. {
  7107. #ifndef NO_RSA
  7108. /* peerRsaKey */
  7109. FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
  7110. ssl->peerRsaKeyPresent = 0;
  7111. #endif
  7112. #ifdef HAVE_ECC
  7113. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
  7114. ssl->peerEccDsaKeyPresent = 0;
  7115. #endif /* HAVE_ECC */
  7116. #ifdef HAVE_ED25519
  7117. FreeKey(ssl, DYNAMIC_TYPE_ED25519, (void**)&ssl->peerEd25519Key);
  7118. ssl->peerEd25519KeyPresent = 0;
  7119. #endif /* HAVE_ED25519 */
  7120. #ifdef HAVE_ED448
  7121. FreeKey(ssl, DYNAMIC_TYPE_ED448, (void**)&ssl->peerEd448Key);
  7122. ssl->peerEd448KeyPresent = 0;
  7123. #endif /* HAVE_ED448 */
  7124. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  7125. FreeKey(ssl, DYNAMIC_TYPE_FALCON, (void**)&ssl->peerFalconKey);
  7126. ssl->peerFalconKeyPresent = 0;
  7127. #endif /* HAVE_PQC */
  7128. }
  7129. #ifdef HAVE_ECC
  7130. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
  7131. ssl->peerEccKeyPresent = 0;
  7132. #endif
  7133. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  7134. {
  7135. int dtype;
  7136. #ifdef HAVE_ECC
  7137. dtype = DYNAMIC_TYPE_ECC;
  7138. #elif defined(HAVE_CURVE25519)
  7139. dtype = DYNAMIC_TYPE_CURVE25519;
  7140. #else
  7141. dtype = DYNAMIC_TYPE_CURVE448;
  7142. #endif
  7143. #if defined(HAVE_ECC) && defined(HAVE_CURVE25519)
  7144. if (ssl->peerX25519KeyPresent ||
  7145. ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519)
  7146. {
  7147. dtype = DYNAMIC_TYPE_CURVE25519;
  7148. }
  7149. #endif
  7150. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
  7151. defined(HAVE_CURVE448)
  7152. if (ssl->peerX448KeyPresent ||
  7153. ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE448)
  7154. {
  7155. dtype = DYNAMIC_TYPE_CURVE448;
  7156. }
  7157. #endif
  7158. FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
  7159. ssl->eccTempKeyPresent = 0;
  7160. }
  7161. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  7162. #ifdef HAVE_CURVE25519
  7163. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
  7164. ssl->peerX25519KeyPresent = 0;
  7165. #endif
  7166. #ifdef HAVE_CURVE448
  7167. FreeKey(ssl, DYNAMIC_TYPE_CURVE448, (void**)&ssl->peerX448Key);
  7168. ssl->peerX448KeyPresent = 0;
  7169. #endif
  7170. #ifndef NO_DH
  7171. if (ssl->buffers.serverDH_Priv.buffer) {
  7172. ForceZero(ssl->buffers.serverDH_Priv.buffer,
  7173. ssl->buffers.serverDH_Priv.length);
  7174. }
  7175. XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  7176. ssl->buffers.serverDH_Priv.buffer = NULL;
  7177. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  7178. ssl->buffers.serverDH_Pub.buffer = NULL;
  7179. /* parameters (p,g) may be owned by ctx */
  7180. if (ssl->buffers.weOwnDH) {
  7181. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  7182. ssl->buffers.serverDH_G.buffer = NULL;
  7183. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  7184. ssl->buffers.serverDH_P.buffer = NULL;
  7185. }
  7186. #endif /* !NO_DH */
  7187. #ifndef NO_CERTS
  7188. wolfSSL_UnloadCertsKeys(ssl);
  7189. #endif
  7190. #ifdef HAVE_PK_CALLBACKS
  7191. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  7192. if (!ssl->options.tls1_3 || ssl->options.side == WOLFSSL_CLIENT_END)
  7193. #endif
  7194. {
  7195. #ifdef HAVE_ECC
  7196. XFREE(ssl->buffers.peerEccDsaKey.buffer, ssl->heap, DYNAMIC_TYPE_ECC);
  7197. ssl->buffers.peerEccDsaKey.buffer = NULL;
  7198. #endif /* HAVE_ECC */
  7199. #ifndef NO_RSA
  7200. XFREE(ssl->buffers.peerRsaKey.buffer, ssl->heap, DYNAMIC_TYPE_RSA);
  7201. ssl->buffers.peerRsaKey.buffer = NULL;
  7202. #endif /* NO_RSA */
  7203. #ifdef HAVE_ED25519
  7204. XFREE(ssl->buffers.peerEd25519Key.buffer, ssl->heap,
  7205. DYNAMIC_TYPE_ED25519);
  7206. ssl->buffers.peerEd25519Key.buffer = NULL;
  7207. #endif
  7208. #ifdef HAVE_ED448
  7209. XFREE(ssl->buffers.peerEd448Key.buffer, ssl->heap, DYNAMIC_TYPE_ED448);
  7210. ssl->buffers.peerEd448Key.buffer = NULL;
  7211. #endif
  7212. }
  7213. #endif /* HAVE_PK_CALLBACKS */
  7214. #if defined(HAVE_TLS_EXTENSIONS) && !defined(HAVE_SNI) && \
  7215. !defined(NO_TLS) && !defined(HAVE_ALPN) && !defined(WOLFSSL_POST_HANDSHAKE_AUTH) && \
  7216. !defined(WOLFSSL_DTLS_CID)
  7217. /* Some extensions need to be kept for post-handshake querying. */
  7218. TLSX_FreeAll(ssl->extensions, ssl->heap);
  7219. ssl->extensions = NULL;
  7220. #endif
  7221. #ifdef WOLFSSL_STATIC_MEMORY
  7222. /* when done with handshake decrement current handshake count */
  7223. if (ssl->heap != NULL) {
  7224. #ifdef WOLFSSL_HEAP_TEST
  7225. /* avoid dereferencing a test value */
  7226. if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) {
  7227. #endif
  7228. WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
  7229. WOLFSSL_HEAP* ctx_heap;
  7230. ctx_heap = ssl_hint->memory;
  7231. if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
  7232. WOLFSSL_MSG("Bad memory_mutex lock");
  7233. }
  7234. ctx_heap->curHa--;
  7235. ssl_hint->haFlag = 0; /* set to zero since handshake has been dec */
  7236. wc_UnLockMutex(&(ctx_heap->memory_mutex));
  7237. #ifdef WOLFSSL_HEAP_TEST
  7238. }
  7239. #endif
  7240. }
  7241. #endif /* WOLFSSL_STATIC_MEMORY */
  7242. }
  7243. /* heap argument is the heap hint used when creating SSL */
  7244. void FreeSSL(WOLFSSL* ssl, void* heap)
  7245. {
  7246. WOLFSSL_CTX* ctx = ssl->ctx;
  7247. SSL_ResourceFree(ssl);
  7248. XFREE(ssl, heap, DYNAMIC_TYPE_SSL);
  7249. if (ctx)
  7250. FreeSSL_Ctx(ctx); /* will decrement and free underlying CTX if 0 */
  7251. (void)heap;
  7252. #ifdef WOLFSSL_CHECK_MEM_ZERO
  7253. wc_MemZero_Check(ssl, sizeof(*ssl));
  7254. #endif
  7255. }
  7256. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_DTLS) || \
  7257. !defined(WOLFSSL_NO_TLS12) || \
  7258. ((defined(HAVE_CHACHA) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM)) \
  7259. && defined(HAVE_AEAD))
  7260. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  7261. static WC_INLINE void GetSEQIncrement(WOLFSSL* ssl, int verify, word32 seq[2])
  7262. {
  7263. if (verify) {
  7264. seq[0] = ssl->keys.peer_sequence_number_hi;
  7265. seq[1] = ssl->keys.peer_sequence_number_lo++;
  7266. if (seq[1] > ssl->keys.peer_sequence_number_lo) {
  7267. /* handle rollover */
  7268. ssl->keys.peer_sequence_number_hi++;
  7269. }
  7270. }
  7271. else {
  7272. seq[0] = ssl->keys.sequence_number_hi;
  7273. seq[1] = ssl->keys.sequence_number_lo++;
  7274. if (seq[1] > ssl->keys.sequence_number_lo) {
  7275. /* handle rollover */
  7276. ssl->keys.sequence_number_hi++;
  7277. }
  7278. }
  7279. }
  7280. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
  7281. #ifdef WOLFSSL_DTLS
  7282. static WC_INLINE void DtlsGetSEQ(WOLFSSL* ssl, int order, word32 seq[2])
  7283. {
  7284. #ifdef HAVE_SECURE_RENEGOTIATION
  7285. order = DtlsCheckOrder(ssl, order);
  7286. #endif
  7287. if (order == PREV_ORDER) {
  7288. /* Previous epoch case */
  7289. if (ssl->options.haveMcast) {
  7290. #ifdef WOLFSSL_MULTICAST
  7291. seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
  7292. (ssl->options.mcastID << 8) |
  7293. (ssl->keys.dtls_prev_sequence_number_hi & 0xFF);
  7294. #endif
  7295. }
  7296. else
  7297. seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
  7298. (ssl->keys.dtls_prev_sequence_number_hi & 0xFFFF);
  7299. seq[1] = ssl->keys.dtls_prev_sequence_number_lo;
  7300. }
  7301. else if (order == PEER_ORDER) {
  7302. if (ssl->options.haveMcast) {
  7303. #ifdef WOLFSSL_MULTICAST
  7304. seq[0] = ((word32)ssl->keys.curEpoch << 16) |
  7305. (ssl->keys.curPeerId << 8) |
  7306. (ssl->keys.curSeq_hi & 0xFF);
  7307. #endif
  7308. }
  7309. else
  7310. seq[0] = ((word32)ssl->keys.curEpoch << 16) |
  7311. (ssl->keys.curSeq_hi & 0xFFFF);
  7312. seq[1] = ssl->keys.curSeq_lo; /* explicit from peer */
  7313. }
  7314. else {
  7315. if (ssl->options.haveMcast) {
  7316. #ifdef WOLFSSL_MULTICAST
  7317. seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
  7318. (ssl->options.mcastID << 8) |
  7319. (ssl->keys.dtls_sequence_number_hi & 0xFF);
  7320. #endif
  7321. }
  7322. else
  7323. seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
  7324. (ssl->keys.dtls_sequence_number_hi & 0xFFFF);
  7325. seq[1] = ssl->keys.dtls_sequence_number_lo;
  7326. }
  7327. }
  7328. static WC_INLINE void DtlsSEQIncrement(WOLFSSL* ssl, int order)
  7329. {
  7330. word32 seq;
  7331. #ifdef HAVE_SECURE_RENEGOTIATION
  7332. order = DtlsCheckOrder(ssl, order);
  7333. #endif
  7334. if (order == PREV_ORDER) {
  7335. seq = ssl->keys.dtls_prev_sequence_number_lo++;
  7336. if (seq > ssl->keys.dtls_prev_sequence_number_lo) {
  7337. /* handle rollover */
  7338. ssl->keys.dtls_prev_sequence_number_hi++;
  7339. }
  7340. }
  7341. else if (order == PEER_ORDER) {
  7342. seq = ssl->keys.peer_sequence_number_lo++;
  7343. if (seq > ssl->keys.peer_sequence_number_lo) {
  7344. /* handle rollover */
  7345. ssl->keys.peer_sequence_number_hi++;
  7346. }
  7347. }
  7348. else {
  7349. seq = ssl->keys.dtls_sequence_number_lo++;
  7350. if (seq > ssl->keys.dtls_sequence_number_lo) {
  7351. /* handle rollover */
  7352. ssl->keys.dtls_sequence_number_hi++;
  7353. }
  7354. }
  7355. }
  7356. #endif /* WOLFSSL_DTLS */
  7357. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  7358. void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out)
  7359. {
  7360. word32 seq[2] = {0, 0};
  7361. if (!ssl->options.dtls) {
  7362. GetSEQIncrement(ssl, verifyOrder, seq);
  7363. }
  7364. else {
  7365. #ifdef WOLFSSL_DTLS
  7366. DtlsGetSEQ(ssl, verifyOrder, seq);
  7367. #endif
  7368. }
  7369. c32toa(seq[0], out);
  7370. c32toa(seq[1], out + OPAQUE32_LEN);
  7371. }
  7372. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
  7373. #endif /* !NO_OLD_TLS || WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 ||
  7374. * ((HAVE_CHACHA || HAVE_AESCCM || HAVE_AESGCM) && HAVE_AEAD) */
  7375. #ifdef WOLFSSL_DTLS
  7376. /* functions for managing DTLS datagram reordering */
  7377. /* Need to allocate space for the handshake message header. The hashing
  7378. * routines assume the message pointer is still within the buffer that
  7379. * has the headers, and will include those headers in the hash. The store
  7380. * routines need to take that into account as well. New will allocate
  7381. * extra space for the headers. */
  7382. DtlsMsg* DtlsMsgNew(word32 sz, byte tx, void* heap)
  7383. {
  7384. DtlsMsg* msg;
  7385. WOLFSSL_ENTER("DtlsMsgNew");
  7386. (void)heap;
  7387. msg = (DtlsMsg*)XMALLOC(sizeof(DtlsMsg), heap, DYNAMIC_TYPE_DTLS_MSG);
  7388. if (msg != NULL) {
  7389. XMEMSET(msg, 0, sizeof(DtlsMsg));
  7390. msg->sz = sz;
  7391. msg->type = no_shake;
  7392. if (tx) {
  7393. msg->raw = msg->fullMsg =
  7394. (byte*)XMALLOC(sz + DTLS_HANDSHAKE_HEADER_SZ, heap,
  7395. DYNAMIC_TYPE_DTLS_FRAG);
  7396. msg->ready = 1;
  7397. if (msg->raw == NULL) {
  7398. DtlsMsgDelete(msg, heap);
  7399. msg = NULL;
  7400. }
  7401. }
  7402. }
  7403. return msg;
  7404. }
  7405. void DtlsMsgDelete(DtlsMsg* item, void* heap)
  7406. {
  7407. (void)heap;
  7408. WOLFSSL_ENTER("DtlsMsgDelete");
  7409. if (item != NULL) {
  7410. while (item->fragBucketList != NULL) {
  7411. DtlsFragBucket* next = item->fragBucketList->m.m.next;
  7412. DtlsMsgDestroyFragBucket(item->fragBucketList, heap);
  7413. item->fragBucketList = next;
  7414. }
  7415. if (item->raw != NULL)
  7416. XFREE(item->raw, heap, DYNAMIC_TYPE_DTLS_FRAG);
  7417. XFREE(item, heap, DYNAMIC_TYPE_DTLS_MSG);
  7418. }
  7419. }
  7420. void DtlsMsgListDelete(DtlsMsg* head, void* heap)
  7421. {
  7422. DtlsMsg* next;
  7423. WOLFSSL_ENTER("DtlsMsgListDelete");
  7424. while (head) {
  7425. next = head->next;
  7426. DtlsMsgDelete(head, heap);
  7427. head = next;
  7428. }
  7429. }
  7430. /**
  7431. * Drop messages when they are no longer going to be retransmitted
  7432. */
  7433. void DtlsTxMsgListClean(WOLFSSL* ssl)
  7434. {
  7435. DtlsMsg* head = ssl->dtls_tx_msg_list;
  7436. DtlsMsg* next;
  7437. WOLFSSL_ENTER("DtlsTxMsgListClean");
  7438. while (head) {
  7439. next = head->next;
  7440. if (VerifyForTxDtlsMsgDelete(ssl, head))
  7441. DtlsMsgDelete(head, ssl->heap);
  7442. else
  7443. /* Stored packets should be in order so break on first failed
  7444. * verify */
  7445. break;
  7446. ssl->dtls_tx_msg_list_sz--;
  7447. head = next;
  7448. }
  7449. ssl->dtls_tx_msg_list = head;
  7450. }
  7451. static DtlsFragBucket* DtlsMsgCreateFragBucket(word32 offset, const byte* data,
  7452. word32 dataSz, void* heap)
  7453. {
  7454. DtlsFragBucket* bucket =
  7455. (DtlsFragBucket*)XMALLOC(sizeof(DtlsFragBucket) + dataSz, heap,
  7456. DYNAMIC_TYPE_DTLS_FRAG);
  7457. if (bucket != NULL) {
  7458. XMEMSET(bucket, 0, sizeof(*bucket));
  7459. bucket->m.m.next = NULL;
  7460. bucket->m.m.offset = offset;
  7461. bucket->m.m.sz = dataSz;
  7462. if (data != NULL)
  7463. XMEMCPY(bucket->buf, data, dataSz);
  7464. }
  7465. (void)heap;
  7466. return bucket;
  7467. }
  7468. void DtlsMsgDestroyFragBucket(DtlsFragBucket* fragBucket, void* heap)
  7469. {
  7470. (void)heap;
  7471. XFREE(fragBucket, heap, DYNAMIC_TYPE_DTLS_FRAG);
  7472. }
  7473. /*
  7474. * data overlaps with cur but is before next.
  7475. * data + dataSz has to end before or inside next. next can be NULL.
  7476. */
  7477. static DtlsFragBucket* DtlsMsgCombineFragBuckets(DtlsMsg* msg,
  7478. DtlsFragBucket* cur, DtlsFragBucket* next, word32 offset,
  7479. const byte* data, word32 dataSz, void* heap)
  7480. {
  7481. word32 offsetEnd = offset + dataSz;
  7482. word32 newOffset = min(cur->m.m.offset, offset);
  7483. word32 newOffsetEnd;
  7484. word32 newSz;
  7485. word32 overlapSz = cur->m.m.sz;
  7486. DtlsFragBucket** chosenBucket;
  7487. DtlsFragBucket* newBucket;
  7488. DtlsFragBucket* otherBucket;
  7489. byte combineNext = FALSE;
  7490. if (next != NULL && offsetEnd >= next->m.m.offset)
  7491. combineNext = TRUE;
  7492. if (combineNext)
  7493. newOffsetEnd = next->m.m.offset + next->m.m.sz;
  7494. else
  7495. newOffsetEnd = max(cur->m.m.offset + cur->m.m.sz, offsetEnd);
  7496. newSz = newOffsetEnd - newOffset;
  7497. /* Expand the larger bucket if data bridges the gap between cur and next */
  7498. if (!combineNext || cur->m.m.sz >= next->m.m.sz) {
  7499. chosenBucket = &cur;
  7500. otherBucket = next;
  7501. }
  7502. else {
  7503. chosenBucket = &next;
  7504. otherBucket = cur;
  7505. }
  7506. {
  7507. #ifdef XREALLOC
  7508. DtlsFragBucket* tmp = (DtlsFragBucket*)XREALLOC(*chosenBucket,
  7509. sizeof(DtlsFragBucket) + newSz, heap, DYNAMIC_TYPE_DTLS_FRAG);
  7510. #else
  7511. DtlsFragBucket* tmp = (DtlsFragBucket*)XMALLOC(
  7512. sizeof(DtlsFragBucket) + newSz, heap, DYNAMIC_TYPE_DTLS_FRAG);
  7513. #endif
  7514. if (tmp == NULL)
  7515. return NULL;
  7516. #ifndef XREALLOC
  7517. XMEMCPY(tmp, *chosenBucket, sizeof(DtlsFragBucket) +
  7518. (*chosenBucket)->m.m.sz);
  7519. #endif
  7520. if (chosenBucket == &next) {
  7521. /* Update the link */
  7522. DtlsFragBucket* beforeNext = cur;
  7523. while (beforeNext->m.m.next != next)
  7524. beforeNext = beforeNext->m.m.next;
  7525. beforeNext->m.m.next = tmp;
  7526. }
  7527. #ifndef XREALLOC
  7528. XFREE(*chosenBucket, heap, DYNAMIC_TYPE_DTLS_FRAG);
  7529. #endif
  7530. newBucket = *chosenBucket = tmp;
  7531. }
  7532. if (combineNext) {
  7533. /* Put next first since it will always be at the end. Use memmove since
  7534. * newBucket may be next. */
  7535. XMEMMOVE(newBucket->buf + (next->m.m.offset - newOffset), next->buf,
  7536. next->m.m.sz);
  7537. /* memory after newOffsetEnd is already copied. Don't do extra work. */
  7538. newOffsetEnd = next->m.m.offset;
  7539. }
  7540. if (newOffset == offset) {
  7541. /* data comes first */
  7542. if (newOffsetEnd <= offsetEnd) {
  7543. /* data encompasses cur. only copy data */
  7544. XMEMCPY(newBucket->buf, data,
  7545. min(dataSz, newOffsetEnd - newOffset));
  7546. }
  7547. else {
  7548. /* data -> cur. memcpy as much possible as its faster. */
  7549. XMEMMOVE(newBucket->buf + dataSz, cur->buf,
  7550. cur->m.m.sz - (offsetEnd - cur->m.m.offset));
  7551. XMEMCPY(newBucket->buf, data, dataSz);
  7552. }
  7553. }
  7554. else {
  7555. /* cur -> data */
  7556. word32 curOffsetEnd = cur->m.m.offset + cur->m.m.sz;
  7557. if (newBucket != cur)
  7558. XMEMCPY(newBucket->buf, cur->buf, cur->m.m.sz);
  7559. XMEMCPY(newBucket->buf + cur->m.m.sz,
  7560. data + (curOffsetEnd - offset),
  7561. newOffsetEnd - curOffsetEnd);
  7562. }
  7563. /* FINALLY the newBucket is populated correctly */
  7564. /* All buckets up to and including next (if combining) have to be free'd */
  7565. {
  7566. DtlsFragBucket* toFree = cur->m.m.next;
  7567. while (toFree != next) {
  7568. DtlsFragBucket* n = toFree->m.m.next;
  7569. overlapSz += toFree->m.m.sz;
  7570. DtlsMsgDestroyFragBucket(toFree, heap);
  7571. msg->fragBucketListCount--;
  7572. toFree = n;
  7573. }
  7574. if (combineNext) {
  7575. newBucket->m.m.next = next->m.m.next;
  7576. overlapSz += next->m.m.sz;
  7577. DtlsMsgDestroyFragBucket(otherBucket, heap);
  7578. msg->fragBucketListCount--;
  7579. }
  7580. else {
  7581. newBucket->m.m.next = next;
  7582. }
  7583. }
  7584. /* Adjust size in msg */
  7585. msg->bytesReceived += newSz - overlapSz;
  7586. newBucket->m.m.offset = newOffset;
  7587. newBucket->m.m.sz = newSz;
  7588. return newBucket;
  7589. }
  7590. static void DtlsMsgAssembleCompleteMessage(DtlsMsg* msg)
  7591. {
  7592. DtlsHandShakeHeader* dtls;
  7593. /* We have received all necessary fragments. Reconstruct the header. */
  7594. if (msg->fragBucketListCount != 1 || msg->fragBucketList->m.m.offset != 0 ||
  7595. msg->fragBucketList->m.m.sz != msg->sz) {
  7596. WOLFSSL_MSG("Major error in fragment assembly logic");
  7597. return;
  7598. }
  7599. /* Re-cycle the DtlsFragBucket as the buffer that holds the complete
  7600. * handshake message and the header. */
  7601. msg->raw = (byte*)msg->fragBucketList;
  7602. msg->fullMsg = msg->fragBucketList->buf;
  7603. msg->ready = 1;
  7604. /* frag->padding makes sure we can fit the entire DTLS handshake header
  7605. * before frag->buf */
  7606. /* note the dtls pointer needs to be computed from msg->fragBucketList, not
  7607. * from msg->fragBucketList->buf, to avoid a pointerOutOfBounds access
  7608. * detected by cppcheck.
  7609. *
  7610. * also note, the (void *) intermediate cast is necessary to avoid a
  7611. * potential -Wcast-align around alignment of DtlsHandShakeHeader exceeding
  7612. * alignment of char.
  7613. */
  7614. dtls = (DtlsHandShakeHeader*)(void *)((char *)msg->fragBucketList
  7615. + OFFSETOF(DtlsFragBucket,buf)
  7616. - DTLS_HANDSHAKE_HEADER_SZ);
  7617. msg->fragBucketList = NULL;
  7618. msg->fragBucketListCount = 0;
  7619. dtls->type = msg->type;
  7620. c32to24(msg->sz, dtls->length);
  7621. c16toa((word16)msg->seq, dtls->message_seq);
  7622. c32to24(0, dtls->fragment_offset);
  7623. c32to24(msg->sz, dtls->fragment_length);
  7624. }
  7625. int DtlsMsgSet(DtlsMsg* msg, word32 seq, word16 epoch, const byte* data, byte type,
  7626. word32 fragOffset, word32 fragSz, void* heap, word32 totalLen)
  7627. {
  7628. word32 fragOffsetEnd = fragOffset + fragSz;
  7629. WOLFSSL_ENTER("DtlsMsgSet");
  7630. if (msg == NULL || data == NULL || msg->sz != totalLen ||
  7631. fragOffsetEnd > totalLen) {
  7632. WOLFSSL_ERROR_VERBOSE(BAD_FUNC_ARG);
  7633. return BAD_FUNC_ARG;
  7634. }
  7635. if (msg->ready)
  7636. return 0; /* msg is already complete */
  7637. if (msg->type != no_shake) {
  7638. /* msg is already populated with the correct seq, epoch, and type */
  7639. if (msg->type != type || msg->epoch != epoch || msg->seq != seq) {
  7640. WOLFSSL_ERROR_VERBOSE(SEQUENCE_ERROR);
  7641. return SEQUENCE_ERROR;
  7642. }
  7643. }
  7644. else {
  7645. msg->type = type;
  7646. msg->epoch = epoch;
  7647. msg->seq = seq;
  7648. }
  7649. if (msg->fragBucketList == NULL) {
  7650. /* Clean list. Create first fragment. */
  7651. msg->fragBucketList = DtlsMsgCreateFragBucket(fragOffset, data, fragSz, heap);
  7652. if (msg->fragBucketList != NULL) {
  7653. msg->bytesReceived = fragSz;
  7654. msg->fragBucketListCount++;
  7655. }
  7656. else {
  7657. return MEMORY_ERROR;
  7658. }
  7659. }
  7660. else {
  7661. /* See if we can expand any existing bucket to fit this new data into */
  7662. DtlsFragBucket* prev = NULL;
  7663. DtlsFragBucket* cur = msg->fragBucketList;
  7664. byte done = 0;
  7665. for (; cur != NULL; prev = cur, cur = cur->m.m.next) {
  7666. word32 curOffset = cur->m.m.offset;
  7667. word32 curEnd = cur->m.m.offset + cur->m.m.sz;
  7668. if (fragOffset >= curOffset && fragOffsetEnd <= curEnd) {
  7669. /* We already have this fragment */
  7670. done = 1;
  7671. break;
  7672. }
  7673. else if (fragOffset <= curEnd) {
  7674. /* found place to store fragment */
  7675. break;
  7676. }
  7677. }
  7678. if (!done) {
  7679. if (cur == NULL) {
  7680. /* We reached the end of the list. data is after and disjointed
  7681. * from anything we have received so far. */
  7682. if (msg->fragBucketListCount >= DTLS_FRAG_POOL_SZ) {
  7683. WOLFSSL_ERROR_VERBOSE(DTLS_TOO_MANY_FRAGMENTS_E);
  7684. return DTLS_TOO_MANY_FRAGMENTS_E;
  7685. }
  7686. prev->m.m.next =
  7687. DtlsMsgCreateFragBucket(fragOffset, data, fragSz, heap);
  7688. if (prev->m.m.next != NULL) {
  7689. msg->bytesReceived += fragSz;
  7690. msg->fragBucketListCount++;
  7691. }
  7692. }
  7693. else if (prev == NULL && fragOffsetEnd < cur->m.m.offset) {
  7694. /* This is the new first fragment we have received */
  7695. if (msg->fragBucketListCount >= DTLS_FRAG_POOL_SZ) {
  7696. WOLFSSL_ERROR_VERBOSE(DTLS_TOO_MANY_FRAGMENTS_E);
  7697. return DTLS_TOO_MANY_FRAGMENTS_E;
  7698. }
  7699. msg->fragBucketList = DtlsMsgCreateFragBucket(fragOffset, data,
  7700. fragSz, heap);
  7701. if (msg->fragBucketList != NULL) {
  7702. msg->fragBucketList->m.m.next = cur;
  7703. msg->bytesReceived += fragSz;
  7704. msg->fragBucketListCount++;
  7705. }
  7706. else {
  7707. /* reset on error */
  7708. msg->fragBucketList = cur;
  7709. }
  7710. }
  7711. else {
  7712. /* Find if this fragment overlaps with any more */
  7713. DtlsFragBucket* next = cur->m.m.next;
  7714. DtlsFragBucket** prev_next = prev != NULL
  7715. ? &prev->m.m.next : &msg->fragBucketList;
  7716. while (next != NULL &&
  7717. (next->m.m.offset + next->m.m.sz) <= fragOffsetEnd)
  7718. next = next->m.m.next;
  7719. /* We can combine the buckets */
  7720. *prev_next = DtlsMsgCombineFragBuckets(msg, cur, next,
  7721. fragOffset, data, fragSz, heap);
  7722. if (*prev_next == NULL) /* reset on error */
  7723. *prev_next = cur;
  7724. }
  7725. }
  7726. }
  7727. if (msg->bytesReceived == msg->sz)
  7728. DtlsMsgAssembleCompleteMessage(msg);
  7729. return 0;
  7730. }
  7731. DtlsMsg* DtlsMsgFind(DtlsMsg* head, word16 epoch, word32 seq)
  7732. {
  7733. WOLFSSL_ENTER("DtlsMsgFind");
  7734. while (head != NULL && !(head->epoch == epoch && head->seq == seq)) {
  7735. head = head->next;
  7736. }
  7737. return head;
  7738. }
  7739. void DtlsMsgStore(WOLFSSL* ssl, word16 epoch, word32 seq, const byte* data,
  7740. word32 dataSz, byte type, word32 fragOffset, word32 fragSz, void* heap)
  7741. {
  7742. /* See if seq exists in the list. If it isn't in the list, make
  7743. * a new item of size dataSz, copy fragSz bytes from data to msg->msg
  7744. * starting at offset fragOffset, and add fragSz to msg->fragSz. If
  7745. * the seq is in the list and it isn't full, copy fragSz bytes from
  7746. * data to msg->msg starting at offset fragOffset, and add fragSz to
  7747. * msg->fragSz. Insertions take into account data already in the list
  7748. * in case there are overlaps in the handshake message due to retransmit
  7749. * messages. The new item should be inserted into the list in its
  7750. * proper position.
  7751. *
  7752. * 1. Find seq in list, or where seq should go in list. If seq not in
  7753. * list, create new item and insert into list. Either case, keep
  7754. * pointer to item.
  7755. * 2. Copy the data from the message to the stored message where it
  7756. * belongs without overlaps.
  7757. */
  7758. DtlsMsg* head = ssl->dtls_rx_msg_list;
  7759. WOLFSSL_ENTER("DtlsMsgStore");
  7760. if (head != NULL) {
  7761. DtlsMsg* cur = DtlsMsgFind(head, epoch, seq);
  7762. if (cur == NULL) {
  7763. cur = DtlsMsgNew(dataSz, 0, heap);
  7764. if (cur != NULL) {
  7765. if (DtlsMsgSet(cur, seq, epoch, data, type,
  7766. fragOffset, fragSz, heap, dataSz) < 0) {
  7767. DtlsMsgDelete(cur, heap);
  7768. }
  7769. else {
  7770. ssl->dtls_rx_msg_list_sz++;
  7771. head = DtlsMsgInsert(head, cur);
  7772. }
  7773. }
  7774. }
  7775. else {
  7776. /* If this fails, the data is just dropped. */
  7777. DtlsMsgSet(cur, seq, epoch, data, type, fragOffset,
  7778. fragSz, heap, dataSz);
  7779. }
  7780. }
  7781. else {
  7782. head = DtlsMsgNew(dataSz, 0, heap);
  7783. if (DtlsMsgSet(head, seq, epoch, data, type, fragOffset,
  7784. fragSz, heap, dataSz) < 0) {
  7785. DtlsMsgDelete(head, heap);
  7786. head = NULL;
  7787. }
  7788. else {
  7789. ssl->dtls_rx_msg_list_sz++;
  7790. }
  7791. }
  7792. ssl->dtls_rx_msg_list = head;
  7793. }
  7794. /* DtlsMsgInsert() is an in-order insert. */
  7795. DtlsMsg* DtlsMsgInsert(DtlsMsg* head, DtlsMsg* item)
  7796. {
  7797. WOLFSSL_ENTER("DtlsMsgInsert");
  7798. if (head == NULL || (item->epoch <= head->epoch &&
  7799. item->seq < head->seq)) {
  7800. item->next = head;
  7801. head = item;
  7802. }
  7803. else if (head->next == NULL) {
  7804. head->next = item;
  7805. }
  7806. else {
  7807. DtlsMsg* cur = head->next;
  7808. DtlsMsg* prev = head;
  7809. while (cur) {
  7810. if (item->epoch <= cur->epoch &&
  7811. item->seq < cur->seq) {
  7812. item->next = cur;
  7813. prev->next = item;
  7814. break;
  7815. }
  7816. prev = cur;
  7817. cur = cur->next;
  7818. }
  7819. if (cur == NULL) {
  7820. prev->next = item;
  7821. }
  7822. }
  7823. return head;
  7824. }
  7825. /**
  7826. * DtlsMsgPoolSave() adds the message to the end of the stored transmit
  7827. * list. Must be called BEFORE BuildMessage or DtlsSEQIncrement or
  7828. * anything else that increments ssl->keys.dtls_handshake_number.
  7829. */
  7830. int DtlsMsgPoolSave(WOLFSSL* ssl, const byte* data, word32 dataSz,
  7831. enum HandShakeType type)
  7832. {
  7833. DtlsMsg* item;
  7834. int ret = 0;
  7835. WOLFSSL_ENTER("DtlsMsgPoolSave");
  7836. if (ssl->dtls_tx_msg_list_sz > DTLS_POOL_SZ) {
  7837. WOLFSSL_ERROR(DTLS_POOL_SZ_E);
  7838. return DTLS_POOL_SZ_E;
  7839. }
  7840. item = DtlsMsgNew(dataSz, 1, ssl->heap);
  7841. if (item != NULL) {
  7842. DtlsMsg* cur = ssl->dtls_tx_msg_list;
  7843. XMEMCPY(item->raw, data, dataSz);
  7844. item->epoch = ssl->keys.dtls_epoch;
  7845. item->seq = ssl->keys.dtls_handshake_number;
  7846. item->type = type;
  7847. if (cur == NULL)
  7848. ssl->dtls_tx_msg_list = item;
  7849. else {
  7850. while (cur->next)
  7851. cur = cur->next;
  7852. cur->next = item;
  7853. }
  7854. ssl->dtls_tx_msg_list_sz++;
  7855. }
  7856. else
  7857. ret = MEMORY_E;
  7858. WOLFSSL_LEAVE("DtlsMsgPoolSave()", ret);
  7859. return ret;
  7860. }
  7861. /* DtlsMsgPoolTimeout() updates the timeout time. */
  7862. int DtlsMsgPoolTimeout(WOLFSSL* ssl)
  7863. {
  7864. int result = -1;
  7865. WOLFSSL_ENTER("DtlsMsgPoolTimeout");
  7866. if (ssl->dtls_timeout < ssl->dtls_timeout_max) {
  7867. ssl->dtls_timeout *= DTLS_TIMEOUT_MULTIPLIER;
  7868. result = 0;
  7869. }
  7870. WOLFSSL_LEAVE("DtlsMsgPoolTimeout()", result);
  7871. return result;
  7872. }
  7873. /* DtlsMsgPoolReset() deletes the stored transmit list. */
  7874. void DtlsMsgPoolReset(WOLFSSL* ssl)
  7875. {
  7876. WOLFSSL_ENTER("DtlsMsgPoolReset");
  7877. if (ssl->dtls_tx_msg_list) {
  7878. DtlsMsgListDelete(ssl->dtls_tx_msg_list, ssl->heap);
  7879. ssl->dtls_tx_msg_list = NULL;
  7880. ssl->dtls_tx_msg = NULL;
  7881. ssl->dtls_tx_msg_list_sz = 0;
  7882. }
  7883. }
  7884. int VerifyForDtlsMsgPoolSend(WOLFSSL* ssl, byte type, word32 fragOffset)
  7885. {
  7886. /**
  7887. * only the first message from previous flight should be valid
  7888. * to be used for triggering retransmission of whole DtlsMsgPool.
  7889. * change cipher suite type is not verified here
  7890. */
  7891. return ((fragOffset == 0) &&
  7892. (((ssl->options.side == WOLFSSL_SERVER_END) &&
  7893. ((type == client_hello) ||
  7894. ((ssl->options.verifyPeer) && (type == certificate)) ||
  7895. ((!ssl->options.verifyPeer) && (type == client_key_exchange)))) ||
  7896. ((ssl->options.side == WOLFSSL_CLIENT_END) &&
  7897. (type == hello_request || type == server_hello))));
  7898. }
  7899. /**
  7900. * Verify if message `item` from `ssl->dtls_tx_msg_list` should be deleted
  7901. * depending on the current state of the handshake negotiation.
  7902. */
  7903. int VerifyForTxDtlsMsgDelete(WOLFSSL* ssl, DtlsMsg* item)
  7904. {
  7905. WOLFSSL_ENTER("VerifyForTxDtlsMsgDelete");
  7906. if (item->epoch < ssl->keys.dtls_epoch - 1)
  7907. /* Messages not from current or previous epoch can be deleted */
  7908. return 1;
  7909. switch (ssl->options.side) {
  7910. case WOLFSSL_CLIENT_END:
  7911. if (item->type == client_hello &&
  7912. ssl->options.serverState >= SERVER_HELLODONE_COMPLETE)
  7913. return 1; /* client can forget first client_hello if received full
  7914. * flight of packets from server */
  7915. else
  7916. return 0;
  7917. case WOLFSSL_SERVER_END:
  7918. if (ssl->options.clientState >= CLIENT_HELLO_COMPLETE &&
  7919. item->type == hello_request)
  7920. return 1; /* Server can forget HelloRequest if client sent a valid
  7921. * ClientHello */
  7922. if (ssl->options.clientState >= CLIENT_FINISHED_COMPLETE &&
  7923. item->type <= server_hello_done)
  7924. return 1; /* server can forget everything up to ServerHelloDone if
  7925. * a client finished message has been received and
  7926. * successfully processed */
  7927. else
  7928. return 0;
  7929. default:
  7930. return 0;
  7931. }
  7932. }
  7933. /* DtlsMsgPoolSend() will send the stored transmit list. The stored list is
  7934. * updated with new sequence numbers, and will be re-encrypted if needed. */
  7935. int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket)
  7936. {
  7937. int ret = 0;
  7938. DtlsMsg* pool;
  7939. WOLFSSL_ENTER("DtlsMsgPoolSend");
  7940. pool = ssl->dtls_tx_msg == NULL ? ssl->dtls_tx_msg_list : ssl->dtls_tx_msg;
  7941. if (pool != NULL) {
  7942. if ((ssl->options.side == WOLFSSL_SERVER_END &&
  7943. !(ssl->options.acceptState == ACCEPT_BEGIN_RENEG ||
  7944. ssl->options.acceptState == SERVER_HELLO_DONE ||
  7945. ssl->options.acceptState == ACCEPT_FINISHED_DONE ||
  7946. ssl->options.acceptState == ACCEPT_THIRD_REPLY_DONE)) ||
  7947. (ssl->options.side == WOLFSSL_CLIENT_END &&
  7948. !(ssl->options.connectState == CLIENT_HELLO_SENT ||
  7949. ssl->options.connectState == HELLO_AGAIN_REPLY ||
  7950. ssl->options.connectState == FINISHED_DONE ||
  7951. ssl->options.connectState == SECOND_REPLY_DONE))) {
  7952. WOLFSSL_ERROR(DTLS_RETX_OVER_TX);
  7953. ssl->error = DTLS_RETX_OVER_TX;
  7954. return WOLFSSL_FATAL_ERROR;
  7955. }
  7956. while (pool != NULL) {
  7957. int epochOrder;
  7958. if (pool->epoch == 0) {
  7959. DtlsRecordLayerHeader* dtls;
  7960. dtls = (DtlsRecordLayerHeader*)pool->raw;
  7961. /* If the stored record's epoch is 0, and the currently set
  7962. * epoch is 0, use the "current order" sequence number.
  7963. * If the stored record's epoch is 0 and the currently set
  7964. * epoch is not 0, the stored record is considered a "previous
  7965. * order" sequence number. */
  7966. epochOrder = (ssl->keys.dtls_epoch == 0) ?
  7967. CUR_ORDER : PREV_ORDER;
  7968. WriteSEQ(ssl, epochOrder, dtls->sequence_number);
  7969. DtlsSEQIncrement(ssl, epochOrder);
  7970. if ((ret = CheckAvailableSize(ssl, pool->sz)) != 0) {
  7971. WOLFSSL_ERROR(ret);
  7972. return ret;
  7973. }
  7974. XMEMCPY(ssl->buffers.outputBuffer.buffer +
  7975. ssl->buffers.outputBuffer.idx +
  7976. ssl->buffers.outputBuffer.length,
  7977. pool->raw, pool->sz);
  7978. ssl->buffers.outputBuffer.length += pool->sz;
  7979. }
  7980. else {
  7981. /* Handle sending packets from previous epoch */
  7982. byte* input;
  7983. byte* output;
  7984. int inputSz, sendSz;
  7985. input = pool->raw;
  7986. inputSz = pool->sz;
  7987. sendSz = inputSz + cipherExtraData(ssl);
  7988. #ifdef HAVE_SECURE_RENEGOTIATION
  7989. /*
  7990. * CUR_ORDER will use ssl->secure_renegotiation from epoch 2+.
  7991. * ssl->keys otherwise
  7992. * PREV_ORDER will always use ssl->keys
  7993. */
  7994. if (DtlsSCRKeysSet(ssl)) {
  7995. if (pool->epoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch)
  7996. epochOrder = CUR_ORDER;
  7997. else
  7998. epochOrder = PREV_ORDER;
  7999. }
  8000. else {
  8001. epochOrder = CUR_ORDER;
  8002. }
  8003. #else
  8004. epochOrder = CUR_ORDER;
  8005. #endif
  8006. /* add back in record header space from saved pool size */
  8007. sendSz += DTLS_RECORD_HEADER_SZ;
  8008. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) {
  8009. WOLFSSL_ERROR(ret);
  8010. return ret;
  8011. }
  8012. output = ssl->buffers.outputBuffer.buffer +
  8013. ssl->buffers.outputBuffer.length;
  8014. if (inputSz != ENUM_LEN)
  8015. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  8016. handshake, 0, 0, 0, epochOrder);
  8017. else
  8018. /* inputSz == ENUM_LEN must mean that this is a change cipher
  8019. * spec message */
  8020. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  8021. change_cipher_spec, 0, 0, 0, epochOrder);
  8022. if (sendSz < 0) {
  8023. WOLFSSL_ERROR(BUILD_MSG_ERROR);
  8024. return BUILD_MSG_ERROR;
  8025. }
  8026. ssl->buffers.outputBuffer.length += sendSz;
  8027. }
  8028. if (!ssl->options.groupMessages)
  8029. ret = SendBuffered(ssl);
  8030. /**
  8031. * on server side, retransmission is being triggered only by sending
  8032. * first message of given flight, in order to trigger client
  8033. * to retransmit its whole flight. Sending the whole previous flight
  8034. * could lead to retransmission of previous client flight for each
  8035. * server message from previous flight. Therefore one message should
  8036. * be enough to do the trick.
  8037. */
  8038. if (sendOnlyFirstPacket &&
  8039. ssl->options.side == WOLFSSL_SERVER_END)
  8040. pool = NULL;
  8041. else
  8042. pool = pool->next;
  8043. ssl->dtls_tx_msg = pool;
  8044. }
  8045. if (ret == 0 && ssl->options.groupMessages)
  8046. ret = SendBuffered(ssl);
  8047. }
  8048. WOLFSSL_LEAVE("DtlsMsgPoolSend()", ret);
  8049. return ret;
  8050. }
  8051. #endif /* WOLFSSL_DTLS */
  8052. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  8053. ProtocolVersion MakeSSLv3(void)
  8054. {
  8055. ProtocolVersion pv;
  8056. pv.major = SSLv3_MAJOR;
  8057. pv.minor = SSLv3_MINOR;
  8058. return pv;
  8059. }
  8060. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  8061. #ifdef WOLFSSL_DTLS
  8062. ProtocolVersion MakeDTLSv1(void)
  8063. {
  8064. ProtocolVersion pv;
  8065. pv.major = DTLS_MAJOR;
  8066. pv.minor = DTLS_MINOR;
  8067. return pv;
  8068. }
  8069. #ifndef WOLFSSL_NO_TLS12
  8070. ProtocolVersion MakeDTLSv1_2(void)
  8071. {
  8072. ProtocolVersion pv;
  8073. pv.major = DTLS_MAJOR;
  8074. pv.minor = DTLSv1_2_MINOR;
  8075. return pv;
  8076. }
  8077. #endif /* !WOLFSSL_NO_TLS12 */
  8078. #ifdef WOLFSSL_DTLS13
  8079. ProtocolVersion MakeDTLSv1_3(void)
  8080. {
  8081. ProtocolVersion pv;
  8082. pv.major = DTLS_MAJOR;
  8083. pv.minor = DTLSv1_3_MINOR;
  8084. return pv;
  8085. }
  8086. #endif /* WOLFSSL_DTLS13 */
  8087. #endif /* WOLFSSL_DTLS */
  8088. #ifndef NO_ASN_TIME
  8089. #if defined(USER_TICKS)
  8090. #if 0
  8091. word32 LowResTimer(void)
  8092. {
  8093. /*
  8094. write your own clock tick function if don't want time(0)
  8095. needs second accuracy but doesn't have to correlated to EPOCH
  8096. */
  8097. }
  8098. #endif
  8099. #elif defined(TIME_OVERRIDES)
  8100. #if !defined(NO_ASN) && !defined(NO_ASN_TIME)
  8101. /* use same asn time overrides unless user wants tick override above */
  8102. word32 LowResTimer(void)
  8103. {
  8104. return (word32) wc_Time(0);
  8105. }
  8106. #else
  8107. #ifndef HAVE_TIME_T_TYPE
  8108. typedef long time_t;
  8109. #endif
  8110. extern time_t XTIME(time_t * timer);
  8111. word32 LowResTimer(void)
  8112. {
  8113. return (word32) XTIME(0);
  8114. }
  8115. #endif
  8116. #elif defined(USE_WINDOWS_API)
  8117. word32 LowResTimer(void)
  8118. {
  8119. static int init = 0;
  8120. static LARGE_INTEGER freq;
  8121. LARGE_INTEGER count;
  8122. if (!init) {
  8123. QueryPerformanceFrequency(&freq);
  8124. init = 1;
  8125. }
  8126. QueryPerformanceCounter(&count);
  8127. return (word32)(count.QuadPart / freq.QuadPart);
  8128. }
  8129. #elif defined(HAVE_RTP_SYS)
  8130. #include "rtptime.h"
  8131. word32 LowResTimer(void)
  8132. {
  8133. return (word32)rtp_get_system_sec();
  8134. }
  8135. #elif defined(WOLFSSL_DEOS)
  8136. word32 LowResTimer(void)
  8137. {
  8138. const word32 systemTickTimeInHz = 1000000 / systemTickInMicroseconds();
  8139. const volatile word32 *systemTickPtr = systemTickPointer();
  8140. return (word32) *systemTickPtr/systemTickTimeInHz;
  8141. }
  8142. #elif defined(MICRIUM)
  8143. word32 LowResTimer(void)
  8144. {
  8145. OS_TICK ticks = 0;
  8146. OS_ERR err;
  8147. ticks = OSTimeGet(&err);
  8148. return (word32) (ticks / OSCfg_TickRate_Hz);
  8149. }
  8150. #elif defined(MICROCHIP_TCPIP_V5)
  8151. word32 LowResTimer(void)
  8152. {
  8153. return (word32) (TickGet() / TICKS_PER_SECOND);
  8154. }
  8155. #elif defined(MICROCHIP_TCPIP)
  8156. #if defined(MICROCHIP_MPLAB_HARMONY)
  8157. #include <system/tmr/sys_tmr.h>
  8158. word32 LowResTimer(void)
  8159. {
  8160. return (word32) (SYS_TMR_TickCountGet() /
  8161. SYS_TMR_TickCounterFrequencyGet());
  8162. }
  8163. #else
  8164. word32 LowResTimer(void)
  8165. {
  8166. return (word32) (SYS_TICK_Get() / SYS_TICK_TicksPerSecondGet());
  8167. }
  8168. #endif
  8169. #elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
  8170. word32 LowResTimer(void)
  8171. {
  8172. TIME_STRUCT mqxTime;
  8173. _time_get_elapsed(&mqxTime);
  8174. return (word32) mqxTime.SECONDS;
  8175. }
  8176. #elif defined(FREESCALE_FREE_RTOS) || defined(FREESCALE_KSDK_FREERTOS)
  8177. #include "include/task.h"
  8178. unsigned int LowResTimer(void)
  8179. {
  8180. return (unsigned int)(((float)xTaskGetTickCount())/configTICK_RATE_HZ);
  8181. }
  8182. #elif defined(FREERTOS)
  8183. #include "task.h"
  8184. unsigned int LowResTimer(void)
  8185. {
  8186. return (unsigned int)(((float)xTaskGetTickCount())/configTICK_RATE_HZ);
  8187. }
  8188. #elif defined(FREESCALE_KSDK_BM)
  8189. #include "lwip/sys.h" /* lwIP */
  8190. word32 LowResTimer(void)
  8191. {
  8192. return sys_now()/1000;
  8193. }
  8194. #elif defined(WOLFSSL_TIRTOS)
  8195. word32 LowResTimer(void)
  8196. {
  8197. return (word32) Seconds_get();
  8198. }
  8199. #elif defined(WOLFSSL_XILINX)
  8200. #include "xrtcpsu.h"
  8201. word32 LowResTimer(void)
  8202. {
  8203. XRtcPsu_Config* con;
  8204. XRtcPsu rtc;
  8205. con = XRtcPsu_LookupConfig(XPAR_XRTCPSU_0_DEVICE_ID);
  8206. if (con != NULL) {
  8207. if (XRtcPsu_CfgInitialize(&rtc, con, con->BaseAddr)
  8208. == XST_SUCCESS) {
  8209. return (word32)XRtcPsu_GetCurrentTime(&rtc);
  8210. }
  8211. else {
  8212. WOLFSSL_MSG("Unable to initialize RTC");
  8213. }
  8214. }
  8215. return 0;
  8216. }
  8217. #elif defined(WOLFSSL_UTASKER)
  8218. word32 LowResTimer(void)
  8219. {
  8220. return (word32)(uTaskerSystemTick / TICK_RESOLUTION);
  8221. }
  8222. #elif defined(WOLFSSL_NUCLEUS_1_2)
  8223. #define NU_TICKS_PER_SECOND 100
  8224. word32 LowResTimer(void)
  8225. {
  8226. /* returns number of 10ms ticks, so 100 ticks/sec */
  8227. return NU_Retrieve_Clock() / NU_TICKS_PER_SECOND;
  8228. }
  8229. #elif defined(WOLFSSL_APACHE_MYNEWT)
  8230. #include "os/os_time.h"
  8231. word32 LowResTimer(void)
  8232. {
  8233. word32 now;
  8234. struct os_timeval tv;
  8235. os_gettimeofday(&tv, NULL);
  8236. now = (word32)tv.tv_sec;
  8237. return now;
  8238. }
  8239. #elif defined(WOLFSSL_ZEPHYR)
  8240. word32 LowResTimer(void)
  8241. {
  8242. return k_uptime_get() / 1000;
  8243. }
  8244. #elif defined(WOLFSSL_LINUXKM)
  8245. word32 LowResTimer(void)
  8246. {
  8247. return (word32)time(NULL);
  8248. }
  8249. #else
  8250. /* Posix style time */
  8251. #if !defined(USER_TIME) && !defined(USE_WOLF_TM)
  8252. #include <time.h>
  8253. #endif
  8254. word32 LowResTimer(void)
  8255. {
  8256. #if !defined(NO_ASN) && !defined(NO_ASN_TIME)
  8257. return (word32)wc_Time(0);
  8258. #else
  8259. return (word32)XTIME(0);
  8260. #endif
  8261. }
  8262. #endif
  8263. #else
  8264. /* user must supply timer function to return elapsed seconds:
  8265. * word32 LowResTimer(void);
  8266. */
  8267. #endif /* !NO_ASN_TIME */
  8268. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  8269. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  8270. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  8271. /* Store the message for use with CertificateVerify using EdDSA.
  8272. *
  8273. * ssl SSL/TLS object.
  8274. * data Message to store.
  8275. * sz Size of message to store.
  8276. * returns MEMORY_E if not able to reallocate, otherwise 0.
  8277. */
  8278. static int EdDSA_Update(WOLFSSL* ssl, const byte* data, int sz)
  8279. {
  8280. int ret = 0;
  8281. byte* msgs;
  8282. if (ssl->options.cacheMessages) {
  8283. msgs = (byte*)XMALLOC(ssl->hsHashes->length + sz, ssl->heap,
  8284. DYNAMIC_TYPE_HASHES);
  8285. if (msgs == NULL)
  8286. ret = MEMORY_E;
  8287. if ((ret == 0) && (ssl->hsHashes->messages != NULL)) {
  8288. XMEMCPY(msgs, ssl->hsHashes->messages, ssl->hsHashes->length);
  8289. ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
  8290. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  8291. }
  8292. if (ret == 0) {
  8293. #ifdef WOLFSSL_CHECK_MEM_ZERO
  8294. wc_MemZero_Add("Handshake messages", msgs,
  8295. ssl->hsHashes->length + sz);
  8296. #endif
  8297. ssl->hsHashes->messages = msgs;
  8298. XMEMCPY(msgs + ssl->hsHashes->length, data, sz);
  8299. ssl->hsHashes->prevLen = ssl->hsHashes->length;
  8300. ssl->hsHashes->length += sz;
  8301. }
  8302. }
  8303. return ret;
  8304. }
  8305. #endif /* (HAVE_ED25519 || HAVE_ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  8306. int HashRaw(WOLFSSL* ssl, const byte* data, int sz)
  8307. {
  8308. int ret = 0;
  8309. #ifdef WOLFSSL_DEBUG_TLS
  8310. byte digest[WC_MAX_DIGEST_SIZE];
  8311. WOLFSSL_MSG("HashRaw:");
  8312. WOLFSSL_MSG("Data:");
  8313. WOLFSSL_BUFFER(data, sz);
  8314. WOLFSSL_MSG("Hashes:");
  8315. #endif
  8316. (void)data;
  8317. (void)sz;
  8318. if (ssl->hsHashes == NULL) {
  8319. return BAD_FUNC_ARG;
  8320. }
  8321. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  8322. ret = tsip_StoreMessage(ssl, data, sz);
  8323. if (ret != 0 && ret != CRYPTOCB_UNAVAILABLE) {
  8324. return ret;
  8325. }
  8326. #endif /* WOLFSSL_RENESAS_TSIP_TLS */
  8327. #ifndef NO_OLD_TLS
  8328. #ifndef NO_SHA
  8329. wc_ShaUpdate(&ssl->hsHashes->hashSha, data, sz);
  8330. #endif
  8331. #ifndef NO_MD5
  8332. wc_Md5Update(&ssl->hsHashes->hashMd5, data, sz);
  8333. #endif
  8334. #endif /* NO_OLD_TLS */
  8335. if (IsAtLeastTLSv1_2(ssl)) {
  8336. #ifndef NO_SHA256
  8337. ret = wc_Sha256Update(&ssl->hsHashes->hashSha256, data, sz);
  8338. if (ret != 0)
  8339. return ret;
  8340. #ifdef WOLFSSL_DEBUG_TLS
  8341. WOLFSSL_MSG("Sha256");
  8342. wc_Sha256GetHash(&ssl->hsHashes->hashSha256, digest);
  8343. WOLFSSL_BUFFER(digest, WC_SHA256_DIGEST_SIZE);
  8344. #endif
  8345. #endif
  8346. #ifdef WOLFSSL_SHA384
  8347. ret = wc_Sha384Update(&ssl->hsHashes->hashSha384, data, sz);
  8348. if (ret != 0)
  8349. return ret;
  8350. #ifdef WOLFSSL_DEBUG_TLS
  8351. WOLFSSL_MSG("Sha384");
  8352. wc_Sha384GetHash(&ssl->hsHashes->hashSha384, digest);
  8353. WOLFSSL_BUFFER(digest, WC_SHA384_DIGEST_SIZE);
  8354. #endif
  8355. #endif
  8356. #ifdef WOLFSSL_SHA512
  8357. ret = wc_Sha512Update(&ssl->hsHashes->hashSha512, data, sz);
  8358. if (ret != 0)
  8359. return ret;
  8360. #ifdef WOLFSSL_DEBUG_TLS
  8361. WOLFSSL_MSG("Sha512");
  8362. wc_Sha512GetHash(&ssl->hsHashes->hashSha512, digest);
  8363. WOLFSSL_BUFFER(digest, WC_SHA512_DIGEST_SIZE);
  8364. #endif
  8365. #endif
  8366. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  8367. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  8368. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  8369. ret = EdDSA_Update(ssl, data, sz);
  8370. if (ret != 0)
  8371. return ret;
  8372. #endif
  8373. }
  8374. return ret;
  8375. }
  8376. /* add output to md5 and sha handshake hashes, exclude record header */
  8377. int HashOutput(WOLFSSL* ssl, const byte* output, int sz, int ivSz)
  8378. {
  8379. const byte* adj;
  8380. if (ssl->hsHashes == NULL)
  8381. return BAD_FUNC_ARG;
  8382. adj = output + RECORD_HEADER_SZ + ivSz;
  8383. sz -= RECORD_HEADER_SZ;
  8384. #ifdef HAVE_FUZZER
  8385. if (ssl->fuzzerCb)
  8386. ssl->fuzzerCb(ssl, output, sz, FUZZ_HASH, ssl->fuzzerCtx);
  8387. #endif
  8388. #ifdef WOLFSSL_DTLS
  8389. if (ssl->options.dtls) {
  8390. if (IsAtLeastTLSv1_3(ssl->version)) {
  8391. #ifdef WOLFSSL_DTLS13
  8392. word16 dtls_record_extra;
  8393. dtls_record_extra = Dtls13GetRlHeaderLength(ssl, (byte)IsEncryptionOn(ssl, 1));
  8394. dtls_record_extra -= RECORD_HEADER_SZ;
  8395. adj += dtls_record_extra;
  8396. sz -= dtls_record_extra;
  8397. #endif /* WOLFSSL_DTLS13 */
  8398. } else {
  8399. adj += DTLS_RECORD_EXTRA;
  8400. sz -= DTLS_RECORD_EXTRA;
  8401. }
  8402. }
  8403. #endif
  8404. return HashRaw(ssl, adj, sz);
  8405. }
  8406. /* add input to md5 and sha handshake hashes, include handshake header */
  8407. int HashInput(WOLFSSL* ssl, const byte* input, int sz)
  8408. {
  8409. const byte* adj;
  8410. if (ssl->hsHashes == NULL) {
  8411. return BAD_FUNC_ARG;
  8412. }
  8413. adj = input - HANDSHAKE_HEADER_SZ;
  8414. sz += HANDSHAKE_HEADER_SZ;
  8415. #ifdef WOLFSSL_DTLS
  8416. if (ssl->options.dtls) {
  8417. adj -= DTLS_HANDSHAKE_EXTRA;
  8418. sz += DTLS_HANDSHAKE_EXTRA;
  8419. #ifdef WOLFSSL_DTLS13
  8420. if (IsAtLeastTLSv1_3(ssl->version))
  8421. return Dtls13HashHandshake(ssl, adj, (word16)sz);
  8422. #endif /* WOLFSSL_DTLS13 */
  8423. }
  8424. #endif
  8425. return HashRaw(ssl, adj, sz);
  8426. }
  8427. /* add record layer header for message */
  8428. static void AddRecordHeader(byte* output, word32 length, byte type, WOLFSSL* ssl, int epochOrder)
  8429. {
  8430. RecordLayerHeader* rl;
  8431. (void)epochOrder;
  8432. /* record layer header */
  8433. rl = (RecordLayerHeader*)output;
  8434. if (rl == NULL) {
  8435. return;
  8436. }
  8437. rl->type = type;
  8438. rl->pvMajor = ssl->version.major; /* type and version same in each */
  8439. #ifdef WOLFSSL_TLS13
  8440. if (IsAtLeastTLSv1_3(ssl->version)) {
  8441. rl->pvMinor = TLSv1_2_MINOR;
  8442. #ifdef WOLFSSL_DTLS
  8443. if (ssl->options.dtls)
  8444. rl->pvMinor = DTLSv1_2_MINOR;
  8445. #endif /* WOLFSSL_DTLS */
  8446. }
  8447. else
  8448. #endif
  8449. rl->pvMinor = ssl->version.minor;
  8450. #ifdef WOLFSSL_ALTERNATIVE_DOWNGRADE
  8451. if (ssl->options.side == WOLFSSL_CLIENT_END
  8452. && ssl->options.connectState == CONNECT_BEGIN
  8453. && !ssl->options.resuming) {
  8454. rl->pvMinor = ssl->options.downgrade ? ssl->options.minDowngrade
  8455. : ssl->version.minor;
  8456. }
  8457. #endif
  8458. if (!ssl->options.dtls) {
  8459. c16toa((word16)length, rl->length);
  8460. }
  8461. else {
  8462. #ifdef WOLFSSL_DTLS
  8463. DtlsRecordLayerHeader* dtls;
  8464. /* dtls record layer header extensions */
  8465. dtls = (DtlsRecordLayerHeader*)output;
  8466. WriteSEQ(ssl, epochOrder, dtls->sequence_number);
  8467. c16toa((word16)length, dtls->length);
  8468. #endif
  8469. }
  8470. }
  8471. #if !defined(WOLFSSL_NO_TLS12) || (defined(HAVE_SESSION_TICKET) && \
  8472. !defined(NO_WOLFSSL_SERVER))
  8473. /* add handshake header for message */
  8474. static void AddHandShakeHeader(byte* output, word32 length,
  8475. word32 fragOffset, word32 fragLength,
  8476. byte type, WOLFSSL* ssl)
  8477. {
  8478. HandShakeHeader* hs;
  8479. (void)fragOffset;
  8480. (void)fragLength;
  8481. (void)ssl;
  8482. /* handshake header */
  8483. hs = (HandShakeHeader*)output;
  8484. if (hs == NULL)
  8485. return;
  8486. hs->type = type;
  8487. c32to24(length, hs->length); /* type and length same for each */
  8488. #ifdef WOLFSSL_DTLS
  8489. if (ssl->options.dtls) {
  8490. DtlsHandShakeHeader* dtls;
  8491. /* dtls handshake header extensions */
  8492. dtls = (DtlsHandShakeHeader*)output;
  8493. c16toa(ssl->keys.dtls_handshake_number++, dtls->message_seq);
  8494. c32to24(fragOffset, dtls->fragment_offset);
  8495. c32to24(fragLength, dtls->fragment_length);
  8496. }
  8497. #endif
  8498. }
  8499. /* add both headers for handshake message */
  8500. static void AddHeaders(byte* output, word32 length, byte type, WOLFSSL* ssl)
  8501. {
  8502. word32 lengthAdj = HANDSHAKE_HEADER_SZ;
  8503. word32 outputAdj = RECORD_HEADER_SZ;
  8504. #ifdef WOLFSSL_DTLS
  8505. if (ssl->options.dtls) {
  8506. lengthAdj += DTLS_HANDSHAKE_EXTRA;
  8507. outputAdj += DTLS_RECORD_EXTRA;
  8508. }
  8509. #endif
  8510. AddRecordHeader(output, length + lengthAdj, handshake, ssl, CUR_ORDER);
  8511. AddHandShakeHeader(output + outputAdj, length, 0, length, type, ssl);
  8512. }
  8513. #endif /* !WOLFSSL_NO_TLS12 || (HAVE_SESSION_TICKET && !NO_WOLFSSL_SERVER) */
  8514. #ifndef WOLFSSL_NO_TLS12
  8515. #if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_SERVER) || \
  8516. !defined(WOLFSSL_NO_CLIENT_AUTH)) || \
  8517. defined(WOLFSSL_DTLS)
  8518. static void AddFragHeaders(byte* output, word32 fragSz, word32 fragOffset,
  8519. word32 length, byte type, WOLFSSL* ssl)
  8520. {
  8521. word32 lengthAdj = HANDSHAKE_HEADER_SZ;
  8522. word32 outputAdj = RECORD_HEADER_SZ;
  8523. (void)fragSz;
  8524. #ifdef WOLFSSL_DTLS
  8525. if (ssl->options.dtls) {
  8526. lengthAdj += DTLS_HANDSHAKE_EXTRA;
  8527. outputAdj += DTLS_RECORD_EXTRA;
  8528. }
  8529. #endif
  8530. AddRecordHeader(output, fragSz + lengthAdj, handshake, ssl, CUR_ORDER);
  8531. AddHandShakeHeader(output + outputAdj, length, fragOffset, fragSz, type, ssl);
  8532. }
  8533. #endif /* NO_CERTS */
  8534. #if !defined(NO_WOLFSSL_SERVER) || \
  8535. (!defined(NO_WOLFSSL_CLIENT) && !defined(NO_CERTS) && \
  8536. !defined(WOLFSSL_NO_CLIENT_AUTH))
  8537. /**
  8538. * Send the handshake message. This function handles fragmenting the message
  8539. * so that it will fit into the desired MTU or the max fragment size.
  8540. * @param ssl Connection object
  8541. * @param input Input starting at the record layer header. This function
  8542. * assumes that the appropriate record and handshake headers
  8543. * are present. These headers must assume no fragmentation.
  8544. * That is handled here.
  8545. * @param inputSz Length of message excluding headers (this is the total
  8546. * length of all fragments)
  8547. * @param type Type of message being sent
  8548. * @return 0 on success and negative otherwise
  8549. */
  8550. static int SendHandshakeMsg(WOLFSSL* ssl, byte* input, word32 inputSz,
  8551. enum HandShakeType type, const char* packetName)
  8552. {
  8553. int maxFrag;
  8554. int ret = 0;
  8555. int headerSz;
  8556. WOLFSSL_ENTER("SendHandshakeMsg");
  8557. (void)type;
  8558. (void)packetName;
  8559. if (ssl == NULL || input == NULL)
  8560. return BAD_FUNC_ARG;
  8561. #ifdef WOLFSSL_DTLS
  8562. if (ssl->options.dtls)
  8563. headerSz = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
  8564. else
  8565. #endif
  8566. {
  8567. /* In TLS we send one handshake header in total, not one
  8568. * per fragment like in DTLS. The handshake header should
  8569. * already be in the input buffer. */
  8570. inputSz += HANDSHAKE_HEADER_SZ;
  8571. headerSz = RECORD_HEADER_SZ;
  8572. }
  8573. maxFrag = wolfSSL_GetMaxFragSize(ssl, (int)inputSz);
  8574. /* Make sure input is not the ssl output buffer as this
  8575. * function doesn't handle that */
  8576. if (input >= ssl->buffers.outputBuffer.buffer &&
  8577. input < ssl->buffers.outputBuffer.buffer +
  8578. ssl->buffers.outputBuffer.bufferSize) {
  8579. WOLFSSL_MSG("Can't use output buffer for input in SendHandshakeMsg");
  8580. return BAD_FUNC_ARG;
  8581. }
  8582. if (!ssl->options.buildingMsg) {
  8583. /* Hash it before the loop as we modify the input with
  8584. * encryption on */
  8585. ret = HashOutput(ssl, input, headerSz + (int)inputSz, 0);
  8586. if (ret != 0)
  8587. return ret;
  8588. #ifdef WOLFSSL_DTLS
  8589. /* Decrement msg number so that we continue to use the
  8590. * same msg number for this msg */
  8591. if (ssl->options.dtls)
  8592. ssl->keys.dtls_handshake_number--;
  8593. #endif
  8594. }
  8595. while (ssl->fragOffset < inputSz) {
  8596. byte* output;
  8597. int outputSz;
  8598. byte* data = input + ssl->fragOffset + headerSz;
  8599. word32 fragSz = (word32)maxFrag;
  8600. ssl->options.buildingMsg = 1;
  8601. if (inputSz - ssl->fragOffset < fragSz)
  8602. fragSz = inputSz - ssl->fragOffset;
  8603. /* check for available size */
  8604. outputSz = headerSz + fragSz;
  8605. if (IsEncryptionOn(ssl, 1))
  8606. outputSz += cipherExtraData(ssl);
  8607. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  8608. return ret;
  8609. if (ssl->buffers.outputBuffer.buffer == NULL)
  8610. return MEMORY_E;
  8611. output = ssl->buffers.outputBuffer.buffer +
  8612. ssl->buffers.outputBuffer.length;
  8613. if (IsEncryptionOn(ssl, 1)) {
  8614. /* First we need to add the fragment header ourselves.
  8615. * We do this in the input to minimize allocations */
  8616. int dataSz = (int)fragSz;
  8617. #ifdef WOLFSSL_DTLS
  8618. if (ssl->options.dtls) {
  8619. data -= DTLS_HANDSHAKE_HEADER_SZ;
  8620. dataSz += DTLS_HANDSHAKE_HEADER_SZ;
  8621. AddHandShakeHeader(data, inputSz, ssl->fragOffset, fragSz,
  8622. type, ssl);
  8623. ssl->keys.dtls_handshake_number--;
  8624. }
  8625. if (IsDtlsNotSctpMode(ssl) &&
  8626. (ret = DtlsMsgPoolSave(ssl, data,
  8627. fragSz + DTLS_HANDSHAKE_HEADER_SZ, type))
  8628. != 0)
  8629. return ret;
  8630. #endif
  8631. ret = BuildMessage(ssl, output, outputSz,
  8632. data, dataSz, handshake, 0, 0, 0, CUR_ORDER);
  8633. if (ret >= 0)
  8634. outputSz = ret;
  8635. else
  8636. return ret;
  8637. ret = 0;
  8638. }
  8639. else {
  8640. #ifdef WOLFSSL_DTLS
  8641. if (ssl->options.dtls)
  8642. AddFragHeaders(output, fragSz, ssl->fragOffset,
  8643. inputSz, type, ssl);
  8644. else
  8645. #endif
  8646. AddRecordHeader(output, fragSz, handshake, ssl, CUR_ORDER);
  8647. XMEMCPY(output + headerSz, data, fragSz);
  8648. #ifdef WOLFSSL_DTLS
  8649. if (ssl->options.dtls) {
  8650. ssl->keys.dtls_handshake_number--;
  8651. DtlsSEQIncrement(ssl, CUR_ORDER);
  8652. }
  8653. if (IsDtlsNotSctpMode(ssl)) {
  8654. if ((ret = DtlsMsgPoolSave(ssl, output, headerSz + fragSz,
  8655. type)) != 0) {
  8656. return ret;
  8657. }
  8658. }
  8659. #endif
  8660. }
  8661. ssl->buffers.outputBuffer.length += outputSz;
  8662. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  8663. if (ssl->hsInfoOn) {
  8664. AddPacketName(ssl, packetName);
  8665. }
  8666. if (ssl->toInfoOn) {
  8667. ret = AddPacketInfo(ssl, packetName, handshake,
  8668. output, outputSz, WRITE_PROTO, 0, ssl->heap);
  8669. if (ret != 0)
  8670. return ret;
  8671. }
  8672. #endif
  8673. ssl->fragOffset += fragSz;
  8674. if (!ssl->options.groupMessages)
  8675. ret = SendBuffered(ssl);
  8676. if (ret != 0)
  8677. return ret;
  8678. }
  8679. #ifdef WOLFSSL_DTLS
  8680. /* Increment msg number once we sent all fragments */
  8681. if (ssl->options.dtls)
  8682. ssl->keys.dtls_handshake_number++;
  8683. #endif
  8684. ssl->fragOffset = 0;
  8685. ssl->options.buildingMsg = 0;
  8686. return ret;
  8687. }
  8688. #endif /* !NO_WOLFSSL_SERVER || (!NO_WOLFSSL_CLIENT && !NO_CERTS &&
  8689. * !WOLFSSL_NO_CLIENT_AUTH) */
  8690. #endif /* !WOLFSSL_NO_TLS12 */
  8691. /* return bytes received, -1 on error */
  8692. static int wolfSSLReceive(WOLFSSL* ssl, byte* buf, word32 sz)
  8693. {
  8694. int recvd;
  8695. int retryLimit = WOLFSSL_MODE_AUTO_RETRY_ATTEMPTS;
  8696. #ifdef WOLFSSL_QUIC
  8697. if (WOLFSSL_IS_QUIC(ssl)) {
  8698. /* QUIC only "reads" from data provided by the application
  8699. * via wolfSSL_provide_quic_data(). Transfer from there
  8700. * into the inputBuffer. */
  8701. return wolfSSL_quic_receive(ssl, buf, sz);
  8702. }
  8703. #endif
  8704. if (ssl->CBIORecv == NULL) {
  8705. WOLFSSL_MSG("Your IO Recv callback is null, please set");
  8706. return -1;
  8707. }
  8708. retry:
  8709. recvd = ssl->CBIORecv(ssl, (char *)buf, (int)sz, ssl->IOCB_ReadCtx);
  8710. if (recvd < 0) {
  8711. switch (recvd) {
  8712. case WOLFSSL_CBIO_ERR_GENERAL: /* general/unknown error */
  8713. #ifdef WOLFSSL_APACHE_HTTPD
  8714. #ifndef NO_BIO
  8715. if (ssl->biord) {
  8716. /* If retry and read flags are set, return WANT_READ */
  8717. if ((ssl->biord->flags & WOLFSSL_BIO_FLAG_READ) &&
  8718. (ssl->biord->flags & WOLFSSL_BIO_FLAG_RETRY)) {
  8719. return WANT_READ;
  8720. }
  8721. }
  8722. #endif
  8723. #endif
  8724. return -1;
  8725. case WOLFSSL_CBIO_ERR_WANT_READ: /* want read, would block */
  8726. if (retryLimit > 0 && ssl->ctx->autoRetry &&
  8727. !ssl->options.handShakeDone && !ssl->options.dtls) {
  8728. retryLimit--;
  8729. goto retry;
  8730. }
  8731. return WANT_READ;
  8732. case WOLFSSL_CBIO_ERR_CONN_RST: /* connection reset */
  8733. #ifdef USE_WINDOWS_API
  8734. if (ssl->options.dtls) {
  8735. goto retry;
  8736. }
  8737. #endif
  8738. ssl->options.connReset = 1;
  8739. return -1;
  8740. case WOLFSSL_CBIO_ERR_ISR: /* interrupt */
  8741. /* see if we got our timeout */
  8742. #ifdef WOLFSSL_CALLBACKS
  8743. if (ssl->toInfoOn) {
  8744. struct itimerval timeout;
  8745. getitimer(ITIMER_REAL, &timeout);
  8746. if (timeout.it_value.tv_sec == 0 &&
  8747. timeout.it_value.tv_usec == 0) {
  8748. XSTRNCPY(ssl->timeoutInfo.timeoutName,
  8749. "recv() timeout", MAX_TIMEOUT_NAME_SZ);
  8750. ssl->timeoutInfo.timeoutName[
  8751. MAX_TIMEOUT_NAME_SZ] = '\0';
  8752. WOLFSSL_MSG("Got our timeout");
  8753. return WANT_READ;
  8754. }
  8755. }
  8756. #endif
  8757. goto retry;
  8758. case WOLFSSL_CBIO_ERR_CONN_CLOSE: /* peer closed connection */
  8759. ssl->options.isClosed = 1;
  8760. return -1;
  8761. case WOLFSSL_CBIO_ERR_TIMEOUT:
  8762. #ifdef WOLFSSL_DTLS
  8763. #ifdef WOLFSSL_DTLS13
  8764. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  8765. /* TODO: support WANT_WRITE here */
  8766. if (Dtls13RtxTimeout(ssl) < 0) {
  8767. WOLFSSL_MSG(
  8768. "Error trying to retransmit DTLS buffered message");
  8769. return -1;
  8770. }
  8771. goto retry;
  8772. }
  8773. #endif /* WOLFSSL_DTLS13 */
  8774. if (IsDtlsNotSctpMode(ssl) &&
  8775. ssl->options.handShakeState != HANDSHAKE_DONE &&
  8776. DtlsMsgPoolTimeout(ssl) == 0 &&
  8777. DtlsMsgPoolSend(ssl, 0) == 0) {
  8778. /* retry read for DTLS during handshake only */
  8779. goto retry;
  8780. }
  8781. #endif
  8782. return -1;
  8783. default:
  8784. WOLFSSL_MSG("Unexpected recv return code");
  8785. return recvd;
  8786. }
  8787. }
  8788. return recvd;
  8789. }
  8790. /* Switch dynamic output buffer back to static, buffer is assumed clear */
  8791. void ShrinkOutputBuffer(WOLFSSL* ssl)
  8792. {
  8793. WOLFSSL_MSG("Shrinking output buffer");
  8794. XFREE(ssl->buffers.outputBuffer.buffer - ssl->buffers.outputBuffer.offset,
  8795. ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  8796. ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
  8797. ssl->buffers.outputBuffer.bufferSize = STATIC_BUFFER_LEN;
  8798. ssl->buffers.outputBuffer.dynamicFlag = 0;
  8799. ssl->buffers.outputBuffer.offset = 0;
  8800. }
  8801. /* Switch dynamic input buffer back to static, keep any remaining input */
  8802. /* forced free means cleaning up */
  8803. /* Be *CAREFUL* where this function is called. ProcessReply relies on
  8804. * inputBuffer.idx *NOT* changing inside the ProcessReply function. ProcessReply
  8805. * calls ShrinkInputBuffer itself when it is safe to do so. Don't overuse it. */
  8806. void ShrinkInputBuffer(WOLFSSL* ssl, int forcedFree)
  8807. {
  8808. int usedLength = ssl->buffers.inputBuffer.length -
  8809. ssl->buffers.inputBuffer.idx;
  8810. if (!forcedFree && (usedLength > STATIC_BUFFER_LEN ||
  8811. ssl->buffers.clearOutputBuffer.length > 0))
  8812. return;
  8813. WOLFSSL_MSG("Shrinking input buffer");
  8814. if (!forcedFree && usedLength > 0) {
  8815. XMEMCPY(ssl->buffers.inputBuffer.staticBuffer,
  8816. ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
  8817. usedLength);
  8818. }
  8819. ForceZero(ssl->buffers.inputBuffer.buffer,
  8820. ssl->buffers.inputBuffer.length);
  8821. XFREE(ssl->buffers.inputBuffer.buffer - ssl->buffers.inputBuffer.offset,
  8822. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  8823. ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
  8824. ssl->buffers.inputBuffer.bufferSize = STATIC_BUFFER_LEN;
  8825. ssl->buffers.inputBuffer.dynamicFlag = 0;
  8826. ssl->buffers.inputBuffer.offset = 0;
  8827. ssl->buffers.inputBuffer.idx = 0;
  8828. ssl->buffers.inputBuffer.length = usedLength;
  8829. }
  8830. int SendBuffered(WOLFSSL* ssl)
  8831. {
  8832. if (ssl->CBIOSend == NULL && !WOLFSSL_IS_QUIC(ssl)) {
  8833. WOLFSSL_MSG("Your IO Send callback is null, please set");
  8834. return SOCKET_ERROR_E;
  8835. }
  8836. #ifdef WOLFSSL_DEBUG_TLS
  8837. if (ssl->buffers.outputBuffer.idx == 0) {
  8838. WOLFSSL_MSG("Data to send");
  8839. WOLFSSL_BUFFER(ssl->buffers.outputBuffer.buffer,
  8840. ssl->buffers.outputBuffer.length);
  8841. }
  8842. #endif
  8843. #ifdef WOLFSSL_QUIC
  8844. if (WOLFSSL_IS_QUIC(ssl)) {
  8845. return wolfSSL_quic_send(ssl);
  8846. }
  8847. #endif
  8848. while (ssl->buffers.outputBuffer.length > 0) {
  8849. int sent = ssl->CBIOSend(ssl,
  8850. (char*)ssl->buffers.outputBuffer.buffer +
  8851. ssl->buffers.outputBuffer.idx,
  8852. (int)ssl->buffers.outputBuffer.length,
  8853. ssl->IOCB_WriteCtx);
  8854. if (sent < 0) {
  8855. switch (sent) {
  8856. case WOLFSSL_CBIO_ERR_WANT_WRITE: /* would block */
  8857. return WANT_WRITE;
  8858. case WOLFSSL_CBIO_ERR_CONN_RST: /* connection reset */
  8859. ssl->options.connReset = 1;
  8860. break;
  8861. case WOLFSSL_CBIO_ERR_ISR: /* interrupt */
  8862. /* see if we got our timeout */
  8863. #ifdef WOLFSSL_CALLBACKS
  8864. if (ssl->toInfoOn) {
  8865. struct itimerval timeout;
  8866. getitimer(ITIMER_REAL, &timeout);
  8867. if (timeout.it_value.tv_sec == 0 &&
  8868. timeout.it_value.tv_usec == 0) {
  8869. XSTRNCPY(ssl->timeoutInfo.timeoutName,
  8870. "send() timeout", MAX_TIMEOUT_NAME_SZ);
  8871. ssl->timeoutInfo.timeoutName[
  8872. MAX_TIMEOUT_NAME_SZ] = '\0';
  8873. WOLFSSL_MSG("Got our timeout");
  8874. return WANT_WRITE;
  8875. }
  8876. }
  8877. #endif
  8878. continue;
  8879. case WOLFSSL_CBIO_ERR_CONN_CLOSE: /* epipe / conn closed */
  8880. ssl->options.connReset = 1; /* treat same as reset */
  8881. break;
  8882. default:
  8883. return SOCKET_ERROR_E;
  8884. }
  8885. return SOCKET_ERROR_E;
  8886. }
  8887. if (sent > (int)ssl->buffers.outputBuffer.length) {
  8888. WOLFSSL_MSG("SendBuffered() out of bounds read");
  8889. return SEND_OOB_READ_E;
  8890. }
  8891. ssl->buffers.outputBuffer.idx += sent;
  8892. ssl->buffers.outputBuffer.length -= sent;
  8893. }
  8894. ssl->buffers.outputBuffer.idx = 0;
  8895. if (ssl->buffers.outputBuffer.dynamicFlag)
  8896. ShrinkOutputBuffer(ssl);
  8897. return 0;
  8898. }
  8899. /* Grow the output buffer */
  8900. static WC_INLINE int GrowOutputBuffer(WOLFSSL* ssl, int size)
  8901. {
  8902. byte* tmp;
  8903. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  8904. byte hdrSz = ssl->options.dtls ? DTLS_RECORD_HEADER_SZ :
  8905. RECORD_HEADER_SZ;
  8906. byte align = WOLFSSL_GENERAL_ALIGNMENT;
  8907. #else
  8908. const byte align = WOLFSSL_GENERAL_ALIGNMENT;
  8909. #endif
  8910. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  8911. /* the encrypted data will be offset from the front of the buffer by
  8912. the header, if the user wants encrypted alignment they need
  8913. to define their alignment requirement */
  8914. while (align < hdrSz)
  8915. align *= 2;
  8916. #endif
  8917. tmp = (byte*)XMALLOC(size + ssl->buffers.outputBuffer.length + align,
  8918. ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  8919. WOLFSSL_MSG("growing output buffer");
  8920. if (tmp == NULL)
  8921. return MEMORY_E;
  8922. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  8923. if (align)
  8924. tmp += align - hdrSz;
  8925. #endif
  8926. #ifdef WOLFSSL_STATIC_MEMORY
  8927. /* can be from IO memory pool which does not need copy if same buffer */
  8928. if (ssl->buffers.outputBuffer.length &&
  8929. tmp == ssl->buffers.outputBuffer.buffer) {
  8930. ssl->buffers.outputBuffer.bufferSize =
  8931. size + ssl->buffers.outputBuffer.length;
  8932. return 0;
  8933. }
  8934. #endif
  8935. if (ssl->buffers.outputBuffer.length)
  8936. XMEMCPY(tmp, ssl->buffers.outputBuffer.buffer,
  8937. ssl->buffers.outputBuffer.length);
  8938. if (ssl->buffers.outputBuffer.dynamicFlag) {
  8939. XFREE(ssl->buffers.outputBuffer.buffer -
  8940. ssl->buffers.outputBuffer.offset, ssl->heap,
  8941. DYNAMIC_TYPE_OUT_BUFFER);
  8942. }
  8943. ssl->buffers.outputBuffer.dynamicFlag = 1;
  8944. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  8945. if (align)
  8946. ssl->buffers.outputBuffer.offset = align - hdrSz;
  8947. else
  8948. #endif
  8949. ssl->buffers.outputBuffer.offset = 0;
  8950. ssl->buffers.outputBuffer.buffer = tmp;
  8951. ssl->buffers.outputBuffer.bufferSize = size +
  8952. ssl->buffers.outputBuffer.length;
  8953. return 0;
  8954. }
  8955. /* Grow the input buffer, should only be to read cert or big app data */
  8956. int GrowInputBuffer(WOLFSSL* ssl, int size, int usedLength)
  8957. {
  8958. byte* tmp;
  8959. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  8960. byte align = ssl->options.dtls ? WOLFSSL_GENERAL_ALIGNMENT : 0;
  8961. byte hdrSz = DTLS_RECORD_HEADER_SZ;
  8962. #else
  8963. const byte align = WOLFSSL_GENERAL_ALIGNMENT;
  8964. #endif
  8965. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  8966. /* the encrypted data will be offset from the front of the buffer by
  8967. the dtls record header, if the user wants encrypted alignment they need
  8968. to define their alignment requirement. in tls we read record header
  8969. to get size of record and put actual data back at front, so don't need */
  8970. if (align) {
  8971. while (align < hdrSz)
  8972. align *= 2;
  8973. }
  8974. #endif
  8975. if (usedLength < 0 || size < 0) {
  8976. WOLFSSL_MSG("GrowInputBuffer() called with negative number");
  8977. return BAD_FUNC_ARG;
  8978. }
  8979. tmp = (byte*)XMALLOC(size + usedLength + align,
  8980. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  8981. WOLFSSL_MSG("growing input buffer");
  8982. if (tmp == NULL)
  8983. return MEMORY_E;
  8984. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  8985. if (align)
  8986. tmp += align - hdrSz;
  8987. #endif
  8988. #ifdef WOLFSSL_STATIC_MEMORY
  8989. /* can be from IO memory pool which does not need copy if same buffer */
  8990. if (usedLength && tmp == ssl->buffers.inputBuffer.buffer) {
  8991. ssl->buffers.inputBuffer.bufferSize = size + usedLength;
  8992. ssl->buffers.inputBuffer.idx = 0;
  8993. ssl->buffers.inputBuffer.length = usedLength;
  8994. return 0;
  8995. }
  8996. #endif
  8997. if (usedLength)
  8998. XMEMCPY(tmp, ssl->buffers.inputBuffer.buffer +
  8999. ssl->buffers.inputBuffer.idx, usedLength);
  9000. if (ssl->buffers.inputBuffer.dynamicFlag) {
  9001. if (IsEncryptionOn(ssl, 1)) {
  9002. ForceZero(ssl->buffers.inputBuffer.buffer,
  9003. ssl->buffers.inputBuffer.length);
  9004. }
  9005. XFREE(ssl->buffers.inputBuffer.buffer - ssl->buffers.inputBuffer.offset,
  9006. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  9007. }
  9008. ssl->buffers.inputBuffer.dynamicFlag = 1;
  9009. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  9010. if (align)
  9011. ssl->buffers.inputBuffer.offset = align - hdrSz;
  9012. else
  9013. #endif
  9014. ssl->buffers.inputBuffer.offset = 0;
  9015. ssl->buffers.inputBuffer.buffer = tmp;
  9016. ssl->buffers.inputBuffer.bufferSize = size + usedLength;
  9017. ssl->buffers.inputBuffer.idx = 0;
  9018. ssl->buffers.inputBuffer.length = usedLength;
  9019. return 0;
  9020. }
  9021. /* Check available size into output buffer, make room if needed.
  9022. * This function needs to be called before anything gets put
  9023. * into the output buffers since it flushes pending data if it
  9024. * predicts that the msg will exceed MTU. */
  9025. int CheckAvailableSize(WOLFSSL *ssl, int size)
  9026. {
  9027. if (size < 0) {
  9028. WOLFSSL_MSG("CheckAvailableSize() called with negative number");
  9029. return BAD_FUNC_ARG;
  9030. }
  9031. #ifdef WOLFSSL_DTLS
  9032. if (ssl->options.dtls) {
  9033. if (size + ssl->buffers.outputBuffer.length -
  9034. ssl->buffers.outputBuffer.idx >
  9035. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  9036. ssl->dtlsMtuSz
  9037. #else
  9038. ssl->dtls_expected_rx
  9039. #endif
  9040. ) {
  9041. int ret;
  9042. WOLFSSL_MSG("CheckAvailableSize() flushing buffer "
  9043. "to make room for new message");
  9044. if ((ret = SendBuffered(ssl)) != 0) {
  9045. return ret;
  9046. }
  9047. }
  9048. if (size > (int)
  9049. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  9050. ssl->dtlsMtuSz
  9051. #else
  9052. ssl->dtls_expected_rx
  9053. #endif
  9054. #ifdef WOLFSSL_DTLS13
  9055. /* DTLS1.3 uses the output buffer to store the full message and deal
  9056. with fragmentation later in dtls13HandshakeSend() */
  9057. && !IsAtLeastTLSv1_3(ssl->version)
  9058. #endif /* WOLFSSL_DTLS13 */
  9059. ) {
  9060. WOLFSSL_MSG("CheckAvailableSize() called with size greater than MTU.");
  9061. return DTLS_SIZE_ERROR;
  9062. }
  9063. }
  9064. #endif
  9065. if (ssl->buffers.outputBuffer.bufferSize - ssl->buffers.outputBuffer.length
  9066. < (word32)size) {
  9067. if (GrowOutputBuffer(ssl, size) < 0)
  9068. return MEMORY_E;
  9069. }
  9070. return 0;
  9071. }
  9072. #ifdef WOLFSSL_DTLS13
  9073. static int GetInputData(WOLFSSL *ssl, word32 size);
  9074. static int GetDtls13RecordHeader(WOLFSSL* ssl, word32* inOutIdx,
  9075. RecordLayerHeader* rh, word16* size)
  9076. {
  9077. Dtls13UnifiedHdrInfo hdrInfo;
  9078. w64wrapper epochNumber;
  9079. byte epochBits;
  9080. int readSize;
  9081. int ret;
  9082. readSize = ssl->buffers.inputBuffer.length - *inOutIdx;
  9083. if (readSize < DTLS_UNIFIED_HEADER_MIN_SZ)
  9084. return BUFFER_ERROR;
  9085. epochBits = *(ssl->buffers.inputBuffer.buffer + *inOutIdx) & EE_MASK;
  9086. ret = Dtls13ReconstructEpochNumber(ssl, epochBits, &epochNumber);
  9087. if (ret != 0)
  9088. return ret;
  9089. #ifdef WOLFSSL_DEBUG_TLS
  9090. WOLFSSL_MSG_EX("reconstructed epoch number: %ld",
  9091. epochNumber);
  9092. #endif /* WOLFSSL_DEBUG_TLS */
  9093. /* protected records always use unified_headers in DTLSv1.3 */
  9094. if (w64IsZero(epochNumber))
  9095. return SEQUENCE_ERROR;
  9096. if (ssl->dtls13DecryptEpoch == NULL)
  9097. return BAD_STATE_E;
  9098. #ifdef WOLFSSL_EARLY_DATA
  9099. if (w64Equal(epochNumber, w64From32(0x0, DTLS13_EPOCH_EARLYDATA)) &&
  9100. ssl->options.handShakeDone) {
  9101. WOLFSSL_MSG("discarding early data after handshake");
  9102. return SEQUENCE_ERROR;
  9103. }
  9104. #endif /* WOLFSSL_DTLS13 */
  9105. if (!w64Equal(ssl->dtls13DecryptEpoch->epochNumber, epochNumber)) {
  9106. ret = Dtls13SetEpochKeys(ssl, epochNumber, DECRYPT_SIDE_ONLY);
  9107. if (ret != 0)
  9108. return SEQUENCE_ERROR;
  9109. }
  9110. ret = Dtls13GetUnifiedHeaderSize(ssl,
  9111. *(ssl->buffers.inputBuffer.buffer+*inOutIdx), &ssl->dtls13CurRlLength);
  9112. if (ret != 0)
  9113. return ret;
  9114. if (readSize < ssl->dtls13CurRlLength + DTLS13_RN_MASK_SIZE) {
  9115. /* when using DTLS over a medium that does not guarantee that a full
  9116. * message is received in a single read, we may end up without the full
  9117. * header and minimum ciphertext to decrypt record sequence numbers */
  9118. ret = GetInputData(ssl, ssl->dtls13CurRlLength + DTLS13_RN_MASK_SIZE);
  9119. if (ret != 0)
  9120. return ret;
  9121. readSize = ssl->buffers.inputBuffer.length - *inOutIdx;
  9122. }
  9123. ret = Dtls13ParseUnifiedRecordLayer(ssl,
  9124. ssl->buffers.inputBuffer.buffer + *inOutIdx, (word16)readSize,
  9125. &hdrInfo);
  9126. if (ret != 0)
  9127. return ret;
  9128. *size = hdrInfo.recordLength;
  9129. c16toa(*size, rh->length);
  9130. /* type is implicit */
  9131. rh->type = application_data;
  9132. /* version is implicit */
  9133. rh->pvMajor = ssl->version.major;
  9134. rh->pvMinor = DTLSv1_2_MINOR;
  9135. ssl->keys.curEpoch64 = epochNumber;
  9136. ret = Dtls13ReconstructSeqNumber(ssl, &hdrInfo, &ssl->keys.curSeq);
  9137. if (ret != 0)
  9138. return ret;
  9139. #ifdef WOLFSSL_DEBUG_TLS
  9140. WOLFSSL_MSG_EX("reconstructed seq number: %ld",
  9141. ssl->keys.curSeq);
  9142. #endif /* WOLFSSL_DEBUG_TLS */
  9143. XMEMCPY(ssl->dtls13CurRL, ssl->buffers.inputBuffer.buffer + *inOutIdx,
  9144. ssl->dtls13CurRlLength);
  9145. *inOutIdx += ssl->dtls13CurRlLength;
  9146. return 0;
  9147. }
  9148. #endif /* WOLFSSL_DTLS13 */
  9149. #ifdef WOLFSSL_DTLS
  9150. static int GetDtlsRecordHeader(WOLFSSL* ssl, word32* inOutIdx,
  9151. RecordLayerHeader* rh, word16* size)
  9152. {
  9153. #ifdef HAVE_FUZZER
  9154. if (ssl->fuzzerCb)
  9155. ssl->fuzzerCb(ssl, ssl->buffers.inputBuffer.buffer + *inOutIdx,
  9156. DTLS_RECORD_HEADER_SZ, FUZZ_HEAD, ssl->fuzzerCtx);
  9157. #endif
  9158. #ifdef WOLFSSL_DTLS13
  9159. int ret;
  9160. if (Dtls13IsUnifiedHeader(*(ssl->buffers.inputBuffer.buffer + *inOutIdx))) {
  9161. /* version 1.3 already negotiated */
  9162. if (ssl->options.tls1_3) {
  9163. ret = GetDtls13RecordHeader(ssl, inOutIdx, rh, size);
  9164. if (ret == 0 || ret != SEQUENCE_ERROR || ret != DTLS_CID_ERROR)
  9165. return ret;
  9166. }
  9167. #ifndef NO_WOLFSSL_CLIENT
  9168. if (ssl->options.side == WOLFSSL_CLIENT_END
  9169. && ssl->options.serverState < SERVER_HELLO_COMPLETE
  9170. && IsAtLeastTLSv1_3(ssl->version)
  9171. && !ssl->options.handShakeDone) {
  9172. /* we may have lost ServerHello. Try to send a empty ACK to shortcut
  9173. Server retransmission timer */
  9174. ssl->dtls13Rtx.sendAcks = 1;
  9175. }
  9176. #endif
  9177. return SEQUENCE_ERROR;
  9178. }
  9179. /* not a unified header, check that we have at least
  9180. * DTLS_RECORD_HEADER_SZ */
  9181. if (ssl->buffers.inputBuffer.length - *inOutIdx < DTLS_RECORD_HEADER_SZ) {
  9182. ret = GetInputData(ssl, DTLS_RECORD_HEADER_SZ);
  9183. if (ret != 0)
  9184. return LENGTH_ERROR;
  9185. }
  9186. #endif /* WOLFSSL_DTLS13 */
  9187. /* type and version in same spot */
  9188. XMEMCPY(rh, ssl->buffers.inputBuffer.buffer + *inOutIdx,
  9189. ENUM_LEN + VERSION_SZ);
  9190. *inOutIdx += ENUM_LEN + VERSION_SZ;
  9191. ato16(ssl->buffers.inputBuffer.buffer + *inOutIdx, &ssl->keys.curEpoch);
  9192. #ifdef WOLFSSL_DTLS13
  9193. /* only non protected message can use the DTLSPlaintext record header */
  9194. if (IsAtLeastTLSv1_3(ssl->version)) {
  9195. if (ssl->keys.curEpoch != 0)
  9196. return SEQUENCE_ERROR;
  9197. w64Zero(&ssl->keys.curEpoch64);
  9198. if (!w64IsZero(ssl->dtls13DecryptEpoch->epochNumber))
  9199. Dtls13SetEpochKeys(ssl, ssl->keys.curEpoch64, DECRYPT_SIDE_ONLY);
  9200. }
  9201. #endif /* WOLFSSL_DTLS13 */
  9202. *inOutIdx += OPAQUE16_LEN;
  9203. if (ssl->options.haveMcast) {
  9204. #ifdef WOLFSSL_MULTICAST
  9205. ssl->keys.curPeerId = ssl->buffers.inputBuffer.buffer[*inOutIdx];
  9206. ssl->keys.curSeq_hi = ssl->buffers.inputBuffer.buffer[*inOutIdx+1];
  9207. #endif
  9208. }
  9209. else
  9210. ato16(ssl->buffers.inputBuffer.buffer + *inOutIdx, &ssl->keys.curSeq_hi);
  9211. *inOutIdx += OPAQUE16_LEN;
  9212. ato32(ssl->buffers.inputBuffer.buffer + *inOutIdx, &ssl->keys.curSeq_lo);
  9213. *inOutIdx += OPAQUE32_LEN; /* advance past rest of seq */
  9214. #ifdef WOLFSSL_DTLS13
  9215. /* DTLSv1.3 PlainText records use DTLSv1.2 sequence number encoding. Update
  9216. the DTLv1.3 word64 version as well */
  9217. ssl->keys.curSeq = w64From32(ssl->keys.curSeq_hi, ssl->keys.curSeq_lo);
  9218. #endif /* WOLFSSL_DTLS13 */
  9219. ato16(ssl->buffers.inputBuffer.buffer + *inOutIdx, size);
  9220. *inOutIdx += LENGTH_SZ;
  9221. return 0;
  9222. }
  9223. #endif /* WOLFSSL_DTLS */
  9224. /* do all verify and sanity checks on record header */
  9225. static int GetRecordHeader(WOLFSSL* ssl, word32* inOutIdx,
  9226. RecordLayerHeader* rh, word16 *size)
  9227. {
  9228. byte tls12minor = 0;
  9229. #ifdef OPENSSL_ALL
  9230. word32 start = *inOutIdx;
  9231. #endif
  9232. (void)tls12minor;
  9233. if (!ssl->options.dtls) {
  9234. #ifdef HAVE_FUZZER
  9235. if (ssl->fuzzerCb)
  9236. ssl->fuzzerCb(ssl, ssl->buffers.inputBuffer.buffer + *inOutIdx,
  9237. RECORD_HEADER_SZ, FUZZ_HEAD, ssl->fuzzerCtx);
  9238. #endif
  9239. XMEMCPY(rh, ssl->buffers.inputBuffer.buffer + *inOutIdx, RECORD_HEADER_SZ);
  9240. *inOutIdx += RECORD_HEADER_SZ;
  9241. ato16(rh->length, size);
  9242. }
  9243. else {
  9244. #ifdef WOLFSSL_DTLS
  9245. int ret = GetDtlsRecordHeader(ssl, inOutIdx, rh, size);
  9246. if (ret != 0)
  9247. return ret;
  9248. #endif
  9249. }
  9250. #ifdef WOLFSSL_DTLS
  9251. /* DTLSv1.3 MUST check window after deprotecting to avoid timing channel
  9252. (RFC9147 Section 4.5.1) */
  9253. if (IsDtlsNotSctpMode(ssl) && !IsAtLeastTLSv1_3(ssl->version)) {
  9254. if (!_DtlsCheckWindow(ssl) ||
  9255. (rh->type == application_data && ssl->keys.curEpoch == 0) ||
  9256. (rh->type == alert && ssl->options.handShakeDone &&
  9257. ssl->keys.curEpoch == 0 && ssl->keys.dtls_epoch != 0)) {
  9258. WOLFSSL_LEAVE("GetRecordHeader()", SEQUENCE_ERROR);
  9259. return SEQUENCE_ERROR;
  9260. }
  9261. }
  9262. #endif
  9263. #if defined(WOLFSSL_DTLS13) || defined(WOLFSSL_TLS13)
  9264. tls12minor = TLSv1_2_MINOR;
  9265. #endif
  9266. #ifdef WOLFSSL_DTLS13
  9267. if (ssl->options.dtls)
  9268. tls12minor = DTLSv1_2_MINOR;
  9269. #endif /* WOLFSSL_DTLS13 */
  9270. /* catch version mismatch */
  9271. #ifndef WOLFSSL_TLS13
  9272. if (rh->pvMajor != ssl->version.major || rh->pvMinor != ssl->version.minor)
  9273. #else
  9274. if (rh->pvMajor != ssl->version.major ||
  9275. (rh->pvMinor != ssl->version.minor &&
  9276. (!IsAtLeastTLSv1_3(ssl->version) || rh->pvMinor != tls12minor)
  9277. ))
  9278. #endif
  9279. {
  9280. if (ssl->options.side == WOLFSSL_SERVER_END &&
  9281. ssl->options.acceptState < ACCEPT_FIRST_REPLY_DONE)
  9282. WOLFSSL_MSG("Client attempting to connect with different version");
  9283. else if (ssl->options.side == WOLFSSL_CLIENT_END &&
  9284. ssl->options.downgrade &&
  9285. ssl->options.connectState < FIRST_REPLY_DONE)
  9286. WOLFSSL_MSG("Server attempting to accept with different version");
  9287. else if (ssl->options.dtls && rh->type == handshake)
  9288. /* Check the DTLS handshake message RH version later. */
  9289. WOLFSSL_MSG("DTLS handshake, skip RH version number check");
  9290. #ifdef WOLFSSL_DTLS13
  9291. else if (ssl->options.dtls && !ssl->options.handShakeDone) {
  9292. /* we may have lost the ServerHello and this is a unified record
  9293. before version been negotiated */
  9294. if (Dtls13IsUnifiedHeader(*ssl->buffers.inputBuffer.buffer)) {
  9295. return SEQUENCE_ERROR;
  9296. }
  9297. }
  9298. #endif /* WOLFSSL_DTLS13 */
  9299. else {
  9300. WOLFSSL_MSG("SSL version error");
  9301. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  9302. return VERSION_ERROR; /* only use requested version */
  9303. }
  9304. }
  9305. /* record layer length check */
  9306. #ifdef HAVE_MAX_FRAGMENT
  9307. if (*size > (ssl->max_fragment + MAX_COMP_EXTRA + MAX_MSG_EXTRA)) {
  9308. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  9309. return LENGTH_ERROR;
  9310. }
  9311. #else
  9312. if (*size > (MAX_RECORD_SIZE + MAX_COMP_EXTRA + MAX_MSG_EXTRA)) {
  9313. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  9314. return LENGTH_ERROR;
  9315. }
  9316. #endif
  9317. if (*size == 0 && rh->type != application_data) {
  9318. WOLFSSL_MSG("0 length, non-app data record.");
  9319. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  9320. return LENGTH_ERROR;
  9321. }
  9322. /* verify record type here as well */
  9323. switch (rh->type) {
  9324. case handshake:
  9325. case change_cipher_spec:
  9326. case application_data:
  9327. case alert:
  9328. #ifdef WOLFSSL_DTLS13
  9329. case ack:
  9330. #endif /* WOLFSSL_DTLS13 */
  9331. break;
  9332. case no_type:
  9333. default:
  9334. #ifdef OPENSSL_ALL
  9335. if (!ssl->options.dtls) {
  9336. char *method = (char*)ssl->buffers.inputBuffer.buffer + start;
  9337. /* Attempt to identify if this is a plain HTTP request.
  9338. * No size checks because this function assumes at least
  9339. * RECORD_HEADER_SZ size of data has been read which is
  9340. * also the longest string comparison in this if. */
  9341. if (XSTRNCMP(method, "GET ", XSTR_SIZEOF("GET ")) == 0 ||
  9342. XSTRNCMP(method, "POST ", XSTR_SIZEOF("POST ")) == 0 ||
  9343. XSTRNCMP(method, "HEAD ", XSTR_SIZEOF("HEAD ")) == 0 ||
  9344. XSTRNCMP(method, "PUT ", XSTR_SIZEOF("PUT ")) == 0) {
  9345. WOLFSSL_MSG("Plain HTTP request detected");
  9346. return SSL_R_HTTP_REQUEST;
  9347. }
  9348. }
  9349. #endif
  9350. WOLFSSL_MSG("Unknown Record Type");
  9351. WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
  9352. return UNKNOWN_RECORD_TYPE;
  9353. }
  9354. /* haven't decrypted this record yet */
  9355. ssl->keys.decryptedCur = 0;
  9356. return 0;
  9357. }
  9358. #ifndef WOLFSSL_NO_TLS12
  9359. static int GetHandShakeHeader(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  9360. byte *type, word32 *size, word32 totalSz)
  9361. {
  9362. const byte *ptr = input + *inOutIdx;
  9363. (void)ssl;
  9364. *inOutIdx += HANDSHAKE_HEADER_SZ;
  9365. if (*inOutIdx > totalSz)
  9366. return BUFFER_E;
  9367. *type = ptr[0];
  9368. c24to32(&ptr[1], size);
  9369. return 0;
  9370. }
  9371. #endif
  9372. #ifdef WOLFSSL_DTLS
  9373. int GetDtlsHandShakeHeader(WOLFSSL* ssl, const byte* input,
  9374. word32* inOutIdx, byte *type, word32 *size,
  9375. word32 *fragOffset, word32 *fragSz,
  9376. word32 totalSz)
  9377. {
  9378. word32 idx = *inOutIdx;
  9379. *inOutIdx += HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA;
  9380. if (*inOutIdx > totalSz) {
  9381. WOLFSSL_ERROR(BUFFER_E);
  9382. return BUFFER_E;
  9383. }
  9384. *type = input[idx++];
  9385. c24to32(input + idx, size);
  9386. idx += OPAQUE24_LEN;
  9387. ato16(input + idx, &ssl->keys.dtls_peer_handshake_number);
  9388. idx += DTLS_HANDSHAKE_SEQ_SZ;
  9389. c24to32(input + idx, fragOffset);
  9390. idx += DTLS_HANDSHAKE_FRAG_SZ;
  9391. c24to32(input + idx, fragSz);
  9392. if ((ssl->curRL.pvMajor != ssl->version.major) ||
  9393. (!IsAtLeastTLSv1_3(ssl->version) && ssl->curRL.pvMinor != ssl->version.minor) ||
  9394. (IsAtLeastTLSv1_3(ssl->version) && ssl->curRL.pvMinor != DTLSv1_2_MINOR)
  9395. ) {
  9396. if (*type != client_hello && *type != hello_verify_request && *type != server_hello) {
  9397. WOLFSSL_ERROR(VERSION_ERROR);
  9398. return VERSION_ERROR;
  9399. }
  9400. else {
  9401. WOLFSSL_MSG("DTLS Handshake ignoring hello or verify version");
  9402. }
  9403. }
  9404. return 0;
  9405. }
  9406. #endif
  9407. #if !defined(NO_OLD_TLS) || \
  9408. (defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLS_SHA1))
  9409. /* fill with MD5 pad size since biggest required */
  9410. static const byte PAD1[PAD_MD5] =
  9411. { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  9412. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  9413. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  9414. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  9415. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  9416. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36
  9417. };
  9418. static const byte PAD2[PAD_MD5] =
  9419. { 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  9420. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  9421. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  9422. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  9423. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  9424. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c
  9425. };
  9426. #endif /* !NO_OLD_TLS || (NO_OLD_TLS && WOLFSSL_ALLOW_TLS_SHA1) */
  9427. #ifndef NO_OLD_TLS
  9428. /* calculate MD5 hash for finished */
  9429. #ifdef WOLFSSL_TI_HASH
  9430. #include <wolfssl/wolfcrypt/hash.h>
  9431. #endif
  9432. static int BuildMD5(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  9433. {
  9434. int ret;
  9435. byte md5_result[WC_MD5_DIGEST_SIZE];
  9436. #ifdef WOLFSSL_SMALL_STACK
  9437. wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  9438. if (md5 == NULL)
  9439. return MEMORY_E;
  9440. #else
  9441. wc_Md5 md5[1];
  9442. #endif
  9443. /* make md5 inner */
  9444. ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5);
  9445. if (ret == 0)
  9446. ret = wc_Md5Update(md5, sender, SIZEOF_SENDER);
  9447. if (ret == 0)
  9448. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  9449. if (ret == 0)
  9450. ret = wc_Md5Update(md5, PAD1, PAD_MD5);
  9451. if (ret == 0)
  9452. ret = wc_Md5Final(md5, md5_result);
  9453. /* make md5 outer */
  9454. if (ret == 0) {
  9455. ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId);
  9456. if (ret == 0) {
  9457. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  9458. if (ret == 0)
  9459. ret = wc_Md5Update(md5, PAD2, PAD_MD5);
  9460. if (ret == 0)
  9461. ret = wc_Md5Update(md5, md5_result, WC_MD5_DIGEST_SIZE);
  9462. if (ret == 0)
  9463. ret = wc_Md5Final(md5, hashes->md5);
  9464. wc_Md5Free(md5);
  9465. }
  9466. }
  9467. #ifdef WOLFSSL_SMALL_STACK
  9468. XFREE(md5, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  9469. #endif
  9470. return ret;
  9471. }
  9472. /* calculate SHA hash for finished */
  9473. static int BuildSHA(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  9474. {
  9475. int ret;
  9476. byte sha_result[WC_SHA_DIGEST_SIZE];
  9477. #ifdef WOLFSSL_SMALL_STACK
  9478. wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  9479. if (sha == NULL)
  9480. return MEMORY_E;
  9481. #else
  9482. wc_Sha sha[1];
  9483. #endif
  9484. /* make sha inner */
  9485. ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */
  9486. if (ret == 0)
  9487. ret = wc_ShaUpdate(sha, sender, SIZEOF_SENDER);
  9488. if (ret == 0)
  9489. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  9490. if (ret == 0)
  9491. ret = wc_ShaUpdate(sha, PAD1, PAD_SHA);
  9492. if (ret == 0)
  9493. ret = wc_ShaFinal(sha, sha_result);
  9494. /* make sha outer */
  9495. if (ret == 0) {
  9496. ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId);
  9497. if (ret == 0) {
  9498. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  9499. if (ret == 0)
  9500. ret = wc_ShaUpdate(sha, PAD2, PAD_SHA);
  9501. if (ret == 0)
  9502. ret = wc_ShaUpdate(sha, sha_result, WC_SHA_DIGEST_SIZE);
  9503. if (ret == 0)
  9504. ret = wc_ShaFinal(sha, hashes->sha);
  9505. wc_ShaFree(sha);
  9506. }
  9507. }
  9508. #ifdef WOLFSSL_SMALL_STACK
  9509. XFREE(sha, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  9510. #endif
  9511. return ret;
  9512. }
  9513. #endif
  9514. #ifndef WOLFSSL_NO_TLS12
  9515. /* Finished doesn't support SHA512, not SHA512 cipher suites yet */
  9516. static int BuildFinished(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  9517. {
  9518. int ret = 0;
  9519. if (ssl == NULL)
  9520. return BAD_FUNC_ARG;
  9521. #ifndef NO_TLS
  9522. if (ssl->options.tls) {
  9523. ret = BuildTlsFinished(ssl, hashes, sender);
  9524. }
  9525. #else
  9526. (void)hashes;
  9527. (void)sender;
  9528. #endif
  9529. #ifndef NO_OLD_TLS
  9530. if (!ssl->options.tls) {
  9531. ret = BuildMD5(ssl, hashes, sender);
  9532. if (ret == 0) {
  9533. ret = BuildSHA(ssl, hashes, sender);
  9534. }
  9535. }
  9536. #endif
  9537. return ret;
  9538. }
  9539. #endif /* WOLFSSL_NO_TLS12 */
  9540. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  9541. /* cipher requirements */
  9542. enum {
  9543. REQUIRES_RSA,
  9544. REQUIRES_DHE,
  9545. REQUIRES_ECC,
  9546. REQUIRES_ECC_STATIC,
  9547. REQUIRES_PSK,
  9548. REQUIRES_RSA_SIG,
  9549. REQUIRES_AEAD
  9550. };
  9551. /* Does this cipher suite (first, second) have the requirement
  9552. an ephemeral key exchange will still require the key for signing
  9553. the key exchange so ECDHE_RSA requires an rsa key thus rsa_kea */
  9554. static int CipherRequires(byte first, byte second, int requirement)
  9555. {
  9556. (void)requirement;
  9557. #ifndef WOLFSSL_NO_TLS12
  9558. #ifdef HAVE_CHACHA
  9559. if (first == CHACHA_BYTE) {
  9560. switch (second) {
  9561. case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
  9562. if (requirement == REQUIRES_RSA)
  9563. return 1;
  9564. break;
  9565. case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
  9566. if (requirement == REQUIRES_ECC)
  9567. return 1;
  9568. break;
  9569. case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
  9570. if (requirement == REQUIRES_RSA)
  9571. return 1;
  9572. if (requirement == REQUIRES_DHE)
  9573. return 1;
  9574. break;
  9575. case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  9576. if (requirement == REQUIRES_RSA)
  9577. return 1;
  9578. break;
  9579. case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  9580. if (requirement == REQUIRES_ECC)
  9581. return 1;
  9582. break;
  9583. case TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  9584. if (requirement == REQUIRES_RSA)
  9585. return 1;
  9586. if (requirement == REQUIRES_DHE)
  9587. return 1;
  9588. break;
  9589. case TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  9590. if (requirement == REQUIRES_PSK)
  9591. return 1;
  9592. break;
  9593. case TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  9594. if (requirement == REQUIRES_PSK)
  9595. return 1;
  9596. break;
  9597. case TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  9598. if (requirement == REQUIRES_PSK)
  9599. return 1;
  9600. if (requirement == REQUIRES_DHE)
  9601. return 1;
  9602. break;
  9603. }
  9604. if (requirement == REQUIRES_AEAD)
  9605. return 1;
  9606. }
  9607. #endif /* HAVE_CHACHA */
  9608. /* ECC extensions */
  9609. if (first == ECC_BYTE) {
  9610. switch (second) {
  9611. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  9612. #ifndef NO_RSA
  9613. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA :
  9614. if (requirement == REQUIRES_RSA)
  9615. return 1;
  9616. break;
  9617. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA :
  9618. if (requirement == REQUIRES_ECC_STATIC)
  9619. return 1;
  9620. if (requirement == REQUIRES_RSA_SIG)
  9621. return 1;
  9622. break;
  9623. #ifndef NO_DES3
  9624. case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA :
  9625. if (requirement == REQUIRES_RSA)
  9626. return 1;
  9627. break;
  9628. case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA :
  9629. if (requirement == REQUIRES_ECC_STATIC)
  9630. return 1;
  9631. if (requirement == REQUIRES_RSA_SIG)
  9632. return 1;
  9633. break;
  9634. #endif /* !NO_DES3 */
  9635. #ifndef NO_RC4
  9636. case TLS_ECDHE_RSA_WITH_RC4_128_SHA :
  9637. if (requirement == REQUIRES_RSA)
  9638. return 1;
  9639. break;
  9640. case TLS_ECDH_RSA_WITH_RC4_128_SHA :
  9641. if (requirement == REQUIRES_ECC_STATIC)
  9642. return 1;
  9643. if (requirement == REQUIRES_RSA_SIG)
  9644. return 1;
  9645. break;
  9646. #endif /* !NO_RC4 */
  9647. #endif /* NO_RSA */
  9648. #ifndef NO_DES3
  9649. case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA :
  9650. if (requirement == REQUIRES_ECC)
  9651. return 1;
  9652. break;
  9653. case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA :
  9654. if (requirement == REQUIRES_ECC_STATIC)
  9655. return 1;
  9656. break;
  9657. #endif /* !NO_DES3 */
  9658. #ifndef NO_RC4
  9659. case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA :
  9660. if (requirement == REQUIRES_ECC)
  9661. return 1;
  9662. break;
  9663. case TLS_ECDH_ECDSA_WITH_RC4_128_SHA :
  9664. if (requirement == REQUIRES_ECC_STATIC)
  9665. return 1;
  9666. break;
  9667. #endif /* !NO_RC4 */
  9668. #ifndef NO_RSA
  9669. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA :
  9670. if (requirement == REQUIRES_RSA)
  9671. return 1;
  9672. break;
  9673. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA :
  9674. if (requirement == REQUIRES_ECC_STATIC)
  9675. return 1;
  9676. if (requirement == REQUIRES_RSA_SIG)
  9677. return 1;
  9678. break;
  9679. #endif /* !NO_RSA */
  9680. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA :
  9681. if (requirement == REQUIRES_ECC)
  9682. return 1;
  9683. break;
  9684. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA :
  9685. if (requirement == REQUIRES_ECC_STATIC)
  9686. return 1;
  9687. break;
  9688. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA :
  9689. if (requirement == REQUIRES_ECC)
  9690. return 1;
  9691. break;
  9692. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA :
  9693. if (requirement == REQUIRES_ECC_STATIC)
  9694. return 1;
  9695. break;
  9696. case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 :
  9697. if (requirement == REQUIRES_ECC)
  9698. return 1;
  9699. if (requirement == REQUIRES_AEAD)
  9700. return 1;
  9701. break;
  9702. case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 :
  9703. if (requirement == REQUIRES_ECC)
  9704. return 1;
  9705. if (requirement == REQUIRES_AEAD)
  9706. return 1;
  9707. break;
  9708. case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 :
  9709. if (requirement == REQUIRES_ECC_STATIC)
  9710. return 1;
  9711. if (requirement == REQUIRES_AEAD)
  9712. return 1;
  9713. break;
  9714. case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 :
  9715. if (requirement == REQUIRES_ECC_STATIC)
  9716. return 1;
  9717. if (requirement == REQUIRES_AEAD)
  9718. return 1;
  9719. break;
  9720. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  9721. #ifndef NO_RSA
  9722. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  9723. case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 :
  9724. if (requirement == REQUIRES_RSA)
  9725. return 1;
  9726. if (requirement == REQUIRES_AEAD)
  9727. return 1;
  9728. break;
  9729. case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 :
  9730. if (requirement == REQUIRES_RSA)
  9731. return 1;
  9732. if (requirement == REQUIRES_AEAD)
  9733. return 1;
  9734. break;
  9735. case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 :
  9736. if (requirement == REQUIRES_ECC_STATIC)
  9737. return 1;
  9738. if (requirement == REQUIRES_RSA_SIG)
  9739. return 1;
  9740. if (requirement == REQUIRES_AEAD)
  9741. return 1;
  9742. break;
  9743. case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 :
  9744. if (requirement == REQUIRES_ECC_STATIC)
  9745. return 1;
  9746. if (requirement == REQUIRES_RSA_SIG)
  9747. return 1;
  9748. if (requirement == REQUIRES_AEAD)
  9749. return 1;
  9750. break;
  9751. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  9752. #ifdef HAVE_AESCCM
  9753. case TLS_RSA_WITH_AES_128_CCM_8 :
  9754. case TLS_RSA_WITH_AES_256_CCM_8 :
  9755. if (requirement == REQUIRES_RSA)
  9756. return 1;
  9757. if (requirement == REQUIRES_RSA_SIG)
  9758. return 1;
  9759. if (requirement == REQUIRES_AEAD)
  9760. return 1;
  9761. break;
  9762. #endif /* HAVE_AESCCM */
  9763. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  9764. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 :
  9765. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 :
  9766. if (requirement == REQUIRES_RSA)
  9767. return 1;
  9768. break;
  9769. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 :
  9770. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 :
  9771. if (requirement == REQUIRES_RSA_SIG)
  9772. return 1;
  9773. if (requirement == REQUIRES_ECC_STATIC)
  9774. return 1;
  9775. break;
  9776. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  9777. #endif /* !NO_RSA */
  9778. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  9779. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM :
  9780. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 :
  9781. case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 :
  9782. if (requirement == REQUIRES_ECC)
  9783. return 1;
  9784. if (requirement == REQUIRES_AEAD)
  9785. return 1;
  9786. break;
  9787. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 :
  9788. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 :
  9789. if (requirement == REQUIRES_ECC)
  9790. return 1;
  9791. break;
  9792. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 :
  9793. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 :
  9794. if (requirement == REQUIRES_ECC)
  9795. return 1;
  9796. if (requirement == REQUIRES_ECC_STATIC)
  9797. return 1;
  9798. break;
  9799. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  9800. #ifndef NO_PSK
  9801. case TLS_PSK_WITH_AES_128_CCM:
  9802. case TLS_PSK_WITH_AES_256_CCM:
  9803. case TLS_PSK_WITH_AES_128_CCM_8:
  9804. case TLS_PSK_WITH_AES_256_CCM_8:
  9805. if (requirement == REQUIRES_PSK)
  9806. return 1;
  9807. if (requirement == REQUIRES_AEAD)
  9808. return 1;
  9809. break;
  9810. case TLS_DHE_PSK_WITH_AES_128_CCM:
  9811. case TLS_DHE_PSK_WITH_AES_256_CCM:
  9812. if (requirement == REQUIRES_PSK)
  9813. return 1;
  9814. if (requirement == REQUIRES_DHE)
  9815. return 1;
  9816. if (requirement == REQUIRES_AEAD)
  9817. return 1;
  9818. break;
  9819. #endif /* !NO_PSK */
  9820. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  9821. case TLS_ECDHE_ECDSA_WITH_NULL_SHA :
  9822. if (requirement == REQUIRES_ECC)
  9823. return 1;
  9824. break;
  9825. case TLS_ECDHE_PSK_WITH_NULL_SHA256 :
  9826. if (requirement == REQUIRES_PSK)
  9827. return 1;
  9828. break;
  9829. case TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 :
  9830. if (requirement == REQUIRES_PSK)
  9831. return 1;
  9832. break;
  9833. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  9834. #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)
  9835. case TLS_SHA256_SHA256:
  9836. break;
  9837. case TLS_SHA384_SHA384:
  9838. break;
  9839. #endif
  9840. default:
  9841. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires ECC");
  9842. return 0;
  9843. } /* switch */
  9844. } /* if */
  9845. /* ECC extensions */
  9846. if (first == ECDHE_PSK_BYTE) {
  9847. switch (second) {
  9848. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  9849. case TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256 :
  9850. if (requirement == REQUIRES_PSK)
  9851. return 1;
  9852. break;
  9853. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  9854. default:
  9855. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires ECC PSK");
  9856. return 0;
  9857. } /* switch */
  9858. } /* if */
  9859. #endif /* !WOLFSSL_NO_TLS12 */
  9860. /* Distinct TLS v1.3 cipher suites with cipher and digest only. */
  9861. if (first == TLS13_BYTE) {
  9862. switch (second) {
  9863. #ifdef WOLFSSL_TLS13
  9864. case TLS_AES_128_GCM_SHA256:
  9865. case TLS_AES_256_GCM_SHA384:
  9866. case TLS_CHACHA20_POLY1305_SHA256:
  9867. case TLS_AES_128_CCM_SHA256:
  9868. case TLS_AES_128_CCM_8_SHA256:
  9869. break;
  9870. #endif
  9871. default:
  9872. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires "
  9873. "TLS v1.3");
  9874. return 0;
  9875. }
  9876. }
  9877. #ifndef WOLFSSL_NO_TLS12
  9878. if (first != ECC_BYTE && first != CHACHA_BYTE &&
  9879. first != TLS13_BYTE && first != ECDHE_PSK_BYTE) {
  9880. /* normal suites */
  9881. switch (second) {
  9882. #ifndef NO_RSA
  9883. #ifndef NO_RC4
  9884. case SSL_RSA_WITH_RC4_128_SHA :
  9885. if (requirement == REQUIRES_RSA)
  9886. return 1;
  9887. break;
  9888. case SSL_RSA_WITH_RC4_128_MD5 :
  9889. if (requirement == REQUIRES_RSA)
  9890. return 1;
  9891. break;
  9892. #endif /* NO_RC4 */
  9893. case SSL_RSA_WITH_3DES_EDE_CBC_SHA :
  9894. if (requirement == REQUIRES_RSA)
  9895. return 1;
  9896. break;
  9897. case TLS_RSA_WITH_AES_128_CBC_SHA :
  9898. if (requirement == REQUIRES_RSA)
  9899. return 1;
  9900. break;
  9901. case TLS_RSA_WITH_AES_128_CBC_SHA256 :
  9902. if (requirement == REQUIRES_RSA)
  9903. return 1;
  9904. break;
  9905. case TLS_RSA_WITH_AES_256_CBC_SHA :
  9906. if (requirement == REQUIRES_RSA)
  9907. return 1;
  9908. break;
  9909. case TLS_RSA_WITH_AES_256_CBC_SHA256 :
  9910. if (requirement == REQUIRES_RSA)
  9911. return 1;
  9912. break;
  9913. case TLS_RSA_WITH_NULL_MD5 :
  9914. case TLS_RSA_WITH_NULL_SHA :
  9915. case TLS_RSA_WITH_NULL_SHA256 :
  9916. if (requirement == REQUIRES_RSA)
  9917. return 1;
  9918. break;
  9919. #endif /* !NO_RSA */
  9920. #ifndef NO_PSK
  9921. case TLS_PSK_WITH_AES_128_GCM_SHA256 :
  9922. if (requirement == REQUIRES_PSK)
  9923. return 1;
  9924. if (requirement == REQUIRES_AEAD)
  9925. return 1;
  9926. break;
  9927. case TLS_PSK_WITH_AES_256_GCM_SHA384 :
  9928. if (requirement == REQUIRES_PSK)
  9929. return 1;
  9930. if (requirement == REQUIRES_AEAD)
  9931. return 1;
  9932. break;
  9933. case TLS_PSK_WITH_AES_128_CBC_SHA256 :
  9934. case TLS_PSK_WITH_AES_256_CBC_SHA384 :
  9935. case TLS_PSK_WITH_AES_128_CBC_SHA :
  9936. case TLS_PSK_WITH_AES_256_CBC_SHA :
  9937. case TLS_PSK_WITH_NULL_SHA384 :
  9938. case TLS_PSK_WITH_NULL_SHA256 :
  9939. case TLS_PSK_WITH_NULL_SHA :
  9940. if (requirement == REQUIRES_PSK)
  9941. return 1;
  9942. break;
  9943. case TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 :
  9944. case TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 :
  9945. if (requirement == REQUIRES_DHE)
  9946. return 1;
  9947. if (requirement == REQUIRES_PSK)
  9948. return 1;
  9949. if (requirement == REQUIRES_AEAD)
  9950. return 1;
  9951. break;
  9952. case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 :
  9953. case TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 :
  9954. case TLS_DHE_PSK_WITH_NULL_SHA384 :
  9955. case TLS_DHE_PSK_WITH_NULL_SHA256 :
  9956. if (requirement == REQUIRES_DHE)
  9957. return 1;
  9958. if (requirement == REQUIRES_PSK)
  9959. return 1;
  9960. break;
  9961. #endif /* NO_PSK */
  9962. #ifndef NO_RSA
  9963. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 :
  9964. if (requirement == REQUIRES_RSA)
  9965. return 1;
  9966. if (requirement == REQUIRES_DHE)
  9967. return 1;
  9968. break;
  9969. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 :
  9970. if (requirement == REQUIRES_RSA)
  9971. return 1;
  9972. if (requirement == REQUIRES_DHE)
  9973. return 1;
  9974. break;
  9975. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA :
  9976. if (requirement == REQUIRES_RSA)
  9977. return 1;
  9978. if (requirement == REQUIRES_DHE)
  9979. return 1;
  9980. break;
  9981. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA :
  9982. if (requirement == REQUIRES_RSA)
  9983. return 1;
  9984. if (requirement == REQUIRES_DHE)
  9985. return 1;
  9986. break;
  9987. case TLS_RSA_WITH_AES_128_GCM_SHA256 :
  9988. case TLS_RSA_WITH_AES_256_GCM_SHA384 :
  9989. if (requirement == REQUIRES_RSA)
  9990. return 1;
  9991. if (requirement == REQUIRES_AEAD)
  9992. return 1;
  9993. break;
  9994. case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 :
  9995. case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 :
  9996. if (requirement == REQUIRES_RSA)
  9997. return 1;
  9998. if (requirement == REQUIRES_DHE)
  9999. return 1;
  10000. if (requirement == REQUIRES_AEAD)
  10001. return 1;
  10002. break;
  10003. #ifdef HAVE_CAMELLIA
  10004. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA :
  10005. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA :
  10006. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  10007. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  10008. if (requirement == REQUIRES_RSA)
  10009. return 1;
  10010. break;
  10011. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA :
  10012. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA :
  10013. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  10014. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  10015. if (requirement == REQUIRES_RSA)
  10016. return 1;
  10017. if (requirement == REQUIRES_RSA_SIG)
  10018. return 1;
  10019. if (requirement == REQUIRES_DHE)
  10020. return 1;
  10021. break;
  10022. #endif /* HAVE_CAMELLIA */
  10023. case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
  10024. if (requirement == REQUIRES_RSA)
  10025. return 1;
  10026. if (requirement == REQUIRES_RSA_SIG)
  10027. return 1;
  10028. if (requirement == REQUIRES_DHE)
  10029. return 1;
  10030. break;
  10031. #endif
  10032. #ifdef HAVE_ANON
  10033. case TLS_DH_anon_WITH_AES_128_CBC_SHA :
  10034. if (requirement == REQUIRES_DHE)
  10035. return 1;
  10036. break;
  10037. case TLS_DH_anon_WITH_AES_256_GCM_SHA384:
  10038. if (requirement == REQUIRES_DHE)
  10039. return 1;
  10040. if (requirement == REQUIRES_AEAD)
  10041. return 1;
  10042. break;
  10043. #endif
  10044. #ifdef WOLFSSL_MULTICAST
  10045. case WDM_WITH_NULL_SHA256 :
  10046. break;
  10047. #endif
  10048. default:
  10049. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires");
  10050. return 0;
  10051. } /* switch */
  10052. } /* if ECC / Normal suites else */
  10053. #endif /* !WOLFSSL_NO_TLS12 */
  10054. return 0;
  10055. }
  10056. #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
  10057. #ifndef NO_CERTS
  10058. /* Match names with wildcards, each wildcard can represent a single name
  10059. component or fragment but not multiple names, i.e.,
  10060. *.z.com matches y.z.com but not x.y.z.com
  10061. return 1 on success */
  10062. int MatchDomainName(const char* pattern, int len, const char* str)
  10063. {
  10064. int ret = 0;
  10065. if (pattern == NULL || str == NULL || len <= 0)
  10066. return 0;
  10067. while (len > 0) {
  10068. char p = (char)XTOLOWER((unsigned char)*pattern++);
  10069. if (p == '\0')
  10070. break;
  10071. if (p == '*') {
  10072. char s;
  10073. while (--len > 0 &&
  10074. (p = (char)XTOLOWER((unsigned char)*pattern++)) == '*') {
  10075. }
  10076. if (len == 0)
  10077. p = '\0';
  10078. while ( (s = (char)XTOLOWER((unsigned char) *str)) != '\0') {
  10079. if (s == p)
  10080. break;
  10081. if (s == '.')
  10082. return 0;
  10083. str++;
  10084. }
  10085. }
  10086. else {
  10087. if (p != (char)XTOLOWER((unsigned char) *str))
  10088. return 0;
  10089. }
  10090. if (len > 0) {
  10091. str++;
  10092. len--;
  10093. }
  10094. }
  10095. if (*str == '\0' && len == 0) {
  10096. ret = 1; /* success */
  10097. }
  10098. return ret;
  10099. }
  10100. /* Check that alternative names, if they exists, match the domain.
  10101. * Fail if there are wild patterns and they didn't match.
  10102. * Check the common name if no alternative names matched.
  10103. *
  10104. * dCert Decoded cert to get the alternative names from.
  10105. * domain Domain name to compare against.
  10106. * checkCN Whether to check the common name.
  10107. * returns 1 : match was found.
  10108. * 0 : no match found.
  10109. * -1 : No matches and wild pattern match failed.
  10110. */
  10111. int CheckForAltNames(DecodedCert* dCert, const char* domain, int* checkCN)
  10112. {
  10113. int match = 0;
  10114. DNS_entry* altName = NULL;
  10115. char *buf;
  10116. word32 len;
  10117. WOLFSSL_MSG("Checking AltNames");
  10118. if (dCert)
  10119. altName = dCert->altNames;
  10120. if (checkCN != NULL) {
  10121. *checkCN = (altName == NULL) ? 1 : 0;
  10122. }
  10123. while (altName) {
  10124. WOLFSSL_MSG("\tindividual AltName check");
  10125. #if defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME)
  10126. if (altName->type == ASN_IP_TYPE) {
  10127. buf = altName->ipString;
  10128. len = (word32)XSTRLEN(buf);
  10129. }
  10130. else
  10131. #endif /* OPENSSL_ALL || WOLFSSL_IP_ALT_NAME */
  10132. {
  10133. buf = altName->name;
  10134. len = altName->len;
  10135. }
  10136. if (MatchDomainName(buf, len, domain)) {
  10137. match = 1;
  10138. if (checkCN != NULL) {
  10139. *checkCN = 0;
  10140. }
  10141. WOLFSSL_MSG("\tmatch found");
  10142. break;
  10143. }
  10144. /* No matches and wild pattern match failed. */
  10145. else if (buf && (len >=1) && (buf[0] == '*')) {
  10146. match = -1;
  10147. WOLFSSL_MSG("\twildcard match failed");
  10148. }
  10149. altName = altName->next;
  10150. }
  10151. return match;
  10152. }
  10153. /* Check the domain name matches the subject alternative name or the subject
  10154. * name.
  10155. *
  10156. * dcert Decoded certificate.
  10157. * domainName The domain name.
  10158. * domainNameLen The length of the domain name.
  10159. * returns DOMAIN_NAME_MISMATCH when no match found and 0 on success.
  10160. */
  10161. int CheckHostName(DecodedCert* dCert, const char *domainName, size_t domainNameLen)
  10162. {
  10163. int checkCN;
  10164. int ret = DOMAIN_NAME_MISMATCH;
  10165. /* Assume name is NUL terminated. */
  10166. (void)domainNameLen;
  10167. if (CheckForAltNames(dCert, domainName, &checkCN) != 1) {
  10168. WOLFSSL_MSG("DomainName match on alt names failed");
  10169. }
  10170. else {
  10171. ret = 0;
  10172. }
  10173. #ifndef WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY
  10174. if (checkCN == 1) {
  10175. if (MatchDomainName(dCert->subjectCN, dCert->subjectCNLen,
  10176. domainName) == 1) {
  10177. ret = 0;
  10178. }
  10179. else {
  10180. WOLFSSL_MSG("DomainName match on common name failed");
  10181. }
  10182. }
  10183. #endif /* !WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY */
  10184. return ret;
  10185. }
  10186. int CheckIPAddr(DecodedCert* dCert, const char* ipasc)
  10187. {
  10188. WOLFSSL_MSG("Checking IPAddr");
  10189. return CheckHostName(dCert, ipasc, (size_t)XSTRLEN(ipasc));
  10190. }
  10191. #ifdef SESSION_CERTS
  10192. static void AddSessionCertToChain(WOLFSSL_X509_CHAIN* chain,
  10193. byte* certBuf, word32 certSz)
  10194. {
  10195. if (chain->count < MAX_CHAIN_DEPTH &&
  10196. certSz < MAX_X509_SIZE) {
  10197. chain->certs[chain->count].length = certSz;
  10198. XMEMCPY(chain->certs[chain->count].buffer, certBuf, certSz);
  10199. chain->count++;
  10200. }
  10201. else {
  10202. WOLFSSL_MSG("Couldn't store chain cert for session");
  10203. }
  10204. }
  10205. #endif
  10206. #if defined(KEEP_PEER_CERT) || defined(SESSION_CERTS) || \
  10207. defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10208. static void CopyDecodedName(WOLFSSL_X509_NAME* name, DecodedCert* dCert, int nameType)
  10209. {
  10210. if (nameType == SUBJECT) {
  10211. XSTRNCPY(name->name, dCert->subject, ASN_NAME_MAX);
  10212. name->name[ASN_NAME_MAX - 1] = '\0';
  10213. name->sz = (int)XSTRLEN(name->name) + 1;
  10214. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  10215. name->rawLen = min(dCert->subjectRawLen, ASN_NAME_MAX);
  10216. XMEMCPY(name->raw, dCert->subjectRaw, name->rawLen);
  10217. #endif
  10218. }
  10219. else {
  10220. XSTRNCPY(name->name, dCert->issuer, ASN_NAME_MAX);
  10221. name->name[ASN_NAME_MAX - 1] = '\0';
  10222. name->sz = (int)XSTRLEN(name->name) + 1;
  10223. #if (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)) \
  10224. && (defined(HAVE_PKCS7) || defined(WOLFSSL_CERT_EXT))
  10225. name->rawLen = min(dCert->issuerRawLen, ASN_NAME_MAX);
  10226. if (name->rawLen) {
  10227. XMEMCPY(name->raw, dCert->issuerRaw, name->rawLen);
  10228. }
  10229. #endif
  10230. }
  10231. }
  10232. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  10233. !defined(IGNORE_NAME_CONSTRAINTS)
  10234. /* copies over additional alt names such as dirName
  10235. * returns 0 on success
  10236. */
  10237. static int CopyAdditionalAltNames(DNS_entry** to, DNS_entry* from, int type,
  10238. void* heap)
  10239. {
  10240. DNS_entry* cur = from;
  10241. if (to == NULL) {
  10242. return BAD_FUNC_ARG;
  10243. }
  10244. while (cur != NULL) {
  10245. if (cur->type == type) {
  10246. DNS_entry* dnsEntry;
  10247. int strLen = cur->len;
  10248. dnsEntry = AltNameNew(heap);
  10249. if (dnsEntry == NULL) {
  10250. WOLFSSL_MSG("\tOut of Memory");
  10251. return MEMORY_E;
  10252. }
  10253. dnsEntry->type = type;
  10254. dnsEntry->name = (char*)XMALLOC(strLen + 1, heap,
  10255. DYNAMIC_TYPE_ALTNAME);
  10256. if (dnsEntry->name == NULL) {
  10257. WOLFSSL_MSG("\tOut of Memory");
  10258. XFREE(dnsEntry, heap, DYNAMIC_TYPE_ALTNAME);
  10259. return MEMORY_E;
  10260. }
  10261. dnsEntry->len = strLen;
  10262. XMEMCPY(dnsEntry->name, cur->name, strLen);
  10263. dnsEntry->name[strLen] = '\0';
  10264. dnsEntry->next = *to;
  10265. *to = dnsEntry;
  10266. }
  10267. cur = cur->next;
  10268. }
  10269. return 0;
  10270. }
  10271. #endif /* OPENSSL_EXTRA */
  10272. #ifdef WOLFSSL_CERT_REQ
  10273. static int CopyREQAttributes(WOLFSSL_X509* x509, DecodedCert* dCert)
  10274. {
  10275. int ret = 0;
  10276. if (dCert->cPwd) {
  10277. if (dCert->cPwdLen < CTC_NAME_SIZE) {
  10278. XMEMCPY(x509->challengePw, dCert->cPwd, dCert->cPwdLen);
  10279. x509->challengePw[dCert->cPwdLen] = '\0';
  10280. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN)
  10281. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10282. NID_pkcs9_challengePassword,
  10283. MBSTRING_ASC,
  10284. (const byte*)dCert->cPwd,
  10285. dCert->cPwdLen) != WOLFSSL_SUCCESS) {
  10286. ret = REQ_ATTRIBUTE_E;
  10287. WOLFSSL_ERROR_VERBOSE(ret);
  10288. }
  10289. #endif
  10290. }
  10291. else {
  10292. WOLFSSL_MSG("Challenge password too long");
  10293. ret = MEMORY_E;
  10294. }
  10295. }
  10296. if (dCert->contentType) {
  10297. if (dCert->contentTypeLen < CTC_NAME_SIZE) {
  10298. XMEMCPY(x509->contentType, dCert->contentType, dCert->contentTypeLen);
  10299. x509->contentType[dCert->contentTypeLen] = '\0';
  10300. }
  10301. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN)
  10302. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10303. NID_pkcs9_contentType,
  10304. MBSTRING_ASC,
  10305. (const byte*)dCert->contentType,
  10306. dCert->contentTypeLen) !=
  10307. WOLFSSL_SUCCESS) {
  10308. ret = REQ_ATTRIBUTE_E;
  10309. WOLFSSL_ERROR_VERBOSE(ret);
  10310. }
  10311. #endif
  10312. }
  10313. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN)
  10314. if (dCert->sNum) {
  10315. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10316. NID_serialNumber,
  10317. MBSTRING_ASC,
  10318. (const byte*)dCert->sNum,
  10319. dCert->sNumLen) != WOLFSSL_SUCCESS) {
  10320. ret = REQ_ATTRIBUTE_E;
  10321. WOLFSSL_ERROR_VERBOSE(ret);
  10322. }
  10323. }
  10324. if (dCert->unstructuredName) {
  10325. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10326. NID_pkcs9_unstructuredName,
  10327. MBSTRING_ASC,
  10328. (const byte*)dCert->unstructuredName,
  10329. dCert->unstructuredNameLen)
  10330. != WOLFSSL_SUCCESS) {
  10331. ret = REQ_ATTRIBUTE_E;
  10332. WOLFSSL_ERROR_VERBOSE(ret);
  10333. }
  10334. }
  10335. if (dCert->surname) {
  10336. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10337. NID_surname,
  10338. MBSTRING_ASC,
  10339. (const byte*)dCert->surname,
  10340. dCert->surnameLen) != WOLFSSL_SUCCESS) {
  10341. ret = REQ_ATTRIBUTE_E;
  10342. WOLFSSL_ERROR_VERBOSE(ret);
  10343. }
  10344. }
  10345. if (dCert->givenName) {
  10346. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10347. NID_givenName,
  10348. MBSTRING_ASC,
  10349. (const byte*)dCert->givenName,
  10350. dCert->givenNameLen) != WOLFSSL_SUCCESS) {
  10351. ret = REQ_ATTRIBUTE_E;
  10352. WOLFSSL_ERROR_VERBOSE(ret);
  10353. }
  10354. }
  10355. if (dCert->dnQualifier) {
  10356. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10357. NID_dnQualifier,
  10358. MBSTRING_ASC,
  10359. (const byte*)dCert->dnQualifier,
  10360. dCert->dnQualifierLen) != WOLFSSL_SUCCESS) {
  10361. ret = REQ_ATTRIBUTE_E;
  10362. WOLFSSL_ERROR_VERBOSE(ret);
  10363. }
  10364. }
  10365. if (dCert->initials) {
  10366. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10367. NID_initials,
  10368. MBSTRING_ASC,
  10369. (const byte*)dCert->initials,
  10370. dCert->initialsLen) != WOLFSSL_SUCCESS) {
  10371. ret = REQ_ATTRIBUTE_E;
  10372. WOLFSSL_ERROR_VERBOSE(ret);
  10373. }
  10374. }
  10375. #endif /* OPENSSL_ALL */
  10376. return ret;
  10377. }
  10378. #endif /* WOLFSSL_CERT_REQ */
  10379. /* Copy parts X509 needs from Decoded cert, 0 on success */
  10380. /* The same DecodedCert cannot be copied to WOLFSSL_X509 twice otherwise the
  10381. * altNames pointers could be free'd by second x509 still active by first */
  10382. int CopyDecodedToX509(WOLFSSL_X509* x509, DecodedCert* dCert)
  10383. {
  10384. int ret = 0;
  10385. if (x509 == NULL || dCert == NULL ||
  10386. dCert->subjectCNLen < 0)
  10387. return BAD_FUNC_ARG;
  10388. if (x509->issuer.name == NULL || x509->subject.name == NULL) {
  10389. WOLFSSL_MSG("Either init was not called on X509 or programming error");
  10390. WOLFSSL_ERROR_VERBOSE(BAD_FUNC_ARG);
  10391. return BAD_FUNC_ARG;
  10392. }
  10393. x509->version = dCert->version + 1;
  10394. CopyDecodedName(&x509->issuer, dCert, ISSUER);
  10395. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10396. if (dCert->issuerName != NULL) {
  10397. wolfSSL_X509_set_issuer_name(x509,
  10398. (WOLFSSL_X509_NAME*)dCert->issuerName);
  10399. x509->issuer.x509 = x509;
  10400. }
  10401. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  10402. CopyDecodedName(&x509->subject, dCert, SUBJECT);
  10403. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10404. if (dCert->subjectName != NULL) {
  10405. wolfSSL_X509_set_subject_name(x509,
  10406. (WOLFSSL_X509_NAME*)dCert->subjectName);
  10407. x509->subject.x509 = x509;
  10408. }
  10409. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  10410. XMEMCPY(x509->serial, dCert->serial, EXTERNAL_SERIAL_SIZE);
  10411. x509->serialSz = dCert->serialSz;
  10412. if (dCert->subjectCN && dCert->subjectCNLen < ASN_NAME_MAX) {
  10413. XMEMCPY(x509->subjectCN, dCert->subjectCN, dCert->subjectCNLen);
  10414. x509->subjectCN[dCert->subjectCNLen] = '\0';
  10415. }
  10416. else
  10417. x509->subjectCN[0] = '\0';
  10418. #ifdef WOLFSSL_CERT_REQ
  10419. x509->isCSR = dCert->isCSR;
  10420. /* CSR attributes */
  10421. if (x509->isCSR) {
  10422. ret = CopyREQAttributes(x509, dCert);
  10423. }
  10424. #endif /* WOLFSSL_CERT_REQ */
  10425. #ifdef WOLFSSL_SEP
  10426. {
  10427. int minSz = min(dCert->deviceTypeSz, EXTERNAL_SERIAL_SIZE);
  10428. if (minSz > 0) {
  10429. x509->deviceTypeSz = minSz;
  10430. XMEMCPY(x509->deviceType, dCert->deviceType, minSz);
  10431. }
  10432. else
  10433. x509->deviceTypeSz = 0;
  10434. minSz = min(dCert->hwTypeSz, EXTERNAL_SERIAL_SIZE);
  10435. if (minSz > 0) {
  10436. x509->hwTypeSz = minSz;
  10437. XMEMCPY(x509->hwType, dCert->hwType, minSz);
  10438. }
  10439. else
  10440. x509->hwTypeSz = 0;
  10441. minSz = min(dCert->hwSerialNumSz, EXTERNAL_SERIAL_SIZE);
  10442. if (minSz > 0) {
  10443. x509->hwSerialNumSz = minSz;
  10444. XMEMCPY(x509->hwSerialNum, dCert->hwSerialNum, minSz);
  10445. }
  10446. else
  10447. x509->hwSerialNumSz = 0;
  10448. }
  10449. #endif /* WOLFSSL_SEP */
  10450. {
  10451. int minSz;
  10452. if (dCert->beforeDateLen > 0) {
  10453. minSz = min(dCert->beforeDate[1], MAX_DATE_SZ);
  10454. x509->notBefore.type = dCert->beforeDate[0];
  10455. x509->notBefore.length = minSz;
  10456. XMEMCPY(x509->notBefore.data, &dCert->beforeDate[2], minSz);
  10457. }
  10458. else
  10459. x509->notBefore.length = 0;
  10460. if (dCert->afterDateLen > 0) {
  10461. minSz = min(dCert->afterDate[1], MAX_DATE_SZ);
  10462. x509->notAfter.type = dCert->afterDate[0];
  10463. x509->notAfter.length = minSz;
  10464. XMEMCPY(x509->notAfter.data, &dCert->afterDate[2], minSz);
  10465. }
  10466. else
  10467. x509->notAfter.length = 0;
  10468. }
  10469. if (dCert->publicKey != NULL && dCert->pubKeySize != 0) {
  10470. x509->pubKey.buffer = (byte*)XMALLOC(
  10471. dCert->pubKeySize, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  10472. if (x509->pubKey.buffer != NULL) {
  10473. x509->pubKeyOID = dCert->keyOID;
  10474. x509->pubKey.length = dCert->pubKeySize;
  10475. XMEMCPY(x509->pubKey.buffer, dCert->publicKey, dCert->pubKeySize);
  10476. }
  10477. else
  10478. ret = MEMORY_E;
  10479. #if defined(OPENSSL_ALL)
  10480. if (ret == 0) {
  10481. x509->key.pubKeyOID = dCert->keyOID;
  10482. if (!x509->key.algor) {
  10483. x509->key.algor = wolfSSL_X509_ALGOR_new();
  10484. } else {
  10485. wolfSSL_ASN1_OBJECT_free(x509->key.algor->algorithm);
  10486. }
  10487. if (!x509->key.algor) {
  10488. ret = MEMORY_E;
  10489. } else {
  10490. if (!(x509->key.algor->algorithm =
  10491. wolfSSL_OBJ_nid2obj(oid2nid(dCert->keyOID, oidKeyType)))) {
  10492. ret = PUBLIC_KEY_E;
  10493. WOLFSSL_ERROR_VERBOSE(ret);
  10494. }
  10495. }
  10496. wolfSSL_EVP_PKEY_free(x509->key.pkey);
  10497. if (!(x509->key.pkey = wolfSSL_d2i_PUBKEY(NULL,
  10498. &dCert->publicKey,
  10499. dCert->pubKeySize))) {
  10500. ret = PUBLIC_KEY_E;
  10501. WOLFSSL_ERROR_VERBOSE(ret);
  10502. }
  10503. }
  10504. #endif
  10505. }
  10506. if (dCert->signature != NULL && dCert->sigLength != 0 &&
  10507. dCert->sigLength <= MAX_ENCODED_SIG_SZ) {
  10508. x509->sig.buffer = (byte*)XMALLOC(
  10509. dCert->sigLength, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  10510. if (x509->sig.buffer == NULL) {
  10511. ret = MEMORY_E;
  10512. }
  10513. else {
  10514. XMEMCPY(x509->sig.buffer, dCert->signature, dCert->sigLength);
  10515. x509->sig.length = dCert->sigLength;
  10516. x509->sigOID = dCert->signatureOID;
  10517. }
  10518. #if defined(OPENSSL_ALL)
  10519. wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm);
  10520. if (!(x509->algor.algorithm =
  10521. wolfSSL_OBJ_nid2obj(oid2nid(dCert->signatureOID, oidSigType)))) {
  10522. ret = PUBLIC_KEY_E;
  10523. WOLFSSL_ERROR_VERBOSE(ret);
  10524. }
  10525. #endif
  10526. }
  10527. /* if der contains original source buffer then store for potential
  10528. * retrieval */
  10529. if (dCert->source != NULL && dCert->maxIdx > 0) {
  10530. if (AllocDer(&x509->derCert, dCert->maxIdx, CERT_TYPE, x509->heap)
  10531. == 0) {
  10532. XMEMCPY(x509->derCert->buffer, dCert->source, dCert->maxIdx);
  10533. }
  10534. else {
  10535. ret = MEMORY_E;
  10536. }
  10537. }
  10538. x509->altNames = dCert->altNames;
  10539. dCert->weOwnAltNames = 0;
  10540. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  10541. !defined(IGNORE_NAME_CONSTRAINTS)
  10542. /* add copies of email names from dCert to X509 */
  10543. if (CopyAdditionalAltNames(&x509->altNames, dCert->altEmailNames,
  10544. ASN_RFC822_TYPE, x509->heap) != 0) {
  10545. return MEMORY_E;
  10546. }
  10547. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  10548. #if defined(OPENSSL_EXTRA) && !defined(IGNORE_NAME_CONSTRAINTS)
  10549. /* add copies of alternate directory names from dCert to X509 */
  10550. if (CopyAdditionalAltNames(&x509->altNames, dCert->altDirNames,
  10551. ASN_DIR_TYPE, x509->heap) != 0) {
  10552. return MEMORY_E;
  10553. }
  10554. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  10555. x509->altNamesNext = x509->altNames; /* index hint */
  10556. x509->isCa = dCert->isCA;
  10557. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10558. x509->pathLength = dCert->pathLength;
  10559. x509->keyUsage = dCert->extKeyUsage;
  10560. x509->CRLdistSet = dCert->extCRLdistSet;
  10561. x509->CRLdistCrit = dCert->extCRLdistCrit;
  10562. if (dCert->extCrlInfoRaw != NULL && dCert->extCrlInfoRawSz > 0) {
  10563. x509->rawCRLInfo = (byte*)XMALLOC(dCert->extCrlInfoRawSz, x509->heap,
  10564. DYNAMIC_TYPE_X509_EXT);
  10565. if (x509->rawCRLInfo != NULL) {
  10566. XMEMCPY(x509->rawCRLInfo, dCert->extCrlInfoRaw, dCert->extCrlInfoRawSz);
  10567. x509->rawCRLInfoSz = dCert->extCrlInfoRawSz;
  10568. }
  10569. else {
  10570. ret = MEMORY_E;
  10571. }
  10572. }
  10573. if (dCert->extCrlInfo != NULL && dCert->extCrlInfoSz > 0) {
  10574. x509->CRLInfo = (byte*)XMALLOC(dCert->extCrlInfoSz, x509->heap,
  10575. DYNAMIC_TYPE_X509_EXT);
  10576. if (x509->CRLInfo != NULL) {
  10577. XMEMCPY(x509->CRLInfo, dCert->extCrlInfo, dCert->extCrlInfoSz);
  10578. x509->CRLInfoSz = dCert->extCrlInfoSz;
  10579. }
  10580. else {
  10581. ret = MEMORY_E;
  10582. }
  10583. }
  10584. x509->authInfoSet = dCert->extAuthInfoSet;
  10585. x509->authInfoCrit = dCert->extAuthInfoCrit;
  10586. if (dCert->extAuthInfo != NULL && dCert->extAuthInfoSz > 0) {
  10587. x509->authInfo = (byte*)XMALLOC(dCert->extAuthInfoSz, x509->heap,
  10588. DYNAMIC_TYPE_X509_EXT);
  10589. if (x509->authInfo != NULL) {
  10590. XMEMCPY(x509->authInfo, dCert->extAuthInfo, dCert->extAuthInfoSz);
  10591. x509->authInfoSz = dCert->extAuthInfoSz;
  10592. }
  10593. else {
  10594. ret = MEMORY_E;
  10595. }
  10596. }
  10597. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  10598. if (dCert->extAuthInfoCaIssuer != NULL && dCert->extAuthInfoCaIssuerSz > 0) {
  10599. x509->authInfoCaIssuer = (byte*)XMALLOC(dCert->extAuthInfoCaIssuerSz, x509->heap,
  10600. DYNAMIC_TYPE_X509_EXT);
  10601. if (x509->authInfoCaIssuer != NULL) {
  10602. XMEMCPY(x509->authInfoCaIssuer, dCert->extAuthInfoCaIssuer, dCert->extAuthInfoCaIssuerSz);
  10603. x509->authInfoCaIssuerSz = dCert->extAuthInfoCaIssuerSz;
  10604. }
  10605. else {
  10606. ret = MEMORY_E;
  10607. }
  10608. }
  10609. #endif
  10610. x509->basicConstSet = dCert->extBasicConstSet;
  10611. x509->basicConstCrit = dCert->extBasicConstCrit;
  10612. x509->basicConstPlSet = dCert->pathLengthSet;
  10613. x509->subjAltNameSet = dCert->extSubjAltNameSet;
  10614. x509->subjAltNameCrit = dCert->extSubjAltNameCrit;
  10615. x509->authKeyIdSet = dCert->extAuthKeyIdSet;
  10616. x509->authKeyIdCrit = dCert->extAuthKeyIdCrit;
  10617. if (dCert->extAuthKeyIdSrc != NULL && dCert->extAuthKeyIdSz != 0) {
  10618. #ifdef WOLFSSL_AKID_NAME
  10619. if (dCert->extRawAuthKeyIdSrc != NULL &&
  10620. dCert->extAuthKeyIdSrc > dCert->extRawAuthKeyIdSrc &&
  10621. dCert->extAuthKeyIdSrc <
  10622. (dCert->extRawAuthKeyIdSrc + dCert->extRawAuthKeyIdSz)) {
  10623. /* Confirmed: extAuthKeyIdSrc points inside extRawAuthKeyIdSrc */
  10624. x509->authKeyIdSrc = (byte*)XMALLOC(dCert->extRawAuthKeyIdSz,
  10625. x509->heap, DYNAMIC_TYPE_X509_EXT);
  10626. if (x509->authKeyIdSrc != NULL) {
  10627. XMEMCPY(x509->authKeyIdSrc, dCert->extRawAuthKeyIdSrc,
  10628. dCert->extRawAuthKeyIdSz);
  10629. x509->authKeyIdSrcSz = dCert->extRawAuthKeyIdSz;
  10630. /* Set authKeyId to same offset inside authKeyIdSrc */
  10631. x509->authKeyId = x509->authKeyIdSrc +
  10632. (dCert->extAuthKeyIdSrc - dCert->extRawAuthKeyIdSrc);
  10633. x509->authKeyIdSz = dCert->extAuthKeyIdSz;
  10634. }
  10635. else
  10636. ret = MEMORY_E;
  10637. }
  10638. #else
  10639. x509->authKeyId = (byte*)XMALLOC(dCert->extAuthKeyIdSz, x509->heap,
  10640. DYNAMIC_TYPE_X509_EXT);
  10641. if (x509->authKeyId != NULL) {
  10642. XMEMCPY(x509->authKeyId,
  10643. dCert->extAuthKeyIdSrc, dCert->extAuthKeyIdSz);
  10644. x509->authKeyIdSz = dCert->extAuthKeyIdSz;
  10645. }
  10646. #endif
  10647. else
  10648. ret = MEMORY_E;
  10649. }
  10650. x509->subjKeyIdSet = dCert->extSubjKeyIdSet;
  10651. x509->subjKeyIdCrit = dCert->extSubjKeyIdCrit;
  10652. if (dCert->extSubjKeyIdSrc != NULL && dCert->extSubjKeyIdSz != 0) {
  10653. x509->subjKeyId = (byte*)XMALLOC(dCert->extSubjKeyIdSz, x509->heap,
  10654. DYNAMIC_TYPE_X509_EXT);
  10655. if (x509->subjKeyId != NULL) {
  10656. XMEMCPY(x509->subjKeyId,
  10657. dCert->extSubjKeyIdSrc, dCert->extSubjKeyIdSz);
  10658. x509->subjKeyIdSz = dCert->extSubjKeyIdSz;
  10659. }
  10660. else
  10661. ret = MEMORY_E;
  10662. }
  10663. x509->keyUsageSet = dCert->extKeyUsageSet;
  10664. x509->keyUsageCrit = dCert->extKeyUsageCrit;
  10665. if (dCert->extExtKeyUsageSrc != NULL && dCert->extExtKeyUsageSz > 0) {
  10666. x509->extKeyUsageSrc = (byte*)XMALLOC(dCert->extExtKeyUsageSz,
  10667. x509->heap, DYNAMIC_TYPE_X509_EXT);
  10668. if (x509->extKeyUsageSrc != NULL) {
  10669. XMEMCPY(x509->extKeyUsageSrc, dCert->extExtKeyUsageSrc,
  10670. dCert->extExtKeyUsageSz);
  10671. x509->extKeyUsage = dCert->extExtKeyUsage;
  10672. x509->extKeyUsageSz = dCert->extExtKeyUsageSz;
  10673. x509->extKeyUsageCrit = dCert->extExtKeyUsageCrit;
  10674. x509->extKeyUsageCount = dCert->extExtKeyUsageCount;
  10675. }
  10676. else {
  10677. ret = MEMORY_E;
  10678. }
  10679. }
  10680. #ifndef IGNORE_NETSCAPE_CERT_TYPE
  10681. x509->nsCertType = dCert->nsCertType;
  10682. #endif
  10683. #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT)
  10684. x509->certPolicySet = dCert->extCertPolicySet;
  10685. x509->certPolicyCrit = dCert->extCertPolicyCrit;
  10686. #endif /* WOLFSSL_SEP || WOLFSSL_QT */
  10687. #ifdef WOLFSSL_CERT_EXT
  10688. {
  10689. int i;
  10690. for (i = 0; i < dCert->extCertPoliciesNb && i < MAX_CERTPOL_NB; i++)
  10691. XMEMCPY(x509->certPolicies[i], dCert->extCertPolicies[i],
  10692. MAX_CERTPOL_SZ);
  10693. x509->certPoliciesNb = dCert->extCertPoliciesNb;
  10694. }
  10695. #endif /* WOLFSSL_CERT_EXT */
  10696. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  10697. #ifdef OPENSSL_ALL
  10698. if (dCert->extSubjAltNameSrc != NULL && dCert->extSubjAltNameSz != 0) {
  10699. x509->subjAltNameSrc = (byte*)XMALLOC(dCert->extSubjAltNameSz, x509->heap,
  10700. DYNAMIC_TYPE_X509_EXT);
  10701. if (x509->subjAltNameSrc != NULL) {
  10702. XMEMCPY(x509->subjAltNameSrc,
  10703. dCert->extSubjAltNameSrc, dCert->extSubjAltNameSz);
  10704. x509->subjAltNameSz = dCert->extSubjAltNameSz;
  10705. }
  10706. else
  10707. ret = MEMORY_E;
  10708. }
  10709. #endif
  10710. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  10711. x509->pkCurveOID = dCert->pkCurveOID;
  10712. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  10713. return ret;
  10714. }
  10715. #endif /* KEEP_PEER_CERT || SESSION_CERTS */
  10716. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  10717. (defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && !defined(WOLFSSL_NO_TLS12))
  10718. static int ProcessCSR(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  10719. word32 status_length)
  10720. {
  10721. int ret = 0;
  10722. OcspRequest* request;
  10723. #ifdef WOLFSSL_SMALL_STACK
  10724. CertStatus* status;
  10725. OcspEntry* single;
  10726. OcspResponse* response;
  10727. #else
  10728. CertStatus status[1];
  10729. OcspEntry single[1];
  10730. OcspResponse response[1];
  10731. #endif
  10732. WOLFSSL_ENTER("ProcessCSR");
  10733. do {
  10734. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  10735. if (ssl->status_request) {
  10736. request = (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
  10737. ssl->status_request = 0;
  10738. break;
  10739. }
  10740. #endif
  10741. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  10742. if (ssl->status_request_v2) {
  10743. request = (OcspRequest*)TLSX_CSR2_GetRequest(ssl->extensions,
  10744. WOLFSSL_CSR2_OCSP, 0);
  10745. ssl->status_request_v2 = 0;
  10746. break;
  10747. }
  10748. #endif
  10749. return BUFFER_ERROR;
  10750. } while(0);
  10751. if (request == NULL)
  10752. return BAD_CERTIFICATE_STATUS_ERROR; /* not expected */
  10753. #ifdef WOLFSSL_SMALL_STACK
  10754. status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
  10755. DYNAMIC_TYPE_OCSP_STATUS);
  10756. single = (OcspEntry*)XMALLOC(sizeof(OcspEntry), ssl->heap,
  10757. DYNAMIC_TYPE_OCSP_ENTRY);
  10758. response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
  10759. DYNAMIC_TYPE_OCSP_REQUEST);
  10760. if (status == NULL || single == NULL || response == NULL) {
  10761. if (status)
  10762. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  10763. if (single)
  10764. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  10765. if (response)
  10766. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  10767. return MEMORY_ERROR;
  10768. }
  10769. #endif
  10770. InitOcspResponse(response, single, status, input +*inOutIdx, status_length, ssl->heap);
  10771. if (OcspResponseDecode(response, SSL_CM(ssl), ssl->heap, 0) != 0)
  10772. ret = BAD_CERTIFICATE_STATUS_ERROR;
  10773. else if (CompareOcspReqResp(request, response) != 0)
  10774. ret = BAD_CERTIFICATE_STATUS_ERROR;
  10775. else if (response->responseStatus != OCSP_SUCCESSFUL)
  10776. ret = BAD_CERTIFICATE_STATUS_ERROR;
  10777. else if (response->single->status->status == CERT_REVOKED)
  10778. ret = OCSP_CERT_REVOKED;
  10779. else if (response->single->status->status != CERT_GOOD)
  10780. ret = BAD_CERTIFICATE_STATUS_ERROR;
  10781. else {
  10782. XMEMCPY(ssl->ocspProducedDate, response->producedDate, sizeof ssl->ocspProducedDate);
  10783. ssl->ocspProducedDateFormat = response->producedDateFormat;
  10784. }
  10785. *inOutIdx += status_length;
  10786. FreeOcspResponse(response);
  10787. #ifdef WOLFSSL_SMALL_STACK
  10788. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  10789. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  10790. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  10791. #endif
  10792. WOLFSSL_LEAVE("ProcessCSR", ret);
  10793. return ret;
  10794. }
  10795. #endif
  10796. #ifdef HAVE_PK_CALLBACKS
  10797. #ifdef HAVE_ECC
  10798. static int SigPkCbEccVerify(const unsigned char* sig, unsigned int sigSz,
  10799. const unsigned char* hash, unsigned int hashSz,
  10800. const unsigned char* keyDer, unsigned int keySz,
  10801. int* result, void* ctx)
  10802. {
  10803. int ret = NOT_COMPILED_IN;
  10804. WOLFSSL* ssl = (WOLFSSL*)ctx;
  10805. if (ssl && ssl->ctx->EccVerifyCb) {
  10806. ret = ssl->ctx->EccVerifyCb(ssl, sig, sigSz, hash, hashSz,
  10807. keyDer, keySz, result, ssl->EccVerifyCtx);
  10808. }
  10809. return ret;
  10810. }
  10811. #endif
  10812. #ifndef NO_RSA
  10813. static int SigPkCbRsaVerify(unsigned char* sig, unsigned int sigSz,
  10814. unsigned char** out, const unsigned char* keyDer, unsigned int keySz,
  10815. void* ctx)
  10816. {
  10817. int ret = NOT_COMPILED_IN;
  10818. WOLFSSL* ssl = (WOLFSSL*)ctx;
  10819. if (ssl && ssl->ctx->RsaVerifyCb) {
  10820. ret = ssl->ctx->RsaVerifyCb(ssl, sig, sigSz, out, keyDer, keySz,
  10821. ssl->RsaVerifyCtx);
  10822. }
  10823. return ret;
  10824. }
  10825. #endif
  10826. int InitSigPkCb(WOLFSSL* ssl, SignatureCtx* sigCtx)
  10827. {
  10828. if (ssl == NULL || sigCtx == NULL)
  10829. return BAD_FUNC_ARG;
  10830. /* only setup the verify callback if a PK is set */
  10831. #ifdef HAVE_ECC
  10832. #if defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_TSIP_TLS)
  10833. sigCtx->pkCbEcc = Renesas_cmn_SigPkCbEccVerify;
  10834. sigCtx->pkCtxEcc = (void*)&sigCtx->CertAtt;
  10835. (void)SigPkCbEccVerify;
  10836. #else
  10837. if (ssl->ctx->EccVerifyCb) {
  10838. sigCtx->pkCbEcc = SigPkCbEccVerify;
  10839. sigCtx->pkCtxEcc = ssl;
  10840. }
  10841. #endif
  10842. #endif
  10843. #ifndef NO_RSA
  10844. /* only setup the verify callback if a PK is set */
  10845. #if defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_TSIP_TLS)
  10846. sigCtx->pkCbRsa = Renesas_cmn_SigPkCbRsaVerify;
  10847. sigCtx->pkCtxRsa = (void*)&sigCtx->CertAtt;
  10848. (void)SigPkCbRsaVerify;
  10849. #else
  10850. if (ssl->ctx->RsaVerifyCb) {
  10851. sigCtx->pkCbRsa = SigPkCbRsaVerify;
  10852. sigCtx->pkCtxRsa = ssl;
  10853. }
  10854. #endif
  10855. #endif
  10856. return 0;
  10857. }
  10858. #endif /* HAVE_PK_CALLBACKS */
  10859. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  10860. void DoCertFatalAlert(WOLFSSL* ssl, int ret)
  10861. {
  10862. int alertWhy;
  10863. if (ssl == NULL || ret == 0) {
  10864. return;
  10865. }
  10866. WOLFSSL_ERROR(ret);
  10867. /* Determine alert reason */
  10868. alertWhy = bad_certificate;
  10869. if (ret == ASN_AFTER_DATE_E || ret == ASN_BEFORE_DATE_E) {
  10870. alertWhy = certificate_expired;
  10871. } else if (ret == ASN_NO_SIGNER_E) {
  10872. alertWhy = unknown_ca;
  10873. }
  10874. #ifdef OPENSSL_EXTRA
  10875. else if (ret == CRL_CERT_REVOKED) {
  10876. alertWhy = certificate_revoked;
  10877. }
  10878. #endif
  10879. else if (ret == NO_PEER_CERT) {
  10880. #ifdef WOLFSSL_TLS13
  10881. if (ssl->options.tls1_3) {
  10882. alertWhy = certificate_required;
  10883. }
  10884. else
  10885. #endif
  10886. {
  10887. alertWhy = handshake_failure;
  10888. }
  10889. }
  10890. /* send fatal alert and mark connection closed */
  10891. SendAlert(ssl, alert_fatal, alertWhy); /* try to send */
  10892. ssl->options.isClosed = 1;
  10893. }
  10894. /* WOLFSSL_ALWAYS_VERIFY_CB: Use verify callback for success or failure cases */
  10895. /* WOLFSSL_VERIFY_CB_ALL_CERTS: Issue callback for all intermediate certificates */
  10896. /* Callback is issued for certificate presented in TLS Certificate (11) packet.
  10897. * The intermediates are done first then peer leaf cert last. Use the
  10898. * store->error_depth member to determine index (0=peer, >1 intermediates)
  10899. */
  10900. int DoVerifyCallback(WOLFSSL_CERT_MANAGER* cm, WOLFSSL* ssl, int ret,
  10901. ProcPeerCertArgs* args)
  10902. {
  10903. int verify_ok = 0, use_cb = 0;
  10904. void *heap;
  10905. if (cm == NULL) {
  10906. return BAD_FUNC_ARG;
  10907. }
  10908. heap = (ssl != NULL) ? ssl->heap : cm->heap;
  10909. /* Determine if verify was okay */
  10910. if (ret == 0) {
  10911. verify_ok = 1;
  10912. }
  10913. /* Determine if verify callback should be used */
  10914. if (ret != 0) {
  10915. if ((ssl != NULL) && (!ssl->options.verifyNone)) {
  10916. use_cb = 1; /* always report errors */
  10917. }
  10918. }
  10919. #ifdef WOLFSSL_ALWAYS_VERIFY_CB
  10920. /* always use verify callback on peer leaf cert */
  10921. if (args->certIdx == 0) {
  10922. use_cb = 1;
  10923. }
  10924. #endif
  10925. #ifdef WOLFSSL_VERIFY_CB_ALL_CERTS
  10926. /* perform verify callback on other intermediate certs (not just peer) */
  10927. if (args->certIdx > 0) {
  10928. use_cb = 1;
  10929. }
  10930. #endif
  10931. #if defined(OPENSSL_EXTRA)
  10932. /* Perform domain and IP check only for the leaf certificate */
  10933. if (args->certIdx == 0) {
  10934. /* perform domain name check on the peer certificate */
  10935. if (args->dCertInit && args->dCert && (ssl != NULL) &&
  10936. ssl->param && ssl->param->hostName[0]) {
  10937. /* If altNames names is present, then subject common name is ignored */
  10938. if (args->dCert->altNames != NULL) {
  10939. if (CheckForAltNames(args->dCert, ssl->param->hostName, NULL) != 1) {
  10940. if (ret == 0) {
  10941. ret = DOMAIN_NAME_MISMATCH;
  10942. WOLFSSL_ERROR_VERBOSE(ret);
  10943. }
  10944. }
  10945. }
  10946. #ifndef WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY
  10947. else {
  10948. if (args->dCert->subjectCN) {
  10949. if (MatchDomainName(args->dCert->subjectCN,
  10950. args->dCert->subjectCNLen,
  10951. ssl->param->hostName) == 0) {
  10952. if (ret == 0) {
  10953. ret = DOMAIN_NAME_MISMATCH;
  10954. WOLFSSL_ERROR_VERBOSE(ret);
  10955. }
  10956. }
  10957. }
  10958. }
  10959. #else
  10960. else {
  10961. if (ret == 0) {
  10962. ret = DOMAIN_NAME_MISMATCH;
  10963. WOLFSSL_ERROR_VERBOSE(ret);
  10964. }
  10965. }
  10966. #endif /* !WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY */
  10967. }
  10968. /* perform IP address check on the peer certificate */
  10969. if ((args->dCertInit != 0) && (args->dCert != NULL) && (ssl != NULL) &&
  10970. (ssl->param != NULL) && (XSTRLEN(ssl->param->ipasc) > 0)) {
  10971. if (CheckIPAddr(args->dCert, ssl->param->ipasc) != 0) {
  10972. if (ret == 0) {
  10973. ret = IPADDR_MISMATCH;
  10974. WOLFSSL_ERROR_VERBOSE(ret);
  10975. }
  10976. }
  10977. }
  10978. }
  10979. #endif
  10980. /* if verify callback has been set */
  10981. if ((use_cb && (ssl != NULL) && ((ssl->verifyCallback != NULL)
  10982. #ifdef OPENSSL_ALL
  10983. || (ssl->ctx->verifyCertCb != NULL)
  10984. #endif
  10985. ))
  10986. #ifndef NO_WOLFSSL_CM_VERIFY
  10987. || (cm->verifyCallback != NULL)
  10988. #endif
  10989. ) {
  10990. int verifyFail = 0;
  10991. #ifdef WOLFSSL_SMALL_STACK
  10992. WOLFSSL_X509_STORE_CTX* store;
  10993. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10994. WOLFSSL_X509* x509;
  10995. #endif
  10996. char* domain = NULL;
  10997. #else
  10998. WOLFSSL_X509_STORE_CTX store[1];
  10999. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11000. WOLFSSL_X509 x509[1];
  11001. #endif
  11002. char domain[ASN_NAME_MAX];
  11003. #endif
  11004. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11005. int x509Free = 0;
  11006. #endif
  11007. #ifdef WOLFSSL_SMALL_STACK
  11008. store = (WOLFSSL_X509_STORE_CTX*)XMALLOC(
  11009. sizeof(WOLFSSL_X509_STORE_CTX), heap, DYNAMIC_TYPE_X509_STORE);
  11010. if (store == NULL) {
  11011. return MEMORY_E;
  11012. }
  11013. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11014. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  11015. DYNAMIC_TYPE_X509);
  11016. if (x509 == NULL) {
  11017. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  11018. return MEMORY_E;
  11019. }
  11020. #endif
  11021. domain = (char*)XMALLOC(ASN_NAME_MAX, heap, DYNAMIC_TYPE_STRING);
  11022. if (domain == NULL) {
  11023. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  11024. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11025. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  11026. #endif
  11027. return MEMORY_E;
  11028. }
  11029. #endif /* WOLFSSL_SMALL_STACK */
  11030. XMEMSET(store, 0, sizeof(WOLFSSL_X509_STORE_CTX));
  11031. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11032. XMEMSET(x509, 0, sizeof(WOLFSSL_X509));
  11033. #endif
  11034. domain[0] = '\0';
  11035. /* build subject CN as string to return in store */
  11036. if (args->dCertInit && args->dCert && args->dCert->subjectCN) {
  11037. int subjectCNLen = args->dCert->subjectCNLen;
  11038. if (subjectCNLen > ASN_NAME_MAX-1)
  11039. subjectCNLen = ASN_NAME_MAX-1;
  11040. if (subjectCNLen > 0) {
  11041. XMEMCPY(domain, args->dCert->subjectCN, subjectCNLen);
  11042. domain[subjectCNLen] = '\0';
  11043. }
  11044. }
  11045. #ifndef OPENSSL_COMPATIBLE_DEFAULTS
  11046. store->error = ret;
  11047. #else
  11048. store->error = GetX509Error(ret);
  11049. #endif
  11050. store->error_depth = args->certIdx;
  11051. store->discardSessionCerts = 0;
  11052. store->domain = domain;
  11053. if (ssl != NULL) {
  11054. if (ssl->verifyCbCtx != NULL) {
  11055. /* Use the WOLFSSL user context if set */
  11056. store->userCtx = ssl->verifyCbCtx;
  11057. }
  11058. else {
  11059. /* Else use the WOLFSSL_CTX user context */
  11060. store->userCtx = ssl->ctx->verifyCbCtx;
  11061. }
  11062. }
  11063. else {
  11064. store->userCtx = cm;
  11065. }
  11066. store->certs = args->certs;
  11067. store->totalCerts = args->totalCerts;
  11068. #if defined(HAVE_EX_DATA) && \
  11069. (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  11070. if (wolfSSL_CRYPTO_set_ex_data(&store->ex_data, 0, ssl)
  11071. != WOLFSSL_SUCCESS) {
  11072. WOLFSSL_MSG("Failed to store ssl context in WOLFSSL_X509_STORE_CTX");
  11073. }
  11074. #endif
  11075. if (ssl != NULL) {
  11076. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  11077. store->store = SSL_STORE(ssl);
  11078. #if defined(OPENSSL_EXTRA)
  11079. store->depth = args->count;
  11080. store->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  11081. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  11082. heap, DYNAMIC_TYPE_OPENSSL);
  11083. if (store->param == NULL) {
  11084. #ifdef WOLFSSL_SMALL_STACK
  11085. XFREE(domain, heap, DYNAMIC_TYPE_STRING);
  11086. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11087. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  11088. #endif
  11089. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  11090. #endif
  11091. return MEMORY_E;
  11092. }
  11093. XMEMSET(store->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  11094. /* Overwrite with non-default param values in SSL */
  11095. if (ssl->param) {
  11096. if (ssl->param->check_time)
  11097. store->param->check_time = ssl->param->check_time;
  11098. if (ssl->param->flags)
  11099. store->param->flags = ssl->param->flags;
  11100. if (ssl->param->hostName[0])
  11101. XMEMCPY(store->param->hostName, ssl->param->hostName,
  11102. WOLFSSL_HOST_NAME_MAX);
  11103. }
  11104. #endif /* defined(OPENSSL_EXTRA) */
  11105. #endif /* defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)*/
  11106. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11107. #ifdef KEEP_PEER_CERT
  11108. if (args->certIdx == 0) {
  11109. store->current_cert = &ssl->peerCert; /* use existing X509 */
  11110. }
  11111. else
  11112. #endif
  11113. {
  11114. InitX509(x509, 0, heap);
  11115. if (CopyDecodedToX509(x509, args->dCert) == 0) {
  11116. store->current_cert = x509;
  11117. x509Free = 1;
  11118. }
  11119. else {
  11120. FreeX509(x509);
  11121. }
  11122. }
  11123. #endif
  11124. #ifdef SESSION_CERTS
  11125. store->sesChain = &ssl->session->chain;
  11126. #endif
  11127. }
  11128. #ifndef NO_WOLFSSL_CM_VERIFY
  11129. /* non-zero return code indicates failure override */
  11130. if (cm->verifyCallback != NULL) {
  11131. store->userCtx = cm;
  11132. if (cm->verifyCallback(verify_ok, store)) {
  11133. if (ret != 0) {
  11134. WOLFSSL_MSG("Verify CM callback overriding error!");
  11135. ret = 0;
  11136. }
  11137. }
  11138. else {
  11139. verifyFail = 1;
  11140. }
  11141. }
  11142. #endif
  11143. if (ssl != NULL) {
  11144. #ifdef OPENSSL_ALL
  11145. /* non-zero return code indicates failure override */
  11146. if (ssl->ctx->verifyCertCb) {
  11147. if (ssl->ctx->verifyCertCb(store, ssl->ctx->verifyCertCbArg)) {
  11148. if (ret != 0) {
  11149. WOLFSSL_MSG("Verify Cert callback overriding error!");
  11150. ret = 0;
  11151. }
  11152. }
  11153. else {
  11154. verifyFail = 1;
  11155. }
  11156. }
  11157. #endif
  11158. /* non-zero return code indicates failure override */
  11159. if (ssl->verifyCallback) {
  11160. if (ssl->verifyCallback(verify_ok, store)) {
  11161. if (ret != 0) {
  11162. WOLFSSL_MSG("Verify callback overriding error!");
  11163. ret = 0;
  11164. }
  11165. }
  11166. else {
  11167. verifyFail = 1;
  11168. }
  11169. }
  11170. }
  11171. if (verifyFail) {
  11172. /* induce error if one not present */
  11173. if (ret == 0) {
  11174. ret = VERIFY_CERT_ERROR;
  11175. WOLFSSL_ERROR_VERBOSE(ret);
  11176. }
  11177. /* mark as verify error */
  11178. args->verifyErr = 1;
  11179. }
  11180. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11181. if (x509Free) {
  11182. FreeX509(x509);
  11183. }
  11184. #endif
  11185. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  11186. wolfSSL_sk_X509_pop_free(store->chain, NULL);
  11187. store->chain = NULL;
  11188. #endif
  11189. #ifdef SESSION_CERTS
  11190. if ((ssl != NULL) && (store->discardSessionCerts)) {
  11191. WOLFSSL_MSG("Verify callback requested discard sess certs");
  11192. ssl->session->chain.count = 0;
  11193. #ifdef WOLFSSL_ALT_CERT_CHAINS
  11194. ssl->session->altChain.count = 0;
  11195. #endif
  11196. }
  11197. #endif /* SESSION_CERTS */
  11198. #ifdef OPENSSL_EXTRA
  11199. if ((ssl != NULL) && (store->param)) {
  11200. XFREE(store->param, heap, DYNAMIC_TYPE_OPENSSL);
  11201. }
  11202. #endif
  11203. #ifdef WOLFSSL_SMALL_STACK
  11204. XFREE(domain, heap, DYNAMIC_TYPE_STRING);
  11205. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11206. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  11207. #endif
  11208. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  11209. #endif
  11210. }
  11211. (void)heap;
  11212. return ret;
  11213. }
  11214. static void FreeProcPeerCertArgs(WOLFSSL* ssl, void* pArgs)
  11215. {
  11216. ProcPeerCertArgs* args = (ProcPeerCertArgs*)pArgs;
  11217. (void)ssl;
  11218. if (args->certs) {
  11219. XFREE(args->certs, ssl->heap, DYNAMIC_TYPE_DER);
  11220. args->certs = NULL;
  11221. }
  11222. #ifdef WOLFSSL_TLS13
  11223. if (args->exts) {
  11224. XFREE(args->exts, ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  11225. args->exts = NULL;
  11226. }
  11227. #endif
  11228. if (args->dCert) {
  11229. if (args->dCertInit) {
  11230. FreeDecodedCert(args->dCert);
  11231. args->dCertInit = 0;
  11232. }
  11233. XFREE(args->dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
  11234. args->dCert = NULL;
  11235. }
  11236. }
  11237. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
  11238. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
  11239. !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  11240. /* load certificate file which has the form <hash>.(r)N[0..N] */
  11241. /* in the folder. */
  11242. /* (r), in the case of CRL file */
  11243. /* @param store a pointer to X509_STORE structure */
  11244. /* @param issuer a pointer to X509_NAME that presents an issuer */
  11245. /* @param type X509_LU_X509 or X509_LU_CRL */
  11246. /* @return WOLFSSL_SUCCESS on successful, otherwise WOLFSSL_FAILURE */
  11247. int LoadCertByIssuer(WOLFSSL_X509_STORE* store, X509_NAME* issuer, int type)
  11248. {
  11249. const int MAX_SUFFIX = 10;/* The number comes from CA_TABLE_SIZE=10 */
  11250. int ret = WOLFSSL_SUCCESS;
  11251. WOLFSSL_X509_LOOKUP* lookup;
  11252. WOLFSSL_BY_DIR_entry* entry;
  11253. WOLFSSL_BY_DIR_HASH hash_tmp;
  11254. WOLFSSL_BY_DIR_HASH* ph = NULL;
  11255. WOLFSSL_X509* x509;
  11256. unsigned long hash = 0;
  11257. char* filename = NULL;
  11258. const char* post = "";
  11259. byte* pbuf = NULL;
  11260. int len, num, i, idx;
  11261. int suffix = 0;
  11262. int retHash = NOT_COMPILED_IN;
  11263. byte dgt[WC_MAX_DIGEST_SIZE];
  11264. WOLFSSL_ENTER("LoadCertByIssuer");
  11265. /* sanity check */
  11266. if (store == NULL || issuer == NULL || (type != X509_LU_X509 && type != X509_LU_CRL)) {
  11267. return WOLFSSL_FAILURE;
  11268. }
  11269. lookup = &store->lookup;
  11270. if (lookup->dirs == NULL || lookup->type != 1) {
  11271. return WOLFSSL_FAILURE;
  11272. }
  11273. len = wolfSSL_i2d_X509_NAME_canon(issuer, &pbuf);
  11274. if (len > 0) {
  11275. #ifndef NO_SHA
  11276. retHash = wc_ShaHash((const byte*)pbuf, len, dgt);
  11277. #endif
  11278. if (retHash == 0) {
  11279. /* 4 bytes in little endian as unsigned long */
  11280. hash = (((unsigned long)dgt[3] << 24) |
  11281. ((unsigned long)dgt[2] << 16) |
  11282. ((unsigned long)dgt[1] << 8) |
  11283. ((unsigned long)dgt[0]));
  11284. } else {
  11285. WOLFSSL_MSG("failed hash operation");
  11286. return WOLFSSL_FAILURE;
  11287. }
  11288. wolfSSL_OPENSSL_free(pbuf);
  11289. }
  11290. /* try to load each hashed name file in path */
  11291. #if !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  11292. if (type == X509_LU_CRL) {
  11293. post = "r";
  11294. }
  11295. num = wolfSSL_sk_BY_DIR_entry_num(lookup->dirs->dir_entry);
  11296. for (i=0; i<num; i++) {
  11297. entry = wolfSSL_sk_BY_DIR_entry_value(lookup->dirs->dir_entry, i);
  11298. if (type == X509_LU_CRL && entry->hashes != NULL &&
  11299. wolfSSL_sk_BY_DIR_HASH_num(entry->hashes) > 0) {
  11300. /* lock the list */
  11301. if (wc_LockMutex(&lookup->dirs->lock) != 0) {
  11302. WOLFSSL_MSG("wc_LockMutex cdir Lock error");
  11303. return BAD_MUTEX_E;
  11304. }
  11305. hash_tmp.hash_value = hash;
  11306. idx = wolfSSL_sk_BY_DIR_HASH_find(entry->hashes, &hash_tmp);
  11307. if (idx >= 0) {
  11308. WOLFSSL_MSG("find hashed CRL in list");
  11309. ph = wolfSSL_sk_BY_DIR_HASH_value(entry->hashes, idx);
  11310. suffix = ph->last_suffix;
  11311. } else {
  11312. ph = NULL;
  11313. suffix = 0;
  11314. }
  11315. wc_UnLockMutex(&lookup->dirs->lock);
  11316. }
  11317. /* Additional buffer length for file name memory allocation : */
  11318. /* / <hashvalue>.(r)N\0 */
  11319. /*|1| 8 |1|1|1|1| => 13 */
  11320. len = (int)XSTRLEN(entry->dir_name) + 13;
  11321. if (filename != NULL) {
  11322. XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
  11323. }
  11324. filename = (char*)XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
  11325. if (filename == NULL) {
  11326. WOLFSSL_MSG("memory allocation error");
  11327. return MEMORY_E;
  11328. }
  11329. /* set as FAILURE, if successfully loading cert of CRL, this becomes */
  11330. /* WOLFSSL_SUCCESS */
  11331. ret = WOLFSSL_FAILURE;
  11332. for (; suffix < MAX_SUFFIX; suffix++) {
  11333. /* /folder-path/<hash>.(r)N[0..9] */
  11334. if (XSNPRINTF(filename, len, "%s/%08lx.%s%d", entry->dir_name,
  11335. hash, post, suffix)
  11336. >= len)
  11337. {
  11338. WOLFSSL_MSG("buffer overrun in LoadCertByIssuer");
  11339. ret = BUFFER_E;
  11340. break;
  11341. }
  11342. if(wc_FileExists(filename) == 0/*0 file exists */) {
  11343. if (type == X509_LU_X509) {
  11344. x509 = wolfSSL_X509_load_certificate_file(filename,
  11345. WOLFSSL_FILETYPE_PEM);
  11346. if (x509 != NULL) {
  11347. ret = wolfSSL_X509_STORE_add_cert(store, x509);
  11348. wolfSSL_X509_free(x509);
  11349. } else {
  11350. WOLFSSL_MSG("failed to load certificate");
  11351. ret = WOLFSSL_FAILURE;
  11352. break;
  11353. }
  11354. }
  11355. else if (type == X509_LU_CRL) {
  11356. #if defined(HAVE_CRL)
  11357. ret = wolfSSL_X509_load_crl_file(&store->lookup, filename,
  11358. entry->dir_type);
  11359. if (ret != WOLFSSL_SUCCESS) {
  11360. WOLFSSL_MSG("failed to load CRL");
  11361. break;
  11362. }
  11363. #else
  11364. WOLFSSL_MSG("CRL is not supported");
  11365. ret = WOLFSSL_FAILURE;
  11366. break;
  11367. #endif /* HAVE_CRL */
  11368. }
  11369. } else
  11370. break;
  11371. }
  11372. if (ret != WOLFSSL_SUCCESS) {
  11373. WOLFSSL_MSG("not found file");
  11374. ret = WOLFSSL_FAILURE;
  11375. } else {
  11376. if (type == X509_LU_CRL) {
  11377. if (wc_LockMutex(&lookup->dirs->lock) != 0) {
  11378. WOLFSSL_MSG("wc_LockMutex cdir Lock error");
  11379. XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
  11380. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  11381. return BAD_MUTEX_E;
  11382. }
  11383. if (ph == NULL) {
  11384. ph = wolfSSL_BY_DIR_HASH_new();
  11385. if (ph == NULL) {
  11386. WOLFSSL_MSG("failed to allocate hash stack");
  11387. ret = WOLFSSL_FAILURE;
  11388. } else {
  11389. ph->hash_value = hash;
  11390. ph->last_suffix = suffix;
  11391. ret = wolfSSL_sk_BY_DIR_HASH_push(entry->hashes, ph);
  11392. }
  11393. }
  11394. wc_UnLockMutex(&lookup->dirs->lock);
  11395. }
  11396. }
  11397. XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
  11398. }
  11399. #else
  11400. (void) type;
  11401. (void) ret;
  11402. (void) x509;
  11403. (void) filename;
  11404. (void) suffix;
  11405. (void) num;
  11406. (void) i;
  11407. ret = WOLFSSL_NOT_IMPLEMENTED;
  11408. #endif
  11409. WOLFSSL_LEAVE("LoadCertByIssuer", ret);
  11410. return ret;
  11411. }
  11412. #endif
  11413. static int ProcessPeerCertParse(WOLFSSL* ssl, ProcPeerCertArgs* args,
  11414. int certType, int verify, byte** pSubjectHash, int* pAlreadySigner)
  11415. {
  11416. int ret = 0;
  11417. buffer* cert;
  11418. byte* subjectHash = NULL;
  11419. int alreadySigner = 0;
  11420. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  11421. int sigRet = 0;
  11422. #endif
  11423. if (ssl == NULL || args == NULL
  11424. #ifndef WOLFSSL_SMALL_CERT_VERIFY
  11425. || args->dCert == NULL
  11426. #endif
  11427. ) {
  11428. return BAD_FUNC_ARG;
  11429. }
  11430. PRAGMA_GCC_DIAG_PUSH
  11431. PRAGMA_GCC("GCC diagnostic ignored \"-Wstrict-overflow\"")
  11432. /* Surrounded in gcc pragma to avoid -Werror=strict-overflow when the
  11433. * compiler optimizes out the check and assumes no underflow. Keeping the
  11434. * check in place to handle multiple build configurations and future
  11435. * changes. */
  11436. /* check to make sure certificate index is valid */
  11437. if (args->certIdx > args->count)
  11438. return BUFFER_E;
  11439. PRAGMA_GCC_DIAG_POP
  11440. /* check if returning from non-blocking OCSP */
  11441. /* skip this section because cert is already initialized and parsed */
  11442. #ifdef WOLFSSL_NONBLOCK_OCSP
  11443. if (args->lastErr == OCSP_WANT_READ) {
  11444. args->lastErr = 0; /* clear error */
  11445. return 0;
  11446. }
  11447. #endif
  11448. #ifdef WOLFSSL_TRUST_PEER_CERT
  11449. /* we have trusted peer */
  11450. if (args->haveTrustPeer) {
  11451. return 0;
  11452. }
  11453. #endif
  11454. /* get certificate buffer */
  11455. cert = &args->certs[args->certIdx];
  11456. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  11457. if (verify == VERIFY) {
  11458. /* for small cert verify, release decoded cert during signature check to
  11459. reduce peak memory usage */
  11460. if (args->dCert != NULL) {
  11461. if (args->dCertInit) {
  11462. FreeDecodedCert(args->dCert);
  11463. args->dCertInit = 0;
  11464. }
  11465. XFREE(args->dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
  11466. args->dCert = NULL;
  11467. }
  11468. /* perform cert parsing and signature check */
  11469. sigRet = CheckCertSignature(cert->buffer, cert->length,
  11470. ssl->heap, SSL_CM(ssl));
  11471. /* fail on errors here after the ParseCertRelative call, so dCert is populated */
  11472. /* verify name only in ParseCertRelative below, signature check done */
  11473. verify = VERIFY_NAME;
  11474. }
  11475. #endif /* WOLFSSL_SMALL_CERT_VERIFY */
  11476. /* make sure the decoded cert structure is allocated and initialized */
  11477. if (!args->dCertInit
  11478. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  11479. || args->dCert == NULL
  11480. #endif
  11481. ) {
  11482. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  11483. if (args->dCert == NULL) {
  11484. args->dCert = (DecodedCert*)XMALLOC(
  11485. sizeof(DecodedCert), ssl->heap,
  11486. DYNAMIC_TYPE_DCERT);
  11487. if (args->dCert == NULL) {
  11488. return MEMORY_E;
  11489. }
  11490. }
  11491. #endif
  11492. InitDecodedCert(args->dCert, cert->buffer, cert->length, ssl->heap);
  11493. args->dCertInit = 1;
  11494. args->dCert->sigCtx.devId = ssl->devId;
  11495. #ifdef WOLFSSL_ASYNC_CRYPT
  11496. args->dCert->sigCtx.asyncCtx = ssl;
  11497. #endif
  11498. #ifdef HAVE_PK_CALLBACKS
  11499. /* setup the PK callback context */
  11500. ret = InitSigPkCb(ssl, &args->dCert->sigCtx);
  11501. if (ret != 0)
  11502. return ret;
  11503. #endif
  11504. }
  11505. /* Parse Certificate */
  11506. ret = ParseCertRelative(args->dCert, certType, verify, SSL_CM(ssl));
  11507. /* perform below checks for date failure cases */
  11508. if (ret == 0 || ret == ASN_BEFORE_DATE_E || ret == ASN_AFTER_DATE_E) {
  11509. /* get subject and determine if already loaded */
  11510. #ifndef NO_SKID
  11511. if (args->dCert->extAuthKeyIdSet)
  11512. subjectHash = args->dCert->extSubjKeyId;
  11513. else
  11514. #endif
  11515. subjectHash = args->dCert->subjectHash;
  11516. alreadySigner = AlreadySigner(SSL_CM(ssl), subjectHash);
  11517. }
  11518. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  11519. /* get signature check failures from above */
  11520. if (ret == 0)
  11521. ret = sigRet;
  11522. #endif
  11523. if (pSubjectHash)
  11524. *pSubjectHash = subjectHash;
  11525. if (pAlreadySigner)
  11526. *pAlreadySigner = alreadySigner;
  11527. #ifdef WOLFSSL_ASYNC_CRYPT
  11528. if (ret == WC_PENDING_E) {
  11529. ret = wolfSSL_AsyncPush(ssl,
  11530. args->dCert->sigCtx.asyncDev);
  11531. }
  11532. #endif
  11533. #if defined(WOLFSSL_PUBLIC_ASN) && defined(HAVE_PK_CALLBACKS)
  11534. /* This block gives the callback a chance to process the peer cert.
  11535. * If there is no callback set or it returns NOT_COMPILED_IN, then the
  11536. * original return code is returned. */
  11537. if (ssl->ctx && ssl->ctx->ProcessPeerCertCb) {
  11538. int new_ret = ssl->ctx->ProcessPeerCertCb(ssl, args->dCert);
  11539. if (new_ret != NOT_COMPILED_IN) {
  11540. ret = new_ret;
  11541. }
  11542. }
  11543. #endif /* WOLFSSL_PUBLIC_ASN && HAVE_PK_CALLBACKS */
  11544. return ret;
  11545. }
  11546. /* Check key sizes for certs. Is redundant check since
  11547. ProcessBuffer also performs this check. */
  11548. static int ProcessPeerCertCheckKey(WOLFSSL* ssl, ProcPeerCertArgs* args)
  11549. {
  11550. int ret = 0;
  11551. if (ssl->options.verifyNone) {
  11552. return ret;
  11553. }
  11554. switch (args->dCert->keyOID) {
  11555. #ifndef NO_RSA
  11556. #ifdef WC_RSA_PSS
  11557. case RSAPSSk:
  11558. #endif
  11559. case RSAk:
  11560. if (ssl->options.minRsaKeySz < 0 ||
  11561. args->dCert->pubKeySize <
  11562. (word16)ssl->options.minRsaKeySz) {
  11563. WOLFSSL_MSG(
  11564. "RSA key size in cert chain error");
  11565. ret = RSA_KEY_SIZE_E;
  11566. WOLFSSL_ERROR_VERBOSE(ret);
  11567. }
  11568. break;
  11569. #endif /* !NO_RSA */
  11570. #ifdef HAVE_ECC
  11571. case ECDSAk:
  11572. if (ssl->options.minEccKeySz < 0 ||
  11573. args->dCert->pubKeySize <
  11574. (word16)ssl->options.minEccKeySz) {
  11575. WOLFSSL_MSG(
  11576. "ECC key size in cert chain error");
  11577. ret = ECC_KEY_SIZE_E;
  11578. WOLFSSL_ERROR_VERBOSE(ret);
  11579. }
  11580. break;
  11581. #endif /* HAVE_ECC */
  11582. #ifdef HAVE_ED25519
  11583. case ED25519k:
  11584. if (ssl->options.minEccKeySz < 0 ||
  11585. ED25519_KEY_SIZE < (word16)ssl->options.minEccKeySz) {
  11586. WOLFSSL_MSG(
  11587. "ECC key size in cert chain error");
  11588. ret = ECC_KEY_SIZE_E;
  11589. WOLFSSL_ERROR_VERBOSE(ret);
  11590. }
  11591. break;
  11592. #endif /* HAVE_ED25519 */
  11593. #ifdef HAVE_ED448
  11594. case ED448k:
  11595. if (ssl->options.minEccKeySz < 0 ||
  11596. ED448_KEY_SIZE < (word16)ssl->options.minEccKeySz) {
  11597. WOLFSSL_MSG(
  11598. "ECC key size in cert chain error");
  11599. ret = ECC_KEY_SIZE_E;
  11600. WOLFSSL_ERROR_VERBOSE(ret);
  11601. }
  11602. break;
  11603. #endif /* HAVE_ED448 */
  11604. #if defined(HAVE_PQC)
  11605. #if defined(HAVE_FALCON)
  11606. case FALCON_LEVEL1k:
  11607. if (ssl->options.minFalconKeySz < 0 ||
  11608. FALCON_LEVEL1_KEY_SIZE < (word16)ssl->options.minFalconKeySz) {
  11609. WOLFSSL_MSG("Falcon key size in cert chain error");
  11610. ret = FALCON_KEY_SIZE_E;
  11611. WOLFSSL_ERROR_VERBOSE(ret);
  11612. }
  11613. break;
  11614. case FALCON_LEVEL5k:
  11615. if (ssl->options.minFalconKeySz < 0 ||
  11616. FALCON_LEVEL5_KEY_SIZE < (word16)ssl->options.minFalconKeySz) {
  11617. WOLFSSL_MSG("Falcon key size in cert chain error");
  11618. ret = FALCON_KEY_SIZE_E;
  11619. WOLFSSL_ERROR_VERBOSE(ret);
  11620. }
  11621. break;
  11622. #endif /* HAVE_FALCON */
  11623. #endif /* HAVE_PQC */
  11624. #if defined(HAVE_DILITHIUM)
  11625. case DILITHIUM_LEVEL2k:
  11626. if (ssl->options.minDilithiumKeySz < 0 ||
  11627. DILITHIUM_LEVEL2_KEY_SIZE
  11628. < (word16)ssl->options.minDilithiumKeySz) {
  11629. WOLFSSL_MSG("Dilithium key size in cert chain error");
  11630. ret = DILITHIUM_KEY_SIZE_E;
  11631. }
  11632. break;
  11633. case DILITHIUM_LEVEL3k:
  11634. if (ssl->options.minDilithiumKeySz < 0 ||
  11635. DILITHIUM_LEVEL3_KEY_SIZE
  11636. < (word16)ssl->options.minDilithiumKeySz) {
  11637. WOLFSSL_MSG( "Dilithium key size in cert chain error");
  11638. ret = DILITHIUM_KEY_SIZE_E;
  11639. }
  11640. break;
  11641. case DILITHIUM_LEVEL5k:
  11642. if (ssl->options.minDilithiumKeySz < 0 ||
  11643. DILITHIUM_LEVEL5_KEY_SIZE
  11644. < (word16)ssl->options.minDilithiumKeySz) {
  11645. WOLFSSL_MSG("Dilithium key size in cert chain error");
  11646. ret = DILITHIUM_KEY_SIZE_E;
  11647. }
  11648. break;
  11649. #endif /* HAVE_DILITHIUM */
  11650. default:
  11651. WOLFSSL_MSG("Key size not checked");
  11652. /* key not being checked for size if not in
  11653. switch */
  11654. break;
  11655. }
  11656. return ret;
  11657. }
  11658. int ProcessPeerCerts(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  11659. word32 totalSz)
  11660. {
  11661. int ret = 0;
  11662. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  11663. ProcPeerCertArgs* args = NULL;
  11664. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  11665. #elif defined(WOLFSSL_SMALL_STACK)
  11666. ProcPeerCertArgs* args = NULL;
  11667. #else
  11668. ProcPeerCertArgs args[1];
  11669. #endif
  11670. byte* subjectHash = NULL;
  11671. int alreadySigner = 0;
  11672. WOLFSSL_ENTER("ProcessPeerCerts");
  11673. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  11674. if (ssl->async == NULL) {
  11675. ssl->async = (struct WOLFSSL_ASYNC*)
  11676. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  11677. DYNAMIC_TYPE_ASYNC);
  11678. if (ssl->async == NULL)
  11679. ERROR_OUT(MEMORY_E, exit_ppc);
  11680. }
  11681. args = (ProcPeerCertArgs*)ssl->async->args;
  11682. #ifdef WOLFSSL_ASYNC_CRYPT
  11683. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  11684. if (ret != WC_NOT_PENDING_E) {
  11685. /* Check for error */
  11686. if (ret < 0)
  11687. goto exit_ppc;
  11688. }
  11689. else
  11690. #endif /* WOLFSSL_ASYNC_CRYPT */
  11691. #ifdef WOLFSSL_NONBLOCK_OCSP
  11692. if (ssl->error == OCSP_WANT_READ) {
  11693. /* Re-entry after non-blocking OCSP */
  11694. #ifdef WOLFSSL_ASYNC_CRYPT
  11695. /* if async operationg not pending, reset error code */
  11696. if (ret == WC_NOT_PENDING_E)
  11697. ret = 0;
  11698. #endif
  11699. }
  11700. else
  11701. #endif /* WOLFSSL_NONBLOCK_OCSP */
  11702. #elif defined(WOLFSSL_SMALL_STACK)
  11703. args = (ProcPeerCertArgs*)XMALLOC(
  11704. sizeof(ProcPeerCertArgs), ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  11705. if (args == NULL) {
  11706. ERROR_OUT(MEMORY_E, exit_ppc);
  11707. }
  11708. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  11709. {
  11710. /* Reset state */
  11711. ret = 0;
  11712. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  11713. XMEMSET(args, 0, sizeof(ProcPeerCertArgs));
  11714. args->idx = *inOutIdx;
  11715. args->begin = *inOutIdx;
  11716. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  11717. ssl->async->freeArgs = FreeProcPeerCertArgs;
  11718. #endif
  11719. }
  11720. switch (ssl->options.asyncState)
  11721. {
  11722. case TLS_ASYNC_BEGIN:
  11723. {
  11724. word32 listSz;
  11725. #ifdef WOLFSSL_CALLBACKS
  11726. if (ssl->hsInfoOn)
  11727. AddPacketName(ssl, "Certificate");
  11728. if (ssl->toInfoOn)
  11729. AddLateName("Certificate", &ssl->timeoutInfo);
  11730. #endif
  11731. #ifdef WOLFSSL_TLS13
  11732. if (ssl->options.tls1_3) {
  11733. byte ctxSz;
  11734. /* Certificate Request Context */
  11735. if ((args->idx - args->begin) + OPAQUE8_LEN > totalSz)
  11736. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11737. ctxSz = *(input + args->idx);
  11738. args->idx++;
  11739. if ((args->idx - args->begin) + ctxSz > totalSz)
  11740. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11741. #ifndef NO_WOLFSSL_CLIENT
  11742. /* Must be empty when received from server. */
  11743. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  11744. if (ctxSz != 0) {
  11745. WOLFSSL_ERROR_VERBOSE(INVALID_CERT_CTX_E);
  11746. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  11747. }
  11748. }
  11749. #endif
  11750. #ifndef NO_WOLFSSL_SERVER
  11751. /* Must contain value sent in request. */
  11752. if (ssl->options.side == WOLFSSL_SERVER_END) {
  11753. if (ssl->options.handShakeState != HANDSHAKE_DONE &&
  11754. ctxSz != 0) {
  11755. WOLFSSL_ERROR_VERBOSE(INVALID_CERT_CTX_E);
  11756. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  11757. }
  11758. else if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  11759. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  11760. CertReqCtx* curr = ssl->certReqCtx;
  11761. CertReqCtx* prev = NULL;
  11762. while (curr != NULL) {
  11763. if ((ctxSz == curr->len) &&
  11764. XMEMCMP(&curr->ctx, input + args->idx, ctxSz)
  11765. == 0) {
  11766. if (prev != NULL)
  11767. prev->next = curr->next;
  11768. else
  11769. ssl->certReqCtx = curr->next;
  11770. XFREE(curr, ssl->heap,
  11771. DYNAMIC_TYPE_TMP_BUFFER);
  11772. break;
  11773. }
  11774. prev = curr;
  11775. curr = curr->next;
  11776. }
  11777. if (curr == NULL)
  11778. #endif
  11779. {
  11780. WOLFSSL_ERROR_VERBOSE(INVALID_CERT_CTX_E);
  11781. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  11782. }
  11783. }
  11784. }
  11785. #endif
  11786. args->idx += ctxSz;
  11787. /* allocate buffer for cert extensions */
  11788. args->exts = (buffer*)XMALLOC(sizeof(buffer) *
  11789. MAX_CHAIN_DEPTH, ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  11790. if (args->exts == NULL) {
  11791. ERROR_OUT(MEMORY_E, exit_ppc);
  11792. }
  11793. }
  11794. #endif
  11795. /* allocate buffer for certs */
  11796. args->certs = (buffer*)XMALLOC(sizeof(buffer) * MAX_CHAIN_DEPTH,
  11797. ssl->heap, DYNAMIC_TYPE_DER);
  11798. if (args->certs == NULL) {
  11799. ERROR_OUT(MEMORY_E, exit_ppc);
  11800. }
  11801. XMEMSET(args->certs, 0, sizeof(buffer) * MAX_CHAIN_DEPTH);
  11802. /* Certificate List */
  11803. if ((args->idx - args->begin) + OPAQUE24_LEN > totalSz) {
  11804. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11805. }
  11806. c24to32(input + args->idx, &listSz);
  11807. args->idx += OPAQUE24_LEN;
  11808. if (listSz > MAX_CERTIFICATE_SZ) {
  11809. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11810. }
  11811. if ((args->idx - args->begin) + listSz != totalSz) {
  11812. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11813. }
  11814. WOLFSSL_MSG("Loading peer's cert chain");
  11815. /* first put cert chain into buffer so can verify top down
  11816. we're sent bottom up */
  11817. while (listSz) {
  11818. word32 certSz;
  11819. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11820. if (args->totalCerts >= MAX_CHAIN_DEPTH) {
  11821. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  11822. ssl->peerVerifyRet =
  11823. WOLFSSL_X509_V_ERR_CERT_CHAIN_TOO_LONG;
  11824. ret = MAX_CHAIN_ERROR;
  11825. WOLFSSL_ERROR_VERBOSE(ret);
  11826. WOLFSSL_MSG("Too many certs for MAX_CHAIN_DEPTH");
  11827. break; /* break out to avoid reading more certs then buffer
  11828. * can hold */
  11829. }
  11830. #else
  11831. if (args->totalCerts >= ssl->verifyDepth ||
  11832. args->totalCerts >= MAX_CHAIN_DEPTH) {
  11833. WOLFSSL_ERROR_VERBOSE(MAX_CHAIN_ERROR);
  11834. ERROR_OUT(MAX_CHAIN_ERROR, exit_ppc);
  11835. }
  11836. #endif
  11837. if ((args->idx - args->begin) + OPAQUE24_LEN > totalSz) {
  11838. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11839. }
  11840. c24to32(input + args->idx, &certSz);
  11841. args->idx += OPAQUE24_LEN;
  11842. if ((args->idx - args->begin) + certSz > totalSz) {
  11843. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11844. }
  11845. args->certs[args->totalCerts].length = certSz;
  11846. args->certs[args->totalCerts].buffer = input + args->idx;
  11847. #ifdef SESSION_CERTS
  11848. AddSessionCertToChain(&ssl->session->chain,
  11849. input + args->idx, certSz);
  11850. #endif /* SESSION_CERTS */
  11851. args->idx += certSz;
  11852. listSz -= certSz + CERT_HEADER_SZ;
  11853. #ifdef WOLFSSL_TLS13
  11854. /* Extensions */
  11855. if (ssl->options.tls1_3) {
  11856. word16 extSz;
  11857. if (args->exts == NULL) {
  11858. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11859. }
  11860. if ((args->idx - args->begin) + OPAQUE16_LEN > totalSz) {
  11861. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11862. }
  11863. ato16(input + args->idx, &extSz);
  11864. args->idx += OPAQUE16_LEN;
  11865. if ((args->idx - args->begin) + extSz > totalSz) {
  11866. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11867. }
  11868. /* Store extension data info for later processing. */
  11869. args->exts[args->totalCerts].length = extSz;
  11870. args->exts[args->totalCerts].buffer = input + args->idx;
  11871. args->idx += extSz;
  11872. listSz -= extSz + OPAQUE16_LEN;
  11873. WOLFSSL_MSG_EX("\tParsing %d bytes of cert extensions",
  11874. args->exts[args->totalCerts].length);
  11875. #if !defined(NO_TLS)
  11876. ret = TLSX_Parse(ssl, args->exts[args->totalCerts].buffer,
  11877. (word16)args->exts[args->totalCerts].length,
  11878. certificate, NULL);
  11879. #endif /* !NO_TLS */
  11880. if (ret < 0) {
  11881. WOLFSSL_ERROR_VERBOSE(ret);
  11882. ERROR_OUT(ret, exit_ppc);
  11883. }
  11884. }
  11885. #endif
  11886. args->totalCerts++;
  11887. WOLFSSL_MSG("\tPut another cert into chain");
  11888. } /* while (listSz) */
  11889. args->count = args->totalCerts;
  11890. args->certIdx = 0; /* select peer cert (first one) */
  11891. if (args->count == 0) {
  11892. /* Empty certificate message. */
  11893. if ((ssl->options.side == WOLFSSL_SERVER_END) &&
  11894. (ssl->options.mutualAuth || (ssl->options.failNoCert &&
  11895. IsAtLeastTLSv1_3(ssl->version)))) {
  11896. WOLFSSL_MSG("No peer cert from Client");
  11897. ret = NO_PEER_CERT;
  11898. WOLFSSL_ERROR_VERBOSE(ret);
  11899. DoCertFatalAlert(ssl, ret);
  11900. }
  11901. else if ((ssl->options.side == WOLFSSL_CLIENT_END) &&
  11902. IsAtLeastTLSv1_3(ssl->version)) {
  11903. WOLFSSL_MSG("No peer cert from Server");
  11904. ret = NO_PEER_CERT;
  11905. WOLFSSL_ERROR_VERBOSE(ret);
  11906. SendAlert(ssl, alert_fatal, decode_error);
  11907. }
  11908. }
  11909. args->dCertInit = 0;
  11910. #ifndef WOLFSSL_SMALL_CERT_VERIFY
  11911. args->dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  11912. DYNAMIC_TYPE_DCERT);
  11913. if (args->dCert == NULL) {
  11914. ERROR_OUT(MEMORY_E, exit_ppc);
  11915. }
  11916. XMEMSET(args->dCert, 0, sizeof(DecodedCert));
  11917. #endif
  11918. /* Advance state and proceed */
  11919. ssl->options.asyncState = TLS_ASYNC_BUILD;
  11920. } /* case TLS_ASYNC_BEGIN */
  11921. FALL_THROUGH;
  11922. case TLS_ASYNC_BUILD:
  11923. {
  11924. if (args->count > 0) {
  11925. /* check for trusted peer and get untrustedDepth */
  11926. #if defined(WOLFSSL_TRUST_PEER_CERT) || defined(OPENSSL_EXTRA)
  11927. if (args->certIdx == 0) {
  11928. #ifdef WOLFSSL_TRUST_PEER_CERT
  11929. TrustedPeerCert* tp;
  11930. #endif
  11931. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE, NO_VERIFY,
  11932. &subjectHash, &alreadySigner);
  11933. if (ret != 0)
  11934. goto exit_ppc;
  11935. #ifdef OPENSSL_EXTRA
  11936. /* Determine untrusted depth */
  11937. if (!alreadySigner && (!args->dCert ||
  11938. !args->dCertInit || !args->dCert->selfSigned)) {
  11939. args->untrustedDepth = 1;
  11940. }
  11941. #endif
  11942. #ifdef WOLFSSL_TRUST_PEER_CERT
  11943. tp = GetTrustedPeer(SSL_CM(ssl), args->dCert);
  11944. WOLFSSL_MSG("Checking for trusted peer cert");
  11945. if (tp && MatchTrustedPeer(tp, args->dCert)) {
  11946. WOLFSSL_MSG("Found matching trusted peer cert");
  11947. args->haveTrustPeer = 1;
  11948. }
  11949. else if (tp == NULL) {
  11950. /* no trusted peer cert */
  11951. WOLFSSL_MSG("No matching trusted peer cert. Checking CAs");
  11952. }
  11953. else {
  11954. WOLFSSL_MSG("Trusted peer cert did not match!");
  11955. }
  11956. if (!args->haveTrustPeer)
  11957. #endif
  11958. {
  11959. /* free cert if not trusted peer */
  11960. FreeDecodedCert(args->dCert);
  11961. args->dCertInit = 0;
  11962. }
  11963. }
  11964. #endif /* WOLFSSL_TRUST_PEER_CERT || OPENSSL_EXTRA */
  11965. /* check certificate up to peer's first */
  11966. /* do not verify chain if trusted peer cert found */
  11967. while (args->count > 1
  11968. #ifdef WOLFSSL_TRUST_PEER_CERT
  11969. && !args->haveTrustPeer
  11970. #endif /* WOLFSSL_TRUST_PEER_CERT */
  11971. ) {
  11972. int skipAddCA = 0;
  11973. /* select last certificate */
  11974. args->certIdx = args->count - 1;
  11975. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  11976. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  11977. &subjectHash, &alreadySigner);
  11978. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
  11979. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
  11980. !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  11981. if (ret == ASN_NO_SIGNER_E || ret == ASN_SELF_SIGNED_E) {
  11982. WOLFSSL_MSG("try to load certificate if hash dir is set");
  11983. ret = LoadCertByIssuer(SSL_STORE(ssl),
  11984. (WOLFSSL_X509_NAME*)args->dCert->issuerName,
  11985. X509_LU_X509);
  11986. if (ret == WOLFSSL_SUCCESS) {
  11987. FreeDecodedCert(args->dCert);
  11988. args->dCertInit = 0;
  11989. /* once again */
  11990. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  11991. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  11992. &subjectHash, &alreadySigner);
  11993. }
  11994. else {
  11995. ret = ASN_NO_SIGNER_E;
  11996. WOLFSSL_ERROR_VERBOSE(ret);
  11997. }
  11998. }
  11999. #endif
  12000. #ifdef WOLFSSL_ASYNC_CRYPT
  12001. if (ret == WC_PENDING_E)
  12002. goto exit_ppc;
  12003. #endif
  12004. if (ret == 0) {
  12005. ret = ProcessPeerCertCheckKey(ssl, args);
  12006. }
  12007. if (ret == 0 && args->dCert->isCA == 0) {
  12008. WOLFSSL_MSG("Chain cert is not a CA, not adding as one");
  12009. }
  12010. else if (ret == 0 && ssl->options.verifyNone) {
  12011. WOLFSSL_MSG("Chain cert not verified by option, "
  12012. "not adding as CA");
  12013. }
  12014. else if (ret == 0) {
  12015. #ifdef OPENSSL_EXTRA
  12016. if (args->certIdx > args->untrustedDepth) {
  12017. args->untrustedDepth = (char)args->certIdx + 1;
  12018. }
  12019. #endif
  12020. if (alreadySigner) {
  12021. WOLFSSL_MSG("Verified CA from chain and already had it");
  12022. }
  12023. }
  12024. else {
  12025. WOLFSSL_MSG("Failed to verify CA from chain");
  12026. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12027. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  12028. ssl->peerVerifyRet = WOLFSSL_X509_V_ERR_INVALID_CA;
  12029. #endif
  12030. }
  12031. if (ret == 0) {
  12032. #ifdef HAVE_OCSP
  12033. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  12034. if (ssl->status_request_v2) {
  12035. ret = TLSX_CSR2_InitRequests(ssl->extensions,
  12036. args->dCert, 0, ssl->heap);
  12037. }
  12038. else /* skips OCSP and force CRL check */
  12039. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  12040. if (SSL_CM(ssl)->ocspEnabled &&
  12041. SSL_CM(ssl)->ocspCheckAll) {
  12042. WOLFSSL_MSG("Doing Non Leaf OCSP check");
  12043. ret = CheckCertOCSP_ex(SSL_CM(ssl)->ocsp,
  12044. args->dCert, NULL, ssl);
  12045. #ifdef WOLFSSL_NONBLOCK_OCSP
  12046. if (ret == OCSP_WANT_READ) {
  12047. args->lastErr = ret;
  12048. goto exit_ppc;
  12049. }
  12050. #endif
  12051. if (ret != 0) {
  12052. WOLFSSL_ERROR_VERBOSE(ret);
  12053. WOLFSSL_MSG("\tOCSP Lookup not ok");
  12054. }
  12055. }
  12056. #endif /* HAVE_OCSP */
  12057. #ifdef HAVE_CRL
  12058. if (SSL_CM(ssl)->crlEnabled &&
  12059. SSL_CM(ssl)->crlCheckAll) {
  12060. int doCrlLookup = 1;
  12061. #ifdef HAVE_OCSP
  12062. if (SSL_CM(ssl)->ocspEnabled &&
  12063. SSL_CM(ssl)->ocspCheckAll) {
  12064. /* If the cert status is unknown to the OCSP
  12065. responder, do a CRL lookup. If any other
  12066. error, skip the CRL lookup and fail the
  12067. certificate. */
  12068. doCrlLookup = (ret == OCSP_CERT_UNKNOWN);
  12069. }
  12070. #endif /* HAVE_OCSP */
  12071. if (doCrlLookup) {
  12072. WOLFSSL_MSG("Doing Non Leaf CRL check");
  12073. ret = CheckCertCRL(SSL_CM(ssl)->crl,
  12074. args->dCert);
  12075. #ifdef WOLFSSL_NONBLOCK_OCSP
  12076. /* The CRL lookup I/O callback is using the
  12077. * same WOULD_BLOCK error code as OCSP's I/O
  12078. * callback, and it is enabling it using the
  12079. * same flag. */
  12080. if (ret == OCSP_WANT_READ) {
  12081. args->lastErr = ret;
  12082. goto exit_ppc;
  12083. }
  12084. #endif
  12085. if (ret != 0) {
  12086. WOLFSSL_ERROR_VERBOSE(ret);
  12087. WOLFSSL_MSG("\tCRL check not ok");
  12088. }
  12089. }
  12090. }
  12091. #endif /* HAVE_CRL */
  12092. }
  12093. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12094. if (ret == 0 &&
  12095. /* extend the limit "+1" until reaching
  12096. * an ultimately trusted issuer.*/
  12097. args->count > (ssl->verifyDepth + 1)) {
  12098. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  12099. ssl->peerVerifyRet =
  12100. WOLFSSL_X509_V_ERR_CERT_CHAIN_TOO_LONG;
  12101. ret = MAX_CHAIN_ERROR;
  12102. WOLFSSL_ERROR_VERBOSE(ret);
  12103. }
  12104. #endif
  12105. #ifdef WOLFSSL_ALT_CERT_CHAINS
  12106. /* For alternate cert chain, its okay for a CA cert to fail
  12107. with ASN_NO_SIGNER_E here. The "alternate" certificate
  12108. chain mode only requires that the peer certificate
  12109. validate to a trusted CA */
  12110. if (ret != 0 && args->dCert->isCA) {
  12111. if (ret == ASN_NO_SIGNER_E || ret == ASN_SELF_SIGNED_E) {
  12112. if (!ssl->options.usingAltCertChain) {
  12113. WOLFSSL_MSG("Trying alternate cert chain");
  12114. ssl->options.usingAltCertChain = 1;
  12115. }
  12116. ret = 0; /* clear errors and continue */
  12117. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12118. ssl->peerVerifyRet = 0;
  12119. #endif
  12120. args->verifyErr = 0;
  12121. /* do not add to certificate manager */
  12122. skipAddCA = 1;
  12123. }
  12124. }
  12125. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  12126. /* Do verify callback */
  12127. ret = DoVerifyCallback(SSL_CM(ssl), ssl, ret, args);
  12128. if (ssl->options.verifyNone &&
  12129. (ret == CRL_MISSING || ret == CRL_CERT_REVOKED ||
  12130. ret == CRL_CERT_DATE_ERR)) {
  12131. WOLFSSL_MSG("Ignoring CRL problem based on verify setting");
  12132. ret = ssl->error = 0;
  12133. }
  12134. #ifdef WOLFSSL_ALT_CERT_CHAINS
  12135. if (ret != 0 && args->dCert->isCA) {
  12136. /* do not add to certificate manager */
  12137. skipAddCA = 1;
  12138. }
  12139. #endif
  12140. /* If valid CA then add to Certificate Manager */
  12141. if (ret == 0 && args->dCert->isCA &&
  12142. !ssl->options.verifyNone && !skipAddCA) {
  12143. buffer* cert = &args->certs[args->certIdx];
  12144. /* Is valid CA */
  12145. #if defined(SESSION_CERTS) && defined(WOLFSSL_ALT_CERT_CHAINS)
  12146. /* if using alternate chain, store the cert used */
  12147. if (ssl->options.usingAltCertChain) {
  12148. AddSessionCertToChain(&ssl->session->altChain,
  12149. cert->buffer, cert->length);
  12150. }
  12151. #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
  12152. if (!alreadySigner) {
  12153. DerBuffer* add = NULL;
  12154. ret = AllocDer(&add, cert->length, CA_TYPE, ssl->heap);
  12155. if (ret < 0)
  12156. goto exit_ppc;
  12157. XMEMCPY(add->buffer, cert->buffer, cert->length);
  12158. /* CA already verified above in ParseCertRelative */
  12159. WOLFSSL_MSG("Adding CA from chain");
  12160. ret = AddCA(SSL_CM(ssl), &add, WOLFSSL_CHAIN_CA,
  12161. NO_VERIFY);
  12162. if (ret == WOLFSSL_SUCCESS) {
  12163. ret = 0;
  12164. }
  12165. }
  12166. }
  12167. /* Handle error codes */
  12168. ssl->error = ret; /* Report SSL error or clear error if
  12169. * callback overrides. */
  12170. if (ret != 0) {
  12171. if (!ssl->options.verifyNone) {
  12172. WOLFSSL_ERROR_VERBOSE(ret);
  12173. DoCertFatalAlert(ssl, ret);
  12174. }
  12175. if (args->lastErr == 0) {
  12176. args->lastErr = ret; /* save error from last time */
  12177. ret = 0; /* reset error */
  12178. }
  12179. }
  12180. FreeDecodedCert(args->dCert);
  12181. args->dCertInit = 0;
  12182. args->count--;
  12183. } /* while (count > 0 && !args->haveTrustPeer) */
  12184. } /* if (count > 0) */
  12185. /* Check for error */
  12186. if (ret != 0) {
  12187. goto exit_ppc;
  12188. }
  12189. /* Advance state and proceed */
  12190. ssl->options.asyncState = TLS_ASYNC_DO;
  12191. } /* case TLS_ASYNC_BUILD */
  12192. FALL_THROUGH;
  12193. case TLS_ASYNC_DO:
  12194. {
  12195. /* peer's, may not have one if blank client cert sent by TLSv1.2 */
  12196. if (args->count > 0) {
  12197. WOLFSSL_MSG("Verifying Peer's cert");
  12198. /* select peer cert (first one) */
  12199. args->certIdx = 0;
  12200. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  12201. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  12202. &subjectHash, &alreadySigner);
  12203. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
  12204. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
  12205. !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  12206. if (ret == ASN_NO_SIGNER_E || ret == ASN_SELF_SIGNED_E) {
  12207. int lastErr = ret; /* save error from last time */
  12208. WOLFSSL_MSG("try to load certificate if hash dir is set");
  12209. ret = LoadCertByIssuer(SSL_STORE(ssl),
  12210. (WOLFSSL_X509_NAME*)args->dCert->issuerName,
  12211. X509_LU_X509);
  12212. if (ret == WOLFSSL_SUCCESS) {
  12213. FreeDecodedCert(args->dCert);
  12214. args->dCertInit = 0;
  12215. /* once again */
  12216. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  12217. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  12218. &subjectHash, &alreadySigner);
  12219. }
  12220. else {
  12221. ret = lastErr; /* restore error */
  12222. WOLFSSL_ERROR_VERBOSE(ret);
  12223. }
  12224. }
  12225. #endif
  12226. #ifdef WOLFSSL_ASYNC_CRYPT
  12227. if (ret == WC_PENDING_E)
  12228. goto exit_ppc;
  12229. #endif
  12230. if (ret == 0) {
  12231. WOLFSSL_MSG("Verified Peer's cert");
  12232. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12233. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  12234. ssl->peerVerifyRet = WOLFSSL_X509_V_OK;
  12235. #endif
  12236. #if defined(SESSION_CERTS) && defined(WOLFSSL_ALT_CERT_CHAINS)
  12237. /* if using alternate chain, store the cert used */
  12238. if (ssl->options.usingAltCertChain) {
  12239. buffer* cert = &args->certs[args->certIdx];
  12240. AddSessionCertToChain(&ssl->session->altChain,
  12241. cert->buffer, cert->length);
  12242. }
  12243. #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
  12244. #ifndef OPENSSL_COMPATIBLE_DEFAULTS
  12245. /* Check peer's certificate version number. TLS 1.2 / 1.3
  12246. * requires the clients certificate be version 3 unless a
  12247. * different version has been negotiated using RFC 7250.
  12248. * OpenSSL doesn't appear to be performing this check.
  12249. * For TLS 1.3 see RFC8446 Section 4.4.2.3 */
  12250. if (ssl->options.side == WOLFSSL_SERVER_END) {
  12251. if (args->dCert->version != WOLFSSL_X509_V3) {
  12252. WOLFSSL_MSG("Peers certificate was not version 3!");
  12253. args->lastErr = ASN_VERSION_E;
  12254. /* setting last error but not considering it fatal
  12255. * giving the user a chance to override */
  12256. }
  12257. }
  12258. #endif
  12259. /* check if fatal error */
  12260. if (args->verifyErr) {
  12261. args->fatal = 1;
  12262. ret = args->lastErr;
  12263. }
  12264. else {
  12265. args->fatal = 0;
  12266. }
  12267. }
  12268. else if (ret == ASN_PARSE_E || ret == BUFFER_E) {
  12269. WOLFSSL_MSG("Got Peer cert ASN PARSE or BUFFER ERROR");
  12270. #if defined(WOLFSSL_EXTRA_ALERTS) || defined(OPENSSL_EXTRA) || \
  12271. defined(OPENSSL_EXTRA_X509_SMALL)
  12272. DoCertFatalAlert(ssl, ret);
  12273. #endif
  12274. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12275. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  12276. ssl->peerVerifyRet = WOLFSSL_X509_V_ERR_CERT_REJECTED;
  12277. #endif
  12278. args->fatal = 1;
  12279. }
  12280. else {
  12281. WOLFSSL_MSG("Failed to verify Peer's cert");
  12282. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12283. if (ssl->peerVerifyRet == 0) { /* Return first cert error here */
  12284. if (ret == ASN_BEFORE_DATE_E) {
  12285. ssl->peerVerifyRet =
  12286. (unsigned long)WOLFSSL_X509_V_ERR_CERT_NOT_YET_VALID;
  12287. }
  12288. else if (ret == ASN_AFTER_DATE_E) {
  12289. ssl->peerVerifyRet =
  12290. (unsigned long)WOLFSSL_X509_V_ERR_CERT_HAS_EXPIRED;
  12291. }
  12292. else {
  12293. ssl->peerVerifyRet =
  12294. (unsigned long)
  12295. WOLFSSL_X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE;
  12296. }
  12297. }
  12298. #endif
  12299. if (ssl->verifyCallback) {
  12300. WOLFSSL_MSG(
  12301. "\tCallback override available, will continue");
  12302. /* check if fatal error */
  12303. args->fatal = (args->verifyErr) ? 1 : 0;
  12304. if (args->fatal)
  12305. DoCertFatalAlert(ssl, ret);
  12306. }
  12307. else {
  12308. WOLFSSL_MSG("\tNo callback override available, fatal");
  12309. args->fatal = 1;
  12310. DoCertFatalAlert(ssl, ret);
  12311. }
  12312. }
  12313. #ifdef HAVE_SECURE_RENEGOTIATION
  12314. if (args->fatal == 0 && !IsAtLeastTLSv1_3(ssl->version)
  12315. && ssl->secure_renegotiation
  12316. && ssl->secure_renegotiation->enabled) {
  12317. if (IsEncryptionOn(ssl, 0)) {
  12318. /* compare against previous time */
  12319. if (ssl->secure_renegotiation->subject_hash_set) {
  12320. if (XMEMCMP(args->dCert->subjectHash,
  12321. ssl->secure_renegotiation->subject_hash,
  12322. KEYID_SIZE) != 0) {
  12323. WOLFSSL_MSG(
  12324. "Peer sent different cert during scr, fatal");
  12325. args->fatal = 1;
  12326. ret = SCR_DIFFERENT_CERT_E;
  12327. WOLFSSL_ERROR_VERBOSE(ret);
  12328. }
  12329. }
  12330. }
  12331. /* cache peer's hash */
  12332. if (args->fatal == 0) {
  12333. XMEMCPY(ssl->secure_renegotiation->subject_hash,
  12334. args->dCert->subjectHash, KEYID_SIZE);
  12335. ssl->secure_renegotiation->subject_hash_set = 1;
  12336. }
  12337. }
  12338. #endif /* HAVE_SECURE_RENEGOTIATION */
  12339. } /* if (count > 0) */
  12340. /* Check for error */
  12341. if (args->fatal && ret != 0) {
  12342. goto exit_ppc;
  12343. }
  12344. /* Advance state and proceed */
  12345. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  12346. } /* case TLS_ASYNC_DO */
  12347. FALL_THROUGH;
  12348. case TLS_ASYNC_VERIFY:
  12349. {
  12350. if (args->count > 0) {
  12351. #if defined(HAVE_OCSP) || defined(HAVE_CRL)
  12352. /* only attempt to check OCSP or CRL if not previous error such
  12353. * as ASN_BEFORE_DATE_E or ASN_AFTER_DATE_E */
  12354. if (args->fatal == 0 && ret == 0) {
  12355. int doLookup = 1;
  12356. WOLFSSL_MSG("Checking if ocsp needed");
  12357. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12358. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  12359. if (ssl->status_request) {
  12360. args->fatal = (TLSX_CSR_InitRequest(ssl->extensions,
  12361. args->dCert, ssl->heap) != 0);
  12362. doLookup = 0;
  12363. WOLFSSL_MSG("\tHave status request");
  12364. #if defined(WOLFSSL_TLS13)
  12365. if (ssl->options.tls1_3) {
  12366. TLSX* ext = TLSX_Find(ssl->extensions,
  12367. TLSX_STATUS_REQUEST);
  12368. if (ext != NULL) {
  12369. word32 idx = 0;
  12370. CertificateStatusRequest* csr =
  12371. (CertificateStatusRequest*)ext->data;
  12372. ret = ProcessCSR(ssl, csr->response.buffer,
  12373. &idx, csr->response.length);
  12374. if (ret < 0) {
  12375. WOLFSSL_ERROR_VERBOSE(ret);
  12376. goto exit_ppc;
  12377. }
  12378. }
  12379. }
  12380. #endif
  12381. }
  12382. /* Ensure a stapling response was seen */
  12383. else if (ssl->options.tls1_3 &&
  12384. SSL_CM(ssl)->ocspMustStaple) {
  12385. ret = OCSP_CERT_UNKNOWN;
  12386. goto exit_ppc;
  12387. }
  12388. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  12389. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  12390. if (ssl->status_request_v2) {
  12391. args->fatal = (TLSX_CSR2_InitRequests(ssl->extensions,
  12392. args->dCert, 1, ssl->heap) != 0);
  12393. doLookup = 0;
  12394. WOLFSSL_MSG("\tHave status request v2");
  12395. }
  12396. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  12397. }
  12398. #ifdef HAVE_OCSP
  12399. if (doLookup && SSL_CM(ssl)->ocspEnabled) {
  12400. WOLFSSL_MSG("Doing Leaf OCSP check");
  12401. ret = CheckCertOCSP_ex(SSL_CM(ssl)->ocsp,
  12402. args->dCert, NULL, ssl);
  12403. #ifdef WOLFSSL_NONBLOCK_OCSP
  12404. if (ret == OCSP_WANT_READ) {
  12405. goto exit_ppc;
  12406. }
  12407. #endif
  12408. doLookup = (ret == OCSP_CERT_UNKNOWN);
  12409. if (ret != 0) {
  12410. WOLFSSL_MSG("\tOCSP Lookup not ok");
  12411. args->fatal = 0;
  12412. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12413. if (ssl->peerVerifyRet == 0) {
  12414. /* Return first cert error here */
  12415. ssl->peerVerifyRet =
  12416. ret == OCSP_CERT_REVOKED
  12417. ? WOLFSSL_X509_V_ERR_CERT_REVOKED
  12418. : WOLFSSL_X509_V_ERR_CERT_REJECTED;
  12419. }
  12420. #endif
  12421. }
  12422. }
  12423. #endif /* HAVE_OCSP */
  12424. #ifdef HAVE_CRL
  12425. if (ret == 0 && doLookup && SSL_CM(ssl)->crlEnabled) {
  12426. WOLFSSL_MSG("Doing Leaf CRL check");
  12427. ret = CheckCertCRL(SSL_CM(ssl)->crl, args->dCert);
  12428. #ifdef WOLFSSL_NONBLOCK_OCSP
  12429. /* The CRL lookup I/O callback is using the
  12430. * same WOULD_BLOCK error code as OCSP's I/O
  12431. * callback, and it is enabling it using the
  12432. * same flag. */
  12433. if (ret == OCSP_WANT_READ) {
  12434. goto exit_ppc;
  12435. }
  12436. #endif
  12437. if (ret != 0) {
  12438. WOLFSSL_MSG("\tCRL check not ok");
  12439. args->fatal = 0;
  12440. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12441. if (ssl->peerVerifyRet == 0) {
  12442. /* Return first cert error here */
  12443. ssl->peerVerifyRet =
  12444. ret == CRL_CERT_REVOKED
  12445. ? WOLFSSL_X509_V_ERR_CERT_REVOKED
  12446. : WOLFSSL_X509_V_ERR_CERT_REJECTED;;
  12447. }
  12448. #endif
  12449. }
  12450. }
  12451. #endif /* HAVE_CRL */
  12452. (void)doLookup;
  12453. }
  12454. #endif /* HAVE_OCSP || HAVE_CRL */
  12455. #ifdef KEEP_PEER_CERT
  12456. if (args->fatal == 0) {
  12457. int copyRet = 0;
  12458. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  12459. if (ssl->options.handShakeDone) {
  12460. FreeX509(&ssl->peerCert);
  12461. InitX509(&ssl->peerCert, 0, ssl->heap);
  12462. }
  12463. else
  12464. #endif
  12465. #ifdef HAVE_SECURE_RENEGOTIATION
  12466. if (ssl->secure_renegotiation &&
  12467. ssl->secure_renegotiation->enabled) {
  12468. /* free old peer cert */
  12469. FreeX509(&ssl->peerCert);
  12470. InitX509(&ssl->peerCert, 0, ssl->heap);
  12471. }
  12472. else
  12473. #endif
  12474. {
  12475. }
  12476. /* set X509 format for peer cert */
  12477. copyRet = CopyDecodedToX509(&ssl->peerCert, args->dCert);
  12478. if (copyRet == MEMORY_E) {
  12479. args->fatal = 1;
  12480. }
  12481. }
  12482. #endif /* KEEP_PEER_CERT */
  12483. #ifndef IGNORE_KEY_EXTENSIONS
  12484. #if defined(OPENSSL_EXTRA)
  12485. /* when compatibility layer is turned on and no verify is
  12486. * set then ignore the certificate key extension */
  12487. if (args->dCert->extKeyUsageSet &&
  12488. args->dCert->extKeyUsageCrit == 0 &&
  12489. ssl->options.verifyNone) {
  12490. WOLFSSL_MSG("Not verifying certificate key usage");
  12491. }
  12492. else
  12493. #endif
  12494. if (args->dCert->extKeyUsageSet) {
  12495. if ((ssl->specs.kea == rsa_kea) &&
  12496. (ssl->options.side == WOLFSSL_CLIENT_END) &&
  12497. (args->dCert->extKeyUsage & KEYUSE_KEY_ENCIPHER) == 0) {
  12498. ret = KEYUSE_ENCIPHER_E;
  12499. WOLFSSL_ERROR_VERBOSE(ret);
  12500. }
  12501. if ((ssl->specs.kea != rsa_kea) &&
  12502. (ssl->specs.sig_algo == rsa_sa_algo ||
  12503. (ssl->specs.sig_algo == ecc_dsa_sa_algo &&
  12504. !ssl->specs.static_ecdh)) &&
  12505. (args->dCert->extKeyUsage & KEYUSE_DIGITAL_SIG) == 0) {
  12506. WOLFSSL_MSG("KeyUse Digital Sig not set");
  12507. ret = KEYUSE_SIGNATURE_E;
  12508. WOLFSSL_ERROR_VERBOSE(ret);
  12509. }
  12510. }
  12511. #if defined(OPENSSL_EXTRA)
  12512. /* when compatibility layer is turned on and no verify is
  12513. * set then ignore the certificate key extension */
  12514. if (args->dCert->extExtKeyUsageSet &&
  12515. args->dCert->extExtKeyUsageCrit == 0 &&
  12516. ssl->options.verifyNone) {
  12517. WOLFSSL_MSG("Not verifying certificate ext key usage");
  12518. }
  12519. else
  12520. #endif
  12521. if (args->dCert->extExtKeyUsageSet) {
  12522. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12523. if ((args->dCert->extExtKeyUsage &
  12524. (EXTKEYUSE_ANY | EXTKEYUSE_SERVER_AUTH)) == 0) {
  12525. WOLFSSL_MSG("ExtKeyUse Server Auth not set");
  12526. ret = EXTKEYUSE_AUTH_E;
  12527. WOLFSSL_ERROR_VERBOSE(ret);
  12528. }
  12529. }
  12530. else {
  12531. if ((args->dCert->extExtKeyUsage &
  12532. (EXTKEYUSE_ANY | EXTKEYUSE_CLIENT_AUTH)) == 0) {
  12533. WOLFSSL_MSG("ExtKeyUse Client Auth not set");
  12534. ret = EXTKEYUSE_AUTH_E;
  12535. WOLFSSL_ERROR_VERBOSE(ret);
  12536. }
  12537. }
  12538. }
  12539. #endif /* IGNORE_KEY_EXTENSIONS */
  12540. if (args->fatal) {
  12541. ssl->error = ret;
  12542. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12543. SendAlert(ssl, alert_fatal, bad_certificate);
  12544. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  12545. ssl->peerVerifyRet = WOLFSSL_X509_V_ERR_CERT_REJECTED;
  12546. #endif
  12547. goto exit_ppc;
  12548. }
  12549. /* Certificate validated and stored. */
  12550. ssl->options.havePeerCert = 1;
  12551. #if !defined(NO_WOLFSSL_CLIENT) && !defined(NO_RSA)
  12552. if (ssl->options.side == WOLFSSL_CLIENT_END &&
  12553. ssl->specs.sig_algo == rsa_kea) {
  12554. /* CLIENT: No ServerKeyExchange message sent by server. */
  12555. ssl->options.peerAuthGood = 1;
  12556. }
  12557. #endif
  12558. #if !defined(NO_WOLFSSL_CLIENT) && defined(HAVE_ECC)
  12559. if (ssl->options.side == WOLFSSL_CLIENT_END &&
  12560. ssl->specs.static_ecdh) {
  12561. /* CLIENT: No ServerKeyExchange message sent by server. */
  12562. ssl->options.peerAuthGood = 1;
  12563. }
  12564. #endif
  12565. if (!ssl->options.verifyNone && ssl->buffers.domainName.buffer) {
  12566. #ifndef WOLFSSL_ALLOW_NO_CN_IN_SAN
  12567. /* Per RFC 5280 section 4.2.1.6, "Whenever such identities
  12568. * are to be bound into a certificate, the subject
  12569. * alternative name extension MUST be used." */
  12570. if (args->dCert->altNames) {
  12571. if (CheckForAltNames(args->dCert,
  12572. (char*)ssl->buffers.domainName.buffer,
  12573. NULL) != 1) {
  12574. WOLFSSL_MSG("DomainName match on alt names failed");
  12575. /* try to get peer key still */
  12576. ret = DOMAIN_NAME_MISMATCH;
  12577. WOLFSSL_ERROR_VERBOSE(ret);
  12578. }
  12579. }
  12580. else {
  12581. if (MatchDomainName(
  12582. args->dCert->subjectCN,
  12583. args->dCert->subjectCNLen,
  12584. (char*)ssl->buffers.domainName.buffer) == 0) {
  12585. WOLFSSL_MSG("DomainName match on common name failed");
  12586. ret = DOMAIN_NAME_MISMATCH;
  12587. WOLFSSL_ERROR_VERBOSE(ret);
  12588. }
  12589. }
  12590. #else /* WOLFSSL_ALL_NO_CN_IN_SAN */
  12591. /* Old behavior. */
  12592. if (MatchDomainName(args->dCert->subjectCN,
  12593. args->dCert->subjectCNLen,
  12594. (char*)ssl->buffers.domainName.buffer) == 0) {
  12595. WOLFSSL_MSG("DomainName match on common name failed");
  12596. if (CheckForAltNames(args->dCert,
  12597. (char*)ssl->buffers.domainName.buffer,
  12598. NULL) != 1) {
  12599. WOLFSSL_MSG(
  12600. "DomainName match on alt names failed too");
  12601. /* try to get peer key still */
  12602. ret = DOMAIN_NAME_MISMATCH;
  12603. WOLFSSL_ERROR_VERBOSE(ret);
  12604. }
  12605. }
  12606. #endif /* WOLFSSL_ALL_NO_CN_IN_SAN */
  12607. }
  12608. /* decode peer key */
  12609. switch (args->dCert->keyOID) {
  12610. #ifndef NO_RSA
  12611. #ifdef WC_RSA_PSS
  12612. case RSAPSSk:
  12613. #endif
  12614. case RSAk:
  12615. {
  12616. word32 keyIdx = 0;
  12617. int keyRet = 0;
  12618. if (ssl->peerRsaKey == NULL) {
  12619. keyRet = AllocKey(ssl, DYNAMIC_TYPE_RSA,
  12620. (void**)&ssl->peerRsaKey);
  12621. } else if (ssl->peerRsaKeyPresent) {
  12622. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_RSA,
  12623. ssl->peerRsaKey);
  12624. ssl->peerRsaKeyPresent = 0;
  12625. }
  12626. if (keyRet != 0 || wc_RsaPublicKeyDecode(
  12627. args->dCert->publicKey, &keyIdx, ssl->peerRsaKey,
  12628. args->dCert->pubKeySize) != 0) {
  12629. ret = PEER_KEY_ERROR;
  12630. WOLFSSL_ERROR_VERBOSE(ret);
  12631. }
  12632. else {
  12633. ssl->peerRsaKeyPresent = 1;
  12634. #if defined(WOLFSSL_RENESAS_TSIP_TLS) || \
  12635. defined(WOLFSSL_RENESAS_SCEPROTECT)
  12636. /* copy encrypted tsip key index into ssl object */
  12637. if (args->dCert->sce_tsip_encRsaKeyIdx) {
  12638. if (!ssl->peerSceTsipEncRsaKeyIndex) {
  12639. ssl->peerSceTsipEncRsaKeyIndex = (byte*)XMALLOC(
  12640. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY,
  12641. ssl->heap, DYNAMIC_TYPE_RSA);
  12642. if (!ssl->peerSceTsipEncRsaKeyIndex) {
  12643. args->lastErr = MEMORY_E;
  12644. goto exit_ppc;
  12645. }
  12646. }
  12647. XMEMCPY(ssl->peerSceTsipEncRsaKeyIndex,
  12648. args->dCert->sce_tsip_encRsaKeyIdx,
  12649. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY);
  12650. }
  12651. #endif
  12652. #ifdef HAVE_PK_CALLBACKS
  12653. #if defined(HAVE_SECURE_RENEGOTIATION) || \
  12654. defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  12655. if (ssl->buffers.peerRsaKey.buffer) {
  12656. XFREE(ssl->buffers.peerRsaKey.buffer,
  12657. ssl->heap, DYNAMIC_TYPE_RSA);
  12658. ssl->buffers.peerRsaKey.buffer = NULL;
  12659. }
  12660. #endif
  12661. ssl->buffers.peerRsaKey.buffer =
  12662. (byte*)XMALLOC(args->dCert->pubKeySize,
  12663. ssl->heap, DYNAMIC_TYPE_RSA);
  12664. if (ssl->buffers.peerRsaKey.buffer == NULL) {
  12665. ret = MEMORY_ERROR;
  12666. }
  12667. else {
  12668. XMEMCPY(ssl->buffers.peerRsaKey.buffer,
  12669. args->dCert->publicKey,
  12670. args->dCert->pubKeySize);
  12671. ssl->buffers.peerRsaKey.length =
  12672. args->dCert->pubKeySize;
  12673. }
  12674. #endif /* HAVE_PK_CALLBACKS */
  12675. }
  12676. /* check size of peer RSA key */
  12677. if (ret == 0 && ssl->peerRsaKeyPresent &&
  12678. !ssl->options.verifyNone &&
  12679. wc_RsaEncryptSize(ssl->peerRsaKey)
  12680. < ssl->options.minRsaKeySz) {
  12681. ret = RSA_KEY_SIZE_E;
  12682. WOLFSSL_ERROR_VERBOSE(ret);
  12683. WOLFSSL_MSG("Peer RSA key is too small");
  12684. }
  12685. break;
  12686. }
  12687. #endif /* NO_RSA */
  12688. #ifdef HAVE_ECC
  12689. case ECDSAk:
  12690. {
  12691. int keyRet = 0;
  12692. word32 idx = 0;
  12693. #if defined(WOLFSSL_RENESAS_SCEPROTECT) || \
  12694. defined(WOLFSSL_RENESAS_TSIP_TLS)
  12695. /* copy encrypted tsip/sce key index into ssl object */
  12696. if (args->dCert->sce_tsip_encRsaKeyIdx) {
  12697. if (!ssl->peerSceTsipEncRsaKeyIndex) {
  12698. ssl->peerSceTsipEncRsaKeyIndex = (byte*)XMALLOC(
  12699. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY,
  12700. ssl->heap, DYNAMIC_TYPE_RSA);
  12701. if (!ssl->peerSceTsipEncRsaKeyIndex) {
  12702. args->lastErr = MEMORY_E;
  12703. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  12704. }
  12705. }
  12706. XMEMCPY(ssl->peerSceTsipEncRsaKeyIndex,
  12707. args->dCert->sce_tsip_encRsaKeyIdx,
  12708. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY);
  12709. }
  12710. #endif
  12711. if (ssl->peerEccDsaKey == NULL) {
  12712. /* alloc/init on demand */
  12713. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  12714. (void**)&ssl->peerEccDsaKey);
  12715. } else if (ssl->peerEccDsaKeyPresent) {
  12716. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  12717. ssl->peerEccDsaKey);
  12718. ssl->peerEccDsaKeyPresent = 0;
  12719. }
  12720. if (keyRet != 0 ||
  12721. wc_EccPublicKeyDecode(args->dCert->publicKey, &idx,
  12722. ssl->peerEccDsaKey,
  12723. args->dCert->pubKeySize) != 0) {
  12724. ret = PEER_KEY_ERROR;
  12725. WOLFSSL_ERROR_VERBOSE(ret);
  12726. }
  12727. else {
  12728. ssl->peerEccDsaKeyPresent = 1;
  12729. #ifdef HAVE_PK_CALLBACKS
  12730. if (ssl->buffers.peerEccDsaKey.buffer)
  12731. XFREE(ssl->buffers.peerEccDsaKey.buffer,
  12732. ssl->heap, DYNAMIC_TYPE_ECC);
  12733. ssl->buffers.peerEccDsaKey.buffer =
  12734. (byte*)XMALLOC(args->dCert->pubKeySize,
  12735. ssl->heap, DYNAMIC_TYPE_ECC);
  12736. if (ssl->buffers.peerEccDsaKey.buffer == NULL) {
  12737. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  12738. }
  12739. else {
  12740. XMEMCPY(ssl->buffers.peerEccDsaKey.buffer,
  12741. args->dCert->publicKey,
  12742. args->dCert->pubKeySize);
  12743. ssl->buffers.peerEccDsaKey.length =
  12744. args->dCert->pubKeySize;
  12745. }
  12746. #endif /* HAVE_PK_CALLBACKS */
  12747. }
  12748. /* check size of peer ECC key */
  12749. if (ret == 0 && ssl->peerEccDsaKeyPresent &&
  12750. !ssl->options.verifyNone &&
  12751. wc_ecc_size(ssl->peerEccDsaKey)
  12752. < ssl->options.minEccKeySz) {
  12753. ret = ECC_KEY_SIZE_E;
  12754. WOLFSSL_ERROR_VERBOSE(ret);
  12755. WOLFSSL_MSG("Peer ECC key is too small");
  12756. }
  12757. /* populate curve oid - if missing */
  12758. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  12759. ssl->ecdhCurveOID = args->dCert->pkCurveOID;
  12760. break;
  12761. }
  12762. #endif /* HAVE_ECC */
  12763. #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
  12764. case ED25519k:
  12765. {
  12766. int keyRet = 0;
  12767. if (ssl->peerEd25519Key == NULL) {
  12768. /* alloc/init on demand */
  12769. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ED25519,
  12770. (void**)&ssl->peerEd25519Key);
  12771. } else if (ssl->peerEd25519KeyPresent) {
  12772. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ED25519,
  12773. ssl->peerEd25519Key);
  12774. ssl->peerEd25519KeyPresent = 0;
  12775. }
  12776. if (keyRet != 0 ||
  12777. wc_ed25519_import_public(args->dCert->publicKey,
  12778. args->dCert->pubKeySize,
  12779. ssl->peerEd25519Key)
  12780. != 0) {
  12781. ret = PEER_KEY_ERROR;
  12782. WOLFSSL_ERROR_VERBOSE(ret);
  12783. }
  12784. else {
  12785. ssl->peerEd25519KeyPresent = 1;
  12786. #ifdef HAVE_PK_CALLBACKS
  12787. ssl->buffers.peerEd25519Key.buffer =
  12788. (byte*)XMALLOC(args->dCert->pubKeySize,
  12789. ssl->heap, DYNAMIC_TYPE_ED25519);
  12790. if (ssl->buffers.peerEd25519Key.buffer == NULL) {
  12791. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  12792. }
  12793. else {
  12794. XMEMCPY(ssl->buffers.peerEd25519Key.buffer,
  12795. args->dCert->publicKey,
  12796. args->dCert->pubKeySize);
  12797. ssl->buffers.peerEd25519Key.length =
  12798. args->dCert->pubKeySize;
  12799. }
  12800. #endif /*HAVE_PK_CALLBACKS */
  12801. }
  12802. /* check size of peer ECC key */
  12803. if (ret == 0 && ssl->peerEd25519KeyPresent &&
  12804. !ssl->options.verifyNone &&
  12805. ED25519_KEY_SIZE < ssl->options.minEccKeySz) {
  12806. ret = ECC_KEY_SIZE_E;
  12807. WOLFSSL_ERROR_VERBOSE(ret);
  12808. WOLFSSL_MSG("Peer ECC key is too small");
  12809. }
  12810. /* populate curve oid - if missing */
  12811. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  12812. ssl->ecdhCurveOID = ECC_X25519_OID;
  12813. break;
  12814. }
  12815. #endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */
  12816. #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
  12817. case ED448k:
  12818. {
  12819. int keyRet = 0;
  12820. if (ssl->peerEd448Key == NULL) {
  12821. /* alloc/init on demand */
  12822. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ED448,
  12823. (void**)&ssl->peerEd448Key);
  12824. } else if (ssl->peerEd448KeyPresent) {
  12825. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ED448,
  12826. ssl->peerEd448Key);
  12827. ssl->peerEd448KeyPresent = 0;
  12828. }
  12829. if (keyRet != 0 ||
  12830. wc_ed448_import_public(args->dCert->publicKey,
  12831. args->dCert->pubKeySize,
  12832. ssl->peerEd448Key) != 0) {
  12833. ret = PEER_KEY_ERROR;
  12834. WOLFSSL_ERROR_VERBOSE(ret);
  12835. }
  12836. else {
  12837. ssl->peerEd448KeyPresent = 1;
  12838. #ifdef HAVE_PK_CALLBACKS
  12839. ssl->buffers.peerEd448Key.buffer =
  12840. (byte*)XMALLOC(args->dCert->pubKeySize,
  12841. ssl->heap, DYNAMIC_TYPE_ED448);
  12842. if (ssl->buffers.peerEd448Key.buffer == NULL) {
  12843. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  12844. }
  12845. else {
  12846. XMEMCPY(ssl->buffers.peerEd448Key.buffer,
  12847. args->dCert->publicKey,
  12848. args->dCert->pubKeySize);
  12849. ssl->buffers.peerEd448Key.length =
  12850. args->dCert->pubKeySize;
  12851. }
  12852. #endif /*HAVE_PK_CALLBACKS */
  12853. }
  12854. /* check size of peer ECC key */
  12855. if (ret == 0 && ssl->peerEd448KeyPresent &&
  12856. !ssl->options.verifyNone &&
  12857. ED448_KEY_SIZE < ssl->options.minEccKeySz) {
  12858. ret = ECC_KEY_SIZE_E;
  12859. WOLFSSL_ERROR_VERBOSE(ret);
  12860. WOLFSSL_MSG("Peer ECC key is too small");
  12861. }
  12862. /* populate curve oid - if missing */
  12863. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  12864. ssl->ecdhCurveOID = ECC_X448_OID;
  12865. break;
  12866. }
  12867. #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */
  12868. #if defined(HAVE_PQC)
  12869. #if defined(HAVE_FALCON)
  12870. case FALCON_LEVEL1k:
  12871. case FALCON_LEVEL5k:
  12872. {
  12873. int keyRet = 0;
  12874. if (ssl->peerFalconKey == NULL) {
  12875. /* alloc/init on demand */
  12876. keyRet = AllocKey(ssl, DYNAMIC_TYPE_FALCON,
  12877. (void**)&ssl->peerFalconKey);
  12878. } else if (ssl->peerFalconKeyPresent) {
  12879. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_FALCON,
  12880. ssl->peerFalconKey);
  12881. ssl->peerFalconKeyPresent = 0;
  12882. }
  12883. if (keyRet == 0) {
  12884. if (args->dCert->keyOID == FALCON_LEVEL1k) {
  12885. keyRet = wc_falcon_set_level(ssl->peerFalconKey,
  12886. 1);
  12887. }
  12888. else {
  12889. keyRet = wc_falcon_set_level(ssl->peerFalconKey,
  12890. 5);
  12891. }
  12892. }
  12893. if (keyRet != 0 ||
  12894. wc_falcon_import_public(args->dCert->publicKey,
  12895. args->dCert->pubKeySize,
  12896. ssl->peerFalconKey) != 0) {
  12897. ret = PEER_KEY_ERROR;
  12898. WOLFSSL_ERROR_VERBOSE(ret);
  12899. }
  12900. else {
  12901. ssl->peerFalconKeyPresent = 1;
  12902. }
  12903. /* check size of peer Falcon key */
  12904. if (ret == 0 && ssl->peerFalconKeyPresent &&
  12905. !ssl->options.verifyNone &&
  12906. FALCON_MAX_KEY_SIZE <
  12907. ssl->options.minFalconKeySz) {
  12908. ret = FALCON_KEY_SIZE_E;
  12909. WOLFSSL_ERROR_VERBOSE(ret);
  12910. WOLFSSL_MSG("Peer Falcon key is too small");
  12911. }
  12912. break;
  12913. }
  12914. #endif /* HAVE_FALCON */
  12915. #if defined(HAVE_DILITHIUM)
  12916. case DILITHIUM_LEVEL2k:
  12917. case DILITHIUM_LEVEL3k:
  12918. case DILITHIUM_LEVEL5k:
  12919. {
  12920. int keyRet = 0;
  12921. if (ssl->peerDilithiumKey == NULL) {
  12922. /* alloc/init on demand */
  12923. keyRet = AllocKey(ssl, DYNAMIC_TYPE_DILITHIUM,
  12924. (void**)&ssl->peerDilithiumKey);
  12925. } else if (ssl->peerDilithiumKeyPresent) {
  12926. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_DILITHIUM,
  12927. ssl->peerDilithiumKey);
  12928. ssl->peerDilithiumKeyPresent = 0;
  12929. }
  12930. if (keyRet == 0) {
  12931. if (args->dCert->keyOID == DILITHIUM_LEVEL2k) {
  12932. keyRet = wc_dilithium_set_level(
  12933. ssl->peerDilithiumKey, 2);
  12934. }
  12935. else if (args->dCert->keyOID == DILITHIUM_LEVEL3k) {
  12936. keyRet = wc_dilithium_set_level(
  12937. ssl->peerDilithiumKey, 3);
  12938. }
  12939. else if (args->dCert->keyOID == DILITHIUM_LEVEL5k) {
  12940. keyRet = wc_dilithium_set_level(
  12941. ssl->peerDilithiumKey, 5);
  12942. }
  12943. }
  12944. if (keyRet != 0 ||
  12945. wc_dilithium_import_public(args->dCert->publicKey,
  12946. args->dCert->pubKeySize,
  12947. ssl->peerDilithiumKey)
  12948. != 0) {
  12949. ret = PEER_KEY_ERROR;
  12950. }
  12951. else {
  12952. ssl->peerDilithiumKeyPresent = 1;
  12953. }
  12954. /* check size of peer Dilithium key */
  12955. if (ret == 0 && ssl->peerDilithiumKeyPresent &&
  12956. !ssl->options.verifyNone &&
  12957. DILITHIUM_MAX_KEY_SIZE <
  12958. ssl->options.minDilithiumKeySz) {
  12959. ret = DILITHIUM_KEY_SIZE_E;
  12960. WOLFSSL_MSG("Peer Dilithium key is too small");
  12961. }
  12962. break;
  12963. }
  12964. #endif /* HAVE_DILITHIUM */
  12965. #endif /* HAVE_PQC */
  12966. default:
  12967. break;
  12968. }
  12969. /* args->dCert free'd in function cleanup after callback */
  12970. } /* if (count > 0) */
  12971. /* Check for error */
  12972. if (args->fatal && ret != 0) {
  12973. goto exit_ppc;
  12974. }
  12975. /* Advance state and proceed */
  12976. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  12977. } /* case TLS_ASYNC_VERIFY */
  12978. FALL_THROUGH;
  12979. case TLS_ASYNC_FINALIZE:
  12980. {
  12981. /* load last error */
  12982. if (args->lastErr != 0 && ret == 0) {
  12983. ret = args->lastErr;
  12984. }
  12985. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12986. /* limit compliant with OpenSSL verify Depth + 1
  12987. * OpenSSL tries to expand the chain one longer than limit until
  12988. * reaching an ultimately trusted issuer. Becoming failure if
  12989. * we hit the limit, with WOLFSSL_X509_V_ERR_CERT_CHAIN_TOO_LONG
  12990. */
  12991. if (args->untrustedDepth > (ssl->options.verifyDepth + 1)) {
  12992. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  12993. ssl->peerVerifyRet = WOLFSSL_X509_V_ERR_CERT_CHAIN_TOO_LONG;
  12994. ret = MAX_CHAIN_ERROR;
  12995. WOLFSSL_ERROR_VERBOSE(ret);
  12996. }
  12997. #endif
  12998. /* Do verify callback */
  12999. ret = DoVerifyCallback(SSL_CM(ssl), ssl, ret, args);
  13000. if (ssl->options.verifyNone &&
  13001. (ret == CRL_MISSING || ret == CRL_CERT_REVOKED ||
  13002. ret == CRL_CERT_DATE_ERR)) {
  13003. WOLFSSL_MSG("Ignoring CRL problem based on verify setting");
  13004. ret = ssl->error = 0;
  13005. }
  13006. if (ret != 0) {
  13007. if (!ssl->options.verifyNone) {
  13008. DoCertFatalAlert(ssl, ret);
  13009. }
  13010. ssl->error = ret; /* Report SSL error */
  13011. }
  13012. if (ret == 0 && ssl->options.side == WOLFSSL_CLIENT_END) {
  13013. ssl->options.serverState = SERVER_CERT_COMPLETE;
  13014. }
  13015. if (IsEncryptionOn(ssl, 0)) {
  13016. args->idx += ssl->keys.padSz;
  13017. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13018. if (ssl->options.startedETMRead)
  13019. args->idx += MacSize(ssl);
  13020. #endif
  13021. }
  13022. /* Advance state and proceed */
  13023. ssl->options.asyncState = TLS_ASYNC_END;
  13024. } /* case TLS_ASYNC_FINALIZE */
  13025. FALL_THROUGH;
  13026. case TLS_ASYNC_END:
  13027. {
  13028. /* Set final index */
  13029. *inOutIdx = args->idx;
  13030. break;
  13031. }
  13032. default:
  13033. ret = INPUT_CASE_ERROR;
  13034. break;
  13035. } /* switch(ssl->options.asyncState) */
  13036. exit_ppc:
  13037. WOLFSSL_LEAVE("ProcessPeerCerts", ret);
  13038. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  13039. if (ret == WC_PENDING_E || ret == OCSP_WANT_READ) {
  13040. /* Mark message as not received so it can process again */
  13041. ssl->msgsReceived.got_certificate = 0;
  13042. return ret;
  13043. }
  13044. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  13045. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  13046. /* Cleanup async */
  13047. FreeAsyncCtx(ssl, 0);
  13048. #elif defined(WOLFSSL_SMALL_STACK)
  13049. if (args)
  13050. {
  13051. FreeProcPeerCertArgs(ssl, args);
  13052. }
  13053. #else
  13054. FreeProcPeerCertArgs(ssl, args);
  13055. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP || WOLFSSL_SMALL_STACK */
  13056. #if !defined(WOLFSSL_ASYNC_CRYPT) && defined(WOLFSSL_SMALL_STACK)
  13057. XFREE(args, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  13058. #endif
  13059. FreeKeyExchange(ssl);
  13060. return ret;
  13061. }
  13062. #endif
  13063. #ifndef WOLFSSL_NO_TLS12
  13064. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  13065. /* handle processing of certificate (11) */
  13066. static int DoCertificate(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  13067. word32 size)
  13068. {
  13069. int ret;
  13070. WOLFSSL_START(WC_FUNC_CERTIFICATE_DO);
  13071. WOLFSSL_ENTER("DoCertificate");
  13072. #ifdef SESSION_CERTS
  13073. /* Reset the session cert chain count in case the session resume failed. */
  13074. ssl->session->chain.count = 0;
  13075. #ifdef WOLFSSL_ALT_CERT_CHAINS
  13076. ssl->session->altChain.count = 0;
  13077. #endif
  13078. #endif /* SESSION_CERTS */
  13079. ret = ProcessPeerCerts(ssl, input, inOutIdx, size);
  13080. #ifdef OPENSSL_EXTRA
  13081. ssl->options.serverState = SERVER_CERT_COMPLETE;
  13082. #endif
  13083. WOLFSSL_LEAVE("DoCertificate", ret);
  13084. WOLFSSL_END(WC_FUNC_CERTIFICATE_DO);
  13085. return ret;
  13086. }
  13087. /* handle processing of certificate_status (22) */
  13088. static int DoCertificateStatus(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  13089. word32 size)
  13090. {
  13091. int ret = 0;
  13092. byte status_type;
  13093. word32 status_length;
  13094. WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_DO);
  13095. WOLFSSL_ENTER("DoCertificateStatus");
  13096. if (size < ENUM_LEN + OPAQUE24_LEN)
  13097. return BUFFER_ERROR;
  13098. status_type = input[(*inOutIdx)++];
  13099. c24to32(input + *inOutIdx, &status_length);
  13100. *inOutIdx += OPAQUE24_LEN;
  13101. if (size != ENUM_LEN + OPAQUE24_LEN + status_length)
  13102. return BUFFER_ERROR;
  13103. switch (status_type) {
  13104. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  13105. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  13106. /* WOLFSSL_CSR_OCSP overlaps with WOLFSSL_CSR2_OCSP */
  13107. case WOLFSSL_CSR2_OCSP:
  13108. ret = ProcessCSR(ssl, input, inOutIdx, status_length);
  13109. break;
  13110. #endif
  13111. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  13112. case WOLFSSL_CSR2_OCSP_MULTI: {
  13113. OcspRequest* request;
  13114. word32 list_length = status_length;
  13115. byte idx = 0;
  13116. #ifdef WOLFSSL_SMALL_STACK
  13117. CertStatus* status;
  13118. OcspEntry* single;
  13119. OcspResponse* response;
  13120. #else
  13121. CertStatus status[1];
  13122. OcspEntry single[1];
  13123. OcspResponse response[1];
  13124. #endif
  13125. do {
  13126. if (ssl->status_request_v2) {
  13127. ssl->status_request_v2 = 0;
  13128. break;
  13129. }
  13130. return BUFFER_ERROR;
  13131. } while(0);
  13132. #ifdef WOLFSSL_SMALL_STACK
  13133. status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
  13134. DYNAMIC_TYPE_OCSP_STATUS);
  13135. single = (OcspEntry*)XMALLOC(sizeof(OcspEntry), ssl->heap,
  13136. DYNAMIC_TYPE_OCSP_ENTRY);
  13137. response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
  13138. DYNAMIC_TYPE_OCSP_REQUEST);
  13139. if (status == NULL || single == NULL || response == NULL) {
  13140. if (status)
  13141. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  13142. if (single)
  13143. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  13144. if (response)
  13145. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  13146. return MEMORY_ERROR;
  13147. }
  13148. #endif
  13149. while (list_length && ret == 0) {
  13150. if (OPAQUE24_LEN > list_length) {
  13151. ret = BUFFER_ERROR;
  13152. break;
  13153. }
  13154. c24to32(input + *inOutIdx, &status_length);
  13155. *inOutIdx += OPAQUE24_LEN;
  13156. list_length -= OPAQUE24_LEN;
  13157. if (status_length > list_length) {
  13158. ret = BUFFER_ERROR;
  13159. break;
  13160. }
  13161. if (status_length) {
  13162. InitOcspResponse(response, single, status, input +*inOutIdx,
  13163. status_length, ssl->heap);
  13164. if ((OcspResponseDecode(response, SSL_CM(ssl), ssl->heap,
  13165. 0) != 0)
  13166. || (response->responseStatus != OCSP_SUCCESSFUL)
  13167. || (response->single->status->status != CERT_GOOD))
  13168. ret = BAD_CERTIFICATE_STATUS_ERROR;
  13169. while (ret == 0) {
  13170. request = (OcspRequest*)TLSX_CSR2_GetRequest(
  13171. ssl->extensions, status_type, idx++);
  13172. if (request == NULL)
  13173. ret = BAD_CERTIFICATE_STATUS_ERROR;
  13174. else if (CompareOcspReqResp(request, response) == 0)
  13175. break;
  13176. else if (idx == 1) /* server cert must be OK */
  13177. ret = BAD_CERTIFICATE_STATUS_ERROR;
  13178. }
  13179. FreeOcspResponse(response);
  13180. *inOutIdx += status_length;
  13181. list_length -= status_length;
  13182. }
  13183. }
  13184. ssl->status_request_v2 = 0;
  13185. #ifdef WOLFSSL_SMALL_STACK
  13186. XFREE(status, NULL, DYNAMIC_TYPE_OCSP_STATUS);
  13187. XFREE(single, NULL, DYNAMIC_TYPE_OCSP_ENTRY);
  13188. XFREE(response, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
  13189. #endif
  13190. }
  13191. break;
  13192. #endif
  13193. default:
  13194. ret = BUFFER_ERROR;
  13195. }
  13196. if (ret != 0) {
  13197. WOLFSSL_ERROR_VERBOSE(ret);
  13198. SendAlert(ssl, alert_fatal, bad_certificate_status_response);
  13199. }
  13200. if (IsEncryptionOn(ssl, 0)) {
  13201. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13202. if (ssl->options.startedETMRead) {
  13203. word32 digestSz = MacSize(ssl);
  13204. if (*inOutIdx + ssl->keys.padSz + digestSz > size)
  13205. return BUFFER_E;
  13206. *inOutIdx += ssl->keys.padSz + digestSz;
  13207. }
  13208. else
  13209. #endif
  13210. {
  13211. if (*inOutIdx + ssl->keys.padSz > size)
  13212. return BUFFER_E;
  13213. *inOutIdx += ssl->keys.padSz;
  13214. }
  13215. }
  13216. WOLFSSL_LEAVE("DoCertificateStatus", ret);
  13217. WOLFSSL_END(WC_FUNC_CERTIFICATE_STATUS_DO);
  13218. return ret;
  13219. }
  13220. #endif
  13221. #endif /* !WOLFSSL_NO_TLS12 */
  13222. #endif /* !NO_CERTS */
  13223. #ifndef WOLFSSL_NO_TLS12
  13224. static int DoHelloRequest(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  13225. word32 size, word32 totalSz)
  13226. {
  13227. (void)input;
  13228. WOLFSSL_START(WC_FUNC_HELLO_REQUEST_DO);
  13229. WOLFSSL_ENTER("DoHelloRequest");
  13230. if (size) /* must be 0 */
  13231. return BUFFER_ERROR;
  13232. if (IsEncryptionOn(ssl, 0)) {
  13233. /* If size == totalSz then we are in DtlsMsgDrain so no need to worry
  13234. * about padding */
  13235. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13236. if (ssl->options.startedETMRead) {
  13237. word32 digestSz = MacSize(ssl);
  13238. if (size != totalSz &&
  13239. *inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  13240. return BUFFER_E;
  13241. *inOutIdx += ssl->keys.padSz + digestSz;
  13242. }
  13243. else
  13244. #endif
  13245. {
  13246. /* access beyond input + size should be checked against totalSz */
  13247. if (size != totalSz &&
  13248. *inOutIdx + ssl->keys.padSz > totalSz)
  13249. return BUFFER_E;
  13250. *inOutIdx += ssl->keys.padSz;
  13251. }
  13252. }
  13253. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13254. SendAlert(ssl, alert_fatal, unexpected_message); /* try */
  13255. WOLFSSL_ERROR_VERBOSE(FATAL_ERROR);
  13256. return FATAL_ERROR;
  13257. }
  13258. #ifdef HAVE_SECURE_RENEGOTIATION
  13259. else if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  13260. ssl->secure_renegotiation->startScr = 1;
  13261. WOLFSSL_LEAVE("DoHelloRequest", 0);
  13262. WOLFSSL_END(WC_FUNC_HELLO_REQUEST_DO);
  13263. return 0;
  13264. }
  13265. #endif
  13266. else {
  13267. return SendAlert(ssl, alert_warning, no_renegotiation);
  13268. }
  13269. }
  13270. int DoFinished(WOLFSSL* ssl, const byte* input, word32* inOutIdx, word32 size,
  13271. word32 totalSz, int sniff)
  13272. {
  13273. word32 finishedSz = (ssl->options.tls ? TLS_FINISHED_SZ : FINISHED_SZ);
  13274. WOLFSSL_START(WC_FUNC_FINISHED_DO);
  13275. WOLFSSL_ENTER("DoFinished");
  13276. if (finishedSz != size)
  13277. return BUFFER_ERROR;
  13278. /* check against totalSz
  13279. * If size == totalSz then we are in DtlsMsgDrain so no need to worry about
  13280. * padding */
  13281. if (size != totalSz) {
  13282. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13283. if (ssl->options.startedETMRead) {
  13284. if (*inOutIdx + size + ssl->keys.padSz + MacSize(ssl) > totalSz)
  13285. return BUFFER_E;
  13286. }
  13287. else
  13288. #endif
  13289. {
  13290. if (*inOutIdx + size + ssl->keys.padSz > totalSz)
  13291. return BUFFER_E;
  13292. }
  13293. }
  13294. #ifdef WOLFSSL_CALLBACKS
  13295. if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
  13296. if (ssl->toInfoOn) AddLateName("Finished", &ssl->timeoutInfo);
  13297. #endif
  13298. if (sniff == NO_SNIFF) {
  13299. if (XMEMCMP(input + *inOutIdx, &ssl->hsHashes->verifyHashes,size) != 0){
  13300. WOLFSSL_MSG("Verify finished error on hashes");
  13301. WOLFSSL_ERROR_VERBOSE(VERIFY_FINISHED_ERROR);
  13302. return VERIFY_FINISHED_ERROR;
  13303. }
  13304. }
  13305. #ifdef HAVE_SECURE_RENEGOTIATION
  13306. if (ssl->secure_renegotiation) {
  13307. /* save peer's state */
  13308. if (ssl->options.side == WOLFSSL_CLIENT_END)
  13309. XMEMCPY(ssl->secure_renegotiation->server_verify_data,
  13310. input + *inOutIdx, TLS_FINISHED_SZ);
  13311. else
  13312. XMEMCPY(ssl->secure_renegotiation->client_verify_data,
  13313. input + *inOutIdx, TLS_FINISHED_SZ);
  13314. ssl->secure_renegotiation->verifySet = 1;
  13315. }
  13316. #endif
  13317. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  13318. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13319. XMEMCPY(ssl->serverFinished,
  13320. input + *inOutIdx, TLS_FINISHED_SZ);
  13321. ssl->serverFinished_len = TLS_FINISHED_SZ;
  13322. }
  13323. else {
  13324. XMEMCPY(ssl->clientFinished,
  13325. input + *inOutIdx, TLS_FINISHED_SZ);
  13326. ssl->clientFinished_len = TLS_FINISHED_SZ;
  13327. }
  13328. #endif
  13329. /* force input exhaustion at ProcessReply consuming padSz */
  13330. *inOutIdx += size + ssl->keys.padSz;
  13331. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13332. if (ssl->options.startedETMRead)
  13333. *inOutIdx += MacSize(ssl);
  13334. #endif
  13335. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13336. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  13337. #ifdef OPENSSL_EXTRA
  13338. ssl->cbmode = SSL_CB_MODE_WRITE;
  13339. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  13340. #endif
  13341. if (!ssl->options.resuming) {
  13342. #ifdef OPENSSL_EXTRA
  13343. if (ssl->CBIS != NULL) {
  13344. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, WOLFSSL_SUCCESS);
  13345. }
  13346. #endif
  13347. ssl->options.handShakeState = HANDSHAKE_DONE;
  13348. ssl->options.handShakeDone = 1;
  13349. }
  13350. }
  13351. else {
  13352. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  13353. #ifdef OPENSSL_EXTRA
  13354. ssl->cbmode = SSL_CB_MODE_READ;
  13355. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  13356. #endif
  13357. if (ssl->options.resuming) {
  13358. #ifdef OPENSSL_EXTRA
  13359. if (ssl->CBIS != NULL) {
  13360. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, WOLFSSL_SUCCESS);
  13361. }
  13362. #endif
  13363. ssl->options.handShakeState = HANDSHAKE_DONE;
  13364. ssl->options.handShakeDone = 1;
  13365. }
  13366. }
  13367. #ifdef WOLFSSL_DTLS
  13368. if (ssl->options.dtls) {
  13369. if ((!ssl->options.resuming && ssl->options.side == WOLFSSL_CLIENT_END) ||
  13370. (ssl->options.resuming && ssl->options.side == WOLFSSL_SERVER_END)){
  13371. DtlsMsgPoolReset(ssl);
  13372. ssl->keys.dtls_handshake_number = 0;
  13373. ssl->keys.dtls_expected_peer_handshake_number = 0;
  13374. }
  13375. }
  13376. #endif
  13377. WOLFSSL_LEAVE("DoFinished", 0);
  13378. WOLFSSL_END(WC_FUNC_FINISHED_DO);
  13379. return 0;
  13380. }
  13381. /* Make sure no duplicates, no fast forward, or other problems; 0 on success */
  13382. static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
  13383. {
  13384. /* verify not a duplicate, mark received, check state */
  13385. switch (type) {
  13386. #ifndef NO_WOLFSSL_CLIENT
  13387. case hello_request:
  13388. #ifndef NO_WOLFSSL_SERVER
  13389. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13390. WOLFSSL_MSG("HelloRequest received by server");
  13391. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13392. return SIDE_ERROR;
  13393. }
  13394. #endif
  13395. if (ssl->msgsReceived.got_hello_request) {
  13396. WOLFSSL_MSG("Duplicate HelloRequest received");
  13397. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13398. return DUPLICATE_MSG_E;
  13399. }
  13400. ssl->msgsReceived.got_hello_request = 1;
  13401. break;
  13402. #endif
  13403. #ifndef NO_WOLFSSL_SERVER
  13404. case client_hello:
  13405. #ifndef NO_WOLFSSL_CLIENT
  13406. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13407. WOLFSSL_MSG("ClientHello received by client");
  13408. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13409. return SIDE_ERROR;
  13410. }
  13411. #endif
  13412. if (ssl->msgsReceived.got_client_hello) {
  13413. WOLFSSL_MSG("Duplicate ClientHello received");
  13414. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13415. return DUPLICATE_MSG_E;
  13416. }
  13417. ssl->msgsReceived.got_client_hello = 1;
  13418. break;
  13419. #endif
  13420. #ifndef NO_WOLFSSL_CLIENT
  13421. case server_hello:
  13422. #ifndef NO_WOLFSSL_SERVER
  13423. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13424. WOLFSSL_MSG("ServerHello received by server");
  13425. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13426. return SIDE_ERROR;
  13427. }
  13428. #endif
  13429. if (ssl->msgsReceived.got_server_hello) {
  13430. WOLFSSL_MSG("Duplicate ServerHello received");
  13431. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13432. return DUPLICATE_MSG_E;
  13433. }
  13434. ssl->msgsReceived.got_server_hello = 1;
  13435. break;
  13436. #endif
  13437. #ifndef NO_WOLFSSL_CLIENT
  13438. case hello_verify_request:
  13439. #ifndef NO_WOLFSSL_SERVER
  13440. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13441. WOLFSSL_MSG("HelloVerifyRequest received by server");
  13442. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13443. return SIDE_ERROR;
  13444. }
  13445. #endif
  13446. if (ssl->msgsReceived.got_hello_verify_request) {
  13447. WOLFSSL_MSG("Duplicate HelloVerifyRequest received");
  13448. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13449. return DUPLICATE_MSG_E;
  13450. }
  13451. ssl->msgsReceived.got_hello_verify_request = 1;
  13452. break;
  13453. #endif
  13454. #ifndef NO_WOLFSSL_CLIENT
  13455. case session_ticket:
  13456. #ifndef NO_WOLFSSL_SERVER
  13457. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13458. WOLFSSL_MSG("SessionTicket received by server");
  13459. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13460. return SIDE_ERROR;
  13461. }
  13462. #endif
  13463. if (ssl->msgsReceived.got_session_ticket) {
  13464. WOLFSSL_MSG("Duplicate SessionTicket received");
  13465. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13466. return DUPLICATE_MSG_E;
  13467. }
  13468. ssl->msgsReceived.got_session_ticket = 1;
  13469. break;
  13470. #endif
  13471. case certificate:
  13472. if (ssl->msgsReceived.got_certificate) {
  13473. WOLFSSL_MSG("Duplicate Certificate received");
  13474. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13475. return DUPLICATE_MSG_E;
  13476. }
  13477. ssl->msgsReceived.got_certificate = 1;
  13478. #ifndef NO_WOLFSSL_CLIENT
  13479. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13480. if ( ssl->msgsReceived.got_server_hello == 0) {
  13481. WOLFSSL_MSG("No ServerHello before Cert");
  13482. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13483. return OUT_OF_ORDER_E;
  13484. }
  13485. }
  13486. #endif
  13487. #ifndef NO_WOLFSSL_SERVER
  13488. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13489. if ( ssl->msgsReceived.got_client_hello == 0) {
  13490. WOLFSSL_MSG("No ClientHello before Cert");
  13491. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13492. return OUT_OF_ORDER_E;
  13493. }
  13494. }
  13495. #endif
  13496. break;
  13497. #ifndef NO_WOLFSSL_CLIENT
  13498. case certificate_status:
  13499. #ifndef NO_WOLFSSL_SERVER
  13500. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13501. WOLFSSL_MSG("CertificateStatus received by server");
  13502. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13503. return SIDE_ERROR;
  13504. }
  13505. #endif
  13506. if (ssl->msgsReceived.got_certificate_status) {
  13507. WOLFSSL_MSG("Duplicate CertificateStatus received");
  13508. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13509. return DUPLICATE_MSG_E;
  13510. }
  13511. ssl->msgsReceived.got_certificate_status = 1;
  13512. if (ssl->msgsReceived.got_certificate == 0) {
  13513. WOLFSSL_MSG("No Certificate before CertificateStatus");
  13514. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13515. return OUT_OF_ORDER_E;
  13516. }
  13517. if (ssl->msgsReceived.got_server_key_exchange != 0) {
  13518. WOLFSSL_MSG("CertificateStatus after ServerKeyExchange");
  13519. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13520. return OUT_OF_ORDER_E;
  13521. }
  13522. break;
  13523. #endif
  13524. #ifndef NO_WOLFSSL_CLIENT
  13525. case server_key_exchange:
  13526. #ifndef NO_WOLFSSL_SERVER
  13527. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13528. WOLFSSL_MSG("ServerKeyExchange received by server");
  13529. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13530. return SIDE_ERROR;
  13531. }
  13532. #endif
  13533. if (ssl->msgsReceived.got_server_key_exchange) {
  13534. WOLFSSL_MSG("Duplicate ServerKeyExchange received");
  13535. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13536. return DUPLICATE_MSG_E;
  13537. }
  13538. ssl->msgsReceived.got_server_key_exchange = 1;
  13539. if (ssl->msgsReceived.got_server_hello == 0) {
  13540. WOLFSSL_MSG("No ServerHello before ServerKeyExchange");
  13541. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13542. return OUT_OF_ORDER_E;
  13543. }
  13544. if (ssl->msgsReceived.got_certificate_status == 0) {
  13545. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  13546. if (ssl->status_request) {
  13547. int ret;
  13548. WOLFSSL_MSG("No CertificateStatus before ServerKeyExchange");
  13549. if ((ret = TLSX_CSR_ForceRequest(ssl)) != 0)
  13550. return ret;
  13551. }
  13552. #endif
  13553. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  13554. if (ssl->status_request_v2) {
  13555. int ret;
  13556. WOLFSSL_MSG("No CertificateStatus before ServerKeyExchange");
  13557. if ((ret = TLSX_CSR2_ForceRequest(ssl)) != 0)
  13558. return ret;
  13559. }
  13560. #endif
  13561. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  13562. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  13563. /* Check that a status request extension was seen as the
  13564. * CertificateStatus wasn't when an OCSP staple is required.
  13565. */
  13566. if (
  13567. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  13568. !ssl->status_request &&
  13569. #endif
  13570. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  13571. !ssl->status_request_v2 &&
  13572. #endif
  13573. SSL_CM(ssl)->ocspMustStaple) {
  13574. WOLFSSL_ERROR_VERBOSE(OCSP_CERT_UNKNOWN);
  13575. return OCSP_CERT_UNKNOWN;
  13576. }
  13577. #endif
  13578. }
  13579. break;
  13580. #endif
  13581. #ifndef NO_WOLFSSL_CLIENT
  13582. case certificate_request:
  13583. #ifndef NO_WOLFSSL_SERVER
  13584. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13585. WOLFSSL_MSG("CertificateRequest received by server");
  13586. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13587. return SIDE_ERROR;
  13588. }
  13589. #endif
  13590. if (ssl->msgsReceived.got_certificate_request) {
  13591. WOLFSSL_MSG("Duplicate CertificateRequest received");
  13592. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13593. return DUPLICATE_MSG_E;
  13594. }
  13595. ssl->msgsReceived.got_certificate_request = 1;
  13596. break;
  13597. #endif
  13598. #ifndef NO_WOLFSSL_CLIENT
  13599. case server_hello_done:
  13600. #ifndef NO_WOLFSSL_SERVER
  13601. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13602. WOLFSSL_MSG("ServerHelloDone received by server");
  13603. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13604. return SIDE_ERROR;
  13605. }
  13606. #endif
  13607. if (ssl->msgsReceived.got_server_hello_done) {
  13608. WOLFSSL_MSG("Duplicate ServerHelloDone received");
  13609. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13610. return DUPLICATE_MSG_E;
  13611. }
  13612. ssl->msgsReceived.got_server_hello_done = 1;
  13613. if (ssl->msgsReceived.got_certificate == 0) {
  13614. if (ssl->specs.kea == psk_kea ||
  13615. ssl->specs.kea == dhe_psk_kea ||
  13616. ssl->specs.kea == ecdhe_psk_kea ||
  13617. ssl->options.usingAnon_cipher) {
  13618. WOLFSSL_MSG("No Cert required");
  13619. }
  13620. else {
  13621. WOLFSSL_MSG("No Certificate before ServerHelloDone");
  13622. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13623. return OUT_OF_ORDER_E;
  13624. }
  13625. }
  13626. if (ssl->msgsReceived.got_server_key_exchange == 0) {
  13627. int pskNoServerHint = 0; /* not required in this case */
  13628. #ifndef NO_PSK
  13629. if (ssl->specs.kea == psk_kea &&
  13630. ssl->arrays != NULL &&
  13631. ssl->arrays->server_hint[0] == 0)
  13632. pskNoServerHint = 1;
  13633. #endif
  13634. if (ssl->specs.static_ecdh == 1 ||
  13635. ssl->specs.kea == rsa_kea ||
  13636. pskNoServerHint) {
  13637. WOLFSSL_MSG("No KeyExchange required");
  13638. }
  13639. else {
  13640. WOLFSSL_MSG("No ServerKeyExchange before ServerDone");
  13641. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13642. return OUT_OF_ORDER_E;
  13643. }
  13644. }
  13645. break;
  13646. #endif
  13647. #ifndef NO_WOLFSSL_SERVER
  13648. case certificate_verify:
  13649. #ifndef NO_WOLFSSL_CLIENT
  13650. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13651. WOLFSSL_MSG("CertificateVerify received by client");
  13652. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13653. return SIDE_ERROR;
  13654. }
  13655. #endif
  13656. if (ssl->msgsReceived.got_certificate_verify) {
  13657. WOLFSSL_MSG("Duplicate CertificateVerify received");
  13658. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13659. return DUPLICATE_MSG_E;
  13660. }
  13661. ssl->msgsReceived.got_certificate_verify = 1;
  13662. if ( ssl->msgsReceived.got_certificate == 0) {
  13663. WOLFSSL_MSG("No Cert before CertVerify");
  13664. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13665. return OUT_OF_ORDER_E;
  13666. }
  13667. break;
  13668. #endif
  13669. #ifndef NO_WOLFSSL_SERVER
  13670. case client_key_exchange:
  13671. #ifndef NO_WOLFSSL_CLIENT
  13672. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13673. WOLFSSL_MSG("ClientKeyExchange received by client");
  13674. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13675. return SIDE_ERROR;
  13676. }
  13677. #endif
  13678. if (ssl->msgsReceived.got_client_key_exchange) {
  13679. WOLFSSL_MSG("Duplicate ClientKeyExchange received");
  13680. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13681. return DUPLICATE_MSG_E;
  13682. }
  13683. ssl->msgsReceived.got_client_key_exchange = 1;
  13684. if (ssl->msgsReceived.got_client_hello == 0) {
  13685. WOLFSSL_MSG("No ClientHello before ClientKeyExchange");
  13686. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13687. return OUT_OF_ORDER_E;
  13688. }
  13689. break;
  13690. #endif
  13691. case finished:
  13692. if (ssl->msgsReceived.got_finished) {
  13693. WOLFSSL_MSG("Duplicate Finished received");
  13694. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13695. return DUPLICATE_MSG_E;
  13696. }
  13697. #ifdef WOLFSSL_DTLS
  13698. if (ssl->options.dtls) {
  13699. if (ssl->keys.curEpoch == 0) {
  13700. WOLFSSL_MSG("Finished received with epoch 0");
  13701. WOLFSSL_ERROR_VERBOSE(SEQUENCE_ERROR);
  13702. return SEQUENCE_ERROR;
  13703. }
  13704. }
  13705. #endif
  13706. ssl->msgsReceived.got_finished = 1;
  13707. if (ssl->msgsReceived.got_change_cipher == 0) {
  13708. WOLFSSL_MSG("Finished received before ChangeCipher");
  13709. WOLFSSL_ERROR_VERBOSE(NO_CHANGE_CIPHER_E);
  13710. return NO_CHANGE_CIPHER_E;
  13711. }
  13712. break;
  13713. case change_cipher_hs:
  13714. if (ssl->msgsReceived.got_change_cipher) {
  13715. WOLFSSL_MSG("Duplicate ChangeCipher received");
  13716. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13717. return DUPLICATE_MSG_E;
  13718. }
  13719. /* DTLS is going to ignore the CCS message if the client key
  13720. * exchange message wasn't received yet. */
  13721. if (!ssl->options.dtls)
  13722. ssl->msgsReceived.got_change_cipher = 1;
  13723. #ifndef NO_WOLFSSL_CLIENT
  13724. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13725. if (!ssl->options.resuming) {
  13726. if (ssl->msgsReceived.got_server_hello_done == 0) {
  13727. WOLFSSL_MSG("No ServerHelloDone before ChangeCipher");
  13728. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13729. return OUT_OF_ORDER_E;
  13730. }
  13731. }
  13732. else {
  13733. if (ssl->msgsReceived.got_server_hello == 0) {
  13734. WOLFSSL_MSG("No ServerHello before ChangeCipher on "
  13735. "Resume");
  13736. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13737. return OUT_OF_ORDER_E;
  13738. }
  13739. }
  13740. #ifdef HAVE_SESSION_TICKET
  13741. if (ssl->expect_session_ticket) {
  13742. WOLFSSL_MSG("Expected session ticket missing");
  13743. #ifdef WOLFSSL_DTLS
  13744. if (ssl->options.dtls) {
  13745. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13746. return OUT_OF_ORDER_E;
  13747. }
  13748. #endif
  13749. WOLFSSL_ERROR_VERBOSE(SESSION_TICKET_EXPECT_E);
  13750. return SESSION_TICKET_EXPECT_E;
  13751. }
  13752. #endif
  13753. }
  13754. #endif
  13755. #ifndef NO_WOLFSSL_SERVER
  13756. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13757. if (!ssl->options.resuming &&
  13758. ssl->msgsReceived.got_client_key_exchange == 0) {
  13759. WOLFSSL_MSG("No ClientKeyExchange before ChangeCipher");
  13760. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13761. return OUT_OF_ORDER_E;
  13762. }
  13763. #ifndef NO_CERTS
  13764. if (ssl->options.verifyPeer &&
  13765. ssl->options.havePeerCert) {
  13766. if (!ssl->options.havePeerVerify ||
  13767. !ssl->msgsReceived.got_certificate_verify) {
  13768. WOLFSSL_MSG("client didn't send cert verify");
  13769. #ifdef WOLFSSL_DTLS
  13770. if (ssl->options.dtls) {
  13771. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13772. return OUT_OF_ORDER_E;
  13773. }
  13774. #endif
  13775. WOLFSSL_ERROR_VERBOSE(NO_PEER_VERIFY);
  13776. return NO_PEER_VERIFY;
  13777. }
  13778. }
  13779. #endif
  13780. }
  13781. #endif
  13782. if (ssl->options.dtls)
  13783. ssl->msgsReceived.got_change_cipher = 1;
  13784. break;
  13785. default:
  13786. WOLFSSL_MSG("Unknown message type");
  13787. WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
  13788. return SANITY_MSG_E;
  13789. }
  13790. return 0;
  13791. }
  13792. static int DoHandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  13793. byte type, word32 size, word32 totalSz)
  13794. {
  13795. int ret = 0;
  13796. word32 expectedIdx;
  13797. WOLFSSL_ENTER("DoHandShakeMsgType");
  13798. #ifdef WOLFSSL_TLS13
  13799. if (type == hello_retry_request) {
  13800. return DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
  13801. totalSz);
  13802. }
  13803. #endif
  13804. /* make sure can read the message */
  13805. if (*inOutIdx + size > totalSz) {
  13806. WOLFSSL_MSG("Incomplete Data");
  13807. WOLFSSL_ERROR_VERBOSE(INCOMPLETE_DATA);
  13808. return INCOMPLETE_DATA;
  13809. }
  13810. expectedIdx = *inOutIdx + size +
  13811. (ssl->keys.encryptionOn ? ssl->keys.padSz : 0);
  13812. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13813. if (ssl->options.startedETMRead && ssl->keys.encryptionOn)
  13814. expectedIdx += MacSize(ssl);
  13815. #endif
  13816. #if !defined(NO_WOLFSSL_SERVER) && \
  13817. defined(HAVE_SECURE_RENEGOTIATION) && \
  13818. defined(HAVE_SERVER_RENEGOTIATION_INFO)
  13819. if (ssl->options.handShakeDone && type == client_hello &&
  13820. ssl->secure_renegotiation &&
  13821. ssl->secure_renegotiation->enabled)
  13822. {
  13823. WOLFSSL_MSG("Reset handshake state");
  13824. XMEMSET(&ssl->msgsReceived, 0, sizeof(MsgsReceived));
  13825. ssl->options.serverState = NULL_STATE;
  13826. ssl->options.clientState = NULL_STATE;
  13827. ssl->options.connectState = CONNECT_BEGIN;
  13828. ssl->options.acceptState = ACCEPT_FIRST_REPLY_DONE;
  13829. ssl->options.handShakeState = NULL_STATE;
  13830. ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED;
  13831. ret = InitHandshakeHashes(ssl);
  13832. if (ret != 0)
  13833. return ret;
  13834. }
  13835. #endif
  13836. /* sanity check msg received */
  13837. if ( (ret = SanityCheckMsgReceived(ssl, type)) != 0) {
  13838. WOLFSSL_MSG("Sanity Check on handshake message type received failed");
  13839. return ret;
  13840. }
  13841. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  13842. /* add name later, add the handshake header part back on and record layer
  13843. * header */
  13844. if (ssl->toInfoOn) {
  13845. ret = AddPacketInfo(ssl, 0, handshake, input + *inOutIdx -
  13846. HANDSHAKE_HEADER_SZ, size + HANDSHAKE_HEADER_SZ, READ_PROTO,
  13847. RECORD_HEADER_SZ, ssl->heap);
  13848. if (ret != 0)
  13849. return ret;
  13850. #ifdef WOLFSSL_CALLBACKS
  13851. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  13852. #endif
  13853. }
  13854. #endif
  13855. if (ssl->options.handShakeState == HANDSHAKE_DONE && type != hello_request){
  13856. WOLFSSL_MSG("HandShake message after handshake complete");
  13857. SendAlert(ssl, alert_fatal, unexpected_message);
  13858. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13859. return OUT_OF_ORDER_E;
  13860. }
  13861. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls == 0 &&
  13862. ssl->options.serverState == NULL_STATE && type != server_hello) {
  13863. WOLFSSL_MSG("First server message not server hello");
  13864. SendAlert(ssl, alert_fatal, unexpected_message);
  13865. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13866. return OUT_OF_ORDER_E;
  13867. }
  13868. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls &&
  13869. type == server_hello_done &&
  13870. ssl->options.serverState < SERVER_HELLO_COMPLETE) {
  13871. WOLFSSL_MSG("Server hello done received before server hello in DTLS");
  13872. SendAlert(ssl, alert_fatal, unexpected_message);
  13873. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13874. return OUT_OF_ORDER_E;
  13875. }
  13876. if (ssl->options.side == WOLFSSL_SERVER_END &&
  13877. ssl->options.clientState == NULL_STATE && type != client_hello) {
  13878. WOLFSSL_MSG("First client message not client hello");
  13879. SendAlert(ssl, alert_fatal, unexpected_message);
  13880. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13881. return OUT_OF_ORDER_E;
  13882. }
  13883. /* above checks handshake state */
  13884. /* hello_request not hashed */
  13885. if (type != hello_request
  13886. #ifdef WOLFSSL_ASYNC_CRYPT
  13887. && ssl->error != WC_PENDING_E
  13888. #endif
  13889. #ifdef WOLFSSL_NONBLOCK_OCSP
  13890. && ssl->error != OCSP_WANT_READ
  13891. #endif
  13892. ) {
  13893. ret = HashInput(ssl, input + *inOutIdx, size);
  13894. if (ret != 0) {
  13895. WOLFSSL_MSG("Incomplete handshake hashes");
  13896. return ret;
  13897. }
  13898. }
  13899. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13900. switch (type) {
  13901. case certificate:
  13902. case server_key_exchange:
  13903. case certificate_request:
  13904. case server_hello_done:
  13905. if (ssl->options.resuming) {
  13906. #ifdef WOLFSSL_WPAS
  13907. /* This can occur when ssl->sessionSecretCb is set. EAP-FAST
  13908. * (RFC 4851) allows for detecting server session resumption
  13909. * based on the msg received after the ServerHello. */
  13910. WOLFSSL_MSG("Not resuming as thought");
  13911. ssl->options.resuming = 0;
  13912. /* No longer resuming, reset peer authentication state. */
  13913. ssl->options.peerAuthGood = 0;
  13914. #else
  13915. /* Fatal error. Only try to send an alert. RFC 5246 does not
  13916. * allow for reverting back to a full handshake after the
  13917. * server has indicated the intention to do a resumption. */
  13918. (void)SendAlert(ssl, alert_fatal, unexpected_message);
  13919. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13920. return OUT_OF_ORDER_E;
  13921. #endif
  13922. }
  13923. }
  13924. }
  13925. #ifdef OPENSSL_EXTRA
  13926. if (ssl->CBIS != NULL){
  13927. ssl->cbmode = SSL_CB_MODE_READ;
  13928. ssl->cbtype = type;
  13929. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, WOLFSSL_SUCCESS);
  13930. }
  13931. #endif
  13932. switch (type) {
  13933. case hello_request:
  13934. WOLFSSL_MSG("processing hello request");
  13935. ret = DoHelloRequest(ssl, input, inOutIdx, size, totalSz);
  13936. break;
  13937. #ifndef NO_WOLFSSL_CLIENT
  13938. case hello_verify_request:
  13939. WOLFSSL_MSG("processing hello verify request");
  13940. ret = DoHelloVerifyRequest(ssl, input,inOutIdx, size);
  13941. if (IsEncryptionOn(ssl, 0)) {
  13942. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13943. if (ssl->options.startedETMRead) {
  13944. word32 digestSz = MacSize(ssl);
  13945. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  13946. return BUFFER_E;
  13947. *inOutIdx += ssl->keys.padSz + digestSz;
  13948. }
  13949. else
  13950. #endif
  13951. {
  13952. /* access beyond input + size should be checked against totalSz
  13953. */
  13954. if (*inOutIdx + ssl->keys.padSz > totalSz)
  13955. return BUFFER_E;
  13956. *inOutIdx += ssl->keys.padSz;
  13957. }
  13958. }
  13959. break;
  13960. case server_hello:
  13961. WOLFSSL_MSG("processing server hello");
  13962. ret = DoServerHello(ssl, input, inOutIdx, size);
  13963. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  13964. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  13965. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  13966. if (ssl->options.resuming || !IsAtLeastTLSv1_2(ssl) ||
  13967. IsAtLeastTLSv1_3(ssl->version)) {
  13968. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  13969. if (ret != WC_PENDING_E && ret != OCSP_WANT_READ)
  13970. #endif
  13971. {
  13972. ssl->options.cacheMessages = 0;
  13973. if ((ssl->hsHashes != NULL) && (ssl->hsHashes->messages != NULL)) {
  13974. ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
  13975. XFREE(ssl->hsHashes->messages, ssl->heap,
  13976. DYNAMIC_TYPE_HASHES);
  13977. ssl->hsHashes->messages = NULL;
  13978. }
  13979. }
  13980. }
  13981. #endif
  13982. break;
  13983. #ifndef NO_CERTS
  13984. case certificate_request:
  13985. WOLFSSL_MSG("processing certificate request");
  13986. ret = DoCertificateRequest(ssl, input, inOutIdx, size);
  13987. break;
  13988. #endif
  13989. case server_key_exchange:
  13990. WOLFSSL_MSG("processing server key exchange");
  13991. ret = DoServerKeyExchange(ssl, input, inOutIdx, size);
  13992. break;
  13993. #ifdef HAVE_SESSION_TICKET
  13994. case session_ticket:
  13995. WOLFSSL_MSG("processing session ticket");
  13996. ret = DoSessionTicket(ssl, input, inOutIdx, size);
  13997. break;
  13998. #endif /* HAVE_SESSION_TICKET */
  13999. #endif
  14000. #if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_CLIENT) || \
  14001. !defined(WOLFSSL_NO_CLIENT_AUTH))
  14002. case certificate:
  14003. WOLFSSL_MSG("processing certificate");
  14004. ret = DoCertificate(ssl, input, inOutIdx, size);
  14005. break;
  14006. case certificate_status:
  14007. WOLFSSL_MSG("processing certificate status");
  14008. ret = DoCertificateStatus(ssl, input, inOutIdx, size);
  14009. break;
  14010. #endif
  14011. case server_hello_done:
  14012. WOLFSSL_MSG("processing server hello done");
  14013. #ifdef WOLFSSL_CALLBACKS
  14014. if (ssl->hsInfoOn)
  14015. AddPacketName(ssl, "ServerHelloDone");
  14016. if (ssl->toInfoOn)
  14017. AddLateName("ServerHelloDone", &ssl->timeoutInfo);
  14018. #endif
  14019. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  14020. if (IsEncryptionOn(ssl, 0)) {
  14021. *inOutIdx += ssl->keys.padSz;
  14022. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14023. if (ssl->options.startedETMRead)
  14024. *inOutIdx += MacSize(ssl);
  14025. #endif
  14026. }
  14027. break;
  14028. case finished:
  14029. WOLFSSL_MSG("processing finished");
  14030. ret = DoFinished(ssl, input, inOutIdx, size, totalSz, NO_SNIFF);
  14031. break;
  14032. #ifndef NO_WOLFSSL_SERVER
  14033. case client_hello:
  14034. WOLFSSL_MSG("processing client hello");
  14035. ret = DoClientHello(ssl, input, inOutIdx, size);
  14036. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  14037. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  14038. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  14039. if (ssl->options.resuming || !ssl->options.verifyPeer || \
  14040. !IsAtLeastTLSv1_2(ssl) || IsAtLeastTLSv1_3(ssl->version)) {
  14041. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  14042. if (ret != WC_PENDING_E && ret != OCSP_WANT_READ)
  14043. #endif
  14044. {
  14045. ssl->options.cacheMessages = 0;
  14046. if ((ssl->hsHashes != NULL) && (ssl->hsHashes->messages != NULL)) {
  14047. ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
  14048. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  14049. ssl->hsHashes->messages = NULL;
  14050. }
  14051. }
  14052. }
  14053. #endif
  14054. /* If size == totalSz then we are in DtlsMsgDrain so no need to worry
  14055. * about padding */
  14056. if (IsEncryptionOn(ssl, 0)) {
  14057. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14058. if (ssl->options.startedETMRead) {
  14059. word32 digestSz = MacSize(ssl);
  14060. if (size != totalSz &&
  14061. *inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  14062. return BUFFER_E;
  14063. *inOutIdx += ssl->keys.padSz + digestSz;
  14064. }
  14065. else
  14066. #endif
  14067. {
  14068. /* access beyond input + size should be checked against totalSz
  14069. */
  14070. if (size != totalSz &&
  14071. *inOutIdx + ssl->keys.padSz > totalSz)
  14072. return BUFFER_E;
  14073. *inOutIdx += ssl->keys.padSz;
  14074. }
  14075. }
  14076. break;
  14077. case client_key_exchange:
  14078. WOLFSSL_MSG("processing client key exchange");
  14079. ret = DoClientKeyExchange(ssl, input, inOutIdx, size);
  14080. break;
  14081. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  14082. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  14083. case certificate_verify:
  14084. WOLFSSL_MSG("processing certificate verify");
  14085. ret = DoCertificateVerify(ssl, input, inOutIdx, size);
  14086. break;
  14087. #endif /* (!NO_RSA || ECC || ED25519 || ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  14088. #endif /* !NO_WOLFSSL_SERVER */
  14089. default:
  14090. WOLFSSL_MSG("Unknown handshake message type");
  14091. ret = UNKNOWN_HANDSHAKE_TYPE;
  14092. break;
  14093. }
  14094. if (ret == 0 && expectedIdx != *inOutIdx) {
  14095. WOLFSSL_MSG("Extra data in handshake message");
  14096. if (!ssl->options.dtls)
  14097. SendAlert(ssl, alert_fatal, decode_error);
  14098. ret = DECODE_E;
  14099. WOLFSSL_ERROR_VERBOSE(ret);
  14100. }
  14101. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  14102. /* if async, offset index so this msg will be processed again */
  14103. if ((ret == WC_PENDING_E || ret == OCSP_WANT_READ) && *inOutIdx > 0) {
  14104. *inOutIdx -= HANDSHAKE_HEADER_SZ;
  14105. #ifdef WOLFSSL_DTLS
  14106. if (ssl->options.dtls) {
  14107. *inOutIdx -= DTLS_HANDSHAKE_EXTRA;
  14108. }
  14109. #endif
  14110. }
  14111. /* make sure async error is cleared */
  14112. if (ret == 0 && (ssl->error == WC_PENDING_E || ssl->error == OCSP_WANT_READ)) {
  14113. ssl->error = 0;
  14114. }
  14115. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  14116. #ifdef WOLFSSL_DTLS
  14117. if (ret == 0) {
  14118. if (type == client_hello) {
  14119. /* Advance expected number only if cookie exchange complete */
  14120. if (ssl->msgsReceived.got_client_hello)
  14121. ssl->keys.dtls_expected_peer_handshake_number =
  14122. ssl->keys.dtls_peer_handshake_number + 1;
  14123. }
  14124. else if (type != finished) {
  14125. ssl->keys.dtls_expected_peer_handshake_number++;
  14126. }
  14127. }
  14128. #endif
  14129. WOLFSSL_LEAVE("DoHandShakeMsgType()", ret);
  14130. return ret;
  14131. }
  14132. static int DoHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  14133. word32 totalSz)
  14134. {
  14135. int ret = 0;
  14136. word32 inputLength;
  14137. WOLFSSL_ENTER("DoHandShakeMsg");
  14138. if (ssl->arrays == NULL) {
  14139. byte type;
  14140. word32 size;
  14141. if (GetHandShakeHeader(ssl,input,inOutIdx,&type, &size, totalSz) != 0) {
  14142. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  14143. return PARSE_ERROR;
  14144. }
  14145. return DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  14146. }
  14147. inputLength = ssl->buffers.inputBuffer.length - *inOutIdx;
  14148. /* If there is a pending fragmented handshake message,
  14149. * pending message size will be non-zero. */
  14150. if (ssl->arrays->pendingMsgSz == 0) {
  14151. byte type;
  14152. word32 size;
  14153. if (GetHandShakeHeader(ssl, input, inOutIdx, &type, &size,
  14154. totalSz) != 0) {
  14155. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  14156. return PARSE_ERROR;
  14157. }
  14158. /* Cap the maximum size of a handshake message to something reasonable.
  14159. * By default is the maximum size of a certificate message assuming
  14160. * nine 2048-bit RSA certificates in the chain. */
  14161. if (size > MAX_HANDSHAKE_SZ) {
  14162. WOLFSSL_MSG("Handshake message too large");
  14163. WOLFSSL_ERROR_VERBOSE(HANDSHAKE_SIZE_ERROR);
  14164. return HANDSHAKE_SIZE_ERROR;
  14165. }
  14166. /* size is the size of the certificate message payload */
  14167. if (inputLength - HANDSHAKE_HEADER_SZ < size) {
  14168. ssl->arrays->pendingMsgType = type;
  14169. ssl->arrays->pendingMsgSz = size + HANDSHAKE_HEADER_SZ;
  14170. ssl->arrays->pendingMsg = (byte*)XMALLOC(size + HANDSHAKE_HEADER_SZ,
  14171. ssl->heap,
  14172. DYNAMIC_TYPE_ARRAYS);
  14173. if (ssl->arrays->pendingMsg == NULL)
  14174. return MEMORY_E;
  14175. XMEMCPY(ssl->arrays->pendingMsg,
  14176. input + *inOutIdx - HANDSHAKE_HEADER_SZ,
  14177. inputLength);
  14178. ssl->arrays->pendingMsgOffset = inputLength;
  14179. *inOutIdx += inputLength - HANDSHAKE_HEADER_SZ;
  14180. return 0;
  14181. }
  14182. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  14183. }
  14184. else {
  14185. word32 pendSz =
  14186. ssl->arrays->pendingMsgSz - ssl->arrays->pendingMsgOffset;
  14187. /* Catch the case where there may be the remainder of a fragmented
  14188. * handshake message and the next handshake message in the same
  14189. * record. */
  14190. if (inputLength > pendSz)
  14191. inputLength = pendSz;
  14192. #ifdef WOLFSSL_ASYNC_CRYPT
  14193. if (ssl->error != WC_PENDING_E)
  14194. #endif
  14195. {
  14196. /* for async this copy was already done, do not replace, since
  14197. * contents may have been changed for inline operations */
  14198. XMEMCPY(ssl->arrays->pendingMsg + ssl->arrays->pendingMsgOffset,
  14199. input + *inOutIdx, inputLength);
  14200. }
  14201. ssl->arrays->pendingMsgOffset += inputLength;
  14202. *inOutIdx += inputLength;
  14203. if (ssl->arrays->pendingMsgOffset == ssl->arrays->pendingMsgSz)
  14204. {
  14205. word32 idx = HANDSHAKE_HEADER_SZ;
  14206. ret = DoHandShakeMsgType(ssl,
  14207. ssl->arrays->pendingMsg,
  14208. &idx, ssl->arrays->pendingMsgType,
  14209. ssl->arrays->pendingMsgSz - idx,
  14210. ssl->arrays->pendingMsgSz);
  14211. #ifdef WOLFSSL_ASYNC_CRYPT
  14212. if (ret == WC_PENDING_E) {
  14213. /* setup to process fragment again */
  14214. ssl->arrays->pendingMsgOffset -= inputLength;
  14215. *inOutIdx -= inputLength;
  14216. }
  14217. else
  14218. #endif
  14219. {
  14220. XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  14221. ssl->arrays->pendingMsg = NULL;
  14222. ssl->arrays->pendingMsgSz = 0;
  14223. }
  14224. }
  14225. }
  14226. WOLFSSL_LEAVE("DoHandShakeMsg()", ret);
  14227. return ret;
  14228. }
  14229. #endif /* !WOLFSSL_NO_TLS12 */
  14230. #ifdef WOLFSSL_EXTRA_ALERTS
  14231. void SendFatalAlertOnly(WOLFSSL *ssl, int error)
  14232. {
  14233. int why;
  14234. /* already sent a more specific fatal alert */
  14235. if (ssl->alert_history.last_tx.level == alert_fatal)
  14236. return;
  14237. switch (error) {
  14238. /* not fatal errors */
  14239. case WANT_WRITE:
  14240. case WANT_READ:
  14241. case ZERO_RETURN:
  14242. #ifdef WOLFSSL_ASYNC_CRYPT
  14243. case WC_PENDING_E:
  14244. #endif
  14245. return;
  14246. /* peer already disconnected and ssl is possibly in bad state
  14247. * don't try to send an alert */
  14248. case SOCKET_ERROR_E:
  14249. return;
  14250. case BUFFER_ERROR:
  14251. case ASN_PARSE_E:
  14252. case COMPRESSION_ERROR:
  14253. why = decode_error;
  14254. break;
  14255. case MATCH_SUITE_ERROR:
  14256. why = illegal_parameter;
  14257. break;
  14258. case VERIFY_FINISHED_ERROR:
  14259. case SIG_VERIFY_E:
  14260. why = decrypt_error;
  14261. break;
  14262. case DUPLICATE_MSG_E:
  14263. case NO_CHANGE_CIPHER_E:
  14264. case OUT_OF_ORDER_E:
  14265. why = unexpected_message;
  14266. break;
  14267. case ECC_OUT_OF_RANGE_E:
  14268. why = bad_record_mac;
  14269. break;
  14270. case VERSION_ERROR:
  14271. default:
  14272. why = handshake_failure;
  14273. break;
  14274. }
  14275. SendAlert(ssl, alert_fatal, why);
  14276. }
  14277. #else
  14278. void SendFatalAlertOnly(WOLFSSL *ssl, int error)
  14279. {
  14280. (void)ssl;
  14281. (void)error;
  14282. /* no op */
  14283. }
  14284. #endif /* WOLFSSL_EXTRA_ALERTS */
  14285. #ifdef WOLFSSL_DTLS
  14286. static int _DtlsCheckWindow(WOLFSSL* ssl)
  14287. {
  14288. word32* window;
  14289. word16 cur_hi, next_hi;
  14290. word32 cur_lo, next_lo, diff;
  14291. int curLT;
  14292. WOLFSSL_DTLS_PEERSEQ* peerSeq = NULL;
  14293. if (!ssl->options.haveMcast)
  14294. peerSeq = ssl->keys.peerSeq;
  14295. else {
  14296. #ifdef WOLFSSL_MULTICAST
  14297. WOLFSSL_DTLS_PEERSEQ* p;
  14298. int i;
  14299. for (i = 0, p = ssl->keys.peerSeq;
  14300. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  14301. i++, p++) {
  14302. if (p->peerId == ssl->keys.curPeerId) {
  14303. peerSeq = p;
  14304. break;
  14305. }
  14306. }
  14307. #endif
  14308. }
  14309. if (peerSeq == NULL) {
  14310. WOLFSSL_MSG("Could not find peer sequence");
  14311. return 0;
  14312. }
  14313. if (ssl->keys.curEpoch == peerSeq->nextEpoch) {
  14314. next_hi = peerSeq->nextSeq_hi;
  14315. next_lo = peerSeq->nextSeq_lo;
  14316. window = peerSeq->window;
  14317. }
  14318. else if (ssl->keys.curEpoch == peerSeq->nextEpoch - 1) {
  14319. next_hi = peerSeq->prevSeq_hi;
  14320. next_lo = peerSeq->prevSeq_lo;
  14321. window = peerSeq->prevWindow;
  14322. }
  14323. else {
  14324. return 0;
  14325. }
  14326. cur_hi = ssl->keys.curSeq_hi;
  14327. cur_lo = ssl->keys.curSeq_lo;
  14328. /* If the difference between next and cur is > 2^32, way outside window. */
  14329. if ((cur_hi > next_hi + 1) || (next_hi > cur_hi + 1)) {
  14330. WOLFSSL_MSG("Current record from way too far in the future.");
  14331. return 0;
  14332. }
  14333. if (cur_hi == next_hi) {
  14334. curLT = cur_lo < next_lo;
  14335. diff = curLT ? next_lo - cur_lo : cur_lo - next_lo;
  14336. }
  14337. else {
  14338. curLT = cur_hi < next_hi;
  14339. diff = curLT ? cur_lo - next_lo : next_lo - cur_lo;
  14340. }
  14341. /* Check to see that the next value is greater than the number of messages
  14342. * trackable in the window, and that the difference between the next
  14343. * expected sequence number and the received sequence number is inside the
  14344. * window. */
  14345. if ((next_hi || next_lo > DTLS_SEQ_BITS) &&
  14346. curLT && (diff > DTLS_SEQ_BITS)) {
  14347. WOLFSSL_MSG("Current record sequence number from the past.");
  14348. return 0;
  14349. }
  14350. #ifdef WOLFSSL_DTLS_DISALLOW_FUTURE
  14351. else if (!curLT && (diff > DTLS_SEQ_BITS)) {
  14352. WOLFSSL_MSG("Rejecting message too far into the future.");
  14353. return 0;
  14354. }
  14355. #endif
  14356. else if (curLT) {
  14357. word32 idx;
  14358. word32 newDiff;
  14359. if (diff == 0) {
  14360. WOLFSSL_MSG("DTLS sanity check failed");
  14361. return 0;
  14362. }
  14363. diff--;
  14364. idx = diff / DTLS_WORD_BITS;
  14365. newDiff = diff % DTLS_WORD_BITS;
  14366. /* verify idx is valid for window array */
  14367. if (idx >= WOLFSSL_DTLS_WINDOW_WORDS) {
  14368. WOLFSSL_MSG("Invalid DTLS windows index");
  14369. return 0;
  14370. }
  14371. if (window[idx] & (1 << newDiff)) {
  14372. WOLFSSL_MSG("Current record sequence number already received.");
  14373. return 0;
  14374. }
  14375. }
  14376. return 1;
  14377. }
  14378. #ifdef WOLFSSL_DTLS13
  14379. static WC_INLINE int Dtls13CheckWindow(WOLFSSL* ssl)
  14380. {
  14381. w64wrapper nextSeq, seq;
  14382. w64wrapper diff64;
  14383. word32 *window;
  14384. int wordOffset;
  14385. int wordIndex;
  14386. word32 diff;
  14387. if (ssl->dtls13DecryptEpoch == NULL) {
  14388. WOLFSSL_MSG("Can't find decrypting epoch");
  14389. return 0;
  14390. }
  14391. nextSeq = ssl->dtls13DecryptEpoch->nextPeerSeqNumber;
  14392. window = ssl->dtls13DecryptEpoch->window;
  14393. seq = ssl->keys.curSeq;
  14394. if (w64GTE(seq, nextSeq))
  14395. return 1;
  14396. /* seq < nextSeq, nextSeq - seq */
  14397. diff64 = w64Sub(nextSeq, seq);
  14398. /* diff >= DTLS_SEQ_BITS, outside of the window */
  14399. if (w64GT(diff64, w64From32(0, DTLS_SEQ_BITS)))
  14400. return 0;
  14401. /* we are assuming DTLS_SEQ_BITS <= 2**32 */
  14402. diff = w64GetLow32(diff64);
  14403. /* zero based index */
  14404. diff--;
  14405. wordIndex = ((int)diff) / DTLS_WORD_BITS;
  14406. wordOffset = ((int)diff) % DTLS_WORD_BITS;
  14407. if (window[wordIndex] & (1 << wordOffset))
  14408. return 0;
  14409. return 1;
  14410. }
  14411. #endif /* WOLFSSL_DTLS13 */
  14412. #ifdef WOLFSSL_MULTICAST
  14413. static WC_INLINE word32 UpdateHighwaterMark(word32 cur, word32 first,
  14414. word32 second, word32 high)
  14415. {
  14416. word32 newCur = 0;
  14417. if (cur < first)
  14418. newCur = first;
  14419. else if (cur < second)
  14420. newCur = second;
  14421. else if (cur < high)
  14422. newCur = high;
  14423. return newCur;
  14424. }
  14425. #endif /* WOLFSSL_MULTICAST */
  14426. /* diff is the difference between the message sequence and the
  14427. * expected sequence number. 0 is special where it is an overflow. */
  14428. static void _DtlsUpdateWindowGTSeq(word32 diff, word32* window)
  14429. {
  14430. word32 oldWindow[WOLFSSL_DTLS_WINDOW_WORDS];
  14431. if (diff == 0 || diff >= DTLS_SEQ_BITS)
  14432. XMEMSET(window, 0, DTLS_SEQ_SZ);
  14433. else {
  14434. word32 i;
  14435. word32 temp = 0;
  14436. word32 idx = diff / DTLS_WORD_BITS;
  14437. diff %= DTLS_WORD_BITS;
  14438. XMEMCPY(oldWindow, window, sizeof(oldWindow));
  14439. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  14440. if (i < idx)
  14441. window[i] = 0;
  14442. else {
  14443. temp |= (oldWindow[i-idx] << diff);
  14444. window[i] = temp;
  14445. if (diff > 0)
  14446. temp = oldWindow[i-idx] >> (DTLS_WORD_BITS - diff);
  14447. else
  14448. temp = 0;
  14449. }
  14450. }
  14451. }
  14452. window[0] |= 1;
  14453. }
  14454. int wolfSSL_DtlsUpdateWindow(word16 cur_hi, word32 cur_lo,
  14455. word16* next_hi, word32* next_lo, word32 *window)
  14456. {
  14457. word32 diff;
  14458. int curLT;
  14459. if (cur_hi == *next_hi) {
  14460. curLT = cur_lo < *next_lo;
  14461. diff = curLT ? *next_lo - cur_lo : cur_lo - *next_lo;
  14462. }
  14463. else {
  14464. if (cur_hi > *next_hi + 1) {
  14465. /* reset window */
  14466. _DtlsUpdateWindowGTSeq(0, window);
  14467. *next_lo = cur_lo + 1;
  14468. if (*next_lo == 0)
  14469. *next_hi = cur_hi + 1;
  14470. else
  14471. *next_hi = cur_hi;
  14472. return 1;
  14473. }
  14474. else if (*next_hi > cur_hi + 1) {
  14475. return 1;
  14476. }
  14477. else {
  14478. curLT = cur_hi < *next_hi;
  14479. if (curLT) {
  14480. if (*next_lo < DTLS_SEQ_BITS &&
  14481. cur_lo >= (((word32)0xFFFFFFFF) - DTLS_SEQ_BITS)) {
  14482. /* diff here can still result in a difference that can not
  14483. * be stored in the window. The index is checked against
  14484. * WOLFSSL_DTLS_WINDOW_WORDS later. */
  14485. diff = *next_lo + ((word32)0xFFFFFFFF - cur_lo) + 1;
  14486. }
  14487. else {
  14488. /* Too far back to update */
  14489. return 1;
  14490. }
  14491. }
  14492. else {
  14493. if (*next_lo >= (((word32)0xFFFFFFFF) - DTLS_SEQ_BITS) &&
  14494. cur_lo < DTLS_SEQ_BITS) {
  14495. /* diff here can still result in a difference that can not
  14496. * be stored in the window. The index is checked against
  14497. * WOLFSSL_DTLS_WINDOW_WORDS later. */
  14498. diff = cur_lo - *next_lo;
  14499. }
  14500. else {
  14501. _DtlsUpdateWindowGTSeq(0, window);
  14502. *next_lo = cur_lo + 1;
  14503. if (*next_lo == 0)
  14504. *next_hi = cur_hi + 1;
  14505. else
  14506. *next_hi = cur_hi;
  14507. return 1;
  14508. }
  14509. }
  14510. }
  14511. }
  14512. if (curLT) {
  14513. word32 idx;
  14514. diff--;
  14515. idx = diff / DTLS_WORD_BITS;
  14516. diff %= DTLS_WORD_BITS;
  14517. if (idx < WOLFSSL_DTLS_WINDOW_WORDS)
  14518. window[idx] |= (1 << diff);
  14519. }
  14520. else {
  14521. _DtlsUpdateWindowGTSeq(diff + 1, window);
  14522. *next_lo = cur_lo + 1;
  14523. if (*next_lo == 0)
  14524. *next_hi = cur_hi + 1;
  14525. else
  14526. *next_hi = cur_hi;
  14527. }
  14528. return 1;
  14529. }
  14530. static int _DtlsUpdateWindow(WOLFSSL* ssl)
  14531. {
  14532. WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq;
  14533. word16 *next_hi;
  14534. word32 *next_lo;
  14535. word32* window;
  14536. #ifdef WOLFSSL_MULTICAST
  14537. word32 cur_lo = ssl->keys.curSeq_lo;
  14538. if (ssl->options.haveMcast) {
  14539. WOLFSSL_DTLS_PEERSEQ* p;
  14540. int i;
  14541. peerSeq = NULL;
  14542. for (i = 0, p = ssl->keys.peerSeq;
  14543. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  14544. i++, p++) {
  14545. if (p->peerId == ssl->keys.curPeerId) {
  14546. peerSeq = p;
  14547. break;
  14548. }
  14549. }
  14550. if (peerSeq == NULL) {
  14551. WOLFSSL_MSG("Couldn't find that peer ID to update window.");
  14552. return 0;
  14553. }
  14554. if (p->highwaterMark && cur_lo >= p->highwaterMark) {
  14555. int cbError = 0;
  14556. if (ssl->ctx->mcastHwCb)
  14557. cbError = ssl->ctx->mcastHwCb(p->peerId,
  14558. ssl->ctx->mcastMaxSeq,
  14559. cur_lo, ssl->mcastHwCbCtx);
  14560. if (cbError) {
  14561. WOLFSSL_MSG("Multicast highwater callback returned an error.");
  14562. return MCAST_HIGHWATER_CB_E;
  14563. }
  14564. p->highwaterMark = UpdateHighwaterMark(cur_lo,
  14565. ssl->ctx->mcastFirstSeq,
  14566. ssl->ctx->mcastSecondSeq,
  14567. ssl->ctx->mcastMaxSeq);
  14568. }
  14569. }
  14570. #endif
  14571. if (ssl->keys.curEpoch == peerSeq->nextEpoch) {
  14572. next_hi = &peerSeq->nextSeq_hi;
  14573. next_lo = &peerSeq->nextSeq_lo;
  14574. window = peerSeq->window;
  14575. }
  14576. else {
  14577. next_hi = &peerSeq->prevSeq_hi;
  14578. next_lo = &peerSeq->prevSeq_lo;
  14579. window = peerSeq->prevWindow;
  14580. }
  14581. return wolfSSL_DtlsUpdateWindow(ssl->keys.curSeq_hi, ssl->keys.curSeq_lo,
  14582. next_hi, next_lo, window);
  14583. }
  14584. #ifdef WOLFSSL_DTLS13
  14585. static WC_INLINE int Dtls13UpdateWindow(WOLFSSL* ssl)
  14586. {
  14587. w64wrapper nextSeq, seq;
  14588. w64wrapper diff64;
  14589. word32 *window;
  14590. int wordOffset;
  14591. int wordIndex;
  14592. word32 diff;
  14593. if (ssl->dtls13DecryptEpoch == NULL) {
  14594. WOLFSSL_MSG("Can't find decrypting Epoch");
  14595. return BAD_STATE_E;
  14596. }
  14597. nextSeq = ssl->dtls13DecryptEpoch->nextPeerSeqNumber;
  14598. window = ssl->dtls13DecryptEpoch->window;
  14599. seq = ssl->keys.curSeq;
  14600. /* seq < nextSeq */
  14601. if (w64LT(seq, nextSeq)) {
  14602. diff64 = w64Sub(nextSeq, seq);
  14603. /* zero based index */
  14604. w64Decrement(&diff64);
  14605. /* FIXME: check that diff64 < DTLS_WORDS_BITS */
  14606. diff = w64GetLow32(diff64);
  14607. wordIndex = ((int)diff) / DTLS_WORD_BITS;
  14608. wordOffset = ((int)diff) % DTLS_WORD_BITS;
  14609. if (wordIndex >= WOLFSSL_DTLS_WINDOW_WORDS) {
  14610. WOLFSSL_MSG("Invalid sequence number to Dtls13UpdateWindow");
  14611. return BAD_STATE_E;
  14612. }
  14613. window[wordIndex] |= (1 << wordOffset);
  14614. return 1;
  14615. }
  14616. /* seq >= nextSeq, seq - nextSeq */
  14617. diff64 = w64Sub(seq, nextSeq);
  14618. /* as we are considering nextSeq inside the window, we should add + 1 */
  14619. w64Increment(&diff64);
  14620. _DtlsUpdateWindowGTSeq(w64GetLow32(diff64), window);
  14621. w64Increment(&seq);
  14622. ssl->dtls13DecryptEpoch->nextPeerSeqNumber = seq;
  14623. return 1;
  14624. }
  14625. #endif /* WOLFSSL_DTLS13 */
  14626. int DtlsMsgDrain(WOLFSSL* ssl)
  14627. {
  14628. DtlsMsg* item = ssl->dtls_rx_msg_list;
  14629. int ret = 0;
  14630. WOLFSSL_ENTER("DtlsMsgDrain");
  14631. /* While there is an item in the store list, and it is the expected
  14632. * message, and it is complete, and there hasn't been an error in the
  14633. * last message... */
  14634. while (item != NULL &&
  14635. ssl->keys.dtls_expected_peer_handshake_number == item->seq &&
  14636. item->ready && ret == 0) {
  14637. word32 idx = 0;
  14638. #ifdef WOLFSSL_NO_TLS12
  14639. ret = DoTls13HandShakeMsgType(ssl, item->fullMsg, &idx, item->type,
  14640. item->sz, item->sz);
  14641. #else
  14642. ret = DoHandShakeMsgType(ssl, item->fullMsg, &idx, item->type,
  14643. item->sz, item->sz);
  14644. #endif
  14645. if (ret == 0) {
  14646. DtlsTxMsgListClean(ssl);
  14647. }
  14648. else if (!IsAtLeastTLSv1_3(ssl->version)) {
  14649. SendFatalAlertOnly(ssl, ret);
  14650. }
  14651. #ifdef WOLFSSL_ASYNC_CRYPT
  14652. if (ret == WC_PENDING_E) {
  14653. break;
  14654. }
  14655. #endif
  14656. ssl->dtls_rx_msg_list = item->next;
  14657. DtlsMsgDelete(item, ssl->heap);
  14658. item = ssl->dtls_rx_msg_list;
  14659. ssl->dtls_rx_msg_list_sz--;
  14660. }
  14661. WOLFSSL_LEAVE("DtlsMsgDrain()", ret);
  14662. return ret;
  14663. }
  14664. static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  14665. word32 totalSz)
  14666. {
  14667. byte type;
  14668. word32 size;
  14669. word32 fragOffset, fragSz;
  14670. int ret = 0;
  14671. int ignoreFinished = 0;
  14672. WOLFSSL_ENTER("DoDtlsHandShakeMsg");
  14673. /* parse header */
  14674. if (GetDtlsHandShakeHeader(ssl, input, inOutIdx, &type,
  14675. &size, &fragOffset, &fragSz, totalSz) != 0) {
  14676. WOLFSSL_ERROR(PARSE_ERROR);
  14677. return PARSE_ERROR;
  14678. }
  14679. /* Cap the maximum size of a handshake message to something reasonable.
  14680. * By default is the maximum size of a certificate message assuming
  14681. * nine 2048-bit RSA certificates in the chain. */
  14682. if (size > MAX_HANDSHAKE_SZ) {
  14683. WOLFSSL_MSG("Handshake message too large");
  14684. return HANDSHAKE_SIZE_ERROR;
  14685. }
  14686. /* check that we have complete fragment */
  14687. if (*inOutIdx + fragSz > totalSz) {
  14688. WOLFSSL_ERROR(INCOMPLETE_DATA);
  14689. return INCOMPLETE_DATA;
  14690. }
  14691. /* check that the fragment is contained in the message */
  14692. if (fragOffset + fragSz > size) {
  14693. WOLFSSL_ERROR(LENGTH_ERROR);
  14694. return LENGTH_ERROR;
  14695. }
  14696. if (type == finished && ssl->keys.dtls_peer_handshake_number >=
  14697. ssl->keys.dtls_expected_peer_handshake_number &&
  14698. ssl->keys.curEpoch == ssl->keys.dtls_epoch) {
  14699. /* finished msg should be ignore from the current epoch
  14700. * if it comes from a previous handshake */
  14701. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  14702. ignoreFinished = ssl->options.connectState < FINISHED_DONE;
  14703. }
  14704. else {
  14705. ignoreFinished = ssl->options.acceptState < ACCEPT_FINISHED_DONE;
  14706. }
  14707. }
  14708. #if !defined(NO_WOLFSSL_SERVER)
  14709. if (ssl->options.side == WOLFSSL_SERVER_END &&
  14710. ssl->options.acceptState < ACCEPT_FIRST_REPLY_DONE &&
  14711. type != client_hello) {
  14712. WOLFSSL_MSG("Ignoring other messages before we verify a ClientHello");
  14713. *inOutIdx = totalSz;
  14714. return 0;
  14715. }
  14716. #endif
  14717. /* Check the handshake sequence number first. If out of order,
  14718. * add the current message to the list. If the message is in order,
  14719. * but it is a fragment, add the current message to the list, then
  14720. * check the head of the list to see if it is complete, if so, pop
  14721. * it out as the current message. If the message is complete and in
  14722. * order, process it. Check the head of the list to see if it is in
  14723. * order, if so, process it. (Repeat until list exhausted.) If the
  14724. * head is out of order, return for more processing.
  14725. */
  14726. if (ssl->keys.dtls_peer_handshake_number >
  14727. ssl->keys.dtls_expected_peer_handshake_number &&
  14728. /* Only client_hello shouldn't be ignored if the handshake
  14729. * num is greater */
  14730. (type == client_hello ||
  14731. ssl->options.handShakeState != HANDSHAKE_DONE) &&
  14732. !ignoreFinished) {
  14733. /* Current message is out of order. It will get stored in the list.
  14734. * Storing also takes care of defragmentation. If the messages is a
  14735. * client hello, we need to process this out of order; the server
  14736. * is not supposed to keep state, but the second client hello will
  14737. * have a different handshake sequence number than is expected, and
  14738. * the server shouldn't be expecting any particular handshake sequence
  14739. * number. (If the cookie changes multiple times in quick succession,
  14740. * the client could be sending multiple new client hello messages
  14741. * with newer and newer cookies.) */
  14742. if (type != client_hello) {
  14743. WOLFSSL_MSG("Current message is out of order");
  14744. if (ssl->dtls_rx_msg_list_sz >= DTLS_POOL_SZ) {
  14745. WOLFSSL_MSG("Reached rx msg limit error");
  14746. return DTLS_TOO_MANY_FRAGMENTS_E;
  14747. }
  14748. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  14749. ssl->keys.dtls_peer_handshake_number,
  14750. input + *inOutIdx, size, type,
  14751. fragOffset, fragSz, ssl->heap);
  14752. *inOutIdx += fragSz;
  14753. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14754. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  14755. word32 digestSz = MacSize(ssl);
  14756. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz) {
  14757. WOLFSSL_ERROR(BUFFER_E);
  14758. return BUFFER_E;
  14759. }
  14760. *inOutIdx += digestSz;
  14761. }
  14762. else
  14763. #endif
  14764. {
  14765. if (*inOutIdx + ssl->keys.padSz > totalSz) {
  14766. WOLFSSL_ERROR(BUFFER_E);
  14767. return BUFFER_E;
  14768. }
  14769. }
  14770. *inOutIdx += ssl->keys.padSz;
  14771. ret = 0;
  14772. #ifndef WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT
  14773. /* If we receive an out of order last flight msg then retransmit */
  14774. if (type == server_hello_done || type == finished) {
  14775. ret = DtlsMsgPoolSend(ssl, 0);
  14776. }
  14777. #endif
  14778. }
  14779. else {
  14780. if (fragSz < size) {
  14781. /* a fragmented ClientHello, very probably forged or
  14782. erroneous. Even if the packet is valid, we don't want to save
  14783. state while processing a ClientHello to avoid DoS attacks */
  14784. WOLFSSL_MSG("Ignoring datagram with fragmented ClientHello");
  14785. *inOutIdx = totalSz;
  14786. }
  14787. else {
  14788. #ifdef WOLFSSL_NO_TLS12
  14789. ret = DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
  14790. totalSz);
  14791. #else
  14792. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size,
  14793. totalSz);
  14794. #endif
  14795. }
  14796. }
  14797. }
  14798. else if (ssl->keys.dtls_peer_handshake_number <
  14799. ssl->keys.dtls_expected_peer_handshake_number ||
  14800. /* ignore all handshake messages if we are done with the
  14801. * handshake */
  14802. (ssl->keys.dtls_peer_handshake_number >
  14803. ssl->keys.dtls_expected_peer_handshake_number &&
  14804. ssl->options.handShakeState == HANDSHAKE_DONE) ||
  14805. ignoreFinished) {
  14806. /* Already saw this message and processed it. It can be ignored. */
  14807. WOLFSSL_MSG("Already saw this message and processed it");
  14808. *inOutIdx += fragSz;
  14809. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14810. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  14811. word32 digestSz = MacSize(ssl);
  14812. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz) {
  14813. WOLFSSL_ERROR(BUFFER_E);
  14814. return BUFFER_E;
  14815. }
  14816. *inOutIdx += digestSz;
  14817. }
  14818. else
  14819. #endif
  14820. {
  14821. if (*inOutIdx + ssl->keys.padSz > totalSz) {
  14822. WOLFSSL_ERROR(BUFFER_E);
  14823. return BUFFER_E;
  14824. }
  14825. }
  14826. #ifndef WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT
  14827. if (IsDtlsNotSctpMode(ssl) &&
  14828. VerifyForDtlsMsgPoolSend(ssl, type, fragOffset)) {
  14829. ret = DtlsMsgPoolSend(ssl, 0);
  14830. }
  14831. #endif
  14832. *inOutIdx += ssl->keys.padSz;
  14833. }
  14834. else if (fragSz < size) {
  14835. /* Since this branch is in order, but fragmented, dtls_rx_msg_list will
  14836. * be pointing to the message with this fragment in it. Check it to see
  14837. * if it is completed. */
  14838. WOLFSSL_MSG("Branch is in order, but fragmented");
  14839. if (type == client_hello) {
  14840. WOLFSSL_MSG("Ignoring datagram with fragmented ClientHello");
  14841. *inOutIdx = totalSz;
  14842. return 0;
  14843. }
  14844. if (ssl->dtls_rx_msg_list_sz >= DTLS_POOL_SZ) {
  14845. WOLFSSL_MSG("Reached rx msg limit error");
  14846. WOLFSSL_ERROR(DTLS_TOO_MANY_FRAGMENTS_E);
  14847. return DTLS_TOO_MANY_FRAGMENTS_E;
  14848. }
  14849. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  14850. ssl->keys.dtls_peer_handshake_number,
  14851. input + *inOutIdx, size, type,
  14852. fragOffset, fragSz, ssl->heap);
  14853. *inOutIdx += fragSz;
  14854. *inOutIdx += ssl->keys.padSz;
  14855. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14856. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  14857. word32 digestSz = MacSize(ssl);
  14858. if (*inOutIdx + digestSz > totalSz) {
  14859. WOLFSSL_ERROR(BUFFER_E);
  14860. return BUFFER_E;
  14861. }
  14862. *inOutIdx += digestSz;
  14863. }
  14864. #endif
  14865. ret = 0;
  14866. if (ssl->dtls_rx_msg_list != NULL && ssl->dtls_rx_msg_list->ready)
  14867. ret = DtlsMsgDrain(ssl);
  14868. }
  14869. else {
  14870. /* This branch is in order next, and a complete message. On success
  14871. * clean the tx list. */
  14872. WOLFSSL_MSG("Branch is in order and a complete message");
  14873. #ifdef WOLFSSL_ASYNC_CRYPT
  14874. if (ssl->devId != INVALID_DEVID) {
  14875. word32 idx = *inOutIdx;
  14876. if (ssl->dtls_rx_msg_list_sz >= DTLS_POOL_SZ) {
  14877. WOLFSSL_ERROR(BUFFER_ERROR);
  14878. return BUFFER_ERROR;
  14879. }
  14880. if (idx + fragSz + ssl->keys.padSz > totalSz)
  14881. return BUFFER_E;
  14882. *inOutIdx = idx + fragSz + ssl->keys.padSz;
  14883. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14884. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  14885. word32 digestSz = MacSize(ssl);
  14886. if (*inOutIdx + digestSz > totalSz)
  14887. return BUFFER_E;
  14888. *inOutIdx += digestSz;
  14889. }
  14890. #endif
  14891. /* In async mode always store the message and process it with
  14892. * DtlsMsgDrain because in case of a WC_PENDING_E it will be
  14893. * easier this way. */
  14894. if (ssl->dtls_rx_msg_list_sz >= DTLS_POOL_SZ) {
  14895. WOLFSSL_MSG("Reached rx msg limit error");
  14896. return DTLS_TOO_MANY_FRAGMENTS_E;
  14897. }
  14898. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  14899. ssl->keys.dtls_peer_handshake_number,
  14900. input + idx, size, type,
  14901. fragOffset, fragSz, ssl->heap);
  14902. ret = DtlsMsgDrain(ssl);
  14903. }
  14904. else
  14905. #endif
  14906. {
  14907. #ifdef WOLFSSL_NO_TLS12
  14908. ret = DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
  14909. totalSz);
  14910. #else
  14911. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  14912. #endif
  14913. if (ret == 0) {
  14914. DtlsTxMsgListClean(ssl);
  14915. if (ssl->dtls_rx_msg_list != NULL) {
  14916. ret = DtlsMsgDrain(ssl);
  14917. }
  14918. }
  14919. }
  14920. }
  14921. WOLFSSL_LEAVE("DoDtlsHandShakeMsg()", ret);
  14922. return ret;
  14923. }
  14924. #endif /* WOLFSSL_DTLS13 */
  14925. #ifndef WOLFSSL_NO_TLS12
  14926. #ifdef HAVE_AEAD
  14927. #if (!defined(NO_PUBLIC_GCM_SET_IV) && \
  14928. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  14929. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))) || \
  14930. (defined(HAVE_POLY1305) && defined(HAVE_CHACHA))
  14931. static WC_INLINE void AeadIncrementExpIV(WOLFSSL* ssl)
  14932. {
  14933. int i;
  14934. for (i = AEAD_MAX_EXP_SZ-1; i >= 0; i--) {
  14935. if (++ssl->keys.aead_exp_IV[i]) return;
  14936. }
  14937. }
  14938. #endif
  14939. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && !defined(NO_CHAPOL_AEAD)
  14940. /* Used for the older version of creating AEAD tags with Poly1305 */
  14941. static int Poly1305TagOld(WOLFSSL* ssl, byte* additional, const byte* out,
  14942. byte* cipher, word16 sz, byte* tag)
  14943. {
  14944. int ret = 0;
  14945. int msglen = (sz - ssl->specs.aead_mac_size);
  14946. word32 keySz = 32;
  14947. byte padding[8]; /* used to temporarily store lengths */
  14948. #ifdef CHACHA_AEAD_TEST
  14949. printf("Using old version of poly1305 input.\n");
  14950. #endif
  14951. if (msglen < 0)
  14952. return INPUT_CASE_ERROR;
  14953. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, cipher, keySz)) != 0)
  14954. return ret;
  14955. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, additional,
  14956. AEAD_AUTH_DATA_SZ)) != 0)
  14957. return ret;
  14958. /* length of additional input plus padding */
  14959. XMEMSET(padding, 0, sizeof(padding));
  14960. padding[0] = AEAD_AUTH_DATA_SZ;
  14961. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, padding,
  14962. sizeof(padding))) != 0)
  14963. return ret;
  14964. /* add cipher info and then its length */
  14965. XMEMSET(padding, 0, sizeof(padding));
  14966. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, out, msglen)) != 0)
  14967. return ret;
  14968. /* 32 bit size of cipher to 64 bit endian */
  14969. padding[0] = msglen & 0xff;
  14970. padding[1] = (msglen >> 8) & 0xff;
  14971. padding[2] = ((word32)msglen >> 16) & 0xff;
  14972. padding[3] = ((word32)msglen >> 24) & 0xff;
  14973. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, padding, sizeof(padding)))
  14974. != 0)
  14975. return ret;
  14976. /* generate tag */
  14977. if ((ret = wc_Poly1305Final(ssl->auth.poly1305, tag)) != 0)
  14978. return ret;
  14979. return ret;
  14980. }
  14981. /* When the flag oldPoly is not set this follows RFC7905. When oldPoly is set
  14982. * the implementation follows an older draft for creating the nonce and MAC.
  14983. * The flag oldPoly gets set automatically depending on what cipher suite was
  14984. * negotiated in the handshake. This is able to be done because the IDs for the
  14985. * cipher suites was updated in RFC7905 giving unique values for the older
  14986. * draft in comparison to the more recent RFC.
  14987. *
  14988. * ssl WOLFSSL structure to get cipher and TLS state from
  14989. * out output buffer to hold encrypted data
  14990. * input data to encrypt
  14991. * sz size of input
  14992. *
  14993. * Return 0 on success negative values in error case
  14994. */
  14995. int ChachaAEADEncrypt(WOLFSSL* ssl, byte* out, const byte* input,
  14996. word16 sz)
  14997. {
  14998. const byte* additionalSrc = input - RECORD_HEADER_SZ;
  14999. int ret = 0;
  15000. word32 msgLen = (sz - ssl->specs.aead_mac_size);
  15001. byte tag[POLY1305_AUTH_SZ];
  15002. byte add[AEAD_AUTH_DATA_SZ];
  15003. byte nonce[CHACHA20_NONCE_SZ];
  15004. byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for poly1305 */
  15005. #ifdef CHACHA_AEAD_TEST
  15006. int i;
  15007. #endif
  15008. Keys* keys = &ssl->keys;
  15009. XMEMSET(tag, 0, sizeof(tag));
  15010. XMEMSET(nonce, 0, sizeof(nonce));
  15011. XMEMSET(poly, 0, sizeof(poly));
  15012. XMEMSET(add, 0, sizeof(add));
  15013. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  15014. /*
  15015. * For epochs 2+:
  15016. * * use ssl->secure_renegotiation when encrypting the current epoch as it
  15017. * has the current epoch cipher material
  15018. * * use PREV_ORDER if encrypting the epoch not in
  15019. * ssl->secure_renegotiation
  15020. */
  15021. /* opaque SEQ number stored for AD */
  15022. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  15023. if (ssl->keys.dtls_epoch ==
  15024. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  15025. keys = &ssl->secure_renegotiation->tmp_keys;
  15026. WriteSEQ(ssl, CUR_ORDER, add);
  15027. }
  15028. else
  15029. WriteSEQ(ssl, PREV_ORDER, add);
  15030. }
  15031. else
  15032. #endif
  15033. WriteSEQ(ssl, CUR_ORDER, add);
  15034. if (ssl->options.oldPoly != 0) {
  15035. /* get nonce. SEQ should not be incremented again here */
  15036. XMEMCPY(nonce + CHACHA20_OLD_OFFSET, add, OPAQUE32_LEN * 2);
  15037. }
  15038. /* Store the type, version. Unfortunately, they are in
  15039. * the input buffer ahead of the plaintext. */
  15040. #ifdef WOLFSSL_DTLS
  15041. if (ssl->options.dtls) {
  15042. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  15043. }
  15044. #endif
  15045. /* add TLS message size to additional data */
  15046. add[AEAD_AUTH_DATA_SZ - 2] = (msgLen >> 8) & 0xff;
  15047. add[AEAD_AUTH_DATA_SZ - 1] = msgLen & 0xff;
  15048. XMEMCPY(add + AEAD_TYPE_OFFSET, additionalSrc, 3);
  15049. #ifdef CHACHA_AEAD_TEST
  15050. printf("Encrypt Additional : ");
  15051. for (i = 0; i < AEAD_AUTH_DATA_SZ; i++) {
  15052. printf("%02x", add[i]);
  15053. }
  15054. printf("\n\n");
  15055. printf("input before encryption :\n");
  15056. for (i = 0; i < sz; i++) {
  15057. printf("%02x", input[i]);
  15058. if ((i + 1) % 16 == 0)
  15059. printf("\n");
  15060. }
  15061. printf("\n");
  15062. #endif
  15063. if (ssl->options.oldPoly == 0) {
  15064. /* nonce is formed by 4 0x00 byte padded to the left followed by 8 byte
  15065. * record sequence number XORed with client_write_IV/server_write_IV */
  15066. XMEMCPY(nonce, keys->aead_enc_imp_IV, CHACHA20_IMP_IV_SZ);
  15067. nonce[4] ^= add[0];
  15068. nonce[5] ^= add[1];
  15069. nonce[6] ^= add[2];
  15070. nonce[7] ^= add[3];
  15071. nonce[8] ^= add[4];
  15072. nonce[9] ^= add[5];
  15073. nonce[10] ^= add[6];
  15074. nonce[11] ^= add[7];
  15075. }
  15076. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15077. wc_MemZero_Add("ChachaAEADEncrypt nonce", nonce, CHACHA20_NONCE_SZ);
  15078. #endif
  15079. /* set the nonce for chacha and get poly1305 key */
  15080. if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 0)) != 0) {
  15081. ForceZero(nonce, CHACHA20_NONCE_SZ);
  15082. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15083. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  15084. #endif
  15085. return ret;
  15086. }
  15087. /* create Poly1305 key using chacha20 keystream */
  15088. if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, poly,
  15089. poly, sizeof(poly))) != 0) {
  15090. ForceZero(nonce, CHACHA20_NONCE_SZ);
  15091. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15092. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  15093. #endif
  15094. return ret;
  15095. }
  15096. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15097. wc_MemZero_Add("ChachaAEADEncrypt poly", poly, CHACHA20_256_KEY_SIZE);
  15098. #endif
  15099. /* set the counter after getting poly1305 key */
  15100. if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 1)) != 0) {
  15101. ForceZero(nonce, CHACHA20_NONCE_SZ);
  15102. ForceZero(poly, sizeof(poly));
  15103. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15104. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  15105. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15106. #endif
  15107. return ret;
  15108. }
  15109. ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */
  15110. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15111. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  15112. #endif
  15113. /* encrypt the plain text */
  15114. if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, out,
  15115. input, msgLen)) != 0) {
  15116. ForceZero(poly, sizeof(poly));
  15117. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15118. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15119. #endif
  15120. return ret;
  15121. }
  15122. /* get the poly1305 tag using either old padding scheme or more recent */
  15123. if (ssl->options.oldPoly != 0) {
  15124. if ((ret = Poly1305TagOld(ssl, add, (const byte* )out,
  15125. poly, sz, tag)) != 0) {
  15126. ForceZero(poly, sizeof(poly));
  15127. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15128. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15129. #endif
  15130. return ret;
  15131. }
  15132. }
  15133. else {
  15134. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly,
  15135. sizeof(poly))) != 0) {
  15136. ForceZero(poly, sizeof(poly));
  15137. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15138. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15139. #endif
  15140. return ret;
  15141. }
  15142. if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add,
  15143. sizeof(add), out, msgLen, tag, sizeof(tag))) != 0) {
  15144. ForceZero(poly, sizeof(poly));
  15145. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15146. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15147. #endif
  15148. return ret;
  15149. }
  15150. }
  15151. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  15152. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15153. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15154. #endif
  15155. /* append tag to ciphertext */
  15156. XMEMCPY(out + msgLen, tag, sizeof(tag));
  15157. AeadIncrementExpIV(ssl);
  15158. #ifdef CHACHA_AEAD_TEST
  15159. printf("mac tag :\n");
  15160. for (i = 0; i < 16; i++) {
  15161. printf("%02x", tag[i]);
  15162. if ((i + 1) % 16 == 0)
  15163. printf("\n");
  15164. }
  15165. printf("\n\noutput after encrypt :\n");
  15166. for (i = 0; i < sz; i++) {
  15167. printf("%02x", out[i]);
  15168. if ((i + 1) % 16 == 0)
  15169. printf("\n");
  15170. }
  15171. printf("\n");
  15172. #endif
  15173. return ret;
  15174. }
  15175. /* When the flag oldPoly is not set this follows RFC7905. When oldPoly is set
  15176. * the implementation follows an older draft for creating the nonce and MAC.
  15177. * The flag oldPoly gets set automatically depending on what cipher suite was
  15178. * negotiated in the handshake. This is able to be done because the IDs for the
  15179. * cipher suites was updated in RFC7905 giving unique values for the older
  15180. * draft in comparison to the more recent RFC.
  15181. *
  15182. * ssl WOLFSSL structure to get cipher and TLS state from
  15183. * plain output buffer to hold decrypted data
  15184. * input data to decrypt
  15185. * sz size of input
  15186. *
  15187. * Return 0 on success negative values in error case
  15188. */
  15189. static int ChachaAEADDecrypt(WOLFSSL* ssl, byte* plain, const byte* input,
  15190. word16 sz)
  15191. {
  15192. byte add[AEAD_AUTH_DATA_SZ];
  15193. byte nonce[CHACHA20_NONCE_SZ];
  15194. byte tag[POLY1305_AUTH_SZ];
  15195. byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for mac */
  15196. int ret = 0;
  15197. int msgLen = (sz - ssl->specs.aead_mac_size);
  15198. Keys* keys = &ssl->keys;
  15199. #ifdef CHACHA_AEAD_TEST
  15200. int i;
  15201. printf("input before decrypt :\n");
  15202. for (i = 0; i < sz; i++) {
  15203. printf("%02x", input[i]);
  15204. if ((i + 1) % 16 == 0)
  15205. printf("\n");
  15206. }
  15207. printf("\n");
  15208. #endif
  15209. XMEMSET(tag, 0, sizeof(tag));
  15210. XMEMSET(poly, 0, sizeof(poly));
  15211. XMEMSET(nonce, 0, sizeof(nonce));
  15212. XMEMSET(add, 0, sizeof(add));
  15213. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  15214. /*
  15215. * For epochs 2+:
  15216. * * use ssl->secure_renegotiation when decrypting the latest epoch as it
  15217. * has the latest epoch cipher material
  15218. */
  15219. if (ssl->options.dtls && DtlsSCRKeysSet(ssl) &&
  15220. ssl->keys.curEpoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch)
  15221. keys = &ssl->secure_renegotiation->tmp_keys;
  15222. #endif
  15223. /* sequence number field is 64-bits */
  15224. WriteSEQ(ssl, PEER_ORDER, add);
  15225. if (ssl->options.oldPoly != 0) {
  15226. /* get nonce, SEQ should not be incremented again here */
  15227. XMEMCPY(nonce + CHACHA20_OLD_OFFSET, add, OPAQUE32_LEN * 2);
  15228. }
  15229. /* get AD info */
  15230. /* Store the type, version. */
  15231. add[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  15232. add[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  15233. add[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  15234. /* add TLS message size to additional data */
  15235. add[AEAD_AUTH_DATA_SZ - 2] = (msgLen >> 8) & 0xff;
  15236. add[AEAD_AUTH_DATA_SZ - 1] = msgLen & 0xff;
  15237. #ifdef CHACHA_AEAD_TEST
  15238. printf("Decrypt Additional : ");
  15239. for (i = 0; i < AEAD_AUTH_DATA_SZ; i++) {
  15240. printf("%02x", add[i]);
  15241. }
  15242. printf("\n\n");
  15243. #endif
  15244. if (ssl->options.oldPoly == 0) {
  15245. /* nonce is formed by 4 0x00 byte padded to the left followed by 8 byte
  15246. * record sequence number XORed with client_write_IV/server_write_IV */
  15247. XMEMCPY(nonce, keys->aead_dec_imp_IV, CHACHA20_IMP_IV_SZ);
  15248. nonce[4] ^= add[0];
  15249. nonce[5] ^= add[1];
  15250. nonce[6] ^= add[2];
  15251. nonce[7] ^= add[3];
  15252. nonce[8] ^= add[4];
  15253. nonce[9] ^= add[5];
  15254. nonce[10] ^= add[6];
  15255. nonce[11] ^= add[7];
  15256. }
  15257. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15258. wc_MemZero_Add("ChachaAEADEncrypt nonce", nonce, CHACHA20_NONCE_SZ);
  15259. #endif
  15260. /* set nonce and get poly1305 key */
  15261. if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 0)) != 0) {
  15262. ForceZero(nonce, CHACHA20_NONCE_SZ);
  15263. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15264. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  15265. #endif
  15266. return ret;
  15267. }
  15268. /* use chacha20 keystream to get poly1305 key for tag */
  15269. if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, poly,
  15270. poly, sizeof(poly))) != 0) {
  15271. ForceZero(nonce, CHACHA20_NONCE_SZ);
  15272. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15273. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  15274. #endif
  15275. return ret;
  15276. }
  15277. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15278. wc_MemZero_Add("ChachaAEADEncrypt poly", poly, CHACHA20_256_KEY_SIZE);
  15279. #endif
  15280. /* set counter after getting poly1305 key */
  15281. if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 1)) != 0) {
  15282. ForceZero(nonce, CHACHA20_NONCE_SZ);
  15283. ForceZero(poly, sizeof(poly));
  15284. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15285. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  15286. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15287. #endif
  15288. return ret;
  15289. }
  15290. ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */
  15291. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15292. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  15293. #endif
  15294. /* get the tag using Poly1305 */
  15295. if (ssl->options.oldPoly != 0) {
  15296. if ((ret = Poly1305TagOld(ssl, add, input, poly, sz, tag)) != 0) {
  15297. ForceZero(poly, sizeof(poly));
  15298. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15299. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15300. #endif
  15301. return ret;
  15302. }
  15303. }
  15304. else {
  15305. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly,
  15306. sizeof(poly))) != 0) {
  15307. ForceZero(poly, sizeof(poly));
  15308. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15309. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15310. #endif
  15311. return ret;
  15312. }
  15313. if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add,
  15314. sizeof(add), input, msgLen, tag, sizeof(tag))) != 0) {
  15315. ForceZero(poly, sizeof(poly));
  15316. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15317. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15318. #endif
  15319. return ret;
  15320. }
  15321. }
  15322. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  15323. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15324. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15325. #endif
  15326. /* check tag sent along with packet */
  15327. if (ConstantCompare(input + msgLen, tag, ssl->specs.aead_mac_size) != 0) {
  15328. WOLFSSL_MSG("MAC did not match");
  15329. if (!ssl->options.dtls)
  15330. SendAlert(ssl, alert_fatal, bad_record_mac);
  15331. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  15332. return VERIFY_MAC_ERROR;
  15333. }
  15334. /* if the tag was good decrypt message */
  15335. if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, plain,
  15336. input, msgLen)) != 0)
  15337. return ret;
  15338. #ifdef CHACHA_AEAD_TEST
  15339. printf("plain after decrypt :\n");
  15340. for (i = 0; i < sz; i++) {
  15341. printf("%02x", plain[i]);
  15342. if ((i + 1) % 16 == 0)
  15343. printf("\n");
  15344. }
  15345. printf("\n");
  15346. #endif
  15347. return ret;
  15348. }
  15349. #endif /* HAVE_CHACHA && HAVE_POLY1305 && !NO_CHAPOL_AEAD*/
  15350. #endif /* HAVE_AEAD */
  15351. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  15352. #if !defined(NO_GCM_ENCRYPT_EXTRA) && \
  15353. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  15354. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
  15355. /* The following type is used to share code between AES-GCM and AES-CCM. */
  15356. typedef int (*AesAuthEncryptFunc)(Aes* aes, byte* out,
  15357. const byte* in, word32 sz,
  15358. byte* iv, word32 ivSz,
  15359. byte* authTag, word32 authTagSz,
  15360. const byte* authIn, word32 authInSz);
  15361. #define AES_AUTH_ENCRYPT_FUNC AesAuthEncryptFunc
  15362. #define AES_GCM_ENCRYPT wc_AesGcmEncrypt_ex
  15363. #define AES_CCM_ENCRYPT wc_AesCcmEncrypt_ex
  15364. #else
  15365. #define AES_AUTH_ENCRYPT_FUNC wc_AesAuthEncryptFunc
  15366. #define AES_GCM_ENCRYPT wc_AesGcmEncrypt
  15367. #define AES_CCM_ENCRYPT wc_AesCcmEncrypt
  15368. #endif
  15369. #endif
  15370. static WC_INLINE int EncryptDo(WOLFSSL* ssl, byte* out, const byte* input,
  15371. word16 sz, int asyncOkay)
  15372. {
  15373. int ret = 0;
  15374. #ifdef WOLFSSL_ASYNC_CRYPT
  15375. WC_ASYNC_DEV* asyncDev = NULL;
  15376. word32 event_flags = WC_ASYNC_FLAG_CALL_AGAIN;
  15377. #else
  15378. (void)asyncOkay;
  15379. #endif
  15380. (void)out;
  15381. (void)input;
  15382. (void)sz;
  15383. if (input == NULL) {
  15384. return BAD_FUNC_ARG;
  15385. }
  15386. switch (ssl->specs.bulk_cipher_algorithm) {
  15387. #ifdef BUILD_ARC4
  15388. case wolfssl_rc4:
  15389. wc_Arc4Process(ssl->encrypt.arc4, out, input, sz);
  15390. break;
  15391. #endif
  15392. #ifdef BUILD_DES3
  15393. case wolfssl_triple_des:
  15394. #ifdef WOLFSSL_ASYNC_CRYPT
  15395. /* initialize event */
  15396. asyncDev = &ssl->encrypt.des3->asyncDev;
  15397. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  15398. if (ret != 0)
  15399. break;
  15400. #endif
  15401. ret = wc_Des3_CbcEncrypt(ssl->encrypt.des3, out, input, sz);
  15402. #ifdef WOLFSSL_ASYNC_CRYPT
  15403. if (ret == WC_PENDING_E && asyncOkay) {
  15404. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  15405. }
  15406. #endif
  15407. break;
  15408. #endif
  15409. #if defined(BUILD_AES) && defined(HAVE_AES_CBC)
  15410. case wolfssl_aes:
  15411. #ifdef WOLFSSL_ASYNC_CRYPT
  15412. /* initialize event */
  15413. asyncDev = &ssl->encrypt.aes->asyncDev;
  15414. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  15415. if (ret != 0)
  15416. break;
  15417. #endif
  15418. ret = wc_AesCbcEncrypt(ssl->encrypt.aes, out, input, sz);
  15419. #ifdef WOLFSSL_ASYNC_CRYPT
  15420. if (ret == WC_PENDING_E && asyncOkay) {
  15421. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  15422. }
  15423. #endif
  15424. break;
  15425. #endif
  15426. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  15427. case wolfssl_aes_gcm:
  15428. case wolfssl_aes_ccm:/* GCM AEAD macros use same size as CCM */
  15429. {
  15430. AES_AUTH_ENCRYPT_FUNC aes_auth_fn;
  15431. const byte* additionalSrc;
  15432. #ifdef WOLFSSL_ASYNC_CRYPT
  15433. /* initialize event */
  15434. asyncDev = &ssl->encrypt.aes->asyncDev;
  15435. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  15436. if (ret != 0)
  15437. break;
  15438. #endif
  15439. #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
  15440. aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  15441. ? AES_GCM_ENCRYPT : AES_CCM_ENCRYPT;
  15442. #elif defined(BUILD_AESGCM)
  15443. aes_auth_fn = AES_GCM_ENCRYPT;
  15444. #else
  15445. aes_auth_fn = AES_CCM_ENCRYPT;
  15446. #endif
  15447. additionalSrc = input - 5;
  15448. XMEMSET(ssl->encrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  15449. /* sequence number field is 64-bits */
  15450. WriteSEQ(ssl, CUR_ORDER, ssl->encrypt.additional);
  15451. /* Store the type, version. Unfortunately, they are in
  15452. * the input buffer ahead of the plaintext. */
  15453. #ifdef WOLFSSL_DTLS
  15454. if (ssl->options.dtls) {
  15455. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  15456. }
  15457. #endif
  15458. XMEMCPY(ssl->encrypt.additional + AEAD_TYPE_OFFSET,
  15459. additionalSrc, 3);
  15460. /* Store the length of the plain text minus the explicit
  15461. * IV length minus the authentication tag size. */
  15462. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  15463. ssl->encrypt.additional + AEAD_LEN_OFFSET);
  15464. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  15465. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  15466. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
  15467. XMEMCPY(ssl->encrypt.nonce,
  15468. ssl->keys.aead_enc_imp_IV, AESGCM_IMP_IV_SZ);
  15469. XMEMCPY(ssl->encrypt.nonce + AESGCM_IMP_IV_SZ,
  15470. ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
  15471. #endif
  15472. #ifdef HAVE_PK_CALLBACKS
  15473. ret = NOT_COMPILED_IN;
  15474. if (ssl->ctx && ssl->ctx->PerformTlsRecordProcessingCb) {
  15475. ret = ssl->ctx->PerformTlsRecordProcessingCb(ssl, 1,
  15476. out + AESGCM_EXP_IV_SZ, input + AESGCM_EXP_IV_SZ,
  15477. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  15478. ssl->encrypt.nonce, AESGCM_NONCE_SZ,
  15479. out + sz - ssl->specs.aead_mac_size,
  15480. ssl->specs.aead_mac_size,
  15481. ssl->encrypt.additional, AEAD_AUTH_DATA_SZ);
  15482. }
  15483. if (ret == NOT_COMPILED_IN)
  15484. #endif /* HAVE_PK_CALLBACKS */
  15485. {
  15486. ret = aes_auth_fn(ssl->encrypt.aes,
  15487. out + AESGCM_EXP_IV_SZ, input + AESGCM_EXP_IV_SZ,
  15488. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  15489. ssl->encrypt.nonce, AESGCM_NONCE_SZ,
  15490. out + sz - ssl->specs.aead_mac_size,
  15491. ssl->specs.aead_mac_size,
  15492. ssl->encrypt.additional, AEAD_AUTH_DATA_SZ);
  15493. }
  15494. #ifdef WOLFSSL_ASYNC_CRYPT
  15495. if (ret == WC_PENDING_E && asyncOkay) {
  15496. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  15497. }
  15498. #endif
  15499. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  15500. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  15501. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
  15502. XMEMCPY(out,
  15503. ssl->encrypt.nonce + AESGCM_IMP_IV_SZ, AESGCM_EXP_IV_SZ);
  15504. #endif
  15505. }
  15506. break;
  15507. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  15508. #ifdef HAVE_CAMELLIA
  15509. case wolfssl_camellia:
  15510. ret = wc_CamelliaCbcEncrypt(ssl->encrypt.cam, out, input, sz);
  15511. break;
  15512. #endif
  15513. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
  15514. !defined(NO_CHAPOL_AEAD)
  15515. case wolfssl_chacha:
  15516. ret = ChachaAEADEncrypt(ssl, out, input, sz);
  15517. break;
  15518. #endif
  15519. #ifdef HAVE_NULL_CIPHER
  15520. case wolfssl_cipher_null:
  15521. if (input != out) {
  15522. XMEMMOVE(out, input, sz);
  15523. }
  15524. break;
  15525. #endif
  15526. default:
  15527. WOLFSSL_MSG("wolfSSL Encrypt programming error");
  15528. ret = ENCRYPT_ERROR;
  15529. WOLFSSL_ERROR_VERBOSE(ret);
  15530. }
  15531. #ifdef WOLFSSL_ASYNC_CRYPT
  15532. /* if async is not okay, then block */
  15533. if (ret == WC_PENDING_E && !asyncOkay) {
  15534. ret = wc_AsyncWait(ret, asyncDev, event_flags);
  15535. }
  15536. #endif
  15537. return ret;
  15538. }
  15539. static WC_INLINE int Encrypt(WOLFSSL* ssl, byte* out, const byte* input,
  15540. word16 sz, int asyncOkay)
  15541. {
  15542. int ret = 0;
  15543. #ifdef WOLFSSL_ASYNC_CRYPT
  15544. if (ssl->error == WC_PENDING_E) {
  15545. ssl->error = 0; /* clear async */
  15546. }
  15547. #endif
  15548. switch (ssl->encrypt.state) {
  15549. case CIPHER_STATE_BEGIN:
  15550. {
  15551. if (ssl->encrypt.setup == 0) {
  15552. WOLFSSL_MSG("Encrypt ciphers not setup");
  15553. WOLFSSL_ERROR_VERBOSE(ENCRYPT_ERROR);
  15554. return ENCRYPT_ERROR;
  15555. }
  15556. #ifdef WOLFSSL_CIPHER_TEXT_CHECK
  15557. if (ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) {
  15558. XMEMCPY(ssl->encrypt.sanityCheck, input,
  15559. min(sz, sizeof(ssl->encrypt.sanityCheck)));
  15560. }
  15561. #endif
  15562. #ifdef HAVE_FUZZER
  15563. if (ssl->fuzzerCb)
  15564. ssl->fuzzerCb(ssl, input, sz, FUZZ_ENCRYPT, ssl->fuzzerCtx);
  15565. #endif
  15566. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  15567. /* make sure AES GCM/CCM memory is allocated */
  15568. /* free for these happens in FreeCiphers */
  15569. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  15570. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  15571. /* make sure auth iv and auth are allocated */
  15572. if (ssl->encrypt.additional == NULL)
  15573. ssl->encrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  15574. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  15575. if (ssl->encrypt.nonce == NULL) {
  15576. ssl->encrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ,
  15577. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  15578. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15579. if (ssl->encrypt.nonce != NULL) {
  15580. wc_MemZero_Add("Encrypt nonce", ssl->encrypt.nonce,
  15581. AESGCM_NONCE_SZ);
  15582. }
  15583. #endif
  15584. }
  15585. if (ssl->encrypt.additional == NULL ||
  15586. ssl->encrypt.nonce == NULL) {
  15587. return MEMORY_E;
  15588. }
  15589. }
  15590. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  15591. /* Advance state and proceed */
  15592. ssl->encrypt.state = CIPHER_STATE_DO;
  15593. }
  15594. FALL_THROUGH;
  15595. case CIPHER_STATE_DO:
  15596. {
  15597. ret = EncryptDo(ssl, out, input, sz, asyncOkay);
  15598. /* Advance state */
  15599. ssl->encrypt.state = CIPHER_STATE_END;
  15600. #ifdef WOLFSSL_ASYNC_CRYPT
  15601. /* If pending, then leave and return will resume below */
  15602. if (ret == WC_PENDING_E) {
  15603. return ret;
  15604. }
  15605. #endif
  15606. }
  15607. FALL_THROUGH;
  15608. case CIPHER_STATE_END:
  15609. {
  15610. #ifdef WOLFSSL_CIPHER_TEXT_CHECK
  15611. if (ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null &&
  15612. XMEMCMP(out, ssl->encrypt.sanityCheck,
  15613. min(sz, sizeof(ssl->encrypt.sanityCheck))) == 0) {
  15614. WOLFSSL_MSG("Encrypt sanity check failed! Glitch?");
  15615. WOLFSSL_ERROR_VERBOSE(ENCRYPT_ERROR);
  15616. return ENCRYPT_ERROR;
  15617. }
  15618. ForceZero(ssl->encrypt.sanityCheck,
  15619. sizeof(ssl->encrypt.sanityCheck));
  15620. #endif
  15621. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  15622. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  15623. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  15624. {
  15625. /* finalize authentication cipher */
  15626. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  15627. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  15628. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
  15629. AeadIncrementExpIV(ssl);
  15630. #endif
  15631. if (ssl->encrypt.nonce)
  15632. ForceZero(ssl->encrypt.nonce, AESGCM_NONCE_SZ);
  15633. }
  15634. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  15635. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15636. if ((ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) &&
  15637. (out != input) && (ret == 0)) {
  15638. wc_MemZero_Add("TLS Encrypt plaintext", input, sz);
  15639. }
  15640. #endif
  15641. break;
  15642. }
  15643. default:
  15644. break;
  15645. }
  15646. /* Reset state */
  15647. ssl->encrypt.state = CIPHER_STATE_BEGIN;
  15648. return ret;
  15649. }
  15650. static WC_INLINE int DecryptDo(WOLFSSL* ssl, byte* plain, const byte* input,
  15651. word16 sz)
  15652. {
  15653. int ret = 0;
  15654. (void)plain;
  15655. (void)input;
  15656. (void)sz;
  15657. switch (ssl->specs.bulk_cipher_algorithm)
  15658. {
  15659. #ifdef BUILD_ARC4
  15660. case wolfssl_rc4:
  15661. wc_Arc4Process(ssl->decrypt.arc4, plain, input, sz);
  15662. break;
  15663. #endif
  15664. #ifdef BUILD_DES3
  15665. case wolfssl_triple_des:
  15666. #ifdef WOLFSSL_ASYNC_CRYPT
  15667. /* initialize event */
  15668. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.des3->asyncDev,
  15669. WC_ASYNC_FLAG_CALL_AGAIN);
  15670. if (ret != 0)
  15671. break;
  15672. #endif
  15673. ret = wc_Des3_CbcDecrypt(ssl->decrypt.des3, plain, input, sz);
  15674. #ifdef WOLFSSL_ASYNC_CRYPT
  15675. if (ret == WC_PENDING_E) {
  15676. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.des3->asyncDev);
  15677. }
  15678. #endif
  15679. break;
  15680. #endif
  15681. #if defined(BUILD_AES) && defined(HAVE_AES_CBC)
  15682. case wolfssl_aes:
  15683. #ifdef WOLFSSL_ASYNC_CRYPT
  15684. /* initialize event */
  15685. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  15686. WC_ASYNC_FLAG_CALL_AGAIN);
  15687. if (ret != 0)
  15688. break;
  15689. #endif
  15690. ret = wc_AesCbcDecrypt(ssl->decrypt.aes, plain, input, sz);
  15691. #ifdef WOLFSSL_ASYNC_CRYPT
  15692. if (ret == WC_PENDING_E) {
  15693. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev);
  15694. }
  15695. #endif
  15696. break;
  15697. #endif
  15698. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  15699. case wolfssl_aes_gcm:
  15700. case wolfssl_aes_ccm: /* GCM AEAD macros use same size as CCM */
  15701. {
  15702. wc_AesAuthDecryptFunc aes_auth_fn;
  15703. #ifdef WOLFSSL_ASYNC_CRYPT
  15704. /* initialize event */
  15705. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  15706. WC_ASYNC_FLAG_CALL_AGAIN);
  15707. if (ret != 0)
  15708. break;
  15709. #endif
  15710. #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
  15711. aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  15712. ? wc_AesGcmDecrypt : wc_AesCcmDecrypt;
  15713. #elif defined(BUILD_AESGCM)
  15714. aes_auth_fn = wc_AesGcmDecrypt;
  15715. #else
  15716. aes_auth_fn = wc_AesCcmDecrypt;
  15717. #endif
  15718. XMEMSET(ssl->decrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  15719. /* sequence number field is 64-bits */
  15720. WriteSEQ(ssl, PEER_ORDER, ssl->decrypt.additional);
  15721. ssl->decrypt.additional[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  15722. ssl->decrypt.additional[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  15723. ssl->decrypt.additional[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  15724. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  15725. ssl->decrypt.additional + AEAD_LEN_OFFSET);
  15726. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  15727. if (ssl->options.dtls && IsDtlsMsgSCRKeys(ssl))
  15728. XMEMCPY(ssl->decrypt.nonce,
  15729. ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV,
  15730. AESGCM_IMP_IV_SZ);
  15731. else
  15732. #endif
  15733. XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV,
  15734. AESGCM_IMP_IV_SZ);
  15735. XMEMCPY(ssl->decrypt.nonce + AESGCM_IMP_IV_SZ, input,
  15736. AESGCM_EXP_IV_SZ);
  15737. #ifdef HAVE_PK_CALLBACKS
  15738. ret = NOT_COMPILED_IN;
  15739. if (ssl->ctx && ssl->ctx->PerformTlsRecordProcessingCb) {
  15740. ret = ssl->ctx->PerformTlsRecordProcessingCb(ssl, 0,
  15741. plain + AESGCM_EXP_IV_SZ,
  15742. input + AESGCM_EXP_IV_SZ,
  15743. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  15744. ssl->decrypt.nonce, AESGCM_NONCE_SZ,
  15745. (byte *)(input + sz - ssl->specs.aead_mac_size),
  15746. ssl->specs.aead_mac_size,
  15747. ssl->decrypt.additional, AEAD_AUTH_DATA_SZ);
  15748. }
  15749. if (ret == NOT_COMPILED_IN)
  15750. #endif /* HAVE_PK_CALLBACKS */
  15751. {
  15752. if ((ret = aes_auth_fn(ssl->decrypt.aes,
  15753. plain + AESGCM_EXP_IV_SZ,
  15754. input + AESGCM_EXP_IV_SZ,
  15755. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  15756. ssl->decrypt.nonce, AESGCM_NONCE_SZ,
  15757. input + sz - ssl->specs.aead_mac_size,
  15758. ssl->specs.aead_mac_size,
  15759. ssl->decrypt.additional, AEAD_AUTH_DATA_SZ)) < 0) {
  15760. #ifdef WOLFSSL_ASYNC_CRYPT
  15761. if (ret == WC_PENDING_E) {
  15762. ret = wolfSSL_AsyncPush(ssl,
  15763. &ssl->decrypt.aes->asyncDev);
  15764. }
  15765. #endif
  15766. }
  15767. }
  15768. }
  15769. break;
  15770. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  15771. #ifdef HAVE_CAMELLIA
  15772. case wolfssl_camellia:
  15773. ret = wc_CamelliaCbcDecrypt(ssl->decrypt.cam, plain, input, sz);
  15774. break;
  15775. #endif
  15776. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
  15777. !defined(NO_CHAPOL_AEAD)
  15778. case wolfssl_chacha:
  15779. ret = ChachaAEADDecrypt(ssl, plain, input, sz);
  15780. break;
  15781. #endif
  15782. #ifdef HAVE_NULL_CIPHER
  15783. case wolfssl_cipher_null:
  15784. if (input != plain) {
  15785. XMEMMOVE(plain, input, sz);
  15786. }
  15787. break;
  15788. #endif
  15789. default:
  15790. WOLFSSL_MSG("wolfSSL Decrypt programming error");
  15791. WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
  15792. ret = DECRYPT_ERROR;
  15793. }
  15794. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15795. if ((ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) &&
  15796. (ret == 0)) {
  15797. wc_MemZero_Add("Decrypted data", plain, sz);
  15798. }
  15799. #endif
  15800. return ret;
  15801. }
  15802. static int DecryptTls(WOLFSSL* ssl, byte* plain, const byte* input, word16 sz)
  15803. {
  15804. int ret = 0;
  15805. #ifdef WOLFSSL_ASYNC_CRYPT
  15806. ret = wolfSSL_AsyncPop(ssl, &ssl->decrypt.state);
  15807. if (ret != WC_NOT_PENDING_E) {
  15808. /* check for still pending */
  15809. if (ret == WC_PENDING_E)
  15810. return ret;
  15811. ssl->error = 0; /* clear async */
  15812. /* let failures through so CIPHER_STATE_END logic is run */
  15813. }
  15814. else
  15815. #endif
  15816. {
  15817. /* Reset state */
  15818. ret = 0;
  15819. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  15820. }
  15821. switch (ssl->decrypt.state) {
  15822. case CIPHER_STATE_BEGIN:
  15823. {
  15824. if (ssl->decrypt.setup == 0) {
  15825. WOLFSSL_MSG("Decrypt ciphers not setup");
  15826. WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
  15827. return DECRYPT_ERROR;
  15828. }
  15829. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  15830. /* make sure AES GCM/CCM memory is allocated */
  15831. /* free for these happens in FreeCiphers */
  15832. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  15833. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  15834. /* make sure auth iv and auth are allocated */
  15835. if (ssl->decrypt.additional == NULL)
  15836. ssl->decrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  15837. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  15838. if (ssl->decrypt.nonce == NULL) {
  15839. ssl->decrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ,
  15840. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  15841. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15842. if (ssl->decrypt.nonce != NULL) {
  15843. wc_MemZero_Add("DecryptTls nonce", ssl->decrypt.nonce,
  15844. AESGCM_NONCE_SZ);
  15845. }
  15846. #endif
  15847. }
  15848. if (ssl->decrypt.additional == NULL ||
  15849. ssl->decrypt.nonce == NULL) {
  15850. return MEMORY_E;
  15851. }
  15852. }
  15853. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  15854. /* Advance state and proceed */
  15855. ssl->decrypt.state = CIPHER_STATE_DO;
  15856. }
  15857. FALL_THROUGH;
  15858. case CIPHER_STATE_DO:
  15859. {
  15860. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  15861. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  15862. /* For epochs >1 the current cipher parameters are located in
  15863. * ssl->secure_renegotiation->tmp_keys. Previous cipher
  15864. * parameters and for epoch 1 use ssl->keys */
  15865. if (ssl->keys.curEpoch ==
  15866. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  15867. if (ssl->decrypt.src != SCR) {
  15868. ssl->secure_renegotiation->cache_status =
  15869. SCR_CACHE_NEEDED;
  15870. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  15871. break;
  15872. }
  15873. }
  15874. else {
  15875. if (ssl->decrypt.src != KEYS) {
  15876. ssl->secure_renegotiation->cache_status =
  15877. SCR_CACHE_NULL;
  15878. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  15879. break;
  15880. }
  15881. }
  15882. }
  15883. #endif
  15884. ret = DecryptDo(ssl, plain, input, sz);
  15885. /* Advance state */
  15886. ssl->decrypt.state = CIPHER_STATE_END;
  15887. #ifdef WOLFSSL_ASYNC_CRYPT
  15888. /* If pending, leave and return below */
  15889. if (ret == WC_PENDING_E) {
  15890. return ret;
  15891. }
  15892. #endif
  15893. }
  15894. FALL_THROUGH;
  15895. case CIPHER_STATE_END:
  15896. {
  15897. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  15898. /* make sure AES GCM/CCM nonce is cleared */
  15899. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  15900. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  15901. if (ssl->decrypt.nonce)
  15902. ForceZero(ssl->decrypt.nonce, AESGCM_NONCE_SZ);
  15903. if (ret < 0) {
  15904. ret = VERIFY_MAC_ERROR;
  15905. WOLFSSL_ERROR_VERBOSE(ret);
  15906. }
  15907. }
  15908. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  15909. break;
  15910. }
  15911. default:
  15912. break;
  15913. }
  15914. /* Reset state */
  15915. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  15916. return ret;
  15917. }
  15918. #endif /* !WOLFSSL_NO_TLS12 */
  15919. /* Check conditions for a cipher to have an explicit IV.
  15920. *
  15921. * ssl The SSL/TLS object.
  15922. * returns 1 if the cipher in use has an explicit IV and 0 otherwise.
  15923. */
  15924. static WC_INLINE int CipherHasExpIV(WOLFSSL *ssl)
  15925. {
  15926. #ifdef WOLFSSL_TLS13
  15927. if (ssl->options.tls1_3)
  15928. return 0;
  15929. #endif
  15930. return (ssl->specs.cipher_type == aead) &&
  15931. (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha);
  15932. }
  15933. /* check cipher text size for sanity */
  15934. static int SanityCheckCipherText(WOLFSSL* ssl, word32 encryptSz)
  15935. {
  15936. #ifdef HAVE_TRUNCATED_HMAC
  15937. word32 minLength = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  15938. : ssl->specs.hash_size;
  15939. #else
  15940. word32 minLength = ssl->specs.hash_size; /* covers stream */
  15941. #endif
  15942. #ifndef WOLFSSL_AEAD_ONLY
  15943. if (ssl->specs.cipher_type == block) {
  15944. #ifdef HAVE_ENCRYPT_THEN_MAC
  15945. if (ssl->options.startedETMRead) {
  15946. if ((encryptSz - MacSize(ssl)) % ssl->specs.block_size) {
  15947. WOLFSSL_MSG("Block ciphertext not block size");
  15948. WOLFSSL_ERROR_VERBOSE(SANITY_CIPHER_E);
  15949. return SANITY_CIPHER_E;
  15950. }
  15951. }
  15952. else
  15953. #endif
  15954. if (encryptSz % ssl->specs.block_size) {
  15955. WOLFSSL_MSG("Block ciphertext not block size");
  15956. WOLFSSL_ERROR_VERBOSE(SANITY_CIPHER_E);
  15957. return SANITY_CIPHER_E;
  15958. }
  15959. minLength++; /* pad byte */
  15960. if (ssl->specs.block_size > minLength)
  15961. minLength = ssl->specs.block_size;
  15962. if (ssl->options.tls1_1)
  15963. minLength += ssl->specs.block_size; /* explicit IV */
  15964. }
  15965. else
  15966. #endif
  15967. if (ssl->specs.cipher_type == aead) {
  15968. minLength = ssl->specs.aead_mac_size; /* authTag size */
  15969. if (CipherHasExpIV(ssl))
  15970. minLength += AESGCM_EXP_IV_SZ; /* explicit IV */
  15971. }
  15972. if (encryptSz < minLength) {
  15973. WOLFSSL_MSG("Ciphertext not minimum size");
  15974. WOLFSSL_ERROR_VERBOSE(SANITY_CIPHER_E);
  15975. return SANITY_CIPHER_E;
  15976. }
  15977. return 0;
  15978. }
  15979. #ifndef WOLFSSL_AEAD_ONLY
  15980. #ifdef WOLSSL_OLD_TIMINGPADVERIFY
  15981. #define COMPRESS_LOWER 64
  15982. #define COMPRESS_UPPER 55
  15983. #define COMPRESS_CONSTANT 13
  15984. #ifndef NO_OLD_TLS
  15985. static WC_INLINE void Md5Rounds(int rounds, const byte* data, int sz)
  15986. {
  15987. wc_Md5 md5;
  15988. int i;
  15989. wc_InitMd5(&md5); /* no error check on purpose, dummy round */
  15990. for (i = 0; i < rounds; i++)
  15991. wc_Md5Update(&md5, data, sz);
  15992. wc_Md5Free(&md5); /* in case needed to release resources */
  15993. }
  15994. /* do a dummy sha round */
  15995. static WC_INLINE void ShaRounds(int rounds, const byte* data, int sz)
  15996. {
  15997. wc_Sha sha;
  15998. int i;
  15999. wc_InitSha(&sha); /* no error check on purpose, dummy round */
  16000. for (i = 0; i < rounds; i++)
  16001. wc_ShaUpdate(&sha, data, sz);
  16002. wc_ShaFree(&sha); /* in case needed to release resources */
  16003. }
  16004. #endif
  16005. #ifndef NO_SHA256
  16006. static WC_INLINE void Sha256Rounds(int rounds, const byte* data, int sz)
  16007. {
  16008. wc_Sha256 sha256;
  16009. int i;
  16010. wc_InitSha256(&sha256); /* no error check on purpose, dummy round */
  16011. for (i = 0; i < rounds; i++) {
  16012. wc_Sha256Update(&sha256, data, sz);
  16013. /* no error check on purpose, dummy round */
  16014. }
  16015. wc_Sha256Free(&sha256); /* in case needed to release resources */
  16016. }
  16017. #endif
  16018. #ifdef WOLFSSL_SHA384
  16019. static WC_INLINE void Sha384Rounds(int rounds, const byte* data, int sz)
  16020. {
  16021. wc_Sha384 sha384;
  16022. int i;
  16023. wc_InitSha384(&sha384); /* no error check on purpose, dummy round */
  16024. for (i = 0; i < rounds; i++) {
  16025. wc_Sha384Update(&sha384, data, sz);
  16026. /* no error check on purpose, dummy round */
  16027. }
  16028. wc_Sha384Free(&sha384); /* in case needed to release resources */
  16029. }
  16030. #endif
  16031. #ifdef WOLFSSL_SHA512
  16032. static WC_INLINE void Sha512Rounds(int rounds, const byte* data, int sz)
  16033. {
  16034. wc_Sha512 sha512;
  16035. int i;
  16036. wc_InitSha512(&sha512); /* no error check on purpose, dummy round */
  16037. for (i = 0; i < rounds; i++) {
  16038. wc_Sha512Update(&sha512, data, sz);
  16039. /* no error check on purpose, dummy round */
  16040. }
  16041. wc_Sha512Free(&sha512); /* in case needed to release resources */
  16042. }
  16043. #endif
  16044. #ifdef WOLFSSL_RIPEMD
  16045. static WC_INLINE void RmdRounds(int rounds, const byte* data, int sz)
  16046. {
  16047. RipeMd ripemd;
  16048. int i;
  16049. wc_InitRipeMd(&ripemd);
  16050. for (i = 0; i < rounds; i++)
  16051. wc_RipeMdUpdate(&ripemd, data, sz);
  16052. }
  16053. #endif
  16054. /* Do dummy rounds */
  16055. static WC_INLINE void DoRounds(int type, int rounds, const byte* data, int sz)
  16056. {
  16057. (void)rounds;
  16058. (void)data;
  16059. (void)sz;
  16060. switch (type) {
  16061. case no_mac :
  16062. break;
  16063. #ifndef NO_OLD_TLS
  16064. #ifndef NO_MD5
  16065. case md5_mac :
  16066. Md5Rounds(rounds, data, sz);
  16067. break;
  16068. #endif
  16069. #ifndef NO_SHA
  16070. case sha_mac :
  16071. ShaRounds(rounds, data, sz);
  16072. break;
  16073. #endif
  16074. #endif
  16075. #ifndef NO_SHA256
  16076. case sha256_mac :
  16077. Sha256Rounds(rounds, data, sz);
  16078. break;
  16079. #endif
  16080. #ifdef WOLFSSL_SHA384
  16081. case sha384_mac :
  16082. Sha384Rounds(rounds, data, sz);
  16083. break;
  16084. #endif
  16085. #ifdef WOLFSSL_SHA512
  16086. case sha512_mac :
  16087. Sha512Rounds(rounds, data, sz);
  16088. break;
  16089. #endif
  16090. #ifdef WOLFSSL_RIPEMD
  16091. case rmd_mac :
  16092. RmdRounds(rounds, data, sz);
  16093. break;
  16094. #endif
  16095. default:
  16096. WOLFSSL_MSG("Bad round type");
  16097. break;
  16098. }
  16099. }
  16100. /* do number of compression rounds on dummy data */
  16101. static WC_INLINE void CompressRounds(WOLFSSL* ssl, int rounds, const byte* dummy)
  16102. {
  16103. if (rounds)
  16104. DoRounds(ssl->specs.mac_algorithm, rounds, dummy, COMPRESS_LOWER);
  16105. }
  16106. /* check all length bytes for the pad value, return 0 on success */
  16107. static int PadCheck(const byte* a, byte pad, int length)
  16108. {
  16109. int i;
  16110. int compareSum = 0;
  16111. for (i = 0; i < length; i++) {
  16112. compareSum |= a[i] ^ pad;
  16113. }
  16114. return compareSum;
  16115. }
  16116. /* get compression extra rounds */
  16117. static WC_INLINE int GetRounds(int pLen, int padLen, int t)
  16118. {
  16119. int roundL1 = 1; /* round up flags */
  16120. int roundL2 = 1;
  16121. int L1 = COMPRESS_CONSTANT + pLen - t;
  16122. int L2 = COMPRESS_CONSTANT + pLen - padLen - 1 - t;
  16123. L1 -= COMPRESS_UPPER;
  16124. L2 -= COMPRESS_UPPER;
  16125. if ( (L1 % COMPRESS_LOWER) == 0)
  16126. roundL1 = 0;
  16127. if ( (L2 % COMPRESS_LOWER) == 0)
  16128. roundL2 = 0;
  16129. L1 /= COMPRESS_LOWER;
  16130. L2 /= COMPRESS_LOWER;
  16131. L1 += roundL1;
  16132. L2 += roundL2;
  16133. return L1 - L2;
  16134. }
  16135. /* timing resistant pad/verify check, return 0 on success */
  16136. int TimingPadVerify(WOLFSSL* ssl, const byte* input, int padLen, int t,
  16137. int pLen, int content)
  16138. {
  16139. byte verify[WC_MAX_DIGEST_SIZE];
  16140. byte dmy[sizeof(WOLFSSL) >= MAX_PAD_SIZE ? 1 : MAX_PAD_SIZE] = {0};
  16141. byte* dummy = sizeof(dmy) < MAX_PAD_SIZE ? (byte*) ssl : dmy;
  16142. int ret = 0;
  16143. (void)dmy;
  16144. if ( (t + padLen + 1) > pLen) {
  16145. WOLFSSL_MSG("Plain Len not long enough for pad/mac");
  16146. PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE);
  16147. /* still compare */
  16148. ssl->hmac(ssl, verify, input, pLen - t, -1, content, 1, PEER_ORDER);
  16149. ConstantCompare(verify, input + pLen - t, t);
  16150. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16151. return VERIFY_MAC_ERROR;
  16152. }
  16153. if (PadCheck(input + pLen - (padLen + 1), (byte)padLen, padLen + 1) != 0) {
  16154. WOLFSSL_MSG("PadCheck failed");
  16155. PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE - padLen - 1);
  16156. /* still compare */
  16157. ssl->hmac(ssl, verify, input, pLen - t, -1, content, 1, PEER_ORDER);
  16158. ConstantCompare(verify, input + pLen - t, t);
  16159. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16160. return VERIFY_MAC_ERROR;
  16161. }
  16162. PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE - padLen - 1);
  16163. ret = ssl->hmac(ssl, verify, input, pLen - padLen - 1 - t, -1, content,
  16164. 1, PEER_ORDER);
  16165. CompressRounds(ssl, GetRounds(pLen, padLen, t), dummy);
  16166. if (ConstantCompare(verify, input + (pLen - padLen - 1 - t), t) != 0) {
  16167. WOLFSSL_MSG("Verify MAC compare failed");
  16168. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16169. return VERIFY_MAC_ERROR;
  16170. }
  16171. /* treat any failure as verify MAC error */
  16172. if (ret != 0) {
  16173. ret = VERIFY_MAC_ERROR;
  16174. WOLFSSL_ERROR_VERBOSE(ret);
  16175. }
  16176. return ret;
  16177. }
  16178. #else
  16179. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  16180. /* check all length bytes for the pad value, return 0 on success */
  16181. static int PadCheck(const byte* a, byte pad, int length)
  16182. {
  16183. int i;
  16184. int compareSum = 0;
  16185. for (i = 0; i < length; i++) {
  16186. compareSum |= a[i] ^ pad;
  16187. }
  16188. return compareSum;
  16189. }
  16190. /* Mask the padding bytes with the expected values.
  16191. * Constant time implementation - does maximum pad size possible.
  16192. *
  16193. * data Message data.
  16194. * sz Size of the message including MAC and padding and padding length.
  16195. * macSz Size of the MAC.
  16196. * returns 0 on success, otherwise failure.
  16197. */
  16198. static byte MaskPadding(const byte* data, int sz, int macSz)
  16199. {
  16200. int i;
  16201. int checkSz = sz - 1;
  16202. byte paddingSz = data[sz - 1];
  16203. byte good = ctMaskGT(paddingSz, sz - 1 - macSz);
  16204. if (checkSz > TLS_MAX_PAD_SZ)
  16205. checkSz = TLS_MAX_PAD_SZ;
  16206. for (i = 0; i < checkSz; i++) {
  16207. byte mask = ctMaskLTE(i, paddingSz);
  16208. good |= mask & (data[sz - 1 - i] ^ paddingSz);
  16209. }
  16210. return good;
  16211. }
  16212. /* Mask the MAC in the message with the MAC calculated.
  16213. * Constant time implementation - starts looking for MAC where maximum padding
  16214. * size has it.
  16215. *
  16216. * data Message data.
  16217. * sz Size of the message including MAC and padding and padding length.
  16218. * macSz Size of the MAC data.
  16219. * expMac Expected MAC value.
  16220. * returns 0 on success, otherwise failure.
  16221. */
  16222. static byte MaskMac(const byte* data, int sz, int macSz, byte* expMac)
  16223. {
  16224. int i, j;
  16225. unsigned char mac[WC_MAX_DIGEST_SIZE];
  16226. int scanStart = sz - 1 - TLS_MAX_PAD_SZ - macSz;
  16227. int macEnd = sz - 1 - data[sz - 1];
  16228. int macStart = macEnd - macSz;
  16229. int r = 0;
  16230. unsigned char started, notEnded;
  16231. unsigned char good = 0;
  16232. scanStart &= ctMaskIntGTE(scanStart, 0);
  16233. macStart &= ctMaskIntGTE(macStart, 0);
  16234. /* Div on Intel has different speeds depending on value.
  16235. * Use a bitwise AND or mod a specific value (converted to mul). */
  16236. if ((macSz & (macSz - 1)) == 0)
  16237. r = (macSz - (scanStart - macStart)) & (macSz - 1);
  16238. #ifndef NO_SHA
  16239. else if (macSz == WC_SHA_DIGEST_SIZE)
  16240. r = (macSz - (scanStart - macStart)) % WC_SHA_DIGEST_SIZE;
  16241. #endif
  16242. #ifdef WOLFSSL_SHA384
  16243. else if (macSz == WC_SHA384_DIGEST_SIZE)
  16244. r = (macSz - (scanStart - macStart)) % WC_SHA384_DIGEST_SIZE;
  16245. #endif
  16246. XMEMSET(mac, 0, macSz);
  16247. for (i = scanStart; i < sz; i += macSz) {
  16248. for (j = 0; j < macSz && j + i < sz; j++) {
  16249. started = ctMaskGTE(i + j, macStart);
  16250. notEnded = ctMaskLT(i + j, macEnd);
  16251. mac[j] |= started & notEnded & data[i + j];
  16252. }
  16253. }
  16254. if ((macSz & (macSz - 1)) == 0) {
  16255. for (i = 0; i < macSz; i++)
  16256. good |= expMac[i] ^ mac[(i + r) & (macSz - 1)];
  16257. }
  16258. #ifndef NO_SHA
  16259. else if (macSz == WC_SHA_DIGEST_SIZE) {
  16260. for (i = 0; i < macSz; i++)
  16261. good |= expMac[i] ^ mac[(i + r) % WC_SHA_DIGEST_SIZE];
  16262. }
  16263. #endif
  16264. #ifdef WOLFSSL_SHA384
  16265. else if (macSz == WC_SHA384_DIGEST_SIZE) {
  16266. for (i = 0; i < macSz; i++)
  16267. good |= expMac[i] ^ mac[(i + r) % WC_SHA384_DIGEST_SIZE];
  16268. }
  16269. #endif
  16270. return good;
  16271. }
  16272. /* timing resistant pad/verify check, return 0 on success */
  16273. int TimingPadVerify(WOLFSSL* ssl, const byte* input, int padLen, int macSz,
  16274. int pLen, int content)
  16275. {
  16276. byte verify[WC_MAX_DIGEST_SIZE];
  16277. byte good;
  16278. int ret = 0;
  16279. good = MaskPadding(input, pLen, macSz);
  16280. /* 4th argument has potential to underflow, ssl->hmac function should
  16281. * either increment the size by (macSz + padLen + 1) before use or check on
  16282. * the size to make sure is valid. */
  16283. ret = ssl->hmac(ssl, verify, input, pLen - macSz - padLen - 1, padLen,
  16284. content, 1, PEER_ORDER);
  16285. good |= MaskMac(input, pLen, ssl->specs.hash_size, verify);
  16286. /* Non-zero on failure. */
  16287. good = (byte)~(word32)good;
  16288. good &= good >> 4;
  16289. good &= good >> 2;
  16290. good &= good >> 1;
  16291. /* Make ret negative on masking failure. */
  16292. ret -= 1 - good;
  16293. /* Treat any failure as verify MAC error. */
  16294. if (ret != 0) {
  16295. ret = VERIFY_MAC_ERROR;
  16296. WOLFSSL_ERROR_VERBOSE(ret);
  16297. }
  16298. return ret;
  16299. }
  16300. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  16301. #endif /* WOLSSL_OLD_TIMINGPADVERIFY */
  16302. #endif /* WOLFSSL_AEAD_ONLY */
  16303. int DoApplicationData(WOLFSSL* ssl, byte* input, word32* inOutIdx, int sniff)
  16304. {
  16305. word32 msgSz = WOLFSSL_IS_QUIC(ssl)? ssl->curSize : ssl->keys.encryptSz;
  16306. word32 idx = *inOutIdx;
  16307. int dataSz;
  16308. int ivExtra = 0;
  16309. byte* rawData = input + idx; /* keep current for hmac */
  16310. #ifdef HAVE_LIBZ
  16311. byte decomp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
  16312. #endif
  16313. #ifdef WOLFSSL_EARLY_DATA
  16314. if (ssl->options.tls1_3 && ssl->options.handShakeDone == 0) {
  16315. int process = 0;
  16316. if (ssl->options.side == WOLFSSL_SERVER_END) {
  16317. if ((ssl->earlyData != no_early_data) &&
  16318. (ssl->options.clientState == CLIENT_HELLO_COMPLETE)) {
  16319. process = 1;
  16320. }
  16321. if (!process) {
  16322. WOLFSSL_MSG("Ignoring EarlyData!");
  16323. *inOutIdx += ssl->curSize;
  16324. if (*inOutIdx > ssl->buffers.inputBuffer.length)
  16325. return BUFFER_E;
  16326. return 0;
  16327. }
  16328. }
  16329. if (!process) {
  16330. WOLFSSL_MSG("Received App data before a handshake completed");
  16331. if (sniff == NO_SNIFF) {
  16332. SendAlert(ssl, alert_fatal, unexpected_message);
  16333. }
  16334. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  16335. return OUT_OF_ORDER_E;
  16336. }
  16337. }
  16338. else
  16339. #endif
  16340. if (ssl->options.handShakeDone == 0) {
  16341. WOLFSSL_MSG("Received App data before a handshake completed");
  16342. if (sniff == NO_SNIFF) {
  16343. SendAlert(ssl, alert_fatal, unexpected_message);
  16344. }
  16345. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  16346. return OUT_OF_ORDER_E;
  16347. }
  16348. #if defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_TLS13_IGNORE_AEAD_LIMITS)
  16349. /* Check if we want to invalidate old epochs. If
  16350. * ssl->dtls13InvalidateBefore is set then we want to mark all old
  16351. * epochs as encrypt only. This is done when we detect too many failed
  16352. * decryptions. We do this here to confirm that the peer has updated its
  16353. * keys and we can stop using the old keys. */
  16354. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  16355. if (!w64IsZero(ssl->dtls13InvalidateBefore) &&
  16356. w64Equal(ssl->keys.curEpoch64, ssl->dtls13InvalidateBefore)) {
  16357. Dtls13SetOlderEpochSide(ssl, ssl->dtls13InvalidateBefore,
  16358. ENCRYPT_SIDE_ONLY);
  16359. w64Zero(&ssl->dtls13InvalidateBefore);
  16360. }
  16361. }
  16362. #endif
  16363. #ifndef WOLFSSL_AEAD_ONLY
  16364. if (ssl->specs.cipher_type == block) {
  16365. if (ssl->options.tls1_1)
  16366. ivExtra = ssl->specs.block_size;
  16367. }
  16368. else
  16369. #endif
  16370. if (ssl->specs.cipher_type == aead) {
  16371. if (CipherHasExpIV(ssl))
  16372. ivExtra = AESGCM_EXP_IV_SZ;
  16373. }
  16374. dataSz = msgSz - ivExtra - ssl->keys.padSz;
  16375. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16376. if (ssl->options.startedETMRead)
  16377. dataSz -= MacSize(ssl);
  16378. #endif
  16379. if (dataSz < 0) {
  16380. WOLFSSL_MSG("App data buffer error, malicious input?");
  16381. if (sniff == NO_SNIFF) {
  16382. SendAlert(ssl, alert_fatal, unexpected_message);
  16383. }
  16384. WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
  16385. return BUFFER_ERROR;
  16386. }
  16387. #ifdef WOLFSSL_EARLY_DATA
  16388. if (ssl->earlyData > early_data_ext) {
  16389. if (ssl->earlyDataSz + dataSz > ssl->options.maxEarlyDataSz) {
  16390. if (sniff == NO_SNIFF) {
  16391. SendAlert(ssl, alert_fatal, unexpected_message);
  16392. }
  16393. return WOLFSSL_FATAL_ERROR;
  16394. }
  16395. ssl->earlyDataSz += dataSz;
  16396. }
  16397. #endif
  16398. /* read data */
  16399. if (dataSz) {
  16400. int rawSz = dataSz; /* keep raw size for idx adjustment */
  16401. #ifdef HAVE_LIBZ
  16402. if (ssl->options.usingCompression) {
  16403. dataSz = myDeCompress(ssl, rawData, dataSz, decomp, sizeof(decomp));
  16404. if (dataSz < 0) return dataSz;
  16405. }
  16406. #endif
  16407. idx += rawSz;
  16408. ssl->buffers.clearOutputBuffer.buffer = rawData;
  16409. ssl->buffers.clearOutputBuffer.length = dataSz;
  16410. }
  16411. idx += ssl->keys.padSz;
  16412. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16413. if (ssl->options.startedETMRead)
  16414. idx += MacSize(ssl);
  16415. #endif
  16416. #ifdef HAVE_LIBZ
  16417. /* decompress could be bigger, overwrite after verify */
  16418. if (ssl->options.usingCompression)
  16419. XMEMMOVE(rawData, decomp, dataSz);
  16420. #endif
  16421. *inOutIdx = idx;
  16422. #ifdef HAVE_SECURE_RENEGOTIATION
  16423. if (IsSCR(ssl)) {
  16424. /* Reset the processReply state since
  16425. * we finished processing this message. */
  16426. ssl->options.processReply = doProcessInit;
  16427. /* If we are in a secure renegotiation then APP DATA is treated
  16428. * differently */
  16429. return APP_DATA_READY;
  16430. }
  16431. #endif
  16432. return 0;
  16433. }
  16434. const char* AlertTypeToString(int type)
  16435. {
  16436. switch (type) {
  16437. case close_notify:
  16438. {
  16439. static const char close_notify_str[] =
  16440. "close_notify";
  16441. return close_notify_str;
  16442. }
  16443. case unexpected_message:
  16444. {
  16445. static const char unexpected_message_str[] =
  16446. "unexpected_message";
  16447. return unexpected_message_str;
  16448. }
  16449. case bad_record_mac:
  16450. {
  16451. static const char bad_record_mac_str[] =
  16452. "bad_record_mac";
  16453. return bad_record_mac_str;
  16454. }
  16455. case record_overflow:
  16456. {
  16457. static const char record_overflow_str[] =
  16458. "record_overflow";
  16459. return record_overflow_str;
  16460. }
  16461. case decompression_failure:
  16462. {
  16463. static const char decompression_failure_str[] =
  16464. "decompression_failure";
  16465. return decompression_failure_str;
  16466. }
  16467. case handshake_failure:
  16468. {
  16469. static const char handshake_failure_str[] =
  16470. "handshake_failure";
  16471. return handshake_failure_str;
  16472. }
  16473. case no_certificate:
  16474. {
  16475. static const char no_certificate_str[] =
  16476. "no_certificate";
  16477. return no_certificate_str;
  16478. }
  16479. case bad_certificate:
  16480. {
  16481. static const char bad_certificate_str[] =
  16482. "bad_certificate";
  16483. return bad_certificate_str;
  16484. }
  16485. case unsupported_certificate:
  16486. {
  16487. static const char unsupported_certificate_str[] =
  16488. "unsupported_certificate";
  16489. return unsupported_certificate_str;
  16490. }
  16491. case certificate_revoked:
  16492. {
  16493. static const char certificate_revoked_str[] =
  16494. "certificate_revoked";
  16495. return certificate_revoked_str;
  16496. }
  16497. case certificate_expired:
  16498. {
  16499. static const char certificate_expired_str[] =
  16500. "certificate_expired";
  16501. return certificate_expired_str;
  16502. }
  16503. case certificate_unknown:
  16504. {
  16505. static const char certificate_unknown_str[] =
  16506. "certificate_unknown";
  16507. return certificate_unknown_str;
  16508. }
  16509. case illegal_parameter:
  16510. {
  16511. static const char illegal_parameter_str[] =
  16512. "illegal_parameter";
  16513. return illegal_parameter_str;
  16514. }
  16515. case unknown_ca:
  16516. {
  16517. static const char unknown_ca_str[] =
  16518. "unknown_ca";
  16519. return unknown_ca_str;
  16520. }
  16521. case access_denied:
  16522. {
  16523. static const char access_denied_str[] =
  16524. "access_denied";
  16525. return access_denied_str;
  16526. }
  16527. case decode_error:
  16528. {
  16529. static const char decode_error_str[] =
  16530. "decode_error";
  16531. return decode_error_str;
  16532. }
  16533. case decrypt_error:
  16534. {
  16535. static const char decrypt_error_str[] =
  16536. "decrypt_error";
  16537. return decrypt_error_str;
  16538. }
  16539. case wolfssl_alert_protocol_version:
  16540. {
  16541. static const char protocol_version_str[] =
  16542. "protocol_version";
  16543. return protocol_version_str;
  16544. }
  16545. case insufficient_security:
  16546. {
  16547. static const char insufficient_security_str[] =
  16548. "insufficient_security";
  16549. return insufficient_security_str;
  16550. }
  16551. case internal_error:
  16552. {
  16553. static const char internal_error_str[] =
  16554. "internal_error";
  16555. return internal_error_str;
  16556. }
  16557. case user_canceled:
  16558. {
  16559. static const char user_canceled_str[] =
  16560. "user_canceled";
  16561. return user_canceled_str;
  16562. }
  16563. case no_renegotiation:
  16564. {
  16565. static const char no_renegotiation_str[] =
  16566. "no_renegotiation";
  16567. return no_renegotiation_str;
  16568. }
  16569. case unrecognized_name:
  16570. {
  16571. static const char unrecognized_name_str[] =
  16572. "unrecognized_name";
  16573. return unrecognized_name_str;
  16574. }
  16575. case bad_certificate_status_response:
  16576. {
  16577. static const char bad_certificate_status_response_str[] =
  16578. "bad_certificate_status_response";
  16579. return bad_certificate_status_response_str;
  16580. }
  16581. case no_application_protocol:
  16582. {
  16583. static const char no_application_protocol_str[] =
  16584. "no_application_protocol";
  16585. return no_application_protocol_str;
  16586. }
  16587. default:
  16588. WOLFSSL_MSG("Unknown Alert");
  16589. return NULL;
  16590. }
  16591. }
  16592. static void LogAlert(int type)
  16593. {
  16594. #ifdef DEBUG_WOLFSSL
  16595. const char* typeStr;
  16596. char buff[60];
  16597. typeStr = AlertTypeToString(type);
  16598. if (typeStr != NULL) {
  16599. XSNPRINTF(buff, sizeof(buff), "Alert type: %s", typeStr);
  16600. WOLFSSL_MSG(buff);
  16601. }
  16602. #else
  16603. (void)type;
  16604. #endif /* DEBUG_WOLFSSL */
  16605. }
  16606. /* process alert, return level */
  16607. static int DoAlert(WOLFSSL* ssl, byte* input, word32* inOutIdx, int* type)
  16608. {
  16609. byte level;
  16610. byte code;
  16611. word32 dataSz = (word32)ssl->curSize;
  16612. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  16613. if (ssl->hsInfoOn)
  16614. AddPacketName(ssl, "Alert");
  16615. if (ssl->toInfoOn) {
  16616. /* add record header back on to info + alert bytes level/code */
  16617. int ret = AddPacketInfo(ssl, "Alert", alert, input + *inOutIdx,
  16618. ALERT_SIZE, READ_PROTO, RECORD_HEADER_SZ, ssl->heap);
  16619. if (ret != 0)
  16620. return ret;
  16621. #ifdef WOLFSSL_CALLBACKS
  16622. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  16623. #endif
  16624. }
  16625. #endif
  16626. if (IsEncryptionOn(ssl, 0)) {
  16627. int ivExtra = 0;
  16628. #ifndef WOLFSSL_AEAD_ONLY
  16629. if (ssl->specs.cipher_type == block) {
  16630. if (ssl->options.tls1_1)
  16631. ivExtra = ssl->specs.block_size;
  16632. }
  16633. else
  16634. #endif
  16635. if (ssl->specs.cipher_type == aead) {
  16636. if (CipherHasExpIV(ssl))
  16637. ivExtra = AESGCM_EXP_IV_SZ;
  16638. }
  16639. dataSz -= ivExtra;
  16640. dataSz -= ssl->keys.padSz;
  16641. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16642. if (ssl->options.startedETMRead)
  16643. dataSz -= MacSize(ssl);
  16644. #endif
  16645. }
  16646. /* make sure can read the message */
  16647. if (dataSz != ALERT_SIZE) {
  16648. #ifdef WOLFSSL_EXTRA_ALERTS
  16649. SendAlert(ssl, alert_fatal, unexpected_message);
  16650. #endif
  16651. return BUFFER_E;
  16652. }
  16653. level = input[(*inOutIdx)++];
  16654. code = input[(*inOutIdx)++];
  16655. ssl->alert_history.last_rx.code = code;
  16656. ssl->alert_history.last_rx.level = level;
  16657. *type = code;
  16658. if (level == alert_fatal) {
  16659. ssl->options.isClosed = 1; /* Don't send close_notify */
  16660. }
  16661. if (++ssl->options.alertCount >= WOLFSSL_ALERT_COUNT_MAX) {
  16662. WOLFSSL_MSG("Alert count exceeded");
  16663. #ifdef WOLFSSL_EXTRA_ALERTS
  16664. if (level != alert_warning || code != close_notify)
  16665. SendAlert(ssl, alert_fatal, unexpected_message);
  16666. #endif
  16667. WOLFSSL_ERROR_VERBOSE(ALERT_COUNT_E);
  16668. return ALERT_COUNT_E;
  16669. }
  16670. LogAlert(*type);
  16671. if (*type == close_notify) {
  16672. ssl->options.closeNotify = 1;
  16673. }
  16674. else {
  16675. /*
  16676. * A close_notify alert doesn't mean there's been an error, so we only
  16677. * add other types of alerts to the error queue
  16678. */
  16679. WOLFSSL_ERROR(*type);
  16680. }
  16681. if (IsEncryptionOn(ssl, 0)) {
  16682. *inOutIdx += ssl->keys.padSz;
  16683. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16684. if (ssl->options.startedETMRead)
  16685. *inOutIdx += MacSize(ssl);
  16686. #endif
  16687. }
  16688. return level;
  16689. }
  16690. static int GetInputData(WOLFSSL *ssl, word32 size)
  16691. {
  16692. int inSz;
  16693. int maxLength;
  16694. int usedLength;
  16695. int dtlsExtra = 0;
  16696. /* check max input length */
  16697. usedLength = ssl->buffers.inputBuffer.length - ssl->buffers.inputBuffer.idx;
  16698. maxLength = ssl->buffers.inputBuffer.bufferSize - usedLength;
  16699. inSz = (int)(size - usedLength); /* from last partial read */
  16700. #ifdef WOLFSSL_DTLS
  16701. if (ssl->options.dtls) {
  16702. if (size < ssl->dtls_expected_rx)
  16703. dtlsExtra = (int)(ssl->dtls_expected_rx - size);
  16704. inSz = ssl->dtls_expected_rx;
  16705. }
  16706. #endif
  16707. /* check that no lengths or size values are negative */
  16708. if (usedLength < 0 || maxLength < 0 || inSz <= 0) {
  16709. return BUFFER_ERROR;
  16710. }
  16711. if (inSz > maxLength) {
  16712. if (GrowInputBuffer(ssl, size + dtlsExtra, usedLength) < 0)
  16713. return MEMORY_E;
  16714. }
  16715. /* Put buffer data at start if not there */
  16716. if (usedLength > 0 && ssl->buffers.inputBuffer.idx != 0)
  16717. XMEMMOVE(ssl->buffers.inputBuffer.buffer,
  16718. ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
  16719. usedLength);
  16720. /* remove processed data */
  16721. ssl->buffers.inputBuffer.idx = 0;
  16722. ssl->buffers.inputBuffer.length = usedLength;
  16723. /* read data from network */
  16724. do {
  16725. int in = wolfSSLReceive(ssl,
  16726. ssl->buffers.inputBuffer.buffer +
  16727. ssl->buffers.inputBuffer.length,
  16728. inSz);
  16729. if (in == WANT_READ)
  16730. return WANT_READ;
  16731. if (in < 0) {
  16732. WOLFSSL_ERROR_VERBOSE(SOCKET_ERROR_E);
  16733. return SOCKET_ERROR_E;
  16734. }
  16735. if (in > inSz) {
  16736. WOLFSSL_ERROR_VERBOSE(RECV_OVERFLOW_E);
  16737. return RECV_OVERFLOW_E;
  16738. }
  16739. ssl->buffers.inputBuffer.length += in;
  16740. inSz -= in;
  16741. } while (ssl->buffers.inputBuffer.length < size);
  16742. #ifdef WOLFSSL_DEBUG_TLS
  16743. if (ssl->buffers.inputBuffer.idx == 0) {
  16744. WOLFSSL_MSG("Data received");
  16745. WOLFSSL_BUFFER(ssl->buffers.inputBuffer.buffer,
  16746. ssl->buffers.inputBuffer.length);
  16747. }
  16748. #endif
  16749. return 0;
  16750. }
  16751. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16752. static WC_INLINE int VerifyMacEnc(WOLFSSL* ssl, const byte* input, word32 msgSz,
  16753. int content)
  16754. {
  16755. int ret;
  16756. #ifdef HAVE_TRUNCATED_HMAC
  16757. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  16758. : ssl->specs.hash_size;
  16759. #else
  16760. word32 digestSz = ssl->specs.hash_size;
  16761. #endif
  16762. byte verify[WC_MAX_DIGEST_SIZE];
  16763. WOLFSSL_MSG("Verify MAC of Encrypted Data");
  16764. if (msgSz < digestSz) {
  16765. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16766. return VERIFY_MAC_ERROR;
  16767. }
  16768. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1, PEER_ORDER);
  16769. ret |= ConstantCompare(verify, input + msgSz - digestSz, digestSz);
  16770. if (ret != 0) {
  16771. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16772. return VERIFY_MAC_ERROR;
  16773. }
  16774. return 0;
  16775. }
  16776. #endif
  16777. static WC_INLINE int VerifyMac(WOLFSSL* ssl, const byte* input, word32 msgSz,
  16778. int content, word32* padSz)
  16779. {
  16780. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  16781. int ret;
  16782. word32 pad = 0;
  16783. word32 padByte = 0;
  16784. #ifdef HAVE_TRUNCATED_HMAC
  16785. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  16786. : ssl->specs.hash_size;
  16787. #else
  16788. word32 digestSz = ssl->specs.hash_size;
  16789. #endif
  16790. byte verify[WC_MAX_DIGEST_SIZE];
  16791. if (ssl->specs.cipher_type == block) {
  16792. int ivExtra = 0;
  16793. if (ssl->options.tls1_1)
  16794. ivExtra = ssl->specs.block_size;
  16795. pad = *(input + msgSz - ivExtra - 1);
  16796. padByte = 1;
  16797. if (ssl->options.tls) {
  16798. #if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
  16799. ret = PROTOCOLCB_UNAVAILABLE;
  16800. if(ssl->ctx->VerifyMacCb) {
  16801. void* ctx = wolfSSL_GetVerifyMacCtx(ssl);
  16802. ret = ssl->ctx->VerifyMacCb(ssl, input,
  16803. (msgSz - ivExtra) - digestSz - pad - 1,
  16804. digestSz, content, ctx);
  16805. if (ret != 0 && ret != PROTOCOLCB_UNAVAILABLE) {
  16806. return ret;
  16807. }
  16808. }
  16809. if (!ssl->ctx->VerifyMacCb || ret == PROTOCOLCB_UNAVAILABLE)
  16810. #endif
  16811. ret = TimingPadVerify(ssl, input, pad, digestSz, msgSz - ivExtra,
  16812. content);
  16813. if (ret != 0)
  16814. return ret;
  16815. }
  16816. else { /* sslv3, some implementations have bad padding, but don't
  16817. * allow bad read */
  16818. int badPadLen = 0;
  16819. byte dmy[sizeof(WOLFSSL) >= MAX_PAD_SIZE ? 1 : MAX_PAD_SIZE];
  16820. byte* dummy = sizeof(dmy) < MAX_PAD_SIZE ? (byte*) ssl : dmy;
  16821. XMEMSET(dmy, 0, sizeof(dmy));
  16822. if (pad > (msgSz - digestSz - 1)) {
  16823. WOLFSSL_MSG("Plain Len not long enough for pad/mac");
  16824. pad = 0; /* no bad read */
  16825. badPadLen = 1;
  16826. }
  16827. (void)PadCheck(dummy, (byte)pad, MAX_PAD_SIZE); /* timing only */
  16828. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz - pad - 1,
  16829. pad, content, 1, PEER_ORDER);
  16830. if (ConstantCompare(verify, input + msgSz - digestSz - pad - 1,
  16831. digestSz) != 0) {
  16832. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16833. return VERIFY_MAC_ERROR;
  16834. }
  16835. if (ret != 0 || badPadLen) {
  16836. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16837. return VERIFY_MAC_ERROR;
  16838. }
  16839. }
  16840. }
  16841. else if (ssl->specs.cipher_type == stream) {
  16842. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1,
  16843. PEER_ORDER);
  16844. if (ConstantCompare(verify, input + msgSz - digestSz, digestSz) != 0) {
  16845. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16846. return VERIFY_MAC_ERROR;
  16847. }
  16848. if (ret != 0) {
  16849. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16850. return VERIFY_MAC_ERROR;
  16851. }
  16852. }
  16853. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  16854. if (ssl->specs.cipher_type == aead) {
  16855. *padSz = ssl->specs.aead_mac_size;
  16856. }
  16857. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  16858. else {
  16859. *padSz = digestSz + pad + padByte;
  16860. }
  16861. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  16862. (void)input;
  16863. (void)msgSz;
  16864. (void)content;
  16865. return 0;
  16866. }
  16867. #ifdef WOLFSSL_DTLS
  16868. static int HandleDTLSDecryptFailed(WOLFSSL* ssl)
  16869. {
  16870. int ret = 0;
  16871. #ifdef WOLFSSL_DTLS_DROP_STATS
  16872. ssl->macDropCount++;
  16873. #endif
  16874. #if defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_TLS13_IGNORE_AEAD_LIMITS)
  16875. /* Handle AEAD limits specified by the RFC for failed decryption */
  16876. if (IsAtLeastTLSv1_3(ssl->version))
  16877. ret = Dtls13CheckAEADFailLimit(ssl);
  16878. #endif
  16879. (void)ssl;
  16880. WOLFSSL_MSG("DTLS: Ignoring failed decryption");
  16881. return ret;
  16882. }
  16883. static int DtlsShouldDrop(WOLFSSL* ssl, int retcode)
  16884. {
  16885. if (ssl->options.handShakeDone && !IsEncryptionOn(ssl, 0)) {
  16886. WOLFSSL_MSG("Silently dropping plaintext DTLS message "
  16887. "on established connection.");
  16888. return 1;
  16889. }
  16890. if ((ssl->options.handShakeDone && retcode != 0)
  16891. || retcode == SEQUENCE_ERROR || retcode == DTLS_CID_ERROR) {
  16892. WOLFSSL_MSG_EX("Silently dropping DTLS message: %d", retcode);
  16893. return 1;
  16894. }
  16895. #ifdef WOLFSSL_DTLS13
  16896. if (IsAtLeastTLSv1_3(ssl->version) && !w64IsZero(ssl->dtls13Epoch)
  16897. && w64IsZero(ssl->keys.curEpoch64) && ssl->curRL.type != ack) {
  16898. WOLFSSL_MSG("Silently dropping plaintext DTLS message "
  16899. "during encrypted handshake.");
  16900. return 1;
  16901. }
  16902. #endif /* WOLFSSL_DTLS13 */
  16903. #ifndef NO_WOLFSSL_SERVER
  16904. if (ssl->options.side == WOLFSSL_SERVER_END
  16905. && ssl->curRL.type != handshake) {
  16906. int beforeCookieVerified = 0;
  16907. if (!IsAtLeastTLSv1_3(ssl->version)) {
  16908. beforeCookieVerified =
  16909. ssl->options.acceptState < ACCEPT_FIRST_REPLY_DONE;
  16910. }
  16911. #ifdef WOLFSSL_DTLS13
  16912. else {
  16913. beforeCookieVerified =
  16914. ssl->options.acceptState < TLS13_ACCEPT_SECOND_REPLY_DONE;
  16915. }
  16916. #endif /* WOLFSSL_DTLS13 */
  16917. if (beforeCookieVerified) {
  16918. WOLFSSL_MSG("Drop non-handshake record before handshake");
  16919. return 1;
  16920. }
  16921. }
  16922. #endif /* NO_WOLFSSL_SERVER */
  16923. return 0;
  16924. }
  16925. #endif /* WOLFSSL_DTLS */
  16926. int ProcessReply(WOLFSSL* ssl)
  16927. {
  16928. return ProcessReplyEx(ssl, 0);
  16929. }
  16930. /* Process input requests. Return 0 is done, 1 is call again to complete, and
  16931. negative number is error. If allowSocketErr is set, SOCKET_ERROR_E in
  16932. ssl->error will be whitelisted. This is useful when the connection has been
  16933. closed and the endpoint wants to check for an alert sent by the other end. */
  16934. int ProcessReplyEx(WOLFSSL* ssl, int allowSocketErr)
  16935. {
  16936. int ret = 0, type = internal_error, readSz;
  16937. int atomicUser = 0;
  16938. word32 startIdx = 0;
  16939. #if defined(WOLFSSL_DTLS)
  16940. int used;
  16941. #endif
  16942. #ifdef ATOMIC_USER
  16943. if (ssl->ctx->DecryptVerifyCb)
  16944. atomicUser = 1;
  16945. #endif
  16946. if (ssl->error != 0 && ssl->error != WANT_READ && ssl->error != WANT_WRITE
  16947. #ifdef HAVE_SECURE_RENEGOTIATION
  16948. && ssl->error != APP_DATA_READY
  16949. #endif
  16950. #ifdef WOLFSSL_ASYNC_CRYPT
  16951. && ssl->error != WC_PENDING_E
  16952. #endif
  16953. #ifdef WOLFSSL_NONBLOCK_OCSP
  16954. && ssl->error != OCSP_WANT_READ
  16955. #endif
  16956. && (allowSocketErr != 1 || ssl->error != SOCKET_ERROR_E)
  16957. ) {
  16958. WOLFSSL_MSG("ProcessReply retry in error state, not allowed");
  16959. return ssl->error;
  16960. }
  16961. /* If checking alert on error (allowSocketErr == 1) do not try and
  16962. * process alerts for async or ocsp non blocking */
  16963. #if defined(WOLFSSL_CHECK_ALERT_ON_ERR) && \
  16964. (defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP))
  16965. if (allowSocketErr == 1 && \
  16966. (ssl->error == WC_PENDING_E || ssl->error == OCSP_WANT_READ)) {
  16967. return ssl->error;
  16968. }
  16969. #endif
  16970. #if defined(WOLFSSL_DTLS) && defined(WOLFSSL_ASYNC_CRYPT)
  16971. /* process any pending DTLS messages - this flow can happen with async */
  16972. if (ssl->dtls_rx_msg_list != NULL) {
  16973. word32 pendingMsg = ssl->dtls_rx_msg_list_sz;
  16974. if(IsAtLeastTLSv1_3(ssl->version)) {
  16975. #ifdef WOLFSSL_DTLS13
  16976. ret = Dtls13ProcessBufferedMessages(ssl);
  16977. #else
  16978. ret = NOT_COMPILED_IN;
  16979. #endif /* WOLFSSL_DTLS13 */
  16980. }
  16981. else {
  16982. ret = DtlsMsgDrain(ssl);
  16983. }
  16984. if (ret != 0) {
  16985. WOLFSSL_ERROR(ret);
  16986. return ret;
  16987. }
  16988. /* we processed some messages, return so connect/accept can make
  16989. progress */
  16990. if (ssl->dtls_rx_msg_list_sz != pendingMsg)
  16991. return ret;
  16992. }
  16993. #endif
  16994. ret = RetrySendAlert(ssl);
  16995. if (ret != 0)
  16996. return ret;
  16997. for (;;) {
  16998. switch (ssl->options.processReply) {
  16999. /* in the WOLFSSL_SERVER case, get the first byte for detecting
  17000. * old client hello */
  17001. case doProcessInit:
  17002. readSz = RECORD_HEADER_SZ;
  17003. #ifdef WOLFSSL_DTLS
  17004. if (ssl->options.dtls) {
  17005. readSz = DTLS_RECORD_HEADER_SZ;
  17006. #ifdef WOLFSSL_DTLS13
  17007. if (ssl->options.tls1_3) {
  17008. /* dtls1.3 unified header can be as little as 2 bytes */
  17009. readSz = DTLS_UNIFIED_HEADER_MIN_SZ;
  17010. }
  17011. #endif /* WOLFSSL_DTLS13 */
  17012. }
  17013. #endif
  17014. /* get header or return error */
  17015. if (!ssl->options.dtls) {
  17016. if ((ret = GetInputData(ssl, readSz)) < 0)
  17017. return ret;
  17018. } else {
  17019. #ifdef WOLFSSL_DTLS
  17020. /* read ahead may already have header */
  17021. used = ssl->buffers.inputBuffer.length -
  17022. ssl->buffers.inputBuffer.idx;
  17023. if (used < readSz) {
  17024. if ((ret = GetInputData(ssl, readSz)) < 0)
  17025. return ret;
  17026. }
  17027. #endif
  17028. }
  17029. #ifdef OLD_HELLO_ALLOWED
  17030. /* see if sending SSLv2 client hello */
  17031. if ( ssl->options.side == WOLFSSL_SERVER_END &&
  17032. ssl->options.clientState == NULL_STATE &&
  17033. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx]
  17034. != handshake) {
  17035. byte b0, b1;
  17036. ssl->options.processReply = runProcessOldClientHello;
  17037. /* sanity checks before getting size at front */
  17038. if (ssl->buffers.inputBuffer.buffer[
  17039. ssl->buffers.inputBuffer.idx + OPAQUE16_LEN] != OLD_HELLO_ID) {
  17040. WOLFSSL_MSG("Not a valid old client hello");
  17041. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  17042. return PARSE_ERROR;
  17043. }
  17044. if (ssl->buffers.inputBuffer.buffer[
  17045. ssl->buffers.inputBuffer.idx + OPAQUE24_LEN] != SSLv3_MAJOR &&
  17046. ssl->buffers.inputBuffer.buffer[
  17047. ssl->buffers.inputBuffer.idx + OPAQUE24_LEN] != DTLS_MAJOR) {
  17048. WOLFSSL_MSG("Not a valid version in old client hello");
  17049. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  17050. return PARSE_ERROR;
  17051. }
  17052. /* how many bytes need ProcessOldClientHello */
  17053. b0 =
  17054. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
  17055. b1 =
  17056. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
  17057. ssl->curSize = (word16)(((b0 & 0x7f) << 8) | b1);
  17058. }
  17059. else {
  17060. ssl->options.processReply = getRecordLayerHeader;
  17061. continue;
  17062. }
  17063. FALL_THROUGH;
  17064. /* in the WOLFSSL_SERVER case, run the old client hello */
  17065. case runProcessOldClientHello:
  17066. /* get sz bytes or return error */
  17067. if (!ssl->options.dtls) {
  17068. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  17069. return ret;
  17070. } else {
  17071. #ifdef WOLFSSL_DTLS
  17072. /* read ahead may already have */
  17073. used = ssl->buffers.inputBuffer.length -
  17074. ssl->buffers.inputBuffer.idx;
  17075. if (used < ssl->curSize)
  17076. if ((ret = GetInputData(ssl, ssl->curSize - used)) < 0)
  17077. return ret;
  17078. #endif /* WOLFSSL_DTLS */
  17079. }
  17080. ret = ProcessOldClientHello(ssl, ssl->buffers.inputBuffer.buffer,
  17081. &ssl->buffers.inputBuffer.idx,
  17082. ssl->buffers.inputBuffer.length -
  17083. ssl->buffers.inputBuffer.idx,
  17084. ssl->curSize);
  17085. if (ret < 0)
  17086. return ret;
  17087. else if (ssl->buffers.inputBuffer.idx ==
  17088. ssl->buffers.inputBuffer.length) {
  17089. ssl->options.processReply = doProcessInit;
  17090. return 0;
  17091. }
  17092. #endif /* OLD_HELLO_ALLOWED */
  17093. FALL_THROUGH;
  17094. /* get the record layer header */
  17095. case getRecordLayerHeader:
  17096. /* DTLSv1.3 record numbers in the header are encrypted, and AAD
  17097. * uses the unecrypted form. Because of this we need to modify the
  17098. * header, decrypting the numbers inside
  17099. * DtlsParseUnifiedRecordLayer(). This violates the const attribute
  17100. * of the buffer parameter of GetRecordHeader() used here. */
  17101. ret = GetRecordHeader(ssl, &ssl->buffers.inputBuffer.idx,
  17102. &ssl->curRL, &ssl->curSize);
  17103. #ifdef WOLFSSL_DTLS
  17104. if (ssl->options.dtls && DtlsShouldDrop(ssl, ret)) {
  17105. ssl->options.processReply = doProcessInit;
  17106. ssl->buffers.inputBuffer.length = 0;
  17107. ssl->buffers.inputBuffer.idx = 0;
  17108. #ifdef WOLFSSL_DTLS_DROP_STATS
  17109. ssl->replayDropCount++;
  17110. #endif /* WOLFSSL_DTLS_DROP_STATS */
  17111. #ifdef WOLFSSL_DTLS13
  17112. /* return to send ACKS and shortcut rtx timer */
  17113. if (IsAtLeastTLSv1_3(ssl->version)
  17114. && ssl->dtls13Rtx.sendAcks)
  17115. return 0;
  17116. #endif /* WOLFSSL_DTLS13 */
  17117. continue;
  17118. }
  17119. #endif
  17120. if (ret != 0) {
  17121. switch (ret) {
  17122. case VERSION_ERROR:
  17123. /* send alert per RFC5246 Appendix E. Backward
  17124. * Compatibility */
  17125. if (ssl->options.side == WOLFSSL_CLIENT_END)
  17126. SendAlert(ssl, alert_fatal,
  17127. wolfssl_alert_protocol_version);
  17128. break;
  17129. #ifdef HAVE_MAX_FRAGMENT
  17130. case LENGTH_ERROR:
  17131. SendAlert(ssl, alert_fatal, record_overflow);
  17132. break;
  17133. #endif /* HAVE_MAX_FRAGMENT */
  17134. default:
  17135. break;
  17136. }
  17137. return ret;
  17138. }
  17139. #ifdef WOLFSSL_TLS13
  17140. if (IsAtLeastTLSv1_3(ssl->version) && IsEncryptionOn(ssl, 0) &&
  17141. ssl->curRL.type != application_data &&
  17142. ssl->curRL.type != change_cipher_spec) {
  17143. SendAlert(ssl, alert_fatal, unexpected_message);
  17144. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  17145. return PARSE_ERROR;
  17146. }
  17147. #endif
  17148. ssl->options.processReply = getData;
  17149. FALL_THROUGH;
  17150. /* retrieve record layer data */
  17151. case getData:
  17152. /* get sz bytes or return error */
  17153. if (!ssl->options.dtls) {
  17154. if ((ret = GetInputData(ssl, ssl->curSize)) < 0) {
  17155. #ifdef WOLFSSL_EXTRA_ALERTS
  17156. if (ret != WANT_READ)
  17157. SendAlert(ssl, alert_fatal, bad_record_mac);
  17158. #endif
  17159. return ret;
  17160. }
  17161. }
  17162. else {
  17163. #ifdef WOLFSSL_DTLS
  17164. /* read ahead may already have */
  17165. used = ssl->buffers.inputBuffer.length -
  17166. ssl->buffers.inputBuffer.idx;
  17167. if (used < ssl->curSize)
  17168. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  17169. return ret;
  17170. #endif
  17171. }
  17172. if (IsEncryptionOn(ssl, 0)) {
  17173. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  17174. int tooLong = 0;
  17175. #endif
  17176. #ifdef WOLFSSL_TLS13
  17177. if (IsAtLeastTLSv1_3(ssl->version)) {
  17178. tooLong = ssl->curSize > MAX_TLS13_ENC_SZ;
  17179. tooLong |= ssl->curSize - ssl->specs.aead_mac_size >
  17180. MAX_TLS13_PLAIN_SZ;
  17181. }
  17182. #endif
  17183. #ifdef WOLFSSL_EXTRA_ALERTS
  17184. if (!IsAtLeastTLSv1_3(ssl->version))
  17185. tooLong = ssl->curSize > MAX_TLS_CIPHER_SZ;
  17186. #endif
  17187. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  17188. if (tooLong) {
  17189. WOLFSSL_MSG("Encrypted data too long");
  17190. SendAlert(ssl, alert_fatal, record_overflow);
  17191. return BUFFER_ERROR;
  17192. }
  17193. #endif
  17194. }
  17195. ssl->keys.padSz = 0;
  17196. ssl->options.processReply = verifyEncryptedMessage;
  17197. startIdx = ssl->buffers.inputBuffer.idx; /* in case > 1 msg per */
  17198. FALL_THROUGH;
  17199. /* verify digest of encrypted message */
  17200. case verifyEncryptedMessage:
  17201. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17202. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  17203. !atomicUser && ssl->options.startedETMRead) {
  17204. ret = VerifyMacEnc(ssl, ssl->buffers.inputBuffer.buffer +
  17205. ssl->buffers.inputBuffer.idx,
  17206. ssl->curSize, ssl->curRL.type);
  17207. #ifdef WOLFSSL_ASYNC_CRYPT
  17208. if (ret == WC_PENDING_E)
  17209. return ret;
  17210. #endif
  17211. if (ret < 0) {
  17212. WOLFSSL_MSG("VerifyMacEnc failed");
  17213. #ifdef WOLFSSL_DTLS
  17214. /* If in DTLS mode, if the decrypt fails for any
  17215. * reason, pretend the datagram never happened. */
  17216. if (ssl->options.dtls) {
  17217. ssl->options.processReply = doProcessInit;
  17218. ssl->buffers.inputBuffer.idx =
  17219. ssl->buffers.inputBuffer.length;
  17220. return HandleDTLSDecryptFailed(ssl);
  17221. }
  17222. #endif /* WOLFSSL_DTLS */
  17223. #ifdef WOLFSSL_EXTRA_ALERTS
  17224. if (!ssl->options.dtls)
  17225. SendAlert(ssl, alert_fatal, bad_record_mac);
  17226. #endif
  17227. WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
  17228. return DECRYPT_ERROR;
  17229. }
  17230. ssl->keys.encryptSz = ssl->curSize;
  17231. }
  17232. #endif
  17233. ssl->options.processReply = decryptMessage;
  17234. FALL_THROUGH;
  17235. /* decrypt message */
  17236. case decryptMessage:
  17237. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  17238. (!IsAtLeastTLSv1_3(ssl->version) ||
  17239. ssl->curRL.type != change_cipher_spec))
  17240. {
  17241. bufferStatic* in = &ssl->buffers.inputBuffer;
  17242. ret = SanityCheckCipherText(ssl, ssl->curSize);
  17243. if (ret < 0) {
  17244. #ifdef WOLFSSL_EXTRA_ALERTS
  17245. SendAlert(ssl, alert_fatal, bad_record_mac);
  17246. #endif
  17247. return ret;
  17248. }
  17249. if (atomicUser) {
  17250. #ifdef ATOMIC_USER
  17251. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17252. if (ssl->options.startedETMRead) {
  17253. ret = ssl->ctx->VerifyDecryptCb(ssl,
  17254. in->buffer + in->idx, in->buffer + in->idx,
  17255. ssl->curSize - MacSize(ssl),
  17256. ssl->curRL.type, 1, &ssl->keys.padSz,
  17257. ssl->DecryptVerifyCtx);
  17258. }
  17259. else
  17260. #endif
  17261. {
  17262. ret = ssl->ctx->DecryptVerifyCb(ssl,
  17263. in->buffer + in->idx,
  17264. in->buffer + in->idx,
  17265. ssl->curSize, ssl->curRL.type, 1,
  17266. &ssl->keys.padSz, ssl->DecryptVerifyCtx);
  17267. }
  17268. #endif /* ATOMIC_USER */
  17269. }
  17270. else {
  17271. if (!ssl->options.tls1_3) {
  17272. #ifndef WOLFSSL_NO_TLS12
  17273. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17274. if (ssl->options.startedETMRead) {
  17275. word32 digestSz = MacSize(ssl);
  17276. ret = DecryptTls(ssl,
  17277. in->buffer + in->idx,
  17278. in->buffer + in->idx,
  17279. ssl->curSize - (word16)digestSz);
  17280. if (ret == 0) {
  17281. byte invalid = 0;
  17282. byte padding = (byte)-1;
  17283. word32 i;
  17284. word32 off = in->idx + ssl->curSize - digestSz - 1;
  17285. /* Last of padding bytes - indicates length. */
  17286. ssl->keys.padSz = in->buffer[off];
  17287. /* Constant time checking of padding - don't leak
  17288. * the length of the data.
  17289. */
  17290. /* Compare max pad bytes or at most data + pad. */
  17291. for (i = 1; i < MAX_PAD_SIZE && off >= i; i++) {
  17292. /* Mask on indicates this is expected to be a
  17293. * padding byte.
  17294. */
  17295. padding &= ctMaskLTE(i, ssl->keys.padSz);
  17296. /* When this is a padding byte and not equal
  17297. * to length then mask is set.
  17298. */
  17299. invalid |= padding &
  17300. ctMaskNotEq(in->buffer[off - i],
  17301. ssl->keys.padSz);
  17302. }
  17303. /* If mask is set then there was an error. */
  17304. if (invalid) {
  17305. ret = DECRYPT_ERROR;
  17306. }
  17307. ssl->keys.padSz += 1;
  17308. ssl->keys.decryptedCur = 1;
  17309. }
  17310. }
  17311. else
  17312. #endif
  17313. {
  17314. ret = DecryptTls(ssl,
  17315. in->buffer + in->idx,
  17316. in->buffer + in->idx,
  17317. ssl->curSize);
  17318. }
  17319. #else
  17320. ret = DECRYPT_ERROR;
  17321. #endif
  17322. }
  17323. else
  17324. {
  17325. #ifdef WOLFSSL_TLS13
  17326. byte *aad = (byte*)&ssl->curRL;
  17327. word16 aad_size = RECORD_HEADER_SZ;
  17328. #ifdef WOLFSSL_DTLS13
  17329. if (ssl->options.dtls) {
  17330. /* aad now points to the record header */
  17331. aad = ssl->dtls13CurRL;
  17332. aad_size = ssl->dtls13CurRlLength;
  17333. }
  17334. #endif /* WOLFSSL_DTLS13 */
  17335. /* Don't send an alert for DTLS. We will just drop it
  17336. * silently later. */
  17337. ret = DecryptTls13(ssl,
  17338. in->buffer + in->idx,
  17339. in->buffer + in->idx,
  17340. ssl->curSize,
  17341. aad, aad_size);
  17342. #else
  17343. ret = DECRYPT_ERROR;
  17344. #endif /* WOLFSSL_TLS13 */
  17345. }
  17346. (void)in;
  17347. }
  17348. #ifdef WOLFSSL_ASYNC_CRYPT
  17349. if (ret == WC_PENDING_E)
  17350. return ret;
  17351. #endif
  17352. if (ret >= 0) {
  17353. #ifndef WOLFSSL_NO_TLS12
  17354. /* handle success */
  17355. #ifndef WOLFSSL_AEAD_ONLY
  17356. if (ssl->options.tls1_1 && ssl->specs.cipher_type == block)
  17357. ssl->buffers.inputBuffer.idx += ssl->specs.block_size;
  17358. #endif
  17359. /* go past TLSv1.1 IV */
  17360. if (CipherHasExpIV(ssl))
  17361. ssl->buffers.inputBuffer.idx += AESGCM_EXP_IV_SZ;
  17362. #endif
  17363. }
  17364. else {
  17365. WOLFSSL_MSG("Decrypt failed");
  17366. #ifdef WOLFSSL_DTLS
  17367. /* If in DTLS mode, if the decrypt fails for any
  17368. * reason, pretend the datagram never happened. */
  17369. if (ssl->options.dtls) {
  17370. ssl->options.processReply = doProcessInit;
  17371. ssl->buffers.inputBuffer.idx =
  17372. ssl->buffers.inputBuffer.length;
  17373. return HandleDTLSDecryptFailed(ssl);
  17374. }
  17375. #endif /* WOLFSSL_DTLS */
  17376. #ifdef WOLFSSL_EARLY_DATA
  17377. if (ssl->options.tls1_3) {
  17378. if (ssl->options.side == WOLFSSL_SERVER_END &&
  17379. ssl->earlyData != no_early_data &&
  17380. ssl->options.clientState <
  17381. CLIENT_FINISHED_COMPLETE) {
  17382. ssl->earlyDataSz += ssl->curSize;
  17383. if (ssl->earlyDataSz <=
  17384. ssl->options.maxEarlyDataSz) {
  17385. WOLFSSL_MSG("Ignoring EarlyData!");
  17386. if (ssl->keys.peer_sequence_number_lo-- == 0)
  17387. ssl->keys.peer_sequence_number_hi--;
  17388. ssl->options.processReply = doProcessInit;
  17389. ssl->buffers.inputBuffer.idx += ssl->curSize;
  17390. if (ssl->buffers.inputBuffer.idx >
  17391. ssl->buffers.inputBuffer.length) {
  17392. WOLFSSL_ERROR(BUFFER_E);
  17393. return BUFFER_E;
  17394. }
  17395. return 0;
  17396. }
  17397. WOLFSSL_MSG("Too much EarlyData!");
  17398. SendAlert(ssl, alert_fatal, unexpected_message);
  17399. WOLFSSL_ERROR(TOO_MUCH_EARLY_DATA);
  17400. return TOO_MUCH_EARLY_DATA;
  17401. }
  17402. }
  17403. #endif
  17404. SendAlert(ssl, alert_fatal, bad_record_mac);
  17405. /* Push error once we know that we will error out here */
  17406. WOLFSSL_ERROR(ret);
  17407. return ret;
  17408. }
  17409. }
  17410. ssl->options.processReply = verifyMessage;
  17411. FALL_THROUGH;
  17412. /* verify digest of message */
  17413. case verifyMessage:
  17414. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  17415. (!IsAtLeastTLSv1_3(ssl->version) ||
  17416. ssl->curRL.type != change_cipher_spec))
  17417. {
  17418. if (!atomicUser
  17419. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17420. && !ssl->options.startedETMRead
  17421. #endif
  17422. ) {
  17423. ret = VerifyMac(ssl, ssl->buffers.inputBuffer.buffer +
  17424. ssl->buffers.inputBuffer.idx,
  17425. ssl->curSize, ssl->curRL.type,
  17426. &ssl->keys.padSz);
  17427. #ifdef WOLFSSL_ASYNC_CRYPT
  17428. if (ret == WC_PENDING_E)
  17429. return ret;
  17430. #endif
  17431. if (ret < 0) {
  17432. #ifdef WOLFSSL_DTLS
  17433. /* If in DTLS mode, if the decrypt fails for any
  17434. * reason, pretend the datagram never happened. */
  17435. if (ssl->options.dtls) {
  17436. ssl->options.processReply = doProcessInit;
  17437. ssl->buffers.inputBuffer.idx =
  17438. ssl->buffers.inputBuffer.length;
  17439. return HandleDTLSDecryptFailed(ssl);
  17440. }
  17441. #endif /* WOLFSSL_DTLS */
  17442. #ifdef WOLFSSL_EXTRA_ALERTS
  17443. if (!ssl->options.dtls)
  17444. SendAlert(ssl, alert_fatal, bad_record_mac);
  17445. #endif
  17446. WOLFSSL_MSG("VerifyMac failed");
  17447. WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
  17448. return DECRYPT_ERROR;
  17449. }
  17450. }
  17451. ssl->keys.encryptSz = ssl->curSize;
  17452. ssl->keys.decryptedCur = 1;
  17453. #ifdef WOLFSSL_TLS13
  17454. if (ssl->options.tls1_3) {
  17455. /* end of plaintext */
  17456. word16 i = (word16)(ssl->buffers.inputBuffer.idx +
  17457. ssl->curSize - ssl->specs.aead_mac_size);
  17458. if (i > ssl->buffers.inputBuffer.length) {
  17459. WOLFSSL_ERROR(BUFFER_ERROR);
  17460. return BUFFER_ERROR;
  17461. }
  17462. /* Remove padding from end of plain text. */
  17463. for (--i; i > ssl->buffers.inputBuffer.idx; i--) {
  17464. if (ssl->buffers.inputBuffer.buffer[i] != 0)
  17465. break;
  17466. }
  17467. /* Get the real content type from the end of the data. */
  17468. ssl->curRL.type = ssl->buffers.inputBuffer.buffer[i];
  17469. /* consider both contentType byte and MAC as padding */
  17470. ssl->keys.padSz = ssl->buffers.inputBuffer.idx
  17471. + ssl->curSize - i;
  17472. }
  17473. #endif
  17474. }
  17475. ssl->options.processReply = runProcessingOneRecord;
  17476. FALL_THROUGH;
  17477. /* the record layer is here */
  17478. case runProcessingOneRecord:
  17479. #ifdef WOLFSSL_DTLS13
  17480. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  17481. if(!Dtls13CheckWindow(ssl)) {
  17482. /* drop packet */
  17483. WOLFSSL_MSG(
  17484. "Dropping DTLS record outside receiving window");
  17485. ssl->options.processReply = doProcessInit;
  17486. ssl->buffers.inputBuffer.idx += ssl->curSize;
  17487. if (ssl->buffers.inputBuffer.idx >
  17488. ssl->buffers.inputBuffer.length)
  17489. return BUFFER_E;
  17490. continue;
  17491. }
  17492. ret = Dtls13UpdateWindow(ssl);
  17493. if (ret != 1) {
  17494. WOLFSSL_ERROR(ret);
  17495. return ret;
  17496. }
  17497. ret = Dtls13RecordRecvd(ssl);
  17498. if (ret != 0) {
  17499. WOLFSSL_ERROR(ret);
  17500. return ret;
  17501. }
  17502. }
  17503. #endif /* WOLFSSL_DTLS13 */
  17504. ssl->options.processReply = runProcessingOneMessage;
  17505. FALL_THROUGH;
  17506. case runProcessingOneMessage:
  17507. /* can't process a message if we have no data. */
  17508. if (ssl->buffers.inputBuffer.idx
  17509. >= ssl->buffers.inputBuffer.length) {
  17510. return BUFFER_ERROR;
  17511. }
  17512. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17513. if (IsEncryptionOn(ssl, 0) && ssl->options.startedETMRead) {
  17514. /* For TLS v1.1 the block size and explicit IV are added to idx,
  17515. * so it needs to be included in this limit check */
  17516. if ((ssl->curSize - ssl->keys.padSz -
  17517. (ssl->buffers.inputBuffer.idx - startIdx) -
  17518. MacSize(ssl) > MAX_PLAINTEXT_SZ)
  17519. #ifdef WOLFSSL_ASYNC_CRYPT
  17520. && ssl->buffers.inputBuffer.length !=
  17521. ssl->buffers.inputBuffer.idx
  17522. #endif
  17523. ) {
  17524. WOLFSSL_MSG("Plaintext too long - Encrypt-Then-MAC");
  17525. #if defined(WOLFSSL_EXTRA_ALERTS)
  17526. SendAlert(ssl, alert_fatal, record_overflow);
  17527. #endif
  17528. WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
  17529. return BUFFER_ERROR;
  17530. }
  17531. }
  17532. else
  17533. #endif
  17534. /* TLS13 plaintext limit is checked earlier before decryption */
  17535. /* For TLS v1.1 the block size and explicit IV are added to idx,
  17536. * so it needs to be included in this limit check */
  17537. if (!IsAtLeastTLSv1_3(ssl->version)
  17538. && ssl->curSize - ssl->keys.padSz -
  17539. (ssl->buffers.inputBuffer.idx - startIdx)
  17540. > MAX_PLAINTEXT_SZ
  17541. #ifdef WOLFSSL_ASYNC_CRYPT
  17542. && ssl->buffers.inputBuffer.length !=
  17543. ssl->buffers.inputBuffer.idx
  17544. #endif
  17545. ) {
  17546. WOLFSSL_MSG("Plaintext too long");
  17547. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  17548. SendAlert(ssl, alert_fatal, record_overflow);
  17549. #endif
  17550. WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
  17551. return BUFFER_ERROR;
  17552. }
  17553. #ifdef WOLFSSL_DTLS
  17554. if (IsDtlsNotSctpMode(ssl) && !IsAtLeastTLSv1_3(ssl->version)) {
  17555. _DtlsUpdateWindow(ssl);
  17556. }
  17557. if (ssl->options.dtls) {
  17558. /* Reset timeout as we have received a valid DTLS message */
  17559. ssl->dtls_timeout = ssl->dtls_timeout_init;
  17560. }
  17561. #endif /* WOLFSSL_DTLS */
  17562. WOLFSSL_MSG("received record layer msg");
  17563. switch (ssl->curRL.type) {
  17564. case handshake :
  17565. WOLFSSL_MSG("got HANDSHAKE");
  17566. /* debugging in DoHandShakeMsg */
  17567. if (ssl->options.dtls) {
  17568. #ifdef WOLFSSL_DTLS
  17569. if (!IsAtLeastTLSv1_3(ssl->version)) {
  17570. ret = DoDtlsHandShakeMsg(ssl,
  17571. ssl->buffers.inputBuffer.buffer,
  17572. &ssl->buffers.inputBuffer.idx,
  17573. ssl->buffers.inputBuffer.length);
  17574. if (ret != 0)
  17575. SendFatalAlertOnly(ssl, ret);
  17576. }
  17577. #endif
  17578. #ifdef WOLFSSL_DTLS13
  17579. if (IsAtLeastTLSv1_3(ssl->version)) {
  17580. ret = Dtls13HandshakeRecv(ssl,
  17581. ssl->buffers.inputBuffer.buffer,
  17582. &ssl->buffers.inputBuffer.idx,
  17583. ssl->buffers.inputBuffer.length);
  17584. #ifdef WOLFSSL_EARLY_DATA
  17585. if (ret == 0 &&
  17586. ssl->options.side == WOLFSSL_SERVER_END &&
  17587. ssl->earlyData > early_data_ext &&
  17588. ssl->options.handShakeState == HANDSHAKE_DONE) {
  17589. /* return so wolfSSL_read_early_data can return
  17590. exit */
  17591. ssl->earlyData = no_early_data;
  17592. ssl->options.processReply = doProcessInit;
  17593. return ZERO_RETURN;
  17594. }
  17595. #endif /* WOLFSSL_EARLY_DATA */
  17596. }
  17597. #endif /* WOLFSSL_DTLS13 */
  17598. }
  17599. else if (!IsAtLeastTLSv1_3(ssl->version)
  17600. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12)
  17601. || !TLSv1_3_Capable(ssl)
  17602. #endif
  17603. ) {
  17604. #ifndef WOLFSSL_NO_TLS12
  17605. ret = DoHandShakeMsg(ssl,
  17606. ssl->buffers.inputBuffer.buffer,
  17607. &ssl->buffers.inputBuffer.idx,
  17608. ssl->buffers.inputBuffer.length);
  17609. if (ret != 0)
  17610. SendFatalAlertOnly(ssl, ret);
  17611. #else
  17612. ret = BUFFER_ERROR;
  17613. #endif
  17614. }
  17615. else {
  17616. #ifdef WOLFSSL_TLS13
  17617. ssl->msgsReceived.got_change_cipher = 0;
  17618. ret = DoTls13HandShakeMsg(ssl,
  17619. ssl->buffers.inputBuffer.buffer,
  17620. &ssl->buffers.inputBuffer.idx,
  17621. ssl->buffers.inputBuffer.length);
  17622. #ifdef WOLFSSL_EARLY_DATA
  17623. if (ret != 0)
  17624. return ret;
  17625. if (ssl->options.side == WOLFSSL_SERVER_END &&
  17626. ssl->earlyData > early_data_ext &&
  17627. ssl->options.handShakeState == HANDSHAKE_DONE) {
  17628. ssl->earlyData = no_early_data;
  17629. ssl->options.processReply = doProcessInit;
  17630. return ZERO_RETURN;
  17631. }
  17632. #endif
  17633. #else
  17634. ret = BUFFER_ERROR;
  17635. #endif
  17636. }
  17637. if (ret != 0
  17638. /* DoDtlsHandShakeMsg can return a WANT_WRITE when
  17639. * calling DtlsMsgPoolSend. This msg is done
  17640. * processing so let's move on. */
  17641. && (!ssl->options.dtls
  17642. || ret != WANT_WRITE)
  17643. #ifdef WOLFSSL_ASYNC_CRYPT
  17644. /* In async case, on pending, move onto next message.
  17645. * Current message should have been DtlsMsgStore'ed and
  17646. * should be processed with DtlsMsgDrain */
  17647. && (!ssl->options.dtls
  17648. || ret != WC_PENDING_E)
  17649. #endif
  17650. ) {
  17651. WOLFSSL_ERROR(ret);
  17652. return ret;
  17653. }
  17654. break;
  17655. case change_cipher_spec:
  17656. WOLFSSL_MSG("got CHANGE CIPHER SPEC");
  17657. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  17658. if (ssl->hsInfoOn)
  17659. AddPacketName(ssl, "ChangeCipher");
  17660. /* add record header back on info */
  17661. if (ssl->toInfoOn) {
  17662. ret = AddPacketInfo(ssl, "ChangeCipher",
  17663. change_cipher_spec,
  17664. ssl->buffers.inputBuffer.buffer +
  17665. ssl->buffers.inputBuffer.idx,
  17666. 1, READ_PROTO, RECORD_HEADER_SZ, ssl->heap);
  17667. if (ret != 0)
  17668. return ret;
  17669. #ifdef WOLFSSL_CALLBACKS
  17670. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  17671. #endif
  17672. }
  17673. #endif
  17674. #ifdef WOLFSSL_TLS13
  17675. if (IsAtLeastTLSv1_3(ssl->version)) {
  17676. word32 i = ssl->buffers.inputBuffer.idx;
  17677. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  17678. SendAlert(ssl, alert_fatal, unexpected_message);
  17679. WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
  17680. return UNKNOWN_RECORD_TYPE;
  17681. }
  17682. if (ssl->curSize != 1 ||
  17683. ssl->buffers.inputBuffer.buffer[i] != 1) {
  17684. SendAlert(ssl, alert_fatal, illegal_parameter);
  17685. WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
  17686. return UNKNOWN_RECORD_TYPE;
  17687. }
  17688. ssl->buffers.inputBuffer.idx++;
  17689. if (!ssl->msgsReceived.got_change_cipher) {
  17690. ssl->msgsReceived.got_change_cipher = 1;
  17691. }
  17692. else {
  17693. SendAlert(ssl, alert_fatal, illegal_parameter);
  17694. WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
  17695. return UNKNOWN_RECORD_TYPE;
  17696. }
  17697. break;
  17698. }
  17699. #endif
  17700. #ifndef WOLFSSL_NO_TLS12
  17701. if (ssl->buffers.inputBuffer.idx >=
  17702. ssl->buffers.inputBuffer.length ||
  17703. ssl->curSize < 1) {
  17704. WOLFSSL_MSG("ChangeCipher msg too short");
  17705. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  17706. return LENGTH_ERROR;
  17707. }
  17708. if (ssl->buffers.inputBuffer.buffer[
  17709. ssl->buffers.inputBuffer.idx] != 1) {
  17710. WOLFSSL_MSG("ChangeCipher msg wrong value");
  17711. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  17712. return LENGTH_ERROR;
  17713. }
  17714. if (IsEncryptionOn(ssl, 0) && ssl->options.handShakeDone) {
  17715. #ifdef HAVE_AEAD
  17716. if (ssl->specs.cipher_type == aead) {
  17717. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  17718. ssl->curSize -= AESGCM_EXP_IV_SZ;
  17719. ssl->buffers.inputBuffer.idx += ssl->specs.aead_mac_size;
  17720. ssl->curSize -= ssl->specs.aead_mac_size;
  17721. }
  17722. else
  17723. #endif
  17724. {
  17725. ssl->buffers.inputBuffer.idx += ssl->keys.padSz;
  17726. ssl->curSize -= (word16)ssl->keys.padSz;
  17727. ssl->curSize -= ssl->specs.iv_size;
  17728. }
  17729. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17730. if (ssl->options.startedETMRead) {
  17731. word32 digestSz = MacSize(ssl);
  17732. ssl->buffers.inputBuffer.idx += digestSz;
  17733. ssl->curSize -= (word16)digestSz;
  17734. }
  17735. #endif
  17736. }
  17737. if (ssl->curSize != 1) {
  17738. WOLFSSL_MSG("Malicious or corrupted ChangeCipher msg");
  17739. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  17740. return LENGTH_ERROR;
  17741. }
  17742. ssl->buffers.inputBuffer.idx++;
  17743. ret = SanityCheckMsgReceived(ssl, change_cipher_hs);
  17744. if (ret != 0) {
  17745. if (!ssl->options.dtls) {
  17746. return ret;
  17747. }
  17748. else {
  17749. #ifdef WOLFSSL_DTLS
  17750. /* Check for duplicate CCS message in DTLS mode.
  17751. * DTLS allows for duplicate messages, and it should be
  17752. * skipped. Also skip if out of order. */
  17753. if (ret != DUPLICATE_MSG_E && ret != OUT_OF_ORDER_E)
  17754. return ret;
  17755. /* Reset error */
  17756. ret = 0;
  17757. break;
  17758. #endif /* WOLFSSL_DTLS */
  17759. }
  17760. }
  17761. ssl->keys.encryptionOn = 1;
  17762. /* setup decrypt keys for following messages */
  17763. /* XXX This might not be what we want to do when
  17764. * receiving a CCS with multicast. We update the
  17765. * key when the application updates them. */
  17766. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  17767. return ret;
  17768. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17769. ssl->options.startedETMRead = ssl->options.encThenMac;
  17770. #endif
  17771. #ifdef WOLFSSL_DTLS
  17772. if (ssl->options.dtls) {
  17773. WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq;
  17774. #ifdef WOLFSSL_MULTICAST
  17775. if (ssl->options.haveMcast) {
  17776. peerSeq += ssl->keys.curPeerId;
  17777. peerSeq->highwaterMark = UpdateHighwaterMark(0,
  17778. ssl->ctx->mcastFirstSeq,
  17779. ssl->ctx->mcastSecondSeq,
  17780. ssl->ctx->mcastMaxSeq);
  17781. }
  17782. #endif
  17783. peerSeq->nextEpoch++;
  17784. peerSeq->prevSeq_lo = peerSeq->nextSeq_lo;
  17785. peerSeq->prevSeq_hi = peerSeq->nextSeq_hi;
  17786. peerSeq->nextSeq_lo = 0;
  17787. peerSeq->nextSeq_hi = 0;
  17788. XMEMCPY(peerSeq->prevWindow, peerSeq->window,
  17789. DTLS_SEQ_SZ);
  17790. XMEMSET(peerSeq->window, 0, DTLS_SEQ_SZ);
  17791. }
  17792. #endif
  17793. #ifdef HAVE_LIBZ
  17794. if (ssl->options.usingCompression)
  17795. if ( (ret = InitStreams(ssl)) != 0)
  17796. return ret;
  17797. #endif
  17798. ret = BuildFinished(ssl, &ssl->hsHashes->verifyHashes,
  17799. ssl->options.side == WOLFSSL_CLIENT_END ?
  17800. kTlsServerStr : kTlsClientStr);
  17801. if (ret != 0)
  17802. return ret;
  17803. #endif /* !WOLFSSL_NO_TLS12 */
  17804. break;
  17805. case application_data:
  17806. WOLFSSL_MSG("got app DATA");
  17807. #ifdef WOLFSSL_DTLS
  17808. if (ssl->options.dtls && ssl->options.dtlsHsRetain) {
  17809. #ifdef HAVE_SECURE_RENEGOTIATION
  17810. /*
  17811. * Only free HS resources when not in the process of a
  17812. * secure renegotiation and we have received APP DATA
  17813. * from the current epoch
  17814. */
  17815. if (!IsSCR(ssl) && (DtlsUseSCRKeys(ssl)
  17816. || !DtlsSCRKeysSet(ssl))) {
  17817. FreeHandshakeResources(ssl);
  17818. ssl->options.dtlsHsRetain = 0;
  17819. }
  17820. #else
  17821. FreeHandshakeResources(ssl);
  17822. ssl->options.dtlsHsRetain = 0;
  17823. #endif
  17824. }
  17825. #endif
  17826. #ifdef WOLFSSL_TLS13
  17827. if (ssl->keys.keyUpdateRespond) {
  17828. WOLFSSL_MSG("No KeyUpdate from peer seen");
  17829. WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
  17830. return SANITY_MSG_E;
  17831. }
  17832. #endif
  17833. if ((ret = DoApplicationData(ssl,
  17834. ssl->buffers.inputBuffer.buffer,
  17835. &ssl->buffers.inputBuffer.idx,
  17836. NO_SNIFF)) != 0) {
  17837. WOLFSSL_ERROR(ret);
  17838. return ret;
  17839. }
  17840. break;
  17841. case alert:
  17842. WOLFSSL_MSG("got ALERT!");
  17843. ret = DoAlert(ssl, ssl->buffers.inputBuffer.buffer,
  17844. &ssl->buffers.inputBuffer.idx, &type);
  17845. if (ret == alert_fatal)
  17846. return FATAL_ERROR;
  17847. else if (ret < 0)
  17848. return ret;
  17849. /* catch warnings that are handled as errors */
  17850. if (type == close_notify) {
  17851. ssl->buffers.inputBuffer.idx =
  17852. ssl->buffers.inputBuffer.length;
  17853. ssl->options.processReply = doProcessInit;
  17854. return ssl->error = ZERO_RETURN;
  17855. }
  17856. if (type == decrypt_error)
  17857. return FATAL_ERROR;
  17858. /* Reset error if we got an alert level in ret */
  17859. if (ret > 0)
  17860. ret = 0;
  17861. break;
  17862. #ifdef WOLFSSL_DTLS13
  17863. case ack:
  17864. WOLFSSL_MSG("got ACK");
  17865. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  17866. word32 processedSize = 0;
  17867. ret = DoDtls13Ack(ssl, ssl->buffers.inputBuffer.buffer +
  17868. ssl->buffers.inputBuffer.idx,
  17869. ssl->buffers.inputBuffer.length -
  17870. ssl->buffers.inputBuffer.idx -
  17871. ssl->keys.padSz, &processedSize);
  17872. ssl->buffers.inputBuffer.idx += processedSize;
  17873. ssl->buffers.inputBuffer.idx += ssl->keys.padSz;
  17874. if (ret != 0)
  17875. return ret;
  17876. break;
  17877. }
  17878. FALL_THROUGH;
  17879. #endif /* WOLFSSL_DTLS13 */
  17880. default:
  17881. WOLFSSL_ERROR(UNKNOWN_RECORD_TYPE);
  17882. return UNKNOWN_RECORD_TYPE;
  17883. }
  17884. ssl->options.processReply = doProcessInit;
  17885. /* input exhausted */
  17886. if (ssl->buffers.inputBuffer.idx >= ssl->buffers.inputBuffer.length
  17887. #ifdef WOLFSSL_DTLS
  17888. /* If app data was processed then return now to avoid
  17889. * dropping any app data. */
  17890. || (ssl->options.dtls && ssl->curRL.type == application_data)
  17891. #endif
  17892. ) {
  17893. /* Shrink input buffer when we successfully finish record
  17894. * processing */
  17895. if ((ret == 0) && ssl->buffers.inputBuffer.dynamicFlag)
  17896. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  17897. return ret;
  17898. }
  17899. /* more messages per record */
  17900. else if ((ssl->buffers.inputBuffer.idx - startIdx) < ssl->curSize) {
  17901. WOLFSSL_MSG("More messages in record");
  17902. ssl->options.processReply = runProcessingOneMessage;
  17903. if (IsEncryptionOn(ssl, 0)) {
  17904. WOLFSSL_MSG("Bundled encrypted messages, remove middle pad");
  17905. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17906. if (ssl->options.startedETMRead) {
  17907. word32 digestSz = MacSize(ssl);
  17908. if (ssl->buffers.inputBuffer.idx >=
  17909. ssl->keys.padSz + digestSz) {
  17910. ssl->buffers.inputBuffer.idx -=
  17911. ssl->keys.padSz + digestSz;
  17912. }
  17913. else {
  17914. WOLFSSL_MSG("\tmiddle padding error");
  17915. WOLFSSL_ERROR_VERBOSE(FATAL_ERROR);
  17916. return FATAL_ERROR;
  17917. }
  17918. }
  17919. else
  17920. #endif
  17921. {
  17922. if (ssl->buffers.inputBuffer.idx >= ssl->keys.padSz) {
  17923. ssl->buffers.inputBuffer.idx -= ssl->keys.padSz;
  17924. }
  17925. else {
  17926. WOLFSSL_MSG("\tmiddle padding error");
  17927. WOLFSSL_ERROR_VERBOSE(FATAL_ERROR);
  17928. return FATAL_ERROR;
  17929. }
  17930. }
  17931. }
  17932. }
  17933. /* more records */
  17934. else {
  17935. WOLFSSL_MSG("More records in input");
  17936. }
  17937. #ifdef WOLFSSL_ASYNC_CRYPT
  17938. /* We are setup to read next message/record but we had an error
  17939. * (probably WC_PENDING_E) so return that so it can be handled
  17940. * by higher layers. */
  17941. if (ret != 0)
  17942. return ret;
  17943. #endif
  17944. /* It is safe to shrink the input buffer here now. local vars will
  17945. * be reset to the new starting value. */
  17946. if (ret == 0 && ssl->buffers.inputBuffer.dynamicFlag)
  17947. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  17948. continue;
  17949. default:
  17950. WOLFSSL_MSG("Bad process input state, programming error");
  17951. WOLFSSL_ERROR_VERBOSE(INPUT_CASE_ERROR);
  17952. return INPUT_CASE_ERROR;
  17953. }
  17954. }
  17955. }
  17956. #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS) || \
  17957. (defined(WOLFSSL_TLS13) && defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT))
  17958. int SendChangeCipher(WOLFSSL* ssl)
  17959. {
  17960. byte *output;
  17961. int sendSz = RECORD_HEADER_SZ + ENUM_LEN;
  17962. int idx = RECORD_HEADER_SZ;
  17963. int ret;
  17964. #ifdef OPENSSL_EXTRA
  17965. ssl->cbmode = SSL_CB_MODE_WRITE;
  17966. if (ssl->options.side == WOLFSSL_SERVER_END){
  17967. ssl->options.serverState = SERVER_CHANGECIPHERSPEC_COMPLETE;
  17968. if (ssl->CBIS != NULL)
  17969. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, WOLFSSL_SUCCESS);
  17970. }
  17971. else{
  17972. ssl->options.clientState =
  17973. CLIENT_CHANGECIPHERSPEC_COMPLETE;
  17974. if (ssl->CBIS != NULL)
  17975. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, WOLFSSL_SUCCESS);
  17976. }
  17977. #endif
  17978. #ifdef WOLFSSL_DTLS
  17979. if (ssl->options.dtls) {
  17980. sendSz += DTLS_RECORD_EXTRA;
  17981. idx += DTLS_RECORD_EXTRA;
  17982. }
  17983. #endif
  17984. /* are we in scr */
  17985. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  17986. sendSz += MAX_MSG_EXTRA;
  17987. }
  17988. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  17989. * is not advanced yet */
  17990. ssl->options.buildingMsg = 1;
  17991. /* check for available size */
  17992. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  17993. return ret;
  17994. /* get output buffer */
  17995. output = ssl->buffers.outputBuffer.buffer +
  17996. ssl->buffers.outputBuffer.length;
  17997. AddRecordHeader(output, 1, change_cipher_spec, ssl, CUR_ORDER);
  17998. output[idx] = 1; /* turn it on */
  17999. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  18000. byte input[ENUM_LEN];
  18001. int inputSz = ENUM_LEN;
  18002. input[0] = 1; /* turn it on */
  18003. #ifdef WOLFSSL_DTLS
  18004. if (IsDtlsNotSctpMode(ssl) &&
  18005. (ret = DtlsMsgPoolSave(ssl, input, inputSz, change_cipher_hs)) != 0) {
  18006. return ret;
  18007. }
  18008. #endif
  18009. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  18010. change_cipher_spec, 0, 0, 0, CUR_ORDER);
  18011. if (sendSz < 0) {
  18012. return sendSz;
  18013. }
  18014. }
  18015. #ifdef WOLFSSL_DTLS
  18016. else {
  18017. if (IsDtlsNotSctpMode(ssl)) {
  18018. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, change_cipher_hs)) != 0)
  18019. return ret;
  18020. DtlsSEQIncrement(ssl, CUR_ORDER);
  18021. }
  18022. }
  18023. #endif
  18024. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  18025. if (ssl->hsInfoOn) AddPacketName(ssl, "ChangeCipher");
  18026. if (ssl->toInfoOn) {
  18027. ret = AddPacketInfo(ssl, "ChangeCipher", change_cipher_spec, output,
  18028. sendSz, WRITE_PROTO, 0, ssl->heap);
  18029. if (ret != 0)
  18030. return ret;
  18031. }
  18032. #endif
  18033. ssl->buffers.outputBuffer.length += sendSz;
  18034. #ifdef WOLFSSL_TLS13
  18035. if (!ssl->options.tls1_3)
  18036. #endif
  18037. {
  18038. /* setup encrypt keys */
  18039. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  18040. return ret;
  18041. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18042. ssl->options.startedETMWrite = ssl->options.encThenMac;
  18043. #endif
  18044. }
  18045. ssl->options.buildingMsg = 0;
  18046. if (ssl->options.groupMessages)
  18047. return 0;
  18048. #if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_DEBUG_DTLS)
  18049. else if (ssl->options.dtls) {
  18050. /* If using DTLS, force the ChangeCipherSpec message to be in the
  18051. * same datagram as the finished message. */
  18052. return 0;
  18053. }
  18054. #endif
  18055. else
  18056. return SendBuffered(ssl);
  18057. }
  18058. #endif
  18059. #if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
  18060. static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
  18061. int padLen, int content, int verify, int epochOrder)
  18062. {
  18063. byte result[WC_MAX_DIGEST_SIZE];
  18064. word32 digestSz = ssl->specs.hash_size; /* actual sizes */
  18065. word32 padSz = ssl->specs.pad_size;
  18066. int ret = 0;
  18067. wc_Md5 md5;
  18068. wc_Sha sha;
  18069. /* data */
  18070. byte seq[SEQ_SZ];
  18071. byte conLen[ENUM_LEN + LENGTH_SZ]; /* content & length */
  18072. const byte* macSecret = NULL;
  18073. (void)padLen;
  18074. #ifdef HAVE_FUZZER
  18075. if (ssl->fuzzerCb)
  18076. ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
  18077. #endif
  18078. #ifdef WOLFSSL_DTLS
  18079. if (ssl->options.dtls)
  18080. macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder);
  18081. else
  18082. macSecret = wolfSSL_GetMacSecret(ssl, verify);
  18083. #else
  18084. macSecret = wolfSSL_GetMacSecret(ssl, verify);
  18085. #endif
  18086. XMEMSET(seq, 0, SEQ_SZ);
  18087. conLen[0] = (byte)content;
  18088. c16toa((word16)sz, &conLen[ENUM_LEN]);
  18089. WriteSEQ(ssl, epochOrder, seq);
  18090. if (ssl->specs.mac_algorithm == md5_mac) {
  18091. ret = wc_InitMd5_ex(&md5, ssl->heap, ssl->devId);
  18092. if (ret != 0)
  18093. return ret;
  18094. /* inner */
  18095. ret = wc_Md5Update(&md5, macSecret, digestSz);
  18096. ret |= wc_Md5Update(&md5, PAD1, padSz);
  18097. ret |= wc_Md5Update(&md5, seq, SEQ_SZ);
  18098. ret |= wc_Md5Update(&md5, conLen, sizeof(conLen));
  18099. /* in buffer */
  18100. ret |= wc_Md5Update(&md5, in, sz);
  18101. if (ret != 0) {
  18102. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  18103. return VERIFY_MAC_ERROR;
  18104. }
  18105. ret = wc_Md5Final(&md5, result);
  18106. #ifdef WOLFSSL_ASYNC_CRYPT
  18107. /* TODO: Make non-blocking */
  18108. if (ret == WC_PENDING_E) {
  18109. ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE);
  18110. }
  18111. #endif
  18112. if (ret != 0) {
  18113. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  18114. return VERIFY_MAC_ERROR;
  18115. }
  18116. /* outer */
  18117. ret = wc_Md5Update(&md5, macSecret, digestSz);
  18118. ret |= wc_Md5Update(&md5, PAD2, padSz);
  18119. ret |= wc_Md5Update(&md5, result, digestSz);
  18120. if (ret != 0) {
  18121. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  18122. return VERIFY_MAC_ERROR;
  18123. }
  18124. ret = wc_Md5Final(&md5, digest);
  18125. #ifdef WOLFSSL_ASYNC_CRYPT
  18126. /* TODO: Make non-blocking */
  18127. if (ret == WC_PENDING_E) {
  18128. ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE);
  18129. }
  18130. #endif
  18131. if (ret != 0) {
  18132. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  18133. return VERIFY_MAC_ERROR;
  18134. }
  18135. wc_Md5Free(&md5);
  18136. }
  18137. else {
  18138. ret = wc_InitSha_ex(&sha, ssl->heap, ssl->devId);
  18139. if (ret != 0)
  18140. return ret;
  18141. /* inner */
  18142. ret = wc_ShaUpdate(&sha, macSecret, digestSz);
  18143. ret |= wc_ShaUpdate(&sha, PAD1, padSz);
  18144. ret |= wc_ShaUpdate(&sha, seq, SEQ_SZ);
  18145. ret |= wc_ShaUpdate(&sha, conLen, sizeof(conLen));
  18146. /* in buffer */
  18147. ret |= wc_ShaUpdate(&sha, in, sz);
  18148. if (ret != 0) {
  18149. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  18150. return VERIFY_MAC_ERROR;
  18151. }
  18152. ret = wc_ShaFinal(&sha, result);
  18153. #ifdef WOLFSSL_ASYNC_CRYPT
  18154. /* TODO: Make non-blocking */
  18155. if (ret == WC_PENDING_E) {
  18156. ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE);
  18157. }
  18158. #endif
  18159. if (ret != 0) {
  18160. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  18161. return VERIFY_MAC_ERROR;
  18162. }
  18163. /* outer */
  18164. ret = wc_ShaUpdate(&sha, macSecret, digestSz);
  18165. ret |= wc_ShaUpdate(&sha, PAD2, padSz);
  18166. ret |= wc_ShaUpdate(&sha, result, digestSz);
  18167. if (ret != 0) {
  18168. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  18169. return VERIFY_MAC_ERROR;
  18170. }
  18171. ret = wc_ShaFinal(&sha, digest);
  18172. #ifdef WOLFSSL_ASYNC_CRYPT
  18173. /* TODO: Make non-blocking */
  18174. if (ret == WC_PENDING_E) {
  18175. ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE);
  18176. }
  18177. #endif
  18178. if (ret != 0) {
  18179. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  18180. return VERIFY_MAC_ERROR;
  18181. }
  18182. wc_ShaFree(&sha);
  18183. }
  18184. return 0;
  18185. }
  18186. #endif /* !NO_OLD_TLS && !WOLFSSL_AEAD_ONLY */
  18187. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  18188. static int BuildMD5_CertVerify(const WOLFSSL* ssl, byte* digest)
  18189. {
  18190. int ret;
  18191. byte md5_result[WC_MD5_DIGEST_SIZE];
  18192. #ifdef WOLFSSL_SMALL_STACK
  18193. wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  18194. #else
  18195. wc_Md5 md5[1];
  18196. #endif
  18197. /* make md5 inner */
  18198. ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5); /* Save current position */
  18199. if (ret == 0)
  18200. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  18201. if (ret == 0)
  18202. ret = wc_Md5Update(md5, PAD1, PAD_MD5);
  18203. if (ret == 0)
  18204. ret = wc_Md5Final(md5, md5_result);
  18205. /* make md5 outer */
  18206. if (ret == 0) {
  18207. ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId);
  18208. if (ret == 0) {
  18209. ret = wc_Md5Update(md5, ssl->arrays->masterSecret, SECRET_LEN);
  18210. if (ret == 0)
  18211. ret = wc_Md5Update(md5, PAD2, PAD_MD5);
  18212. if (ret == 0)
  18213. ret = wc_Md5Update(md5, md5_result, WC_MD5_DIGEST_SIZE);
  18214. if (ret == 0)
  18215. ret = wc_Md5Final(md5, digest);
  18216. wc_Md5Free(md5);
  18217. }
  18218. }
  18219. #ifdef WOLFSSL_SMALL_STACK
  18220. XFREE(md5, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  18221. #endif
  18222. return ret;
  18223. }
  18224. #endif /* !NO_MD5 && !NO_OLD_TLS */
  18225. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  18226. defined(WOLFSSL_ALLOW_TLS_SHA1))
  18227. static int BuildSHA_CertVerify(const WOLFSSL* ssl, byte* digest)
  18228. {
  18229. int ret;
  18230. byte sha_result[WC_SHA_DIGEST_SIZE];
  18231. #ifdef WOLFSSL_SMALL_STACK
  18232. wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  18233. #else
  18234. wc_Sha sha[1];
  18235. #endif
  18236. /* make sha inner */
  18237. ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */
  18238. if (ret == 0)
  18239. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  18240. if (ret == 0)
  18241. ret = wc_ShaUpdate(sha, PAD1, PAD_SHA);
  18242. if (ret == 0)
  18243. ret = wc_ShaFinal(sha, sha_result);
  18244. /* make sha outer */
  18245. if (ret == 0) {
  18246. ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId);
  18247. if (ret == 0) {
  18248. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  18249. if (ret == 0)
  18250. ret = wc_ShaUpdate(sha, PAD2, PAD_SHA);
  18251. if (ret == 0)
  18252. ret = wc_ShaUpdate(sha, sha_result, WC_SHA_DIGEST_SIZE);
  18253. if (ret == 0)
  18254. ret = wc_ShaFinal(sha, digest);
  18255. wc_ShaFree(sha);
  18256. }
  18257. }
  18258. #ifdef WOLFSSL_SMALL_STACK
  18259. XFREE(sha, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  18260. #endif
  18261. return ret;
  18262. }
  18263. #endif /* !NO_SHA && (!NO_OLD_TLS || WOLFSSL_ALLOW_TLS_SHA1) */
  18264. int BuildCertHashes(const WOLFSSL* ssl, Hashes* hashes)
  18265. {
  18266. int ret = 0;
  18267. (void)hashes;
  18268. if (ssl->options.tls) {
  18269. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  18270. ret = wc_Md5GetHash(&ssl->hsHashes->hashMd5, hashes->md5);
  18271. if (ret != 0)
  18272. return ret;
  18273. #endif
  18274. #if !defined(NO_SHA)
  18275. ret = wc_ShaGetHash(&ssl->hsHashes->hashSha, hashes->sha);
  18276. if (ret != 0)
  18277. return ret;
  18278. #endif
  18279. if (IsAtLeastTLSv1_2(ssl)) {
  18280. #ifndef NO_SHA256
  18281. ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256,
  18282. hashes->sha256);
  18283. if (ret != 0)
  18284. return ret;
  18285. #endif
  18286. #ifdef WOLFSSL_SHA384
  18287. ret = wc_Sha384GetHash(&ssl->hsHashes->hashSha384,
  18288. hashes->sha384);
  18289. if (ret != 0)
  18290. return ret;
  18291. #endif
  18292. #ifdef WOLFSSL_SHA512
  18293. ret = wc_Sha512GetHash(&ssl->hsHashes->hashSha512,
  18294. hashes->sha512);
  18295. if (ret != 0)
  18296. return ret;
  18297. #endif
  18298. }
  18299. }
  18300. else {
  18301. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  18302. ret = BuildMD5_CertVerify(ssl, hashes->md5);
  18303. if (ret != 0)
  18304. return ret;
  18305. #endif
  18306. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  18307. defined(WOLFSSL_ALLOW_TLS_SHA1))
  18308. ret = BuildSHA_CertVerify(ssl, hashes->sha);
  18309. if (ret != 0)
  18310. return ret;
  18311. #endif
  18312. }
  18313. return ret;
  18314. }
  18315. #ifndef WOLFSSL_NO_TLS12
  18316. void FreeBuildMsgArgs(WOLFSSL* ssl, BuildMsgArgs* args)
  18317. {
  18318. (void)ssl;
  18319. if (args
  18320. #ifdef WOLFSSL_ASYNC_CRYPT
  18321. && ssl->options.buildArgsSet
  18322. #endif
  18323. ) {
  18324. /* only free the IV if it was dynamically allocated */
  18325. if (args->iv && (args->iv != args->staticIvBuffer)) {
  18326. XFREE(args->iv, ssl->heap, DYNAMIC_TYPE_SALT);
  18327. }
  18328. }
  18329. #ifdef WOLFSSL_ASYNC_CRYPT
  18330. ssl->options.buildArgsSet = 0;
  18331. #endif
  18332. }
  18333. #endif
  18334. /* Build SSL Message, encrypted */
  18335. int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input,
  18336. int inSz, int type, int hashOutput, int sizeOnly, int asyncOkay,
  18337. int epochOrder)
  18338. {
  18339. #ifndef WOLFSSL_NO_TLS12
  18340. int ret;
  18341. BuildMsgArgs* args;
  18342. BuildMsgArgs lcl_args;
  18343. #endif
  18344. WOLFSSL_ENTER("BuildMessage");
  18345. if (ssl == NULL) {
  18346. return BAD_FUNC_ARG;
  18347. }
  18348. /* catch mistaken sizeOnly parameter */
  18349. if (!sizeOnly && (output == NULL || input == NULL) ) {
  18350. return BAD_FUNC_ARG;
  18351. }
  18352. if (sizeOnly && (output || input) ) {
  18353. return BAD_FUNC_ARG;
  18354. }
  18355. (void)epochOrder;
  18356. #ifndef NO_TLS
  18357. #if defined(WOLFSSL_NO_TLS12) && defined(WOLFSSL_TLS13)
  18358. return BuildTls13Message(ssl, output, outSz, input, inSz, type,
  18359. hashOutput, sizeOnly, asyncOkay);
  18360. #else
  18361. #ifdef WOLFSSL_TLS13
  18362. if (ssl->options.tls1_3) {
  18363. return BuildTls13Message(ssl, output, outSz, input, inSz, type,
  18364. hashOutput, sizeOnly, asyncOkay);
  18365. }
  18366. #endif
  18367. #ifdef WOLFSSL_ASYNC_CRYPT
  18368. ret = WC_NOT_PENDING_E;
  18369. if (asyncOkay) {
  18370. if (ssl->async == NULL) {
  18371. return BAD_FUNC_ARG;
  18372. }
  18373. args = &ssl->async->buildArgs;
  18374. ret = wolfSSL_AsyncPop(ssl, &ssl->options.buildMsgState);
  18375. if (ret != WC_NOT_PENDING_E) {
  18376. /* Check for error */
  18377. if (ret < 0)
  18378. goto exit_buildmsg;
  18379. }
  18380. }
  18381. else
  18382. #endif
  18383. {
  18384. args = &lcl_args;
  18385. }
  18386. /* Reset state */
  18387. #ifdef WOLFSSL_ASYNC_CRYPT
  18388. if (ret == WC_NOT_PENDING_E)
  18389. #endif
  18390. {
  18391. ret = 0;
  18392. #ifdef WOLFSSL_ASYNC_CRYPT
  18393. ssl->options.buildArgsSet = 1;
  18394. #endif
  18395. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  18396. XMEMSET(args, 0, sizeof(BuildMsgArgs));
  18397. args->sz = RECORD_HEADER_SZ + inSz;
  18398. args->idx = RECORD_HEADER_SZ;
  18399. args->headerSz = RECORD_HEADER_SZ;
  18400. }
  18401. switch (ssl->options.buildMsgState) {
  18402. case BUILD_MSG_BEGIN:
  18403. {
  18404. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  18405. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  18406. /* For epochs >1 the current cipher parameters are located in
  18407. * ssl->secure_renegotiation->tmp_keys. Previous cipher
  18408. * parameters and for epoch 1 use ssl->keys */
  18409. switch (epochOrder) {
  18410. case PREV_ORDER:
  18411. if (ssl->encrypt.src != KEYS) {
  18412. ssl->secure_renegotiation->cache_status =
  18413. SCR_CACHE_NULL;
  18414. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  18415. ERROR_OUT(ret, exit_buildmsg);
  18416. }
  18417. break;
  18418. case CUR_ORDER:
  18419. if (ssl->keys.dtls_epoch ==
  18420. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  18421. if (ssl->encrypt.src != SCR) {
  18422. ssl->secure_renegotiation->cache_status =
  18423. SCR_CACHE_NEEDED;
  18424. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY))
  18425. != 0)
  18426. ERROR_OUT(ret, exit_buildmsg);
  18427. }
  18428. }
  18429. else {
  18430. if (ssl->encrypt.src != KEYS) {
  18431. ssl->secure_renegotiation->cache_status =
  18432. SCR_CACHE_NULL;
  18433. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY))
  18434. != 0)
  18435. ERROR_OUT(ret, exit_buildmsg);
  18436. }
  18437. }
  18438. break;
  18439. default:
  18440. WOLFSSL_MSG("BuildMessage only supports PREV_ORDER and "
  18441. "CUR_ORDER");
  18442. ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg);
  18443. }
  18444. }
  18445. #endif
  18446. ssl->options.buildMsgState = BUILD_MSG_SIZE;
  18447. }
  18448. FALL_THROUGH;
  18449. case BUILD_MSG_SIZE:
  18450. {
  18451. args->digestSz = ssl->specs.hash_size;
  18452. #ifdef HAVE_TRUNCATED_HMAC
  18453. if (ssl->truncated_hmac)
  18454. args->digestSz = min(TRUNCATED_HMAC_SZ, args->digestSz);
  18455. #endif
  18456. args->sz += args->digestSz;
  18457. #ifdef WOLFSSL_DTLS
  18458. if (ssl->options.dtls) {
  18459. args->sz += DTLS_RECORD_EXTRA;
  18460. args->idx += DTLS_RECORD_EXTRA;
  18461. args->headerSz += DTLS_RECORD_EXTRA;
  18462. }
  18463. #endif
  18464. #ifndef WOLFSSL_AEAD_ONLY
  18465. if (ssl->specs.cipher_type == block) {
  18466. word32 blockSz = ssl->specs.block_size;
  18467. if (blockSz == 0) {
  18468. WOLFSSL_MSG("Invalid block size with block cipher type");
  18469. ERROR_OUT(BAD_STATE_E, exit_buildmsg);
  18470. }
  18471. if (ssl->options.tls1_1) {
  18472. args->ivSz = blockSz;
  18473. args->sz += args->ivSz;
  18474. if (args->ivSz > MAX_IV_SZ)
  18475. ERROR_OUT(BUFFER_E, exit_buildmsg);
  18476. }
  18477. args->sz += 1; /* pad byte */
  18478. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18479. if (ssl->options.startedETMWrite) {
  18480. args->pad = (args->sz - args->headerSz -
  18481. args->digestSz) % blockSz;
  18482. }
  18483. else
  18484. #endif
  18485. {
  18486. args->pad = (args->sz - args->headerSz) % blockSz;
  18487. }
  18488. if (args->pad != 0)
  18489. args->pad = blockSz - args->pad;
  18490. args->sz += args->pad;
  18491. }
  18492. #endif /* WOLFSSL_AEAD_ONLY */
  18493. #ifdef HAVE_AEAD
  18494. if (ssl->specs.cipher_type == aead) {
  18495. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  18496. args->ivSz = AESGCM_EXP_IV_SZ;
  18497. args->sz += (args->ivSz + ssl->specs.aead_mac_size - args->digestSz);
  18498. }
  18499. #endif
  18500. /* done with size calculations */
  18501. if (sizeOnly)
  18502. goto exit_buildmsg;
  18503. if (args->sz > (word32)outSz) {
  18504. WOLFSSL_MSG("Oops, want to write past output buffer size");
  18505. ERROR_OUT(BUFFER_E, exit_buildmsg);
  18506. }
  18507. if (args->ivSz > 0) {
  18508. if (args->ivSz > sizeof(args->staticIvBuffer)) {
  18509. args->iv = (byte*)XMALLOC(args->ivSz, ssl->heap,
  18510. DYNAMIC_TYPE_SALT);
  18511. if (args->iv == NULL) {
  18512. ERROR_OUT(MEMORY_E, exit_buildmsg);
  18513. }
  18514. }
  18515. else {
  18516. args->iv = args->staticIvBuffer;
  18517. }
  18518. ret = wc_RNG_GenerateBlock(ssl->rng, args->iv, args->ivSz);
  18519. if (ret != 0)
  18520. goto exit_buildmsg;
  18521. }
  18522. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  18523. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  18524. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) && \
  18525. defined(HAVE_AEAD))
  18526. if (ssl->specs.cipher_type == aead) {
  18527. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  18528. XMEMCPY(args->iv, ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
  18529. }
  18530. #endif
  18531. args->size = (word16)(args->sz - args->headerSz); /* include mac and digest */
  18532. AddRecordHeader(output, args->size, (byte)type, ssl, epochOrder);
  18533. /* write to output */
  18534. if (args->ivSz > 0) {
  18535. XMEMCPY(output + args->idx, args->iv,
  18536. min(args->ivSz, MAX_IV_SZ));
  18537. args->idx += min(args->ivSz, MAX_IV_SZ);
  18538. }
  18539. XMEMCPY(output + args->idx, input, inSz);
  18540. args->idx += inSz;
  18541. ssl->options.buildMsgState = BUILD_MSG_HASH;
  18542. }
  18543. FALL_THROUGH;
  18544. case BUILD_MSG_HASH:
  18545. {
  18546. /* done with size calculations */
  18547. if (sizeOnly)
  18548. goto exit_buildmsg;
  18549. if (type == handshake && hashOutput) {
  18550. ret = HashOutput(ssl, output, args->headerSz + inSz, args->ivSz);
  18551. if (ret != 0)
  18552. goto exit_buildmsg;
  18553. }
  18554. #ifndef WOLFSSL_AEAD_ONLY
  18555. if (ssl->specs.cipher_type == block) {
  18556. word32 tmpIdx;
  18557. word32 i;
  18558. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18559. if (ssl->options.startedETMWrite)
  18560. tmpIdx = args->idx;
  18561. else
  18562. #endif
  18563. tmpIdx = args->idx + args->digestSz;
  18564. for (i = 0; i <= args->pad; i++)
  18565. output[tmpIdx++] = (byte)args->pad; /* pad byte gets pad value */
  18566. }
  18567. #endif
  18568. ssl->options.buildMsgState = BUILD_MSG_VERIFY_MAC;
  18569. }
  18570. FALL_THROUGH;
  18571. case BUILD_MSG_VERIFY_MAC:
  18572. {
  18573. /* done with size calculations */
  18574. if (sizeOnly)
  18575. goto exit_buildmsg;
  18576. /* User Record Layer Callback handling */
  18577. #ifdef ATOMIC_USER
  18578. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18579. if (ssl->options.startedETMWrite) {
  18580. if (ssl->ctx->EncryptMacCb) {
  18581. ret = ssl->ctx->EncryptMacCb(ssl, output + args->idx +
  18582. args->pad + 1, type, 0,
  18583. output + args->headerSz,
  18584. output + args->headerSz,
  18585. args->size - args->digestSz,
  18586. ssl->MacEncryptCtx);
  18587. goto exit_buildmsg;
  18588. }
  18589. }
  18590. else
  18591. #endif
  18592. {
  18593. if (ssl->ctx->MacEncryptCb) {
  18594. ret = ssl->ctx->MacEncryptCb(ssl, output + args->idx,
  18595. output + args->headerSz + args->ivSz, inSz,
  18596. type, 0, output + args->headerSz,
  18597. output + args->headerSz, args->size,
  18598. ssl->MacEncryptCtx);
  18599. goto exit_buildmsg;
  18600. }
  18601. }
  18602. #endif
  18603. #ifndef WOLFSSL_AEAD_ONLY
  18604. if (ssl->specs.cipher_type != aead
  18605. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18606. && !ssl->options.startedETMWrite
  18607. #endif
  18608. ) {
  18609. #ifdef HAVE_TRUNCATED_HMAC
  18610. if (ssl->truncated_hmac &&
  18611. ssl->specs.hash_size > args->digestSz) {
  18612. #ifdef WOLFSSL_SMALL_STACK
  18613. byte* hmac;
  18614. #else
  18615. byte hmac[WC_MAX_DIGEST_SIZE];
  18616. #endif
  18617. #ifdef WOLFSSL_SMALL_STACK
  18618. hmac = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, ssl->heap,
  18619. DYNAMIC_TYPE_DIGEST);
  18620. if (hmac == NULL)
  18621. ERROR_OUT(MEMORY_E, exit_buildmsg);
  18622. #endif
  18623. ret = ssl->hmac(ssl, hmac,
  18624. output + args->headerSz + args->ivSz, inSz,
  18625. -1, type, 0, epochOrder);
  18626. XMEMCPY(output + args->idx, hmac, args->digestSz);
  18627. #ifdef WOLFSSL_SMALL_STACK
  18628. XFREE(hmac, ssl->heap, DYNAMIC_TYPE_DIGEST);
  18629. #endif
  18630. }
  18631. else
  18632. #endif
  18633. {
  18634. ret = ssl->hmac(ssl, output + args->idx, output +
  18635. args->headerSz + args->ivSz, inSz, -1, type, 0, epochOrder);
  18636. }
  18637. }
  18638. #endif /* WOLFSSL_AEAD_ONLY */
  18639. if (ret != 0)
  18640. goto exit_buildmsg;
  18641. ssl->options.buildMsgState = BUILD_MSG_ENCRYPT;
  18642. }
  18643. FALL_THROUGH;
  18644. case BUILD_MSG_ENCRYPT:
  18645. {
  18646. /* done with size calculations */
  18647. if (sizeOnly)
  18648. goto exit_buildmsg;
  18649. {
  18650. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  18651. /* If we want the PREV_ORDER then modify CUR_ORDER sequence number
  18652. * for all encryption algos that use it for encryption parameters */
  18653. word16 dtls_epoch = 0;
  18654. word16 dtls_sequence_number_hi = 0;
  18655. word32 dtls_sequence_number_lo = 0;
  18656. int swap_seq = ssl->options.dtls && epochOrder == PREV_ORDER &&
  18657. DtlsUseSCRKeys(ssl);
  18658. if (swap_seq) {
  18659. dtls_epoch = ssl->keys.dtls_epoch;
  18660. dtls_sequence_number_hi = ssl->keys.dtls_sequence_number_hi;
  18661. dtls_sequence_number_lo = ssl->keys.dtls_sequence_number_lo;
  18662. ssl->keys.dtls_epoch--;
  18663. ssl->keys.dtls_sequence_number_hi =
  18664. ssl->keys.dtls_prev_sequence_number_hi;
  18665. ssl->keys.dtls_sequence_number_lo =
  18666. ssl->keys.dtls_prev_sequence_number_lo;
  18667. }
  18668. #endif
  18669. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18670. if (ssl->options.startedETMWrite) {
  18671. ret = Encrypt(ssl, output + args->headerSz,
  18672. output + args->headerSz,
  18673. (word16)(args->size - args->digestSz),
  18674. asyncOkay);
  18675. }
  18676. else
  18677. #endif
  18678. {
  18679. ret = Encrypt(ssl, output + args->headerSz,
  18680. output + args->headerSz, args->size, asyncOkay);
  18681. }
  18682. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  18683. /* Restore sequence numbers */
  18684. if (swap_seq) {
  18685. ssl->keys.dtls_epoch = dtls_epoch;
  18686. ssl->keys.dtls_sequence_number_hi = dtls_sequence_number_hi;
  18687. ssl->keys.dtls_sequence_number_lo = dtls_sequence_number_lo;
  18688. }
  18689. #endif
  18690. }
  18691. if (ret != 0) {
  18692. #ifdef WOLFSSL_ASYNC_CRYPT
  18693. if (ret != WC_PENDING_E)
  18694. #endif
  18695. {
  18696. /* Zeroize plaintext. */
  18697. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18698. if (ssl->options.startedETMWrite) {
  18699. ForceZero(output + args->headerSz,
  18700. (word16)(args->size - args->digestSz));
  18701. }
  18702. else
  18703. #endif
  18704. {
  18705. ForceZero(output + args->headerSz, (word16)args->size);
  18706. }
  18707. }
  18708. goto exit_buildmsg;
  18709. }
  18710. ssl->options.buildMsgState = BUILD_MSG_ENCRYPTED_VERIFY_MAC;
  18711. }
  18712. FALL_THROUGH;
  18713. case BUILD_MSG_ENCRYPTED_VERIFY_MAC:
  18714. {
  18715. /* done with size calculations */
  18716. if (sizeOnly)
  18717. goto exit_buildmsg;
  18718. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18719. if (ssl->options.startedETMWrite) {
  18720. WOLFSSL_MSG("Calculate MAC of Encrypted Data");
  18721. #ifdef HAVE_TRUNCATED_HMAC
  18722. if (ssl->truncated_hmac &&
  18723. ssl->specs.hash_size > args->digestSz) {
  18724. #ifdef WOLFSSL_SMALL_STACK
  18725. byte* hmac = NULL;
  18726. #else
  18727. byte hmac[WC_MAX_DIGEST_SIZE];
  18728. #endif
  18729. #ifdef WOLFSSL_SMALL_STACK
  18730. hmac = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, ssl->heap,
  18731. DYNAMIC_TYPE_DIGEST);
  18732. if (hmac == NULL)
  18733. ERROR_OUT(MEMORY_E, exit_buildmsg);
  18734. #endif
  18735. ret = ssl->hmac(ssl, hmac, output + args->headerSz,
  18736. args->ivSz + inSz + args->pad + 1, -1, type,
  18737. 0, epochOrder);
  18738. XMEMCPY(output + args->idx + args->pad + 1, hmac,
  18739. args->digestSz);
  18740. #ifdef WOLFSSL_SMALL_STACK
  18741. XFREE(hmac, ssl->heap, DYNAMIC_TYPE_DIGEST);
  18742. #endif
  18743. }
  18744. else
  18745. #endif
  18746. {
  18747. ret = ssl->hmac(ssl, output + args->idx + args->pad + 1,
  18748. output + args->headerSz,
  18749. args->ivSz + inSz + args->pad + 1, -1, type,
  18750. 0, epochOrder);
  18751. }
  18752. }
  18753. #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
  18754. }
  18755. FALL_THROUGH;
  18756. default:
  18757. break;
  18758. }
  18759. exit_buildmsg:
  18760. WOLFSSL_LEAVE("BuildMessage", ret);
  18761. #ifdef WOLFSSL_ASYNC_CRYPT
  18762. if (ret == WC_PENDING_E) {
  18763. return ret;
  18764. }
  18765. #endif
  18766. /* make sure build message state is reset */
  18767. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  18768. #ifdef WOLFSSL_DTLS
  18769. if (ret == 0 && ssl->options.dtls && !sizeOnly)
  18770. DtlsSEQIncrement(ssl, epochOrder);
  18771. #endif
  18772. /* return sz on success */
  18773. if (ret == 0) {
  18774. ret = args->sz;
  18775. }
  18776. else {
  18777. WOLFSSL_ERROR_VERBOSE(ret);
  18778. }
  18779. /* Final cleanup */
  18780. FreeBuildMsgArgs(ssl, args);
  18781. return ret;
  18782. #endif /* !WOLFSSL_NO_TLS12 */
  18783. #else
  18784. (void)outSz;
  18785. (void)inSz;
  18786. (void)type;
  18787. (void)hashOutput;
  18788. (void)asyncOkay;
  18789. return NOT_COMPILED_IN;
  18790. #endif /* NO_TLS */
  18791. }
  18792. #ifndef WOLFSSL_NO_TLS12
  18793. int SendFinished(WOLFSSL* ssl)
  18794. {
  18795. int sendSz,
  18796. finishedSz = ssl->options.tls ? TLS_FINISHED_SZ :
  18797. FINISHED_SZ;
  18798. byte input[FINISHED_SZ + DTLS_HANDSHAKE_HEADER_SZ]; /* max */
  18799. byte *output;
  18800. Hashes* hashes;
  18801. int ret;
  18802. int headerSz = HANDSHAKE_HEADER_SZ;
  18803. int outputSz;
  18804. WOLFSSL_START(WC_FUNC_FINISHED_SEND);
  18805. WOLFSSL_ENTER("SendFinished");
  18806. /* check for available size */
  18807. outputSz = sizeof(input) + MAX_MSG_EXTRA;
  18808. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  18809. * is not advanced yet */
  18810. ssl->options.buildingMsg = 1;
  18811. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  18812. return ret;
  18813. #ifdef WOLFSSL_DTLS
  18814. if (ssl->options.dtls) {
  18815. headerSz += DTLS_HANDSHAKE_EXTRA;
  18816. ssl->keys.dtls_epoch++;
  18817. ssl->keys.dtls_prev_sequence_number_hi =
  18818. ssl->keys.dtls_sequence_number_hi;
  18819. ssl->keys.dtls_prev_sequence_number_lo =
  18820. ssl->keys.dtls_sequence_number_lo;
  18821. ssl->keys.dtls_sequence_number_hi = 0;
  18822. ssl->keys.dtls_sequence_number_lo = 0;
  18823. }
  18824. #endif
  18825. /* get output buffer */
  18826. output = ssl->buffers.outputBuffer.buffer +
  18827. ssl->buffers.outputBuffer.length;
  18828. AddHandShakeHeader(input, finishedSz, 0, finishedSz, finished, ssl);
  18829. /* make finished hashes */
  18830. hashes = (Hashes*)&input[headerSz];
  18831. ret = BuildFinished(ssl, hashes, ssl->options.side == WOLFSSL_CLIENT_END ?
  18832. kTlsClientStr : kTlsServerStr);
  18833. if (ret != 0) return ret;
  18834. #ifdef HAVE_SECURE_RENEGOTIATION
  18835. if (ssl->secure_renegotiation) {
  18836. if (ssl->options.side == WOLFSSL_CLIENT_END)
  18837. XMEMCPY(ssl->secure_renegotiation->client_verify_data, hashes,
  18838. TLS_FINISHED_SZ);
  18839. else
  18840. XMEMCPY(ssl->secure_renegotiation->server_verify_data, hashes,
  18841. TLS_FINISHED_SZ);
  18842. }
  18843. #endif
  18844. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  18845. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  18846. XMEMCPY(ssl->clientFinished,
  18847. hashes, TLS_FINISHED_SZ);
  18848. ssl->clientFinished_len = TLS_FINISHED_SZ;
  18849. }
  18850. else {
  18851. XMEMCPY(ssl->serverFinished,
  18852. hashes, TLS_FINISHED_SZ);
  18853. ssl->serverFinished_len = TLS_FINISHED_SZ;
  18854. }
  18855. #endif
  18856. #ifdef WOLFSSL_DTLS
  18857. if (IsDtlsNotSctpMode(ssl)) {
  18858. if ((ret = DtlsMsgPoolSave(ssl, input, headerSz + finishedSz,
  18859. finished)) != 0) {
  18860. return ret;
  18861. }
  18862. }
  18863. #endif
  18864. sendSz = BuildMessage(ssl, output, outputSz, input, headerSz + finishedSz,
  18865. handshake, 1, 0, 0, CUR_ORDER);
  18866. if (sendSz < 0)
  18867. return BUILD_MSG_ERROR;
  18868. if (!ssl->options.resuming) {
  18869. SetupSession(ssl);
  18870. #ifndef NO_SESSION_CACHE
  18871. AddSession(ssl);
  18872. #endif
  18873. if (ssl->options.side == WOLFSSL_SERVER_END) {
  18874. #ifdef OPENSSL_EXTRA
  18875. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  18876. ssl->cbmode = SSL_CB_MODE_WRITE;
  18877. if (ssl->CBIS != NULL)
  18878. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_DONE, WOLFSSL_SUCCESS);
  18879. #endif
  18880. ssl->options.handShakeState = HANDSHAKE_DONE;
  18881. ssl->options.handShakeDone = 1;
  18882. }
  18883. }
  18884. else {
  18885. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  18886. #ifdef OPENSSL_EXTRA
  18887. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  18888. ssl->cbmode = SSL_CB_MODE_WRITE;
  18889. if (ssl->CBIS != NULL)
  18890. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_DONE, WOLFSSL_SUCCESS);
  18891. #endif
  18892. ssl->options.handShakeState = HANDSHAKE_DONE;
  18893. ssl->options.handShakeDone = 1;
  18894. }
  18895. }
  18896. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  18897. if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
  18898. if (ssl->toInfoOn) {
  18899. ret = AddPacketInfo(ssl, "Finished", handshake, output, sendSz,
  18900. WRITE_PROTO, 0, ssl->heap);
  18901. if (ret != 0)
  18902. return ret;
  18903. }
  18904. #endif
  18905. ssl->buffers.outputBuffer.length += sendSz;
  18906. ret = SendBuffered(ssl);
  18907. ssl->options.buildingMsg = 0;
  18908. #ifdef WOLFSSL_DTLS
  18909. if ((!ssl->options.resuming &&
  18910. ssl->options.side == WOLFSSL_SERVER_END) ||
  18911. (ssl->options.resuming &&
  18912. ssl->options.side == WOLFSSL_CLIENT_END)) {
  18913. ssl->keys.dtls_handshake_number = 0;
  18914. ssl->keys.dtls_expected_peer_handshake_number = 0;
  18915. }
  18916. #endif
  18917. WOLFSSL_LEAVE("SendFinished", ret);
  18918. WOLFSSL_END(WC_FUNC_FINISHED_SEND);
  18919. return ret;
  18920. }
  18921. #endif /* WOLFSSL_NO_TLS12 */
  18922. #ifndef NO_WOLFSSL_SERVER
  18923. #if (!defined(WOLFSSL_NO_TLS12) && \
  18924. (defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  18925. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))) || \
  18926. (defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST))
  18927. /* Parses and decodes the certificate then initializes "request". In the case
  18928. * of !ssl->buffers.weOwnCert, ssl->ctx->certOcspRequest gets set to "request".
  18929. *
  18930. * Returns 0 on success
  18931. */
  18932. static int CreateOcspRequest(WOLFSSL* ssl, OcspRequest* request,
  18933. DecodedCert* cert, byte* certData, word32 length)
  18934. {
  18935. int ret;
  18936. if (request != NULL)
  18937. XMEMSET(request, 0, sizeof(OcspRequest));
  18938. InitDecodedCert(cert, certData, length, ssl->heap);
  18939. /* TODO: Setup async support here */
  18940. ret = ParseCertRelative(cert, CERT_TYPE, VERIFY, SSL_CM(ssl));
  18941. if (ret != 0) {
  18942. WOLFSSL_MSG("ParseCert failed");
  18943. }
  18944. if (ret == 0)
  18945. ret = InitOcspRequest(request, cert, 0, ssl->heap);
  18946. if (ret == 0) {
  18947. /* make sure ctx OCSP request is updated */
  18948. if (!ssl->buffers.weOwnCert) {
  18949. wolfSSL_Mutex* ocspLock = &SSL_CM(ssl)->ocsp_stapling->ocspLock;
  18950. if (wc_LockMutex(ocspLock) == 0) {
  18951. if (ssl->ctx->certOcspRequest == NULL)
  18952. ssl->ctx->certOcspRequest = request;
  18953. wc_UnLockMutex(ocspLock);
  18954. }
  18955. }
  18956. }
  18957. FreeDecodedCert(cert);
  18958. return ret;
  18959. }
  18960. /* Creates OCSP response and places it in variable "response". Memory
  18961. * management for "buffer* response" is up to the caller.
  18962. *
  18963. * Also creates an OcspRequest in the case that ocspRequest is null or that
  18964. * ssl->buffers.weOwnCert is set. In those cases managing ocspRequest free'ing
  18965. * is up to the caller. NOTE: in OcspCreateRequest ssl->ctx->certOcspRequest can
  18966. * be set to point to "ocspRequest" and it then should not be free'd since
  18967. * wolfSSL_CTX_free will take care of it.
  18968. *
  18969. * Returns 0 on success
  18970. */
  18971. int CreateOcspResponse(WOLFSSL* ssl, OcspRequest** ocspRequest,
  18972. buffer* response)
  18973. {
  18974. int ret = 0;
  18975. OcspRequest* request = NULL;
  18976. byte createdRequest = 0;
  18977. if (ssl == NULL || ocspRequest == NULL || response == NULL)
  18978. return BAD_FUNC_ARG;
  18979. XMEMSET(response, 0, sizeof(*response));
  18980. request = *ocspRequest;
  18981. /* unable to fetch status. skip. */
  18982. if (SSL_CM(ssl) == NULL || SSL_CM(ssl)->ocspStaplingEnabled == 0)
  18983. return 0;
  18984. if (request == NULL || ssl->buffers.weOwnCert) {
  18985. DerBuffer* der = ssl->buffers.certificate;
  18986. #ifdef WOLFSSL_SMALL_STACK
  18987. DecodedCert* cert = NULL;
  18988. #else
  18989. DecodedCert cert[1];
  18990. #endif
  18991. /* unable to fetch status. skip. */
  18992. if (der->buffer == NULL || der->length == 0)
  18993. return 0;
  18994. #ifdef WOLFSSL_SMALL_STACK
  18995. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  18996. DYNAMIC_TYPE_DCERT);
  18997. if (cert == NULL)
  18998. return MEMORY_E;
  18999. #endif
  19000. request = (OcspRequest*)XMALLOC(sizeof(OcspRequest), ssl->heap,
  19001. DYNAMIC_TYPE_OCSP_REQUEST);
  19002. if (request == NULL)
  19003. ret = MEMORY_E;
  19004. createdRequest = 1;
  19005. if (ret == 0) {
  19006. ret = CreateOcspRequest(ssl, request, cert, der->buffer,
  19007. der->length);
  19008. }
  19009. if (ret != 0) {
  19010. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  19011. request = NULL;
  19012. }
  19013. #ifdef WOLFSSL_SMALL_STACK
  19014. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  19015. #endif
  19016. }
  19017. if (ret == 0) {
  19018. request->ssl = ssl;
  19019. ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling, request, response);
  19020. /* Suppressing, not critical */
  19021. if (ret == OCSP_CERT_REVOKED ||
  19022. ret == OCSP_CERT_UNKNOWN ||
  19023. ret == OCSP_LOOKUP_FAIL) {
  19024. ret = 0;
  19025. }
  19026. }
  19027. /* free request up if error case found otherwise return it */
  19028. if (ret != 0 && createdRequest) {
  19029. FreeOcspRequest(request);
  19030. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  19031. }
  19032. if (ret == 0)
  19033. *ocspRequest = request;
  19034. return ret;
  19035. }
  19036. #endif
  19037. #endif /* !NO_WOLFSSL_SERVER */
  19038. int cipherExtraData(WOLFSSL* ssl)
  19039. {
  19040. int cipherExtra;
  19041. /* Cipher data that may be added by BuildMessage */
  19042. /* There is always an IV (expect for chacha). For AEAD ciphers,
  19043. * there is the authentication tag (aead_mac_size). For block
  19044. * ciphers we have the hash_size MAC on the message, and one
  19045. * block size for possible padding. */
  19046. if (ssl->specs.cipher_type == aead) {
  19047. cipherExtra = ssl->specs.aead_mac_size;
  19048. /* CHACHA does not have an explicit IV. */
  19049. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha) {
  19050. cipherExtra += AESGCM_EXP_IV_SZ;
  19051. }
  19052. }
  19053. else {
  19054. cipherExtra = ssl->specs.iv_size + ssl->specs.block_size +
  19055. ssl->specs.hash_size;
  19056. }
  19057. /* Sanity check so we don't ever return negative. */
  19058. return cipherExtra > 0 ? cipherExtra : 0;
  19059. }
  19060. #ifndef WOLFSSL_NO_TLS12
  19061. #ifndef NO_CERTS
  19062. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  19063. /* handle generation of certificate (11) */
  19064. int SendCertificate(WOLFSSL* ssl)
  19065. {
  19066. int ret = 0;
  19067. word32 certSz, certChainSz, headerSz, listSz, payloadSz;
  19068. word32 length, maxFragment;
  19069. WOLFSSL_START(WC_FUNC_CERTIFICATE_SEND);
  19070. WOLFSSL_ENTER("SendCertificate");
  19071. if (ssl->options.usingPSK_cipher || ssl->options.usingAnon_cipher) {
  19072. WOLFSSL_MSG("Not sending certificate msg. Using PSK or ANON cipher.");
  19073. return 0; /* not needed */
  19074. }
  19075. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  19076. #ifdef OPENSSL_EXTRA
  19077. if (ssl->version.major == SSLv3_MAJOR
  19078. && ssl->version.minor == SSLv3_MINOR){
  19079. return SendAlert(ssl, alert_warning, no_certificate);
  19080. } else {
  19081. #endif
  19082. certSz = 0;
  19083. certChainSz = 0;
  19084. headerSz = CERT_HEADER_SZ;
  19085. length = CERT_HEADER_SZ;
  19086. listSz = 0;
  19087. #ifdef OPENSSL_EXTRA
  19088. }
  19089. #endif
  19090. }
  19091. else {
  19092. if (!ssl->buffers.certificate) {
  19093. WOLFSSL_MSG("Send Cert missing certificate buffer");
  19094. return BUFFER_ERROR;
  19095. }
  19096. certSz = ssl->buffers.certificate->length;
  19097. headerSz = 2 * CERT_HEADER_SZ;
  19098. /* list + cert size */
  19099. length = certSz + headerSz;
  19100. listSz = certSz + CERT_HEADER_SZ;
  19101. /* may need to send rest of chain, already has leading size(s) */
  19102. if (certSz && ssl->buffers.certChain) {
  19103. certChainSz = ssl->buffers.certChain->length;
  19104. length += certChainSz;
  19105. listSz += certChainSz;
  19106. }
  19107. else
  19108. certChainSz = 0;
  19109. }
  19110. payloadSz = length;
  19111. if (ssl->fragOffset != 0)
  19112. length -= (ssl->fragOffset + headerSz);
  19113. maxFragment = MAX_RECORD_SIZE;
  19114. maxFragment = wolfSSL_GetMaxFragSize(ssl, maxFragment);
  19115. while (length > 0 && ret == 0) {
  19116. byte* output = NULL;
  19117. word32 fragSz = 0;
  19118. word32 i = RECORD_HEADER_SZ;
  19119. int sendSz = RECORD_HEADER_SZ;
  19120. ssl->options.buildingMsg = 1;
  19121. if (!ssl->options.dtls) {
  19122. if (ssl->fragOffset == 0) {
  19123. if (headerSz + certSz + certChainSz <=
  19124. maxFragment - HANDSHAKE_HEADER_SZ) {
  19125. fragSz = headerSz + certSz + certChainSz;
  19126. }
  19127. else {
  19128. fragSz = maxFragment - HANDSHAKE_HEADER_SZ;
  19129. }
  19130. sendSz += fragSz + HANDSHAKE_HEADER_SZ;
  19131. i += HANDSHAKE_HEADER_SZ;
  19132. }
  19133. else {
  19134. fragSz = min(length, maxFragment);
  19135. sendSz += fragSz;
  19136. }
  19137. if (IsEncryptionOn(ssl, 1))
  19138. sendSz += MAX_MSG_EXTRA;
  19139. }
  19140. else {
  19141. #ifdef WOLFSSL_DTLS
  19142. fragSz = min(length, maxFragment);
  19143. sendSz += fragSz + DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_HEADER_SZ;
  19144. i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_HEADER_SZ;
  19145. #endif
  19146. }
  19147. if (IsEncryptionOn(ssl, 1))
  19148. sendSz += cipherExtraData(ssl);
  19149. /* check for available size */
  19150. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  19151. return ret;
  19152. /* get output buffer */
  19153. output = ssl->buffers.outputBuffer.buffer +
  19154. ssl->buffers.outputBuffer.length;
  19155. /* Safe to use ssl->fragOffset since it will be incremented immediately
  19156. * after this block. This block needs to be entered only once to not
  19157. * hash the cert msg twice. */
  19158. if (ssl->fragOffset == 0) {
  19159. if (!ssl->options.dtls) {
  19160. AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
  19161. if (!IsEncryptionOn(ssl, 1))
  19162. HashRaw(ssl, output + RECORD_HEADER_SZ,
  19163. HANDSHAKE_HEADER_SZ);
  19164. }
  19165. else {
  19166. #ifdef WOLFSSL_DTLS
  19167. AddHeaders(output, payloadSz, certificate, ssl);
  19168. HashRaw(ssl,
  19169. output + RECORD_HEADER_SZ + DTLS_RECORD_EXTRA,
  19170. HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA);
  19171. /* Adding the headers increments these, decrement them for
  19172. * actual message header. */
  19173. ssl->keys.dtls_handshake_number--;
  19174. AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
  19175. ssl->keys.dtls_handshake_number--;
  19176. #endif /* WOLFSSL_DTLS */
  19177. }
  19178. /* list total */
  19179. c32to24(listSz, output + i);
  19180. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1))
  19181. HashRaw(ssl, output + i, CERT_HEADER_SZ);
  19182. i += CERT_HEADER_SZ;
  19183. length -= CERT_HEADER_SZ;
  19184. fragSz -= CERT_HEADER_SZ;
  19185. if (certSz) {
  19186. c32to24(certSz, output + i);
  19187. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1))
  19188. HashRaw(ssl, output + i, CERT_HEADER_SZ);
  19189. i += CERT_HEADER_SZ;
  19190. length -= CERT_HEADER_SZ;
  19191. fragSz -= CERT_HEADER_SZ;
  19192. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1)) {
  19193. HashRaw(ssl, ssl->buffers.certificate->buffer, certSz);
  19194. if (certChainSz)
  19195. HashRaw(ssl, ssl->buffers.certChain->buffer,
  19196. certChainSz);
  19197. }
  19198. }
  19199. }
  19200. else {
  19201. if (!ssl->options.dtls) {
  19202. AddRecordHeader(output, fragSz, handshake, ssl, CUR_ORDER);
  19203. }
  19204. else {
  19205. #ifdef WOLFSSL_DTLS
  19206. AddFragHeaders(output, fragSz, ssl->fragOffset + headerSz,
  19207. payloadSz, certificate, ssl);
  19208. ssl->keys.dtls_handshake_number--;
  19209. #endif /* WOLFSSL_DTLS */
  19210. }
  19211. }
  19212. /* member */
  19213. if (certSz && ssl->fragOffset < certSz) {
  19214. word32 copySz = min(certSz - ssl->fragOffset, fragSz);
  19215. XMEMCPY(output + i,
  19216. ssl->buffers.certificate->buffer + ssl->fragOffset, copySz);
  19217. i += copySz;
  19218. ssl->fragOffset += copySz;
  19219. length -= copySz;
  19220. fragSz -= copySz;
  19221. }
  19222. if (certChainSz && fragSz) {
  19223. word32 copySz = min(certChainSz + certSz - ssl->fragOffset, fragSz);
  19224. XMEMCPY(output + i,
  19225. ssl->buffers.certChain->buffer + ssl->fragOffset - certSz,
  19226. copySz);
  19227. i += copySz;
  19228. ssl->fragOffset += copySz;
  19229. length -= copySz;
  19230. }
  19231. if (IsEncryptionOn(ssl, 1)) {
  19232. byte* input = NULL;
  19233. int inputSz = i; /* build msg adds rec hdr */
  19234. int recordHeaderSz = RECORD_HEADER_SZ;
  19235. if (ssl->options.dtls)
  19236. recordHeaderSz += DTLS_RECORD_EXTRA;
  19237. inputSz -= recordHeaderSz;
  19238. if (inputSz < 0) {
  19239. WOLFSSL_MSG("Send Cert bad inputSz");
  19240. return BUFFER_E;
  19241. }
  19242. if (inputSz > 0) { /* clang thinks could be zero, let's help */
  19243. input = (byte*)XMALLOC(inputSz, ssl->heap,
  19244. DYNAMIC_TYPE_IN_BUFFER);
  19245. if (input == NULL)
  19246. return MEMORY_E;
  19247. XMEMCPY(input, output + recordHeaderSz, inputSz);
  19248. }
  19249. #ifndef WOLFSSL_DTLS
  19250. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  19251. handshake, 1, 0, 0, CUR_ORDER);
  19252. #else
  19253. if (!ssl->options.dtls)
  19254. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  19255. handshake, 1, 0, 0, CUR_ORDER);
  19256. else /* DTLS 1.2 has to ignore fragmentation in hashing so we need to
  19257. * calculate the hash ourselves above */ {
  19258. if ((ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate)) != 0) {
  19259. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  19260. return ret;
  19261. }
  19262. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  19263. handshake, 0, 0, 0, CUR_ORDER);
  19264. }
  19265. #endif
  19266. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  19267. if (sendSz < 0)
  19268. return sendSz;
  19269. }
  19270. else {
  19271. sendSz = i;
  19272. #ifdef WOLFSSL_DTLS
  19273. if (IsDtlsNotSctpMode(ssl)) {
  19274. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate)) != 0)
  19275. return ret;
  19276. }
  19277. if (ssl->options.dtls)
  19278. DtlsSEQIncrement(ssl, CUR_ORDER);
  19279. #endif
  19280. }
  19281. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  19282. if (ssl->hsInfoOn)
  19283. AddPacketName(ssl, "Certificate");
  19284. if (ssl->toInfoOn) {
  19285. ret = AddPacketInfo(ssl, "Certificate", handshake, output, sendSz,
  19286. WRITE_PROTO, 0, ssl->heap);
  19287. if (ret != 0)
  19288. return ret;
  19289. }
  19290. #endif
  19291. ssl->buffers.outputBuffer.length += sendSz;
  19292. if (!ssl->options.groupMessages)
  19293. ret = SendBuffered(ssl);
  19294. }
  19295. if (ret != WANT_WRITE) {
  19296. /* Clean up the fragment offset. */
  19297. ssl->options.buildingMsg = 0;
  19298. ssl->fragOffset = 0;
  19299. #ifdef WOLFSSL_DTLS
  19300. if (ssl->options.dtls)
  19301. ssl->keys.dtls_handshake_number++;
  19302. #endif
  19303. if (ssl->options.side == WOLFSSL_SERVER_END){
  19304. ssl->options.serverState = SERVER_CERT_COMPLETE;
  19305. }
  19306. }
  19307. WOLFSSL_LEAVE("SendCertificate", ret);
  19308. WOLFSSL_END(WC_FUNC_CERTIFICATE_SEND);
  19309. return ret;
  19310. }
  19311. #endif /* !NO_WOLFSSL_SERVER || !WOLFSSL_NO_CLIENT_AUTH */
  19312. /* handle generation of certificate_request (13) */
  19313. int SendCertificateRequest(WOLFSSL* ssl)
  19314. {
  19315. byte *output;
  19316. int ret;
  19317. int sendSz;
  19318. word32 i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  19319. word32 dnLen = 0;
  19320. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  19321. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
  19322. #endif
  19323. const Suites* suites = WOLFSSL_SUITES(ssl);
  19324. int typeTotal = 1; /* only 1 for now */
  19325. int reqSz = ENUM_LEN + typeTotal + REQ_HEADER_SZ; /* add auth later */
  19326. WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  19327. WOLFSSL_ENTER("SendCertificateRequest");
  19328. if (IsAtLeastTLSv1_2(ssl))
  19329. reqSz += LENGTH_SZ + suites->hashSigAlgoSz;
  19330. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  19331. /* Certificate Authorities */
  19332. names = SSL_CA_NAMES(ssl);
  19333. while (names != NULL) {
  19334. byte seq[MAX_SEQ_SZ];
  19335. WOLFSSL_X509_NAME* name = names->data.name;
  19336. if (name != NULL) {
  19337. /* 16-bit length | SEQ | Len | DER of name */
  19338. dnLen += OPAQUE16_LEN + SetSequence(name->rawLen, seq) +
  19339. name->rawLen;
  19340. }
  19341. names = names->next;
  19342. }
  19343. reqSz += dnLen;
  19344. #endif
  19345. if (ssl->options.usingPSK_cipher || ssl->options.usingAnon_cipher)
  19346. return 0; /* not needed */
  19347. sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + reqSz;
  19348. if (!ssl->options.dtls) {
  19349. if (IsEncryptionOn(ssl, 1))
  19350. sendSz += MAX_MSG_EXTRA;
  19351. }
  19352. else {
  19353. #ifdef WOLFSSL_DTLS
  19354. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  19355. i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  19356. #endif
  19357. }
  19358. if (IsEncryptionOn(ssl, 1))
  19359. sendSz += cipherExtraData(ssl);
  19360. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  19361. * is not advanced yet */
  19362. ssl->options.buildingMsg = 1;
  19363. /* check for available size */
  19364. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  19365. return ret;
  19366. /* get output buffer */
  19367. output = ssl->buffers.outputBuffer.buffer +
  19368. ssl->buffers.outputBuffer.length;
  19369. AddHeaders(output, reqSz, certificate_request, ssl);
  19370. /* write to output */
  19371. output[i++] = (byte)typeTotal; /* # of types */
  19372. #ifdef HAVE_ECC
  19373. if ((ssl->options.cipherSuite0 == ECC_BYTE ||
  19374. ssl->options.cipherSuite0 == CHACHA_BYTE) &&
  19375. ssl->specs.sig_algo == ecc_dsa_sa_algo) {
  19376. output[i++] = ecdsa_sign;
  19377. } else
  19378. #endif /* HAVE_ECC */
  19379. {
  19380. output[i++] = rsa_sign;
  19381. }
  19382. /* supported hash/sig */
  19383. if (IsAtLeastTLSv1_2(ssl)) {
  19384. c16toa(suites->hashSigAlgoSz, &output[i]);
  19385. i += OPAQUE16_LEN;
  19386. XMEMCPY(&output[i], suites->hashSigAlgo, suites->hashSigAlgoSz);
  19387. i += suites->hashSigAlgoSz;
  19388. }
  19389. /* Certificate Authorities */
  19390. c16toa((word16)dnLen, &output[i]); /* auth's */
  19391. i += REQ_HEADER_SZ;
  19392. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  19393. names = SSL_CA_NAMES(ssl);
  19394. while (names != NULL) {
  19395. byte seq[MAX_SEQ_SZ];
  19396. WOLFSSL_X509_NAME* name = names->data.name;
  19397. if (name != NULL) {
  19398. c16toa((word16)name->rawLen +
  19399. (word16)SetSequence(name->rawLen, seq), &output[i]);
  19400. i += OPAQUE16_LEN;
  19401. i += SetSequence(name->rawLen, output + i);
  19402. XMEMCPY(output + i, name->raw, name->rawLen);
  19403. i += name->rawLen;
  19404. }
  19405. names = names->next;
  19406. }
  19407. #endif
  19408. (void)i;
  19409. if (IsEncryptionOn(ssl, 1)) {
  19410. byte* input = NULL;
  19411. int inputSz = i; /* build msg adds rec hdr */
  19412. int recordHeaderSz = RECORD_HEADER_SZ;
  19413. if (ssl->options.dtls)
  19414. recordHeaderSz += DTLS_RECORD_EXTRA;
  19415. inputSz -= recordHeaderSz;
  19416. if (inputSz <= 0) {
  19417. WOLFSSL_MSG("Send Cert Req bad inputSz");
  19418. return BUFFER_E;
  19419. }
  19420. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  19421. if (input == NULL)
  19422. return MEMORY_E;
  19423. XMEMCPY(input, output + recordHeaderSz, inputSz);
  19424. #ifdef WOLFSSL_DTLS
  19425. if (IsDtlsNotSctpMode(ssl) &&
  19426. (ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_request)) != 0) {
  19427. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  19428. return ret;
  19429. }
  19430. #endif
  19431. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  19432. handshake, 1, 0, 0, CUR_ORDER);
  19433. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  19434. if (sendSz < 0)
  19435. return sendSz;
  19436. } else {
  19437. sendSz = i;
  19438. #ifdef WOLFSSL_DTLS
  19439. if (IsDtlsNotSctpMode(ssl)) {
  19440. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_request)) != 0)
  19441. return ret;
  19442. }
  19443. if (ssl->options.dtls)
  19444. DtlsSEQIncrement(ssl, CUR_ORDER);
  19445. #endif
  19446. ret = HashOutput(ssl, output, sendSz, 0);
  19447. if (ret != 0)
  19448. return ret;
  19449. }
  19450. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  19451. if (ssl->hsInfoOn)
  19452. AddPacketName(ssl, "CertificateRequest");
  19453. if (ssl->toInfoOn) {
  19454. ret = AddPacketInfo(ssl, "CertificateRequest", handshake, output,
  19455. sendSz, WRITE_PROTO, 0, ssl->heap);
  19456. if (ret != 0)
  19457. return ret;
  19458. }
  19459. #endif
  19460. ssl->buffers.outputBuffer.length += sendSz;
  19461. if (ssl->options.groupMessages)
  19462. ret = 0;
  19463. else
  19464. ret = SendBuffered(ssl);
  19465. ssl->options.buildingMsg = 0;
  19466. WOLFSSL_LEAVE("SendCertificateRequest", ret);
  19467. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  19468. return ret;
  19469. }
  19470. #ifndef NO_WOLFSSL_SERVER
  19471. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  19472. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  19473. static int BuildCertificateStatus(WOLFSSL* ssl, byte type, buffer* status,
  19474. byte count)
  19475. {
  19476. byte* output = NULL;
  19477. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  19478. word32 length = ENUM_LEN;
  19479. int sendSz = 0;
  19480. int ret = 0;
  19481. int i = 0;
  19482. WOLFSSL_ENTER("BuildCertificateStatus");
  19483. switch (type) {
  19484. case WOLFSSL_CSR2_OCSP_MULTI:
  19485. length += OPAQUE24_LEN;
  19486. FALL_THROUGH; /* followed by */
  19487. case WOLFSSL_CSR2_OCSP:
  19488. for (i = 0; i < count; i++)
  19489. length += OPAQUE24_LEN + status[i].length;
  19490. break;
  19491. default:
  19492. return 0;
  19493. }
  19494. sendSz = idx + length;
  19495. if (ssl->keys.encryptionOn)
  19496. sendSz += MAX_MSG_EXTRA;
  19497. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  19498. * is not advanced yet */
  19499. ssl->options.buildingMsg = 1;
  19500. if ((ret = CheckAvailableSize(ssl, sendSz)) == 0) {
  19501. output = ssl->buffers.outputBuffer.buffer +
  19502. ssl->buffers.outputBuffer.length;
  19503. AddHeaders(output, length, certificate_status, ssl);
  19504. output[idx++] = type;
  19505. if (type == WOLFSSL_CSR2_OCSP_MULTI) {
  19506. c32to24(length - (ENUM_LEN + OPAQUE24_LEN), output + idx);
  19507. idx += OPAQUE24_LEN;
  19508. }
  19509. for (i = 0; i < count; i++) {
  19510. c32to24(status[i].length, output + idx);
  19511. idx += OPAQUE24_LEN;
  19512. XMEMCPY(output + idx, status[i].buffer, status[i].length);
  19513. idx += status[i].length;
  19514. }
  19515. if (IsEncryptionOn(ssl, 1)) {
  19516. byte* input;
  19517. int inputSz = idx; /* build msg adds rec hdr */
  19518. int recordHeaderSz = RECORD_HEADER_SZ;
  19519. if (ssl->options.dtls)
  19520. recordHeaderSz += DTLS_RECORD_EXTRA;
  19521. inputSz -= recordHeaderSz;
  19522. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  19523. if (input == NULL)
  19524. return MEMORY_E;
  19525. XMEMCPY(input, output + recordHeaderSz, inputSz);
  19526. #ifdef WOLFSSL_DTLS
  19527. ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_status);
  19528. #endif
  19529. if (ret == 0)
  19530. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  19531. handshake, 1, 0, 0, CUR_ORDER);
  19532. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  19533. if (sendSz < 0)
  19534. ret = sendSz;
  19535. }
  19536. else {
  19537. #ifdef WOLFSSL_DTLS
  19538. if (ret == 0 && IsDtlsNotSctpMode(ssl))
  19539. ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_status);
  19540. if (ret == 0 && ssl->options.dtls)
  19541. DtlsSEQIncrement(ssl, CUR_ORDER);
  19542. #endif
  19543. ret = HashOutput(ssl, output, sendSz, 0);
  19544. }
  19545. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  19546. if (ret == 0 && ssl->hsInfoOn)
  19547. AddPacketName(ssl, "CertificateStatus");
  19548. if (ret == 0 && ssl->toInfoOn) {
  19549. ret = AddPacketInfo(ssl, "CertificateStatus", handshake, output,
  19550. sendSz, WRITE_PROTO, 0, ssl->heap);
  19551. if (ret != 0)
  19552. return ret;
  19553. }
  19554. #endif
  19555. if (ret == 0) {
  19556. ssl->options.buildingMsg = 0;
  19557. ssl->buffers.outputBuffer.length += sendSz;
  19558. if (!ssl->options.groupMessages)
  19559. ret = SendBuffered(ssl);
  19560. }
  19561. }
  19562. WOLFSSL_LEAVE("BuildCertificateStatus", ret);
  19563. return ret;
  19564. }
  19565. #endif
  19566. #endif /* NO_WOLFSSL_SERVER */
  19567. /* handle generation of certificate_status (22) */
  19568. int SendCertificateStatus(WOLFSSL* ssl)
  19569. {
  19570. int ret = 0;
  19571. byte status_type = 0;
  19572. WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_SEND);
  19573. WOLFSSL_ENTER("SendCertificateStatus");
  19574. (void) ssl;
  19575. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  19576. status_type = ssl->status_request;
  19577. #endif
  19578. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  19579. status_type = status_type ? status_type : ssl->status_request_v2;
  19580. #endif
  19581. switch (status_type) {
  19582. #ifndef NO_WOLFSSL_SERVER
  19583. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  19584. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  19585. /* case WOLFSSL_CSR_OCSP: */
  19586. case WOLFSSL_CSR2_OCSP:
  19587. {
  19588. OcspRequest* request = ssl->ctx->certOcspRequest;
  19589. buffer response;
  19590. ret = CreateOcspResponse(ssl, &request, &response);
  19591. /* if a request was successfully created and not stored in
  19592. * ssl->ctx then free it */
  19593. if (ret == 0 && request != ssl->ctx->certOcspRequest) {
  19594. FreeOcspRequest(request);
  19595. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  19596. request = NULL;
  19597. }
  19598. if (ret == 0 && response.buffer) {
  19599. ret = BuildCertificateStatus(ssl, status_type, &response, 1);
  19600. XFREE(response.buffer, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  19601. response.buffer = NULL;
  19602. }
  19603. break;
  19604. }
  19605. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  19606. /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  19607. #if defined HAVE_CERTIFICATE_STATUS_REQUEST_V2
  19608. case WOLFSSL_CSR2_OCSP_MULTI:
  19609. {
  19610. OcspRequest* request = ssl->ctx->certOcspRequest;
  19611. buffer responses[1 + MAX_CHAIN_DEPTH];
  19612. int i = 0;
  19613. XMEMSET(responses, 0, sizeof(responses));
  19614. ret = CreateOcspResponse(ssl, &request, &responses[0]);
  19615. /* if a request was successfully created and not stored in
  19616. * ssl->ctx then free it */
  19617. if (ret == 0 && request != ssl->ctx->certOcspRequest) {
  19618. FreeOcspRequest(request);
  19619. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  19620. request = NULL;
  19621. }
  19622. if (ret == 0 && (!ssl->ctx->chainOcspRequest[0]
  19623. || ssl->buffers.weOwnCertChain)) {
  19624. buffer der;
  19625. word32 idx = 0;
  19626. #ifdef WOLFSSL_SMALL_STACK
  19627. DecodedCert* cert;
  19628. #else
  19629. DecodedCert cert[1];
  19630. #endif
  19631. DerBuffer* chain;
  19632. #ifdef WOLFSSL_SMALL_STACK
  19633. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  19634. DYNAMIC_TYPE_DCERT);
  19635. if (cert == NULL)
  19636. return MEMORY_E;
  19637. #endif
  19638. request = (OcspRequest*)XMALLOC(sizeof(OcspRequest), ssl->heap,
  19639. DYNAMIC_TYPE_OCSP_REQUEST);
  19640. if (request == NULL) {
  19641. #ifdef WOLFSSL_SMALL_STACK
  19642. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  19643. #endif
  19644. return MEMORY_E;
  19645. }
  19646. /* use certChain if available, otherwise use peer certificate */
  19647. chain = ssl->buffers.certChain;
  19648. if (chain == NULL) {
  19649. chain = ssl->buffers.certificate;
  19650. }
  19651. if (chain && chain->buffer) {
  19652. while (idx + OPAQUE24_LEN < chain->length) {
  19653. c24to32(chain->buffer + idx, &der.length);
  19654. idx += OPAQUE24_LEN;
  19655. der.buffer = chain->buffer + idx;
  19656. idx += der.length;
  19657. if (idx > chain->length)
  19658. break;
  19659. ret = CreateOcspRequest(ssl, request, cert, der.buffer,
  19660. der.length);
  19661. if (ret == 0) {
  19662. request->ssl = ssl;
  19663. ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling,
  19664. request, &responses[i + 1]);
  19665. /* Suppressing, not critical */
  19666. if (ret == OCSP_CERT_REVOKED ||
  19667. ret == OCSP_CERT_UNKNOWN ||
  19668. ret == OCSP_LOOKUP_FAIL) {
  19669. ret = 0;
  19670. }
  19671. i++;
  19672. FreeOcspRequest(request);
  19673. }
  19674. }
  19675. }
  19676. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  19677. #ifdef WOLFSSL_SMALL_STACK
  19678. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  19679. #endif
  19680. }
  19681. else {
  19682. while (ret == 0 &&
  19683. NULL != (request = ssl->ctx->chainOcspRequest[i])) {
  19684. request->ssl = ssl;
  19685. ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling,
  19686. request, &responses[++i]);
  19687. /* Suppressing, not critical */
  19688. if (ret == OCSP_CERT_REVOKED ||
  19689. ret == OCSP_CERT_UNKNOWN ||
  19690. ret == OCSP_LOOKUP_FAIL) {
  19691. ret = 0;
  19692. }
  19693. }
  19694. }
  19695. if (responses[0].buffer) {
  19696. if (ret == 0) {
  19697. ret = BuildCertificateStatus(ssl, status_type, responses,
  19698. (byte)i + 1);
  19699. }
  19700. for (i = 0; i < 1 + MAX_CHAIN_DEPTH; i++) {
  19701. if (responses[i].buffer) {
  19702. XFREE(responses[i].buffer, ssl->heap,
  19703. DYNAMIC_TYPE_OCSP_REQUEST);
  19704. }
  19705. }
  19706. }
  19707. break;
  19708. }
  19709. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  19710. #endif /* NO_WOLFSSL_SERVER */
  19711. default:
  19712. break;
  19713. }
  19714. WOLFSSL_LEAVE("SendCertificateStatus", ret);
  19715. WOLFSSL_END(WC_FUNC_CERTIFICATE_STATUS_SEND);
  19716. return ret;
  19717. }
  19718. #endif /* !NO_CERTS */
  19719. #endif /* WOLFSSL_NO_TLS12 */
  19720. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  19721. /**
  19722. * Check if the SCR keys are set in ssl->secure_renegotiation->tmp_keys.
  19723. */
  19724. int DtlsSCRKeysSet(WOLFSSL* ssl)
  19725. {
  19726. return ssl->secure_renegotiation &&
  19727. ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0;
  19728. }
  19729. /**
  19730. * ssl->keys contains the current cipher parameters only for epoch 1. For
  19731. * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current
  19732. * cipher parameters. This function checks if the message currently being
  19733. * processed should use ssl->keys or ssl->secure_renegotiation->tmp_keys.
  19734. */
  19735. int IsDtlsMsgSCRKeys(WOLFSSL* ssl)
  19736. {
  19737. return DtlsSCRKeysSet(ssl) &&
  19738. ssl->keys.curEpoch ==
  19739. ssl->secure_renegotiation->tmp_keys.dtls_epoch;
  19740. }
  19741. /**
  19742. * ssl->keys contains the current cipher parameters only for epoch 1. For
  19743. * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current
  19744. * cipher parameters. This function checks if the message currently being
  19745. * built should use ssl->keys or ssl->secure_renegotiation->tmp_keys.
  19746. */
  19747. int DtlsUseSCRKeys(WOLFSSL* ssl)
  19748. {
  19749. return DtlsSCRKeysSet(ssl) &&
  19750. ssl->secure_renegotiation->tmp_keys.dtls_epoch ==
  19751. ssl->keys.dtls_epoch;
  19752. }
  19753. /**
  19754. * If ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch
  19755. * then PREV_ORDER refers to the current epoch.
  19756. * */
  19757. int DtlsCheckOrder(WOLFSSL* ssl, int order)
  19758. {
  19759. if (order == PREV_ORDER && ssl->secure_renegotiation &&
  19760. ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch) {
  19761. return CUR_ORDER;
  19762. }
  19763. else {
  19764. return order;
  19765. }
  19766. }
  19767. #endif /* HAVE_SECURE_RENEGOTIATION && WOLFSSL_DTLS */
  19768. /* If secure renegotiation is disabled, this will always return false.
  19769. * Otherwise it checks to see if we are currently renegotiating. */
  19770. int IsSCR(WOLFSSL* ssl)
  19771. {
  19772. #ifndef HAVE_SECURE_RENEGOTIATION
  19773. (void)ssl;
  19774. #else /* HAVE_SECURE_RENEGOTIATION */
  19775. if (ssl->secure_renegotiation &&
  19776. ssl->secure_renegotiation->enabled && /* Is SCR enabled? */
  19777. ssl->options.handShakeDone && /* At least one handshake done? */
  19778. ssl->options.handShakeState != HANDSHAKE_DONE) /* Currently handshaking? */
  19779. return 1;
  19780. #endif /* HAVE_SECURE_RENEGOTIATION */
  19781. return 0;
  19782. }
  19783. #ifdef WOLFSSL_DTLS
  19784. static int ModifyForMTU(WOLFSSL* ssl, int buffSz, int outputSz, int mtuSz)
  19785. {
  19786. int recordExtra = outputSz - buffSz;
  19787. (void)ssl;
  19788. if (recordExtra > 0 && outputSz > mtuSz) {
  19789. buffSz = mtuSz - recordExtra;
  19790. #ifndef WOLFSSL_AEAD_ONLY
  19791. /* Subtract a block size to be certain that returned fragment
  19792. * size won't get more padding. */
  19793. if (ssl->specs.cipher_type == block)
  19794. buffSz -= ssl->specs.block_size;
  19795. #endif
  19796. }
  19797. return buffSz;
  19798. }
  19799. #endif /* WOLFSSL_DTLS */
  19800. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_TLS13_IGNORE_AEAD_LIMITS)
  19801. /*
  19802. * Enforce limits specified in
  19803. * https://www.rfc-editor.org/rfc/rfc8446#section-5.5
  19804. */
  19805. static int CheckTLS13AEADSendLimit(WOLFSSL* ssl)
  19806. {
  19807. w64wrapper seq;
  19808. w64wrapper limit;
  19809. switch (ssl->specs.bulk_cipher_algorithm) {
  19810. #ifdef BUILD_AESGCM
  19811. case wolfssl_aes_gcm:
  19812. /* Limit is 2^24.5 */
  19813. limit = AEAD_AES_LIMIT;
  19814. break;
  19815. #endif
  19816. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  19817. case wolfssl_chacha:
  19818. /* For ChaCha20/Poly1305, the record sequence number would wrap
  19819. * before the safety limit is reached. */
  19820. return 0;
  19821. #endif
  19822. #ifdef HAVE_AESCCM
  19823. case wolfssl_aes_ccm:
  19824. /* Use the limits calculated in the DTLS 1.3 spec
  19825. * https://www.rfc-editor.org/rfc/rfc9147.html#name-analysis-of-limits-on-ccm-u */
  19826. #ifdef WOLFSSL_DTLS13
  19827. if (ssl->options.dtls)
  19828. limit = DTLS_AEAD_AES_CCM_LIMIT; /* Limit is 2^23 */
  19829. else
  19830. #endif
  19831. limit = AEAD_AES_LIMIT; /* Limit is 2^24.5 */
  19832. break;
  19833. #endif
  19834. case wolfssl_cipher_null:
  19835. /* No encryption being done */
  19836. return 0;
  19837. default:
  19838. WOLFSSL_MSG("Unrecognized ciphersuite for AEAD limit check");
  19839. return BAD_STATE_E;
  19840. }
  19841. #ifdef WOLFSSL_DTLS13
  19842. if (ssl->options.dtls) {
  19843. seq = ssl->dtls13EncryptEpoch->nextSeqNumber;
  19844. }
  19845. else
  19846. #endif
  19847. {
  19848. seq = w64From32(ssl->keys.sequence_number_hi,
  19849. ssl->keys.sequence_number_lo);
  19850. }
  19851. if (w64GTE(seq, limit))
  19852. return Tls13UpdateKeys(ssl); /* Need to generate new keys */
  19853. return 0;
  19854. }
  19855. #endif /* WOLFSSL_TLS13 && !WOLFSSL_TLS13_IGNORE_AEAD_LIMITS */
  19856. int SendData(WOLFSSL* ssl, const void* data, int sz)
  19857. {
  19858. int sent = 0, /* plainText size */
  19859. sendSz,
  19860. ret;
  19861. #if defined(WOLFSSL_EARLY_DATA) && defined(WOLFSSL_EARLY_DATA_GROUP)
  19862. int groupMsgs = 0;
  19863. #endif
  19864. if (ssl->error == WANT_WRITE
  19865. #ifdef WOLFSSL_ASYNC_CRYPT
  19866. || ssl->error == WC_PENDING_E
  19867. #endif
  19868. ) {
  19869. ssl->error = 0;
  19870. }
  19871. /* don't allow write after decrypt or mac error */
  19872. if (ssl->error == VERIFY_MAC_ERROR || ssl->error == DECRYPT_ERROR) {
  19873. /* For DTLS allow these possible errors and allow the session
  19874. to continue despite them */
  19875. if (ssl->options.dtls) {
  19876. ssl->error = 0;
  19877. }
  19878. else {
  19879. WOLFSSL_MSG("Not allowing write after decrypt or mac error");
  19880. return WOLFSSL_FATAL_ERROR;
  19881. }
  19882. }
  19883. #ifdef WOLFSSL_EARLY_DATA
  19884. if (ssl->earlyData != no_early_data) {
  19885. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  19886. WOLFSSL_MSG("handshake complete, trying to send early data");
  19887. ssl->error = BUILD_MSG_ERROR;
  19888. return WOLFSSL_FATAL_ERROR;
  19889. }
  19890. #ifdef WOLFSSL_EARLY_DATA_GROUP
  19891. groupMsgs = 1;
  19892. #endif
  19893. }
  19894. else
  19895. #endif
  19896. if (ssl->options.handShakeState != HANDSHAKE_DONE && !IsSCR(ssl)) {
  19897. int err;
  19898. WOLFSSL_MSG("handshake not complete, trying to finish");
  19899. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  19900. #ifdef WOLFSSL_ASYNC_CRYPT
  19901. /* if async would block return WANT_WRITE */
  19902. if (ssl->error == WC_PENDING_E) {
  19903. return WOLFSSL_CBIO_ERR_WANT_WRITE;
  19904. }
  19905. #endif
  19906. return err;
  19907. }
  19908. }
  19909. /* last time system socket output buffer was full, try again to send */
  19910. if (ssl->buffers.outputBuffer.length > 0
  19911. #if defined(WOLFSSL_EARLY_DATA) && defined(WOLFSSL_EARLY_DATA_GROUP)
  19912. && !groupMsgs
  19913. #endif
  19914. ) {
  19915. WOLFSSL_MSG("output buffer was full, trying to send again");
  19916. if ( (ssl->error = SendBuffered(ssl)) < 0) {
  19917. WOLFSSL_ERROR(ssl->error);
  19918. if (ssl->error == SOCKET_ERROR_E && (ssl->options.connReset ||
  19919. ssl->options.isClosed)) {
  19920. ssl->error = SOCKET_PEER_CLOSED_E;
  19921. WOLFSSL_ERROR(ssl->error);
  19922. return 0; /* peer reset or closed */
  19923. }
  19924. return ssl->error;
  19925. }
  19926. else {
  19927. /* advance sent to previous sent + plain size just sent */
  19928. sent = ssl->buffers.prevSent + ssl->buffers.plainSz;
  19929. WOLFSSL_MSG("sent write buffered data");
  19930. if (sent > sz) {
  19931. WOLFSSL_MSG("error: write() after WANT_WRITE with short size");
  19932. return ssl->error = BAD_FUNC_ARG;
  19933. }
  19934. }
  19935. }
  19936. ret = RetrySendAlert(ssl);
  19937. if (ret != 0) {
  19938. ssl->error = ret;
  19939. return WOLFSSL_FATAL_ERROR;
  19940. }
  19941. for (;;) {
  19942. byte* out;
  19943. byte* sendBuffer = (byte*)data + sent; /* may switch on comp */
  19944. int buffSz; /* may switch on comp */
  19945. int outputSz;
  19946. #ifdef HAVE_LIBZ
  19947. byte comp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
  19948. #endif
  19949. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_TLS13_IGNORE_AEAD_LIMITS)
  19950. if (IsAtLeastTLSv1_3(ssl->version)) {
  19951. ret = CheckTLS13AEADSendLimit(ssl);
  19952. if (ret != 0) {
  19953. ssl->error = ret;
  19954. return WOLFSSL_FATAL_ERROR;
  19955. }
  19956. }
  19957. #endif
  19958. #ifdef WOLFSSL_DTLS13
  19959. if (ssl->options.dtls && ssl->options.tls1_3) {
  19960. byte isEarlyData = 0;
  19961. if (ssl->dtls13EncryptEpoch == NULL)
  19962. return ssl->error = BAD_STATE_E;
  19963. #ifdef WOLFSSL_EARLY_DATA
  19964. isEarlyData = ssl->earlyData != no_early_data;
  19965. #endif
  19966. if (isEarlyData) {
  19967. #ifdef WOLFSSL_EARLY_DATA
  19968. ret = Dtls13SetEpochKeys(ssl,
  19969. w64From32(0x0, DTLS13_EPOCH_EARLYDATA), ENCRYPT_SIDE_ONLY);
  19970. if (ret != 0) {
  19971. WOLFSSL_MSG(
  19972. "trying to send early data without epoch 1");
  19973. ssl->error = BUILD_MSG_ERROR;
  19974. return WOLFSSL_FATAL_ERROR;
  19975. }
  19976. #endif /* WOLFSSL_EARLY_DATA */
  19977. }
  19978. else if (!w64Equal(
  19979. ssl->dtls13EncryptEpoch->epochNumber,
  19980. ssl->dtls13Epoch)) {
  19981. ret = Dtls13SetEpochKeys(
  19982. ssl, ssl->dtls13Epoch, ENCRYPT_SIDE_ONLY);
  19983. if (ret != 0) {
  19984. ssl->error = BUILD_MSG_ERROR;
  19985. return WOLFSSL_FATAL_ERROR;
  19986. }
  19987. }
  19988. }
  19989. #endif /* WOLFSSL_DTLS13 */
  19990. #ifdef WOLFSSL_DTLS
  19991. if (ssl->options.dtls) {
  19992. buffSz = wolfSSL_GetMaxFragSize(ssl, sz - sent);
  19993. }
  19994. else
  19995. #endif
  19996. {
  19997. buffSz = wolfSSL_GetMaxFragSize(ssl, sz - sent);
  19998. }
  19999. if (sent == sz) break;
  20000. #if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_DTLS_SIZE_CHECK)
  20001. if (ssl->options.dtls && (buffSz < sz - sent)) {
  20002. ssl->error = DTLS_SIZE_ERROR;
  20003. WOLFSSL_ERROR(ssl->error);
  20004. return ssl->error;
  20005. }
  20006. #endif
  20007. outputSz = buffSz + COMP_EXTRA + DTLS_RECORD_HEADER_SZ;
  20008. if (IsEncryptionOn(ssl, 1) || ssl->options.tls1_3)
  20009. outputSz += cipherExtraData(ssl);
  20010. /* check for available size */
  20011. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  20012. return ssl->error = ret;
  20013. /* get output buffer */
  20014. out = ssl->buffers.outputBuffer.buffer +
  20015. ssl->buffers.outputBuffer.length;
  20016. #ifdef HAVE_LIBZ
  20017. if (ssl->options.usingCompression) {
  20018. buffSz = myCompress(ssl, sendBuffer, buffSz, comp, sizeof(comp));
  20019. if (buffSz < 0) {
  20020. return buffSz;
  20021. }
  20022. sendBuffer = comp;
  20023. }
  20024. #endif
  20025. if (!ssl->options.tls1_3) {
  20026. #ifdef WOLFSSL_ASYNC_CRYPT
  20027. if (ssl->async == NULL) {
  20028. ssl->async = (struct WOLFSSL_ASYNC*)
  20029. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  20030. DYNAMIC_TYPE_ASYNC);
  20031. if (ssl->async == NULL)
  20032. return MEMORY_E;
  20033. ssl->async->freeArgs = NULL;
  20034. }
  20035. #endif
  20036. sendSz = BuildMessage(ssl, out, outputSz, sendBuffer, buffSz,
  20037. application_data, 0, 0, 1, CUR_ORDER);
  20038. }
  20039. else {
  20040. #ifdef WOLFSSL_TLS13
  20041. sendSz = BuildTls13Message(ssl, out, outputSz, sendBuffer, buffSz,
  20042. application_data, 0, 0, 1);
  20043. #else
  20044. sendSz = BUFFER_ERROR;
  20045. #endif
  20046. }
  20047. if (sendSz < 0) {
  20048. #ifdef WOLFSSL_ASYNC_CRYPT
  20049. if (sendSz == WC_PENDING_E)
  20050. ssl->error = sendSz;
  20051. #endif
  20052. return BUILD_MSG_ERROR;
  20053. }
  20054. #ifdef WOLFSSL_ASYNC_CRYPT
  20055. FreeAsyncCtx(ssl, 0);
  20056. #endif
  20057. ssl->buffers.outputBuffer.length += sendSz;
  20058. if ( (ssl->error = SendBuffered(ssl)) < 0) {
  20059. WOLFSSL_ERROR(ssl->error);
  20060. /* store for next call if WANT_WRITE or user embedSend() that
  20061. doesn't present like WANT_WRITE */
  20062. ssl->buffers.plainSz = buffSz;
  20063. ssl->buffers.prevSent = sent;
  20064. if (ssl->error == SOCKET_ERROR_E && (ssl->options.connReset ||
  20065. ssl->options.isClosed)) {
  20066. ssl->error = SOCKET_PEER_CLOSED_E;
  20067. WOLFSSL_ERROR(ssl->error);
  20068. return 0; /* peer reset or closed */
  20069. }
  20070. return ssl->error;
  20071. }
  20072. sent += buffSz;
  20073. /* only one message per attempt */
  20074. if (ssl->options.partialWrite == 1) {
  20075. WOLFSSL_MSG("Partial Write on, only sending one record");
  20076. break;
  20077. }
  20078. }
  20079. return sent;
  20080. }
  20081. /* process input data */
  20082. int ReceiveData(WOLFSSL* ssl, byte* output, int sz, int peek)
  20083. {
  20084. int size;
  20085. WOLFSSL_ENTER("ReceiveData");
  20086. /* reset error state */
  20087. if (ssl->error == WANT_READ || ssl->error == WOLFSSL_ERROR_WANT_READ) {
  20088. ssl->error = 0;
  20089. }
  20090. #ifdef WOLFSSL_DTLS
  20091. if (ssl->options.dtls) {
  20092. /* In DTLS mode, we forgive some errors and allow the session
  20093. * to continue despite them. */
  20094. if (ssl->error == VERIFY_MAC_ERROR ||
  20095. ssl->error == DECRYPT_ERROR ||
  20096. ssl->error == DTLS_SIZE_ERROR) {
  20097. ssl->error = 0;
  20098. }
  20099. }
  20100. #endif /* WOLFSSL_DTLS */
  20101. if (ssl->error != 0 && ssl->error != WANT_WRITE
  20102. #ifdef WOLFSSL_ASYNC_CRYPT
  20103. && ssl->error != WC_PENDING_E
  20104. #endif
  20105. #ifdef HAVE_SECURE_RENEGOTIATION
  20106. && ssl->error != APP_DATA_READY
  20107. #endif
  20108. ) {
  20109. WOLFSSL_MSG("User calling wolfSSL_read in error state, not allowed");
  20110. return ssl->error;
  20111. }
  20112. #ifdef WOLFSSL_EARLY_DATA
  20113. if (ssl->earlyData != no_early_data) {
  20114. }
  20115. else
  20116. #endif
  20117. {
  20118. int negotiate = 0;
  20119. #ifdef HAVE_SECURE_RENEGOTIATION
  20120. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  20121. if (ssl->options.handShakeState != HANDSHAKE_DONE
  20122. && ssl->buffers.clearOutputBuffer.length == 0)
  20123. negotiate = 1;
  20124. }
  20125. else
  20126. #endif
  20127. if (ssl->options.handShakeState != HANDSHAKE_DONE)
  20128. negotiate = 1;
  20129. if (negotiate) {
  20130. int err;
  20131. WOLFSSL_MSG("Handshake not complete, trying to finish");
  20132. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  20133. #ifdef WOLFSSL_ASYNC_CRYPT
  20134. /* if async would block return WANT_WRITE */
  20135. if (ssl->error == WC_PENDING_E) {
  20136. return WOLFSSL_CBIO_ERR_WANT_READ;
  20137. }
  20138. #endif
  20139. return err;
  20140. }
  20141. }
  20142. }
  20143. #ifdef HAVE_SECURE_RENEGOTIATION
  20144. startScr:
  20145. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  20146. int ret;
  20147. WOLFSSL_MSG("Need to start scr, server requested");
  20148. ret = wolfSSL_Rehandshake(ssl);
  20149. ssl->secure_renegotiation->startScr = 0; /* only start once */
  20150. if (ret != WOLFSSL_SUCCESS)
  20151. return ret;
  20152. }
  20153. #endif
  20154. while (ssl->buffers.clearOutputBuffer.length == 0) {
  20155. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  20156. if (ssl->error == ZERO_RETURN) {
  20157. WOLFSSL_MSG("Zero return, no more data coming");
  20158. return 0; /* no more data coming */
  20159. }
  20160. if (ssl->error == SOCKET_ERROR_E) {
  20161. if (ssl->options.connReset || ssl->options.isClosed) {
  20162. WOLFSSL_MSG("Peer reset or closed, connection done");
  20163. ssl->error = SOCKET_PEER_CLOSED_E;
  20164. WOLFSSL_ERROR(ssl->error);
  20165. return 0; /* peer reset or closed */
  20166. }
  20167. }
  20168. WOLFSSL_ERROR(ssl->error);
  20169. return ssl->error;
  20170. }
  20171. #ifdef WOLFSSL_DTLS13
  20172. if (ssl->options.dtls) {
  20173. /* Dtls13DoScheduledWork(ssl) may return WANT_WRITE */
  20174. if ((ssl->error = Dtls13DoScheduledWork(ssl)) < 0) {
  20175. WOLFSSL_ERROR(ssl->error);
  20176. return ssl->error;
  20177. }
  20178. }
  20179. #endif /* WOLFSSL_DTLS13 */
  20180. #ifdef HAVE_SECURE_RENEGOTIATION
  20181. if (ssl->secure_renegotiation &&
  20182. ssl->secure_renegotiation->startScr) {
  20183. goto startScr;
  20184. }
  20185. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled &&
  20186. ssl->options.handShakeState != HANDSHAKE_DONE
  20187. && ssl->buffers.clearOutputBuffer.length == 0) {
  20188. /* ProcessReply processed a handshake packet and not any APP DATA
  20189. * so let's move the handshake along */
  20190. int err;
  20191. WOLFSSL_MSG("Handshake not complete, trying to finish");
  20192. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  20193. #ifdef WOLFSSL_ASYNC_CRYPT
  20194. /* if async would block return WANT_WRITE */
  20195. if (ssl->error == WC_PENDING_E) {
  20196. return WOLFSSL_CBIO_ERR_WANT_READ;
  20197. }
  20198. #endif
  20199. return err;
  20200. }
  20201. }
  20202. #endif
  20203. #ifdef WOLFSSL_DTLS13
  20204. /* if wolfSSL_Peek() is invoked with sz == 0 it will not block (but
  20205. * it processes pending non-application records) */
  20206. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version) && peek &&
  20207. sz == 0 && ssl->buffers.inputBuffer.idx
  20208. - ssl->buffers.inputBuffer.length == 0) {
  20209. return 0;
  20210. }
  20211. #endif /* WOLFSSL_DTLS13 */
  20212. #ifndef WOLFSSL_TLS13_NO_PEEK_HANDSHAKE_DONE
  20213. #ifdef WOLFSSL_TLS13
  20214. if (IsAtLeastTLSv1_3(ssl->version) && ssl->options.handShakeDone &&
  20215. ssl->curRL.type == handshake && peek) {
  20216. WOLFSSL_MSG("Got Handshake Message in APP data");
  20217. if (ssl->buffers.inputBuffer.length == 0) {
  20218. ssl->error = WOLFSSL_ERROR_WANT_READ;
  20219. return 0;
  20220. }
  20221. }
  20222. #endif
  20223. #endif
  20224. }
  20225. size = min(sz, (int)ssl->buffers.clearOutputBuffer.length);
  20226. XMEMCPY(output, ssl->buffers.clearOutputBuffer.buffer, size);
  20227. if (peek == 0) {
  20228. ssl->buffers.clearOutputBuffer.length -= size;
  20229. ssl->buffers.clearOutputBuffer.buffer += size;
  20230. }
  20231. if (ssl->buffers.inputBuffer.dynamicFlag)
  20232. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  20233. WOLFSSL_LEAVE("ReceiveData()", size);
  20234. return size;
  20235. }
  20236. static int SendAlert_ex(WOLFSSL* ssl, int severity, int type)
  20237. {
  20238. byte input[ALERT_SIZE];
  20239. byte *output;
  20240. int sendSz;
  20241. int ret;
  20242. int outputSz;
  20243. int dtlsExtra = 0;
  20244. WOLFSSL_ENTER("SendAlert");
  20245. WOLFSSL_MSG_EX("SendAlert: %d %s", type, AlertTypeToString(type));
  20246. #ifdef WOLFSSL_QUIC
  20247. if (WOLFSSL_IS_QUIC(ssl)) {
  20248. ret = !ssl->quic.method->send_alert(ssl, ssl->quic.enc_level_write, (uint8_t)type);
  20249. if (ret) {
  20250. WOLFSSL_MSG("QUIC send_alert callback error");
  20251. }
  20252. return ret;
  20253. }
  20254. #endif
  20255. #ifdef HAVE_WRITE_DUP
  20256. if (ssl->dupWrite && ssl->dupSide == READ_DUP_SIDE) {
  20257. int notifyErr = 0;
  20258. WOLFSSL_MSG("Read dup side cannot write alerts, notifying sibling");
  20259. if (type == close_notify) {
  20260. notifyErr = ZERO_RETURN;
  20261. } else if (severity == alert_fatal) {
  20262. notifyErr = FATAL_ERROR;
  20263. }
  20264. if (notifyErr != 0) {
  20265. return NotifyWriteSide(ssl, notifyErr);
  20266. }
  20267. return 0;
  20268. }
  20269. #endif
  20270. ssl->pendingAlert.code = type;
  20271. ssl->pendingAlert.level = severity;
  20272. #ifdef OPENSSL_EXTRA
  20273. if (ssl->CBIS != NULL) {
  20274. ssl->CBIS(ssl, SSL_CB_ALERT, type);
  20275. }
  20276. #endif
  20277. #ifdef WOLFSSL_DTLS
  20278. if (ssl->options.dtls)
  20279. dtlsExtra = DTLS_RECORD_EXTRA;
  20280. #endif
  20281. /* check for available size */
  20282. outputSz = ALERT_SIZE + MAX_MSG_EXTRA + dtlsExtra;
  20283. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0) {
  20284. #ifdef WOLFSSL_DTLS
  20285. /* If CheckAvailableSize returned WANT_WRITE due to a blocking write
  20286. * then discard pending output and just send the alert. */
  20287. if (ssl->options.dtls) {
  20288. if (ret != WANT_WRITE || severity != alert_fatal)
  20289. return ret;
  20290. ShrinkOutputBuffer(ssl);
  20291. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0) {
  20292. return ret;
  20293. }
  20294. }
  20295. else {
  20296. return ret;
  20297. }
  20298. #else
  20299. return ret;
  20300. #endif
  20301. }
  20302. /* Check output buffer */
  20303. if (ssl->buffers.outputBuffer.buffer == NULL)
  20304. return BUFFER_E;
  20305. /* get output buffer */
  20306. output = ssl->buffers.outputBuffer.buffer +
  20307. ssl->buffers.outputBuffer.length;
  20308. input[0] = (byte)severity;
  20309. input[1] = (byte)type;
  20310. ssl->alert_history.last_tx.code = type;
  20311. ssl->alert_history.last_tx.level = severity;
  20312. if (severity == alert_fatal) {
  20313. #ifdef WOLFSSL_DTLS
  20314. /* Mark as closed in dtls only once we enter stateful mode. */
  20315. if (!ssl->options.dtls || ssl->options.dtlsStateful)
  20316. #endif
  20317. ssl->options.isClosed = 1; /* Don't send close_notify */
  20318. }
  20319. /* send encrypted alert if encryption is on - can be a rehandshake over
  20320. * an existing encrypted channel.
  20321. * TLS 1.3 encrypts handshake packets after the ServerHello
  20322. */
  20323. if (IsEncryptionOn(ssl, 1)) {
  20324. #ifdef WOLFSSL_DTLS13
  20325. if (ssl->options.dtls
  20326. && IsAtLeastTLSv1_3(ssl->version)
  20327. && !w64Equal(ssl->dtls13EncryptEpoch->epochNumber, ssl->dtls13Epoch)) {
  20328. ret = Dtls13SetEpochKeys(ssl, ssl->dtls13Epoch, ENCRYPT_SIDE_ONLY);
  20329. if (ret != 0)
  20330. return ret;
  20331. }
  20332. #endif /* WOLFSSL_DTLS13 */
  20333. sendSz = BuildMessage(ssl, output, outputSz, input, ALERT_SIZE, alert,
  20334. 0, 0, 0, CUR_ORDER);
  20335. }
  20336. else {
  20337. #ifdef WOLFSSL_DTLS13
  20338. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  20339. ret = Dtls13RlAddPlaintextHeader(ssl, output, alert, ALERT_SIZE);
  20340. if (ret != 0)
  20341. return ret;
  20342. }
  20343. else
  20344. #endif /* WOLFSSL_DTLS13 */
  20345. {
  20346. AddRecordHeader(output, ALERT_SIZE, alert, ssl, CUR_ORDER);
  20347. }
  20348. output += RECORD_HEADER_SZ;
  20349. #ifdef WOLFSSL_DTLS
  20350. if (ssl->options.dtls)
  20351. output += DTLS_RECORD_EXTRA;
  20352. #endif
  20353. XMEMCPY(output, input, ALERT_SIZE);
  20354. sendSz = RECORD_HEADER_SZ + ALERT_SIZE;
  20355. #ifdef WOLFSSL_DTLS
  20356. if (ssl->options.dtls)
  20357. sendSz += DTLS_RECORD_EXTRA;
  20358. #endif
  20359. }
  20360. if (sendSz < 0)
  20361. return BUILD_MSG_ERROR;
  20362. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  20363. if (ssl->hsInfoOn)
  20364. AddPacketName(ssl, "Alert");
  20365. if (ssl->toInfoOn) {
  20366. ret = AddPacketInfo(ssl, "Alert", alert, output, sendSz,
  20367. WRITE_PROTO, 0, ssl->heap);
  20368. if (ret != 0)
  20369. return ret;
  20370. }
  20371. #endif
  20372. ssl->buffers.outputBuffer.length += sendSz;
  20373. ret = SendBuffered(ssl);
  20374. ssl->pendingAlert.code = 0;
  20375. ssl->pendingAlert.level = alert_none;
  20376. WOLFSSL_LEAVE("SendAlert", ret);
  20377. return ret;
  20378. }
  20379. int RetrySendAlert(WOLFSSL* ssl)
  20380. {
  20381. int type = ssl->pendingAlert.code;
  20382. int severity = ssl->pendingAlert.level;
  20383. if (severity == alert_none)
  20384. return 0;
  20385. ssl->pendingAlert.code = 0;
  20386. ssl->pendingAlert.level = alert_none;
  20387. return SendAlert_ex(ssl, severity, type);
  20388. }
  20389. /* send alert message */
  20390. int SendAlert(WOLFSSL* ssl, int severity, int type)
  20391. {
  20392. if (ssl->pendingAlert.level != alert_none) {
  20393. int ret = RetrySendAlert(ssl);
  20394. if (ret != 0) {
  20395. if (ssl->pendingAlert.level == alert_none ||
  20396. (ssl->pendingAlert.level != alert_fatal &&
  20397. severity == alert_fatal)) {
  20398. /* Store current alert if pendingAlert is empty or if current
  20399. * is fatal and previous was not */
  20400. ssl->pendingAlert.code = type;
  20401. ssl->pendingAlert.level = severity;
  20402. }
  20403. return ret;
  20404. }
  20405. }
  20406. return SendAlert_ex(ssl, severity, type);
  20407. }
  20408. const char* wolfSSL_ERR_reason_error_string(unsigned long e)
  20409. {
  20410. #ifdef NO_ERROR_STRINGS
  20411. (void)e;
  20412. return "no support for error strings built in";
  20413. #else
  20414. int error = (int)e;
  20415. #ifdef OPENSSL_EXTRA
  20416. /* OpenSSL uses positive error codes */
  20417. if (error > 0) {
  20418. error = -error;
  20419. }
  20420. #endif
  20421. /* pass to wolfCrypt */
  20422. if (error < MAX_CODE_E && error > MIN_CODE_E) {
  20423. return wc_GetErrorString(error);
  20424. }
  20425. switch (error) {
  20426. #ifdef OPENSSL_EXTRA
  20427. case 0 :
  20428. return "ok";
  20429. #endif
  20430. case UNSUPPORTED_SUITE :
  20431. return "unsupported cipher suite";
  20432. case INPUT_CASE_ERROR :
  20433. return "input state error";
  20434. case PREFIX_ERROR :
  20435. return "bad index to key rounds";
  20436. case MEMORY_ERROR :
  20437. return "out of memory";
  20438. case VERIFY_FINISHED_ERROR :
  20439. return "verify problem on finished";
  20440. case VERIFY_MAC_ERROR :
  20441. return "verify mac problem";
  20442. case PARSE_ERROR :
  20443. return "parse error on header";
  20444. case SIDE_ERROR :
  20445. return "wrong client/server type";
  20446. case NO_PEER_CERT : /* OpenSSL compatibility expects this exact text */
  20447. return "peer did not return a certificate";
  20448. case UNKNOWN_HANDSHAKE_TYPE :
  20449. return "weird handshake type";
  20450. case SOCKET_ERROR_E :
  20451. return "error state on socket";
  20452. case SOCKET_NODATA :
  20453. return "expected data, not there";
  20454. case INCOMPLETE_DATA :
  20455. return "don't have enough data to complete task";
  20456. case UNKNOWN_RECORD_TYPE :
  20457. return "unknown type in record hdr";
  20458. case DECRYPT_ERROR :
  20459. return "error during decryption";
  20460. case FATAL_ERROR :
  20461. return "received alert fatal error";
  20462. case ENCRYPT_ERROR :
  20463. return "error during encryption";
  20464. case FREAD_ERROR :
  20465. return "fread problem";
  20466. case NO_PEER_KEY :
  20467. return "need peer's key";
  20468. case NO_PRIVATE_KEY :
  20469. return "need the private key";
  20470. case NO_DH_PARAMS :
  20471. return "server missing DH params";
  20472. case RSA_PRIVATE_ERROR :
  20473. return "error during rsa priv op";
  20474. case MATCH_SUITE_ERROR :
  20475. return "can't match cipher suite";
  20476. case COMPRESSION_ERROR :
  20477. return "compression mismatch error";
  20478. case BUILD_MSG_ERROR :
  20479. return "build message failure";
  20480. case BAD_HELLO :
  20481. return "client hello malformed";
  20482. case DOMAIN_NAME_MISMATCH :
  20483. return "peer subject name mismatch";
  20484. case IPADDR_MISMATCH :
  20485. return "peer ip address mismatch";
  20486. case WANT_READ :
  20487. case WOLFSSL_ERROR_WANT_READ :
  20488. return "non-blocking socket wants data to be read";
  20489. case NOT_READY_ERROR :
  20490. return "handshake layer not ready yet, complete first";
  20491. case VERSION_ERROR :
  20492. return "record layer version error";
  20493. case WANT_WRITE :
  20494. case WOLFSSL_ERROR_WANT_WRITE :
  20495. return "non-blocking socket write buffer full";
  20496. case BUFFER_ERROR :
  20497. return "malformed buffer input error";
  20498. case VERIFY_CERT_ERROR :
  20499. return "verify problem on certificate";
  20500. case VERIFY_SIGN_ERROR :
  20501. return "verify problem based on signature";
  20502. case CLIENT_ID_ERROR :
  20503. return "psk client identity error";
  20504. case SERVER_HINT_ERROR:
  20505. return "psk server hint error";
  20506. case PSK_KEY_ERROR:
  20507. return "psk key callback error";
  20508. case GETTIME_ERROR:
  20509. return "gettimeofday() error";
  20510. case GETITIMER_ERROR:
  20511. return "getitimer() error";
  20512. case SIGACT_ERROR:
  20513. return "sigaction() error";
  20514. case SETITIMER_ERROR:
  20515. return "setitimer() error";
  20516. case LENGTH_ERROR:
  20517. return "record layer length error";
  20518. case PEER_KEY_ERROR:
  20519. return "can't decode peer key";
  20520. case ZERO_RETURN:
  20521. case WOLFSSL_ERROR_ZERO_RETURN:
  20522. return "peer sent close notify alert";
  20523. case ECC_CURVETYPE_ERROR:
  20524. return "Bad ECC Curve Type or unsupported";
  20525. case ECC_CURVE_ERROR:
  20526. return "Bad ECC Curve or unsupported";
  20527. case ECC_PEERKEY_ERROR:
  20528. return "Bad ECC Peer Key";
  20529. case ECC_MAKEKEY_ERROR:
  20530. return "ECC Make Key failure";
  20531. case ECC_EXPORT_ERROR:
  20532. return "ECC Export Key failure";
  20533. case ECC_SHARED_ERROR:
  20534. return "ECC DHE shared failure";
  20535. case NOT_CA_ERROR:
  20536. return "Not a CA by basic constraint error";
  20537. case BAD_CERT_MANAGER_ERROR:
  20538. return "Bad Cert Manager error";
  20539. case OCSP_CERT_REVOKED:
  20540. return "OCSP Cert revoked";
  20541. case CRL_CERT_REVOKED:
  20542. #ifdef OPENSSL_EXTRA
  20543. return "certificate revoked";
  20544. #else
  20545. return "CRL Cert revoked";
  20546. #endif
  20547. case CRL_MISSING:
  20548. return "CRL missing, not loaded";
  20549. case MONITOR_SETUP_E:
  20550. return "CRL monitor setup error";
  20551. case THREAD_CREATE_E:
  20552. return "Thread creation problem";
  20553. case OCSP_NEED_URL:
  20554. return "OCSP need URL";
  20555. case OCSP_CERT_UNKNOWN:
  20556. return "OCSP Cert unknown";
  20557. case OCSP_LOOKUP_FAIL:
  20558. return "OCSP Responder lookup fail";
  20559. case MAX_CHAIN_ERROR:
  20560. return "Maximum Chain Depth Exceeded";
  20561. case COOKIE_ERROR:
  20562. return "DTLS Cookie Error";
  20563. case SEQUENCE_ERROR:
  20564. return "DTLS Sequence Error";
  20565. case SUITES_ERROR:
  20566. return "Suites Pointer Error";
  20567. case OUT_OF_ORDER_E:
  20568. return "Out of order message, fatal";
  20569. case BAD_KEA_TYPE_E:
  20570. return "Bad KEA type found";
  20571. case SANITY_CIPHER_E:
  20572. return "Sanity check on ciphertext failed";
  20573. case RECV_OVERFLOW_E:
  20574. return "Receive callback returned more than requested";
  20575. case GEN_COOKIE_E:
  20576. return "Generate Cookie Error";
  20577. case NO_PEER_VERIFY:
  20578. return "Need peer certificate verify Error";
  20579. case FWRITE_ERROR:
  20580. return "fwrite Error";
  20581. case CACHE_MATCH_ERROR:
  20582. return "Cache restore header match Error";
  20583. case UNKNOWN_SNI_HOST_NAME_E:
  20584. return "Unrecognized host name Error";
  20585. case UNKNOWN_MAX_FRAG_LEN_E:
  20586. return "Unrecognized max frag len Error";
  20587. case KEYUSE_SIGNATURE_E:
  20588. return "Key Use digitalSignature not set Error";
  20589. case KEYUSE_ENCIPHER_E:
  20590. return "Key Use keyEncipherment not set Error";
  20591. case EXTKEYUSE_AUTH_E:
  20592. return "Ext Key Use server/client auth not set Error";
  20593. case SEND_OOB_READ_E:
  20594. return "Send Callback Out of Bounds Read Error";
  20595. case SECURE_RENEGOTIATION_E:
  20596. return "Invalid Renegotiation Error";
  20597. case SESSION_TICKET_LEN_E:
  20598. return "Session Ticket Too Long Error";
  20599. case SESSION_TICKET_EXPECT_E:
  20600. return "Session Ticket Error";
  20601. case SESSION_SECRET_CB_E:
  20602. return "Session Secret Callback Error";
  20603. case NO_CHANGE_CIPHER_E:
  20604. return "Finished received from peer before Change Cipher Error";
  20605. case SANITY_MSG_E:
  20606. return "Sanity Check on message order Error";
  20607. case DUPLICATE_MSG_E:
  20608. return "Duplicate HandShake message Error";
  20609. case SNI_UNSUPPORTED:
  20610. return "Protocol version does not support SNI Error";
  20611. case SOCKET_PEER_CLOSED_E:
  20612. return "Peer closed underlying transport Error";
  20613. case BAD_TICKET_KEY_CB_SZ:
  20614. return "Bad user session ticket key callback Size Error";
  20615. case BAD_TICKET_MSG_SZ:
  20616. return "Bad session ticket message Size Error";
  20617. case BAD_TICKET_ENCRYPT:
  20618. return "Bad user ticket callback encrypt Error";
  20619. case DH_KEY_SIZE_E:
  20620. return "DH key too small Error";
  20621. case SNI_ABSENT_ERROR:
  20622. return "No Server Name Indication extension Error";
  20623. case RSA_SIGN_FAULT:
  20624. return "RSA Signature Fault Error";
  20625. case HANDSHAKE_SIZE_ERROR:
  20626. return "Handshake message too large Error";
  20627. case UNKNOWN_ALPN_PROTOCOL_NAME_E:
  20628. return "Unrecognized protocol name Error";
  20629. case BAD_CERTIFICATE_STATUS_ERROR:
  20630. return "Bad Certificate Status Message Error";
  20631. case OCSP_INVALID_STATUS:
  20632. return "Invalid OCSP Status Error";
  20633. case OCSP_WANT_READ:
  20634. return "OCSP nonblock wants read";
  20635. case RSA_KEY_SIZE_E:
  20636. return "RSA key too small";
  20637. case ECC_KEY_SIZE_E:
  20638. return "ECC key too small";
  20639. case DTLS_EXPORT_VER_E:
  20640. return "Version needs updated after code change or version mismatch";
  20641. case INPUT_SIZE_E:
  20642. return "Input size too large Error";
  20643. case CTX_INIT_MUTEX_E:
  20644. return "Initialize ctx mutex error";
  20645. case EXT_MASTER_SECRET_NEEDED_E:
  20646. return "Extended Master Secret must be enabled to resume EMS session";
  20647. case DTLS_POOL_SZ_E:
  20648. return "Maximum DTLS pool size exceeded";
  20649. case DECODE_E:
  20650. return "Decode handshake message error";
  20651. case WRITE_DUP_READ_E:
  20652. return "Write dup write side can't read error";
  20653. case WRITE_DUP_WRITE_E:
  20654. return "Write dup read side can't write error";
  20655. case INVALID_CERT_CTX_E:
  20656. return "Certificate context does not match request or not empty";
  20657. case BAD_KEY_SHARE_DATA:
  20658. return "The Key Share data contains group that wasn't in Client Hello";
  20659. case MISSING_HANDSHAKE_DATA:
  20660. return "The handshake message is missing required data";
  20661. case BAD_BINDER: /* OpenSSL compatibility expects this exact text */
  20662. return "binder does not verify";
  20663. case EXT_NOT_ALLOWED:
  20664. return "Extension type not allowed in handshake message type";
  20665. case INVALID_PARAMETER:
  20666. return "The security parameter is invalid";
  20667. case UNSUPPORTED_EXTENSION:
  20668. return "TLS Extension not requested by the client";
  20669. case PRF_MISSING:
  20670. return "Pseudo-random function is not enabled";
  20671. case KEY_SHARE_ERROR:
  20672. return "Key share extension did not contain a valid named group";
  20673. case POST_HAND_AUTH_ERROR:
  20674. return "Client will not do post handshake authentication";
  20675. case HRR_COOKIE_ERROR:
  20676. return "Cookie does not match one sent in HelloRetryRequest";
  20677. case MCAST_HIGHWATER_CB_E:
  20678. return "Multicast highwater callback returned error";
  20679. case ALERT_COUNT_E:
  20680. return "Alert Count exceeded error";
  20681. case EXT_MISSING:
  20682. return "Required TLS extension missing";
  20683. case DTLS_RETX_OVER_TX:
  20684. return "DTLS interrupting flight transmit with retransmit";
  20685. case DH_PARAMS_NOT_FFDHE_E:
  20686. return "Server DH parameters were not from the FFDHE set as required";
  20687. case TCA_INVALID_ID_TYPE:
  20688. return "TLS Extension Trusted CA ID type invalid";
  20689. case TCA_ABSENT_ERROR:
  20690. return "TLS Extension Trusted CA ID response absent";
  20691. case TSIP_MAC_DIGSZ_E:
  20692. return "TSIP MAC size invalid, must be sized for SHA-1 or SHA-256";
  20693. case CLIENT_CERT_CB_ERROR:
  20694. return "Error importing client cert or key from callback";
  20695. case SSL_SHUTDOWN_ALREADY_DONE_E:
  20696. return "Shutdown has already occurred";
  20697. case TLS13_SECRET_CB_E:
  20698. return "TLS1.3 Secret Callback Error";
  20699. case DTLS_SIZE_ERROR:
  20700. return "DTLS trying to send too much in single datagram error";
  20701. case NO_CERT_ERROR:
  20702. return "TLS1.3 No Certificate Set Error";
  20703. case APP_DATA_READY:
  20704. return "Application data is available for reading";
  20705. case TOO_MUCH_EARLY_DATA:
  20706. return "Too much early data";
  20707. case SOCKET_FILTERED_E:
  20708. return "Session stopped by network filter";
  20709. #ifdef HAVE_HTTP_CLIENT
  20710. case HTTP_TIMEOUT:
  20711. return "HTTP timeout for OCSP or CRL req";
  20712. case HTTP_RECV_ERR:
  20713. return "HTTP Receive error";
  20714. case HTTP_HEADER_ERR:
  20715. return "HTTP Header error";
  20716. case HTTP_PROTO_ERR:
  20717. return "HTTP Protocol error";
  20718. case HTTP_STATUS_ERR:
  20719. return "HTTP Status error";
  20720. case HTTP_VERSION_ERR:
  20721. return "HTTP Version error";
  20722. case HTTP_APPSTR_ERR:
  20723. return "HTTP Application string error";
  20724. #endif
  20725. #ifdef OPENSSL_EXTRA
  20726. case -WOLFSSL_X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
  20727. return "unable to get local issuer certificate";
  20728. #endif
  20729. case UNSUPPORTED_PROTO_VERSION:
  20730. #ifdef OPENSSL_EXTRA
  20731. return "WRONG_SSL_VERSION";
  20732. #else
  20733. return "bad/unsupported protocol version";
  20734. #endif
  20735. case FALCON_KEY_SIZE_E:
  20736. return "Wrong key size for Falcon.";
  20737. case DILITHIUM_KEY_SIZE_E:
  20738. return "Wrong key size for Dilithium.";
  20739. #ifdef WOLFSSL_QUIC
  20740. case QUIC_TP_MISSING_E:
  20741. return "QUIC transport parameter not set";
  20742. case QUIC_WRONG_ENC_LEVEL:
  20743. return "QUIC data received at wrong encryption level";
  20744. #endif
  20745. case DTLS_CID_ERROR:
  20746. return "DTLS ConnectionID mismatch or missing";
  20747. case DTLS_TOO_MANY_FRAGMENTS_E:
  20748. return "Received too many fragmented messages from peer error";
  20749. case DUPLICATE_TLS_EXT_E:
  20750. return "Duplicate TLS extension in message.";
  20751. default :
  20752. return "unknown error number";
  20753. }
  20754. #endif /* NO_ERROR_STRINGS */
  20755. }
  20756. const char* wolfSSL_ERR_func_error_string(unsigned long e)
  20757. {
  20758. (void)e;
  20759. WOLFSSL_MSG("wolfSSL_ERR_func_error_string does not return the name of "
  20760. "the function that failed. Please inspect the wolfSSL debug "
  20761. "logs to determine where the error occurred.");
  20762. return "";
  20763. }
  20764. /* return library name
  20765. * @param e error code
  20766. * @return text library name,
  20767. * if there is no suitable library found, returns empty string
  20768. */
  20769. const char* wolfSSL_ERR_lib_error_string(unsigned long e)
  20770. {
  20771. int libe = 0;
  20772. (void)libe;
  20773. (void)e;
  20774. #if defined(OPENSSL_EXTRA)
  20775. libe = wolfSSL_ERR_GET_LIB(e);
  20776. switch (libe) {
  20777. case ERR_LIB_PEM:
  20778. return "wolfSSL PEM routines";
  20779. case ERR_LIB_EVP:
  20780. return "wolfSSL digital envelope routines";
  20781. default:
  20782. return "";
  20783. }
  20784. #else
  20785. return "";
  20786. #endif
  20787. }
  20788. void SetErrorString(int error, char* str)
  20789. {
  20790. XSTRNCPY(str, wolfSSL_ERR_reason_error_string(error), WOLFSSL_MAX_ERROR_SZ);
  20791. str[WOLFSSL_MAX_ERROR_SZ-1] = 0;
  20792. }
  20793. #ifdef NO_CIPHER_SUITE_ALIASES
  20794. #ifndef NO_ERROR_STRINGS
  20795. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  20796. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  20797. #define SUITE_ALIAS(x,z,w,v,u)
  20798. #else
  20799. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  20800. #define SUITE_ALIAS(x,z,w,v,u)
  20801. #endif
  20802. #else
  20803. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  20804. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  20805. #define SUITE_ALIAS(x,z,w,v,u)
  20806. #else
  20807. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  20808. #define SUITE_ALIAS(x,z,w,v,u)
  20809. #endif
  20810. #endif
  20811. #else /* !NO_CIPHER_SUITE_ALIASES */
  20812. /* note that the comma is included at the end of the SUITE_ALIAS() macro
  20813. * definitions, to allow aliases to be gated out by the above null macros
  20814. * in the NO_CIPHER_SUITE_ALIASES section.
  20815. */
  20816. #ifndef NO_ERROR_STRINGS
  20817. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
  20818. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
  20819. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  20820. #define SUITE_ALIAS(x,z,w,v,u) {(x),"",(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  20821. #else
  20822. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  20823. #define SUITE_ALIAS(x,z,w,v,u) {(x),"",(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  20824. #endif
  20825. #else
  20826. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
  20827. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
  20828. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  20829. #define SUITE_ALIAS(x,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  20830. #else
  20831. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  20832. #define SUITE_ALIAS(x,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  20833. #endif
  20834. #endif
  20835. #endif /* NO_CIPHER_SUITE_ALIASES */
  20836. static const CipherSuiteInfo cipher_names[] =
  20837. {
  20838. #ifdef BUILD_TLS_AES_128_GCM_SHA256
  20839. SUITE_INFO("TLS13-AES128-GCM-SHA256","TLS_AES_128_GCM_SHA256",TLS13_BYTE,TLS_AES_128_GCM_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  20840. #endif
  20841. #ifdef BUILD_TLS_AES_256_GCM_SHA384
  20842. SUITE_INFO("TLS13-AES256-GCM-SHA384","TLS_AES_256_GCM_SHA384",TLS13_BYTE,TLS_AES_256_GCM_SHA384, TLSv1_3_MINOR, SSLv3_MAJOR),
  20843. #endif
  20844. #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
  20845. SUITE_INFO("TLS13-CHACHA20-POLY1305-SHA256","TLS_CHACHA20_POLY1305_SHA256",TLS13_BYTE,TLS_CHACHA20_POLY1305_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  20846. #endif
  20847. #ifdef BUILD_TLS_AES_128_CCM_SHA256
  20848. SUITE_INFO("TLS13-AES128-CCM-SHA256","TLS_AES_128_CCM_SHA256",TLS13_BYTE,TLS_AES_128_CCM_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  20849. #endif
  20850. #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
  20851. SUITE_INFO("TLS13-AES128-CCM-8-SHA256","TLS_AES_128_CCM_8_SHA256",TLS13_BYTE,TLS_AES_128_CCM_8_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR),
  20852. SUITE_ALIAS("TLS13-AES128-CCM8-SHA256",TLS13_BYTE,TLS_AES_128_CCM_8_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR)
  20853. #endif
  20854. #ifdef BUILD_TLS_SHA256_SHA256
  20855. SUITE_INFO("TLS13-SHA256-SHA256","TLS_SHA256_SHA256",ECC_BYTE,TLS_SHA256_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR),
  20856. #endif
  20857. #ifdef BUILD_TLS_SHA384_SHA384
  20858. SUITE_INFO("TLS13-SHA384-SHA384","TLS_SHA384_SHA384",ECC_BYTE,TLS_SHA384_SHA384,TLSv1_3_MINOR, SSLv3_MAJOR),
  20859. #endif
  20860. #ifndef WOLFSSL_NO_TLS12
  20861. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  20862. SUITE_INFO("RC4-SHA","SSL_RSA_WITH_RC4_128_SHA",CIPHER_BYTE,SSL_RSA_WITH_RC4_128_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  20863. #endif
  20864. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  20865. SUITE_INFO("RC4-MD5","SSL_RSA_WITH_RC4_128_MD5",CIPHER_BYTE,SSL_RSA_WITH_RC4_128_MD5,SSLv3_MINOR,SSLv3_MAJOR),
  20866. #endif
  20867. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  20868. SUITE_INFO("DES-CBC3-SHA","SSL_RSA_WITH_3DES_EDE_CBC_SHA",CIPHER_BYTE,SSL_RSA_WITH_3DES_EDE_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  20869. #endif
  20870. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  20871. SUITE_INFO("AES128-SHA","TLS_RSA_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  20872. #endif
  20873. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  20874. SUITE_INFO("AES256-SHA","TLS_RSA_WITH_AES_256_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_AES_256_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  20875. #endif
  20876. #ifdef BUILD_TLS_RSA_WITH_NULL_MD5
  20877. SUITE_INFO("NULL-MD5","TLS_RSA_WITH_NULL_MD5",CIPHER_BYTE,TLS_RSA_WITH_NULL_MD5,SSLv3_MINOR,SSLv3_MAJOR),
  20878. #endif
  20879. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  20880. SUITE_INFO("NULL-SHA","TLS_RSA_WITH_NULL_SHA",CIPHER_BYTE,TLS_RSA_WITH_NULL_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  20881. #endif
  20882. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  20883. SUITE_INFO("NULL-SHA256","TLS_RSA_WITH_NULL_SHA256",CIPHER_BYTE,TLS_RSA_WITH_NULL_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  20884. #endif
  20885. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  20886. SUITE_INFO("DHE-RSA-AES128-SHA","TLS_DHE_RSA_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  20887. #endif
  20888. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  20889. SUITE_INFO("DHE-RSA-AES256-SHA","TLS_DHE_RSA_WITH_AES_256_CBC_SHA",CIPHER_BYTE,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  20890. #endif
  20891. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
  20892. SUITE_INFO("DHE-PSK-AES256-GCM-SHA384","TLS_DHE_PSK_WITH_AES_256_GCM_SHA384",CIPHER_BYTE,TLS_DHE_PSK_WITH_AES_256_GCM_SHA384,TLSv1_2_MINOR,SSLv3_MAJOR),
  20893. #endif
  20894. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
  20895. SUITE_INFO("DHE-PSK-AES128-GCM-SHA256","TLS_DHE_PSK_WITH_AES_128_GCM_SHA256",CIPHER_BYTE,TLS_DHE_PSK_WITH_AES_128_GCM_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  20896. #endif
  20897. #ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
  20898. SUITE_INFO("PSK-AES256-GCM-SHA384","TLS_PSK_WITH_AES_256_GCM_SHA384",CIPHER_BYTE,TLS_PSK_WITH_AES_256_GCM_SHA384,TLSv1_2_MINOR,SSLv3_MAJOR),
  20899. #endif
  20900. #ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
  20901. SUITE_INFO("PSK-AES128-GCM-SHA256","TLS_PSK_WITH_AES_128_GCM_SHA256",CIPHER_BYTE,TLS_PSK_WITH_AES_128_GCM_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  20902. #endif
  20903. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
  20904. SUITE_INFO("DHE-PSK-AES256-CBC-SHA384","TLS_DHE_PSK_WITH_AES_256_CBC_SHA384",CIPHER_BYTE,TLS_DHE_PSK_WITH_AES_256_CBC_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
  20905. #endif
  20906. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
  20907. SUITE_INFO("DHE-PSK-AES128-CBC-SHA256","TLS_DHE_PSK_WITH_AES_128_CBC_SHA256",CIPHER_BYTE,TLS_DHE_PSK_WITH_AES_128_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  20908. #endif
  20909. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
  20910. SUITE_INFO("PSK-AES256-CBC-SHA384","TLS_PSK_WITH_AES_256_CBC_SHA384",CIPHER_BYTE,TLS_PSK_WITH_AES_256_CBC_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
  20911. #endif
  20912. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  20913. SUITE_INFO("PSK-AES128-CBC-SHA256","TLS_PSK_WITH_AES_128_CBC_SHA256",CIPHER_BYTE,TLS_PSK_WITH_AES_128_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  20914. #endif
  20915. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  20916. SUITE_INFO("PSK-AES128-CBC-SHA","TLS_PSK_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_PSK_WITH_AES_128_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  20917. #endif
  20918. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  20919. SUITE_INFO("PSK-AES256-CBC-SHA","TLS_PSK_WITH_AES_256_CBC_SHA",CIPHER_BYTE,TLS_PSK_WITH_AES_256_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  20920. #endif
  20921. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
  20922. SUITE_INFO("DHE-PSK-AES128-CCM","TLS_DHE_PSK_WITH_AES_128_CCM",ECC_BYTE,TLS_DHE_PSK_WITH_AES_128_CCM,TLSv1_MINOR,SSLv3_MAJOR),
  20923. #endif
  20924. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
  20925. SUITE_INFO("DHE-PSK-AES256-CCM","TLS_DHE_PSK_WITH_AES_256_CCM",ECC_BYTE,TLS_DHE_PSK_WITH_AES_256_CCM,TLSv1_MINOR,SSLv3_MAJOR),
  20926. #endif
  20927. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
  20928. SUITE_INFO("PSK-AES128-CCM","TLS_PSK_WITH_AES_128_CCM",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM,TLSv1_MINOR,SSLv3_MAJOR),
  20929. #endif
  20930. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
  20931. SUITE_INFO("PSK-AES256-CCM","TLS_PSK_WITH_AES_256_CCM",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM,TLSv1_MINOR,SSLv3_MAJOR),
  20932. #endif
  20933. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
  20934. SUITE_INFO("PSK-AES128-CCM-8","TLS_PSK_WITH_AES_128_CCM_8",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM_8,TLSv1_MINOR,SSLv3_MAJOR),
  20935. SUITE_ALIAS("PSK-AES128-CCM8",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM_8,TLSv1_MINOR,SSLv3_MAJOR)
  20936. #endif
  20937. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
  20938. SUITE_INFO("PSK-AES256-CCM-8","TLS_PSK_WITH_AES_256_CCM_8",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM_8,TLSv1_MINOR,SSLv3_MAJOR),
  20939. SUITE_ALIAS("PSK-AES256-CCM8",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM_8,TLSv1_MINOR,SSLv3_MAJOR)
  20940. #endif
  20941. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
  20942. SUITE_INFO("DHE-PSK-NULL-SHA384","TLS_DHE_PSK_WITH_NULL_SHA384",CIPHER_BYTE,TLS_DHE_PSK_WITH_NULL_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
  20943. #endif
  20944. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
  20945. SUITE_INFO("DHE-PSK-NULL-SHA256","TLS_DHE_PSK_WITH_NULL_SHA256",CIPHER_BYTE,TLS_DHE_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  20946. #endif
  20947. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
  20948. SUITE_INFO("PSK-NULL-SHA384","TLS_PSK_WITH_NULL_SHA384",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
  20949. #endif
  20950. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  20951. SUITE_INFO("PSK-NULL-SHA256","TLS_PSK_WITH_NULL_SHA256",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  20952. #endif
  20953. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  20954. SUITE_INFO("PSK-NULL-SHA","TLS_PSK_WITH_NULL_SHA",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  20955. #endif
  20956. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
  20957. SUITE_INFO("AES128-CCM-8","TLS_RSA_WITH_AES_128_CCM_8",ECC_BYTE,TLS_RSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR),
  20958. SUITE_ALIAS("AES128-CCM8",ECC_BYTE,TLS_RSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  20959. #endif
  20960. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
  20961. SUITE_INFO("AES256-CCM-8","TLS_RSA_WITH_AES_256_CCM_8",ECC_BYTE,TLS_RSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR),
  20962. SUITE_ALIAS("AES256-CCM8",ECC_BYTE,TLS_RSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  20963. #endif
  20964. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
  20965. SUITE_INFO("ECDHE-ECDSA-AES128-CCM","TLS_ECDHE_ECDSA_WITH_AES_128_CCM",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CCM, TLSv1_2_MINOR, SSLv3_MAJOR),
  20966. #endif
  20967. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
  20968. SUITE_INFO("ECDHE-ECDSA-AES128-CCM-8","TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR),
  20969. SUITE_ALIAS("ECDHE-ECDSA-AES128-CCM8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  20970. #endif
  20971. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
  20972. SUITE_INFO("ECDHE-ECDSA-AES256-CCM-8","TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR),
  20973. SUITE_ALIAS("ECDHE-ECDSA-AES256-CCM8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  20974. #endif
  20975. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  20976. SUITE_INFO("ECDHE-RSA-AES128-SHA","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",ECC_BYTE,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  20977. #endif
  20978. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  20979. SUITE_INFO("ECDHE-RSA-AES256-SHA","TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",ECC_BYTE,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  20980. #endif
  20981. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  20982. SUITE_INFO("ECDHE-ECDSA-AES128-SHA","TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  20983. #endif
  20984. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  20985. SUITE_INFO("ECDHE-ECDSA-AES256-SHA","TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  20986. #endif
  20987. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  20988. SUITE_INFO("ECDHE-RSA-RC4-SHA","TLS_ECDHE_RSA_WITH_RC4_128_SHA",ECC_BYTE,TLS_ECDHE_RSA_WITH_RC4_128_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  20989. #endif
  20990. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  20991. SUITE_INFO("ECDHE-RSA-DES-CBC3-SHA","TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA",ECC_BYTE,TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  20992. #endif
  20993. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  20994. SUITE_INFO("ECDHE-ECDSA-RC4-SHA","TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  20995. #endif
  20996. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  20997. SUITE_INFO("ECDHE-ECDSA-DES-CBC3-SHA","TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  20998. #endif
  20999. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  21000. SUITE_INFO("AES128-SHA256","TLS_RSA_WITH_AES_128_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_SHA256, TLSv1_MINOR, SSLv3_MAJOR),
  21001. #endif
  21002. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  21003. SUITE_INFO("AES256-SHA256","TLS_RSA_WITH_AES_256_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_AES_256_CBC_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  21004. #endif
  21005. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  21006. SUITE_INFO("DHE-RSA-AES128-SHA256","TLS_DHE_RSA_WITH_AES_128_CBC_SHA256",CIPHER_BYTE,TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  21007. #endif
  21008. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  21009. SUITE_INFO("DHE-RSA-AES256-SHA256","TLS_DHE_RSA_WITH_AES_256_CBC_SHA256",CIPHER_BYTE,TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  21010. #endif
  21011. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  21012. SUITE_INFO("ECDH-RSA-AES128-SHA","TLS_ECDH_RSA_WITH_AES_128_CBC_SHA",ECC_BYTE,TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  21013. #endif
  21014. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  21015. SUITE_INFO("ECDH-RSA-AES256-SHA","TLS_ECDH_RSA_WITH_AES_256_CBC_SHA",ECC_BYTE,TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  21016. #endif
  21017. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  21018. SUITE_INFO("ECDH-ECDSA-AES128-SHA","TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA",ECC_BYTE,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  21019. #endif
  21020. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  21021. SUITE_INFO("ECDH-ECDSA-AES256-SHA","TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA",ECC_BYTE,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  21022. #endif
  21023. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  21024. SUITE_INFO("ECDH-RSA-RC4-SHA","TLS_ECDH_RSA_WITH_RC4_128_SHA",ECC_BYTE,TLS_ECDH_RSA_WITH_RC4_128_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  21025. #endif
  21026. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  21027. SUITE_INFO("ECDH-RSA-DES-CBC3-SHA","TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA",ECC_BYTE,TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  21028. #endif
  21029. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  21030. SUITE_INFO("ECDH-ECDSA-RC4-SHA","TLS_ECDH_ECDSA_WITH_RC4_128_SHA",ECC_BYTE,TLS_ECDH_ECDSA_WITH_RC4_128_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  21031. #endif
  21032. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  21033. SUITE_INFO("ECDH-ECDSA-DES-CBC3-SHA","TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA",ECC_BYTE,TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  21034. #endif
  21035. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  21036. SUITE_INFO("AES128-GCM-SHA256","TLS_RSA_WITH_AES_128_GCM_SHA256",CIPHER_BYTE,TLS_RSA_WITH_AES_128_GCM_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  21037. #endif
  21038. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  21039. SUITE_INFO("AES256-GCM-SHA384","TLS_RSA_WITH_AES_256_GCM_SHA384",CIPHER_BYTE,TLS_RSA_WITH_AES_256_GCM_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
  21040. #endif
  21041. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  21042. SUITE_INFO("DHE-RSA-AES128-GCM-SHA256","TLS_DHE_RSA_WITH_AES_128_GCM_SHA256",CIPHER_BYTE,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  21043. #endif
  21044. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  21045. SUITE_INFO("DHE-RSA-AES256-GCM-SHA384","TLS_DHE_RSA_WITH_AES_256_GCM_SHA384",CIPHER_BYTE,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
  21046. #endif
  21047. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  21048. SUITE_INFO("ECDHE-RSA-AES128-GCM-SHA256","TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",ECC_BYTE,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  21049. #endif
  21050. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  21051. SUITE_INFO("ECDHE-RSA-AES256-GCM-SHA384","TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",ECC_BYTE,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
  21052. #endif
  21053. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  21054. SUITE_INFO("ECDHE-ECDSA-AES128-GCM-SHA256","TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  21055. #endif
  21056. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  21057. SUITE_INFO("ECDHE-ECDSA-AES256-GCM-SHA384","TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
  21058. #endif
  21059. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  21060. SUITE_INFO("ECDH-RSA-AES128-GCM-SHA256","TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256",ECC_BYTE,TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  21061. #endif
  21062. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  21063. SUITE_INFO("ECDH-RSA-AES256-GCM-SHA384","TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384",ECC_BYTE,TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
  21064. #endif
  21065. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  21066. SUITE_INFO("ECDH-ECDSA-AES128-GCM-SHA256","TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256",ECC_BYTE,TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  21067. #endif
  21068. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  21069. SUITE_INFO("ECDH-ECDSA-AES256-GCM-SHA384","TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384",ECC_BYTE,TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
  21070. #endif
  21071. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  21072. SUITE_INFO("CAMELLIA128-SHA","TLS_RSA_WITH_CAMELLIA_128_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  21073. #endif
  21074. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  21075. SUITE_INFO("DHE-RSA-CAMELLIA128-SHA","TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA",CIPHER_BYTE,TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  21076. #endif
  21077. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  21078. SUITE_INFO("CAMELLIA256-SHA","TLS_RSA_WITH_CAMELLIA_256_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  21079. #endif
  21080. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  21081. SUITE_INFO("DHE-RSA-CAMELLIA256-SHA","TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA",CIPHER_BYTE,TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  21082. #endif
  21083. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  21084. SUITE_INFO("CAMELLIA128-SHA256","TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  21085. #endif
  21086. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  21087. SUITE_INFO("DHE-RSA-CAMELLIA128-SHA256","TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256",CIPHER_BYTE,TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  21088. #endif
  21089. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  21090. SUITE_INFO("CAMELLIA256-SHA256","TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  21091. #endif
  21092. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  21093. SUITE_INFO("DHE-RSA-CAMELLIA256-SHA256","TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256",CIPHER_BYTE,TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  21094. #endif
  21095. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  21096. SUITE_INFO("ECDHE-RSA-AES128-SHA256","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",ECC_BYTE,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  21097. #endif
  21098. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  21099. SUITE_INFO("ECDHE-ECDSA-AES128-SHA256","TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  21100. #endif
  21101. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  21102. SUITE_INFO("ECDH-RSA-AES128-SHA256","TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256",ECC_BYTE,TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  21103. #endif
  21104. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  21105. SUITE_INFO("ECDH-ECDSA-AES128-SHA256","TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256",ECC_BYTE,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  21106. #endif
  21107. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  21108. SUITE_INFO("ECDHE-RSA-AES256-SHA384","TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384",ECC_BYTE,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
  21109. #endif
  21110. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  21111. SUITE_INFO("ECDHE-ECDSA-AES256-SHA384","TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
  21112. #endif
  21113. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  21114. SUITE_INFO("ECDH-RSA-AES256-SHA384","TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384",ECC_BYTE,TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
  21115. #endif
  21116. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  21117. SUITE_INFO("ECDH-ECDSA-AES256-SHA384","TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384",ECC_BYTE,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
  21118. #endif
  21119. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  21120. SUITE_INFO("ECDHE-RSA-CHACHA20-POLY1305","TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  21121. #endif
  21122. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  21123. SUITE_INFO("ECDHE-ECDSA-CHACHA20-POLY1305","TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  21124. #endif
  21125. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  21126. SUITE_INFO("DHE-RSA-CHACHA20-POLY1305","TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  21127. #endif
  21128. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  21129. SUITE_INFO("ECDHE-RSA-CHACHA20-POLY1305-OLD","TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256",CHACHA_BYTE,TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  21130. #endif
  21131. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  21132. SUITE_INFO("ECDHE-ECDSA-CHACHA20-POLY1305-OLD","TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256",CHACHA_BYTE,TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  21133. #endif
  21134. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  21135. SUITE_INFO("DHE-RSA-CHACHA20-POLY1305-OLD","TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256",CHACHA_BYTE,TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  21136. #endif
  21137. #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
  21138. SUITE_INFO("ADH-AES128-SHA","TLS_DH_anon_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_DH_anon_WITH_AES_128_CBC_SHA, TLSv1_2_MINOR, SSLv3_MAJOR),
  21139. #endif
  21140. #ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384
  21141. SUITE_INFO("ADH-AES256-GCM-SHA384","TLS_DH_anon_WITH_AES_256_GCM_SHA384",CIPHER_BYTE,TLS_DH_anon_WITH_AES_256_GCM_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
  21142. #endif
  21143. #ifdef HAVE_RENEGOTIATION_INDICATION
  21144. SUITE_INFO("RENEGOTIATION-INFO","TLS_EMPTY_RENEGOTIATION_INFO_SCSV",CIPHER_BYTE,TLS_EMPTY_RENEGOTIATION_INFO_SCSV,SSLv3_MINOR,SSLv3_MAJOR),
  21145. #endif
  21146. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
  21147. SUITE_INFO("ECDHE-ECDSA-NULL-SHA","TLS_ECDHE_ECDSA_WITH_NULL_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_NULL_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  21148. #endif
  21149. #ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256
  21150. SUITE_INFO("ECDHE-PSK-NULL-SHA256","TLS_ECDHE_PSK_WITH_NULL_SHA256",ECC_BYTE,TLS_ECDHE_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  21151. #endif
  21152. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
  21153. SUITE_INFO("ECDHE-PSK-AES128-CBC-SHA256","TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256",ECC_BYTE,TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  21154. #endif
  21155. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256
  21156. SUITE_INFO("ECDHE-PSK-AES128-GCM-SHA256","TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256",ECDHE_PSK_BYTE,TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  21157. #endif
  21158. #ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256
  21159. SUITE_INFO("PSK-CHACHA20-POLY1305","TLS_PSK_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_PSK_WITH_CHACHA20_POLY1305_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  21160. #endif
  21161. #ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  21162. SUITE_INFO("ECDHE-PSK-CHACHA20-POLY1305","TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  21163. #endif
  21164. #ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  21165. SUITE_INFO("DHE-PSK-CHACHA20-POLY1305","TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  21166. #endif
  21167. #ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  21168. SUITE_INFO("EDH-RSA-DES-CBC3-SHA","TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA",CIPHER_BYTE,TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  21169. #endif
  21170. #ifdef BUILD_WDM_WITH_NULL_SHA256
  21171. SUITE_INFO("WDM-NULL-SHA256","WDM_WITH_NULL_SHA256",CIPHER_BYTE,WDM_WITH_NULL_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR)
  21172. #endif
  21173. #endif /* WOLFSSL_NO_TLS12 */
  21174. };
  21175. /* returns the cipher_names array */
  21176. const CipherSuiteInfo* GetCipherNames(void)
  21177. {
  21178. return cipher_names;
  21179. }
  21180. /* returns the number of elements in the cipher_names array */
  21181. int GetCipherNamesSize(void)
  21182. {
  21183. return (int)(sizeof(cipher_names) / sizeof(CipherSuiteInfo));
  21184. }
  21185. const char* GetCipherNameInternal(const byte cipherSuite0, const byte cipherSuite)
  21186. {
  21187. int i;
  21188. const char* nameInternal = "None";
  21189. for (i = 0; i < GetCipherNamesSize(); i++) {
  21190. if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
  21191. (cipher_names[i].cipherSuite == cipherSuite)
  21192. #ifndef NO_CIPHER_SUITE_ALIASES
  21193. && (! (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS))
  21194. #endif
  21195. ) {
  21196. nameInternal = cipher_names[i].name;
  21197. break;
  21198. }
  21199. }
  21200. return nameInternal;
  21201. }
  21202. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  21203. /* Segment cipher name into n[n0,n1,n2,n4]
  21204. * @param cipher a pointer to WOLFSSL_CIPHER
  21205. * @param n return segment cipher name
  21206. * return cipher name if cipher is in the list,
  21207. * otherwise NULL
  21208. */
  21209. const char* GetCipherSegment(const WOLFSSL_CIPHER* cipher, char n[][MAX_SEGMENT_SZ])
  21210. {
  21211. int i,j,k;
  21212. int strLen;
  21213. unsigned long offset;
  21214. const char* name;
  21215. /* sanity check */
  21216. if (cipher == NULL || n == NULL)
  21217. return NULL;
  21218. offset = cipher->offset;
  21219. if (offset >= (unsigned long)GetCipherNamesSize())
  21220. return NULL;
  21221. name = cipher_names[offset].name;
  21222. if (name == NULL)
  21223. return NULL;
  21224. /* Segment cipher name into n[n0,n1,n2,n4]
  21225. * These are used later for comparisons to create:
  21226. * keaStr, authStr, encStr, macStr
  21227. *
  21228. * If cipher_name = ECDHE-ECDSA-AES256-SHA
  21229. * then n0 = "ECDHE", n1 = "ECDSA", n2 = "AES256", n3 = "SHA"
  21230. * and n = [n0,n1,n2,n3,0]
  21231. */
  21232. strLen = (int)XSTRLEN(name);
  21233. for (i = 0, j = 0, k = 0; i <= strLen; i++) {
  21234. if (k >= MAX_SEGMENTS || j >= MAX_SEGMENT_SZ)
  21235. break;
  21236. if (name[i] != '-' && name[i] != '\0') {
  21237. n[k][j] = name[i]; /* Fill kth segment string until '-' */
  21238. j++;
  21239. }
  21240. else {
  21241. n[k][j] = '\0';
  21242. j = 0;
  21243. k++;
  21244. }
  21245. }
  21246. return name;
  21247. }
  21248. /* gcc-12 and later, building with ASAN at -O2 and higher, generate spurious
  21249. * stringop-overread warnings on some (but not all...) reads of n[1] in
  21250. * GetCipherKeaStr().
  21251. */
  21252. #if defined(__GNUC__) && __GNUC__ > 11 && defined(__SANITIZE_ADDRESS__)
  21253. PRAGMA_GCC_DIAG_PUSH
  21254. PRAGMA_GCC("GCC diagnostic ignored \"-Wstringop-overread\"")
  21255. #endif
  21256. const char* GetCipherKeaStr(char n[][MAX_SEGMENT_SZ]) {
  21257. const char* keaStr = NULL;
  21258. if (XSTRCMP(n[0],"ECDHE") == 0 && XSTRCMP(n[1],"PSK") == 0)
  21259. keaStr = "ECDHEPSK";
  21260. else if ((XSTRCMP(n[0],"ECDH") == 0) || (XSTRCMP(n[0],"ECDHE") == 0))
  21261. keaStr = "ECDH";
  21262. else if (XSTRCMP(n[0],"DHE") == 0 && XSTRCMP(n[1],"PSK") == 0)
  21263. keaStr = "DHEPSK";
  21264. else if (XSTRCMP(n[0],"DHE") == 0)
  21265. keaStr = "DH";
  21266. else if (XSTRCMP(n[0],"RSA") == 0 && XSTRCMP(n[1],"PSK") == 0)
  21267. keaStr = "RSAPSK";
  21268. else if (XSTRCMP(n[0],"SRP") == 0)
  21269. keaStr = "SRP";
  21270. else if (XSTRCMP(n[0],"PSK") == 0)
  21271. keaStr = "PSK";
  21272. else if (XSTRCMP(n[0],"EDH") == 0)
  21273. keaStr = "EDH";
  21274. else if ((XSTRNCMP(n[1],"SHA", 3) == 0) || (XSTRNCMP(n[2],"SHA", 3) == 0) ||
  21275. (XSTRNCMP(n[3],"SHA", 3) == 0) || (XSTRNCMP(n[4],"SHA", 3) == 0) ||
  21276. (XSTRCMP(n[2],"RSA") == 0) || (XSTRCMP(n[0],"AES128") == 0) ||
  21277. (XSTRCMP(n[0],"AES256") == 0) || (XSTRCMP(n[1],"MD5") == 0))
  21278. keaStr = "RSA";
  21279. else if (XSTRCMP(n[0],"NULL") == 0)
  21280. keaStr = "None";
  21281. else
  21282. keaStr = "unknown";
  21283. return keaStr;
  21284. }
  21285. #if defined(__GNUC__) && __GNUC__ > 11 && defined(__SANITIZE_ADDRESS__)
  21286. PRAGMA_GCC_DIAG_POP
  21287. #endif
  21288. const char* GetCipherAuthStr(char n[][MAX_SEGMENT_SZ]) {
  21289. const char* authStr = NULL;
  21290. if ((XSTRCMP(n[0],"AES128") == 0) || (XSTRCMP(n[0],"AES256") == 0) ||
  21291. ((XSTRCMP(n[0],"TLS13") == 0) && ((XSTRCMP(n[1],"AES128") == 0) ||
  21292. (XSTRCMP(n[1],"AES256") == 0) || (XSTRCMP(n[1],"CHACHA20") == 0))) ||
  21293. (XSTRCMP(n[0],"RSA") == 0) || (XSTRCMP(n[1],"RSA") == 0) ||
  21294. (XSTRNCMP(n[1],"SHA", 3) == 0) || (XSTRNCMP(n[2],"SHA", 3) == 0) ||
  21295. (XSTRCMP(n[1],"MD5") == 0))
  21296. authStr = "RSA";
  21297. else if (XSTRCMP(n[0],"PSK") == 0 || XSTRCMP(n[1],"PSK") == 0)
  21298. authStr = "PSK";
  21299. else if (XSTRCMP(n[0],"SRP") == 0 && XSTRCMP(n[1],"AES") == 0)
  21300. authStr = "SRP";
  21301. else if (XSTRCMP(n[1],"ECDSA") == 0)
  21302. authStr = "ECDSA";
  21303. else if (XSTRCMP(n[0],"ADH") == 0 || XSTRCMP(n[0],"NULL") == 0)
  21304. authStr = "None";
  21305. else
  21306. authStr = "unknown";
  21307. return authStr;
  21308. }
  21309. const char* GetCipherEncStr(char n[][MAX_SEGMENT_SZ]) {
  21310. const char* encStr = NULL;
  21311. if ((XSTRCMP(n[0],"AES256") == 0 && XSTRCMP(n[1],"GCM") == 0) ||
  21312. (XSTRCMP(n[1],"AES256") == 0 && XSTRCMP(n[2],"GCM") == 0) ||
  21313. (XSTRCMP(n[2],"AES256") == 0 && XSTRCMP(n[3],"GCM") == 0))
  21314. encStr = "AESGCM(256)";
  21315. else if ((XSTRCMP(n[0],"AES128") == 0 && XSTRCMP(n[1],"GCM") == 0) ||
  21316. (XSTRCMP(n[1],"AES128") == 0 && XSTRCMP(n[2],"GCM") == 0) ||
  21317. (XSTRCMP(n[2],"AES128") == 0 && XSTRCMP(n[3],"GCM") == 0))
  21318. encStr = "AESGCM(128)";
  21319. else if ((XSTRCMP(n[0],"AES128") == 0 && XSTRCMP(n[1],"CCM") == 0) ||
  21320. (XSTRCMP(n[1],"AES128") == 0 && XSTRCMP(n[2],"CCM") == 0) ||
  21321. (XSTRCMP(n[2],"AES128") == 0 && XSTRCMP(n[3],"CCM") == 0))
  21322. encStr = "AESCCM(128)";
  21323. else if ((XSTRCMP(n[0],"AES128") == 0) ||
  21324. (XSTRCMP(n[1],"AES128") == 0) ||
  21325. (XSTRCMP(n[2],"AES128") == 0) ||
  21326. (XSTRCMP(n[1],"AES") == 0 && XSTRCMP(n[2],"128") == 0) ||
  21327. (XSTRCMP(n[2],"AES") == 0 && XSTRCMP(n[3],"128") == 0))
  21328. encStr = "AES(128)";
  21329. else if ((XSTRCMP(n[0],"AES256") == 0) ||
  21330. (XSTRCMP(n[1],"AES256") == 0) ||
  21331. (XSTRCMP(n[2],"AES256") == 0) ||
  21332. (XSTRCMP(n[1],"AES") == 0 && XSTRCMP(n[2],"256") == 0) ||
  21333. (XSTRCMP(n[2],"AES") == 0 && XSTRCMP(n[3],"256") == 0))
  21334. encStr = "AES(256)";
  21335. else if ((XSTRCMP(n[0],"CAMELLIA256") == 0) ||
  21336. (XSTRCMP(n[2],"CAMELLIA256") == 0))
  21337. encStr = "CAMELLIA(256)";
  21338. else if ((XSTRCMP(n[0],"CAMELLIA128") == 0) ||
  21339. (XSTRCMP(n[2],"CAMELLIA128") == 0))
  21340. encStr = "CAMELLIA(128)";
  21341. else if ((XSTRCMP(n[0],"RC4") == 0) || (XSTRCMP(n[1],"RC4") == 0) ||
  21342. (XSTRCMP(n[2],"RC4") == 0))
  21343. encStr = "RC4";
  21344. else if (((XSTRCMP(n[0],"DES") == 0) || (XSTRCMP(n[1],"DES") == 0) ||
  21345. (XSTRCMP(n[2],"DES") == 0)) &&
  21346. ((XSTRCMP(n[1],"CBC3") == 0) || (XSTRCMP(n[2],"CBC3") == 0) ||
  21347. (XSTRCMP(n[3],"CBC3") == 0)))
  21348. encStr = "3DES";
  21349. else if ((XSTRCMP(n[1],"CHACHA20") == 0 && XSTRCMP(n[2],"POLY1305") == 0) ||
  21350. (XSTRCMP(n[2],"CHACHA20") == 0 && XSTRCMP(n[3],"POLY1305") == 0))
  21351. encStr = "CHACHA20/POLY1305(256)";
  21352. else if ((XSTRCMP(n[0],"NULL") == 0) || (XSTRCMP(n[1],"NULL") == 0) ||
  21353. (XSTRCMP(n[2],"NULL") == 0) ||
  21354. ((XSTRCMP(n[0],"TLS13") == 0) && (XSTRCMP(n[3],"") == 0)))
  21355. encStr = "None";
  21356. else
  21357. encStr = "unknown";
  21358. return encStr;
  21359. }
  21360. /* Check if a cipher is AEAD
  21361. * @param n return segment cipher name
  21362. * return 1 if the cipher is AEAD, otherwise 0
  21363. */
  21364. int IsCipherAEAD(char n[][MAX_SEGMENT_SZ])
  21365. {
  21366. WOLFSSL_ENTER("IsCipherAEAD");
  21367. if (n == NULL) {
  21368. WOLFSSL_MSG("bad function argument. n is NULL.");
  21369. return 0;
  21370. }
  21371. if ((XSTRCMP(n[2],"GCM") == 0) || (XSTRCMP(n[3],"GCM") == 0) ||
  21372. (XSTRCMP(n[1],"CCM") == 0) ||
  21373. (XSTRCMP(n[2],"CCM") == 0) || (XSTRCMP(n[3],"CCM") == 0) ||
  21374. (XSTRCMP(n[1],"CHACHA20") == 0 && XSTRCMP(n[2],"POLY1305") == 0) ||
  21375. (XSTRCMP(n[2],"CHACHA20") == 0 && XSTRCMP(n[3],"POLY1305") == 0))
  21376. return 1;
  21377. return 0;
  21378. }
  21379. /* Returns the MAC string of a cipher or "unknown" on failure */
  21380. const char* GetCipherMacStr(char n[][MAX_SEGMENT_SZ]) {
  21381. const char* macStr = NULL;
  21382. if ((XSTRCMP(n[4],"SHA256") == 0) || (XSTRCMP(n[3],"SHA256") == 0) ||
  21383. (XSTRCMP(n[2],"SHA256") == 0) || (XSTRCMP(n[1],"SHA256") == 0))
  21384. macStr = "SHA256";
  21385. else if ((XSTRCMP(n[4],"SHA384") == 0) ||
  21386. (XSTRCMP(n[3],"SHA384") == 0) ||
  21387. (XSTRCMP(n[2],"SHA384") == 0) ||
  21388. (XSTRCMP(n[1],"SHA384") == 0))
  21389. macStr = "SHA384";
  21390. else if ((XSTRCMP(n[4],"SHA") == 0) || (XSTRCMP(n[3],"SHA") == 0) ||
  21391. (XSTRCMP(n[2],"SHA") == 0) || (XSTRCMP(n[1],"SHA") == 0) ||
  21392. (XSTRCMP(n[1],"MD5") == 0))
  21393. macStr = "SHA1";
  21394. else if ((XSTRCMP(n[3],"GCM") == 0) ||
  21395. (XSTRCMP(n[1],"CCM") == 0) ||
  21396. (XSTRCMP(n[2],"CCM") == 0) || (XSTRCMP(n[3],"CCM") == 0) ||
  21397. (XSTRCMP(n[1],"CHACHA20") == 0 && XSTRCMP(n[2],"POLY1305") == 0) ||
  21398. (XSTRCMP(n[2],"CHACHA20") == 0 && XSTRCMP(n[3],"POLY1305") == 0))
  21399. macStr = "AEAD";
  21400. else
  21401. macStr = "unknown";
  21402. return macStr;
  21403. }
  21404. /* Returns the number of bits based on the cipher enc string, or 0 on failure */
  21405. int SetCipherBits(const char* enc) {
  21406. int ret = WOLFSSL_FAILURE;
  21407. if ((XSTRCMP(enc,"AESGCM(256)") == 0) ||
  21408. (XSTRCMP(enc,"AES(256)") == 0) ||
  21409. (XSTRCMP(enc,"CAMELLIA(256)") == 0) ||
  21410. (XSTRCMP(enc,"CHACHA20/POLY1305(256)") == 0))
  21411. ret = 256;
  21412. else if
  21413. ((XSTRCMP(enc,"3DES") == 0))
  21414. ret = 168;
  21415. else if
  21416. ((XSTRCMP(enc,"AESGCM(128)") == 0) ||
  21417. (XSTRCMP(enc,"AES(128)") == 0) ||
  21418. (XSTRCMP(enc,"CAMELLIA(128)") == 0) ||
  21419. (XSTRCMP(enc,"RC4") == 0))
  21420. ret = 128;
  21421. else if
  21422. ((XSTRCMP(enc,"DES") == 0))
  21423. ret = 56;
  21424. return ret;
  21425. }
  21426. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  21427. const char* GetCipherNameIana(const byte cipherSuite0, const byte cipherSuite)
  21428. {
  21429. #ifndef NO_ERROR_STRINGS
  21430. int i;
  21431. const char* nameIana = "NONE";
  21432. for (i = 0; i < GetCipherNamesSize(); i++) {
  21433. if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
  21434. (cipher_names[i].cipherSuite == cipherSuite)
  21435. #ifndef NO_CIPHER_SUITE_ALIASES
  21436. && (! (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS))
  21437. #endif
  21438. ) {
  21439. nameIana = cipher_names[i].name_iana;
  21440. break;
  21441. }
  21442. }
  21443. return nameIana;
  21444. #else
  21445. (void)cipherSuite0;
  21446. (void)cipherSuite;
  21447. return NULL;
  21448. #endif
  21449. }
  21450. const char* wolfSSL_get_cipher_name_internal(WOLFSSL* ssl)
  21451. {
  21452. if (ssl == NULL) {
  21453. return NULL;
  21454. }
  21455. return GetCipherNameInternal(ssl->options.cipherSuite0, ssl->options.cipherSuite);
  21456. }
  21457. const char* wolfSSL_get_cipher_name_iana(WOLFSSL* ssl)
  21458. {
  21459. if (ssl == NULL) {
  21460. return NULL;
  21461. }
  21462. return GetCipherNameIana(ssl->options.cipherSuite0, ssl->options.cipherSuite);
  21463. }
  21464. int GetCipherSuiteFromName(const char* name, byte* cipherSuite0,
  21465. byte* cipherSuite, int* flags)
  21466. {
  21467. int ret = BAD_FUNC_ARG;
  21468. int i;
  21469. unsigned long len;
  21470. const char* nameDelim;
  21471. /* Support trailing : */
  21472. nameDelim = XSTRSTR(name, ":");
  21473. if (nameDelim)
  21474. len = (unsigned long)(nameDelim - name);
  21475. else
  21476. len = (unsigned long)XSTRLEN(name);
  21477. for (i = 0; i < GetCipherNamesSize(); i++) {
  21478. int found = (XSTRNCMP(name, cipher_names[i].name, len) == 0) &&
  21479. (cipher_names[i].name[len] == 0);
  21480. #ifndef NO_ERROR_STRINGS
  21481. if (!found)
  21482. found = (XSTRNCMP(name, cipher_names[i].name_iana, len) == 0) &&
  21483. (cipher_names[i].name_iana[len] == 0);
  21484. #endif
  21485. if (found) {
  21486. *cipherSuite0 = cipher_names[i].cipherSuite0;
  21487. *cipherSuite = cipher_names[i].cipherSuite;
  21488. *flags = cipher_names[i].flags;
  21489. ret = 0;
  21490. break;
  21491. }
  21492. }
  21493. return ret;
  21494. }
  21495. /**
  21496. Set the enabled cipher suites.
  21497. With OPENSSL_EXTRA we attempt to understand some of the available "bulk"
  21498. ciphersuites. We can not perfectly filter ciphersuites based on the "bulk"
  21499. names but we do what we can. Ciphersuites named explicitly take precedence to
  21500. ciphersuites introduced through the "bulk" ciphersuites.
  21501. @param [out] suites Suites structure.
  21502. @param [in] list List of cipher suites, only supports full name from
  21503. cipher_names[] delimited by ':'.
  21504. @return true on success, else false.
  21505. */
  21506. int SetCipherList(WOLFSSL_CTX* ctx, Suites* suites, const char* list)
  21507. {
  21508. int ret = 0;
  21509. int idx = 0;
  21510. word16 haveRSAsig = 0;
  21511. word16 haveECDSAsig = 0;
  21512. word16 haveFalconSig = 0;
  21513. word16 haveDilithiumSig = 0;
  21514. word16 haveAnon = 0;
  21515. word16 haveRSA = 0;
  21516. #ifdef OPENSSL_EXTRA
  21517. word16 haveDH = 0;
  21518. word16 haveECC = 0;
  21519. word16 haveStaticRSA = 1; /* allowed by default if compiled in */
  21520. word16 haveStaticECC = 0;
  21521. word16 haveNull = 1; /* allowed by default if compiled in */
  21522. int callInitSuites = 0;
  21523. word16 havePSK = 0;
  21524. #endif
  21525. const int suiteSz = GetCipherNamesSize();
  21526. const char* next = list;
  21527. (void)haveRSA;
  21528. if (suites == NULL || list == NULL) {
  21529. WOLFSSL_MSG("SetCipherList parameter error");
  21530. return 0;
  21531. }
  21532. if (next[0] == 0 || XSTRCMP(next, "ALL") == 0 ||
  21533. XSTRCMP(next, "DEFAULT") == 0 || XSTRCMP(next, "HIGH") == 0) {
  21534. /* Add all ciphersuites except anonymous and null ciphers. Prefer RSA */
  21535. #ifndef NO_RSA
  21536. haveRSA = 1;
  21537. #endif
  21538. InitSuites(suites, ctx->method->version,
  21539. #ifndef NO_CERTS
  21540. ctx->privateKeySz,
  21541. #else
  21542. 0,
  21543. #endif
  21544. haveRSA, 1, 1, !haveRSA, 1, haveRSA, !haveRSA, 1, 1, 0, 0,
  21545. ctx->method->side);
  21546. return 1; /* wolfSSL default */
  21547. }
  21548. do {
  21549. const char* current = next;
  21550. char name[MAX_SUITE_NAME + 1];
  21551. int i;
  21552. word32 length;
  21553. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  21554. word16 allowing = 1;
  21555. #endif
  21556. next = XSTRSTR(next, ":");
  21557. length = MAX_SUITE_NAME;
  21558. if (next != NULL) {
  21559. word32 currLen = (word32)(next - current);
  21560. if (length > currLen) {
  21561. length = currLen;
  21562. }
  21563. }
  21564. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  21565. if (length > 1) {
  21566. if (*current == '!') {
  21567. allowing = 0;
  21568. current++;
  21569. length--;
  21570. }
  21571. }
  21572. #endif
  21573. XSTRNCPY(name, current, length);
  21574. name[(length == sizeof(name)) ? length - 1 : length] = 0;
  21575. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  21576. if (length > 1) {
  21577. char* substr = NULL;
  21578. char* substrCurrent = name;
  21579. /* extract first public key type from a string like ECDHE+AESGCM */
  21580. substr = XSTRSTR(substrCurrent, "+");
  21581. if (substr != NULL) {
  21582. do {
  21583. if (substr) {
  21584. length = (word32)(substr - substrCurrent);
  21585. substrCurrent[length] = '\0';
  21586. }
  21587. else {
  21588. length = (int)XSTRLEN(substrCurrent);
  21589. }
  21590. /* check if is a public key type */
  21591. if (XSTRCMP(substrCurrent, "ECDHE") == 0 ||
  21592. XSTRCMP(substrCurrent, "RSA") == 0 ||
  21593. XSTRCMP(substrCurrent, "DHE") == 0) {
  21594. if (name != substrCurrent)
  21595. XMEMMOVE(name, substrCurrent, length);
  21596. name[length] = '\0';
  21597. break;
  21598. }
  21599. substrCurrent = substr;
  21600. if (substr) {
  21601. substrCurrent = substrCurrent + 1; /* +1 to skip over '+' */
  21602. substr = XSTRSTR(substrCurrent, "+");
  21603. }
  21604. } while (substrCurrent != NULL);
  21605. }
  21606. }
  21607. if (XSTRCMP(name, "DEFAULT") == 0 || XSTRCMP(name, "ALL") == 0) {
  21608. if (XSTRCMP(name, "ALL") == 0)
  21609. haveAnon = 1;
  21610. else
  21611. haveAnon = 0;
  21612. #ifdef HAVE_ANON
  21613. ctx->haveAnon = haveAnon;
  21614. #endif
  21615. haveRSA = 1;
  21616. haveDH = 1;
  21617. haveECC = 1;
  21618. /* having static ECC will disable all RSA use, do not set
  21619. * static ECC suites here
  21620. * haveStaticECC = 1; */
  21621. haveStaticRSA = 1;
  21622. haveRSAsig = 1;
  21623. havePSK = 1;
  21624. haveNull = 0;
  21625. callInitSuites = 1;
  21626. ret = 1;
  21627. continue;
  21628. }
  21629. /* We don't have a way to disallow high bit sizes. Only disable unsafe
  21630. * ciphersuites. */
  21631. if (XSTRCMP(name, "HIGH") == 0 && allowing) {
  21632. /* Disable static, anonymous, and null ciphers */
  21633. haveAnon = 0;
  21634. #ifdef HAVE_ANON
  21635. ctx->haveAnon = 0;
  21636. #endif
  21637. haveRSA = 1;
  21638. haveDH = 1;
  21639. haveECC = 1;
  21640. haveStaticECC = 0;
  21641. haveStaticRSA = 0;
  21642. haveRSAsig = 1;
  21643. havePSK = 1;
  21644. haveNull = 0;
  21645. callInitSuites = 1;
  21646. ret = 1;
  21647. continue;
  21648. }
  21649. if (XSTRCMP(name, "aNULL") == 0) {
  21650. haveAnon = allowing;
  21651. #ifdef HAVE_ANON
  21652. ctx->haveAnon = allowing;
  21653. #endif
  21654. if (allowing) {
  21655. /* Allow RSA by default. */
  21656. if (!haveECC)
  21657. haveRSA = 1;
  21658. if (!haveECDSAsig)
  21659. haveRSAsig = 1;
  21660. callInitSuites = 1;
  21661. ret = 1;
  21662. }
  21663. continue;
  21664. }
  21665. if (XSTRCMP(name, "eNULL") == 0 || XSTRCMP(name, "NULL") == 0) {
  21666. haveNull = allowing;
  21667. if (allowing) {
  21668. /* Allow RSA by default. */
  21669. if (!haveECC)
  21670. haveRSA = 1;
  21671. if (!haveECDSAsig)
  21672. haveRSAsig = 1;
  21673. callInitSuites = 1;
  21674. ret = 1;
  21675. }
  21676. continue;
  21677. }
  21678. if (XSTRCMP(name, "kDH") == 0) {
  21679. haveStaticECC = allowing;
  21680. if (allowing) {
  21681. haveECC = 1;
  21682. haveECDSAsig = 1;
  21683. callInitSuites = 1;
  21684. ret = 1;
  21685. }
  21686. continue;
  21687. }
  21688. if (XSTRCMP(name, "ECDHE") == 0) {
  21689. if (allowing) {
  21690. haveECC = 1;
  21691. haveECDSAsig = 1;
  21692. callInitSuites = 1;
  21693. ret = 1;
  21694. }
  21695. continue;
  21696. }
  21697. if (XSTRCMP(name, "kRSA") == 0 || XSTRCMP(name, "RSA") == 0) {
  21698. haveStaticRSA = allowing;
  21699. if (allowing) {
  21700. haveRSA = 1;
  21701. haveRSAsig = 1;
  21702. callInitSuites = 1;
  21703. ret = 1;
  21704. }
  21705. continue;
  21706. }
  21707. if (XSTRCMP(name, "PSK") == 0) {
  21708. havePSK = allowing;
  21709. haveRSAsig = 1;
  21710. if (allowing) {
  21711. /* Allow RSA by default. */
  21712. if (!haveECC)
  21713. haveRSA = 1;
  21714. if (!haveECDSAsig)
  21715. haveRSAsig = 1;
  21716. callInitSuites = 1;
  21717. ret = 1;
  21718. }
  21719. continue;
  21720. }
  21721. if (XSTRCMP(name, "LOW") == 0 || XSTRCMP(name, "MEDIUM") == 0) {
  21722. /* No way to limit or allow low bit sizes */
  21723. if (allowing) {
  21724. /* Allow RSA by default */
  21725. haveRSA = 1;
  21726. haveRSAsig = 1;
  21727. callInitSuites = 1;
  21728. ret = 1;
  21729. }
  21730. continue;
  21731. }
  21732. if (XSTRCMP(name, "DSS") == 0) {
  21733. /* No support for DSA ciphersuites */
  21734. continue;
  21735. }
  21736. if (XSTRCMP(name, "EXP") == 0 || XSTRCMP(name, "EXPORT") == 0) {
  21737. /* wolfSSL doesn't support "export" ciphers. We can skip this */
  21738. continue;
  21739. }
  21740. #endif /* OPENSSL_EXTRA */
  21741. for (i = 0; i < suiteSz; i++) {
  21742. if (XSTRNCMP(name, cipher_names[i].name, sizeof(name)) == 0
  21743. #ifndef NO_ERROR_STRINGS
  21744. || XSTRNCMP(name, cipher_names[i].name_iana, sizeof(name)) == 0
  21745. #endif
  21746. ) {
  21747. int j;
  21748. #ifdef WOLFSSL_DTLS
  21749. /* don't allow stream ciphers with DTLS */
  21750. if (ctx->method->version.major == DTLS_MAJOR) {
  21751. if (XSTRSTR(name, "RC4"))
  21752. {
  21753. WOLFSSL_MSG("Stream ciphers not supported with DTLS");
  21754. continue;
  21755. }
  21756. }
  21757. #endif /* WOLFSSL_DTLS */
  21758. for (j = 0; j < idx; j += 2) {
  21759. if ((suites->suites[j+0] == cipher_names[i].cipherSuite0) &&
  21760. (suites->suites[j+1] == cipher_names[i].cipherSuite)) {
  21761. break;
  21762. }
  21763. }
  21764. /* Silently drop duplicates from list. */
  21765. if (j != idx) {
  21766. break;
  21767. }
  21768. if (idx + 1 >= WOLFSSL_MAX_SUITE_SZ) {
  21769. WOLFSSL_MSG("WOLFSSL_MAX_SUITE_SZ set too low");
  21770. return 0; /* suites buffer not large enough, error out */
  21771. }
  21772. suites->suites[idx++] = cipher_names[i].cipherSuite0;
  21773. suites->suites[idx++] = cipher_names[i].cipherSuite;
  21774. /* The suites are either ECDSA, RSA, PSK, or Anon. The RSA
  21775. * suites don't necessarily have RSA in the name. */
  21776. #ifdef WOLFSSL_TLS13
  21777. if (cipher_names[i].cipherSuite0 == TLS13_BYTE ||
  21778. (cipher_names[i].cipherSuite0 == ECC_BYTE &&
  21779. (cipher_names[i].cipherSuite == TLS_SHA256_SHA256 ||
  21780. cipher_names[i].cipherSuite == TLS_SHA384_SHA384))) {
  21781. #ifndef NO_RSA
  21782. haveRSAsig = 1;
  21783. #endif
  21784. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  21785. defined(HAVE_ED448)
  21786. haveECDSAsig = 1;
  21787. #endif
  21788. #if defined(HAVE_PQC)
  21789. #ifdef HAVE_FALCON
  21790. haveFalconSig = 1;
  21791. #endif /* HAVE_FALCON */
  21792. #ifdef HAVE_DILITHIUM
  21793. haveDilithiumSig = 1;
  21794. #endif /* HAVE_DILITHIUM */
  21795. #endif /* HAVE_PQC */
  21796. }
  21797. else
  21798. #endif
  21799. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  21800. defined(HAVE_ED448)
  21801. if ((haveECDSAsig == 0) && XSTRSTR(name, "ECDSA"))
  21802. haveECDSAsig = 1;
  21803. else
  21804. #endif
  21805. #ifdef HAVE_ANON
  21806. if (XSTRSTR(name, "ADH"))
  21807. haveAnon = 1;
  21808. else
  21809. #endif
  21810. if (haveRSAsig == 0
  21811. #ifndef NO_PSK
  21812. && (XSTRSTR(name, "PSK") == NULL)
  21813. #endif
  21814. ) {
  21815. haveRSAsig = 1;
  21816. }
  21817. ret = 1; /* found at least one */
  21818. break;
  21819. }
  21820. }
  21821. }
  21822. while (next++); /* ++ needed to skip ':' */
  21823. if (ret) {
  21824. int keySz = 0;
  21825. #ifndef NO_CERTS
  21826. keySz = ctx->privateKeySz;
  21827. #endif
  21828. #ifdef OPENSSL_EXTRA
  21829. if (callInitSuites) {
  21830. byte tmp[WOLFSSL_MAX_SUITE_SZ];
  21831. XMEMCPY(tmp, suites->suites, idx); /* Store copy */
  21832. suites->setSuites = 0; /* Force InitSuites */
  21833. suites->hashSigAlgoSz = 0; /* Force InitSuitesHashSigAlgo call
  21834. * inside InitSuites */
  21835. InitSuites(suites, ctx->method->version, keySz, haveRSA,
  21836. havePSK, haveDH, haveECDSAsig,
  21837. haveECC, haveStaticRSA,
  21838. haveStaticECC, haveFalconSig,
  21839. haveDilithiumSig, haveAnon,
  21840. haveNull, ctx->method->side);
  21841. /* Restore user ciphers ahead of defaults */
  21842. XMEMMOVE(suites->suites + idx, suites->suites,
  21843. min(suites->suiteSz, WOLFSSL_MAX_SUITE_SZ-idx));
  21844. suites->suiteSz += (word16)idx;
  21845. }
  21846. else
  21847. #endif
  21848. {
  21849. suites->suiteSz = (word16)idx;
  21850. InitSuitesHashSigAlgo(suites, haveECDSAsig, haveRSAsig,
  21851. haveFalconSig, haveDilithiumSig, haveAnon,
  21852. 1, keySz);
  21853. }
  21854. suites->setSuites = 1;
  21855. }
  21856. (void)ctx;
  21857. return ret;
  21858. }
  21859. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_SET_CIPHER_BYTES)
  21860. int SetCipherListFromBytes(WOLFSSL_CTX* ctx, Suites* suites, const byte* list,
  21861. const int listSz)
  21862. {
  21863. int ret = 0;
  21864. int idx = 0;
  21865. int i;
  21866. int haveRSAsig = 0;
  21867. int haveECDSAsig = 0;
  21868. int haveFalconSig = 0;
  21869. int haveDilithiumSig = 0;
  21870. int haveAnon = 0;
  21871. if (suites == NULL || list == NULL) {
  21872. WOLFSSL_MSG("SetCipherListFromBytes parameter error");
  21873. return 0;
  21874. }
  21875. if ((listSz % 2) != 0) {
  21876. return 0;
  21877. }
  21878. for (i = 0; (i + 1) < listSz; i += 2) {
  21879. const byte firstByte = list[i];
  21880. const byte secondByte = list[i + 1];
  21881. const char* name = NULL;
  21882. int j;
  21883. name = GetCipherNameInternal(firstByte, secondByte);
  21884. if (XSTRCMP(name, "None") == 0) {
  21885. /* bytes don't match any known cipher */
  21886. continue;
  21887. }
  21888. #ifdef WOLFSSL_DTLS
  21889. /* don't allow stream ciphers with DTLS */
  21890. if (ctx->method->version.major == DTLS_MAJOR) {
  21891. if (XSTRSTR(name, "RC4")) {
  21892. WOLFSSL_MSG("Stream ciphers not supported with DTLS");
  21893. continue;
  21894. }
  21895. }
  21896. #endif /* WOLFSSL_DTLS */
  21897. for (j = 0; j < idx; j += 2) {
  21898. if ((suites->suites[j+0] == firstByte) &&
  21899. (suites->suites[j+1] == secondByte)) {
  21900. break;
  21901. }
  21902. }
  21903. /* Silently drop duplicates from list. */
  21904. if (j != idx) {
  21905. continue;
  21906. }
  21907. if (idx + 1 >= WOLFSSL_MAX_SUITE_SZ) {
  21908. WOLFSSL_MSG("WOLFSSL_MAX_SUITE_SZ set too low");
  21909. return 0; /* suites buffer not large enough, error out */
  21910. }
  21911. suites->suites[idx++] = firstByte;
  21912. suites->suites[idx++] = secondByte;
  21913. /* The suites are either ECDSA, RSA, PSK, or Anon. The RSA
  21914. * suites don't necessarily have RSA in the name. */
  21915. #ifdef WOLFSSL_TLS13
  21916. if (firstByte == TLS13_BYTE || (firstByte == ECC_BYTE &&
  21917. (secondByte == TLS_SHA256_SHA256 ||
  21918. secondByte == TLS_SHA384_SHA384))) {
  21919. #ifndef NO_RSA
  21920. haveRSAsig = 1;
  21921. #endif
  21922. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  21923. haveECDSAsig = 1;
  21924. #endif
  21925. #if defined(HAVE_PQC)
  21926. #ifdef HAVE_FALCON
  21927. haveFalconSig = 1;
  21928. #endif /* HAVE_FALCON */
  21929. #ifdef HAVE_DILITHIUM
  21930. haveDilithiumSig = 1;
  21931. #endif /* HAVE_DILITHIUM */
  21932. #endif /* HAVE_PQC */
  21933. }
  21934. else
  21935. #endif /* WOLFSSL_TLS13 */
  21936. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  21937. if ((haveECDSAsig == 0) && XSTRSTR(name, "ECDSA"))
  21938. haveECDSAsig = 1;
  21939. else
  21940. #endif
  21941. #ifdef HAVE_ANON
  21942. if (XSTRSTR(name, "ADH"))
  21943. haveAnon = 1;
  21944. else
  21945. #endif
  21946. if (haveRSAsig == 0
  21947. #ifndef NO_PSK
  21948. && (XSTRSTR(name, "PSK") == NULL)
  21949. #endif
  21950. ) {
  21951. haveRSAsig = 1;
  21952. }
  21953. ret = 1; /* found at least one */
  21954. }
  21955. if (ret) {
  21956. int keySz = 0;
  21957. #ifndef NO_CERTS
  21958. keySz = ctx->privateKeySz;
  21959. #endif
  21960. suites->suiteSz = (word16)idx;
  21961. InitSuitesHashSigAlgo(suites, haveECDSAsig, haveRSAsig,
  21962. haveFalconSig, haveDilithiumSig, haveAnon, 1,
  21963. keySz);
  21964. suites->setSuites = 1;
  21965. }
  21966. (void)ctx;
  21967. return ret;
  21968. }
  21969. #endif /* OPENSSL_EXTRA */
  21970. #ifdef OPENSSL_EXTRA
  21971. struct mac_algs {
  21972. byte alg;
  21973. const char* name;
  21974. } mac_names[] = {
  21975. #ifndef NO_SHA256
  21976. { sha256_mac, "SHA256" },
  21977. #endif
  21978. #ifdef WOLFSSL_SHA384
  21979. { sha384_mac, "SHA384" },
  21980. #endif
  21981. #ifdef WOLFSSL_SHA512
  21982. { sha512_mac, "SHA512" },
  21983. #endif
  21984. #ifdef WOLFSSL_SHA224
  21985. { sha224_mac, "SHA224" },
  21986. #endif
  21987. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  21988. defined(WOLFSSL_ALLOW_TLS_SHA1))
  21989. { sha_mac, "SHA1" },
  21990. #endif
  21991. };
  21992. #define MAC_NAMES_SZ (int)(sizeof(mac_names)/sizeof(*mac_names))
  21993. /* Convert the hash algorithm string to a TLS MAC algorithm num. */
  21994. static byte GetMacAlgFromName(const char* name, int len)
  21995. {
  21996. byte alg = no_mac;
  21997. int i;
  21998. for (i = 0; i < MAC_NAMES_SZ; i++) {
  21999. if (((int)XSTRLEN(mac_names[i].name) == len) &&
  22000. (XMEMCMP(mac_names[i].name, name, len) == 0)) {
  22001. alg = mac_names[i].alg;
  22002. break;
  22003. }
  22004. }
  22005. return alg;
  22006. }
  22007. struct sig_algs {
  22008. byte alg;
  22009. const char* name;
  22010. } sig_names[] = {
  22011. #ifndef NO_RSA
  22012. { rsa_sa_algo, "RSA" },
  22013. #ifdef WC_RSA_PSS
  22014. { rsa_pss_sa_algo, "RSA-PSS" },
  22015. { rsa_pss_sa_algo, "PSS" },
  22016. #endif
  22017. #endif
  22018. #ifdef HAVE_ECC
  22019. { ecc_dsa_sa_algo, "ECDSA" },
  22020. #endif
  22021. #ifdef HAVE_ED25519
  22022. { ed25519_sa_algo, "ED25519" },
  22023. #endif
  22024. #ifdef HAVE_ED448
  22025. { ed448_sa_algo, "ED448" },
  22026. #endif
  22027. #ifndef NO_DSA
  22028. { dsa_sa_algo, "DSA" },
  22029. #endif
  22030. };
  22031. #define SIG_NAMES_SZ (int)(sizeof(sig_names)/sizeof(*sig_names))
  22032. /* Convert the signature algorithm string to a TLS signature algorithm num. */
  22033. static byte GetSigAlgFromName(const char* name, int len)
  22034. {
  22035. byte alg = anonymous_sa_algo;
  22036. int i;
  22037. for (i = 0; i < SIG_NAMES_SZ; i++) {
  22038. if (((int)XSTRLEN(sig_names[i].name) == len) &&
  22039. (XMEMCMP(sig_names[i].name, name, len) == 0)) {
  22040. alg = sig_names[i].alg;
  22041. break;
  22042. }
  22043. }
  22044. return alg;
  22045. }
  22046. /* Set the hash/signature algorithms that are supported for certificate signing.
  22047. *
  22048. * suites [in,out] Cipher suites and signature algorithms.
  22049. * list [in] String representing hash/signature algorithms to set.
  22050. * returns 0 on failure.
  22051. * 1 on success.
  22052. */
  22053. int SetSuitesHashSigAlgo(Suites* suites, const char* list)
  22054. {
  22055. int ret = 1;
  22056. word16 idx = 0;
  22057. const char* s = list;
  22058. byte sig_alg = 0;
  22059. byte mac_alg = no_mac;
  22060. /* Setting is destructive on error. */
  22061. suites->hashSigAlgoSz = 0;
  22062. do {
  22063. if (*list == '+') {
  22064. if (mac_alg != 0) {
  22065. ret = 0;
  22066. break;
  22067. }
  22068. sig_alg = GetSigAlgFromName(s, (int)(list - s));
  22069. if (sig_alg == 0) {
  22070. ret = 0;
  22071. break;
  22072. }
  22073. s = list + 1;
  22074. }
  22075. else if (*list == ':' || *list == '\0') {
  22076. if (sig_alg == 0) {
  22077. /* No signature algorithm set yet.
  22078. * Ed25519 and Ed448 have implied MAC algorithm.
  22079. */
  22080. sig_alg = GetSigAlgFromName(s, (int)(list - s));
  22081. if (sig_alg != ed25519_sa_algo && sig_alg != ed448_sa_algo) {
  22082. ret = 0;
  22083. break;
  22084. }
  22085. }
  22086. else {
  22087. mac_alg = GetMacAlgFromName(s, (int)(list - s));
  22088. if (mac_alg == 0) {
  22089. ret = 0;
  22090. break;
  22091. }
  22092. }
  22093. AddSuiteHashSigAlgo(suites->hashSigAlgo, mac_alg, sig_alg, 0, &idx);
  22094. sig_alg = 0;
  22095. mac_alg = no_mac;
  22096. s = list + 1;
  22097. }
  22098. list++;
  22099. }
  22100. while (*(list-1) != '\0');
  22101. if (s != list && (sig_alg != 0 || mac_alg != 0)) {
  22102. ret = 0;
  22103. }
  22104. else {
  22105. suites->hashSigAlgoSz = idx;
  22106. }
  22107. return ret;
  22108. }
  22109. #endif /* OPENSSL_EXTRA */
  22110. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS)
  22111. static int MatchSigAlgo(WOLFSSL* ssl, int sigAlgo)
  22112. {
  22113. #ifdef HAVE_ED25519
  22114. if (ssl->pkCurveOID == ECC_ED25519_OID) {
  22115. /* Certificate has Ed25519 key, only match with Ed25519 sig alg */
  22116. return sigAlgo == ed25519_sa_algo;
  22117. }
  22118. #endif
  22119. #ifdef HAVE_ED448
  22120. if (ssl->pkCurveOID == ECC_ED448_OID) {
  22121. /* Certificate has Ed448 key, only match with Ed448 sig alg */
  22122. return sigAlgo == ed448_sa_algo;
  22123. }
  22124. #endif
  22125. #ifdef HAVE_PQC
  22126. #ifdef HAVE_FALCON
  22127. if (ssl->pkCurveOID == CTC_FALCON_LEVEL1) {
  22128. /* Certificate has Falcon level 1 key, only match with Falcon level 1
  22129. * sig alg */
  22130. return sigAlgo == falcon_level1_sa_algo;
  22131. }
  22132. if (ssl->pkCurveOID == CTC_FALCON_LEVEL5) {
  22133. /* Certificate has Falcon level 5 key, only match with Falcon level 5
  22134. * sig alg */
  22135. return sigAlgo == falcon_level5_sa_algo;
  22136. }
  22137. #endif /* HAVE_FALCON */
  22138. #ifdef HAVE_DILITHIUM
  22139. if (ssl->pkCurveOID == CTC_DILITHIUM_LEVEL2) {
  22140. /* Certificate has Dilithium level 2 key, only match with it. */
  22141. return sigAlgo == dilithium_level2_sa_algo;
  22142. }
  22143. if (ssl->pkCurveOID == CTC_DILITHIUM_LEVEL3) {
  22144. /* Certificate has Dilithium level 3 key, only match with it. */
  22145. return sigAlgo == dilithium_level3_sa_algo;
  22146. }
  22147. if (ssl->pkCurveOID == CTC_DILITHIUM_LEVEL5) {
  22148. /* Certificate has Dilithium level 5 key, only match with it. */
  22149. return sigAlgo == dilithium_level5_sa_algo;
  22150. }
  22151. #endif /* HAVE_DILITHIUM */
  22152. #endif /* HAVE_PQC */
  22153. #ifdef WC_RSA_PSS
  22154. /* RSA certificate and PSS sig alg. */
  22155. if (ssl->options.sigAlgo == rsa_sa_algo) {
  22156. #if defined(WOLFSSL_TLS13)
  22157. /* TLS 1.3 only supports RSA-PSS. */
  22158. if (IsAtLeastTLSv1_3(ssl->version))
  22159. return sigAlgo == rsa_pss_sa_algo;
  22160. #endif
  22161. /* TLS 1.2 and below - RSA-PSS allowed. */
  22162. if (sigAlgo == rsa_pss_sa_algo)
  22163. return 1;
  22164. }
  22165. #endif
  22166. /* Signature algorithm matches certificate. */
  22167. return sigAlgo == ssl->options.sigAlgo;
  22168. }
  22169. #if defined(HAVE_ECC) && defined(WOLFSSL_TLS13) || \
  22170. defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  22171. static int CmpEccStrength(int hashAlgo, int curveSz)
  22172. {
  22173. int dgstSz = GetMacDigestSize((byte)hashAlgo);
  22174. if (dgstSz <= 0)
  22175. return -1;
  22176. return dgstSz - (curveSz & (~0x3));
  22177. }
  22178. #endif
  22179. static byte MinHashAlgo(WOLFSSL* ssl)
  22180. {
  22181. #ifdef WOLFSSL_TLS13
  22182. if (IsAtLeastTLSv1_3(ssl->version)) {
  22183. return sha256_mac;
  22184. }
  22185. #endif
  22186. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_ALLOW_TLS_SHA1)
  22187. if (IsAtLeastTLSv1_2(ssl)) {
  22188. return sha256_mac;
  22189. }
  22190. #endif /* WOLFSSL_NO_TLS12 */
  22191. (void)ssl;
  22192. return sha_mac;
  22193. }
  22194. int PickHashSigAlgo(WOLFSSL* ssl, const byte* hashSigAlgo, word32 hashSigAlgoSz)
  22195. {
  22196. word32 i;
  22197. int ret = MATCH_SUITE_ERROR;
  22198. byte minHash;
  22199. /* set defaults */
  22200. if (IsAtLeastTLSv1_3(ssl->version)) {
  22201. #ifndef NO_CERTS
  22202. /* TLS 1.3 cipher suites don't have public key algorithms in them.
  22203. * Using the one in the certificate - if any.
  22204. */
  22205. ssl->options.sigAlgo = ssl->buffers.keyType;
  22206. #endif
  22207. }
  22208. else {
  22209. ssl->options.sigAlgo = ssl->specs.sig_algo;
  22210. }
  22211. if (ssl->options.sigAlgo == anonymous_sa_algo) {
  22212. /* PSK ciphersuite - get digest to use from cipher suite */
  22213. ssl->options.hashAlgo = ssl->specs.mac_algorithm;
  22214. return 0;
  22215. }
  22216. ssl->options.hashAlgo = minHash = MinHashAlgo(ssl);
  22217. /* No list means go with the defaults. */
  22218. if (hashSigAlgoSz == 0)
  22219. return 0;
  22220. /* i+1 since two bytes used to describe hash and signature algorithm */
  22221. for (i = 0; (i+1) < hashSigAlgoSz; i += HELLO_EXT_SIGALGO_SZ) {
  22222. byte hashAlgo = 0, sigAlgo = 0;
  22223. DecodeSigAlg(&hashSigAlgo[i], &hashAlgo, &sigAlgo);
  22224. /* Keep looking if hash algorithm not strong enough. */
  22225. if (hashAlgo < minHash)
  22226. continue;
  22227. /* Keep looking if signature algorithm isn't supported by cert. */
  22228. if (!MatchSigAlgo(ssl, sigAlgo))
  22229. continue;
  22230. #ifdef HAVE_ED25519
  22231. if (ssl->pkCurveOID == ECC_ED25519_OID) {
  22232. /* Matched Ed25519 - set chosen and finished. */
  22233. ssl->options.sigAlgo = sigAlgo;
  22234. ssl->options.hashAlgo = hashAlgo;
  22235. ret = 0;
  22236. break;
  22237. }
  22238. #endif
  22239. #ifdef HAVE_ED448
  22240. if (ssl->pkCurveOID == ECC_ED448_OID) {
  22241. /* Matched Ed448 - set chosen and finished. */
  22242. ssl->options.sigAlgo = sigAlgo;
  22243. ssl->options.hashAlgo = hashAlgo;
  22244. ret = 0;
  22245. break;
  22246. }
  22247. #endif
  22248. #if defined(HAVE_PQC)
  22249. #if defined(HAVE_FALCON)
  22250. if (ssl->pkCurveOID == CTC_FALCON_LEVEL1 ||
  22251. ssl->pkCurveOID == CTC_FALCON_LEVEL5 ) {
  22252. /* Matched Falcon - set chosen and finished. */
  22253. ssl->options.sigAlgo = sigAlgo;
  22254. ssl->options.hashAlgo = hashAlgo;
  22255. ret = 0;
  22256. break;
  22257. }
  22258. #endif /* HAVE_FALCON */
  22259. #if defined(HAVE_DILITHIUM)
  22260. if (ssl->pkCurveOID == CTC_DILITHIUM_LEVEL2 ||
  22261. ssl->pkCurveOID == CTC_DILITHIUM_LEVEL3 ||
  22262. ssl->pkCurveOID == CTC_DILITHIUM_LEVEL5) {
  22263. /* Matched Dilithium - set chosen and finished. */
  22264. ssl->options.sigAlgo = sigAlgo;
  22265. ssl->options.hashAlgo = hashAlgo;
  22266. ret = 0;
  22267. break;
  22268. }
  22269. #endif /* HAVE_DILITHIUM */
  22270. #endif /* HAVE_PQC */
  22271. #if defined(WOLFSSL_ECDSA_MATCH_HASH) && defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  22272. #error "WOLFSSL_ECDSA_MATCH_HASH and USE_ECDSA_KEYSZ_HASH_ALGO cannot "
  22273. "be used together"
  22274. #endif
  22275. #if defined(HAVE_ECC) && (defined(WOLFSSL_TLS13) || \
  22276. defined(WOLFSSL_ECDSA_MATCH_HASH))
  22277. if (sigAlgo == ecc_dsa_sa_algo
  22278. #ifndef WOLFSSL_ECDSA_MATCH_HASH
  22279. && IsAtLeastTLSv1_3(ssl->version)
  22280. #endif
  22281. ) {
  22282. /* Must be exact match. */
  22283. if (CmpEccStrength(hashAlgo, ssl->buffers.keySz) != 0)
  22284. continue;
  22285. /* Matched ECDSA exactly - set chosen and finished. */
  22286. ssl->options.hashAlgo = hashAlgo;
  22287. ssl->options.sigAlgo = sigAlgo;
  22288. ret = 0;
  22289. break;
  22290. }
  22291. #endif
  22292. /* For ECDSA the `USE_ECDSA_KEYSZ_HASH_ALGO` build option will choose a hash
  22293. * algorithm that matches the ephemeral ECDHE key size or the next highest
  22294. * available. This workaround resolves issue with some peer's that do not
  22295. * properly support scenarios such as a P-256 key hashed with SHA512.
  22296. */
  22297. #if defined(HAVE_ECC) && defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  22298. if (sigAlgo == ecc_dsa_sa_algo) {
  22299. int cmp = CmpEccStrength(hashAlgo, ssl->eccTempKeySz);
  22300. /* Keep looking if digest not strong enough. */
  22301. if (cmp < 0)
  22302. continue;
  22303. /* Looking for exact match or next highest. */
  22304. if (ret != 0 || hashAlgo <= ssl->options.hashAlgo) {
  22305. ssl->options.hashAlgo = hashAlgo;
  22306. ssl->options.sigAlgo = sigAlgo;
  22307. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  22308. ssl->namedGroup = 0;
  22309. #endif
  22310. ret = 0;
  22311. }
  22312. /* Continue looking if not the same strength. */
  22313. if (cmp > 0)
  22314. continue;
  22315. /* Exact match - finished. */
  22316. break;
  22317. }
  22318. #endif
  22319. switch (hashAlgo) {
  22320. #ifndef NO_SHA
  22321. case sha_mac:
  22322. #endif
  22323. #ifdef WOLFSSL_SHA224
  22324. case sha224_mac:
  22325. #endif
  22326. #ifndef NO_SHA256
  22327. case sha256_mac:
  22328. #endif
  22329. #ifdef WOLFSSL_SHA384
  22330. case sha384_mac:
  22331. #endif
  22332. #ifdef WOLFSSL_SHA512
  22333. case sha512_mac:
  22334. #endif
  22335. #ifdef WOLFSSL_STRONGEST_HASH_SIG
  22336. /* Is hash algorithm weaker than chosen/min? */
  22337. if (hashAlgo < ssl->options.hashAlgo)
  22338. break;
  22339. #else
  22340. /* Is hash algorithm stonger than last chosen? */
  22341. if (ret == 0 && hashAlgo > ssl->options.hashAlgo)
  22342. break;
  22343. #endif
  22344. if (IsAtLeastTLSv1_2(ssl) && !IsAtLeastTLSv1_3(ssl->version) &&
  22345. (ssl->options.side == WOLFSSL_CLIENT_END)) {
  22346. /* TLS 1.2 client deciding hash algorithm for
  22347. * CertificateVerify. Hash must be one of the handshake
  22348. * hashes being maintained. */
  22349. if (1
  22350. #ifndef NO_SHA
  22351. && (hashAlgo != sha_mac)
  22352. #endif
  22353. #ifndef NO_SHA256
  22354. && (hashAlgo != sha256_mac)
  22355. #endif
  22356. #ifdef WOLFSSL_SHA384
  22357. && (hashAlgo != sha384_mac)
  22358. #endif
  22359. #ifdef WOLFSSL_SHA512
  22360. && (hashAlgo != sha512_mac)
  22361. #endif
  22362. )
  22363. {
  22364. break;
  22365. }
  22366. }
  22367. /* The chosen one - but keep looking. */
  22368. ssl->options.hashAlgo = hashAlgo;
  22369. ssl->options.sigAlgo = sigAlgo;
  22370. ret = 0;
  22371. break;
  22372. default:
  22373. /* Support for hash algorithm not compiled in. */
  22374. break;
  22375. }
  22376. }
  22377. return ret;
  22378. }
  22379. #endif /* !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) */
  22380. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  22381. /* Initialize HandShakeInfo */
  22382. void InitHandShakeInfo(HandShakeInfo* info, WOLFSSL* ssl)
  22383. {
  22384. int i;
  22385. info->ssl = ssl;
  22386. info->cipherName[0] = 0;
  22387. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++)
  22388. info->packetNames[i][0] = 0;
  22389. info->numberPackets = 0;
  22390. info->negotiationError = 0;
  22391. }
  22392. /* Set Final HandShakeInfo parameters */
  22393. void FinishHandShakeInfo(HandShakeInfo* info)
  22394. {
  22395. int i;
  22396. int sz = GetCipherNamesSize();
  22397. for (i = 0; i < sz; i++) {
  22398. #ifndef NO_CIPHER_SUITE_ALIASES
  22399. if (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS)
  22400. continue;
  22401. #endif
  22402. if (info->ssl->options.cipherSuite ==
  22403. (byte)cipher_names[i].cipherSuite) {
  22404. if (info->ssl->options.cipherSuite0 == ECC_BYTE)
  22405. continue; /* ECC suites at end */
  22406. XSTRNCPY(info->cipherName, cipher_names[i].name, MAX_CIPHERNAME_SZ);
  22407. info->cipherName[MAX_CIPHERNAME_SZ] = '\0';
  22408. break;
  22409. }
  22410. }
  22411. /* error max and min are negative numbers */
  22412. if (info->ssl->error <= MIN_PARAM_ERR && info->ssl->error >= MAX_PARAM_ERR)
  22413. info->negotiationError = info->ssl->error;
  22414. }
  22415. /* Add name to info packet names, increase packet name count */
  22416. void AddPacketName(WOLFSSL* ssl, const char* name)
  22417. {
  22418. #ifdef WOLFSSL_CALLBACKS
  22419. HandShakeInfo* info = &ssl->handShakeInfo;
  22420. if (info->numberPackets < MAX_PACKETS_HANDSHAKE) {
  22421. char* packetName = info->packetNames[info->numberPackets];
  22422. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  22423. packetName[MAX_PACKETNAME_SZ] = '\0';
  22424. info->numberPackets++;
  22425. }
  22426. #endif
  22427. (void)ssl;
  22428. (void)name;
  22429. }
  22430. #ifdef WOLFSSL_CALLBACKS
  22431. /* Initialize TimeoutInfo */
  22432. void InitTimeoutInfo(TimeoutInfo* info)
  22433. {
  22434. XMEMSET(info, 0, sizeof(TimeoutInfo));
  22435. }
  22436. /* Free TimeoutInfo */
  22437. void FreeTimeoutInfo(TimeoutInfo* info, void* heap)
  22438. {
  22439. int i;
  22440. (void)heap;
  22441. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++) {
  22442. if (info->packets[i].bufferValue) {
  22443. XFREE(info->packets[i].bufferValue, heap, DYNAMIC_TYPE_INFO);
  22444. info->packets[i].bufferValue = NULL;
  22445. }
  22446. }
  22447. }
  22448. /* Add packet name to previously added packet info */
  22449. void AddLateName(const char* name, TimeoutInfo* info)
  22450. {
  22451. /* make sure we have a valid previous one */
  22452. if (info->numberPackets > 0 && info->numberPackets <
  22453. MAX_PACKETS_HANDSHAKE) {
  22454. char* packetName = info->packets[info->numberPackets-1].packetName;
  22455. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  22456. packetName[MAX_PACKETNAME_SZ] = '\0';
  22457. }
  22458. }
  22459. /* Add record header to previously added packet info */
  22460. void AddLateRecordHeader(const RecordLayerHeader* rl, TimeoutInfo* info)
  22461. {
  22462. /* make sure we have a valid previous one */
  22463. if (info->numberPackets > 0 && info->numberPackets <
  22464. MAX_PACKETS_HANDSHAKE) {
  22465. if (info->packets[info->numberPackets - 1].bufferValue)
  22466. XMEMCPY(info->packets[info->numberPackets - 1].bufferValue, rl,
  22467. RECORD_HEADER_SZ);
  22468. else
  22469. XMEMCPY(info->packets[info->numberPackets - 1].value, rl,
  22470. RECORD_HEADER_SZ);
  22471. }
  22472. }
  22473. #endif /* WOLFSSL_CALLBACKS */
  22474. /* Add PacketInfo to TimeoutInfo
  22475. *
  22476. * ssl WOLFSSL structure sending or receiving packet
  22477. * name name of packet being sent
  22478. * type type of packet being sent
  22479. * data data bing sent with packet
  22480. * sz size of data buffer
  22481. * lateRL save space for record layer in TimoutInfo struct
  22482. * written 1 if this packet is being written to wire, 0 if being read
  22483. * heap custom heap to use for mallocs/frees
  22484. */
  22485. int AddPacketInfo(WOLFSSL* ssl, const char* name, int type,
  22486. const byte* data, int sz, int written, int lateRL, void* heap)
  22487. {
  22488. #ifdef WOLFSSL_CALLBACKS
  22489. TimeoutInfo* info = &ssl->timeoutInfo;
  22490. if (info->numberPackets < (MAX_PACKETS_HANDSHAKE - 1)) {
  22491. WOLFSSL_TIMEVAL currTime;
  22492. int totalSz;
  22493. /* add in space for post record layer */
  22494. totalSz = sz + lateRL;
  22495. /* may add name after */
  22496. if (name) {
  22497. char* packetName = info->packets[info->numberPackets].packetName;
  22498. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  22499. packetName[MAX_PACKETNAME_SZ] = '\0';
  22500. }
  22501. /* add data, put in buffer if bigger than static buffer */
  22502. info->packets[info->numberPackets].valueSz = totalSz;
  22503. if (totalSz < MAX_VALUE_SZ) {
  22504. XMEMCPY(info->packets[info->numberPackets].value, data + lateRL,
  22505. sz);
  22506. }
  22507. else {
  22508. info->packets[info->numberPackets].bufferValue =
  22509. (byte*)XMALLOC(totalSz, heap, DYNAMIC_TYPE_INFO);
  22510. if (!info->packets[info->numberPackets].bufferValue) {
  22511. /* let next alloc catch, just don't fill, not fatal here */
  22512. info->packets[info->numberPackets].valueSz = 0;
  22513. }
  22514. else {
  22515. /* copy over data (which has the handshake header), leaving
  22516. * room for post record layer header if set */
  22517. XMEMCPY(info->packets[info->numberPackets].bufferValue +
  22518. lateRL, data, sz);
  22519. }
  22520. }
  22521. if (gettimeofday(&currTime, 0) < 0)
  22522. return SYSLIB_FAILED_E;
  22523. info->packets[info->numberPackets].timestamp.tv_sec =
  22524. currTime.tv_sec;
  22525. info->packets[info->numberPackets].timestamp.tv_usec =
  22526. currTime.tv_usec;
  22527. info->numberPackets++;
  22528. }
  22529. #endif /* WOLFSSL_CALLBACKS */
  22530. #ifdef OPENSSL_EXTRA
  22531. if ((ssl->protoMsgCb != NULL) && (sz > 0) &&
  22532. (ssl->keys.encryptionOn != 1)) {
  22533. /* version from hex to dec 16 is 16^1, 256 from 16^2 and
  22534. 4096 from 16^3 */
  22535. int version = (ssl->version.minor & 0x0F) +
  22536. ((ssl->version.minor & 0xF0) << 4) +
  22537. ((ssl->version.major & 0x0F) << 8) +
  22538. ((ssl->version.major & 0xF0) << 12);
  22539. ssl->protoMsgCb(written, version, type,
  22540. (const void *)data, (size_t)sz,
  22541. ssl, ssl->protoMsgCtx);
  22542. }
  22543. #endif /* OPENSSL_EXTRA */
  22544. (void)written;
  22545. (void)name;
  22546. (void)heap;
  22547. (void)type;
  22548. (void)ssl;
  22549. (void)lateRL;
  22550. return 0;
  22551. }
  22552. #endif /* WOLFSSL_CALLBACKS */
  22553. #if !defined(NO_CERTS)
  22554. #if defined(WOLF_PRIVATE_KEY_ID) && !defined(NO_CHECK_PRIVATE_KEY)
  22555. /* Create a private key for a device.
  22556. *
  22557. * pkey Key object.
  22558. * data Data to identify key.
  22559. * length Length of data.
  22560. * hsType Type of the key to create.
  22561. * heap Custom heap to use for mallocs/frees
  22562. * devId Id for device.
  22563. * return 0 on success.
  22564. * return NOT_COMPILED_IN if algorithm type not supported.
  22565. * return MEMORY_E on memory allocation failure.
  22566. * return other internal error
  22567. */
  22568. int CreateDevPrivateKey(void** pkey, byte* data, word32 length, int hsType,
  22569. int label, int id, void* heap, int devId)
  22570. {
  22571. int ret = NOT_COMPILED_IN;
  22572. if (hsType == DYNAMIC_TYPE_RSA) {
  22573. #ifndef NO_RSA
  22574. RsaKey* rsaKey;
  22575. rsaKey = (RsaKey*)XMALLOC(sizeof(RsaKey), heap, DYNAMIC_TYPE_RSA);
  22576. if (rsaKey == NULL) {
  22577. return MEMORY_E;
  22578. }
  22579. if (label) {
  22580. ret = wc_InitRsaKey_Label(rsaKey, (char*)data, heap, devId);
  22581. }
  22582. else if (id) {
  22583. ret = wc_InitRsaKey_Id(rsaKey, data, length, heap, devId);
  22584. }
  22585. if (ret == 0) {
  22586. *pkey = (void*)rsaKey;
  22587. }
  22588. else {
  22589. XFREE(rsaKey, heap, DYNAMIC_TYPE_RSA);
  22590. }
  22591. #endif
  22592. }
  22593. else if (hsType == DYNAMIC_TYPE_ECC) {
  22594. #ifdef HAVE_ECC
  22595. ecc_key* ecKey;
  22596. ecKey = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC);
  22597. if (ecKey == NULL) {
  22598. return MEMORY_E;
  22599. }
  22600. if (label) {
  22601. ret = wc_ecc_init_label(ecKey, (char*)data, heap, devId);
  22602. }
  22603. else if (id) {
  22604. ret = wc_ecc_init_id(ecKey, data, length, heap, devId);
  22605. }
  22606. if (ret == 0) {
  22607. *pkey = (void*)ecKey;
  22608. }
  22609. else {
  22610. XFREE(ecKey, heap, DYNAMIC_TYPE_ECC);
  22611. }
  22612. #endif
  22613. }
  22614. return ret;
  22615. }
  22616. #endif /* WOLF_PRIVATE_KEY_ID && !NO_CHECK_PRIVATE_KEY */
  22617. /* Decode the private key - RSA/ECC/Ed25519/Ed448/Falcon/Dilithium - and
  22618. * creates a key object.
  22619. *
  22620. * The signature type is set as well.
  22621. * The maximum length of a signature is returned.
  22622. *
  22623. * ssl The SSL/TLS object.
  22624. * length The length of a signature.
  22625. * returns 0 on success, otherwise failure.
  22626. */
  22627. int DecodePrivateKey(WOLFSSL *ssl, word16* length)
  22628. {
  22629. int ret = BAD_FUNC_ARG;
  22630. int keySz;
  22631. word32 idx;
  22632. /* make sure private key exists */
  22633. if (ssl->buffers.key == NULL || ssl->buffers.key->buffer == NULL) {
  22634. /* allow no private key if using external */
  22635. #ifdef WOLF_PRIVATE_KEY_ID
  22636. if (ssl->devId != INVALID_DEVID
  22637. #ifdef HAVE_PK_CALLBACKS
  22638. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  22639. #endif
  22640. ) {
  22641. *length = GetPrivateKeySigSize(ssl);
  22642. return 0;
  22643. }
  22644. else
  22645. #endif
  22646. {
  22647. WOLFSSL_MSG("Private key missing!");
  22648. ERROR_OUT(NO_PRIVATE_KEY, exit_dpk);
  22649. }
  22650. }
  22651. #ifdef WOLF_PRIVATE_KEY_ID
  22652. if (ssl->buffers.keyDevId != INVALID_DEVID && (ssl->buffers.keyId ||
  22653. ssl->buffers.keyLabel)) {
  22654. if (ssl->buffers.keyType == rsa_sa_algo)
  22655. ssl->hsType = DYNAMIC_TYPE_RSA;
  22656. else if (ssl->buffers.keyType == ecc_dsa_sa_algo)
  22657. ssl->hsType = DYNAMIC_TYPE_ECC;
  22658. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  22659. if (ret != 0) {
  22660. goto exit_dpk;
  22661. }
  22662. if (ssl->buffers.keyType == rsa_sa_algo) {
  22663. #ifndef NO_RSA
  22664. if (ssl->buffers.keyLabel) {
  22665. ret = wc_InitRsaKey_Label((RsaKey*)ssl->hsKey,
  22666. (char*)ssl->buffers.key->buffer,
  22667. ssl->heap, ssl->buffers.keyDevId);
  22668. }
  22669. else if (ssl->buffers.keyId) {
  22670. ret = wc_InitRsaKey_Id((RsaKey*)ssl->hsKey,
  22671. ssl->buffers.key->buffer,
  22672. ssl->buffers.key->length, ssl->heap,
  22673. ssl->buffers.keyDevId);
  22674. }
  22675. if (ret == 0) {
  22676. if (ssl->buffers.keySz < ssl->options.minRsaKeySz) {
  22677. WOLFSSL_MSG("RSA key size too small");
  22678. ERROR_OUT(RSA_KEY_SIZE_E, exit_dpk);
  22679. }
  22680. /* Return the maximum signature length. */
  22681. *length = (word16)ssl->buffers.keySz;
  22682. }
  22683. #else
  22684. ret = NOT_COMPILED_IN;
  22685. #endif
  22686. }
  22687. else if (ssl->buffers.keyType == ecc_dsa_sa_algo) {
  22688. #ifdef HAVE_ECC
  22689. if (ssl->buffers.keyLabel) {
  22690. ret = wc_ecc_init_label((ecc_key*)ssl->hsKey,
  22691. (char*)ssl->buffers.key->buffer,
  22692. ssl->heap, ssl->buffers.keyDevId);
  22693. }
  22694. else if (ssl->buffers.keyId) {
  22695. ret = wc_ecc_init_id((ecc_key*)ssl->hsKey,
  22696. ssl->buffers.key->buffer,
  22697. ssl->buffers.key->length, ssl->heap,
  22698. ssl->buffers.keyDevId);
  22699. }
  22700. if (ret == 0) {
  22701. if (ssl->buffers.keySz < ssl->options.minEccKeySz) {
  22702. WOLFSSL_MSG("ECC key size too small");
  22703. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  22704. }
  22705. /* Return the maximum signature length. */
  22706. *length = (word16)wc_ecc_sig_size_calc(ssl->buffers.keySz);
  22707. }
  22708. #else
  22709. ret = NOT_COMPILED_IN;
  22710. #endif
  22711. }
  22712. goto exit_dpk;
  22713. }
  22714. #endif /* WOLF_PRIVATE_KEY_ID */
  22715. #ifndef NO_RSA
  22716. if (ssl->buffers.keyType == rsa_sa_algo || ssl->buffers.keyType == 0) {
  22717. ssl->hsType = DYNAMIC_TYPE_RSA;
  22718. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  22719. if (ret != 0) {
  22720. goto exit_dpk;
  22721. }
  22722. WOLFSSL_MSG("Trying RSA private key");
  22723. /* Set start of data to beginning of buffer. */
  22724. idx = 0;
  22725. /* Decode the key assuming it is an RSA private key. */
  22726. ret = wc_RsaPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  22727. (RsaKey*)ssl->hsKey, ssl->buffers.key->length);
  22728. #ifdef WOLF_PRIVATE_KEY_ID
  22729. /* if using external key then allow using a public key */
  22730. if (ret != 0 && (ssl->devId != INVALID_DEVID
  22731. #ifdef HAVE_PK_CALLBACKS
  22732. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  22733. #endif
  22734. )) {
  22735. WOLFSSL_MSG("Trying RSA public key with crypto callbacks");
  22736. idx = 0;
  22737. ret = wc_RsaPublicKeyDecode(ssl->buffers.key->buffer, &idx,
  22738. (RsaKey*)ssl->hsKey, ssl->buffers.key->length);
  22739. }
  22740. #endif
  22741. if (ret == 0) {
  22742. WOLFSSL_MSG("Using RSA private key");
  22743. /* It worked so check it meets minimum key size requirements. */
  22744. keySz = wc_RsaEncryptSize((RsaKey*)ssl->hsKey);
  22745. if (keySz < 0) { /* check if keySz has error case */
  22746. ERROR_OUT(keySz, exit_dpk);
  22747. }
  22748. if (keySz < ssl->options.minRsaKeySz) {
  22749. WOLFSSL_MSG("RSA key size too small");
  22750. ERROR_OUT(RSA_KEY_SIZE_E, exit_dpk);
  22751. }
  22752. /* Return the maximum signature length. */
  22753. *length = (word16)keySz;
  22754. goto exit_dpk;
  22755. }
  22756. }
  22757. #endif /* !NO_RSA */
  22758. #ifdef HAVE_ECC
  22759. #ifndef NO_RSA
  22760. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  22761. #endif /* !NO_RSA */
  22762. if (ssl->buffers.keyType == ecc_dsa_sa_algo || ssl->buffers.keyType == 0) {
  22763. ssl->hsType = DYNAMIC_TYPE_ECC;
  22764. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  22765. if (ret != 0) {
  22766. goto exit_dpk;
  22767. }
  22768. #ifndef NO_RSA
  22769. WOLFSSL_MSG("Trying ECC private key, RSA didn't work");
  22770. #else
  22771. WOLFSSL_MSG("Trying ECC private key");
  22772. #endif
  22773. /* Set start of data to beginning of buffer. */
  22774. idx = 0;
  22775. /* Decode the key assuming it is an ECC private key. */
  22776. ret = wc_EccPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  22777. (ecc_key*)ssl->hsKey,
  22778. ssl->buffers.key->length);
  22779. #ifdef WOLF_PRIVATE_KEY_ID
  22780. /* if using external key then allow using a public key */
  22781. if (ret != 0 && (ssl->devId != INVALID_DEVID
  22782. #ifdef HAVE_PK_CALLBACKS
  22783. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  22784. #endif
  22785. )) {
  22786. WOLFSSL_MSG("Trying ECC public key with crypto callbacks");
  22787. idx = 0;
  22788. ret = wc_EccPublicKeyDecode(ssl->buffers.key->buffer, &idx,
  22789. (ecc_key*)ssl->hsKey,
  22790. ssl->buffers.key->length);
  22791. }
  22792. #endif
  22793. if (ret == 0) {
  22794. WOLFSSL_MSG("Using ECC private key");
  22795. /* Check it meets the minimum ECC key size requirements. */
  22796. keySz = wc_ecc_size((ecc_key*)ssl->hsKey);
  22797. if (keySz < ssl->options.minEccKeySz) {
  22798. WOLFSSL_MSG("ECC key size too small");
  22799. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  22800. }
  22801. /* Return the maximum signature length. */
  22802. *length = (word16)wc_ecc_sig_size((ecc_key*)ssl->hsKey);
  22803. goto exit_dpk;
  22804. }
  22805. }
  22806. #endif
  22807. #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
  22808. #if !defined(NO_RSA) || defined(HAVE_ECC)
  22809. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  22810. #endif
  22811. if (ssl->buffers.keyType == ed25519_sa_algo || ssl->buffers.keyType == 0) {
  22812. ssl->hsType = DYNAMIC_TYPE_ED25519;
  22813. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  22814. if (ret != 0) {
  22815. goto exit_dpk;
  22816. }
  22817. #ifdef HAVE_ECC
  22818. WOLFSSL_MSG("Trying ED25519 private key, ECC didn't work");
  22819. #elif !defined(NO_RSA)
  22820. WOLFSSL_MSG("Trying ED25519 private key, RSA didn't work");
  22821. #else
  22822. WOLFSSL_MSG("Trying ED25519 private key");
  22823. #endif
  22824. /* Set start of data to beginning of buffer. */
  22825. idx = 0;
  22826. /* Decode the key assuming it is an ED25519 private key. */
  22827. ret = wc_Ed25519PrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  22828. (ed25519_key*)ssl->hsKey,
  22829. ssl->buffers.key->length);
  22830. #ifdef WOLF_PRIVATE_KEY_ID
  22831. /* if using external key then allow using a public key */
  22832. if (ret != 0 && (ssl->devId != INVALID_DEVID
  22833. #ifdef HAVE_PK_CALLBACKS
  22834. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  22835. #endif
  22836. )) {
  22837. WOLFSSL_MSG("Trying ED25519 public key with crypto callbacks");
  22838. idx = 0;
  22839. ret = wc_Ed25519PublicKeyDecode(ssl->buffers.key->buffer, &idx,
  22840. (ed25519_key*)ssl->hsKey,
  22841. ssl->buffers.key->length);
  22842. }
  22843. #endif
  22844. if (ret == 0) {
  22845. WOLFSSL_MSG("Using ED25519 private key");
  22846. /* Check it meets the minimum ECC key size requirements. */
  22847. if (ED25519_KEY_SIZE < ssl->options.minEccKeySz) {
  22848. WOLFSSL_MSG("ED25519 key size too small");
  22849. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  22850. }
  22851. /* Return the maximum signature length. */
  22852. *length = ED25519_SIG_SIZE;
  22853. goto exit_dpk;
  22854. }
  22855. }
  22856. #endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */
  22857. #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
  22858. #if !defined(NO_RSA) || defined(HAVE_ECC)
  22859. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  22860. #endif
  22861. if (ssl->buffers.keyType == ed448_sa_algo || ssl->buffers.keyType == 0) {
  22862. ssl->hsType = DYNAMIC_TYPE_ED448;
  22863. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  22864. if (ret != 0) {
  22865. goto exit_dpk;
  22866. }
  22867. #ifdef HAVE_ED25519
  22868. WOLFSSL_MSG("Trying ED448 private key, ED25519 didn't work");
  22869. #elif defined(HAVE_ECC)
  22870. WOLFSSL_MSG("Trying ED448 private key, ECC didn't work");
  22871. #elif !defined(NO_RSA)
  22872. WOLFSSL_MSG("Trying ED448 private key, RSA didn't work");
  22873. #else
  22874. WOLFSSL_MSG("Trying ED448 private key");
  22875. #endif
  22876. /* Set start of data to beginning of buffer. */
  22877. idx = 0;
  22878. /* Decode the key assuming it is an ED448 private key. */
  22879. ret = wc_Ed448PrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  22880. (ed448_key*)ssl->hsKey,
  22881. ssl->buffers.key->length);
  22882. #ifdef WOLF_PRIVATE_KEY_ID
  22883. /* if using external key then allow using a public key */
  22884. if (ret != 0 && (ssl->devId != INVALID_DEVID
  22885. #ifdef HAVE_PK_CALLBACKS
  22886. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  22887. #endif
  22888. )) {
  22889. WOLFSSL_MSG("Trying ED25519 public key with crypto callbacks");
  22890. idx = 0;
  22891. ret = wc_Ed448PublicKeyDecode(ssl->buffers.key->buffer, &idx,
  22892. (ed448_key*)ssl->hsKey,
  22893. ssl->buffers.key->length);
  22894. }
  22895. #endif
  22896. if (ret == 0) {
  22897. WOLFSSL_MSG("Using ED448 private key");
  22898. /* Check it meets the minimum ECC key size requirements. */
  22899. if (ED448_KEY_SIZE < ssl->options.minEccKeySz) {
  22900. WOLFSSL_MSG("ED448 key size too small");
  22901. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  22902. }
  22903. /* Return the maximum signature length. */
  22904. *length = ED448_SIG_SIZE;
  22905. goto exit_dpk;
  22906. }
  22907. }
  22908. #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */
  22909. #if defined(HAVE_PQC)
  22910. #if defined(HAVE_FALCON)
  22911. if (ssl->buffers.keyType == falcon_level1_sa_algo ||
  22912. ssl->buffers.keyType == falcon_level5_sa_algo ||
  22913. ssl->buffers.keyType == 0) {
  22914. ssl->hsType = DYNAMIC_TYPE_FALCON;
  22915. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  22916. if (ret != 0) {
  22917. goto exit_dpk;
  22918. }
  22919. if (ssl->buffers.keyType == falcon_level1_sa_algo) {
  22920. ret = wc_falcon_set_level((falcon_key*)ssl->hsKey, 1);
  22921. }
  22922. else if (ssl->buffers.keyType == falcon_level5_sa_algo) {
  22923. ret = wc_falcon_set_level((falcon_key*)ssl->hsKey, 5);
  22924. }
  22925. else {
  22926. /* What if ssl->buffers.keyType is 0? We might want to do something
  22927. * more graceful here. */
  22928. ret = ALGO_ID_E;
  22929. }
  22930. if (ret != 0) {
  22931. goto exit_dpk;
  22932. }
  22933. #if defined(HAVE_ED448)
  22934. WOLFSSL_MSG("Trying Falcon private key, ED448 didn't work");
  22935. #elif defined(HAVE_ED25519)
  22936. WOLFSSL_MSG("Trying Falcon private key, ED25519 didn't work");
  22937. #elif defined(HAVE_ECC)
  22938. WOLFSSL_MSG("Trying Falcon private key, ECC didn't work");
  22939. #elif !defined(NO_RSA)
  22940. WOLFSSL_MSG("Trying Falcon private key, RSA didn't work");
  22941. #else
  22942. WOLFSSL_MSG("Trying Falcon private key");
  22943. #endif
  22944. /* Set start of data to beginning of buffer. */
  22945. idx = 0;
  22946. /* Decode the key assuming it is a Falcon private key. */
  22947. ret = wc_falcon_import_private_only(ssl->buffers.key->buffer,
  22948. ssl->buffers.key->length,
  22949. (falcon_key*)ssl->hsKey);
  22950. if (ret == 0) {
  22951. WOLFSSL_MSG("Using Falcon private key");
  22952. /* Check it meets the minimum Falcon key size requirements. */
  22953. if (FALCON_MAX_KEY_SIZE < ssl->options.minFalconKeySz) {
  22954. WOLFSSL_MSG("Falcon key size too small");
  22955. ERROR_OUT(FALCON_KEY_SIZE_E, exit_dpk);
  22956. }
  22957. /* Return the maximum signature length. */
  22958. *length = FALCON_MAX_SIG_SIZE;
  22959. goto exit_dpk;
  22960. }
  22961. }
  22962. #endif /* HAVE_FALCON */
  22963. #if defined(HAVE_DILITHIUM)
  22964. if (ssl->buffers.keyType == dilithium_level2_sa_algo ||
  22965. ssl->buffers.keyType == dilithium_level3_sa_algo ||
  22966. ssl->buffers.keyType == dilithium_level5_sa_algo ||
  22967. ssl->buffers.keyType == 0) {
  22968. ssl->hsType = DYNAMIC_TYPE_DILITHIUM;
  22969. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  22970. if (ret != 0) {
  22971. goto exit_dpk;
  22972. }
  22973. if (ssl->buffers.keyType == dilithium_level2_sa_algo) {
  22974. ret = wc_dilithium_set_level((dilithium_key*)ssl->hsKey, 2);
  22975. }
  22976. else if (ssl->buffers.keyType == dilithium_level3_sa_algo) {
  22977. ret = wc_dilithium_set_level((dilithium_key*)ssl->hsKey, 3);
  22978. }
  22979. else if (ssl->buffers.keyType == dilithium_level5_sa_algo) {
  22980. ret = wc_dilithium_set_level((dilithium_key*)ssl->hsKey, 5);
  22981. }
  22982. else {
  22983. /* What if ssl->buffers.keyType is 0? We might want to do something
  22984. * more graceful here. */
  22985. ret = ALGO_ID_E;
  22986. }
  22987. if (ret != 0) {
  22988. goto exit_dpk;
  22989. }
  22990. #if defined(HAVE_ED448)
  22991. WOLFSSL_MSG("Trying Dilithium private key, ED448 didn't work");
  22992. #elif defined(HAVE_ED25519)
  22993. WOLFSSL_MSG("Trying Dilithium private key, ED25519 didn't work");
  22994. #elif defined(HAVE_ECC)
  22995. WOLFSSL_MSG("Trying Dilithium private key, ECC didn't work");
  22996. #elif !defined(NO_RSA)
  22997. WOLFSSL_MSG("Trying Dilithium private key, RSA didn't work");
  22998. #elif defined(HAVE_FALCON)
  22999. WOLFSSL_MSG("Trying Dilithium private key, Falcon didn't work");
  23000. #else
  23001. WOLFSSL_MSG("Trying Dilithium private key");
  23002. #endif
  23003. /* Set start of data to beginning of buffer. */
  23004. idx = 0;
  23005. /* Decode the key assuming it is a Dilithium private key. */
  23006. ret = wc_dilithium_import_private_only(ssl->buffers.key->buffer,
  23007. ssl->buffers.key->length,
  23008. (dilithium_key*)ssl->hsKey);
  23009. if (ret == 0) {
  23010. WOLFSSL_MSG("Using Dilithium private key");
  23011. /* Check it meets the minimum Dilithium key size requirements. */
  23012. if (DILITHIUM_MAX_KEY_SIZE < ssl->options.minDilithiumKeySz) {
  23013. WOLFSSL_MSG("Dilithium key size too small");
  23014. ERROR_OUT(DILITHIUM_KEY_SIZE_E, exit_dpk);
  23015. }
  23016. /* Return the maximum signature length. */
  23017. *length = DILITHIUM_MAX_SIG_SIZE;
  23018. goto exit_dpk;
  23019. }
  23020. }
  23021. #endif /* HAVE_DILITHIUM */
  23022. #endif /* HAVE_PQC */
  23023. (void)idx;
  23024. (void)keySz;
  23025. (void)length;
  23026. exit_dpk:
  23027. if (ret != 0) {
  23028. WOLFSSL_ERROR_VERBOSE(ret);
  23029. }
  23030. return ret;
  23031. }
  23032. #endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
  23033. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12)
  23034. /* returns 1 if able to do TLS 1.3 otherwise 0 */
  23035. int TLSv1_3_Capable(WOLFSSL* ssl)
  23036. {
  23037. #ifndef WOLFSSL_TLS13
  23038. return 0;
  23039. #else
  23040. int ret = 0;
  23041. if (IsAtLeastTLSv1_3(ssl->ctx->method->version)) {
  23042. ret = 1;
  23043. }
  23044. if ((wolfSSL_get_options(ssl) & WOLFSSL_OP_NO_TLSv1_3)) {
  23045. /* option set at run time to disable TLS 1.3 */
  23046. ret = 0;
  23047. }
  23048. return ret;
  23049. #endif
  23050. }
  23051. #endif /* WOLFSSL_TLS13 */
  23052. #ifndef WOLFSSL_NO_TLS12
  23053. #if (!defined(NO_WOLFSSL_CLIENT) && (!defined(NO_DH) || defined(HAVE_ECC) || \
  23054. defined(HAVE_CURVE25519) || defined(HAVE_CURVE448))) || \
  23055. (!defined(NO_WOLFSSL_SERVER) && (defined(HAVE_ECC) || \
  23056. ((defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) && \
  23057. (defined(HAVE_ED25519) || defined(HAVE_ED448) || !defined(NO_RSA)))) || \
  23058. (!defined(NO_DH) && (!defined(NO_RSA) || defined(HAVE_ANON))))
  23059. static int HashSkeData(WOLFSSL* ssl, enum wc_HashType hashType,
  23060. const byte* data, int sz, byte sigAlgo)
  23061. {
  23062. int ret = 0;
  23063. int digest_sz = wc_HashGetDigestSize(hashType);
  23064. if (digest_sz <= 0) {
  23065. ret = BUFFER_ERROR;
  23066. }
  23067. if (ret == 0) {
  23068. /* buffer for signature */
  23069. ssl->buffers.sig.buffer = (byte*)XMALLOC(SEED_LEN + sz, ssl->heap,
  23070. DYNAMIC_TYPE_SIGNATURE);
  23071. if (ssl->buffers.sig.buffer == NULL) {
  23072. ret = MEMORY_E;
  23073. }
  23074. }
  23075. if (ret == 0) {
  23076. ssl->buffers.sig.length = SEED_LEN + sz;
  23077. /* build message to hash */
  23078. XMEMCPY(ssl->buffers.sig.buffer, ssl->arrays->clientRandom, RAN_LEN);
  23079. XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN], ssl->arrays->serverRandom,
  23080. RAN_LEN);
  23081. /* message */
  23082. XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN * 2], data, sz);
  23083. }
  23084. if (ret == 0 && sigAlgo != ed25519_sa_algo && sigAlgo != ed448_sa_algo) {
  23085. ssl->buffers.digest.length = (unsigned int)digest_sz;
  23086. /* buffer for hash */
  23087. if (!ssl->buffers.digest.buffer) {
  23088. if (!ssl->options.dontFreeDigest) {
  23089. XFREE(ssl->buffers.digest.buffer, ssl->heap,
  23090. DYNAMIC_TYPE_DIGEST);
  23091. }
  23092. }
  23093. ssl->options.dontFreeDigest = 0;
  23094. ssl->buffers.digest.buffer = (byte*)XMALLOC(ssl->buffers.digest.length,
  23095. ssl->heap, DYNAMIC_TYPE_DIGEST);
  23096. if (ssl->buffers.digest.buffer == NULL) {
  23097. ret = MEMORY_E;
  23098. }
  23099. }
  23100. if (ret == 0 && sigAlgo != ed25519_sa_algo && sigAlgo != ed448_sa_algo) {
  23101. /* Perform hash. Only wc_Hash supports MD5_SHA1. */
  23102. ret = wc_Hash(hashType, ssl->buffers.sig.buffer,
  23103. ssl->buffers.sig.length,
  23104. ssl->buffers.digest.buffer,
  23105. ssl->buffers.digest.length);
  23106. #ifdef HAVE_PK_CALLBACKS
  23107. if (ssl->ctx->ProcessServerSigKexCb == NULL)
  23108. #endif
  23109. {
  23110. /* No further processing will be done. It can be freed. */
  23111. XFREE(ssl->buffers.sig.buffer, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  23112. ssl->buffers.sig.buffer = NULL;
  23113. }
  23114. }
  23115. return ret;
  23116. }
  23117. #endif
  23118. #endif /* !WOLFSSL_NO_TLS12 */
  23119. /* client only parts */
  23120. #ifndef NO_WOLFSSL_CLIENT
  23121. #ifndef WOLFSSL_NO_TLS12
  23122. /* handle generation of client_hello (1) */
  23123. int SendClientHello(WOLFSSL* ssl)
  23124. {
  23125. byte *output;
  23126. word32 length, idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  23127. int sendSz;
  23128. int idSz;
  23129. int ret;
  23130. word16 extSz = 0;
  23131. const Suites* suites;
  23132. if (ssl == NULL) {
  23133. return BAD_FUNC_ARG;
  23134. }
  23135. idSz = ssl->options.resuming ? ssl->session->sessionIDSz : 0;
  23136. #ifdef WOLFSSL_TLS13
  23137. if (IsAtLeastTLSv1_3(ssl->version))
  23138. return SendTls13ClientHello(ssl);
  23139. #endif
  23140. WOLFSSL_START(WC_FUNC_CLIENT_HELLO_SEND);
  23141. WOLFSSL_ENTER("SendClientHello");
  23142. suites = WOLFSSL_SUITES(ssl);
  23143. if (suites == NULL) {
  23144. WOLFSSL_MSG("Bad suites pointer in SendClientHello");
  23145. return SUITES_ERROR;
  23146. }
  23147. #ifdef HAVE_SESSION_TICKET
  23148. if (ssl->options.resuming && ssl->session->ticketLen > 0) {
  23149. SessionTicket* ticket;
  23150. ticket = TLSX_SessionTicket_Create(0, ssl->session->ticket,
  23151. ssl->session->ticketLen, ssl->heap);
  23152. if (ticket == NULL) return MEMORY_E;
  23153. ret = TLSX_UseSessionTicket(&ssl->extensions, ticket, ssl->heap);
  23154. if (ret != WOLFSSL_SUCCESS) {
  23155. TLSX_SessionTicket_Free(ticket, ssl->heap);
  23156. return ret;
  23157. }
  23158. idSz = 0;
  23159. }
  23160. #endif
  23161. length = VERSION_SZ + RAN_LEN
  23162. + idSz + ENUM_LEN
  23163. + SUITE_LEN
  23164. + COMP_LEN + ENUM_LEN;
  23165. #ifndef NO_FORCE_SCR_SAME_SUITE
  23166. if (IsSCR(ssl))
  23167. length += SUITE_LEN;
  23168. else
  23169. #endif
  23170. length += suites->suiteSz;
  23171. #ifdef HAVE_TLS_EXTENSIONS
  23172. /* auto populate extensions supported unless user defined */
  23173. if ((ret = TLSX_PopulateExtensions(ssl, 0)) != 0)
  23174. return ret;
  23175. extSz = 0;
  23176. ret = TLSX_GetRequestSize(ssl, client_hello, &extSz);
  23177. if (ret != 0)
  23178. return ret;
  23179. length += extSz;
  23180. #else
  23181. if (IsAtLeastTLSv1_2(ssl) && suites->hashSigAlgoSz)
  23182. extSz += HELLO_EXT_SZ + HELLO_EXT_SIGALGO_SZ
  23183. + suites->hashSigAlgoSz;
  23184. #ifdef HAVE_EXTENDED_MASTER
  23185. if (ssl->options.haveEMS)
  23186. extSz += HELLO_EXT_SZ;
  23187. #endif
  23188. if (extSz != 0)
  23189. length += extSz + HELLO_EXT_SZ_SZ;
  23190. #endif
  23191. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  23192. if (ssl->arrays == NULL) {
  23193. return BAD_FUNC_ARG;
  23194. }
  23195. #ifdef WOLFSSL_DTLS
  23196. if (ssl->options.dtls) {
  23197. length += ENUM_LEN; /* cookie */
  23198. if (ssl->arrays->cookieSz != 0) length += ssl->arrays->cookieSz;
  23199. sendSz = length + DTLS_HANDSHAKE_HEADER_SZ + DTLS_RECORD_HEADER_SZ;
  23200. idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  23201. }
  23202. #endif
  23203. if (IsEncryptionOn(ssl, 1))
  23204. sendSz += MAX_MSG_EXTRA;
  23205. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  23206. * is not advanced yet */
  23207. ssl->options.buildingMsg = 1;
  23208. /* check for available size */
  23209. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  23210. return ret;
  23211. /* get output buffer */
  23212. output = ssl->buffers.outputBuffer.buffer +
  23213. ssl->buffers.outputBuffer.length;
  23214. AddHeaders(output, length, client_hello, ssl);
  23215. /* client hello, first version */
  23216. output[idx++] = ssl->version.major;
  23217. output[idx++] = ssl->version.minor;
  23218. ssl->chVersion = ssl->version; /* store in case changed */
  23219. /* then random */
  23220. if (ssl->options.connectState == CONNECT_BEGIN) {
  23221. ret = wc_RNG_GenerateBlock(ssl->rng, output + idx, RAN_LEN);
  23222. if (ret != 0)
  23223. return ret;
  23224. /* store random */
  23225. XMEMCPY(ssl->arrays->clientRandom, output + idx, RAN_LEN);
  23226. } else {
  23227. #ifdef WOLFSSL_DTLS
  23228. /* send same random on hello again */
  23229. XMEMCPY(output + idx, ssl->arrays->clientRandom, RAN_LEN);
  23230. #endif
  23231. }
  23232. idx += RAN_LEN;
  23233. /* then session id */
  23234. output[idx++] = (byte)idSz;
  23235. if (idSz) {
  23236. XMEMCPY(output + idx, ssl->session->sessionID,
  23237. ssl->session->sessionIDSz);
  23238. idx += ssl->session->sessionIDSz;
  23239. }
  23240. /* then DTLS cookie */
  23241. #ifdef WOLFSSL_DTLS
  23242. if (ssl->options.dtls) {
  23243. byte cookieSz = ssl->arrays->cookieSz;
  23244. output[idx++] = cookieSz;
  23245. if (cookieSz) {
  23246. XMEMCPY(&output[idx], ssl->arrays->cookie, cookieSz);
  23247. idx += cookieSz;
  23248. }
  23249. }
  23250. #endif
  23251. #ifndef NO_FORCE_SCR_SAME_SUITE
  23252. if (IsSCR(ssl)) {
  23253. c16toa(SUITE_LEN, output + idx);
  23254. idx += OPAQUE16_LEN;
  23255. output[idx++] = ssl->options.cipherSuite0;
  23256. output[idx++] = ssl->options.cipherSuite;
  23257. }
  23258. else
  23259. #endif
  23260. {
  23261. /* then cipher suites */
  23262. c16toa(suites->suiteSz, output + idx);
  23263. idx += OPAQUE16_LEN;
  23264. XMEMCPY(output + idx, &suites->suites, suites->suiteSz);
  23265. idx += suites->suiteSz;
  23266. }
  23267. /* last, compression */
  23268. output[idx++] = COMP_LEN;
  23269. if (ssl->options.usingCompression)
  23270. output[idx++] = ZLIB_COMPRESSION;
  23271. else
  23272. output[idx++] = NO_COMPRESSION;
  23273. #ifdef HAVE_TLS_EXTENSIONS
  23274. extSz = 0;
  23275. ret = TLSX_WriteRequest(ssl, output + idx, client_hello, &extSz);
  23276. if (ret != 0)
  23277. return ret;
  23278. idx += extSz;
  23279. (void)idx; /* suppress analyzer warning, keep idx current */
  23280. #else
  23281. if (extSz != 0) {
  23282. c16toa(extSz, output + idx);
  23283. idx += HELLO_EXT_SZ_SZ;
  23284. if (IsAtLeastTLSv1_2(ssl)) {
  23285. if (suites->hashSigAlgoSz) {
  23286. word16 i;
  23287. /* extension type */
  23288. c16toa(HELLO_EXT_SIG_ALGO, output + idx);
  23289. idx += HELLO_EXT_TYPE_SZ;
  23290. /* extension data length */
  23291. c16toa(HELLO_EXT_SIGALGO_SZ + suites->hashSigAlgoSz,
  23292. output + idx);
  23293. idx += HELLO_EXT_SZ_SZ;
  23294. /* sig algos length */
  23295. c16toa(suites->hashSigAlgoSz, output + idx);
  23296. idx += HELLO_EXT_SIGALGO_SZ;
  23297. for (i=0; i < suites->hashSigAlgoSz; i++, idx++) {
  23298. output[idx] = suites->hashSigAlgo[i];
  23299. }
  23300. }
  23301. }
  23302. #ifdef HAVE_EXTENDED_MASTER
  23303. if (ssl->options.haveEMS) {
  23304. c16toa(HELLO_EXT_EXTMS, output + idx);
  23305. idx += HELLO_EXT_TYPE_SZ;
  23306. c16toa(0, output + idx);
  23307. idx += HELLO_EXT_SZ_SZ;
  23308. }
  23309. #endif
  23310. }
  23311. #endif
  23312. if (IsEncryptionOn(ssl, 1)) {
  23313. byte* input;
  23314. int inputSz = idx; /* build msg adds rec hdr */
  23315. int recordHeaderSz = RECORD_HEADER_SZ;
  23316. if (ssl->options.dtls)
  23317. recordHeaderSz += DTLS_RECORD_EXTRA;
  23318. inputSz -= recordHeaderSz;
  23319. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  23320. if (input == NULL)
  23321. return MEMORY_E;
  23322. XMEMCPY(input, output + recordHeaderSz, inputSz);
  23323. #ifdef WOLFSSL_DTLS
  23324. if (IsDtlsNotSctpMode(ssl) &&
  23325. (ret = DtlsMsgPoolSave(ssl, input, inputSz, client_hello)) != 0) {
  23326. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  23327. return ret;
  23328. }
  23329. #endif
  23330. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  23331. handshake, 1, 0, 0, CUR_ORDER);
  23332. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  23333. if (sendSz < 0)
  23334. return sendSz;
  23335. } else {
  23336. #ifdef WOLFSSL_DTLS
  23337. if (IsDtlsNotSctpMode(ssl)) {
  23338. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, client_hello)) != 0)
  23339. return ret;
  23340. }
  23341. if (ssl->options.dtls)
  23342. DtlsSEQIncrement(ssl, CUR_ORDER);
  23343. #endif
  23344. ret = HashOutput(ssl, output, sendSz, 0);
  23345. if (ret != 0)
  23346. return ret;
  23347. }
  23348. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  23349. #ifdef OPENSSL_EXTRA
  23350. ssl->cbmode = SSL_CB_MODE_WRITE;
  23351. if (ssl->CBIS != NULL)
  23352. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, WOLFSSL_SUCCESS);
  23353. #endif
  23354. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  23355. if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
  23356. if (ssl->toInfoOn) {
  23357. ret = AddPacketInfo(ssl, "ClientHello", handshake, output, sendSz,
  23358. WRITE_PROTO, 0, ssl->heap);
  23359. if (ret != 0)
  23360. return ret;
  23361. }
  23362. #endif
  23363. ssl->options.buildingMsg = 0;
  23364. ssl->buffers.outputBuffer.length += sendSz;
  23365. ret = SendBuffered(ssl);
  23366. WOLFSSL_LEAVE("SendClientHello", ret);
  23367. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_SEND);
  23368. return ret;
  23369. }
  23370. /* handle processing of DTLS hello_verify_request (3) */
  23371. int DoHelloVerifyRequest(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  23372. word32 size)
  23373. {
  23374. ProtocolVersion pv;
  23375. byte cookieSz;
  23376. word32 begin = *inOutIdx;
  23377. #ifdef WOLFSSL_CALLBACKS
  23378. if (ssl->hsInfoOn) AddPacketName(ssl, "HelloVerifyRequest");
  23379. if (ssl->toInfoOn) AddLateName("HelloVerifyRequest", &ssl->timeoutInfo);
  23380. #endif
  23381. #ifdef WOLFSSL_DTLS
  23382. if (ssl->options.dtls) {
  23383. DtlsMsgPoolReset(ssl);
  23384. }
  23385. #endif
  23386. if (OPAQUE16_LEN + OPAQUE8_LEN > size)
  23387. return BUFFER_ERROR;
  23388. XMEMCPY(&pv, input + *inOutIdx, OPAQUE16_LEN);
  23389. *inOutIdx += OPAQUE16_LEN;
  23390. if (pv.major != DTLS_MAJOR ||
  23391. (pv.minor != DTLS_MINOR && pv.minor != DTLSv1_2_MINOR))
  23392. return VERSION_ERROR;
  23393. cookieSz = input[(*inOutIdx)++];
  23394. if (cookieSz) {
  23395. if ((*inOutIdx - begin) + cookieSz > size)
  23396. return BUFFER_ERROR;
  23397. #ifdef WOLFSSL_DTLS
  23398. if (cookieSz <= MAX_COOKIE_LEN) {
  23399. XMEMCPY(ssl->arrays->cookie, input + *inOutIdx, cookieSz);
  23400. ssl->arrays->cookieSz = cookieSz;
  23401. }
  23402. #endif
  23403. *inOutIdx += cookieSz;
  23404. }
  23405. #if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_TLS13)
  23406. if (IsAtLeastTLSv1_3(ssl->version) && ssl->options.dtls) {
  23407. /* we sent a TLSv1.3 ClientHello but received a
  23408. * HELLO_VERIFY_REQUEST */
  23409. if (!ssl->options.downgrade ||
  23410. ssl->options.minDowngrade < pv.minor)
  23411. return VERSION_ERROR;
  23412. }
  23413. #endif /* defined(WOLFSSL_DTLS13) && defined(WOLFSSL_TLS13) */
  23414. ssl->options.serverState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  23415. return 0;
  23416. }
  23417. static WC_INLINE int DSH_CheckSessionId(WOLFSSL* ssl)
  23418. {
  23419. int ret = 0;
  23420. #ifdef HAVE_SECRET_CALLBACK
  23421. /* If a session secret callback exists, we are using that
  23422. * key instead of the saved session key. Requires a ticket. */
  23423. ret = ret || (ssl->sessionSecretCb != NULL
  23424. #ifdef HAVE_SESSION_TICKET
  23425. && ssl->session->ticketLen > 0
  23426. #endif
  23427. );
  23428. #endif
  23429. #ifdef HAVE_SESSION_TICKET
  23430. /* server may send blank ticket which may not be expected to indicate
  23431. * existing one ok but will also be sending a new one */
  23432. ret = ret || (ssl->session->ticketLen > 0);
  23433. #endif
  23434. ret = ret ||
  23435. (ssl->options.haveSessionId && XMEMCMP(ssl->arrays->sessionID,
  23436. ssl->session->sessionID, ID_LEN) == 0);
  23437. return ret;
  23438. }
  23439. /* Check the version in the received message is valid and set protocol
  23440. * version to use.
  23441. *
  23442. * ssl The SSL/TLS object.
  23443. * pv The protocol version from the packet.
  23444. * returns 0 on success, otherwise failure.
  23445. */
  23446. int CheckVersion(WOLFSSL *ssl, ProtocolVersion pv)
  23447. {
  23448. byte lowerVersion, higherVersion;
  23449. #ifdef WOLFSSL_TLS13_DRAFT
  23450. if (pv.major == TLS_DRAFT_MAJOR) {
  23451. pv.major = SSLv3_MAJOR;
  23452. pv.minor = TLSv1_3_MINOR;
  23453. }
  23454. #endif
  23455. #ifdef OPENSSL_EXTRA
  23456. if (ssl->CBIS != NULL) {
  23457. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_START, WOLFSSL_SUCCESS);
  23458. }
  23459. #endif
  23460. if (ssl->options.dtls) {
  23461. if (pv.major != DTLS_MAJOR || pv.minor == DTLS_BOGUS_MINOR) {
  23462. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  23463. return VERSION_ERROR;
  23464. }
  23465. lowerVersion = pv.minor > ssl->version.minor;
  23466. higherVersion = pv.minor < ssl->version.minor;
  23467. }
  23468. else {
  23469. if (pv.major != SSLv3_MAJOR) {
  23470. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  23471. return VERSION_ERROR;
  23472. }
  23473. lowerVersion = pv.minor < ssl->version.minor;
  23474. higherVersion = pv.minor > ssl->version.minor;
  23475. }
  23476. if (higherVersion) {
  23477. WOLFSSL_MSG("Server using higher version, fatal error");
  23478. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  23479. return VERSION_ERROR;
  23480. }
  23481. if (lowerVersion) {
  23482. WOLFSSL_MSG("server using lower version");
  23483. /* Check for downgrade attack. */
  23484. if (!ssl->options.downgrade) {
  23485. WOLFSSL_MSG("\tno downgrade allowed, fatal error");
  23486. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  23487. return VERSION_ERROR;
  23488. }
  23489. if ((!ssl->options.dtls && pv.minor < ssl->options.minDowngrade) ||
  23490. (ssl->options.dtls && pv.minor > ssl->options.minDowngrade)) {
  23491. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  23492. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  23493. return VERSION_ERROR;
  23494. }
  23495. #ifdef HAVE_SECURE_RENEGOTIATION
  23496. if (ssl->secure_renegotiation &&
  23497. ssl->secure_renegotiation->enabled &&
  23498. ssl->options.handShakeDone) {
  23499. WOLFSSL_MSG("Server changed version during scr");
  23500. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  23501. return VERSION_ERROR;
  23502. }
  23503. #endif
  23504. /* Checks made - OK to downgrade. */
  23505. ssl->version.minor = pv.minor;
  23506. switch(pv.minor) {
  23507. case SSLv3_MINOR:
  23508. /* turn off tls */
  23509. WOLFSSL_MSG("\tdowngrading to SSLv3");
  23510. ssl->options.tls = 0;
  23511. ssl->options.tls1_1 = 0;
  23512. break;
  23513. case TLSv1_MINOR:
  23514. /* turn off tls 1.1+ */
  23515. WOLFSSL_MSG("\tdowngrading to TLSv1");
  23516. ssl->options.tls1_1 = 0;
  23517. break;
  23518. case TLSv1_1_MINOR:
  23519. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  23520. break;
  23521. case DTLS_MINOR:
  23522. WOLFSSL_MSG("\tdowngrading to DTLSv1.1");
  23523. break;
  23524. case TLSv1_2_MINOR:
  23525. WOLFSSL_MSG("\tdowngrading to TLSv1.2");
  23526. break;
  23527. case DTLSv1_2_MINOR:
  23528. WOLFSSL_MSG("\tdowngrading to DTLSv1.2");
  23529. break;
  23530. default:
  23531. WOLFSSL_MSG("\tbad minor version");
  23532. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  23533. return VERSION_ERROR;
  23534. }
  23535. }
  23536. /* check if option is set to not allow the current version
  23537. * set from either wolfSSL_set_options or wolfSSL_CTX_set_options */
  23538. if (!ssl->options.dtls && ssl->options.downgrade &&
  23539. ssl->options.mask > 0) {
  23540. if (ssl->version.minor == TLSv1_2_MINOR &&
  23541. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) ==
  23542. WOLFSSL_OP_NO_TLSv1_2) {
  23543. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  23544. ssl->version.minor = TLSv1_1_MINOR;
  23545. }
  23546. if (ssl->version.minor == TLSv1_1_MINOR &&
  23547. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) ==
  23548. WOLFSSL_OP_NO_TLSv1_1) {
  23549. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  23550. ssl->options.tls1_1 = 0;
  23551. ssl->version.minor = TLSv1_MINOR;
  23552. }
  23553. if (ssl->version.minor == TLSv1_MINOR &&
  23554. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) ==
  23555. WOLFSSL_OP_NO_TLSv1) {
  23556. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  23557. ssl->options.tls = 0;
  23558. ssl->options.tls1_1 = 0;
  23559. ssl->version.minor = SSLv3_MINOR;
  23560. }
  23561. if (ssl->version.minor == SSLv3_MINOR &&
  23562. (ssl->options.mask & WOLFSSL_OP_NO_SSLv3) ==
  23563. WOLFSSL_OP_NO_SSLv3) {
  23564. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  23565. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  23566. return VERSION_ERROR;
  23567. }
  23568. if (ssl->version.minor < ssl->options.minDowngrade) {
  23569. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  23570. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  23571. return VERSION_ERROR;
  23572. }
  23573. }
  23574. return 0;
  23575. }
  23576. /* handle processing of server_hello (2) */
  23577. int DoServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  23578. word32 helloSz)
  23579. {
  23580. byte cs0; /* cipher suite bytes 0, 1 */
  23581. byte cs1;
  23582. ProtocolVersion pv;
  23583. byte compression;
  23584. word32 i = *inOutIdx;
  23585. word32 begin = i;
  23586. int ret;
  23587. WOLFSSL_START(WC_FUNC_SERVER_HELLO_DO);
  23588. WOLFSSL_ENTER("DoServerHello");
  23589. #ifdef WOLFSSL_CALLBACKS
  23590. if (ssl->hsInfoOn) AddPacketName(ssl, "ServerHello");
  23591. if (ssl->toInfoOn) AddLateName("ServerHello", &ssl->timeoutInfo);
  23592. #endif
  23593. /* protocol version, random and session id length check */
  23594. if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz)
  23595. return BUFFER_ERROR;
  23596. /* protocol version */
  23597. XMEMCPY(&pv, input + i, OPAQUE16_LEN);
  23598. i += OPAQUE16_LEN;
  23599. ret = CheckVersion(ssl, pv);
  23600. if (ret != 0) {
  23601. SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
  23602. return ret;
  23603. }
  23604. #ifdef WOLFSSL_TLS13
  23605. if (IsAtLeastTLSv1_3(pv)) {
  23606. byte type = server_hello;
  23607. return DoTls13ServerHello(ssl, input, inOutIdx, helloSz, &type);
  23608. }
  23609. #endif
  23610. /* random */
  23611. XMEMCPY(ssl->arrays->serverRandom, input + i, RAN_LEN);
  23612. i += RAN_LEN;
  23613. /* session id */
  23614. ssl->arrays->sessionIDSz = input[i++];
  23615. if (ssl->arrays->sessionIDSz > ID_LEN) {
  23616. WOLFSSL_MSG("Invalid session ID size");
  23617. ssl->arrays->sessionIDSz = 0;
  23618. return BUFFER_ERROR;
  23619. }
  23620. else if (ssl->arrays->sessionIDSz) {
  23621. if ((i - begin) + ssl->arrays->sessionIDSz > helloSz)
  23622. return BUFFER_ERROR;
  23623. XMEMCPY(ssl->arrays->sessionID, input + i,
  23624. ssl->arrays->sessionIDSz);
  23625. i += ssl->arrays->sessionIDSz;
  23626. ssl->options.haveSessionId = 1;
  23627. }
  23628. /* suite and compression */
  23629. if ((i - begin) + OPAQUE16_LEN + OPAQUE8_LEN > helloSz)
  23630. return BUFFER_ERROR;
  23631. cs0 = input[i++];
  23632. cs1 = input[i++];
  23633. #ifndef WOLFSSL_NO_STRICT_CIPHER_SUITE
  23634. #if defined(HAVE_SECURE_RENEGOTIATION) && !defined(NO_FORCE_SCR_SAME_SUITE)
  23635. if (IsSCR(ssl)) {
  23636. if (ssl->options.cipherSuite0 != cs0 ||
  23637. ssl->options.cipherSuite != cs1) {
  23638. WOLFSSL_MSG("Server changed cipher suite during scr");
  23639. WOLFSSL_ERROR_VERBOSE(MATCH_SUITE_ERROR);
  23640. return MATCH_SUITE_ERROR;
  23641. }
  23642. }
  23643. else
  23644. #endif
  23645. {
  23646. word32 idx, found = 0;
  23647. const Suites* suites = WOLFSSL_SUITES(ssl);
  23648. /* confirm server_hello cipher suite is one sent in client_hello */
  23649. for (idx = 0; idx < suites->suiteSz; idx += 2) {
  23650. if (suites->suites[idx] == cs0 &&
  23651. suites->suites[idx+1] == cs1) {
  23652. found = 1;
  23653. break;
  23654. }
  23655. }
  23656. if (!found) {
  23657. WOLFSSL_MSG("ServerHello did not use cipher suite from ClientHello");
  23658. WOLFSSL_ERROR_VERBOSE(MATCH_SUITE_ERROR);
  23659. return MATCH_SUITE_ERROR;
  23660. }
  23661. }
  23662. #endif /* !WOLFSSL_NO_STRICT_CIPHER_SUITE */
  23663. ssl->options.cipherSuite0 = cs0;
  23664. ssl->options.cipherSuite = cs1;
  23665. #ifdef WOLFSSL_DEBUG_TLS
  23666. WOLFSSL_MSG("Chosen cipher suite:");
  23667. WOLFSSL_MSG(GetCipherNameInternal(ssl->options.cipherSuite0,
  23668. ssl->options.cipherSuite));
  23669. #endif
  23670. compression = input[i++];
  23671. if (compression != NO_COMPRESSION && !ssl->options.usingCompression) {
  23672. WOLFSSL_MSG("Server forcing compression w/o support");
  23673. WOLFSSL_ERROR_VERBOSE(COMPRESSION_ERROR);
  23674. return COMPRESSION_ERROR;
  23675. }
  23676. if (compression != ZLIB_COMPRESSION && ssl->options.usingCompression) {
  23677. WOLFSSL_MSG("Server refused compression, turning off");
  23678. ssl->options.usingCompression = 0; /* turn off if server refused */
  23679. }
  23680. *inOutIdx = i;
  23681. #ifdef HAVE_TLS_EXTENSIONS
  23682. if ( (i - begin) < helloSz) {
  23683. if (TLSX_SupportExtensions(ssl)) {
  23684. word16 totalExtSz;
  23685. if ((i - begin) + OPAQUE16_LEN > helloSz)
  23686. return BUFFER_ERROR;
  23687. ato16(&input[i], &totalExtSz);
  23688. i += OPAQUE16_LEN;
  23689. if ((i - begin) + totalExtSz > helloSz)
  23690. return BUFFER_ERROR;
  23691. if ((ret = TLSX_Parse(ssl, (byte *) input + i, totalExtSz,
  23692. server_hello, NULL)))
  23693. return ret;
  23694. i += totalExtSz;
  23695. *inOutIdx = i;
  23696. }
  23697. else
  23698. *inOutIdx = begin + helloSz; /* skip extensions */
  23699. }
  23700. else
  23701. ssl->options.haveEMS = 0; /* If no extensions, no EMS */
  23702. #else
  23703. {
  23704. byte pendingEMS = 0;
  23705. if ( (i - begin) < helloSz) {
  23706. int allowExt = 0;
  23707. if (ssl->version.major == SSLv3_MAJOR &&
  23708. ssl->version.minor >= TLSv1_MINOR) {
  23709. allowExt = 1;
  23710. }
  23711. #ifdef WOLFSSL_DTLS
  23712. if (ssl->version.major == DTLS_MAJOR)
  23713. allowExt = 1;
  23714. #endif
  23715. if (allowExt) {
  23716. word16 totalExtSz;
  23717. if ((i - begin) + OPAQUE16_LEN > helloSz)
  23718. return BUFFER_ERROR;
  23719. ato16(&input[i], &totalExtSz);
  23720. i += OPAQUE16_LEN;
  23721. if ((i - begin) + totalExtSz > helloSz)
  23722. return BUFFER_ERROR;
  23723. while (totalExtSz) {
  23724. word16 extId, extSz;
  23725. if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz)
  23726. return BUFFER_ERROR;
  23727. ato16(&input[i], &extId);
  23728. i += OPAQUE16_LEN;
  23729. ato16(&input[i], &extSz);
  23730. i += OPAQUE16_LEN;
  23731. if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz)
  23732. return BUFFER_ERROR;
  23733. if (extId == HELLO_EXT_EXTMS)
  23734. pendingEMS = 1;
  23735. else
  23736. i += extSz;
  23737. totalExtSz -= OPAQUE16_LEN + OPAQUE16_LEN + extSz;
  23738. }
  23739. *inOutIdx = i;
  23740. }
  23741. else
  23742. *inOutIdx = begin + helloSz; /* skip extensions */
  23743. }
  23744. if (!pendingEMS && ssl->options.haveEMS)
  23745. ssl->options.haveEMS = 0;
  23746. }
  23747. #endif
  23748. #if defined(WOLFSSL_HARDEN_TLS) && !defined(WOLFSSL_HARDEN_TLS_NO_SCR_CHECK)
  23749. if (ssl->secure_renegotiation == NULL ||
  23750. !ssl->secure_renegotiation->enabled) {
  23751. /* If the server does not acknowledge the extension, the client
  23752. * MUST generate a fatal handshake_failure alert prior to
  23753. * terminating the connection.
  23754. * https://www.rfc-editor.org/rfc/rfc9325#name-renegotiation-in-tls-12 */
  23755. WOLFSSL_MSG("ServerHello did not contain SCR extension");
  23756. return SECURE_RENEGOTIATION_E;
  23757. }
  23758. #endif
  23759. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  23760. if (IsEncryptionOn(ssl, 0)) {
  23761. *inOutIdx += ssl->keys.padSz;
  23762. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  23763. if (ssl->options.startedETMWrite &&
  23764. ssl->specs.cipher_type == block) {
  23765. *inOutIdx += MacSize(ssl);
  23766. }
  23767. #endif
  23768. }
  23769. #ifdef HAVE_SECRET_CALLBACK
  23770. if (ssl->sessionSecretCb != NULL
  23771. #ifdef HAVE_SESSION_TICKET
  23772. && ssl->session->ticketLen > 0
  23773. #endif
  23774. ) {
  23775. int secretSz = SECRET_LEN;
  23776. ret = ssl->sessionSecretCb(ssl, ssl->session->masterSecret,
  23777. &secretSz, ssl->sessionSecretCtx);
  23778. if (ret != 0 || secretSz != SECRET_LEN) {
  23779. WOLFSSL_ERROR_VERBOSE(SESSION_SECRET_CB_E);
  23780. return SESSION_SECRET_CB_E;
  23781. }
  23782. }
  23783. #endif /* HAVE_SECRET_CALLBACK */
  23784. ret = CompleteServerHello(ssl);
  23785. WOLFSSL_LEAVE("DoServerHello", ret);
  23786. WOLFSSL_END(WC_FUNC_SERVER_HELLO_DO);
  23787. return ret;
  23788. }
  23789. int CompleteServerHello(WOLFSSL* ssl)
  23790. {
  23791. int ret;
  23792. if (!ssl->options.resuming) {
  23793. byte* down = ssl->arrays->serverRandom + RAN_LEN -
  23794. TLS13_DOWNGRADE_SZ - 1;
  23795. byte vers = ssl->arrays->serverRandom[RAN_LEN - 1];
  23796. #ifdef WOLFSSL_TLS13
  23797. if (TLSv1_3_Capable(ssl)) {
  23798. /* TLS v1.3 capable client not allowed to downgrade when
  23799. * connecting to TLS v1.3 capable server unless cipher suite
  23800. * demands it.
  23801. */
  23802. if (XMEMCMP(down, tls13Downgrade, TLS13_DOWNGRADE_SZ) == 0 &&
  23803. (vers == 0 || vers == 1)) {
  23804. SendAlert(ssl, alert_fatal, illegal_parameter);
  23805. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  23806. return VERSION_ERROR;
  23807. }
  23808. }
  23809. else
  23810. #endif
  23811. if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
  23812. ssl->ctx->method->version.minor == TLSv1_2_MINOR &&
  23813. (wolfSSL_get_options(ssl) & WOLFSSL_OP_NO_TLSv1_2) == 0) {
  23814. /* TLS v1.2 capable client not allowed to downgrade when
  23815. * connecting to TLS v1.2 capable server.
  23816. */
  23817. if (XMEMCMP(down, tls13Downgrade, TLS13_DOWNGRADE_SZ) == 0 &&
  23818. vers == 0) {
  23819. SendAlert(ssl, alert_fatal, illegal_parameter);
  23820. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  23821. return VERSION_ERROR;
  23822. }
  23823. }
  23824. }
  23825. else {
  23826. if (DSH_CheckSessionId(ssl)) {
  23827. if (SetCipherSpecs(ssl) == 0) {
  23828. XMEMCPY(ssl->arrays->masterSecret,
  23829. ssl->session->masterSecret, SECRET_LEN);
  23830. #ifdef NO_OLD_TLS
  23831. ret = DeriveTlsKeys(ssl);
  23832. #else
  23833. ret = -1; /* default value */
  23834. #ifndef NO_TLS
  23835. if (ssl->options.tls)
  23836. ret = DeriveTlsKeys(ssl);
  23837. #endif
  23838. if (!ssl->options.tls)
  23839. ret = DeriveKeys(ssl);
  23840. #endif /* NO_OLD_TLS */
  23841. /* SERVER: peer auth based on session secret. */
  23842. ssl->options.peerAuthGood = (ret == 0);
  23843. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  23844. return ret;
  23845. }
  23846. else {
  23847. WOLFSSL_MSG("Unsupported cipher suite, DoServerHello");
  23848. WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_SUITE);
  23849. return UNSUPPORTED_SUITE;
  23850. }
  23851. }
  23852. else {
  23853. WOLFSSL_MSG("Server denied resumption attempt");
  23854. ssl->options.resuming = 0; /* server denied resumption try */
  23855. }
  23856. }
  23857. return SetCipherSpecs(ssl);
  23858. }
  23859. #endif /* !WOLFSSL_NO_TLS12 */
  23860. /* Make sure client setup is valid for this suite, true on success */
  23861. int VerifyClientSuite(word16 havePSK, byte cipherSuite0, byte cipherSuite)
  23862. {
  23863. (void)havePSK;
  23864. WOLFSSL_ENTER("VerifyClientSuite");
  23865. if (CipherRequires(cipherSuite0, cipherSuite, REQUIRES_PSK)) {
  23866. WOLFSSL_MSG("Requires PSK");
  23867. #ifndef NO_PSK
  23868. if (havePSK == 0)
  23869. #endif
  23870. {
  23871. WOLFSSL_MSG("Don't have PSK");
  23872. return 0;
  23873. }
  23874. }
  23875. return 1; /* success */
  23876. }
  23877. #ifndef WOLFSSL_NO_TLS12
  23878. #ifndef NO_CERTS
  23879. /* handle processing of certificate_request (13) */
  23880. static int DoCertificateRequest(WOLFSSL* ssl, const byte* input, word32*
  23881. inOutIdx, word32 size)
  23882. {
  23883. word16 len;
  23884. word32 begin = *inOutIdx;
  23885. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) || \
  23886. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  23887. int ret;
  23888. #endif
  23889. #ifdef OPENSSL_EXTRA
  23890. WOLFSSL_X509* x509 = NULL;
  23891. WOLFSSL_EVP_PKEY* pkey = NULL;
  23892. #endif
  23893. WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_DO);
  23894. WOLFSSL_ENTER("DoCertificateRequest");
  23895. #ifdef WOLFSSL_CALLBACKS
  23896. if (ssl->hsInfoOn)
  23897. AddPacketName(ssl, "CertificateRequest");
  23898. if (ssl->toInfoOn)
  23899. AddLateName("CertificateRequest", &ssl->timeoutInfo);
  23900. #endif
  23901. if (OPAQUE8_LEN > size)
  23902. return BUFFER_ERROR;
  23903. len = input[(*inOutIdx)++];
  23904. if ((*inOutIdx - begin) + len > size)
  23905. return BUFFER_ERROR;
  23906. /* types, read in here */
  23907. *inOutIdx += len;
  23908. /* signature and hash signature algorithm */
  23909. if (IsAtLeastTLSv1_2(ssl)) {
  23910. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  23911. return BUFFER_ERROR;
  23912. ato16(input + *inOutIdx, &len);
  23913. *inOutIdx += OPAQUE16_LEN;
  23914. if ((len > size) || ((*inOutIdx - begin) + len > size))
  23915. return BUFFER_ERROR;
  23916. if (PickHashSigAlgo(ssl, input + *inOutIdx, len) != 0 &&
  23917. ssl->buffers.certificate &&
  23918. ssl->buffers.certificate->buffer) {
  23919. #ifdef HAVE_PK_CALLBACKS
  23920. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  23921. WOLFSSL_MSG("Using PK for client private key");
  23922. WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
  23923. return INVALID_PARAMETER;
  23924. }
  23925. #endif
  23926. if (ssl->buffers.key && ssl->buffers.key->buffer) {
  23927. WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
  23928. return INVALID_PARAMETER;
  23929. }
  23930. }
  23931. *inOutIdx += len;
  23932. #ifdef WC_RSA_PSS
  23933. ssl->pssAlgo = 0;
  23934. if (ssl->options.sigAlgo == rsa_pss_sa_algo)
  23935. ssl->pssAlgo |= 1 << ssl->options.hashAlgo;
  23936. #endif
  23937. }
  23938. /* authorities */
  23939. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  23940. return BUFFER_ERROR;
  23941. /* DN seq length */
  23942. ato16(input + *inOutIdx, &len);
  23943. *inOutIdx += OPAQUE16_LEN;
  23944. if ((*inOutIdx - begin) + len > size)
  23945. return BUFFER_ERROR;
  23946. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  23947. if (ssl->ca_names != ssl->ctx->ca_names)
  23948. wolfSSL_sk_X509_NAME_pop_free(ssl->ca_names, NULL);
  23949. ssl->ca_names = wolfSSL_sk_X509_NAME_new(NULL);
  23950. if (ssl->ca_names == NULL) {
  23951. return MEMORY_ERROR;
  23952. }
  23953. #endif
  23954. while (len) {
  23955. word16 dnSz;
  23956. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  23957. return BUFFER_ERROR;
  23958. ato16(input + *inOutIdx, &dnSz);
  23959. *inOutIdx += OPAQUE16_LEN;
  23960. if ((*inOutIdx - begin) + dnSz > size)
  23961. return BUFFER_ERROR;
  23962. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  23963. {
  23964. WOLFSSL_X509_NAME* name = NULL;
  23965. /* Use a DecodedCert struct to get access to GetName to
  23966. * parse DN name */
  23967. #ifdef WOLFSSL_SMALL_STACK
  23968. DecodedCert *cert = (DecodedCert *)XMALLOC(
  23969. sizeof(*cert), ssl->heap, DYNAMIC_TYPE_DCERT);
  23970. if (cert == NULL)
  23971. return MEMORY_ERROR;
  23972. #else
  23973. DecodedCert cert[1];
  23974. #endif
  23975. InitDecodedCert(cert, input + *inOutIdx, dnSz, ssl->heap);
  23976. ret = GetName(cert, SUBJECT, dnSz);
  23977. if (ret == 0) {
  23978. if ((name = wolfSSL_X509_NAME_new()) == NULL)
  23979. ret = MEMORY_ERROR;
  23980. }
  23981. if (ret == 0) {
  23982. CopyDecodedName(name, cert, SUBJECT);
  23983. }
  23984. if (ret == 0) {
  23985. if (wolfSSL_sk_X509_NAME_push(ssl->ca_names, name)
  23986. == WOLFSSL_FAILURE)
  23987. {
  23988. ret = MEMORY_ERROR;
  23989. }
  23990. }
  23991. FreeDecodedCert(cert);
  23992. #ifdef WOLFSSL_SMALL_STACK
  23993. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  23994. #endif
  23995. if (ret != 0) {
  23996. if (name != NULL)
  23997. wolfSSL_X509_NAME_free(name);
  23998. return ret;
  23999. }
  24000. }
  24001. #endif
  24002. *inOutIdx += dnSz;
  24003. len -= OPAQUE16_LEN + dnSz;
  24004. }
  24005. #ifdef OPENSSL_EXTRA
  24006. /* call client cert callback if no cert has been loaded */
  24007. if ((ssl->ctx->CBClientCert != NULL) &&
  24008. (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer)) {
  24009. ret = ssl->ctx->CBClientCert(ssl, &x509, &pkey);
  24010. if (ret == 1) {
  24011. if ((wolfSSL_use_certificate(ssl, x509) != WOLFSSL_SUCCESS) ||
  24012. (wolfSSL_use_PrivateKey(ssl, pkey) != WOLFSSL_SUCCESS)) {
  24013. WOLFSSL_ERROR_VERBOSE(CLIENT_CERT_CB_ERROR);
  24014. return CLIENT_CERT_CB_ERROR;
  24015. }
  24016. wolfSSL_X509_free(x509);
  24017. wolfSSL_EVP_PKEY_free(pkey);
  24018. }
  24019. else if (ret < 0) {
  24020. return WOLFSSL_ERROR_WANT_X509_LOOKUP;
  24021. }
  24022. }
  24023. if ((ret = CertSetupCbWrapper(ssl)) != 0)
  24024. return ret;
  24025. #endif
  24026. /* don't send client cert or cert verify if user hasn't provided
  24027. cert and private key */
  24028. if (ssl->buffers.certificate && ssl->buffers.certificate->buffer) {
  24029. #ifdef HAVE_PK_CALLBACKS
  24030. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  24031. WOLFSSL_MSG("Using PK for client private key");
  24032. ssl->options.sendVerify = SEND_CERT;
  24033. }
  24034. #endif
  24035. if (ssl->buffers.key && ssl->buffers.key->buffer) {
  24036. ssl->options.sendVerify = SEND_CERT;
  24037. }
  24038. }
  24039. #ifdef OPENSSL_EXTRA
  24040. else
  24041. #else
  24042. else if (IsTLS(ssl))
  24043. #endif
  24044. {
  24045. ssl->options.sendVerify = SEND_BLANK_CERT;
  24046. }
  24047. if (IsEncryptionOn(ssl, 0)) {
  24048. *inOutIdx += ssl->keys.padSz;
  24049. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  24050. if (ssl->options.startedETMRead)
  24051. *inOutIdx += MacSize(ssl);
  24052. #endif
  24053. }
  24054. WOLFSSL_LEAVE("DoCertificateRequest", 0);
  24055. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_DO);
  24056. return 0;
  24057. }
  24058. #endif /* !NO_CERTS */
  24059. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  24060. static int CheckCurveId(int tlsCurveId)
  24061. {
  24062. int ret = ECC_CURVE_ERROR;
  24063. switch (tlsCurveId) {
  24064. #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
  24065. #ifndef NO_ECC_SECP
  24066. case WOLFSSL_ECC_SECP160R1: return ECC_SECP160R1_OID;
  24067. #endif /* !NO_ECC_SECP */
  24068. #ifdef HAVE_ECC_SECPR2
  24069. case WOLFSSL_ECC_SECP160R2: return ECC_SECP160R2_OID;
  24070. #endif /* HAVE_ECC_SECPR2 */
  24071. #ifdef HAVE_ECC_KOBLITZ
  24072. case WOLFSSL_ECC_SECP160K1: return ECC_SECP160K1_OID;
  24073. #endif /* HAVE_ECC_KOBLITZ */
  24074. #endif
  24075. #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
  24076. #ifndef NO_ECC_SECP
  24077. case WOLFSSL_ECC_SECP192R1: return ECC_SECP192R1_OID;
  24078. #endif /* !NO_ECC_SECP */
  24079. #ifdef HAVE_ECC_KOBLITZ
  24080. case WOLFSSL_ECC_SECP192K1: return ECC_SECP192K1_OID;
  24081. #endif /* HAVE_ECC_KOBLITZ */
  24082. #endif
  24083. #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
  24084. #ifndef NO_ECC_SECP
  24085. case WOLFSSL_ECC_SECP224R1: return ECC_SECP224R1_OID;
  24086. #endif /* !NO_ECC_SECP */
  24087. #ifdef HAVE_ECC_KOBLITZ
  24088. case WOLFSSL_ECC_SECP224K1: return ECC_SECP224K1_OID;
  24089. #endif /* HAVE_ECC_KOBLITZ */
  24090. #endif
  24091. #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
  24092. case WOLFSSL_ECC_X25519: return ECC_X25519_OID;
  24093. #endif
  24094. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  24095. #ifndef NO_ECC_SECP
  24096. case WOLFSSL_ECC_SECP256R1: return ECC_SECP256R1_OID;
  24097. #endif /* !NO_ECC_SECP */
  24098. #ifdef HAVE_ECC_KOBLITZ
  24099. case WOLFSSL_ECC_SECP256K1: return ECC_SECP256K1_OID;
  24100. #endif /* HAVE_ECC_KOBLITZ */
  24101. #ifdef HAVE_ECC_BRAINPOOL
  24102. case WOLFSSL_ECC_BRAINPOOLP256R1: return ECC_BRAINPOOLP256R1_OID;
  24103. #endif /* HAVE_ECC_BRAINPOOL */
  24104. #endif
  24105. #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
  24106. case WOLFSSL_ECC_X448: return ECC_X448_OID;
  24107. #endif
  24108. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  24109. #ifndef NO_ECC_SECP
  24110. case WOLFSSL_ECC_SECP384R1: return ECC_SECP384R1_OID;
  24111. #endif /* !NO_ECC_SECP */
  24112. #ifdef HAVE_ECC_BRAINPOOL
  24113. case WOLFSSL_ECC_BRAINPOOLP384R1: return ECC_BRAINPOOLP384R1_OID;
  24114. #endif /* HAVE_ECC_BRAINPOOL */
  24115. #endif
  24116. #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
  24117. #ifdef HAVE_ECC_BRAINPOOL
  24118. case WOLFSSL_ECC_BRAINPOOLP512R1: return ECC_BRAINPOOLP512R1_OID;
  24119. #endif /* HAVE_ECC_BRAINPOOL */
  24120. #endif
  24121. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  24122. #ifndef NO_ECC_SECP
  24123. case WOLFSSL_ECC_SECP521R1: return ECC_SECP521R1_OID;
  24124. #endif /* !NO_ECC_SECP */
  24125. #endif
  24126. default: break;
  24127. }
  24128. return ret;
  24129. }
  24130. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  24131. /* Persistable DoServerKeyExchange arguments */
  24132. typedef struct DskeArgs {
  24133. byte* output; /* not allocated */
  24134. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  24135. defined(HAVE_CURVE448)
  24136. byte* verifySig;
  24137. #endif
  24138. word32 idx;
  24139. word32 begin;
  24140. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  24141. defined(HAVE_CURVE448)
  24142. word16 verifySigSz;
  24143. #endif
  24144. word16 sigSz;
  24145. byte sigAlgo;
  24146. byte hashAlgo;
  24147. #if !defined(NO_RSA) && defined(WC_RSA_PSS)
  24148. int bits;
  24149. #endif
  24150. } DskeArgs;
  24151. static void FreeDskeArgs(WOLFSSL* ssl, void* pArgs)
  24152. {
  24153. DskeArgs* args = (DskeArgs*)pArgs;
  24154. (void)ssl;
  24155. (void)args;
  24156. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  24157. defined(HAVE_CURVE448)
  24158. if (args->verifySig) {
  24159. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  24160. args->verifySig = NULL;
  24161. }
  24162. #endif
  24163. }
  24164. #ifndef NO_DH
  24165. static int GetDhPublicKey(WOLFSSL* ssl, const byte* input, word32 size,
  24166. DskeArgs* args)
  24167. {
  24168. int ret = 0;
  24169. word16 length;
  24170. #ifdef HAVE_FFDHE
  24171. #ifdef HAVE_PUBLIC_FFDHE
  24172. const DhParams* params = NULL;
  24173. #endif
  24174. word16 group = 0;
  24175. #endif
  24176. if (ssl->buffers.weOwnDH) {
  24177. if (ssl->buffers.serverDH_P.buffer) {
  24178. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  24179. DYNAMIC_TYPE_PUBLIC_KEY);
  24180. ssl->buffers.serverDH_P.buffer = NULL;
  24181. }
  24182. if (ssl->buffers.serverDH_G.buffer) {
  24183. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  24184. DYNAMIC_TYPE_PUBLIC_KEY);
  24185. ssl->buffers.serverDH_G.buffer = NULL;
  24186. }
  24187. }
  24188. if (ssl->buffers.serverDH_Pub.buffer) {
  24189. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap,
  24190. DYNAMIC_TYPE_PUBLIC_KEY);
  24191. ssl->buffers.serverDH_Pub.buffer = NULL;
  24192. }
  24193. /* p */
  24194. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  24195. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  24196. }
  24197. ato16(input + args->idx, &length);
  24198. args->idx += OPAQUE16_LEN;
  24199. if ((args->idx - args->begin) + length > size) {
  24200. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  24201. }
  24202. if (length < ssl->options.minDhKeySz) {
  24203. WOLFSSL_MSG("Server using a DH key that is too small");
  24204. SendAlert(ssl, alert_fatal, handshake_failure);
  24205. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  24206. }
  24207. if (length > ssl->options.maxDhKeySz) {
  24208. WOLFSSL_MSG("Server using a DH key that is too big");
  24209. SendAlert(ssl, alert_fatal, handshake_failure);
  24210. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  24211. }
  24212. ssl->buffers.serverDH_P.buffer =
  24213. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  24214. if (ssl->buffers.serverDH_P.buffer) {
  24215. ssl->buffers.serverDH_P.length = length;
  24216. }
  24217. else {
  24218. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  24219. }
  24220. XMEMCPY(ssl->buffers.serverDH_P.buffer, input + args->idx,
  24221. length);
  24222. args->idx += length;
  24223. ssl->options.dhKeySz = length;
  24224. /* g */
  24225. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  24226. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  24227. DYNAMIC_TYPE_PUBLIC_KEY);
  24228. ssl->buffers.serverDH_P.buffer = NULL;
  24229. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  24230. }
  24231. ato16(input + args->idx, &length);
  24232. args->idx += OPAQUE16_LEN;
  24233. if ((args->idx - args->begin) + length > size) {
  24234. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  24235. DYNAMIC_TYPE_PUBLIC_KEY);
  24236. ssl->buffers.serverDH_P.buffer = NULL;
  24237. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  24238. }
  24239. if (length > ssl->options.maxDhKeySz) {
  24240. WOLFSSL_MSG("Server using a DH key generator that is too big");
  24241. SendAlert(ssl, alert_fatal, handshake_failure);
  24242. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  24243. DYNAMIC_TYPE_PUBLIC_KEY);
  24244. ssl->buffers.serverDH_P.buffer = NULL;
  24245. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  24246. }
  24247. ssl->buffers.serverDH_G.buffer =
  24248. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  24249. if (ssl->buffers.serverDH_G.buffer) {
  24250. ssl->buffers.serverDH_G.length = length;
  24251. }
  24252. else {
  24253. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  24254. DYNAMIC_TYPE_PUBLIC_KEY);
  24255. ssl->buffers.serverDH_P.buffer = NULL;
  24256. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  24257. }
  24258. XMEMCPY(ssl->buffers.serverDH_G.buffer, input + args->idx,
  24259. length);
  24260. args->idx += length;
  24261. /* pub */
  24262. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  24263. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  24264. DYNAMIC_TYPE_PUBLIC_KEY);
  24265. ssl->buffers.serverDH_P.buffer = NULL;
  24266. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  24267. DYNAMIC_TYPE_PUBLIC_KEY);
  24268. ssl->buffers.serverDH_G.buffer = NULL;
  24269. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  24270. }
  24271. ato16(input + args->idx, &length);
  24272. args->idx += OPAQUE16_LEN;
  24273. if ((args->idx - args->begin) + length > size) {
  24274. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  24275. DYNAMIC_TYPE_PUBLIC_KEY);
  24276. ssl->buffers.serverDH_P.buffer = NULL;
  24277. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  24278. DYNAMIC_TYPE_PUBLIC_KEY);
  24279. ssl->buffers.serverDH_G.buffer = NULL;
  24280. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  24281. }
  24282. if (length > ssl->options.maxDhKeySz) {
  24283. WOLFSSL_MSG("Server using a public DH key that is too big");
  24284. SendAlert(ssl, alert_fatal, handshake_failure);
  24285. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  24286. DYNAMIC_TYPE_PUBLIC_KEY);
  24287. ssl->buffers.serverDH_P.buffer = NULL;
  24288. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  24289. DYNAMIC_TYPE_PUBLIC_KEY);
  24290. ssl->buffers.serverDH_G.buffer = NULL;
  24291. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  24292. }
  24293. ssl->buffers.serverDH_Pub.buffer =
  24294. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  24295. if (ssl->buffers.serverDH_Pub.buffer) {
  24296. ssl->buffers.serverDH_Pub.length = length;
  24297. }
  24298. else {
  24299. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  24300. DYNAMIC_TYPE_PUBLIC_KEY);
  24301. ssl->buffers.serverDH_P.buffer = NULL;
  24302. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  24303. DYNAMIC_TYPE_PUBLIC_KEY);
  24304. ssl->buffers.serverDH_G.buffer = NULL;
  24305. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  24306. }
  24307. XMEMCPY(ssl->buffers.serverDH_Pub.buffer, input + args->idx,
  24308. length);
  24309. ssl->buffers.weOwnDH = 1;
  24310. args->idx += length;
  24311. #ifdef HAVE_FFDHE
  24312. switch (ssl->options.dhKeySz) {
  24313. #ifdef HAVE_FFDHE_2048
  24314. case 2048/8:
  24315. #ifdef HAVE_PUBLIC_FFDHE
  24316. params = wc_Dh_ffdhe2048_Get();
  24317. #endif
  24318. group = WOLFSSL_FFDHE_2048;
  24319. break;
  24320. #endif
  24321. #ifdef HAVE_FFDHE_3072
  24322. case 3072/8:
  24323. #ifdef HAVE_PUBLIC_FFDHE
  24324. params = wc_Dh_ffdhe3072_Get();
  24325. #endif
  24326. group = WOLFSSL_FFDHE_3072;
  24327. break;
  24328. #endif
  24329. #ifdef HAVE_FFDHE_4096
  24330. case 4096/8:
  24331. #ifdef HAVE_PUBLIC_FFDHE
  24332. params = wc_Dh_ffdhe4096_Get();
  24333. #endif
  24334. group = WOLFSSL_FFDHE_4096;
  24335. break;
  24336. #endif
  24337. #ifdef HAVE_FFDHE_6144
  24338. case 6144/8:
  24339. #ifdef HAVE_PUBLIC_FFDHE
  24340. params = wc_Dh_ffdhe6144_Get();
  24341. #endif
  24342. group = WOLFSSL_FFDHE_6144;
  24343. break;
  24344. #endif
  24345. #ifdef HAVE_FFDHE_8192
  24346. case 8192/8:
  24347. #ifdef HAVE_PUBLIC_FFDHE
  24348. params = wc_Dh_ffdhe8192_Get();
  24349. #endif
  24350. group = WOLFSSL_FFDHE_8192;
  24351. break;
  24352. #endif
  24353. default:
  24354. break;
  24355. }
  24356. #ifdef HAVE_PUBLIC_FFDHE
  24357. if (params == NULL || params->g_len != ssl->buffers.serverDH_G.length ||
  24358. (XMEMCMP(ssl->buffers.serverDH_G.buffer, params->g,
  24359. params->g_len) != 0) ||
  24360. (XMEMCMP(ssl->buffers.serverDH_P.buffer, params->p,
  24361. params->p_len) != 0))
  24362. #else
  24363. if (!wc_DhCmpNamedKey(group, 1,
  24364. ssl->buffers.serverDH_P.buffer, ssl->buffers.serverDH_P.length,
  24365. ssl->buffers.serverDH_G.buffer, ssl->buffers.serverDH_G.length,
  24366. NULL, 0))
  24367. #endif
  24368. {
  24369. WOLFSSL_MSG("Server not using FFDHE parameters");
  24370. #ifdef WOLFSSL_REQUIRE_FFDHE
  24371. SendAlert(ssl, alert_fatal, handshake_failure);
  24372. ERROR_OUT(DH_PARAMS_NOT_FFDHE_E, exit_gdpk);
  24373. #endif
  24374. }
  24375. else {
  24376. ssl->namedGroup = group;
  24377. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  24378. !defined(HAVE_SELFTEST)
  24379. ssl->options.dhDoKeyTest = 0;
  24380. #endif
  24381. }
  24382. #endif /* HAVE_FFDHE */
  24383. exit_gdpk:
  24384. if (ret != 0) {
  24385. WOLFSSL_ERROR_VERBOSE(ret);
  24386. }
  24387. return ret;
  24388. }
  24389. #endif
  24390. /* handle processing of server_key_exchange (12) */
  24391. static int DoServerKeyExchange(WOLFSSL* ssl, const byte* input,
  24392. word32* inOutIdx, word32 size)
  24393. {
  24394. int ret = 0;
  24395. #ifdef WOLFSSL_ASYNC_CRYPT
  24396. DskeArgs* args = NULL;
  24397. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  24398. #else
  24399. DskeArgs args[1];
  24400. #endif
  24401. (void)input;
  24402. (void)size;
  24403. WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_DO);
  24404. WOLFSSL_ENTER("DoServerKeyExchange");
  24405. #ifdef WOLFSSL_ASYNC_CRYPT
  24406. if (ssl->async == NULL) {
  24407. ssl->async = (struct WOLFSSL_ASYNC*)
  24408. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  24409. DYNAMIC_TYPE_ASYNC);
  24410. if (ssl->async == NULL)
  24411. ERROR_OUT(MEMORY_E, exit_dske);
  24412. }
  24413. args = (DskeArgs*)ssl->async->args;
  24414. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  24415. if (ret != WC_NOT_PENDING_E) {
  24416. /* Check for error */
  24417. if (ret < 0)
  24418. goto exit_dske;
  24419. }
  24420. else
  24421. #endif
  24422. {
  24423. /* Reset state */
  24424. ret = 0;
  24425. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  24426. XMEMSET(args, 0, sizeof(DskeArgs));
  24427. args->idx = *inOutIdx;
  24428. args->begin = *inOutIdx;
  24429. args->sigAlgo = ssl->specs.sig_algo;
  24430. args->hashAlgo = sha_mac;
  24431. #ifdef WOLFSSL_ASYNC_CRYPT
  24432. ssl->async->freeArgs = FreeDskeArgs;
  24433. #endif
  24434. }
  24435. switch(ssl->options.asyncState)
  24436. {
  24437. case TLS_ASYNC_BEGIN:
  24438. {
  24439. #ifdef WOLFSSL_CALLBACKS
  24440. if (ssl->hsInfoOn)
  24441. AddPacketName(ssl, "ServerKeyExchange");
  24442. if (ssl->toInfoOn)
  24443. AddLateName("ServerKeyExchange", &ssl->timeoutInfo);
  24444. #endif
  24445. switch(ssl->specs.kea)
  24446. {
  24447. #ifndef NO_PSK
  24448. case psk_kea:
  24449. {
  24450. int srvHintLen;
  24451. word16 length;
  24452. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  24453. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24454. }
  24455. ato16(input + args->idx, &length);
  24456. args->idx += OPAQUE16_LEN;
  24457. if ((args->idx - args->begin) + length > size) {
  24458. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24459. }
  24460. /* get PSK server hint from the wire */
  24461. srvHintLen = min(length, MAX_PSK_ID_LEN);
  24462. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  24463. srvHintLen);
  24464. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  24465. args->idx += length;
  24466. break;
  24467. }
  24468. #endif /* !NO_PSK */
  24469. #ifndef NO_DH
  24470. case diffie_hellman_kea:
  24471. {
  24472. ret = GetDhPublicKey(ssl, input, size, args);
  24473. if (ret != 0)
  24474. goto exit_dske;
  24475. break;
  24476. }
  24477. #endif /* !NO_DH */
  24478. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  24479. defined(HAVE_CURVE448)
  24480. case ecc_diffie_hellman_kea:
  24481. {
  24482. byte b;
  24483. #ifdef HAVE_ECC
  24484. int curveId;
  24485. #endif
  24486. int curveOid;
  24487. word16 length;
  24488. if ((args->idx - args->begin) + ENUM_LEN + OPAQUE16_LEN +
  24489. OPAQUE8_LEN > size) {
  24490. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24491. }
  24492. b = input[args->idx++];
  24493. if (b != named_curve) {
  24494. ERROR_OUT(ECC_CURVETYPE_ERROR, exit_dske);
  24495. }
  24496. args->idx += 1; /* curve type, eat leading 0 */
  24497. b = input[args->idx++];
  24498. if ((curveOid = CheckCurveId(b)) < 0) {
  24499. ERROR_OUT(ECC_CURVE_ERROR, exit_dske);
  24500. }
  24501. ssl->ecdhCurveOID = curveOid;
  24502. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  24503. ssl->namedGroup = 0;
  24504. #endif
  24505. length = input[args->idx++];
  24506. if ((args->idx - args->begin) + length > size) {
  24507. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24508. }
  24509. #ifdef HAVE_CURVE25519
  24510. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  24511. if (ssl->peerX25519Key == NULL) {
  24512. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  24513. (void**)&ssl->peerX25519Key);
  24514. if (ret != 0) {
  24515. goto exit_dske;
  24516. }
  24517. } else if (ssl->peerX25519KeyPresent) {
  24518. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  24519. ssl->peerX25519Key);
  24520. ssl->peerX25519KeyPresent = 0;
  24521. if (ret != 0) {
  24522. goto exit_dske;
  24523. }
  24524. }
  24525. if ((ret = wc_curve25519_check_public(
  24526. input + args->idx, length,
  24527. EC25519_LITTLE_ENDIAN)) != 0) {
  24528. #ifdef WOLFSSL_EXTRA_ALERTS
  24529. if (ret == BUFFER_E)
  24530. SendAlert(ssl, alert_fatal, decode_error);
  24531. else if (ret == ECC_OUT_OF_RANGE_E)
  24532. SendAlert(ssl, alert_fatal, bad_record_mac);
  24533. else {
  24534. SendAlert(ssl, alert_fatal, illegal_parameter);
  24535. }
  24536. #endif
  24537. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  24538. }
  24539. if (wc_curve25519_import_public_ex(input + args->idx,
  24540. length, ssl->peerX25519Key,
  24541. EC25519_LITTLE_ENDIAN) != 0) {
  24542. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  24543. }
  24544. args->idx += length;
  24545. ssl->peerX25519KeyPresent = 1;
  24546. break;
  24547. }
  24548. #endif
  24549. #ifdef HAVE_CURVE448
  24550. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  24551. if (ssl->peerX448Key == NULL) {
  24552. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  24553. (void**)&ssl->peerX448Key);
  24554. if (ret != 0) {
  24555. goto exit_dske;
  24556. }
  24557. } else if (ssl->peerX448KeyPresent) {
  24558. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  24559. ssl->peerX448Key);
  24560. ssl->peerX448KeyPresent = 0;
  24561. if (ret != 0) {
  24562. goto exit_dske;
  24563. }
  24564. }
  24565. if ((ret = wc_curve448_check_public(
  24566. input + args->idx, length,
  24567. EC448_LITTLE_ENDIAN)) != 0) {
  24568. #ifdef WOLFSSL_EXTRA_ALERTS
  24569. if (ret == BUFFER_E)
  24570. SendAlert(ssl, alert_fatal, decode_error);
  24571. else if (ret == ECC_OUT_OF_RANGE_E)
  24572. SendAlert(ssl, alert_fatal, bad_record_mac);
  24573. else {
  24574. SendAlert(ssl, alert_fatal, illegal_parameter);
  24575. }
  24576. #endif
  24577. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  24578. }
  24579. if (wc_curve448_import_public_ex(input + args->idx,
  24580. length, ssl->peerX448Key,
  24581. EC448_LITTLE_ENDIAN) != 0) {
  24582. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  24583. }
  24584. args->idx += length;
  24585. ssl->peerX448KeyPresent = 1;
  24586. break;
  24587. }
  24588. #endif
  24589. #ifdef HAVE_ECC
  24590. if (ssl->peerEccKey == NULL) {
  24591. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  24592. (void**)&ssl->peerEccKey);
  24593. if (ret != 0) {
  24594. goto exit_dske;
  24595. }
  24596. } else if (ssl->peerEccKeyPresent) {
  24597. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC, ssl->peerEccKey);
  24598. ssl->peerEccKeyPresent = 0;
  24599. if (ret != 0) {
  24600. goto exit_dske;
  24601. }
  24602. }
  24603. curveId = wc_ecc_get_oid(curveOid, NULL, NULL);
  24604. if (wc_ecc_import_x963_ex(input + args->idx, length,
  24605. ssl->peerEccKey, curveId) != 0) {
  24606. #ifdef WOLFSSL_EXTRA_ALERTS
  24607. SendAlert(ssl, alert_fatal, illegal_parameter);
  24608. #endif
  24609. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  24610. }
  24611. args->idx += length;
  24612. ssl->peerEccKeyPresent = 1;
  24613. #endif
  24614. break;
  24615. }
  24616. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  24617. #if !defined(NO_DH) && !defined(NO_PSK)
  24618. case dhe_psk_kea:
  24619. {
  24620. int srvHintLen;
  24621. word16 length;
  24622. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  24623. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24624. }
  24625. ato16(input + args->idx, &length);
  24626. args->idx += OPAQUE16_LEN;
  24627. if ((args->idx - args->begin) + length > size) {
  24628. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24629. }
  24630. /* get PSK server hint from the wire */
  24631. srvHintLen = min(length, MAX_PSK_ID_LEN);
  24632. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  24633. srvHintLen);
  24634. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  24635. args->idx += length;
  24636. ret = GetDhPublicKey(ssl, input, size, args);
  24637. if (ret != 0)
  24638. goto exit_dske;
  24639. break;
  24640. }
  24641. #endif /* !NO_DH && !NO_PSK */
  24642. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  24643. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  24644. case ecdhe_psk_kea:
  24645. {
  24646. byte b;
  24647. int curveOid, curveId;
  24648. int srvHintLen;
  24649. word16 length;
  24650. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  24651. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24652. }
  24653. ato16(input + args->idx, &length);
  24654. args->idx += OPAQUE16_LEN;
  24655. if ((args->idx - args->begin) + length > size) {
  24656. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24657. }
  24658. /* get PSK server hint from the wire */
  24659. srvHintLen = min(length, MAX_PSK_ID_LEN);
  24660. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  24661. srvHintLen);
  24662. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  24663. args->idx += length;
  24664. if ((args->idx - args->begin) + ENUM_LEN + OPAQUE16_LEN +
  24665. OPAQUE8_LEN > size) {
  24666. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24667. }
  24668. /* Check curve name and ID */
  24669. b = input[args->idx++];
  24670. if (b != named_curve) {
  24671. ERROR_OUT(ECC_CURVETYPE_ERROR, exit_dske);
  24672. }
  24673. args->idx += 1; /* curve type, eat leading 0 */
  24674. b = input[args->idx++];
  24675. if ((curveOid = CheckCurveId(b)) < 0) {
  24676. ERROR_OUT(ECC_CURVE_ERROR, exit_dske);
  24677. }
  24678. length = input[args->idx++];
  24679. if ((args->idx - args->begin) + length > size) {
  24680. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24681. }
  24682. #ifdef HAVE_CURVE25519
  24683. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  24684. if (ssl->peerX25519Key == NULL) {
  24685. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  24686. (void**)&ssl->peerX25519Key);
  24687. if (ret != 0) {
  24688. goto exit_dske;
  24689. }
  24690. } else if (ssl->peerEccKeyPresent) {
  24691. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  24692. ssl->peerX25519Key);
  24693. ssl->peerX25519KeyPresent = 0;
  24694. if (ret != 0) {
  24695. goto exit_dske;
  24696. }
  24697. }
  24698. if ((ret = wc_curve25519_check_public(
  24699. input + args->idx, length,
  24700. EC25519_LITTLE_ENDIAN)) != 0) {
  24701. #ifdef WOLFSSL_EXTRA_ALERTS
  24702. if (ret == BUFFER_E)
  24703. SendAlert(ssl, alert_fatal, decode_error);
  24704. else if (ret == ECC_OUT_OF_RANGE_E)
  24705. SendAlert(ssl, alert_fatal, bad_record_mac);
  24706. else {
  24707. SendAlert(ssl, alert_fatal, illegal_parameter);
  24708. }
  24709. #endif
  24710. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  24711. }
  24712. if (wc_curve25519_import_public_ex(input + args->idx,
  24713. length, ssl->peerX25519Key,
  24714. EC25519_LITTLE_ENDIAN) != 0) {
  24715. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  24716. }
  24717. args->idx += length;
  24718. ssl->peerX25519KeyPresent = 1;
  24719. break;
  24720. }
  24721. #endif
  24722. #ifdef HAVE_CURVE448
  24723. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  24724. if (ssl->peerX448Key == NULL) {
  24725. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  24726. (void**)&ssl->peerX448Key);
  24727. if (ret != 0) {
  24728. goto exit_dske;
  24729. }
  24730. } else if (ssl->peerEccKeyPresent) {
  24731. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  24732. ssl->peerX448Key);
  24733. ssl->peerX448KeyPresent = 0;
  24734. if (ret != 0) {
  24735. goto exit_dske;
  24736. }
  24737. }
  24738. if ((ret = wc_curve448_check_public(
  24739. input + args->idx, length,
  24740. EC448_LITTLE_ENDIAN)) != 0) {
  24741. #ifdef WOLFSSL_EXTRA_ALERTS
  24742. if (ret == BUFFER_E)
  24743. SendAlert(ssl, alert_fatal, decode_error);
  24744. else if (ret == ECC_OUT_OF_RANGE_E)
  24745. SendAlert(ssl, alert_fatal, bad_record_mac);
  24746. else {
  24747. SendAlert(ssl, alert_fatal, illegal_parameter);
  24748. }
  24749. #endif
  24750. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  24751. }
  24752. if (wc_curve448_import_public_ex(input + args->idx,
  24753. length, ssl->peerX448Key,
  24754. EC448_LITTLE_ENDIAN) != 0) {
  24755. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  24756. }
  24757. args->idx += length;
  24758. ssl->peerX448KeyPresent = 1;
  24759. break;
  24760. }
  24761. #endif
  24762. if (ssl->peerEccKey == NULL) {
  24763. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  24764. (void**)&ssl->peerEccKey);
  24765. if (ret != 0) {
  24766. goto exit_dske;
  24767. }
  24768. } else if (ssl->peerEccKeyPresent) {
  24769. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC, ssl->peerEccKey);
  24770. ssl->peerEccKeyPresent = 0;
  24771. if (ret != 0) {
  24772. goto exit_dske;
  24773. }
  24774. }
  24775. curveId = wc_ecc_get_oid(curveOid, NULL, NULL);
  24776. if (wc_ecc_import_x963_ex(input + args->idx, length,
  24777. ssl->peerEccKey, curveId) != 0) {
  24778. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  24779. }
  24780. args->idx += length;
  24781. ssl->peerEccKeyPresent = 1;
  24782. break;
  24783. }
  24784. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  24785. default:
  24786. ret = BAD_KEA_TYPE_E;
  24787. } /* switch(ssl->specs.kea) */
  24788. /* Check for error */
  24789. if (ret != 0) {
  24790. goto exit_dske;
  24791. }
  24792. /* Advance state and proceed */
  24793. ssl->options.asyncState = TLS_ASYNC_BUILD;
  24794. } /* case TLS_ASYNC_BEGIN */
  24795. FALL_THROUGH;
  24796. case TLS_ASYNC_BUILD:
  24797. {
  24798. switch(ssl->specs.kea)
  24799. {
  24800. case psk_kea:
  24801. case dhe_psk_kea:
  24802. case ecdhe_psk_kea:
  24803. {
  24804. /* Nothing to do in this sub-state */
  24805. break;
  24806. }
  24807. case diffie_hellman_kea:
  24808. case ecc_diffie_hellman_kea:
  24809. {
  24810. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  24811. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  24812. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  24813. #else
  24814. enum wc_HashType hashType;
  24815. word16 verifySz;
  24816. byte sigAlgo;
  24817. if (ssl->options.usingAnon_cipher) {
  24818. break;
  24819. }
  24820. verifySz = (word16)(args->idx - args->begin);
  24821. if (verifySz > MAX_DH_SZ) {
  24822. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24823. }
  24824. if (IsAtLeastTLSv1_2(ssl)) {
  24825. if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN >
  24826. size) {
  24827. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24828. }
  24829. DecodeSigAlg(&input[args->idx], &args->hashAlgo,
  24830. &sigAlgo);
  24831. #ifndef NO_RSA
  24832. if (sigAlgo == rsa_pss_sa_algo &&
  24833. args->sigAlgo == rsa_sa_algo) {
  24834. args->sigAlgo = sigAlgo;
  24835. }
  24836. else
  24837. #endif
  24838. #ifdef HAVE_ED25519
  24839. if (sigAlgo == ed25519_sa_algo &&
  24840. args->sigAlgo == ecc_dsa_sa_algo) {
  24841. args->sigAlgo = sigAlgo;
  24842. }
  24843. else
  24844. #endif
  24845. #ifdef HAVE_ED448
  24846. if (sigAlgo == ed448_sa_algo &&
  24847. args->sigAlgo == ecc_dsa_sa_algo) {
  24848. args->sigAlgo = sigAlgo;
  24849. }
  24850. else
  24851. #endif
  24852. /* Signature algorithm from message must match signature
  24853. * algorithm in cipher suite. */
  24854. if (sigAlgo != args->sigAlgo) {
  24855. ERROR_OUT(ALGO_ID_E, exit_dske);
  24856. }
  24857. args->idx += 2;
  24858. hashType = HashAlgoToType(args->hashAlgo);
  24859. if (hashType == WC_HASH_TYPE_NONE) {
  24860. ERROR_OUT(ALGO_ID_E, exit_dske);
  24861. }
  24862. } else {
  24863. /* only using sha and md5 for rsa */
  24864. #ifndef NO_OLD_TLS
  24865. hashType = WC_HASH_TYPE_SHA;
  24866. if (args->sigAlgo == rsa_sa_algo) {
  24867. hashType = WC_HASH_TYPE_MD5_SHA;
  24868. }
  24869. #else
  24870. ERROR_OUT(ALGO_ID_E, exit_dske);
  24871. #endif
  24872. }
  24873. /* signature */
  24874. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  24875. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24876. }
  24877. ato16(input + args->idx, &args->verifySigSz);
  24878. args->idx += OPAQUE16_LEN;
  24879. if ((args->idx - args->begin) + args->verifySigSz > size) {
  24880. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24881. }
  24882. ret = HashSkeData(ssl, hashType, input + args->begin,
  24883. verifySz, args->sigAlgo);
  24884. if (ret != 0) {
  24885. goto exit_dske;
  24886. }
  24887. switch (args->sigAlgo)
  24888. {
  24889. #ifndef NO_RSA
  24890. #ifdef WC_RSA_PSS
  24891. case rsa_pss_sa_algo:
  24892. #endif
  24893. case rsa_sa_algo:
  24894. {
  24895. if (ssl->peerRsaKey == NULL ||
  24896. !ssl->peerRsaKeyPresent) {
  24897. ERROR_OUT(NO_PEER_KEY, exit_dske);
  24898. }
  24899. break;
  24900. }
  24901. #endif /* !NO_RSA */
  24902. #ifdef HAVE_ECC
  24903. case ecc_dsa_sa_algo:
  24904. {
  24905. if (!ssl->peerEccDsaKeyPresent) {
  24906. ERROR_OUT(NO_PEER_KEY, exit_dske);
  24907. }
  24908. break;
  24909. }
  24910. #endif /* HAVE_ECC */
  24911. #if defined(HAVE_ED25519)
  24912. case ed25519_sa_algo:
  24913. {
  24914. if (!ssl->peerEd25519KeyPresent) {
  24915. ERROR_OUT(NO_PEER_KEY, exit_dske);
  24916. }
  24917. break;
  24918. }
  24919. #endif /* HAVE_ED25519 */
  24920. #if defined(HAVE_ED448)
  24921. case ed448_sa_algo:
  24922. {
  24923. if (!ssl->peerEd448KeyPresent) {
  24924. ERROR_OUT(NO_PEER_KEY, exit_dske);
  24925. }
  24926. break;
  24927. }
  24928. #endif /* HAVE_ED448 */
  24929. default:
  24930. ret = ALGO_ID_E;
  24931. } /* switch (args->sigAlgo) */
  24932. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  24933. break;
  24934. }
  24935. default:
  24936. ret = BAD_KEA_TYPE_E;
  24937. } /* switch(ssl->specs.kea) */
  24938. /* Check for error */
  24939. if (ret != 0) {
  24940. goto exit_dske;
  24941. }
  24942. /* Advance state and proceed */
  24943. ssl->options.asyncState = TLS_ASYNC_DO;
  24944. } /* case TLS_ASYNC_BUILD */
  24945. FALL_THROUGH;
  24946. case TLS_ASYNC_DO:
  24947. {
  24948. switch(ssl->specs.kea)
  24949. {
  24950. case psk_kea:
  24951. case dhe_psk_kea:
  24952. case ecdhe_psk_kea:
  24953. {
  24954. /* Nothing to do in this sub-state */
  24955. break;
  24956. }
  24957. case diffie_hellman_kea:
  24958. case ecc_diffie_hellman_kea:
  24959. {
  24960. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  24961. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  24962. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  24963. #else
  24964. if (ssl->options.usingAnon_cipher) {
  24965. break;
  24966. }
  24967. if (args->verifySig == NULL) {
  24968. args->verifySig = (byte*)XMALLOC(args->verifySigSz,
  24969. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  24970. if (args->verifySig == NULL) {
  24971. ERROR_OUT(MEMORY_E, exit_dske);
  24972. }
  24973. XMEMCPY(args->verifySig, input + args->idx,
  24974. args->verifySigSz);
  24975. }
  24976. switch (args->sigAlgo)
  24977. {
  24978. #ifndef NO_RSA
  24979. #ifdef WC_RSA_PSS
  24980. case rsa_pss_sa_algo:
  24981. #endif
  24982. case rsa_sa_algo:
  24983. {
  24984. ret = RsaVerify(ssl,
  24985. args->verifySig, args->verifySigSz,
  24986. &args->output,
  24987. args->sigAlgo, args->hashAlgo,
  24988. ssl->peerRsaKey,
  24989. #ifdef HAVE_PK_CALLBACKS
  24990. &ssl->buffers.peerRsaKey
  24991. #else
  24992. NULL
  24993. #endif
  24994. );
  24995. if (ret >= 0) {
  24996. args->sigSz = (word16)ret;
  24997. #ifdef WC_RSA_PSS
  24998. args->bits = mp_count_bits(&ssl->peerRsaKey->n);
  24999. #endif
  25000. ret = 0;
  25001. }
  25002. #ifdef WOLFSSL_ASYNC_CRYPT
  25003. if (ret != WC_PENDING_E)
  25004. #endif
  25005. {
  25006. /* peerRsaKey */
  25007. FreeKey(ssl, DYNAMIC_TYPE_RSA,
  25008. (void**)&ssl->peerRsaKey);
  25009. ssl->peerRsaKeyPresent = 0;
  25010. }
  25011. break;
  25012. }
  25013. #endif /* !NO_RSA */
  25014. #ifdef HAVE_ECC
  25015. case ecc_dsa_sa_algo:
  25016. {
  25017. ret = NOT_COMPILED_IN;
  25018. #ifdef HAVE_PK_CALLBACKS
  25019. if (ssl->ctx && ssl->ctx->ProcessServerSigKexCb) {
  25020. ret = ssl->ctx->ProcessServerSigKexCb(ssl,
  25021. args->sigAlgo,
  25022. args->verifySig, args->verifySigSz,
  25023. ssl->buffers.sig.buffer, SEED_LEN,
  25024. &ssl->buffers.sig.buffer[SEED_LEN],
  25025. (ssl->buffers.sig.length - SEED_LEN));
  25026. }
  25027. #endif /* HAVE_PK_CALLBACKS */
  25028. if (ret == NOT_COMPILED_IN) {
  25029. ret = EccVerify(ssl,
  25030. args->verifySig, args->verifySigSz,
  25031. ssl->buffers.digest.buffer,
  25032. ssl->buffers.digest.length,
  25033. ssl->peerEccDsaKey,
  25034. #ifdef HAVE_PK_CALLBACKS
  25035. &ssl->buffers.peerEccDsaKey
  25036. #else
  25037. NULL
  25038. #endif
  25039. );
  25040. }
  25041. #ifdef WOLFSSL_ASYNC_CRYPT
  25042. if (ret != WC_PENDING_E)
  25043. #endif
  25044. {
  25045. /* peerEccDsaKey */
  25046. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  25047. (void**)&ssl->peerEccDsaKey);
  25048. ssl->peerEccDsaKeyPresent = 0;
  25049. }
  25050. /* CLIENT: Data verified with cert's public key. */
  25051. ssl->options.peerAuthGood =
  25052. ssl->options.havePeerCert && (ret == 0);
  25053. break;
  25054. }
  25055. #endif /* HAVE_ECC */
  25056. #if defined(HAVE_ED25519)
  25057. case ed25519_sa_algo:
  25058. {
  25059. ret = Ed25519Verify(ssl,
  25060. args->verifySig, args->verifySigSz,
  25061. ssl->buffers.sig.buffer,
  25062. ssl->buffers.sig.length,
  25063. ssl->peerEd25519Key,
  25064. #ifdef HAVE_PK_CALLBACKS
  25065. &ssl->buffers.peerEd25519Key
  25066. #else
  25067. NULL
  25068. #endif
  25069. );
  25070. #ifdef WOLFSSL_ASYNC_CRYPT
  25071. if (ret != WC_PENDING_E)
  25072. #endif
  25073. {
  25074. /* peerEccDsaKey */
  25075. FreeKey(ssl, DYNAMIC_TYPE_ED25519,
  25076. (void**)&ssl->peerEd25519Key);
  25077. ssl->peerEd25519KeyPresent = 0;
  25078. }
  25079. /* CLIENT: Data verified with cert's public key. */
  25080. ssl->options.peerAuthGood =
  25081. ssl->options.havePeerCert && (ret == 0);
  25082. break;
  25083. }
  25084. #endif /* HAVE_ED25519 */
  25085. #if defined(HAVE_ED448)
  25086. case ed448_sa_algo:
  25087. {
  25088. ret = Ed448Verify(ssl,
  25089. args->verifySig, args->verifySigSz,
  25090. ssl->buffers.sig.buffer,
  25091. ssl->buffers.sig.length,
  25092. ssl->peerEd448Key,
  25093. #ifdef HAVE_PK_CALLBACKS
  25094. &ssl->buffers.peerEd448Key
  25095. #else
  25096. NULL
  25097. #endif
  25098. );
  25099. #ifdef WOLFSSL_ASYNC_CRYPT
  25100. if (ret != WC_PENDING_E)
  25101. #endif
  25102. {
  25103. /* peerEccDsaKey */
  25104. FreeKey(ssl, DYNAMIC_TYPE_ED448,
  25105. (void**)&ssl->peerEd448Key);
  25106. ssl->peerEd448KeyPresent = 0;
  25107. }
  25108. /* CLIENT: Data verified with cert's public key. */
  25109. ssl->options.peerAuthGood =
  25110. ssl->options.havePeerCert && (ret == 0);
  25111. break;
  25112. }
  25113. #endif /* HAVE_ED448 */
  25114. default:
  25115. ret = ALGO_ID_E;
  25116. } /* switch (sigAlgo) */
  25117. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  25118. break;
  25119. }
  25120. default:
  25121. ret = BAD_KEA_TYPE_E;
  25122. } /* switch(ssl->specs.kea) */
  25123. /* Check for error */
  25124. if (ret != 0) {
  25125. goto exit_dske;
  25126. }
  25127. /* Advance state and proceed */
  25128. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  25129. } /* case TLS_ASYNC_DO */
  25130. FALL_THROUGH;
  25131. case TLS_ASYNC_VERIFY:
  25132. {
  25133. switch(ssl->specs.kea)
  25134. {
  25135. case psk_kea:
  25136. case dhe_psk_kea:
  25137. case ecdhe_psk_kea:
  25138. {
  25139. /* Nothing to do in this sub-state */
  25140. break;
  25141. }
  25142. case diffie_hellman_kea:
  25143. case ecc_diffie_hellman_kea:
  25144. {
  25145. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  25146. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  25147. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  25148. #else
  25149. if (ssl->options.usingAnon_cipher) {
  25150. break;
  25151. }
  25152. /* increment index after verify is done */
  25153. args->idx += args->verifySigSz;
  25154. switch(args->sigAlgo)
  25155. {
  25156. #ifndef NO_RSA
  25157. #ifdef WC_RSA_PSS
  25158. case rsa_pss_sa_algo:
  25159. #ifdef HAVE_SELFTEST
  25160. ret = wc_RsaPSS_CheckPadding(
  25161. ssl->buffers.digest.buffer,
  25162. ssl->buffers.digest.length,
  25163. args->output, args->sigSz,
  25164. HashAlgoToType(args->hashAlgo));
  25165. #else
  25166. ret = wc_RsaPSS_CheckPadding_ex(
  25167. ssl->buffers.digest.buffer,
  25168. ssl->buffers.digest.length,
  25169. args->output, args->sigSz,
  25170. HashAlgoToType(args->hashAlgo),
  25171. -1, args->bits);
  25172. #endif
  25173. if (ret != 0)
  25174. goto exit_dske;
  25175. /* CLIENT: Data verified with cert's public key. */
  25176. ssl->options.peerAuthGood =
  25177. ssl->options.havePeerCert;
  25178. break;
  25179. #endif
  25180. case rsa_sa_algo:
  25181. {
  25182. #if (defined(WOLFSSL_RENESAS_SCEPROTECT) && \
  25183. defined(WOLFSSL_RENESAS_SCEPROTECT_ECC)) || \
  25184. defined(WOLFSSL_RENESAS_TSIP_TLS)
  25185. /* already checked signature result by SCE */
  25186. /* skip the sign checks below */
  25187. if (Renesas_cmn_usable(ssl, 0)) {
  25188. break;
  25189. }
  25190. #endif
  25191. if (IsAtLeastTLSv1_2(ssl)) {
  25192. #ifdef WOLFSSL_SMALL_STACK
  25193. byte* encodedSig;
  25194. #else
  25195. byte encodedSig[MAX_ENCODED_SIG_SZ];
  25196. #endif
  25197. word32 encSigSz;
  25198. #ifdef WOLFSSL_SMALL_STACK
  25199. encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  25200. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  25201. if (encodedSig == NULL) {
  25202. ERROR_OUT(MEMORY_E, exit_dske);
  25203. }
  25204. #endif
  25205. encSigSz = wc_EncodeSignature(encodedSig,
  25206. ssl->buffers.digest.buffer,
  25207. ssl->buffers.digest.length,
  25208. TypeHash(args->hashAlgo));
  25209. if (encSigSz != args->sigSz || !args->output ||
  25210. XMEMCMP(args->output, encodedSig,
  25211. min(encSigSz, MAX_ENCODED_SIG_SZ)) != 0) {
  25212. ret = VERIFY_SIGN_ERROR;
  25213. }
  25214. #ifdef WOLFSSL_SMALL_STACK
  25215. XFREE(encodedSig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  25216. #endif
  25217. if (ret != 0) {
  25218. goto exit_dske;
  25219. }
  25220. }
  25221. else if (args->sigSz != FINISHED_SZ ||
  25222. !args->output ||
  25223. XMEMCMP(args->output,
  25224. ssl->buffers.digest.buffer,
  25225. FINISHED_SZ) != 0) {
  25226. ERROR_OUT(VERIFY_SIGN_ERROR, exit_dske);
  25227. }
  25228. /* CLIENT: Data verified with cert's public key. */
  25229. ssl->options.peerAuthGood =
  25230. ssl->options.havePeerCert;
  25231. break;
  25232. }
  25233. #endif /* !NO_RSA */
  25234. #ifdef HAVE_ECC
  25235. case ecc_dsa_sa_algo:
  25236. /* Nothing to do in this algo */
  25237. break;
  25238. #endif /* HAVE_ECC */
  25239. #if defined(HAVE_ED25519)
  25240. case ed25519_sa_algo:
  25241. /* Nothing to do in this algo */
  25242. break;
  25243. #endif /* HAVE_ED25519 */
  25244. #if defined(HAVE_ED448)
  25245. case ed448_sa_algo:
  25246. /* Nothing to do in this algo */
  25247. break;
  25248. #endif /* HAVE_ED448 */
  25249. default:
  25250. ret = ALGO_ID_E;
  25251. } /* switch (sigAlgo) */
  25252. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  25253. break;
  25254. }
  25255. default:
  25256. ret = BAD_KEA_TYPE_E;
  25257. } /* switch(ssl->specs.kea) */
  25258. /* Check for error */
  25259. if (ret != 0) {
  25260. goto exit_dske;
  25261. }
  25262. /* Advance state and proceed */
  25263. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  25264. } /* case TLS_ASYNC_VERIFY */
  25265. FALL_THROUGH;
  25266. case TLS_ASYNC_FINALIZE:
  25267. {
  25268. if (IsEncryptionOn(ssl, 0)) {
  25269. args->idx += ssl->keys.padSz;
  25270. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  25271. if (ssl->options.startedETMRead)
  25272. args->idx += MacSize(ssl);
  25273. #endif
  25274. }
  25275. /* Advance state and proceed */
  25276. ssl->options.asyncState = TLS_ASYNC_END;
  25277. } /* case TLS_ASYNC_FINALIZE */
  25278. FALL_THROUGH;
  25279. case TLS_ASYNC_END:
  25280. {
  25281. /* return index */
  25282. *inOutIdx = args->idx;
  25283. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  25284. break;
  25285. }
  25286. default:
  25287. ret = INPUT_CASE_ERROR;
  25288. } /* switch(ssl->options.asyncState) */
  25289. exit_dske:
  25290. WOLFSSL_LEAVE("DoServerKeyExchange", ret);
  25291. WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_DO);
  25292. #ifdef WOLFSSL_ASYNC_CRYPT
  25293. /* Handle async operation */
  25294. if (ret == WC_PENDING_E) {
  25295. /* Mark message as not received so it can process again */
  25296. ssl->msgsReceived.got_server_key_exchange = 0;
  25297. return ret;
  25298. }
  25299. /* Cleanup async */
  25300. FreeAsyncCtx(ssl, 0);
  25301. #else
  25302. FreeDskeArgs(ssl, args);
  25303. #endif /* WOLFSSL_ASYNC_CRYPT */
  25304. /* Final cleanup */
  25305. FreeKeyExchange(ssl);
  25306. if (ret != 0) {
  25307. WOLFSSL_ERROR_VERBOSE(ret);
  25308. }
  25309. return ret;
  25310. }
  25311. typedef struct SckeArgs {
  25312. byte* output; /* not allocated */
  25313. byte* encSecret;
  25314. byte* input;
  25315. word32 encSz;
  25316. word32 length;
  25317. int sendSz;
  25318. int inputSz;
  25319. } SckeArgs;
  25320. static void FreeSckeArgs(WOLFSSL* ssl, void* pArgs)
  25321. {
  25322. SckeArgs* args = (SckeArgs*)pArgs;
  25323. (void)ssl;
  25324. if (args->encSecret) {
  25325. XFREE(args->encSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
  25326. args->encSecret = NULL;
  25327. }
  25328. if (args->input) {
  25329. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25330. args->input = NULL;
  25331. }
  25332. }
  25333. /* handle generation client_key_exchange (16) */
  25334. int SendClientKeyExchange(WOLFSSL* ssl)
  25335. {
  25336. int ret = 0;
  25337. #ifdef WOLFSSL_ASYNC_IO
  25338. SckeArgs* args = NULL;
  25339. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  25340. #else
  25341. SckeArgs args[1];
  25342. #endif
  25343. WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
  25344. WOLFSSL_ENTER("SendClientKeyExchange");
  25345. #ifdef OPENSSL_EXTRA
  25346. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  25347. ssl->cbmode = SSL_CB_MODE_WRITE;
  25348. if (ssl->CBIS != NULL)
  25349. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, WOLFSSL_SUCCESS);
  25350. #endif
  25351. #ifdef WOLFSSL_ASYNC_IO
  25352. if (ssl->async == NULL) {
  25353. ssl->async = (struct WOLFSSL_ASYNC*)
  25354. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  25355. DYNAMIC_TYPE_ASYNC);
  25356. if (ssl->async == NULL)
  25357. ERROR_OUT(MEMORY_E, exit_scke);
  25358. XMEMSET(ssl->async, 0, sizeof(struct WOLFSSL_ASYNC));
  25359. }
  25360. args = (SckeArgs*)ssl->async->args;
  25361. #ifdef WOLFSSL_ASYNC_CRYPT
  25362. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  25363. if (ret != WC_NOT_PENDING_E) {
  25364. /* Check for error */
  25365. if (ret < 0)
  25366. goto exit_scke;
  25367. }
  25368. else
  25369. #endif
  25370. if (ssl->options.buildingMsg) {
  25371. /* Continue building the message */
  25372. }
  25373. else
  25374. #endif
  25375. {
  25376. /* Reset state */
  25377. ret = 0;
  25378. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  25379. XMEMSET(args, 0, sizeof(SckeArgs));
  25380. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  25381. * is not advanced yet */
  25382. ssl->options.buildingMsg = 1;
  25383. #ifdef WOLFSSL_ASYNC_IO
  25384. ssl->async->freeArgs = FreeSckeArgs;
  25385. #endif
  25386. }
  25387. switch(ssl->options.asyncState)
  25388. {
  25389. case TLS_ASYNC_BEGIN:
  25390. {
  25391. switch (ssl->specs.kea) {
  25392. #ifndef NO_RSA
  25393. case rsa_kea:
  25394. if (ssl->peerRsaKey == NULL ||
  25395. ssl->peerRsaKeyPresent == 0) {
  25396. ERROR_OUT(NO_PEER_KEY, exit_scke);
  25397. }
  25398. break;
  25399. #endif
  25400. #ifndef NO_DH
  25401. case diffie_hellman_kea:
  25402. if (ssl->buffers.serverDH_P.buffer == NULL ||
  25403. ssl->buffers.serverDH_G.buffer == NULL ||
  25404. ssl->buffers.serverDH_Pub.buffer == NULL) {
  25405. ERROR_OUT(NO_PEER_KEY, exit_scke);
  25406. }
  25407. break;
  25408. #endif /* NO_DH */
  25409. #ifndef NO_PSK
  25410. case psk_kea:
  25411. /* sanity check that PSK client callback has been set */
  25412. if (ssl->options.client_psk_cb == NULL) {
  25413. WOLFSSL_MSG("No client PSK callback set");
  25414. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  25415. }
  25416. break;
  25417. #endif /* NO_PSK */
  25418. #if !defined(NO_DH) && !defined(NO_PSK)
  25419. case dhe_psk_kea:
  25420. if (ssl->buffers.serverDH_P.buffer == NULL ||
  25421. ssl->buffers.serverDH_G.buffer == NULL ||
  25422. ssl->buffers.serverDH_Pub.buffer == NULL) {
  25423. ERROR_OUT(NO_PEER_KEY, exit_scke);
  25424. }
  25425. /* sanity check that PSK client callback has been set */
  25426. if (ssl->options.client_psk_cb == NULL) {
  25427. WOLFSSL_MSG("No client PSK callback set");
  25428. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  25429. }
  25430. break;
  25431. #endif /* !NO_DH && !NO_PSK */
  25432. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25433. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  25434. case ecdhe_psk_kea:
  25435. /* sanity check that PSK client callback has been set */
  25436. if (ssl->options.client_psk_cb == NULL) {
  25437. WOLFSSL_MSG("No client PSK callback set");
  25438. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  25439. }
  25440. #ifdef HAVE_CURVE25519
  25441. if (ssl->peerX25519KeyPresent) {
  25442. /* Check client ECC public key */
  25443. if (!ssl->peerX25519Key || !ssl->peerX25519Key->dp) {
  25444. ERROR_OUT(NO_PEER_KEY, exit_scke);
  25445. }
  25446. #ifdef HAVE_PK_CALLBACKS
  25447. /* if callback then use it for shared secret */
  25448. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  25449. break;
  25450. }
  25451. #endif
  25452. /* create private key */
  25453. ssl->hsType = DYNAMIC_TYPE_CURVE25519;
  25454. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  25455. if (ret != 0) {
  25456. goto exit_scke;
  25457. }
  25458. ret = X25519MakeKey(ssl, (curve25519_key*)ssl->hsKey,
  25459. ssl->peerX25519Key);
  25460. break;
  25461. }
  25462. #endif
  25463. #ifdef HAVE_CURVE448
  25464. if (ssl->peerX448KeyPresent) {
  25465. /* Check client ECC public key */
  25466. if (!ssl->peerX448Key) {
  25467. ERROR_OUT(NO_PEER_KEY, exit_scke);
  25468. }
  25469. #ifdef HAVE_PK_CALLBACKS
  25470. /* if callback then use it for shared secret */
  25471. if (ssl->ctx->X448SharedSecretCb != NULL) {
  25472. break;
  25473. }
  25474. #endif
  25475. /* create private key */
  25476. ssl->hsType = DYNAMIC_TYPE_CURVE448;
  25477. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  25478. if (ret != 0) {
  25479. goto exit_scke;
  25480. }
  25481. ret = X448MakeKey(ssl, (curve448_key*)ssl->hsKey,
  25482. ssl->peerX448Key);
  25483. break;
  25484. }
  25485. #endif
  25486. /* Check client ECC public key */
  25487. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent ||
  25488. !ssl->peerEccKey->dp) {
  25489. ERROR_OUT(NO_PEER_KEY, exit_scke);
  25490. }
  25491. #ifdef HAVE_PK_CALLBACKS
  25492. /* if callback then use it for shared secret */
  25493. if (ssl->ctx->EccSharedSecretCb != NULL) {
  25494. break;
  25495. }
  25496. #endif
  25497. /* create ephemeral private key */
  25498. ssl->hsType = DYNAMIC_TYPE_ECC;
  25499. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  25500. if (ret != 0) {
  25501. goto exit_scke;
  25502. }
  25503. ret = EccMakeKey(ssl, (ecc_key*)ssl->hsKey, ssl->peerEccKey);
  25504. break;
  25505. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  25506. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25507. defined(HAVE_CURVE448)
  25508. case ecc_diffie_hellman_kea:
  25509. {
  25510. #ifdef HAVE_ECC
  25511. ecc_key* peerKey;
  25512. #endif
  25513. #ifdef HAVE_PK_CALLBACKS
  25514. /* if callback then use it for shared secret */
  25515. #ifdef HAVE_CURVE25519
  25516. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  25517. if (ssl->ctx->X25519SharedSecretCb != NULL)
  25518. break;
  25519. }
  25520. else
  25521. #endif
  25522. #ifdef HAVE_CURVE448
  25523. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  25524. if (ssl->ctx->X448SharedSecretCb != NULL)
  25525. break;
  25526. }
  25527. else
  25528. #endif
  25529. #ifdef HAVE_ECC
  25530. if (ssl->ctx->EccSharedSecretCb != NULL) {
  25531. break;
  25532. }
  25533. else
  25534. #endif
  25535. {
  25536. }
  25537. #endif /* HAVE_PK_CALLBACKS */
  25538. #ifdef HAVE_CURVE25519
  25539. if (ssl->peerX25519KeyPresent) {
  25540. if (!ssl->peerX25519Key || !ssl->peerX25519Key->dp) {
  25541. ERROR_OUT(NO_PEER_KEY, exit_scke);
  25542. }
  25543. /* create private key */
  25544. ssl->hsType = DYNAMIC_TYPE_CURVE25519;
  25545. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  25546. if (ret != 0) {
  25547. goto exit_scke;
  25548. }
  25549. ret = X25519MakeKey(ssl, (curve25519_key*)ssl->hsKey,
  25550. ssl->peerX25519Key);
  25551. break;
  25552. }
  25553. #endif
  25554. #ifdef HAVE_CURVE448
  25555. if (ssl->peerX448KeyPresent) {
  25556. if (!ssl->peerX448Key) {
  25557. ERROR_OUT(NO_PEER_KEY, exit_scke);
  25558. }
  25559. /* create private key */
  25560. ssl->hsType = DYNAMIC_TYPE_CURVE448;
  25561. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  25562. if (ret != 0) {
  25563. goto exit_scke;
  25564. }
  25565. ret = X448MakeKey(ssl, (curve448_key*)ssl->hsKey,
  25566. ssl->peerX448Key);
  25567. break;
  25568. }
  25569. #endif
  25570. #ifdef HAVE_ECC
  25571. if (ssl->specs.static_ecdh) {
  25572. /* Note: EccDsa is really fixed Ecc key here */
  25573. if (!ssl->peerEccDsaKey || !ssl->peerEccDsaKeyPresent) {
  25574. ERROR_OUT(NO_PEER_KEY, exit_scke);
  25575. }
  25576. peerKey = ssl->peerEccDsaKey;
  25577. }
  25578. else {
  25579. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent) {
  25580. ERROR_OUT(NO_PEER_KEY, exit_scke);
  25581. }
  25582. peerKey = ssl->peerEccKey;
  25583. }
  25584. if (peerKey == NULL) {
  25585. ERROR_OUT(NO_PEER_KEY, exit_scke);
  25586. }
  25587. /* create ephemeral private key */
  25588. ssl->hsType = DYNAMIC_TYPE_ECC;
  25589. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  25590. if (ret != 0) {
  25591. goto exit_scke;
  25592. }
  25593. ret = EccMakeKey(ssl, (ecc_key*)ssl->hsKey, peerKey);
  25594. #endif /* HAVE_ECC */
  25595. break;
  25596. }
  25597. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  25598. default:
  25599. ret = BAD_KEA_TYPE_E;
  25600. } /* switch(ssl->specs.kea) */
  25601. /* Check for error */
  25602. if (ret != 0) {
  25603. goto exit_scke;
  25604. }
  25605. /* Advance state and proceed */
  25606. ssl->options.asyncState = TLS_ASYNC_BUILD;
  25607. } /* case TLS_ASYNC_BEGIN */
  25608. FALL_THROUGH;
  25609. case TLS_ASYNC_BUILD:
  25610. {
  25611. args->encSz = MAX_ENCRYPT_SZ;
  25612. args->encSecret = (byte*)XMALLOC(MAX_ENCRYPT_SZ, ssl->heap,
  25613. DYNAMIC_TYPE_SECRET);
  25614. if (args->encSecret == NULL) {
  25615. ERROR_OUT(MEMORY_E, exit_scke);
  25616. }
  25617. if (ssl->arrays->preMasterSecret == NULL) {
  25618. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  25619. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN,
  25620. ssl->heap, DYNAMIC_TYPE_SECRET);
  25621. if (ssl->arrays->preMasterSecret == NULL) {
  25622. ERROR_OUT(MEMORY_E, exit_scke);
  25623. }
  25624. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  25625. }
  25626. switch(ssl->specs.kea)
  25627. {
  25628. #ifndef NO_RSA
  25629. case rsa_kea:
  25630. {
  25631. #ifdef HAVE_PK_CALLBACKS
  25632. if (ssl->ctx->GenPreMasterCb) {
  25633. void* ctx = wolfSSL_GetGenPreMasterCtx(ssl);
  25634. ret = ssl->ctx->GenPreMasterCb(ssl,
  25635. ssl->arrays->preMasterSecret, ENCRYPT_LEN, ctx);
  25636. if (ret != 0 && ret != PROTOCOLCB_UNAVAILABLE) {
  25637. goto exit_scke;
  25638. }
  25639. }
  25640. if (!ssl->ctx->GenPreMasterCb || ret == PROTOCOLCB_UNAVAILABLE)
  25641. #endif
  25642. {
  25643. /* build PreMasterSecret with RNG data */
  25644. ret = wc_RNG_GenerateBlock(ssl->rng,
  25645. &ssl->arrays->preMasterSecret[VERSION_SZ],
  25646. SECRET_LEN - VERSION_SZ);
  25647. if (ret != 0) {
  25648. goto exit_scke;
  25649. }
  25650. ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
  25651. ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
  25652. ssl->arrays->preMasterSz = SECRET_LEN;
  25653. }
  25654. break;
  25655. }
  25656. #endif /* !NO_RSA */
  25657. #ifndef NO_DH
  25658. case diffie_hellman_kea:
  25659. {
  25660. ssl->buffers.sig.length = ENCRYPT_LEN;
  25661. ssl->buffers.sig.buffer = (byte*)XMALLOC(ENCRYPT_LEN,
  25662. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  25663. if (ssl->buffers.sig.buffer == NULL) {
  25664. ERROR_OUT(MEMORY_E, exit_scke);
  25665. }
  25666. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  25667. (void**)&ssl->buffers.serverDH_Key);
  25668. if (ret != 0) {
  25669. goto exit_scke;
  25670. }
  25671. #if defined(HAVE_FFDHE) && !defined(HAVE_PUBLIC_FFDHE)
  25672. if (ssl->namedGroup) {
  25673. ret = wc_DhSetNamedKey(ssl->buffers.serverDH_Key,
  25674. ssl->namedGroup);
  25675. if (ret != 0) {
  25676. goto exit_scke;
  25677. }
  25678. ssl->buffers.sig.length =
  25679. wc_DhGetNamedKeyMinSize(ssl->namedGroup);
  25680. }
  25681. else
  25682. #endif
  25683. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  25684. !defined(WOLFSSL_OLD_PRIME_CHECK)
  25685. if (ssl->options.dhDoKeyTest &&
  25686. !ssl->options.dhKeyTested)
  25687. {
  25688. ret = wc_DhSetCheckKey(ssl->buffers.serverDH_Key,
  25689. ssl->buffers.serverDH_P.buffer,
  25690. ssl->buffers.serverDH_P.length,
  25691. ssl->buffers.serverDH_G.buffer,
  25692. ssl->buffers.serverDH_G.length,
  25693. NULL, 0, 0, ssl->rng);
  25694. if (ret != 0) {
  25695. goto exit_scke;
  25696. }
  25697. ssl->options.dhKeyTested = 1;
  25698. }
  25699. else
  25700. #endif
  25701. {
  25702. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  25703. ssl->buffers.serverDH_P.buffer,
  25704. ssl->buffers.serverDH_P.length,
  25705. ssl->buffers.serverDH_G.buffer,
  25706. ssl->buffers.serverDH_G.length);
  25707. if (ret != 0) {
  25708. goto exit_scke;
  25709. }
  25710. }
  25711. /* for DH, encSecret is Yc, agree is pre-master */
  25712. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  25713. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  25714. args->encSecret, &args->encSz);
  25715. /* set the max agree result size */
  25716. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  25717. break;
  25718. }
  25719. #endif /* !NO_DH */
  25720. #ifndef NO_PSK
  25721. case psk_kea:
  25722. {
  25723. byte* pms = ssl->arrays->preMasterSecret;
  25724. int cbret = (int)ssl->options.client_psk_cb(ssl,
  25725. ssl->arrays->server_hint, ssl->arrays->client_identity,
  25726. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  25727. if (cbret == 0 || cbret > MAX_PSK_KEY_LEN) {
  25728. if (cbret != USE_HW_PSK) {
  25729. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  25730. }
  25731. }
  25732. if (cbret == USE_HW_PSK) {
  25733. /* USE_HW_PSK indicates that the hardware has the PSK
  25734. * and generates the premaster secret. */
  25735. ssl->arrays->psk_keySz = 0;
  25736. }
  25737. else {
  25738. ssl->arrays->psk_keySz = (word32)cbret;
  25739. }
  25740. /* Ensure the buffer is null-terminated. */
  25741. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
  25742. args->encSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  25743. if (args->encSz > MAX_PSK_ID_LEN) {
  25744. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  25745. }
  25746. XMEMCPY(args->encSecret, ssl->arrays->client_identity,
  25747. args->encSz);
  25748. ssl->options.peerAuthGood = 1;
  25749. if (cbret != USE_HW_PSK) {
  25750. /* CLIENT: Pre-shared Key for peer authentication. */
  25751. /* make psk pre master secret */
  25752. /* length of key + length 0s + length of key + key */
  25753. c16toa((word16)ssl->arrays->psk_keySz, pms);
  25754. pms += OPAQUE16_LEN;
  25755. XMEMSET(pms, 0, ssl->arrays->psk_keySz);
  25756. pms += ssl->arrays->psk_keySz;
  25757. c16toa((word16)ssl->arrays->psk_keySz, pms);
  25758. pms += OPAQUE16_LEN;
  25759. XMEMCPY(pms, ssl->arrays->psk_key,
  25760. ssl->arrays->psk_keySz);
  25761. ssl->arrays->preMasterSz = (ssl->arrays->psk_keySz * 2)
  25762. + (2 * OPAQUE16_LEN);
  25763. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  25764. ssl->arrays->psk_keySz = 0; /* No further need */
  25765. }
  25766. break;
  25767. }
  25768. #endif /* !NO_PSK */
  25769. #if !defined(NO_DH) && !defined(NO_PSK)
  25770. case dhe_psk_kea:
  25771. {
  25772. word32 esSz = 0;
  25773. args->output = args->encSecret;
  25774. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  25775. ssl->arrays->server_hint, ssl->arrays->client_identity,
  25776. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  25777. if (ssl->arrays->psk_keySz == 0 ||
  25778. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  25779. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  25780. }
  25781. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  25782. esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  25783. if (esSz > MAX_PSK_ID_LEN) {
  25784. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  25785. }
  25786. /* CLIENT: Pre-shared Key for peer authentication. */
  25787. ssl->options.peerAuthGood = 1;
  25788. ssl->buffers.sig.length = ENCRYPT_LEN;
  25789. ssl->buffers.sig.buffer = (byte*)XMALLOC(ENCRYPT_LEN,
  25790. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  25791. if (ssl->buffers.sig.buffer == NULL) {
  25792. ERROR_OUT(MEMORY_E, exit_scke);
  25793. }
  25794. c16toa((word16)esSz, args->output);
  25795. args->output += OPAQUE16_LEN;
  25796. XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
  25797. args->output += esSz;
  25798. args->length = args->encSz - esSz - OPAQUE16_LEN;
  25799. args->encSz = esSz + OPAQUE16_LEN;
  25800. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  25801. (void**)&ssl->buffers.serverDH_Key);
  25802. if (ret != 0) {
  25803. goto exit_scke;
  25804. }
  25805. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  25806. !defined(WOLFSSL_OLD_PRIME_CHECK)
  25807. if (ssl->options.dhDoKeyTest &&
  25808. !ssl->options.dhKeyTested)
  25809. {
  25810. ret = wc_DhSetCheckKey(ssl->buffers.serverDH_Key,
  25811. ssl->buffers.serverDH_P.buffer,
  25812. ssl->buffers.serverDH_P.length,
  25813. ssl->buffers.serverDH_G.buffer,
  25814. ssl->buffers.serverDH_G.length,
  25815. NULL, 0, 0, ssl->rng);
  25816. if (ret != 0) {
  25817. goto exit_scke;
  25818. }
  25819. ssl->options.dhKeyTested = 1;
  25820. }
  25821. else
  25822. #endif
  25823. {
  25824. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  25825. ssl->buffers.serverDH_P.buffer,
  25826. ssl->buffers.serverDH_P.length,
  25827. ssl->buffers.serverDH_G.buffer,
  25828. ssl->buffers.serverDH_G.length);
  25829. if (ret != 0) {
  25830. goto exit_scke;
  25831. }
  25832. }
  25833. /* for DH, encSecret is Yc, agree is pre-master */
  25834. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  25835. ssl->buffers.sig.buffer,
  25836. (word32*)&ssl->buffers.sig.length,
  25837. args->output + OPAQUE16_LEN, &args->length);
  25838. break;
  25839. }
  25840. #endif /* !NO_DH && !NO_PSK */
  25841. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25842. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  25843. case ecdhe_psk_kea:
  25844. {
  25845. word32 esSz = 0;
  25846. args->output = args->encSecret;
  25847. /* Send PSK client identity */
  25848. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  25849. ssl->arrays->server_hint, ssl->arrays->client_identity,
  25850. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  25851. if (ssl->arrays->psk_keySz == 0 ||
  25852. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  25853. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  25854. }
  25855. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  25856. esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  25857. if (esSz > MAX_PSK_ID_LEN) {
  25858. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  25859. }
  25860. /* CLIENT: Pre-shared Key for peer authentication. */
  25861. ssl->options.peerAuthGood = 1;
  25862. /* place size and identity in output buffer sz:identity */
  25863. c16toa((word16)esSz, args->output);
  25864. args->output += OPAQUE16_LEN;
  25865. XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
  25866. args->output += esSz;
  25867. args->encSz = esSz + OPAQUE16_LEN;
  25868. /* length is used for public key size */
  25869. args->length = MAX_ENCRYPT_SZ;
  25870. /* Create shared ECC key leaving room at the beginning
  25871. of buffer for size of shared key. */
  25872. ssl->arrays->preMasterSz = ENCRYPT_LEN - OPAQUE16_LEN;
  25873. #ifdef HAVE_CURVE25519
  25874. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  25875. #ifdef HAVE_PK_CALLBACKS
  25876. /* if callback then use it for shared secret */
  25877. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  25878. break;
  25879. }
  25880. #endif
  25881. ret = wc_curve25519_export_public_ex(
  25882. (curve25519_key*)ssl->hsKey,
  25883. args->output + OPAQUE8_LEN, &args->length,
  25884. EC25519_LITTLE_ENDIAN);
  25885. if (ret != 0) {
  25886. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  25887. }
  25888. break;
  25889. }
  25890. #endif
  25891. #ifdef HAVE_CURVE448
  25892. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  25893. #ifdef HAVE_PK_CALLBACKS
  25894. /* if callback then use it for shared secret */
  25895. if (ssl->ctx->X448SharedSecretCb != NULL) {
  25896. break;
  25897. }
  25898. #endif
  25899. ret = wc_curve448_export_public_ex(
  25900. (curve448_key*)ssl->hsKey,
  25901. args->output + OPAQUE8_LEN, &args->length,
  25902. EC448_LITTLE_ENDIAN);
  25903. if (ret != 0) {
  25904. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  25905. }
  25906. break;
  25907. }
  25908. #endif
  25909. #ifdef HAVE_PK_CALLBACKS
  25910. /* if callback then use it for shared secret */
  25911. if (ssl->ctx->EccSharedSecretCb != NULL) {
  25912. break;
  25913. }
  25914. #endif
  25915. /* Place ECC key in output buffer, leaving room for size */
  25916. PRIVATE_KEY_UNLOCK();
  25917. ret = wc_ecc_export_x963((ecc_key*)ssl->hsKey,
  25918. args->output + OPAQUE8_LEN, &args->length);
  25919. PRIVATE_KEY_LOCK();
  25920. if (ret != 0) {
  25921. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  25922. }
  25923. break;
  25924. }
  25925. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  25926. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25927. defined(HAVE_CURVE448)
  25928. case ecc_diffie_hellman_kea:
  25929. {
  25930. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  25931. #ifdef HAVE_CURVE25519
  25932. if (ssl->hsType == DYNAMIC_TYPE_CURVE25519) {
  25933. #ifdef HAVE_PK_CALLBACKS
  25934. /* if callback then use it for shared secret */
  25935. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  25936. break;
  25937. }
  25938. #endif
  25939. ret = wc_curve25519_export_public_ex(
  25940. (curve25519_key*)ssl->hsKey,
  25941. args->encSecret + OPAQUE8_LEN, &args->encSz,
  25942. EC25519_LITTLE_ENDIAN);
  25943. if (ret != 0) {
  25944. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  25945. }
  25946. break;
  25947. }
  25948. #endif
  25949. #ifdef HAVE_CURVE448
  25950. if (ssl->hsType == DYNAMIC_TYPE_CURVE448) {
  25951. #ifdef HAVE_PK_CALLBACKS
  25952. /* if callback then use it for shared secret */
  25953. if (ssl->ctx->X448SharedSecretCb != NULL) {
  25954. break;
  25955. }
  25956. #endif
  25957. ret = wc_curve448_export_public_ex(
  25958. (curve448_key*)ssl->hsKey,
  25959. args->encSecret + OPAQUE8_LEN, &args->encSz,
  25960. EC448_LITTLE_ENDIAN);
  25961. if (ret != 0) {
  25962. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  25963. }
  25964. break;
  25965. }
  25966. #endif
  25967. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  25968. #ifdef HAVE_PK_CALLBACKS
  25969. /* if callback then use it for shared secret */
  25970. if (ssl->ctx->EccSharedSecretCb != NULL) {
  25971. break;
  25972. }
  25973. #endif
  25974. /* Place ECC key in buffer, leaving room for size */
  25975. PRIVATE_KEY_UNLOCK();
  25976. ret = wc_ecc_export_x963((ecc_key*)ssl->hsKey,
  25977. args->encSecret + OPAQUE8_LEN, &args->encSz);
  25978. PRIVATE_KEY_LOCK();
  25979. if (ret != 0) {
  25980. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  25981. }
  25982. #endif /* HAVE_ECC */
  25983. break;
  25984. }
  25985. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  25986. default:
  25987. ret = BAD_KEA_TYPE_E;
  25988. } /* switch(ssl->specs.kea) */
  25989. /* Check for error */
  25990. if (ret != 0) {
  25991. goto exit_scke;
  25992. }
  25993. /* Advance state and proceed */
  25994. ssl->options.asyncState = TLS_ASYNC_DO;
  25995. } /* case TLS_ASYNC_BUILD */
  25996. FALL_THROUGH;
  25997. case TLS_ASYNC_DO:
  25998. {
  25999. switch(ssl->specs.kea)
  26000. {
  26001. #ifndef NO_RSA
  26002. case rsa_kea:
  26003. {
  26004. ret = RsaEnc(ssl,
  26005. ssl->arrays->preMasterSecret, SECRET_LEN,
  26006. args->encSecret, &args->encSz,
  26007. ssl->peerRsaKey,
  26008. #if defined(HAVE_PK_CALLBACKS)
  26009. &ssl->buffers.peerRsaKey
  26010. #else
  26011. NULL
  26012. #endif
  26013. );
  26014. break;
  26015. }
  26016. #endif /* !NO_RSA */
  26017. #ifndef NO_DH
  26018. case diffie_hellman_kea:
  26019. {
  26020. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  26021. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  26022. ssl->buffers.serverDH_Pub.buffer,
  26023. ssl->buffers.serverDH_Pub.length,
  26024. ssl->arrays->preMasterSecret,
  26025. &ssl->arrays->preMasterSz,
  26026. ssl->buffers.serverDH_P.buffer,
  26027. ssl->buffers.serverDH_P.length);
  26028. break;
  26029. }
  26030. #endif /* !NO_DH */
  26031. #ifndef NO_PSK
  26032. case psk_kea:
  26033. {
  26034. break;
  26035. }
  26036. #endif /* !NO_PSK */
  26037. #if !defined(NO_DH) && !defined(NO_PSK)
  26038. case dhe_psk_kea:
  26039. {
  26040. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  26041. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  26042. ssl->buffers.serverDH_Pub.buffer,
  26043. ssl->buffers.serverDH_Pub.length,
  26044. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  26045. &ssl->arrays->preMasterSz,
  26046. ssl->buffers.serverDH_P.buffer,
  26047. ssl->buffers.serverDH_P.length);
  26048. break;
  26049. }
  26050. #endif /* !NO_DH && !NO_PSK */
  26051. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26052. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  26053. case ecdhe_psk_kea:
  26054. {
  26055. #ifdef HAVE_CURVE25519
  26056. if (ssl->peerX25519KeyPresent) {
  26057. ret = X25519SharedSecret(ssl,
  26058. (curve25519_key*)ssl->hsKey, ssl->peerX25519Key,
  26059. args->output + OPAQUE8_LEN, &args->length,
  26060. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  26061. &ssl->arrays->preMasterSz,
  26062. WOLFSSL_CLIENT_END
  26063. );
  26064. if (!ssl->specs.static_ecdh
  26065. #ifdef WOLFSSL_ASYNC_CRYPT
  26066. && ret != WC_PENDING_E
  26067. #endif
  26068. ) {
  26069. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  26070. (void**)&ssl->peerX25519Key);
  26071. ssl->peerX25519KeyPresent = 0;
  26072. }
  26073. break;
  26074. }
  26075. #endif
  26076. #ifdef HAVE_CURVE448
  26077. if (ssl->peerX448KeyPresent) {
  26078. ret = X448SharedSecret(ssl,
  26079. (curve448_key*)ssl->hsKey, ssl->peerX448Key,
  26080. args->output + OPAQUE8_LEN, &args->length,
  26081. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  26082. &ssl->arrays->preMasterSz,
  26083. WOLFSSL_CLIENT_END
  26084. );
  26085. if (!ssl->specs.static_ecdh
  26086. #ifdef WOLFSSL_ASYNC_CRYPT
  26087. && ret != WC_PENDING_E
  26088. #endif
  26089. ) {
  26090. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  26091. (void**)&ssl->peerX448Key);
  26092. ssl->peerX448KeyPresent = 0;
  26093. }
  26094. break;
  26095. }
  26096. #endif
  26097. ret = EccSharedSecret(ssl,
  26098. (ecc_key*)ssl->hsKey, ssl->peerEccKey,
  26099. args->output + OPAQUE8_LEN, &args->length,
  26100. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  26101. &ssl->arrays->preMasterSz,
  26102. WOLFSSL_CLIENT_END
  26103. );
  26104. #ifdef WOLFSSL_ASYNC_CRYPT
  26105. if (ret != WC_PENDING_E)
  26106. #endif
  26107. {
  26108. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  26109. (void**)&ssl->peerEccKey);
  26110. ssl->peerEccKeyPresent = 0;
  26111. }
  26112. break;
  26113. }
  26114. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  26115. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26116. defined(HAVE_CURVE448)
  26117. case ecc_diffie_hellman_kea:
  26118. {
  26119. #ifdef HAVE_ECC
  26120. ecc_key* peerKey;
  26121. #endif
  26122. #ifdef HAVE_CURVE25519
  26123. if (ssl->peerX25519KeyPresent) {
  26124. ret = X25519SharedSecret(ssl,
  26125. (curve25519_key*)ssl->hsKey, ssl->peerX25519Key,
  26126. args->encSecret + OPAQUE8_LEN, &args->encSz,
  26127. ssl->arrays->preMasterSecret,
  26128. &ssl->arrays->preMasterSz,
  26129. WOLFSSL_CLIENT_END
  26130. );
  26131. if (!ssl->specs.static_ecdh
  26132. #ifdef WOLFSSL_ASYNC_CRYPT
  26133. && ret != WC_PENDING_E
  26134. #endif
  26135. ) {
  26136. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  26137. (void**)&ssl->peerX25519Key);
  26138. ssl->peerX25519KeyPresent = 0;
  26139. }
  26140. break;
  26141. }
  26142. #endif
  26143. #ifdef HAVE_CURVE448
  26144. if (ssl->peerX448KeyPresent) {
  26145. ret = X448SharedSecret(ssl,
  26146. (curve448_key*)ssl->hsKey, ssl->peerX448Key,
  26147. args->encSecret + OPAQUE8_LEN, &args->encSz,
  26148. ssl->arrays->preMasterSecret,
  26149. &ssl->arrays->preMasterSz,
  26150. WOLFSSL_CLIENT_END
  26151. );
  26152. if (!ssl->specs.static_ecdh
  26153. #ifdef WOLFSSL_ASYNC_CRYPT
  26154. && ret != WC_PENDING_E
  26155. #endif
  26156. ) {
  26157. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  26158. (void**)&ssl->peerX448Key);
  26159. ssl->peerX448KeyPresent = 0;
  26160. }
  26161. break;
  26162. }
  26163. #endif
  26164. #ifdef HAVE_ECC
  26165. peerKey = (ssl->specs.static_ecdh) ?
  26166. ssl->peerEccDsaKey : ssl->peerEccKey;
  26167. ret = EccSharedSecret(ssl,
  26168. (ecc_key*)ssl->hsKey, peerKey,
  26169. args->encSecret + OPAQUE8_LEN, &args->encSz,
  26170. ssl->arrays->preMasterSecret,
  26171. &ssl->arrays->preMasterSz,
  26172. WOLFSSL_CLIENT_END);
  26173. if (!ssl->specs.static_ecdh
  26174. #ifdef WOLFSSL_ASYNC_CRYPT
  26175. && ret != WC_PENDING_E
  26176. #endif
  26177. && !ssl->options.keepResources) {
  26178. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  26179. (void**)&ssl->peerEccKey);
  26180. ssl->peerEccKeyPresent = 0;
  26181. }
  26182. #endif
  26183. break;
  26184. }
  26185. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  26186. default:
  26187. ret = BAD_KEA_TYPE_E;
  26188. } /* switch(ssl->specs.kea) */
  26189. /* Check for error */
  26190. if (ret != 0) {
  26191. goto exit_scke;
  26192. }
  26193. /* Advance state and proceed */
  26194. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  26195. } /* case TLS_ASYNC_DO */
  26196. FALL_THROUGH;
  26197. case TLS_ASYNC_VERIFY:
  26198. {
  26199. switch(ssl->specs.kea)
  26200. {
  26201. #ifndef NO_RSA
  26202. case rsa_kea:
  26203. {
  26204. break;
  26205. }
  26206. #endif /* !NO_RSA */
  26207. #ifndef NO_DH
  26208. case diffie_hellman_kea:
  26209. {
  26210. break;
  26211. }
  26212. #endif /* !NO_DH */
  26213. #ifndef NO_PSK
  26214. case psk_kea:
  26215. {
  26216. break;
  26217. }
  26218. #endif /* !NO_PSK */
  26219. #if !defined(NO_DH) && !defined(NO_PSK)
  26220. case dhe_psk_kea:
  26221. {
  26222. byte* pms = ssl->arrays->preMasterSecret;
  26223. /* validate args */
  26224. if (args->output == NULL || args->length == 0) {
  26225. ERROR_OUT(BAD_FUNC_ARG, exit_scke);
  26226. }
  26227. c16toa((word16)args->length, args->output);
  26228. args->encSz += args->length + OPAQUE16_LEN;
  26229. c16toa((word16)ssl->arrays->preMasterSz, pms);
  26230. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  26231. pms += ssl->arrays->preMasterSz;
  26232. /* make psk pre master secret */
  26233. /* length of key + length 0s + length of key + key */
  26234. c16toa((word16)ssl->arrays->psk_keySz, pms);
  26235. pms += OPAQUE16_LEN;
  26236. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  26237. ssl->arrays->preMasterSz +=
  26238. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  26239. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  26240. ssl->arrays->psk_keySz = 0; /* No further need */
  26241. break;
  26242. }
  26243. #endif /* !NO_DH && !NO_PSK */
  26244. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26245. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  26246. case ecdhe_psk_kea:
  26247. {
  26248. byte* pms = ssl->arrays->preMasterSecret;
  26249. /* validate args */
  26250. if (args->output == NULL || args->length > ENCRYPT_LEN) {
  26251. ERROR_OUT(BAD_FUNC_ARG, exit_scke);
  26252. }
  26253. /* place size of public key in output buffer */
  26254. *args->output = (byte)args->length;
  26255. args->encSz += args->length + OPAQUE8_LEN;
  26256. /* Create pre master secret is the concatenation of
  26257. eccSize + eccSharedKey + pskSize + pskKey */
  26258. c16toa((word16)ssl->arrays->preMasterSz, pms);
  26259. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  26260. pms += ssl->arrays->preMasterSz;
  26261. c16toa((word16)ssl->arrays->psk_keySz, pms);
  26262. pms += OPAQUE16_LEN;
  26263. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  26264. ssl->arrays->preMasterSz +=
  26265. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  26266. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  26267. ssl->arrays->psk_keySz = 0; /* No further need */
  26268. break;
  26269. }
  26270. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  26271. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26272. defined(HAVE_CURVE448)
  26273. case ecc_diffie_hellman_kea:
  26274. {
  26275. if (args->encSecret == NULL) {
  26276. ret = BAD_STATE_E;
  26277. goto exit_scke;
  26278. }
  26279. else {
  26280. /* place size of public key in buffer */
  26281. *args->encSecret = (byte)args->encSz;
  26282. args->encSz += OPAQUE8_LEN;
  26283. }
  26284. break;
  26285. }
  26286. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  26287. default:
  26288. ret = BAD_KEA_TYPE_E;
  26289. } /* switch(ssl->specs.kea) */
  26290. /* Check for error */
  26291. if (ret != 0) {
  26292. goto exit_scke;
  26293. }
  26294. /* Advance state and proceed */
  26295. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  26296. } /* case TLS_ASYNC_VERIFY */
  26297. FALL_THROUGH;
  26298. case TLS_ASYNC_FINALIZE:
  26299. {
  26300. word32 tlsSz = 0;
  26301. word32 idx = 0;
  26302. if (ssl->options.tls || ssl->specs.kea == diffie_hellman_kea) {
  26303. tlsSz = 2;
  26304. }
  26305. if (ssl->specs.kea == ecc_diffie_hellman_kea ||
  26306. ssl->specs.kea == dhe_psk_kea ||
  26307. ssl->specs.kea == ecdhe_psk_kea) { /* always off */
  26308. tlsSz = 0;
  26309. }
  26310. idx = HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  26311. args->sendSz = args->encSz + tlsSz + idx;
  26312. #ifdef WOLFSSL_DTLS
  26313. if (ssl->options.dtls) {
  26314. idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  26315. args->sendSz += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  26316. }
  26317. #endif
  26318. if (IsEncryptionOn(ssl, 1)) {
  26319. args->sendSz += MAX_MSG_EXTRA;
  26320. }
  26321. /* check for available size */
  26322. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0)
  26323. goto exit_scke;
  26324. /* get output buffer */
  26325. args->output = ssl->buffers.outputBuffer.buffer +
  26326. ssl->buffers.outputBuffer.length;
  26327. AddHeaders(args->output, args->encSz + tlsSz, client_key_exchange, ssl);
  26328. if (tlsSz) {
  26329. c16toa((word16)args->encSz, &args->output[idx]);
  26330. idx += OPAQUE16_LEN;
  26331. }
  26332. XMEMCPY(args->output + idx, args->encSecret, args->encSz);
  26333. idx += args->encSz;
  26334. if (IsEncryptionOn(ssl, 1)) {
  26335. int recordHeaderSz = RECORD_HEADER_SZ;
  26336. if (ssl->options.dtls)
  26337. recordHeaderSz += DTLS_RECORD_EXTRA;
  26338. args->inputSz = idx - recordHeaderSz; /* buildmsg adds rechdr */
  26339. args->input = (byte*)XMALLOC(args->inputSz, ssl->heap,
  26340. DYNAMIC_TYPE_IN_BUFFER);
  26341. if (args->input == NULL) {
  26342. ERROR_OUT(MEMORY_E, exit_scke);
  26343. }
  26344. XMEMCPY(args->input, args->output + recordHeaderSz,
  26345. args->inputSz);
  26346. }
  26347. /* Advance state and proceed */
  26348. ssl->options.asyncState = TLS_ASYNC_END;
  26349. } /* case TLS_ASYNC_FINALIZE */
  26350. FALL_THROUGH;
  26351. case TLS_ASYNC_END:
  26352. {
  26353. if (IsEncryptionOn(ssl, 1)) {
  26354. #ifdef WOLFSSL_DTLS
  26355. if (IsDtlsNotSctpMode(ssl) &&
  26356. (ret = DtlsMsgPoolSave(ssl, args->input, args->inputSz, client_key_exchange)) != 0) {
  26357. goto exit_scke;
  26358. }
  26359. #endif
  26360. ret = BuildMessage(ssl, args->output, args->sendSz,
  26361. args->input, args->inputSz, handshake, 1, 0, 0, CUR_ORDER);
  26362. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26363. args->input = NULL; /* make sure its not double free'd on cleanup */
  26364. if (ret >= 0) {
  26365. args->sendSz = ret;
  26366. ret = 0;
  26367. }
  26368. }
  26369. else {
  26370. #ifdef WOLFSSL_DTLS
  26371. if (IsDtlsNotSctpMode(ssl)) {
  26372. if ((ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz, client_key_exchange)) != 0) {
  26373. goto exit_scke;
  26374. }
  26375. }
  26376. if (ssl->options.dtls)
  26377. DtlsSEQIncrement(ssl, CUR_ORDER);
  26378. #endif
  26379. ret = HashOutput(ssl, args->output, args->sendSz, 0);
  26380. }
  26381. if (ret != 0) {
  26382. goto exit_scke;
  26383. }
  26384. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  26385. if (ssl->hsInfoOn)
  26386. AddPacketName(ssl, "ClientKeyExchange");
  26387. if (ssl->toInfoOn) {
  26388. ret = AddPacketInfo(ssl, "ClientKeyExchange", handshake,
  26389. args->output, args->sendSz, WRITE_PROTO, 0, ssl->heap);
  26390. if (ret != 0) {
  26391. goto exit_scke;
  26392. }
  26393. }
  26394. #endif
  26395. ssl->buffers.outputBuffer.length += args->sendSz;
  26396. if (!ssl->options.groupMessages) {
  26397. ret = SendBuffered(ssl);
  26398. }
  26399. if (ret == 0 || ret == WANT_WRITE) {
  26400. int tmpRet = MakeMasterSecret(ssl);
  26401. if (tmpRet != 0) {
  26402. ret = tmpRet; /* save WANT_WRITE unless more serious */
  26403. }
  26404. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  26405. ssl->options.buildingMsg = 0;
  26406. }
  26407. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  26408. if (ssl->keyLogCb != NULL) {
  26409. int secretSz = SECRET_LEN;
  26410. ret = ssl->keyLogCb(ssl, ssl->arrays->masterSecret, &secretSz,
  26411. NULL);
  26412. if (ret != 0 || secretSz != SECRET_LEN)
  26413. return SESSION_SECRET_CB_E;
  26414. }
  26415. #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */
  26416. break;
  26417. }
  26418. default:
  26419. ret = INPUT_CASE_ERROR;
  26420. } /* switch(ssl->options.asyncState) */
  26421. exit_scke:
  26422. WOLFSSL_LEAVE("SendClientKeyExchange", ret);
  26423. WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
  26424. #ifdef WOLFSSL_ASYNC_IO
  26425. /* Handle async operation */
  26426. if (ret == WC_PENDING_E || ret == WANT_WRITE) {
  26427. if (ssl->options.buildingMsg)
  26428. return ret;
  26429. /* If we have completed all states then we will not enter this function
  26430. * again. We need to do clean up now. */
  26431. }
  26432. #endif
  26433. /* No further need for PMS */
  26434. if (ssl->arrays->preMasterSecret != NULL) {
  26435. ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  26436. }
  26437. ssl->arrays->preMasterSz = 0;
  26438. /* Final cleanup */
  26439. #ifdef WOLFSSL_ASYNC_IO
  26440. /* Cleanup async */
  26441. FreeAsyncCtx(ssl, 0);
  26442. #else
  26443. FreeSckeArgs(ssl, args);
  26444. #endif
  26445. FreeKeyExchange(ssl);
  26446. if (ret != 0) {
  26447. WOLFSSL_ERROR_VERBOSE(ret);
  26448. }
  26449. return ret;
  26450. }
  26451. #endif /* !WOLFSSL_NO_TLS12 */
  26452. #ifndef NO_CERTS
  26453. #ifndef WOLFSSL_NO_TLS12
  26454. #ifndef WOLFSSL_NO_CLIENT_AUTH
  26455. typedef struct ScvArgs {
  26456. byte* output; /* not allocated */
  26457. #ifndef NO_RSA
  26458. byte* verifySig;
  26459. #endif
  26460. byte* verify; /* not allocated */
  26461. byte* input;
  26462. word32 idx;
  26463. word32 extraSz;
  26464. word32 sigSz;
  26465. int sendSz;
  26466. int inputSz;
  26467. word16 length;
  26468. byte sigAlgo;
  26469. } ScvArgs;
  26470. static void FreeScvArgs(WOLFSSL* ssl, void* pArgs)
  26471. {
  26472. ScvArgs* args = (ScvArgs*)pArgs;
  26473. (void)ssl;
  26474. #ifndef NO_RSA
  26475. if (args->verifySig) {
  26476. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  26477. args->verifySig = NULL;
  26478. }
  26479. #endif
  26480. if (args->input) {
  26481. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26482. args->input = NULL;
  26483. }
  26484. }
  26485. /* handle generation of certificate_verify (15) */
  26486. int SendCertificateVerify(WOLFSSL* ssl)
  26487. {
  26488. int ret = 0;
  26489. #ifdef WOLFSSL_ASYNC_IO
  26490. ScvArgs* args = NULL;
  26491. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  26492. #else
  26493. ScvArgs args[1];
  26494. #endif
  26495. WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_SEND);
  26496. WOLFSSL_ENTER("SendCertificateVerify");
  26497. #ifdef WOLFSSL_ASYNC_IO
  26498. if (ssl->async == NULL) {
  26499. ssl->async = (struct WOLFSSL_ASYNC*)
  26500. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  26501. DYNAMIC_TYPE_ASYNC);
  26502. if (ssl->async == NULL)
  26503. ERROR_OUT(MEMORY_E, exit_scv);
  26504. XMEMSET(ssl->async, 0, sizeof(struct WOLFSSL_ASYNC));
  26505. }
  26506. args = (ScvArgs*)ssl->async->args;
  26507. #ifdef WOLFSSL_ASYNC_CRYPT
  26508. /* BuildMessage does its own Pop */
  26509. if (ssl->error != WC_PENDING_E ||
  26510. ssl->options.asyncState != TLS_ASYNC_END)
  26511. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  26512. if (ret != WC_NOT_PENDING_E) {
  26513. /* Check for error */
  26514. if (ret < 0)
  26515. goto exit_scv;
  26516. }
  26517. else
  26518. #endif
  26519. if (ssl->options.buildingMsg) {
  26520. /* We should be in the sending state. */
  26521. if (ssl->options.asyncState != TLS_ASYNC_END) {
  26522. ret = BAD_STATE_E;
  26523. goto exit_scv;
  26524. }
  26525. }
  26526. else
  26527. #endif
  26528. {
  26529. /* Reset state */
  26530. ret = 0;
  26531. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  26532. XMEMSET(args, 0, sizeof(ScvArgs));
  26533. #ifdef WOLFSSL_ASYNC_IO
  26534. ssl->async->freeArgs = FreeScvArgs;
  26535. #endif
  26536. }
  26537. switch(ssl->options.asyncState)
  26538. {
  26539. case TLS_ASYNC_BEGIN:
  26540. {
  26541. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  26542. return 0; /* sent blank cert, can't verify */
  26543. }
  26544. args->sendSz = MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA;
  26545. if (IsEncryptionOn(ssl, 1)) {
  26546. args->sendSz += MAX_MSG_EXTRA;
  26547. }
  26548. /* Use tmp buffer */
  26549. args->input = (byte*)XMALLOC(args->sendSz,
  26550. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26551. if (args->input == NULL)
  26552. ERROR_OUT(MEMORY_E, exit_scv);
  26553. args->output = args->input;
  26554. /* Advance state and proceed */
  26555. ssl->options.asyncState = TLS_ASYNC_BUILD;
  26556. } /* case TLS_ASYNC_BEGIN */
  26557. FALL_THROUGH;
  26558. case TLS_ASYNC_BUILD:
  26559. {
  26560. ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
  26561. if (ret != 0) {
  26562. goto exit_scv;
  26563. }
  26564. if (ssl->buffers.key == NULL) {
  26565. #ifdef HAVE_PK_CALLBACKS
  26566. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  26567. args->length = GetPrivateKeySigSize(ssl);
  26568. else
  26569. #endif
  26570. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  26571. }
  26572. else {
  26573. /* Decode private key. */
  26574. ret = DecodePrivateKey(ssl, &args->length);
  26575. if (ret != 0) {
  26576. goto exit_scv;
  26577. }
  26578. }
  26579. if (args->length == 0) {
  26580. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  26581. }
  26582. /* idx is used to track verify pointer offset to output */
  26583. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  26584. args->verify = &args->output[RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ];
  26585. args->extraSz = 0; /* tls 1.2 hash/sig */
  26586. /* build encoded signature buffer */
  26587. ssl->buffers.sig.length = MAX_ENCODED_SIG_SZ;
  26588. ssl->buffers.sig.buffer = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  26589. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  26590. if (ssl->buffers.sig.buffer == NULL) {
  26591. ERROR_OUT(MEMORY_E, exit_scv);
  26592. }
  26593. #ifdef WOLFSSL_DTLS
  26594. if (ssl->options.dtls) {
  26595. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  26596. args->verify += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  26597. }
  26598. #endif
  26599. if (!IsAtLeastTLSv1_2(ssl)) {
  26600. #ifndef NO_OLD_TLS
  26601. #ifndef NO_SHA
  26602. /* old tls default */
  26603. SetDigest(ssl, sha_mac);
  26604. #endif
  26605. #else
  26606. #ifndef NO_SHA256
  26607. /* new tls default */
  26608. SetDigest(ssl, sha256_mac);
  26609. #endif
  26610. #endif /* !NO_OLD_TLS */
  26611. }
  26612. else {
  26613. SetDigest(ssl, ssl->options.hashAlgo);
  26614. }
  26615. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  26616. #ifdef WC_RSA_PSS
  26617. if (IsAtLeastTLSv1_2(ssl) &&
  26618. (ssl->pssAlgo & (1 << ssl->options.hashAlgo))) {
  26619. args->sigAlgo = rsa_pss_sa_algo;
  26620. }
  26621. else
  26622. #endif
  26623. args->sigAlgo = rsa_sa_algo;
  26624. }
  26625. else if (ssl->hsType == DYNAMIC_TYPE_ECC)
  26626. args->sigAlgo = ecc_dsa_sa_algo;
  26627. else if (ssl->hsType == DYNAMIC_TYPE_ED25519)
  26628. args->sigAlgo = ed25519_sa_algo;
  26629. else if (ssl->hsType == DYNAMIC_TYPE_ED448)
  26630. args->sigAlgo = ed448_sa_algo;
  26631. if (IsAtLeastTLSv1_2(ssl)) {
  26632. EncodeSigAlg(ssl->options.hashAlgo, args->sigAlgo,
  26633. args->verify);
  26634. args->extraSz = HASH_SIG_SIZE;
  26635. SetDigest(ssl, ssl->options.hashAlgo);
  26636. }
  26637. #ifndef NO_OLD_TLS
  26638. else {
  26639. /* if old TLS load MD5 and SHA hash as value to sign
  26640. * MD5 and SHA must be first two buffers in structure */
  26641. XMEMCPY(ssl->buffers.sig.buffer,
  26642. (byte*)&ssl->hsHashes->certHashes, FINISHED_SZ);
  26643. }
  26644. #endif
  26645. #ifndef NO_RSA
  26646. if (args->sigAlgo == rsa_sa_algo) {
  26647. ssl->buffers.sig.length = FINISHED_SZ;
  26648. args->sigSz = ENCRYPT_LEN;
  26649. if (IsAtLeastTLSv1_2(ssl)) {
  26650. ssl->buffers.sig.length = wc_EncodeSignature(
  26651. ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
  26652. ssl->buffers.digest.length,
  26653. TypeHash(ssl->options.hashAlgo));
  26654. }
  26655. /* prepend hdr */
  26656. c16toa(args->length, args->verify + args->extraSz);
  26657. }
  26658. #ifdef WC_RSA_PSS
  26659. else if (args->sigAlgo == rsa_pss_sa_algo) {
  26660. XMEMCPY(ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
  26661. ssl->buffers.digest.length);
  26662. ssl->buffers.sig.length = ssl->buffers.digest.length;
  26663. args->sigSz = ENCRYPT_LEN;
  26664. /* prepend hdr */
  26665. c16toa(args->length, args->verify + args->extraSz);
  26666. }
  26667. #endif
  26668. #endif /* !NO_RSA */
  26669. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  26670. if (args->sigAlgo == ed25519_sa_algo) {
  26671. ret = Ed25519CheckPubKey(ssl);
  26672. if (ret != 0)
  26673. goto exit_scv;
  26674. }
  26675. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  26676. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  26677. if (args->sigAlgo == ed448_sa_algo) {
  26678. ret = Ed448CheckPubKey(ssl);
  26679. if (ret != 0)
  26680. goto exit_scv;
  26681. }
  26682. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  26683. /* Advance state and proceed */
  26684. ssl->options.asyncState = TLS_ASYNC_DO;
  26685. } /* case TLS_ASYNC_BUILD */
  26686. FALL_THROUGH;
  26687. case TLS_ASYNC_DO:
  26688. {
  26689. #ifdef HAVE_ECC
  26690. if (ssl->hsType == DYNAMIC_TYPE_ECC) {
  26691. ecc_key* key = (ecc_key*)ssl->hsKey;
  26692. ret = EccSign(ssl,
  26693. ssl->buffers.digest.buffer, ssl->buffers.digest.length,
  26694. ssl->buffers.sig.buffer,
  26695. (word32*)&ssl->buffers.sig.length,
  26696. key,
  26697. #ifdef HAVE_PK_CALLBACKS
  26698. ssl->buffers.key
  26699. #else
  26700. NULL
  26701. #endif
  26702. );
  26703. }
  26704. #endif /* HAVE_ECC */
  26705. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  26706. if (ssl->hsType == DYNAMIC_TYPE_ED25519) {
  26707. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  26708. ret = Ed25519Sign(ssl,
  26709. ssl->hsHashes->messages, ssl->hsHashes->length,
  26710. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  26711. key,
  26712. #ifdef HAVE_PK_CALLBACKS
  26713. ssl->buffers.key
  26714. #else
  26715. NULL
  26716. #endif
  26717. );
  26718. }
  26719. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  26720. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  26721. if (ssl->hsType == DYNAMIC_TYPE_ED448) {
  26722. ed448_key* key = (ed448_key*)ssl->hsKey;
  26723. ret = Ed448Sign(ssl,
  26724. ssl->hsHashes->messages, ssl->hsHashes->length,
  26725. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  26726. key,
  26727. #ifdef HAVE_PK_CALLBACKS
  26728. ssl->buffers.key
  26729. #else
  26730. NULL
  26731. #endif
  26732. );
  26733. }
  26734. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  26735. #ifndef NO_RSA
  26736. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  26737. RsaKey* key = (RsaKey*)ssl->hsKey;
  26738. /* restore verify pointer */
  26739. args->verify = &args->output[args->idx];
  26740. ret = RsaSign(ssl,
  26741. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  26742. args->verify + args->extraSz + VERIFY_HEADER, &args->sigSz,
  26743. args->sigAlgo, ssl->options.hashAlgo, key,
  26744. ssl->buffers.key
  26745. );
  26746. }
  26747. #endif /* !NO_RSA */
  26748. /* Check for error */
  26749. if (ret != 0) {
  26750. goto exit_scv;
  26751. }
  26752. /* Advance state and proceed */
  26753. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  26754. } /* case TLS_ASYNC_DO */
  26755. FALL_THROUGH;
  26756. case TLS_ASYNC_VERIFY:
  26757. {
  26758. /* restore verify pointer */
  26759. args->verify = &args->output[args->idx];
  26760. switch (ssl->hsType) {
  26761. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  26762. #ifdef HAVE_ECC
  26763. case DYNAMIC_TYPE_ECC:
  26764. #ifdef WOLFSSL_CHECK_SIG_FAULTS
  26765. {
  26766. ecc_key* key = (ecc_key*)ssl->hsKey;
  26767. ret = EccVerify(ssl,
  26768. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  26769. ssl->buffers.digest.buffer, ssl->buffers.digest.length,
  26770. key,
  26771. #ifdef HAVE_PK_CALLBACKS
  26772. ssl->buffers.key
  26773. #else
  26774. NULL
  26775. #endif
  26776. );
  26777. if (ret != 0) {
  26778. WOLFSSL_MSG("Failed to verify ECC signature");
  26779. goto exit_scv;
  26780. }
  26781. }
  26782. #if defined(HAVE_ED25519) || defined(HAVE_ED448)
  26783. FALL_THROUGH;
  26784. #endif
  26785. #endif /* WOLFSSL_CHECK_SIG_FAULTS */
  26786. #endif /* HAVE_ECC */
  26787. #ifdef HAVE_ED25519
  26788. case DYNAMIC_TYPE_ED25519:
  26789. #endif
  26790. #ifdef HAVE_ED448
  26791. case DYNAMIC_TYPE_ED448:
  26792. #endif
  26793. args->length = (word16)ssl->buffers.sig.length;
  26794. /* prepend hdr */
  26795. c16toa(args->length, args->verify + args->extraSz);
  26796. XMEMCPY(args->verify + args->extraSz + VERIFY_HEADER,
  26797. ssl->buffers.sig.buffer, ssl->buffers.sig.length);
  26798. break;
  26799. #endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
  26800. #ifndef NO_RSA
  26801. case DYNAMIC_TYPE_RSA:
  26802. {
  26803. RsaKey* key = (RsaKey*)ssl->hsKey;
  26804. if (args->verifySig == NULL) {
  26805. args->verifySig = (byte*)XMALLOC(args->sigSz, ssl->heap,
  26806. DYNAMIC_TYPE_SIGNATURE);
  26807. if (args->verifySig == NULL) {
  26808. ERROR_OUT(MEMORY_E, exit_scv);
  26809. }
  26810. XMEMCPY(args->verifySig, args->verify + args->extraSz +
  26811. VERIFY_HEADER, args->sigSz);
  26812. }
  26813. /* check for signature faults */
  26814. ret = VerifyRsaSign(ssl,
  26815. args->verifySig, args->sigSz,
  26816. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  26817. args->sigAlgo, ssl->options.hashAlgo, key,
  26818. ssl->buffers.key
  26819. );
  26820. /* free temporary buffer now */
  26821. if (ret != WC_PENDING_E) {
  26822. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  26823. args->verifySig = NULL;
  26824. }
  26825. break;
  26826. }
  26827. #endif /* !NO_RSA */
  26828. default:
  26829. break;
  26830. }
  26831. /* Check for error */
  26832. if (ret != 0) {
  26833. goto exit_scv;
  26834. }
  26835. /* Advance state and proceed */
  26836. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  26837. } /* case TLS_ASYNC_VERIFY */
  26838. FALL_THROUGH;
  26839. case TLS_ASYNC_FINALIZE:
  26840. {
  26841. if (args->output == NULL) {
  26842. ERROR_OUT(BUFFER_ERROR, exit_scv);
  26843. }
  26844. AddHeaders(args->output, (word32)args->length + args->extraSz +
  26845. VERIFY_HEADER, certificate_verify, ssl);
  26846. /* Advance state and proceed */
  26847. ssl->options.asyncState = TLS_ASYNC_END;
  26848. } /* case TLS_ASYNC_FINALIZE */
  26849. FALL_THROUGH;
  26850. case TLS_ASYNC_END:
  26851. {
  26852. ret = SendHandshakeMsg(ssl, args->output,
  26853. (word32)args->length + args->extraSz + VERIFY_HEADER,
  26854. certificate_verify, "CertificateVerify");
  26855. if (ret != 0)
  26856. goto exit_scv;
  26857. break;
  26858. }
  26859. default:
  26860. ret = INPUT_CASE_ERROR;
  26861. } /* switch(ssl->options.asyncState) */
  26862. exit_scv:
  26863. WOLFSSL_LEAVE("SendCertificateVerify", ret);
  26864. WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_SEND);
  26865. #ifdef WOLFSSL_ASYNC_IO
  26866. /* Handle async operation */
  26867. if (ret == WANT_WRITE
  26868. #ifdef WOLFSSL_ASYNC_CRYPT
  26869. || ret == WC_PENDING_E
  26870. #endif
  26871. )
  26872. return ret;
  26873. #endif /* WOLFSSL_ASYNC_IO */
  26874. /* Digest is not allocated, so do this to prevent free */
  26875. if(ssl->buffers.digest.buffer) {
  26876. if (!ssl->options.dontFreeDigest) {
  26877. /*This should not happen*/
  26878. XFREE(ssl->buffers.digest.buffer,
  26879. ssl->heap, DYNAMIC_TYPE_DIGEST);
  26880. }
  26881. }
  26882. ssl->buffers.digest.buffer = NULL;
  26883. ssl->buffers.digest.length = 0;
  26884. ssl->options.dontFreeDigest = 0;
  26885. /* Final cleanup */
  26886. #ifdef WOLFSSL_ASYNC_IO
  26887. /* Cleanup async */
  26888. FreeAsyncCtx(ssl, 0);
  26889. #else
  26890. FreeScvArgs(ssl, args);
  26891. #endif
  26892. FreeKeyExchange(ssl);
  26893. if (ret != 0) {
  26894. WOLFSSL_ERROR_VERBOSE(ret);
  26895. }
  26896. return ret;
  26897. }
  26898. #endif /* WOLFSSL_NO_CLIENT_AUTH */
  26899. #endif /* WOLFSSL_NO_TLS12 */
  26900. #endif /* NO_CERTS */
  26901. #ifdef HAVE_SESSION_TICKET
  26902. int SetTicket(WOLFSSL* ssl, const byte* ticket, word32 length)
  26903. {
  26904. /* Free old dynamic ticket if we already had one */
  26905. if (ssl->session->ticketLenAlloc > 0) {
  26906. XFREE(ssl->session->ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  26907. ssl->session->ticket = ssl->session->staticTicket;
  26908. ssl->session->ticketLenAlloc = 0;
  26909. }
  26910. if (length > sizeof(ssl->session->staticTicket)) {
  26911. byte* sessionTicket =
  26912. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  26913. if (sessionTicket == NULL)
  26914. return MEMORY_E;
  26915. ssl->session->ticket = sessionTicket;
  26916. ssl->session->ticketLenAlloc = (word16)length;
  26917. }
  26918. ssl->session->ticketLen = (word16)length;
  26919. if (length > 0) {
  26920. XMEMCPY(ssl->session->ticket, ticket, length);
  26921. if (ssl->session_ticket_cb != NULL) {
  26922. ssl->session_ticket_cb(ssl,
  26923. ssl->session->ticket, ssl->session->ticketLen,
  26924. ssl->session_ticket_ctx);
  26925. }
  26926. /* Create a fake sessionID based on the ticket, this will
  26927. * supersede the existing session cache info. */
  26928. ssl->options.haveSessionId = 1;
  26929. #ifdef WOLFSSL_TLS13
  26930. if (ssl->options.tls1_3) {
  26931. XMEMCPY(ssl->session->sessionID,
  26932. ssl->session->ticket + length - ID_LEN, ID_LEN);
  26933. ssl->session->sessionIDSz = ID_LEN;
  26934. }
  26935. else
  26936. #endif
  26937. {
  26938. XMEMCPY(ssl->arrays->sessionID,
  26939. ssl->session->ticket + length - ID_LEN, ID_LEN);
  26940. ssl->arrays->sessionIDSz = ID_LEN;
  26941. }
  26942. }
  26943. return 0;
  26944. }
  26945. #ifndef WOLFSSL_NO_TLS12
  26946. /* handle processing of session_ticket (4) */
  26947. static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  26948. word32 size)
  26949. {
  26950. word32 begin = *inOutIdx;
  26951. word32 lifetime;
  26952. word16 length;
  26953. int ret;
  26954. if (ssl->expect_session_ticket == 0) {
  26955. WOLFSSL_MSG("Unexpected session ticket");
  26956. WOLFSSL_ERROR_VERBOSE(SESSION_TICKET_EXPECT_E);
  26957. return SESSION_TICKET_EXPECT_E;
  26958. }
  26959. if (OPAQUE32_LEN > size)
  26960. return BUFFER_ERROR;
  26961. ato32(input + *inOutIdx, &lifetime);
  26962. *inOutIdx += OPAQUE32_LEN;
  26963. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  26964. return BUFFER_ERROR;
  26965. ato16(input + *inOutIdx, &length);
  26966. *inOutIdx += OPAQUE16_LEN;
  26967. if ((*inOutIdx - begin) + length > size)
  26968. return BUFFER_ERROR;
  26969. if ((ret = SetTicket(ssl, input + *inOutIdx, length)) != 0)
  26970. return ret;
  26971. *inOutIdx += length;
  26972. if (length > 0) {
  26973. ssl->timeout = lifetime;
  26974. SetupSession(ssl);
  26975. #ifndef NO_SESSION_CACHE
  26976. AddSession(ssl);
  26977. #endif
  26978. }
  26979. if (IsEncryptionOn(ssl, 0)) {
  26980. *inOutIdx += ssl->keys.padSz;
  26981. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  26982. if (ssl->options.startedETMRead)
  26983. *inOutIdx += MacSize(ssl);
  26984. #endif
  26985. }
  26986. ssl->expect_session_ticket = 0;
  26987. return 0;
  26988. }
  26989. #endif /* !WOLFSSL_NO_TLS12 */
  26990. #endif /* HAVE_SESSION_TICKET */
  26991. #endif /* NO_WOLFSSL_CLIENT */
  26992. #ifndef NO_CERTS
  26993. #ifdef WOLF_PRIVATE_KEY_ID
  26994. int GetPrivateKeySigSize(WOLFSSL* ssl)
  26995. {
  26996. int sigSz = 0;
  26997. if (ssl == NULL)
  26998. return 0;
  26999. switch (ssl->buffers.keyType) {
  27000. #ifndef NO_RSA
  27001. #ifdef WC_RSA_PSS
  27002. case rsa_pss_sa_algo:
  27003. #endif
  27004. case rsa_sa_algo:
  27005. sigSz = ssl->buffers.keySz;
  27006. ssl->hsType = DYNAMIC_TYPE_RSA;
  27007. break;
  27008. #endif
  27009. #ifdef HAVE_ECC
  27010. case ecc_dsa_sa_algo:
  27011. sigSz = wc_ecc_sig_size_calc(ssl->buffers.keySz);
  27012. ssl->hsType = DYNAMIC_TYPE_ECC;
  27013. break;
  27014. #endif
  27015. #ifdef HAVE_ED25519
  27016. case ed25519_sa_algo:
  27017. sigSz = ED25519_SIG_SIZE; /* fixed known value */
  27018. ssl->hsType = DYNAMIC_TYPE_ED25519;
  27019. break;
  27020. #endif
  27021. #ifdef HAVE_ED448
  27022. case ed448_sa_algo:
  27023. sigSz = ED448_SIG_SIZE; /* fixed known value */
  27024. ssl->hsType = DYNAMIC_TYPE_ED448;
  27025. break;
  27026. #endif
  27027. default:
  27028. break;
  27029. }
  27030. return sigSz;
  27031. }
  27032. #endif /* HAVE_PK_CALLBACKS */
  27033. #endif /* NO_CERTS */
  27034. #ifdef HAVE_ECC
  27035. /* returns the WOLFSSL_* version of the curve from the OID sum */
  27036. word16 GetCurveByOID(int oidSum) {
  27037. switch(oidSum) {
  27038. #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
  27039. #ifndef NO_ECC_SECP
  27040. case ECC_SECP160R1_OID:
  27041. return WOLFSSL_ECC_SECP160R1;
  27042. #endif /* !NO_ECC_SECP */
  27043. #ifdef HAVE_ECC_SECPR2
  27044. case ECC_SECP160R2_OID:
  27045. return WOLFSSL_ECC_SECP160R2;
  27046. #endif /* HAVE_ECC_SECPR2 */
  27047. #ifdef HAVE_ECC_KOBLITZ
  27048. case ECC_SECP160K1_OID:
  27049. return WOLFSSL_ECC_SECP160K1;
  27050. #endif /* HAVE_ECC_KOBLITZ */
  27051. #endif
  27052. #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
  27053. #ifndef NO_ECC_SECP
  27054. case ECC_SECP192R1_OID:
  27055. return WOLFSSL_ECC_SECP192R1;
  27056. #endif /* !NO_ECC_SECP */
  27057. #ifdef HAVE_ECC_KOBLITZ
  27058. case ECC_SECP192K1_OID:
  27059. return WOLFSSL_ECC_SECP192K1;
  27060. #endif /* HAVE_ECC_KOBLITZ */
  27061. #endif
  27062. #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
  27063. #ifndef NO_ECC_SECP
  27064. case ECC_SECP224R1_OID:
  27065. return WOLFSSL_ECC_SECP224R1;
  27066. #endif /* !NO_ECC_SECP */
  27067. #ifdef HAVE_ECC_KOBLITZ
  27068. case ECC_SECP224K1_OID:
  27069. return WOLFSSL_ECC_SECP224K1;
  27070. #endif /* HAVE_ECC_KOBLITZ */
  27071. #endif
  27072. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  27073. #ifndef NO_ECC_SECP
  27074. case ECC_SECP256R1_OID:
  27075. return WOLFSSL_ECC_SECP256R1;
  27076. #endif /* !NO_ECC_SECP */
  27077. #ifdef HAVE_ECC_KOBLITZ
  27078. case ECC_SECP256K1_OID:
  27079. return WOLFSSL_ECC_SECP256K1;
  27080. #endif /* HAVE_ECC_KOBLITZ */
  27081. #ifdef HAVE_ECC_BRAINPOOL
  27082. case ECC_BRAINPOOLP256R1_OID:
  27083. return WOLFSSL_ECC_BRAINPOOLP256R1;
  27084. #endif /* HAVE_ECC_BRAINPOOL */
  27085. #endif
  27086. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  27087. #ifndef NO_ECC_SECP
  27088. case ECC_SECP384R1_OID:
  27089. return WOLFSSL_ECC_SECP384R1;
  27090. #endif /* !NO_ECC_SECP */
  27091. #ifdef HAVE_ECC_BRAINPOOL
  27092. case ECC_BRAINPOOLP384R1_OID:
  27093. return WOLFSSL_ECC_BRAINPOOLP384R1;
  27094. #endif /* HAVE_ECC_BRAINPOOL */
  27095. #endif
  27096. #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
  27097. #ifdef HAVE_ECC_BRAINPOOL
  27098. case ECC_BRAINPOOLP512R1_OID:
  27099. return WOLFSSL_ECC_BRAINPOOLP512R1;
  27100. #endif /* HAVE_ECC_BRAINPOOL */
  27101. #endif
  27102. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  27103. #ifndef NO_ECC_SECP
  27104. case ECC_SECP521R1_OID:
  27105. return WOLFSSL_ECC_SECP521R1;
  27106. #endif /* !NO_ECC_SECP */
  27107. #endif
  27108. default:
  27109. WOLFSSL_MSG("Curve OID not compiled in or implemented");
  27110. return 0;
  27111. }
  27112. }
  27113. #endif /* HAVE_ECC */
  27114. int TranslateErrorToAlert(int err)
  27115. {
  27116. switch (err) {
  27117. case BUFFER_ERROR:
  27118. return decode_error;
  27119. case EXT_NOT_ALLOWED:
  27120. case PEER_KEY_ERROR:
  27121. case ECC_PEERKEY_ERROR:
  27122. case BAD_KEY_SHARE_DATA:
  27123. case PSK_KEY_ERROR:
  27124. case INVALID_PARAMETER:
  27125. case HRR_COOKIE_ERROR:
  27126. return illegal_parameter;
  27127. case INCOMPLETE_DATA:
  27128. return missing_extension;
  27129. case MATCH_SUITE_ERROR:
  27130. case MISSING_HANDSHAKE_DATA:
  27131. return handshake_failure;
  27132. case VERSION_ERROR:
  27133. return wolfssl_alert_protocol_version;
  27134. default:
  27135. return invalid_alert;
  27136. }
  27137. }
  27138. #ifndef NO_WOLFSSL_SERVER
  27139. #ifndef WOLFSSL_NO_TLS12
  27140. /* handle generation of server_hello (2) */
  27141. int SendServerHello(WOLFSSL* ssl)
  27142. {
  27143. int ret;
  27144. byte *output;
  27145. word16 length;
  27146. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  27147. int sendSz;
  27148. byte sessIdSz = ID_LEN;
  27149. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_SESSION_TICKET)
  27150. byte echoId = 0; /* ticket echo id flag */
  27151. #endif
  27152. byte cacheOff = 0; /* session cache off flag */
  27153. WOLFSSL_START(WC_FUNC_SERVER_HELLO_SEND);
  27154. WOLFSSL_ENTER("SendServerHello");
  27155. length = VERSION_SZ + RAN_LEN
  27156. + ID_LEN + ENUM_LEN
  27157. + SUITE_LEN
  27158. + ENUM_LEN;
  27159. #ifdef HAVE_TLS_EXTENSIONS
  27160. ret = TLSX_GetResponseSize(ssl, server_hello, &length);
  27161. if (ret != 0)
  27162. return ret;
  27163. #ifdef HAVE_SESSION_TICKET
  27164. if (ssl->options.useTicket) {
  27165. /* echo session id sz can be 0,32 or bogus len in between */
  27166. sessIdSz = ssl->arrays->sessionIDSz;
  27167. if (sessIdSz > ID_LEN) {
  27168. WOLFSSL_MSG("Bad bogus session id len");
  27169. return BUFFER_ERROR;
  27170. }
  27171. if (!IsAtLeastTLSv1_3(ssl->version))
  27172. length -= (ID_LEN - sessIdSz); /* adjust ID_LEN assumption */
  27173. echoId = 1;
  27174. }
  27175. #endif /* HAVE_SESSION_TICKET */
  27176. #else
  27177. if (ssl->options.haveEMS) {
  27178. length += HELLO_EXT_SZ_SZ + HELLO_EXT_SZ;
  27179. }
  27180. #endif
  27181. /* is the session cache off at build or runtime */
  27182. #ifdef NO_SESSION_CACHE
  27183. cacheOff = 1;
  27184. #else
  27185. if (ssl->options.sessionCacheOff == 1) {
  27186. cacheOff = 1;
  27187. }
  27188. #endif
  27189. /* if no session cache don't send a session ID unless we're echoing
  27190. * an ID as part of session tickets */
  27191. if (cacheOff == 1
  27192. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_SESSION_TICKET)
  27193. && echoId == 0
  27194. #endif
  27195. ) {
  27196. length -= ID_LEN; /* adjust ID_LEN assumption */
  27197. sessIdSz = 0;
  27198. }
  27199. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  27200. #ifdef WOLFSSL_DTLS
  27201. if (ssl->options.dtls) {
  27202. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27203. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27204. }
  27205. #endif /* WOLFSSL_DTLS */
  27206. if (IsEncryptionOn(ssl, 1))
  27207. sendSz += MAX_MSG_EXTRA;
  27208. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  27209. * is not advanced yet */
  27210. ssl->options.buildingMsg = 1;
  27211. /* check for available size */
  27212. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  27213. return ret;
  27214. /* get output buffer */
  27215. output = ssl->buffers.outputBuffer.buffer +
  27216. ssl->buffers.outputBuffer.length;
  27217. AddHeaders(output, length, server_hello, ssl);
  27218. /* now write to output */
  27219. /* first version */
  27220. output[idx++] = (byte)ssl->version.major;
  27221. output[idx++] = (byte)ssl->version.minor;
  27222. /* then random and session id */
  27223. if (!ssl->options.resuming) {
  27224. /* generate random part and session id */
  27225. ret = wc_RNG_GenerateBlock(ssl->rng, output + idx,
  27226. RAN_LEN + sizeof(sessIdSz) + sessIdSz);
  27227. if (ret != 0)
  27228. return ret;
  27229. #ifdef WOLFSSL_TLS13
  27230. if (TLSv1_3_Capable(ssl)) {
  27231. /* TLS v1.3 capable server downgraded. */
  27232. XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
  27233. tls13Downgrade, TLS13_DOWNGRADE_SZ);
  27234. output[idx + RAN_LEN - 1] = (byte)IsAtLeastTLSv1_2(ssl);
  27235. }
  27236. else
  27237. #endif
  27238. if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
  27239. ssl->ctx->method->version.minor == TLSv1_2_MINOR &&
  27240. (wolfSSL_get_options(ssl) & WOLFSSL_OP_NO_TLSv1_2) == 0 &&
  27241. !IsAtLeastTLSv1_2(ssl)) {
  27242. /* TLS v1.2 capable server downgraded. */
  27243. XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
  27244. tls13Downgrade, TLS13_DOWNGRADE_SZ);
  27245. output[idx + RAN_LEN - 1] = 0;
  27246. }
  27247. /* store info in SSL for later */
  27248. XMEMCPY(ssl->arrays->serverRandom, output + idx, RAN_LEN);
  27249. idx += RAN_LEN;
  27250. output[idx++] = sessIdSz;
  27251. XMEMCPY(ssl->arrays->sessionID, output + idx, sessIdSz);
  27252. ssl->arrays->sessionIDSz = sessIdSz;
  27253. }
  27254. else {
  27255. /* If resuming, use info from SSL */
  27256. XMEMCPY(output + idx, ssl->arrays->serverRandom, RAN_LEN);
  27257. idx += RAN_LEN;
  27258. output[idx++] = sessIdSz;
  27259. XMEMCPY(output + idx, ssl->arrays->sessionID, sessIdSz);
  27260. }
  27261. idx += sessIdSz;
  27262. #ifdef SHOW_SECRETS
  27263. {
  27264. int j;
  27265. printf("server random: ");
  27266. for (j = 0; j < RAN_LEN; j++)
  27267. printf("%02x", ssl->arrays->serverRandom[j]);
  27268. printf("\n");
  27269. }
  27270. #endif
  27271. /* then cipher suite */
  27272. output[idx++] = ssl->options.cipherSuite0;
  27273. output[idx++] = ssl->options.cipherSuite;
  27274. /* then compression */
  27275. if (ssl->options.usingCompression)
  27276. output[idx++] = ZLIB_COMPRESSION;
  27277. else
  27278. output[idx++] = NO_COMPRESSION;
  27279. /* last, extensions */
  27280. #ifdef HAVE_TLS_EXTENSIONS
  27281. {
  27282. word16 offset = 0;
  27283. ret = TLSX_WriteResponse(ssl, output + idx, server_hello, &offset);
  27284. if (ret != 0)
  27285. return ret;
  27286. idx += offset;
  27287. }
  27288. #else
  27289. #ifdef HAVE_EXTENDED_MASTER
  27290. if (ssl->options.haveEMS) {
  27291. c16toa(HELLO_EXT_SZ, output + idx);
  27292. idx += HELLO_EXT_SZ_SZ;
  27293. c16toa(HELLO_EXT_EXTMS, output + idx);
  27294. idx += HELLO_EXT_TYPE_SZ;
  27295. c16toa(0, output + idx);
  27296. /*idx += HELLO_EXT_SZ_SZ;*/
  27297. /* idx is not used after this point. uncomment the line above
  27298. * if adding any more extensions in the future. */
  27299. }
  27300. #endif
  27301. #endif
  27302. if (IsEncryptionOn(ssl, 1)) {
  27303. byte* input;
  27304. int inputSz = idx; /* build msg adds rec hdr */
  27305. int recordHeaderSz = RECORD_HEADER_SZ;
  27306. if (ssl->options.dtls)
  27307. recordHeaderSz += DTLS_RECORD_EXTRA;
  27308. inputSz -= recordHeaderSz;
  27309. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27310. if (input == NULL)
  27311. return MEMORY_E;
  27312. XMEMCPY(input, output + recordHeaderSz, inputSz);
  27313. #ifdef WOLFSSL_DTLS
  27314. if (IsDtlsNotSctpMode(ssl) &&
  27315. (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello)) != 0) {
  27316. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27317. return ret;
  27318. }
  27319. #endif
  27320. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  27321. handshake, 1, 0, 0, CUR_ORDER);
  27322. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27323. if (sendSz < 0)
  27324. return sendSz;
  27325. } else {
  27326. #ifdef WOLFSSL_DTLS
  27327. if (IsDtlsNotSctpMode(ssl)) {
  27328. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello)) != 0)
  27329. return ret;
  27330. }
  27331. if (ssl->options.dtls)
  27332. DtlsSEQIncrement(ssl, CUR_ORDER);
  27333. #endif
  27334. ret = HashOutput(ssl, output, sendSz, 0);
  27335. if (ret != 0)
  27336. return ret;
  27337. }
  27338. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  27339. if (ssl->hsInfoOn)
  27340. AddPacketName(ssl, "ServerHello");
  27341. if (ssl->toInfoOn) {
  27342. ret = AddPacketInfo(ssl, "ServerHello", handshake, output, sendSz,
  27343. WRITE_PROTO, 0, ssl->heap);
  27344. if (ret != 0)
  27345. return ret;
  27346. }
  27347. #endif
  27348. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  27349. ssl->options.buildingMsg = 0;
  27350. ssl->buffers.outputBuffer.length += sendSz;
  27351. if (ssl->options.groupMessages)
  27352. ret = 0;
  27353. else
  27354. ret = SendBuffered(ssl);
  27355. WOLFSSL_LEAVE("SendServerHello", ret);
  27356. WOLFSSL_END(WC_FUNC_SERVER_HELLO_SEND);
  27357. return ret;
  27358. }
  27359. #if defined(HAVE_ECC)
  27360. static byte SetCurveId(ecc_key* key)
  27361. {
  27362. if (key == NULL || key->dp == NULL) {
  27363. WOLFSSL_MSG("SetCurveId: Invalid key!");
  27364. return 0;
  27365. }
  27366. return (byte)GetCurveByOID(key->dp->oidSum);
  27367. }
  27368. #endif /* HAVE_ECC */
  27369. typedef struct SskeArgs {
  27370. byte* output; /* not allocated */
  27371. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  27372. byte* exportBuf;
  27373. #endif
  27374. #ifndef NO_RSA
  27375. byte* verifySig;
  27376. #endif
  27377. byte* input;
  27378. word32 idx;
  27379. word32 tmpSigSz;
  27380. word32 length;
  27381. word32 sigSz;
  27382. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  27383. !defined(NO_RSA)
  27384. word32 sigDataSz;
  27385. #endif
  27386. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  27387. word32 exportSz;
  27388. #endif
  27389. int sendSz;
  27390. int inputSz;
  27391. } SskeArgs;
  27392. static void FreeSskeArgs(WOLFSSL* ssl, void* pArgs)
  27393. {
  27394. SskeArgs* args = (SskeArgs*)pArgs;
  27395. (void)ssl;
  27396. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  27397. if (args->exportBuf) {
  27398. XFREE(args->exportBuf, ssl->heap, DYNAMIC_TYPE_DER);
  27399. args->exportBuf = NULL;
  27400. }
  27401. #endif
  27402. #ifndef NO_RSA
  27403. if (args->verifySig) {
  27404. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  27405. args->verifySig = NULL;
  27406. }
  27407. #endif
  27408. (void)args;
  27409. }
  27410. /* handle generation of server_key_exchange (12) */
  27411. int SendServerKeyExchange(WOLFSSL* ssl)
  27412. {
  27413. int ret = 0;
  27414. #ifdef WOLFSSL_ASYNC_IO
  27415. SskeArgs* args = NULL;
  27416. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  27417. #else
  27418. SskeArgs args[1];
  27419. #endif
  27420. WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_SEND);
  27421. WOLFSSL_ENTER("SendServerKeyExchange");
  27422. #ifdef WOLFSSL_ASYNC_IO
  27423. if (ssl->async == NULL) {
  27424. ssl->async = (struct WOLFSSL_ASYNC*)
  27425. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  27426. DYNAMIC_TYPE_ASYNC);
  27427. if (ssl->async == NULL)
  27428. ERROR_OUT(MEMORY_E, exit_sske);
  27429. XMEMSET(ssl->async, 0, sizeof(struct WOLFSSL_ASYNC));
  27430. }
  27431. args = (SskeArgs*)ssl->async->args;
  27432. #ifdef WOLFSSL_ASYNC_CRYPT
  27433. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  27434. if (ret != WC_NOT_PENDING_E) {
  27435. /* Check for error */
  27436. if (ret < 0)
  27437. goto exit_sske;
  27438. }
  27439. else
  27440. #endif
  27441. if (ssl->options.buildingMsg) {
  27442. /* We should be in the sending state. */
  27443. if (ssl->options.asyncState != TLS_ASYNC_END) {
  27444. ret = BAD_STATE_E;
  27445. goto exit_sske;
  27446. }
  27447. }
  27448. else
  27449. #endif
  27450. {
  27451. /* Reset state */
  27452. ret = 0;
  27453. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  27454. XMEMSET(args, 0, sizeof(SskeArgs));
  27455. #ifdef WOLFSSL_ASYNC_IO
  27456. ssl->async->freeArgs = FreeSskeArgs;
  27457. #endif
  27458. }
  27459. switch(ssl->options.asyncState)
  27460. {
  27461. case TLS_ASYNC_BEGIN:
  27462. {
  27463. /* Do some checks / debug msgs */
  27464. switch(ssl->specs.kea)
  27465. {
  27466. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27467. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  27468. case ecdhe_psk_kea:
  27469. {
  27470. WOLFSSL_MSG("Using ephemeral ECDH PSK");
  27471. break;
  27472. }
  27473. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  27474. #if defined(HAVE_ECC)
  27475. case ecc_diffie_hellman_kea:
  27476. {
  27477. if (ssl->specs.static_ecdh) {
  27478. WOLFSSL_MSG("Using Static ECDH, not sending "
  27479. "ServerKeyExchange");
  27480. ERROR_OUT(0, exit_sske);
  27481. }
  27482. WOLFSSL_MSG("Using ephemeral ECDH");
  27483. break;
  27484. }
  27485. #endif /* HAVE_ECC */
  27486. }
  27487. /* Preparing keys */
  27488. switch(ssl->specs.kea)
  27489. {
  27490. #ifndef NO_PSK
  27491. case psk_kea:
  27492. {
  27493. /* Nothing to do in this sub-state */
  27494. break;
  27495. }
  27496. #endif /* !NO_PSK */
  27497. #if !defined(NO_DH) && (!defined(NO_PSK) || !defined(NO_RSA) \
  27498. || (defined(HAVE_ANON) && !defined(WOLFSSL_NO_TLS12)))
  27499. #if !defined(NO_PSK)
  27500. case dhe_psk_kea:
  27501. #endif
  27502. #if !defined(NO_RSA) || (defined(HAVE_ANON) && \
  27503. !defined(WOLFSSL_NO_TLS12))
  27504. case diffie_hellman_kea:
  27505. #endif
  27506. #if (defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)) && !defined(HAVE_PUBLIC_FFDHE)
  27507. if (ssl->namedGroup) {
  27508. word32 pSz = 0;
  27509. ret = wc_DhGetNamedKeyParamSize(ssl->namedGroup, &pSz,
  27510. NULL, NULL);
  27511. if (ret != 0)
  27512. goto exit_sske;
  27513. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  27514. /* Free'd in SSL_ResourceFree and
  27515. * FreeHandshakeResources */
  27516. ssl->buffers.serverDH_Pub.buffer = (byte*)XMALLOC(
  27517. pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  27518. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  27519. ERROR_OUT(MEMORY_E, exit_sske);
  27520. }
  27521. ssl->buffers.serverDH_Pub.length = pSz;
  27522. }
  27523. ssl->options.dhKeySz =(word16)pSz;
  27524. pSz = wc_DhGetNamedKeyMinSize(ssl->namedGroup);
  27525. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  27526. /* Free'd in SSL_ResourceFree and
  27527. * FreeHandshakeResources */
  27528. ssl->buffers.serverDH_Priv.buffer = (byte*)XMALLOC(
  27529. pSz, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  27530. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  27531. ERROR_OUT(MEMORY_E, exit_sske);
  27532. }
  27533. ssl->buffers.serverDH_Priv.length = pSz;
  27534. }
  27535. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  27536. (void**)&ssl->buffers.serverDH_Key);
  27537. if (ret != 0) {
  27538. goto exit_sske;
  27539. }
  27540. ret = wc_DhSetNamedKey(ssl->buffers.serverDH_Key,
  27541. ssl->namedGroup);
  27542. if (ret != 0) {
  27543. goto exit_sske;
  27544. }
  27545. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
  27546. !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  27547. ssl->options.dhKeyTested = 1;
  27548. #endif
  27549. #ifdef HAVE_SECURE_RENEGOTIATION
  27550. /* Check that the DH public key buffer is large
  27551. * enough to hold the key. This may occur on a
  27552. * renegotiation when the key generated in the
  27553. * initial handshake is shorter than the key
  27554. * generated in the renegotiation. */
  27555. if (ssl->buffers.serverDH_Pub.length <
  27556. ssl->buffers.serverDH_P.length) {
  27557. byte* tmp = (byte*)XREALLOC(
  27558. ssl->buffers.serverDH_Pub.buffer,
  27559. ssl->buffers.serverDH_P.length +
  27560. OPAQUE16_LEN,
  27561. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  27562. if (tmp == NULL)
  27563. ERROR_OUT(MEMORY_E, exit_sske);
  27564. ssl->buffers.serverDH_Pub.buffer = tmp;
  27565. ssl->buffers.serverDH_Pub.length =
  27566. ssl->buffers.serverDH_P.length + OPAQUE16_LEN;
  27567. }
  27568. #endif
  27569. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  27570. ssl->buffers.serverDH_Priv.buffer,
  27571. (word32*)&ssl->buffers.serverDH_Priv.length,
  27572. ssl->buffers.serverDH_Pub.buffer,
  27573. (word32*)&ssl->buffers.serverDH_Pub.length);
  27574. #ifdef WOLFSSL_CHECK_MEM_ZERO
  27575. wc_MemZero_Add("DH private key buffer",
  27576. ssl->buffers.serverDH_Priv.buffer,
  27577. ssl->buffers.serverDH_Priv.length);
  27578. #endif
  27579. break;
  27580. }
  27581. else
  27582. #endif
  27583. {
  27584. /* Allocate DH key buffers and generate key */
  27585. if (ssl->buffers.serverDH_P.buffer == NULL ||
  27586. ssl->buffers.serverDH_G.buffer == NULL) {
  27587. ERROR_OUT(NO_DH_PARAMS, exit_sske);
  27588. }
  27589. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  27590. /* Free'd in SSL_ResourceFree and FreeHandshakeResources */
  27591. ssl->buffers.serverDH_Pub.buffer = (byte*)XMALLOC(
  27592. ssl->buffers.serverDH_P.length,
  27593. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  27594. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  27595. ERROR_OUT(MEMORY_E, exit_sske);
  27596. }
  27597. ssl->buffers.serverDH_Pub.length =
  27598. ssl->buffers.serverDH_P.length;
  27599. }
  27600. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  27601. /* Free'd in SSL_ResourceFree and FreeHandshakeResources */
  27602. ssl->buffers.serverDH_Priv.buffer = (byte*)XMALLOC(
  27603. ssl->buffers.serverDH_P.length,
  27604. ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  27605. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  27606. ERROR_OUT(MEMORY_E, exit_sske);
  27607. }
  27608. ssl->buffers.serverDH_Priv.length =
  27609. ssl->buffers.serverDH_P.length;
  27610. }
  27611. ssl->options.dhKeySz =
  27612. (word16)ssl->buffers.serverDH_P.length;
  27613. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  27614. (void**)&ssl->buffers.serverDH_Key);
  27615. if (ret != 0) {
  27616. goto exit_sske;
  27617. }
  27618. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
  27619. !defined(HAVE_FIPS) && \
  27620. !defined(HAVE_SELFTEST)
  27621. if (ssl->options.dhDoKeyTest &&
  27622. !ssl->options.dhKeyTested)
  27623. {
  27624. ret = wc_DhSetCheckKey(
  27625. ssl->buffers.serverDH_Key,
  27626. ssl->buffers.serverDH_P.buffer,
  27627. ssl->buffers.serverDH_P.length,
  27628. ssl->buffers.serverDH_G.buffer,
  27629. ssl->buffers.serverDH_G.length,
  27630. NULL, 0, 0, ssl->rng);
  27631. if (ret != 0) {
  27632. goto exit_sske;
  27633. }
  27634. ssl->options.dhKeyTested = 1;
  27635. }
  27636. else
  27637. #endif
  27638. {
  27639. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  27640. ssl->buffers.serverDH_P.buffer,
  27641. ssl->buffers.serverDH_P.length,
  27642. ssl->buffers.serverDH_G.buffer,
  27643. ssl->buffers.serverDH_G.length);
  27644. if (ret != 0) {
  27645. goto exit_sske;
  27646. }
  27647. }
  27648. #ifdef HAVE_SECURE_RENEGOTIATION
  27649. /* Check that the DH public key buffer is large
  27650. * enough to hold the key. This may occur on a
  27651. * renegotiation when the key generated in the
  27652. * initial handshake is shorter than the key
  27653. * generated in the renegotiation. */
  27654. if (ssl->buffers.serverDH_Pub.length <
  27655. ssl->buffers.serverDH_P.length) {
  27656. byte* tmp = (byte*)XREALLOC(
  27657. ssl->buffers.serverDH_Pub.buffer,
  27658. ssl->buffers.serverDH_P.length +
  27659. OPAQUE16_LEN,
  27660. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  27661. if (tmp == NULL)
  27662. ERROR_OUT(MEMORY_E, exit_sske);
  27663. ssl->buffers.serverDH_Pub.buffer = tmp;
  27664. ssl->buffers.serverDH_Pub.length =
  27665. ssl->buffers.serverDH_P.length + OPAQUE16_LEN;
  27666. }
  27667. #endif
  27668. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  27669. ssl->buffers.serverDH_Priv.buffer,
  27670. (word32*)&ssl->buffers.serverDH_Priv.length,
  27671. ssl->buffers.serverDH_Pub.buffer,
  27672. (word32*)&ssl->buffers.serverDH_Pub.length);
  27673. #ifdef WOLFSSL_CHECK_MEM_ZERO
  27674. wc_MemZero_Add("DH private key buffer",
  27675. ssl->buffers.serverDH_Priv.buffer,
  27676. ssl->buffers.serverDH_Priv.length);
  27677. #endif
  27678. break;
  27679. }
  27680. #endif /* !NO_DH && (!NO_PSK || !NO_RSA) */
  27681. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27682. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  27683. case ecdhe_psk_kea:
  27684. /* Fall through to create temp ECC key */
  27685. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  27686. #if defined(HAVE_ECC) || \
  27687. ((defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) && \
  27688. (defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  27689. !defined(NO_RSA)))
  27690. case ecc_diffie_hellman_kea:
  27691. {
  27692. #ifdef HAVE_CURVE25519
  27693. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  27694. /* need ephemeral key now, create it if missing */
  27695. if (ssl->eccTempKey == NULL) {
  27696. /* alloc/init on demand */
  27697. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  27698. (void**)&ssl->eccTempKey);
  27699. if (ret != 0) {
  27700. goto exit_sske;
  27701. }
  27702. }
  27703. if (ssl->eccTempKeyPresent == 0) {
  27704. ret = X25519MakeKey(ssl,
  27705. (curve25519_key*)ssl->eccTempKey, NULL);
  27706. if (ret == 0 || ret == WC_PENDING_E) {
  27707. ssl->eccTempKeyPresent =
  27708. DYNAMIC_TYPE_CURVE25519;
  27709. }
  27710. }
  27711. break;
  27712. }
  27713. #endif
  27714. #ifdef HAVE_CURVE448
  27715. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  27716. /* need ephemeral key now, create it if missing */
  27717. if (ssl->eccTempKey == NULL) {
  27718. /* alloc/init on demand */
  27719. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  27720. (void**)&ssl->eccTempKey);
  27721. if (ret != 0) {
  27722. goto exit_sske;
  27723. }
  27724. }
  27725. if (ssl->eccTempKeyPresent == 0) {
  27726. ret = X448MakeKey(ssl,
  27727. (curve448_key*)ssl->eccTempKey, NULL);
  27728. if (ret == 0 || ret == WC_PENDING_E) {
  27729. ssl->eccTempKeyPresent =
  27730. DYNAMIC_TYPE_CURVE448;
  27731. }
  27732. }
  27733. break;
  27734. }
  27735. #endif
  27736. #ifdef HAVE_ECC
  27737. /* need ephemeral key now, create it if missing */
  27738. if (ssl->eccTempKey == NULL) {
  27739. /* alloc/init on demand */
  27740. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  27741. (void**)&ssl->eccTempKey);
  27742. if (ret != 0) {
  27743. goto exit_sske;
  27744. }
  27745. }
  27746. if (ssl->eccTempKeyPresent == 0) {
  27747. ret = EccMakeKey(ssl, ssl->eccTempKey, NULL);
  27748. if (ret == 0 || ret == WC_PENDING_E) {
  27749. ssl->eccTempKeyPresent = DYNAMIC_TYPE_ECC;
  27750. }
  27751. }
  27752. #endif
  27753. break;
  27754. }
  27755. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  27756. default:
  27757. /* Skip ServerKeyExchange */
  27758. goto exit_sske;
  27759. } /* switch(ssl->specs.kea) */
  27760. /* Check for error */
  27761. if (ret != 0) {
  27762. goto exit_sske;
  27763. }
  27764. /* Advance state and proceed */
  27765. ssl->options.asyncState = TLS_ASYNC_BUILD;
  27766. } /* case TLS_ASYNC_BEGIN */
  27767. FALL_THROUGH;
  27768. case TLS_ASYNC_BUILD:
  27769. {
  27770. switch(ssl->specs.kea)
  27771. {
  27772. #ifndef NO_PSK
  27773. case psk_kea:
  27774. {
  27775. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  27776. if (ssl->arrays->server_hint[0] == 0) {
  27777. ERROR_OUT(0, exit_sske); /* don't send */
  27778. }
  27779. /* include size part */
  27780. args->length = (word32)XSTRLEN(ssl->arrays->server_hint);
  27781. if (args->length > MAX_PSK_ID_LEN) {
  27782. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  27783. }
  27784. args->length += HINT_LEN_SZ;
  27785. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  27786. RECORD_HEADER_SZ;
  27787. #ifdef WOLFSSL_DTLS
  27788. if (ssl->options.dtls) {
  27789. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27790. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27791. }
  27792. #endif
  27793. if (IsEncryptionOn(ssl, 1)) {
  27794. args->sendSz += MAX_MSG_EXTRA;
  27795. }
  27796. /* Use tmp buffer */
  27797. args->input = (byte*)XMALLOC(args->sendSz,
  27798. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27799. if (args->input == NULL)
  27800. ERROR_OUT(MEMORY_E, exit_sske);
  27801. args->output = args->input;
  27802. AddHeaders(args->output, args->length,
  27803. server_key_exchange, ssl);
  27804. /* key data */
  27805. c16toa((word16)(args->length - HINT_LEN_SZ),
  27806. args->output + args->idx);
  27807. args->idx += HINT_LEN_SZ;
  27808. XMEMCPY(args->output + args->idx,
  27809. ssl->arrays->server_hint,
  27810. args->length - HINT_LEN_SZ);
  27811. break;
  27812. }
  27813. #endif /* !NO_PSK */
  27814. #if !defined(NO_DH) && !defined(NO_PSK)
  27815. case dhe_psk_kea:
  27816. {
  27817. word32 hintLen;
  27818. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  27819. args->length = LENGTH_SZ * 3 + /* p, g, pub */
  27820. ssl->buffers.serverDH_P.length +
  27821. ssl->buffers.serverDH_G.length +
  27822. ssl->buffers.serverDH_Pub.length;
  27823. /* include size part */
  27824. hintLen = (word32)XSTRLEN(ssl->arrays->server_hint);
  27825. if (hintLen > MAX_PSK_ID_LEN) {
  27826. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  27827. }
  27828. args->length += hintLen + HINT_LEN_SZ;
  27829. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  27830. RECORD_HEADER_SZ;
  27831. #ifdef WOLFSSL_DTLS
  27832. if (ssl->options.dtls) {
  27833. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27834. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27835. }
  27836. #endif
  27837. if (IsEncryptionOn(ssl, 1)) {
  27838. args->sendSz += MAX_MSG_EXTRA;
  27839. }
  27840. /* Use tmp buffer */
  27841. args->input = (byte*)XMALLOC(args->sendSz,
  27842. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27843. if (args->input == NULL)
  27844. ERROR_OUT(MEMORY_E, exit_sske);
  27845. args->output = args->input;
  27846. AddHeaders(args->output, args->length,
  27847. server_key_exchange, ssl);
  27848. /* key data */
  27849. c16toa((word16)hintLen, args->output + args->idx);
  27850. args->idx += HINT_LEN_SZ;
  27851. XMEMCPY(args->output + args->idx,
  27852. ssl->arrays->server_hint, hintLen);
  27853. args->idx += hintLen;
  27854. /* add p, g, pub */
  27855. c16toa((word16)ssl->buffers.serverDH_P.length,
  27856. args->output + args->idx);
  27857. args->idx += LENGTH_SZ;
  27858. XMEMCPY(args->output + args->idx,
  27859. ssl->buffers.serverDH_P.buffer,
  27860. ssl->buffers.serverDH_P.length);
  27861. args->idx += ssl->buffers.serverDH_P.length;
  27862. /* g */
  27863. c16toa((word16)ssl->buffers.serverDH_G.length,
  27864. args->output + args->idx);
  27865. args->idx += LENGTH_SZ;
  27866. XMEMCPY(args->output + args->idx,
  27867. ssl->buffers.serverDH_G.buffer,
  27868. ssl->buffers.serverDH_G.length);
  27869. args->idx += ssl->buffers.serverDH_G.length;
  27870. /* pub */
  27871. c16toa((word16)ssl->buffers.serverDH_Pub.length,
  27872. args->output + args->idx);
  27873. args->idx += LENGTH_SZ;
  27874. XMEMCPY(args->output + args->idx,
  27875. ssl->buffers.serverDH_Pub.buffer,
  27876. ssl->buffers.serverDH_Pub.length);
  27877. /* No need to update idx, since sizes are already set */
  27878. /* args->idx += ssl->buffers.serverDH_Pub.length; */
  27879. break;
  27880. }
  27881. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  27882. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27883. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  27884. case ecdhe_psk_kea:
  27885. {
  27886. word32 hintLen;
  27887. /* curve type, named curve, length(1) */
  27888. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  27889. args->length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
  27890. args->exportSz = MAX_EXPORT_ECC_SZ;
  27891. args->exportBuf = (byte*)XMALLOC(MAX_EXPORT_ECC_SZ,
  27892. ssl->heap, DYNAMIC_TYPE_DER);
  27893. if (args->exportBuf == NULL) {
  27894. ERROR_OUT(MEMORY_E, exit_sske);
  27895. }
  27896. #ifdef HAVE_CURVE25519
  27897. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  27898. if (wc_curve25519_export_public_ex(
  27899. (curve25519_key*)ssl->eccTempKey,
  27900. args->exportBuf, &args->exportSz,
  27901. EC25519_LITTLE_ENDIAN) != 0) {
  27902. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  27903. }
  27904. }
  27905. else
  27906. #endif
  27907. #ifdef HAVE_CURVE448
  27908. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  27909. if (wc_curve448_export_public_ex(
  27910. (curve448_key*)ssl->eccTempKey,
  27911. args->exportBuf, &args->exportSz,
  27912. EC448_LITTLE_ENDIAN) != 0) {
  27913. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  27914. }
  27915. }
  27916. else
  27917. #endif
  27918. {
  27919. PRIVATE_KEY_UNLOCK();
  27920. ret = wc_ecc_export_x963(ssl->eccTempKey,
  27921. args->exportBuf, &args->exportSz);
  27922. PRIVATE_KEY_LOCK();
  27923. if (ret != 0) {
  27924. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  27925. }
  27926. }
  27927. args->length += args->exportSz;
  27928. /* include size part */
  27929. hintLen = (word32)XSTRLEN(ssl->arrays->server_hint);
  27930. if (hintLen > MAX_PSK_ID_LEN) {
  27931. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  27932. }
  27933. args->length += hintLen + HINT_LEN_SZ;
  27934. args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  27935. #ifdef WOLFSSL_DTLS
  27936. if (ssl->options.dtls) {
  27937. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27938. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27939. }
  27940. #endif
  27941. if (IsEncryptionOn(ssl, 1)) {
  27942. args->sendSz += MAX_MSG_EXTRA;
  27943. }
  27944. /* Use tmp buffer */
  27945. args->input = (byte*)XMALLOC(args->sendSz,
  27946. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27947. if (args->input == NULL)
  27948. ERROR_OUT(MEMORY_E, exit_sske);
  27949. args->output = args->input;
  27950. /* key data */
  27951. c16toa((word16)hintLen, args->output + args->idx);
  27952. args->idx += HINT_LEN_SZ;
  27953. XMEMCPY(args->output + args->idx,
  27954. ssl->arrays->server_hint, hintLen);
  27955. args->idx += hintLen;
  27956. /* ECC key exchange data */
  27957. args->output[args->idx++] = named_curve;
  27958. args->output[args->idx++] = 0x00; /* leading zero */
  27959. #ifdef HAVE_CURVE25519
  27960. if (ssl->ecdhCurveOID == ECC_X25519_OID)
  27961. args->output[args->idx++] = WOLFSSL_ECC_X25519;
  27962. else
  27963. #endif
  27964. #ifdef HAVE_CURVE448
  27965. if (ssl->ecdhCurveOID == ECC_X448_OID)
  27966. args->output[args->idx++] = WOLFSSL_ECC_X448;
  27967. else
  27968. #endif
  27969. {
  27970. #ifdef HAVE_ECC
  27971. args->output[args->idx++] =
  27972. SetCurveId(ssl->eccTempKey);
  27973. #endif
  27974. }
  27975. args->output[args->idx++] = (byte)args->exportSz;
  27976. XMEMCPY(args->output + args->idx, args->exportBuf,
  27977. args->exportSz);
  27978. break;
  27979. }
  27980. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  27981. #if defined(HAVE_ECC) || \
  27982. ((defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) && \
  27983. (defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  27984. !defined(NO_RSA)))
  27985. case ecc_diffie_hellman_kea:
  27986. {
  27987. enum wc_HashType hashType;
  27988. word32 preSigSz, preSigIdx;
  27989. /* curve type, named curve, length(1) */
  27990. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  27991. args->length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
  27992. /* Export temp ECC key and add to length */
  27993. args->exportSz = MAX_EXPORT_ECC_SZ;
  27994. args->exportBuf = (byte*)XMALLOC(MAX_EXPORT_ECC_SZ,
  27995. ssl->heap, DYNAMIC_TYPE_DER);
  27996. if (args->exportBuf == NULL) {
  27997. ERROR_OUT(MEMORY_E, exit_sske);
  27998. }
  27999. #ifdef HAVE_CURVE25519
  28000. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  28001. if (wc_curve25519_export_public_ex(
  28002. (curve25519_key*)ssl->eccTempKey,
  28003. args->exportBuf, &args->exportSz,
  28004. EC25519_LITTLE_ENDIAN) != 0) {
  28005. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  28006. }
  28007. }
  28008. else
  28009. #endif
  28010. #ifdef HAVE_CURVE448
  28011. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  28012. if (wc_curve448_export_public_ex(
  28013. (curve448_key*)ssl->eccTempKey,
  28014. args->exportBuf, &args->exportSz,
  28015. EC448_LITTLE_ENDIAN) != 0) {
  28016. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  28017. }
  28018. }
  28019. else
  28020. #endif
  28021. {
  28022. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  28023. PRIVATE_KEY_UNLOCK();
  28024. ret = wc_ecc_export_x963(ssl->eccTempKey,
  28025. args->exportBuf, &args->exportSz);
  28026. PRIVATE_KEY_LOCK();
  28027. if (ret != 0) {
  28028. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  28029. }
  28030. #endif
  28031. }
  28032. args->length += args->exportSz;
  28033. preSigSz = args->length;
  28034. preSigIdx = args->idx;
  28035. if (ssl->buffers.key == NULL) {
  28036. #ifdef HAVE_PK_CALLBACKS
  28037. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  28038. args->tmpSigSz = GetPrivateKeySigSize(ssl);
  28039. if (args->tmpSigSz == 0) {
  28040. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  28041. }
  28042. }
  28043. else
  28044. #endif
  28045. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  28046. }
  28047. else {
  28048. switch(ssl->options.sigAlgo) {
  28049. #ifndef NO_RSA
  28050. #ifdef WC_RSA_PSS
  28051. case rsa_pss_sa_algo:
  28052. #endif
  28053. case rsa_sa_algo:
  28054. {
  28055. word16 keySz;
  28056. ssl->buffers.keyType = rsa_sa_algo;
  28057. ret = DecodePrivateKey(ssl, &keySz);
  28058. if (ret != 0) {
  28059. goto exit_sske;
  28060. }
  28061. args->tmpSigSz = (word32)keySz;
  28062. break;
  28063. }
  28064. #endif /* !NO_RSA */
  28065. #ifdef HAVE_ECC
  28066. case ecc_dsa_sa_algo:
  28067. {
  28068. word16 keySz;
  28069. ssl->buffers.keyType = ecc_dsa_sa_algo;
  28070. ret = DecodePrivateKey(ssl, &keySz);
  28071. if (ret != 0) {
  28072. goto exit_sske;
  28073. }
  28074. /* worst case estimate */
  28075. args->tmpSigSz = keySz;
  28076. break;
  28077. }
  28078. #endif
  28079. #ifdef HAVE_ED25519
  28080. case ed25519_sa_algo:
  28081. {
  28082. word16 keySz;
  28083. ssl->buffers.keyType = ed25519_sa_algo;
  28084. ret = DecodePrivateKey(ssl, &keySz);
  28085. if (ret != 0) {
  28086. goto exit_sske;
  28087. }
  28088. /* worst case estimate */
  28089. args->tmpSigSz = ED25519_SIG_SIZE;
  28090. break;
  28091. }
  28092. #endif /* HAVE_ED25519 */
  28093. #ifdef HAVE_ED448
  28094. case ed448_sa_algo:
  28095. {
  28096. word16 keySz;
  28097. ssl->buffers.keyType = ed448_sa_algo;
  28098. ret = DecodePrivateKey(ssl, &keySz);
  28099. if (ret != 0) {
  28100. goto exit_sske;
  28101. }
  28102. /* worst case estimate */
  28103. args->tmpSigSz = ED448_SIG_SIZE;
  28104. break;
  28105. }
  28106. #endif /* HAVE_ED448 */
  28107. default:
  28108. ERROR_OUT(ALGO_ID_E, exit_sske); /* unsupported type */
  28109. } /* switch(ssl->specs.sig_algo) */
  28110. }
  28111. /* sig length */
  28112. args->length += LENGTH_SZ;
  28113. args->length += args->tmpSigSz;
  28114. if (IsAtLeastTLSv1_2(ssl)) {
  28115. args->length += HASH_SIG_SIZE;
  28116. }
  28117. args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  28118. #ifdef WOLFSSL_DTLS
  28119. if (ssl->options.dtls) {
  28120. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  28121. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  28122. preSigIdx = args->idx;
  28123. }
  28124. #endif
  28125. if (IsEncryptionOn(ssl, 1)) {
  28126. args->sendSz += MAX_MSG_EXTRA;
  28127. }
  28128. /* Use tmp buffer */
  28129. args->input = (byte*)XMALLOC(args->sendSz,
  28130. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  28131. if (args->input == NULL)
  28132. ERROR_OUT(MEMORY_E, exit_sske);
  28133. args->output = args->input;
  28134. /* record and message headers will be added below, when we're sure
  28135. of the sig length */
  28136. /* key exchange data */
  28137. args->output[args->idx++] = named_curve;
  28138. args->output[args->idx++] = 0x00; /* leading zero */
  28139. #ifdef HAVE_CURVE25519
  28140. if (ssl->ecdhCurveOID == ECC_X25519_OID)
  28141. args->output[args->idx++] = WOLFSSL_ECC_X25519;
  28142. else
  28143. #endif
  28144. #ifdef HAVE_CURVE448
  28145. if (ssl->ecdhCurveOID == ECC_X448_OID)
  28146. args->output[args->idx++] = WOLFSSL_ECC_X448;
  28147. else
  28148. #endif
  28149. {
  28150. #ifdef HAVE_ECC
  28151. args->output[args->idx++] =
  28152. SetCurveId(ssl->eccTempKey);
  28153. #endif
  28154. }
  28155. args->output[args->idx++] = (byte)args->exportSz;
  28156. XMEMCPY(args->output + args->idx, args->exportBuf, args->exportSz);
  28157. args->idx += args->exportSz;
  28158. /* Determine hash type */
  28159. if (IsAtLeastTLSv1_2(ssl)) {
  28160. EncodeSigAlg(ssl->options.hashAlgo,
  28161. ssl->options.sigAlgo,
  28162. &args->output[args->idx]);
  28163. args->idx += 2;
  28164. hashType = HashAlgoToType(ssl->options.hashAlgo);
  28165. if (hashType == WC_HASH_TYPE_NONE) {
  28166. ERROR_OUT(ALGO_ID_E, exit_sske);
  28167. }
  28168. } else {
  28169. /* only using sha and md5 for rsa */
  28170. #ifndef NO_OLD_TLS
  28171. hashType = WC_HASH_TYPE_SHA;
  28172. if (ssl->options.sigAlgo == rsa_sa_algo) {
  28173. hashType = WC_HASH_TYPE_MD5_SHA;
  28174. }
  28175. #else
  28176. ERROR_OUT(ALGO_ID_E, exit_sske);
  28177. #endif
  28178. }
  28179. /* Signature length will be written later, when we're sure what it is */
  28180. #ifdef HAVE_FUZZER
  28181. if (ssl->fuzzerCb) {
  28182. ssl->fuzzerCb(ssl, args->output + preSigIdx,
  28183. preSigSz, FUZZ_SIGNATURE, ssl->fuzzerCtx);
  28184. }
  28185. #endif
  28186. ret = HashSkeData(ssl, hashType,
  28187. args->output + preSigIdx, preSigSz,
  28188. ssl->options.sigAlgo);
  28189. if (ret != 0) {
  28190. goto exit_sske;
  28191. }
  28192. args->sigSz = args->tmpSigSz;
  28193. /* Sign hash to create signature */
  28194. switch (ssl->options.sigAlgo)
  28195. {
  28196. #ifndef NO_RSA
  28197. case rsa_sa_algo:
  28198. {
  28199. /* For TLS 1.2 re-encode signature */
  28200. if (IsAtLeastTLSv1_2(ssl)) {
  28201. byte* encodedSig = (byte*)XMALLOC(
  28202. MAX_ENCODED_SIG_SZ, ssl->heap,
  28203. DYNAMIC_TYPE_DIGEST);
  28204. if (encodedSig == NULL) {
  28205. ERROR_OUT(MEMORY_E, exit_sske);
  28206. }
  28207. ssl->buffers.digest.length =
  28208. wc_EncodeSignature(encodedSig,
  28209. ssl->buffers.digest.buffer,
  28210. ssl->buffers.digest.length,
  28211. TypeHash(ssl->options.hashAlgo));
  28212. /* Replace sig buffer with new one */
  28213. if (!ssl->options.dontFreeDigest) {
  28214. XFREE(ssl->buffers.digest.buffer,
  28215. ssl->heap, DYNAMIC_TYPE_DIGEST);
  28216. }
  28217. ssl->options.dontFreeDigest = 0;
  28218. ssl->buffers.digest.buffer = encodedSig;
  28219. }
  28220. /* write sig size here */
  28221. c16toa((word16)args->sigSz,
  28222. args->output + args->idx);
  28223. args->idx += LENGTH_SZ;
  28224. break;
  28225. }
  28226. #ifdef WC_RSA_PSS
  28227. case rsa_pss_sa_algo:
  28228. /* write sig size here */
  28229. c16toa((word16)args->sigSz,
  28230. args->output + args->idx);
  28231. args->idx += LENGTH_SZ;
  28232. break;
  28233. #endif
  28234. #endif /* !NO_RSA */
  28235. case ecc_dsa_sa_algo:
  28236. {
  28237. break;
  28238. }
  28239. #ifdef HAVE_ED25519
  28240. case ed25519_sa_algo:
  28241. ret = Ed25519CheckPubKey(ssl);
  28242. if (ret != 0)
  28243. goto exit_sske;
  28244. break;
  28245. #endif /* HAVE_ED25519 */
  28246. #ifdef HAVE_ED448
  28247. case ed448_sa_algo:
  28248. ret = Ed448CheckPubKey(ssl);
  28249. if (ret != 0)
  28250. goto exit_sske;
  28251. break;
  28252. #endif /* HAVE_ED448 */
  28253. default:
  28254. break;
  28255. } /* switch(ssl->specs.sig_algo) */
  28256. break;
  28257. }
  28258. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  28259. #if !defined(NO_DH) && (!defined(NO_RSA) || \
  28260. (defined(HAVE_ANON) && !defined(WOLFSSL_NO_TLS12)))
  28261. case diffie_hellman_kea:
  28262. {
  28263. enum wc_HashType hashType;
  28264. word32 preSigSz, preSigIdx;
  28265. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  28266. args->length = LENGTH_SZ * 3; /* p, g, pub */
  28267. args->length += ssl->buffers.serverDH_P.length +
  28268. ssl->buffers.serverDH_G.length +
  28269. ssl->buffers.serverDH_Pub.length;
  28270. preSigIdx = args->idx;
  28271. preSigSz = args->length;
  28272. if (!ssl->options.usingAnon_cipher) {
  28273. word16 keySz = 0;
  28274. /* sig length */
  28275. args->length += LENGTH_SZ;
  28276. if (ssl->buffers.key == NULL) {
  28277. #ifdef HAVE_PK_CALLBACKS
  28278. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  28279. keySz = (word32)GetPrivateKeySigSize(ssl);
  28280. else
  28281. #endif
  28282. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  28283. }
  28284. else
  28285. {
  28286. if (ssl->buffers.keyType == 0)
  28287. ssl->buffers.keyType = rsa_sa_algo;
  28288. ret = DecodePrivateKey(ssl, &keySz);
  28289. if (ret != 0) {
  28290. goto exit_sske;
  28291. }
  28292. }
  28293. /* test if keySz has error */
  28294. if (keySz == 0) {
  28295. ERROR_OUT(keySz, exit_sske);
  28296. }
  28297. args->tmpSigSz = (word32)keySz;
  28298. args->length += args->tmpSigSz;
  28299. if (IsAtLeastTLSv1_2(ssl)) {
  28300. args->length += HASH_SIG_SIZE;
  28301. }
  28302. }
  28303. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  28304. RECORD_HEADER_SZ;
  28305. #ifdef WOLFSSL_DTLS
  28306. if (ssl->options.dtls) {
  28307. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  28308. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  28309. preSigIdx = args->idx;
  28310. }
  28311. #endif
  28312. if (IsEncryptionOn(ssl, 1)) {
  28313. args->sendSz += MAX_MSG_EXTRA;
  28314. }
  28315. /* Use tmp buffer */
  28316. args->input = (byte*)XMALLOC(args->sendSz,
  28317. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  28318. if (args->input == NULL)
  28319. ERROR_OUT(MEMORY_E, exit_sske);
  28320. args->output = args->input;
  28321. AddHeaders(args->output, args->length,
  28322. server_key_exchange, ssl);
  28323. /* add p, g, pub */
  28324. c16toa((word16)ssl->buffers.serverDH_P.length,
  28325. args->output + args->idx);
  28326. args->idx += LENGTH_SZ;
  28327. XMEMCPY(args->output + args->idx,
  28328. ssl->buffers.serverDH_P.buffer,
  28329. ssl->buffers.serverDH_P.length);
  28330. args->idx += ssl->buffers.serverDH_P.length;
  28331. /* g */
  28332. c16toa((word16)ssl->buffers.serverDH_G.length,
  28333. args->output + args->idx);
  28334. args->idx += LENGTH_SZ;
  28335. XMEMCPY(args->output + args->idx,
  28336. ssl->buffers.serverDH_G.buffer,
  28337. ssl->buffers.serverDH_G.length);
  28338. args->idx += ssl->buffers.serverDH_G.length;
  28339. /* pub */
  28340. c16toa((word16)ssl->buffers.serverDH_Pub.length,
  28341. args->output + args->idx);
  28342. args->idx += LENGTH_SZ;
  28343. XMEMCPY(args->output + args->idx,
  28344. ssl->buffers.serverDH_Pub.buffer,
  28345. ssl->buffers.serverDH_Pub.length);
  28346. args->idx += ssl->buffers.serverDH_Pub.length;
  28347. #ifdef HAVE_FUZZER
  28348. if (ssl->fuzzerCb) {
  28349. ssl->fuzzerCb(ssl, args->output + preSigIdx,
  28350. preSigSz, FUZZ_SIGNATURE, ssl->fuzzerCtx);
  28351. }
  28352. #endif
  28353. if (ssl->options.usingAnon_cipher) {
  28354. break;
  28355. }
  28356. /* Determine hash type */
  28357. if (IsAtLeastTLSv1_2(ssl)) {
  28358. EncodeSigAlg(ssl->options.hashAlgo,
  28359. ssl->options.sigAlgo,
  28360. &args->output[args->idx]);
  28361. args->idx += 2;
  28362. hashType = HashAlgoToType(ssl->options.hashAlgo);
  28363. if (hashType == WC_HASH_TYPE_NONE) {
  28364. ERROR_OUT(ALGO_ID_E, exit_sske);
  28365. }
  28366. } else {
  28367. /* only using sha and md5 for rsa */
  28368. #ifndef NO_OLD_TLS
  28369. hashType = WC_HASH_TYPE_SHA;
  28370. if (ssl->options.sigAlgo == rsa_sa_algo) {
  28371. hashType = WC_HASH_TYPE_MD5_SHA;
  28372. }
  28373. #else
  28374. ERROR_OUT(ALGO_ID_E, exit_sske);
  28375. #endif
  28376. }
  28377. /* signature size */
  28378. c16toa((word16)args->tmpSigSz, args->output + args->idx);
  28379. args->idx += LENGTH_SZ;
  28380. ret = HashSkeData(ssl, hashType,
  28381. args->output + preSigIdx, preSigSz,
  28382. ssl->options.sigAlgo);
  28383. if (ret != 0) {
  28384. goto exit_sske;
  28385. }
  28386. args->sigSz = args->tmpSigSz;
  28387. /* Sign hash to create signature */
  28388. switch (ssl->options.sigAlgo)
  28389. {
  28390. #ifndef NO_RSA
  28391. case rsa_sa_algo:
  28392. {
  28393. /* For TLS 1.2 re-encode signature */
  28394. if (IsAtLeastTLSv1_2(ssl)) {
  28395. byte* encodedSig = (byte*)XMALLOC(
  28396. MAX_ENCODED_SIG_SZ, ssl->heap,
  28397. DYNAMIC_TYPE_DIGEST);
  28398. if (encodedSig == NULL) {
  28399. ERROR_OUT(MEMORY_E, exit_sske);
  28400. }
  28401. ssl->buffers.digest.length =
  28402. wc_EncodeSignature(encodedSig,
  28403. ssl->buffers.digest.buffer,
  28404. ssl->buffers.digest.length,
  28405. TypeHash(ssl->options.hashAlgo));
  28406. /* Replace sig buffer with new one */
  28407. if (!ssl->options.dontFreeDigest) {
  28408. XFREE(ssl->buffers.digest.buffer,
  28409. ssl->heap, DYNAMIC_TYPE_DIGEST);
  28410. }
  28411. ssl->options.dontFreeDigest = 0;
  28412. ssl->buffers.digest.buffer = encodedSig;
  28413. }
  28414. break;
  28415. }
  28416. #endif /* NO_RSA */
  28417. default:
  28418. break;
  28419. } /* switch (ssl->options.sigAlgo) */
  28420. break;
  28421. }
  28422. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  28423. default:
  28424. break;
  28425. } /* switch(ssl->specs.kea) */
  28426. /* Check for error */
  28427. if (ret != 0) {
  28428. goto exit_sske;
  28429. }
  28430. /* Advance state and proceed */
  28431. ssl->options.asyncState = TLS_ASYNC_DO;
  28432. } /* case TLS_ASYNC_BUILD */
  28433. FALL_THROUGH;
  28434. case TLS_ASYNC_DO:
  28435. {
  28436. switch(ssl->specs.kea)
  28437. {
  28438. #ifndef NO_PSK
  28439. case psk_kea:
  28440. {
  28441. break;
  28442. }
  28443. #endif /* !NO_PSK */
  28444. #if !defined(NO_DH) && !defined(NO_PSK)
  28445. case dhe_psk_kea:
  28446. {
  28447. break;
  28448. }
  28449. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  28450. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28451. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  28452. case ecdhe_psk_kea:
  28453. {
  28454. break;
  28455. }
  28456. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  28457. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28458. defined(HAVE_CURVE448)
  28459. case ecc_diffie_hellman_kea:
  28460. {
  28461. /* Sign hash to create signature */
  28462. switch (ssl->options.sigAlgo)
  28463. {
  28464. #ifndef NO_RSA
  28465. #ifdef WC_RSA_PSS
  28466. case rsa_pss_sa_algo:
  28467. #endif
  28468. case rsa_sa_algo:
  28469. {
  28470. RsaKey* key = (RsaKey*)ssl->hsKey;
  28471. ret = RsaSign(ssl,
  28472. ssl->buffers.digest.buffer,
  28473. ssl->buffers.digest.length,
  28474. args->output + args->idx,
  28475. &args->sigSz,
  28476. ssl->options.sigAlgo, ssl->options.hashAlgo,
  28477. key,
  28478. ssl->buffers.key
  28479. );
  28480. break;
  28481. }
  28482. #endif /* !NO_RSA */
  28483. #ifdef HAVE_ECC
  28484. case ecc_dsa_sa_algo:
  28485. {
  28486. ecc_key* key = (ecc_key*)ssl->hsKey;
  28487. ret = EccSign(ssl,
  28488. ssl->buffers.digest.buffer,
  28489. ssl->buffers.digest.length,
  28490. args->output + LENGTH_SZ + args->idx,
  28491. &args->sigSz,
  28492. key,
  28493. #ifdef HAVE_PK_CALLBACKS
  28494. ssl->buffers.key
  28495. #else
  28496. NULL
  28497. #endif
  28498. );
  28499. break;
  28500. }
  28501. #endif /* HAVE_ECC */
  28502. #ifdef HAVE_ED25519
  28503. case ed25519_sa_algo:
  28504. {
  28505. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  28506. ret = Ed25519Sign(ssl,
  28507. ssl->buffers.sig.buffer,
  28508. ssl->buffers.sig.length,
  28509. args->output + LENGTH_SZ + args->idx,
  28510. &args->sigSz,
  28511. key,
  28512. #ifdef HAVE_PK_CALLBACKS
  28513. ssl->buffers.key
  28514. #else
  28515. NULL
  28516. #endif
  28517. );
  28518. break;
  28519. }
  28520. #endif
  28521. #ifdef HAVE_ED448
  28522. case ed448_sa_algo:
  28523. {
  28524. ed448_key* key = (ed448_key*)ssl->hsKey;
  28525. ret = Ed448Sign(ssl,
  28526. ssl->buffers.sig.buffer,
  28527. ssl->buffers.sig.length,
  28528. args->output + LENGTH_SZ + args->idx,
  28529. &args->sigSz,
  28530. key,
  28531. #ifdef HAVE_PK_CALLBACKS
  28532. ssl->buffers.key
  28533. #else
  28534. NULL
  28535. #endif
  28536. );
  28537. break;
  28538. }
  28539. #endif
  28540. default:
  28541. ERROR_OUT(ALGO_ID_E, exit_sske);
  28542. } /* switch(ssl->specs.sig_algo) */
  28543. break;
  28544. }
  28545. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  28546. #if !defined(NO_DH) && !defined(NO_RSA)
  28547. case diffie_hellman_kea:
  28548. {
  28549. /* Sign hash to create signature */
  28550. switch (ssl->options.sigAlgo)
  28551. {
  28552. #ifndef NO_RSA
  28553. #ifdef WC_RSA_PSS
  28554. case rsa_pss_sa_algo:
  28555. #endif
  28556. case rsa_sa_algo:
  28557. {
  28558. RsaKey* key = (RsaKey*)ssl->hsKey;
  28559. if (ssl->options.usingAnon_cipher) {
  28560. break;
  28561. }
  28562. ret = RsaSign(ssl,
  28563. ssl->buffers.digest.buffer,
  28564. ssl->buffers.digest.length,
  28565. args->output + args->idx,
  28566. &args->sigSz,
  28567. ssl->options.sigAlgo, ssl->options.hashAlgo,
  28568. key,
  28569. ssl->buffers.key
  28570. );
  28571. break;
  28572. }
  28573. #endif /* NO_RSA */
  28574. default:
  28575. break;
  28576. } /* switch (ssl->options.sigAlgo) */
  28577. break;
  28578. }
  28579. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  28580. default:
  28581. break;
  28582. } /* switch(ssl->specs.kea) */
  28583. /* Check for error */
  28584. if (ret != 0) {
  28585. goto exit_sske;
  28586. }
  28587. /* Advance state and proceed */
  28588. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  28589. } /* case TLS_ASYNC_DO */
  28590. FALL_THROUGH;
  28591. case TLS_ASYNC_VERIFY:
  28592. {
  28593. switch(ssl->specs.kea)
  28594. {
  28595. #ifndef NO_PSK
  28596. case psk_kea:
  28597. {
  28598. /* Nothing to do in this sub-state */
  28599. break;
  28600. }
  28601. #endif /* !NO_PSK */
  28602. #if !defined(NO_DH) && !defined(NO_PSK)
  28603. case dhe_psk_kea:
  28604. {
  28605. /* Nothing to do in this sub-state */
  28606. break;
  28607. }
  28608. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  28609. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28610. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  28611. case ecdhe_psk_kea:
  28612. {
  28613. /* Nothing to do in this sub-state */
  28614. break;
  28615. }
  28616. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  28617. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28618. defined(HAVE_CURVE448)
  28619. case ecc_diffie_hellman_kea:
  28620. {
  28621. switch(ssl->options.sigAlgo)
  28622. {
  28623. #ifndef NO_RSA
  28624. #ifdef WC_RSA_PSS
  28625. case rsa_pss_sa_algo:
  28626. #endif
  28627. case rsa_sa_algo:
  28628. {
  28629. RsaKey* key = (RsaKey*)ssl->hsKey;
  28630. if (args->verifySig == NULL) {
  28631. if (args->sigSz == 0) {
  28632. ERROR_OUT(BAD_COND_E, exit_sske);
  28633. }
  28634. args->verifySig = (byte*)XMALLOC(
  28635. args->sigSz, ssl->heap,
  28636. DYNAMIC_TYPE_SIGNATURE);
  28637. if (!args->verifySig) {
  28638. ERROR_OUT(MEMORY_E, exit_sske);
  28639. }
  28640. XMEMCPY(args->verifySig,
  28641. args->output + args->idx, args->sigSz);
  28642. }
  28643. /* check for signature faults */
  28644. ret = VerifyRsaSign(ssl,
  28645. args->verifySig, args->sigSz,
  28646. ssl->buffers.digest.buffer,
  28647. ssl->buffers.digest.length,
  28648. ssl->options.sigAlgo, ssl->options.hashAlgo,
  28649. key, ssl->buffers.key
  28650. );
  28651. break;
  28652. }
  28653. #endif
  28654. case ecc_dsa_sa_algo:
  28655. #ifdef WOLFSSL_CHECK_SIG_FAULTS
  28656. {
  28657. ecc_key* key = (ecc_key*)ssl->hsKey;
  28658. ret = EccVerify(ssl,
  28659. args->output + LENGTH_SZ + args->idx,
  28660. args->sigSz,
  28661. ssl->buffers.digest.buffer,
  28662. ssl->buffers.digest.length,
  28663. key,
  28664. #ifdef HAVE_PK_CALLBACKS
  28665. ssl->buffers.key
  28666. #else
  28667. NULL
  28668. #endif
  28669. );
  28670. if (ret != 0) {
  28671. WOLFSSL_MSG(
  28672. "Failed to verify ECC signature");
  28673. goto exit_sske;
  28674. }
  28675. }
  28676. #if defined(HAVE_E25519) || defined(HAVE_ED448)
  28677. FALL_THROUGH;
  28678. #endif
  28679. #endif /* WOLFSSL_CHECK_SIG_FAULTS */
  28680. #ifdef HAVE_ED25519
  28681. case ed25519_sa_algo:
  28682. #endif
  28683. #ifdef HAVE_ED448
  28684. case ed448_sa_algo:
  28685. #endif
  28686. {
  28687. /* Now that we know the real sig size, write it. */
  28688. c16toa((word16)args->sigSz,
  28689. args->output + args->idx);
  28690. /* And adjust length and sendSz from estimates */
  28691. args->length += args->sigSz - args->tmpSigSz;
  28692. args->sendSz += args->sigSz - args->tmpSigSz;
  28693. break;
  28694. }
  28695. default:
  28696. ERROR_OUT(ALGO_ID_E, exit_sske); /* unsupported type */
  28697. } /* switch(ssl->specs.sig_algo) */
  28698. break;
  28699. }
  28700. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  28701. #if !defined(NO_DH) && !defined(NO_RSA)
  28702. case diffie_hellman_kea:
  28703. {
  28704. switch (ssl->options.sigAlgo)
  28705. {
  28706. #ifndef NO_RSA
  28707. #ifndef WC_RSA_PSS
  28708. case rsa_pss_sa_algo:
  28709. #endif
  28710. case rsa_sa_algo:
  28711. {
  28712. RsaKey* key = (RsaKey*)ssl->hsKey;
  28713. if (ssl->options.usingAnon_cipher) {
  28714. break;
  28715. }
  28716. if (args->verifySig == NULL) {
  28717. if (args->sigSz == 0) {
  28718. ERROR_OUT(BAD_COND_E, exit_sske);
  28719. }
  28720. args->verifySig = (byte*)XMALLOC(
  28721. args->sigSz, ssl->heap,
  28722. DYNAMIC_TYPE_SIGNATURE);
  28723. if (!args->verifySig) {
  28724. ERROR_OUT(MEMORY_E, exit_sske);
  28725. }
  28726. XMEMCPY(args->verifySig,
  28727. args->output + args->idx, args->sigSz);
  28728. }
  28729. /* check for signature faults */
  28730. ret = VerifyRsaSign(ssl,
  28731. args->verifySig, args->sigSz,
  28732. ssl->buffers.digest.buffer,
  28733. ssl->buffers.digest.length,
  28734. ssl->options.sigAlgo, ssl->options.hashAlgo,
  28735. key, ssl->buffers.key
  28736. );
  28737. break;
  28738. }
  28739. #endif
  28740. } /* switch (ssl->options.sigAlgo) */
  28741. break;
  28742. }
  28743. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  28744. default:
  28745. break;
  28746. } /* switch(ssl->specs.kea) */
  28747. /* Check for error */
  28748. if (ret != 0) {
  28749. goto exit_sske;
  28750. }
  28751. /* Advance state and proceed */
  28752. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  28753. } /* case TLS_ASYNC_VERIFY */
  28754. FALL_THROUGH;
  28755. case TLS_ASYNC_FINALIZE:
  28756. {
  28757. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28758. defined(HAVE_CURVE448)
  28759. if (ssl->specs.kea == ecdhe_psk_kea ||
  28760. ssl->specs.kea == ecc_diffie_hellman_kea) {
  28761. /* Check output to make sure it was set */
  28762. if (args->output) {
  28763. AddHeaders(args->output, args->length,
  28764. server_key_exchange, ssl);
  28765. }
  28766. else {
  28767. ERROR_OUT(BUFFER_ERROR, exit_sske);
  28768. }
  28769. }
  28770. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  28771. /* Advance state and proceed */
  28772. ssl->options.asyncState = TLS_ASYNC_END;
  28773. } /* case TLS_ASYNC_FINALIZE */
  28774. FALL_THROUGH;
  28775. case TLS_ASYNC_END:
  28776. {
  28777. ret = SendHandshakeMsg(ssl, args->output, args->length,
  28778. server_key_exchange, "ServerKeyExchange");
  28779. if (ret != 0)
  28780. goto exit_sske;
  28781. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  28782. break;
  28783. }
  28784. default:
  28785. ret = INPUT_CASE_ERROR;
  28786. } /* switch(ssl->options.asyncState) */
  28787. exit_sske:
  28788. WOLFSSL_LEAVE("SendServerKeyExchange", ret);
  28789. WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_SEND);
  28790. #ifdef WOLFSSL_ASYNC_IO
  28791. /* Handle async operation */
  28792. if (ret == WANT_WRITE
  28793. #ifdef WOLFSSL_ASYNC_CRYPT
  28794. || ret == WC_PENDING_E
  28795. #endif
  28796. )
  28797. return ret;
  28798. #endif /* WOLFSSL_ASYNC_IO */
  28799. /* Final cleanup */
  28800. if (
  28801. #ifdef WOLFSSL_ASYNC_IO
  28802. args != NULL &&
  28803. #endif
  28804. args->input != NULL) {
  28805. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  28806. args->input = NULL;
  28807. }
  28808. #ifdef WOLFSSL_ASYNC_IO
  28809. /* Cleanup async */
  28810. FreeAsyncCtx(ssl, 0);
  28811. #else
  28812. FreeSskeArgs(ssl, args);
  28813. #endif
  28814. FreeKeyExchange(ssl);
  28815. if (ret != 0) {
  28816. WOLFSSL_ERROR_VERBOSE(ret);
  28817. }
  28818. return ret;
  28819. }
  28820. #if defined(HAVE_SERVER_RENEGOTIATION_INFO) || defined(HAVE_FALLBACK_SCSV) || \
  28821. defined(OPENSSL_ALL)
  28822. /* search suites for specific one, idx on success, negative on error */
  28823. static int FindSuite(Suites* suites, byte first, byte second)
  28824. {
  28825. int i;
  28826. if (suites == NULL || suites->suiteSz == 0) {
  28827. WOLFSSL_MSG("Suites pointer error or suiteSz 0");
  28828. return SUITES_ERROR;
  28829. }
  28830. for (i = 0; i < suites->suiteSz-1; i += SUITE_LEN) {
  28831. if (suites->suites[i] == first &&
  28832. suites->suites[i+1] == second )
  28833. return i;
  28834. }
  28835. return MATCH_SUITE_ERROR;
  28836. }
  28837. #endif
  28838. #endif /* !WOLFSSL_NO_TLS12 */
  28839. /* Make sure server cert/key are valid for this suite, true on success
  28840. * Returns 1 for valid server suite or 0 if not found
  28841. * For asynchronous this can return WC_PENDING_E
  28842. */
  28843. static int VerifyServerSuite(const WOLFSSL* ssl, const Suites* suites,
  28844. word16 idx, CipherSuite* cs, TLSX* extensions)
  28845. {
  28846. #ifndef NO_PSK
  28847. int havePSK = ssl->options.havePSK;
  28848. #endif
  28849. byte first;
  28850. byte second;
  28851. (void)cs;
  28852. (void)extensions;
  28853. WOLFSSL_ENTER("VerifyServerSuite");
  28854. if (suites == NULL) {
  28855. WOLFSSL_MSG("Suites pointer error");
  28856. return 0;
  28857. }
  28858. first = suites->suites[idx];
  28859. second = suites->suites[idx+1];
  28860. if (CipherRequires(first, second, REQUIRES_RSA)) {
  28861. WOLFSSL_MSG("Requires RSA");
  28862. if (ssl->options.haveRSA == 0) {
  28863. WOLFSSL_MSG("Don't have RSA");
  28864. return 0;
  28865. }
  28866. }
  28867. if (CipherRequires(first, second, REQUIRES_DHE)) {
  28868. WOLFSSL_MSG("Requires DHE");
  28869. if (ssl->options.haveDH == 0) {
  28870. WOLFSSL_MSG("Don't have DHE");
  28871. return 0;
  28872. }
  28873. }
  28874. if (CipherRequires(first, second, REQUIRES_ECC)) {
  28875. WOLFSSL_MSG("Requires ECC");
  28876. if (ssl->options.haveECC == 0) {
  28877. WOLFSSL_MSG("Don't have ECC");
  28878. return 0;
  28879. }
  28880. }
  28881. if (CipherRequires(first, second, REQUIRES_ECC_STATIC)) {
  28882. WOLFSSL_MSG("Requires static ECC");
  28883. if (ssl->options.haveStaticECC == 0) {
  28884. WOLFSSL_MSG("Don't have static ECC");
  28885. return 0;
  28886. }
  28887. }
  28888. if (CipherRequires(first, second, REQUIRES_PSK)) {
  28889. WOLFSSL_MSG("Requires PSK");
  28890. #ifndef NO_PSK
  28891. if (havePSK == 0)
  28892. #endif
  28893. {
  28894. WOLFSSL_MSG("Don't have PSK");
  28895. return 0;
  28896. }
  28897. }
  28898. if (CipherRequires(first, second, REQUIRES_RSA_SIG)) {
  28899. WOLFSSL_MSG("Requires RSA Signature");
  28900. if (ssl->options.side == WOLFSSL_SERVER_END &&
  28901. ssl->options.haveECDSAsig == 1) {
  28902. WOLFSSL_MSG("Don't have RSA Signature");
  28903. return 0;
  28904. }
  28905. }
  28906. #if !defined(WOLFSSL_OLDTLS_AEAD_CIPHERSUITES)
  28907. if (CipherRequires(first, second, REQUIRES_AEAD)) {
  28908. WOLFSSL_MSG("Requires AEAD");
  28909. if (ssl->version.major == SSLv3_MAJOR &&
  28910. ssl->version.minor < TLSv1_2_MINOR) {
  28911. WOLFSSL_MSG("Version of SSL does not support AEAD ciphers");
  28912. return 0;
  28913. }
  28914. }
  28915. #endif
  28916. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28917. defined(HAVE_CURVE448)) && defined(HAVE_SUPPORTED_CURVES)
  28918. if (!TLSX_ValidateSupportedCurves(ssl, first, second,
  28919. &cs->ecdhCurveOID)) {
  28920. WOLFSSL_MSG("Don't have matching curves");
  28921. return 0;
  28922. }
  28923. #endif
  28924. #ifdef WOLFSSL_TLS13
  28925. if (IsAtLeastTLSv1_3(ssl->version) &&
  28926. ssl->options.side == WOLFSSL_SERVER_END) {
  28927. #ifdef HAVE_SUPPORTED_CURVES
  28928. byte searched = 0;
  28929. int ret = TLSX_KeyShare_Choose(ssl, extensions, &cs->clientKSE,
  28930. &searched);
  28931. if (ret == MEMORY_E) {
  28932. WOLFSSL_MSG("TLSX_KeyShare_Choose() failed in "
  28933. "VerifyServerSuite() with MEMORY_E");
  28934. return 0;
  28935. }
  28936. if (cs->clientKSE == NULL && searched)
  28937. cs->doHelloRetry = 1;
  28938. #ifdef WOLFSSL_ASYNC_CRYPT
  28939. if (ret == WC_PENDING_E)
  28940. return ret;
  28941. #endif
  28942. if (!cs->doHelloRetry && ret != 0)
  28943. return 0; /* not found */
  28944. #endif /* HAVE_SUPPORTED_CURVES */
  28945. }
  28946. else if (first == TLS13_BYTE || (first == ECC_BYTE &&
  28947. (second == TLS_SHA256_SHA256 || second == TLS_SHA384_SHA384))) {
  28948. /* Can't negotiate TLS 1.3 cipher suites with lower protocol
  28949. * version. */
  28950. return 0;
  28951. }
  28952. #endif /* WOLFSSL_TLS13 */
  28953. return 1;
  28954. }
  28955. static int CompareSuites(const WOLFSSL* ssl, const Suites* suites,
  28956. Suites* peerSuites, word16 i, word16 j,
  28957. CipherSuite* cs, TLSX* extensions)
  28958. {
  28959. if (suites->suites[i] == peerSuites->suites[j] &&
  28960. suites->suites[i+1] == peerSuites->suites[j+1] ) {
  28961. int ret = VerifyServerSuite(ssl, suites, i, cs, extensions);
  28962. if (ret < 0) {
  28963. return ret;
  28964. }
  28965. if (ret) {
  28966. WOLFSSL_MSG("Verified suite validity");
  28967. cs->cipherSuite0 = suites->suites[i];
  28968. cs->cipherSuite = suites->suites[i+1];
  28969. return 0;
  28970. }
  28971. else {
  28972. WOLFSSL_MSG("Could not verify suite validity, continue");
  28973. }
  28974. }
  28975. return MATCH_SUITE_ERROR;
  28976. }
  28977. int MatchSuite_ex(const WOLFSSL* ssl, Suites* peerSuites, CipherSuite* cs,
  28978. TLSX* extensions)
  28979. {
  28980. int ret;
  28981. word16 i, j;
  28982. const Suites* suites = WOLFSSL_SUITES(ssl);
  28983. WOLFSSL_ENTER("MatchSuite");
  28984. /* & 0x1 equivalent % 2 */
  28985. if (peerSuites->suiteSz == 0 || peerSuites->suiteSz & 0x1)
  28986. return BUFFER_ERROR;
  28987. if (suites == NULL)
  28988. return SUITES_ERROR;
  28989. if (!ssl->options.useClientOrder) {
  28990. /* Server order */
  28991. for (i = 0; i < suites->suiteSz; i += 2) {
  28992. for (j = 0; j < peerSuites->suiteSz; j += 2) {
  28993. ret = CompareSuites(ssl, suites, peerSuites, i, j, cs, extensions);
  28994. if (ret != MATCH_SUITE_ERROR)
  28995. return ret;
  28996. }
  28997. }
  28998. }
  28999. else {
  29000. /* Client order */
  29001. for (j = 0; j < peerSuites->suiteSz; j += 2) {
  29002. for (i = 0; i < suites->suiteSz; i += 2) {
  29003. ret = CompareSuites(ssl, suites, peerSuites, i, j, cs, extensions);
  29004. if (ret != MATCH_SUITE_ERROR)
  29005. return ret;
  29006. }
  29007. }
  29008. }
  29009. WOLFSSL_ERROR_VERBOSE(MATCH_SUITE_ERROR);
  29010. return MATCH_SUITE_ERROR;
  29011. }
  29012. int MatchSuite(WOLFSSL* ssl, Suites* peerSuites)
  29013. {
  29014. int ret;
  29015. CipherSuite cs;
  29016. XMEMSET(&cs, 0, sizeof(cs));
  29017. ret = MatchSuite_ex(ssl, peerSuites, &cs,
  29018. #ifdef HAVE_TLS_EXTENSIONS
  29019. ssl->extensions
  29020. #else
  29021. NULL
  29022. #endif
  29023. );
  29024. if (ret != 0)
  29025. return ret;
  29026. ssl->options.cipherSuite0 = cs.cipherSuite0;
  29027. ssl->options.cipherSuite = cs.cipherSuite;
  29028. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_CURVE25519) || \
  29029. defined(HAVE_ED448) || defined(HAVE_CURVE448)
  29030. ssl->ecdhCurveOID = cs.ecdhCurveOID;
  29031. #endif
  29032. ret = SetCipherSpecs(ssl);
  29033. if (ret != 0)
  29034. return ret;
  29035. ret = PickHashSigAlgo(ssl, peerSuites->hashSigAlgo,
  29036. peerSuites->hashSigAlgoSz);
  29037. if (ret != 0)
  29038. return ret;
  29039. #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
  29040. if (cs.doHelloRetry) {
  29041. ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
  29042. return TLSX_KeyShare_SetSupported(ssl, &ssl->extensions);
  29043. }
  29044. #endif
  29045. #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
  29046. if (IsAtLeastTLSv1_3(ssl->version) &&
  29047. ssl->options.side == WOLFSSL_SERVER_END) {
  29048. ret = TLSX_KeyShare_Setup(ssl, cs.clientKSE);
  29049. if (ret != 0)
  29050. return ret;
  29051. }
  29052. #endif
  29053. return ret;
  29054. }
  29055. #ifdef OLD_HELLO_ALLOWED
  29056. /* process old style client hello, deprecate? */
  29057. int ProcessOldClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  29058. word32 inSz, word16 sz)
  29059. {
  29060. word32 idx = *inOutIdx;
  29061. word16 sessionSz;
  29062. word16 randomSz;
  29063. word16 i, j;
  29064. ProtocolVersion pv;
  29065. Suites clSuites;
  29066. int ret = -1;
  29067. (void)inSz;
  29068. WOLFSSL_MSG("Got old format client hello");
  29069. #ifdef WOLFSSL_CALLBACKS
  29070. if (ssl->hsInfoOn)
  29071. AddPacketName(ssl, "ClientHello");
  29072. if (ssl->toInfoOn)
  29073. AddLateName("ClientHello", &ssl->timeoutInfo);
  29074. #endif
  29075. /* manually hash input since different format */
  29076. #ifndef NO_OLD_TLS
  29077. #ifndef NO_MD5
  29078. wc_Md5Update(&ssl->hsHashes->hashMd5, input + idx, sz);
  29079. #endif
  29080. #ifndef NO_SHA
  29081. wc_ShaUpdate(&ssl->hsHashes->hashSha, input + idx, sz);
  29082. #endif
  29083. #endif
  29084. #ifndef NO_SHA256
  29085. if (IsAtLeastTLSv1_2(ssl)) {
  29086. int shaRet = wc_Sha256Update(&ssl->hsHashes->hashSha256,
  29087. input + idx, sz);
  29088. if (shaRet != 0)
  29089. return shaRet;
  29090. }
  29091. #endif
  29092. /* does this value mean client_hello? */
  29093. idx++;
  29094. /* version */
  29095. pv.major = input[idx++];
  29096. pv.minor = input[idx++];
  29097. ssl->chVersion = pv; /* store */
  29098. if (ssl->version.minor > pv.minor) {
  29099. byte haveRSA = 0;
  29100. byte havePSK = 0;
  29101. int keySz = 0;
  29102. if (!ssl->options.downgrade) {
  29103. WOLFSSL_MSG("Client trying to connect with lesser version");
  29104. return VERSION_ERROR;
  29105. }
  29106. if (pv.minor < ssl->options.minDowngrade) {
  29107. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  29108. return VERSION_ERROR;
  29109. }
  29110. if (pv.minor == SSLv3_MINOR) {
  29111. /* turn off tls */
  29112. WOLFSSL_MSG("\tdowngrading to SSLv3");
  29113. ssl->options.tls = 0;
  29114. ssl->options.tls1_1 = 0;
  29115. ssl->version.minor = SSLv3_MINOR;
  29116. }
  29117. else if (pv.minor == TLSv1_MINOR) {
  29118. WOLFSSL_MSG("\tdowngrading to TLSv1");
  29119. /* turn off tls 1.1+ */
  29120. ssl->options.tls1_1 = 0;
  29121. ssl->version.minor = TLSv1_MINOR;
  29122. }
  29123. else if (pv.minor == TLSv1_1_MINOR) {
  29124. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  29125. ssl->version.minor = TLSv1_1_MINOR;
  29126. }
  29127. else if (pv.minor == TLSv1_2_MINOR) {
  29128. WOLFSSL_MSG(" downgrading to TLSv1.2");
  29129. ssl->version.minor = TLSv1_2_MINOR;
  29130. }
  29131. #ifndef NO_RSA
  29132. haveRSA = 1;
  29133. #endif
  29134. #ifndef NO_PSK
  29135. havePSK = ssl->options.havePSK;
  29136. #endif
  29137. #ifndef NO_CERTS
  29138. keySz = ssl->buffers.keySz;
  29139. #endif
  29140. ret = AllocateSuites(ssl);
  29141. if (ret != 0)
  29142. return ret;
  29143. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  29144. ssl->options.haveDH, ssl->options.haveECDSAsig,
  29145. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  29146. ssl->options.haveFalconSig,
  29147. ssl->options.haveDilithiumSig, ssl->options.haveAnon,
  29148. TRUE, ssl->options.side);
  29149. }
  29150. /* suite size */
  29151. ato16(&input[idx], &clSuites.suiteSz);
  29152. idx += OPAQUE16_LEN;
  29153. if (clSuites.suiteSz > WOLFSSL_MAX_SUITE_SZ)
  29154. return BUFFER_ERROR;
  29155. /* Make sure the suiteSz is a multiple of 3. (Old Client Hello) */
  29156. if (clSuites.suiteSz % 3 != 0)
  29157. return BUFFER_ERROR;
  29158. clSuites.hashSigAlgoSz = 0;
  29159. /* session size */
  29160. ato16(&input[idx], &sessionSz);
  29161. idx += OPAQUE16_LEN;
  29162. if (sessionSz > ID_LEN)
  29163. return BUFFER_ERROR;
  29164. /* random size */
  29165. ato16(&input[idx], &randomSz);
  29166. idx += OPAQUE16_LEN;
  29167. if (randomSz > RAN_LEN)
  29168. return BUFFER_ERROR;
  29169. /* suites */
  29170. for (i = 0, j = 0; i < clSuites.suiteSz; i += 3) {
  29171. byte first = input[idx++];
  29172. if (!first) { /* implicit: skip sslv2 type */
  29173. XMEMCPY(&clSuites.suites[j], &input[idx], SUITE_LEN);
  29174. j += SUITE_LEN;
  29175. }
  29176. idx += SUITE_LEN;
  29177. }
  29178. clSuites.suiteSz = j;
  29179. /* session id */
  29180. if (sessionSz) {
  29181. XMEMCPY(ssl->arrays->sessionID, input + idx, sessionSz);
  29182. ssl->arrays->sessionIDSz = (byte)sessionSz;
  29183. idx += sessionSz;
  29184. ssl->options.resuming = 1;
  29185. }
  29186. /* random */
  29187. if (randomSz < RAN_LEN)
  29188. XMEMSET(ssl->arrays->clientRandom, 0, RAN_LEN - randomSz);
  29189. XMEMCPY(&ssl->arrays->clientRandom[RAN_LEN - randomSz], input + idx,
  29190. randomSz);
  29191. idx += randomSz;
  29192. if (ssl->options.usingCompression)
  29193. ssl->options.usingCompression = 0; /* turn off */
  29194. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  29195. ssl->cbmode = SSL_CB_MODE_WRITE;
  29196. *inOutIdx = idx;
  29197. ssl->options.haveSessionId = 1;
  29198. /* DoClientHello uses same resume code */
  29199. if (ssl->options.resuming) { /* let's try */
  29200. WOLFSSL_SESSION* session;
  29201. #ifdef HAVE_SESSION_TICKET
  29202. if (ssl->options.useTicket == 1) {
  29203. session = ssl->session;
  29204. }
  29205. else
  29206. #endif
  29207. {
  29208. session = wolfSSL_GetSession(ssl, ssl->arrays->masterSecret, 1);
  29209. }
  29210. if (!session) {
  29211. WOLFSSL_MSG("Session lookup for resume failed");
  29212. ssl->options.resuming = 0;
  29213. } else {
  29214. if (MatchSuite(ssl, &clSuites) < 0) {
  29215. WOLFSSL_MSG("Unsupported cipher suite, OldClientHello");
  29216. return UNSUPPORTED_SUITE;
  29217. }
  29218. ret = wc_RNG_GenerateBlock(ssl->rng, ssl->arrays->serverRandom,
  29219. RAN_LEN);
  29220. if (ret != 0)
  29221. return ret;
  29222. #ifdef NO_OLD_TLS
  29223. ret = DeriveTlsKeys(ssl);
  29224. #else
  29225. #ifndef NO_TLS
  29226. if (ssl->options.tls)
  29227. ret = DeriveTlsKeys(ssl);
  29228. #endif
  29229. if (!ssl->options.tls)
  29230. ret = DeriveKeys(ssl);
  29231. #endif
  29232. /* SERVER: peer auth based on session secret. */
  29233. ssl->options.peerAuthGood = (ret == 0);
  29234. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  29235. return ret;
  29236. }
  29237. }
  29238. ret = MatchSuite(ssl, &clSuites);
  29239. if (ret != 0)return ret;
  29240. return SanityCheckMsgReceived(ssl, client_hello);
  29241. }
  29242. #endif /* OLD_HELLO_ALLOWED */
  29243. #ifndef WOLFSSL_NO_TLS12
  29244. /**
  29245. * Handles session resumption.
  29246. * Session tickets are checked for validity based on the time each ticket
  29247. * was created, timeout value and the current time. If the tickets are
  29248. * judged expired, falls back to full-handshake. If you want disable this
  29249. * session ticket validation check in TLS1.2 and below, define
  29250. * WOLFSSL_NO_TICKET_EXPIRE.
  29251. */
  29252. int HandleTlsResumption(WOLFSSL* ssl, int bogusID, Suites* clSuites)
  29253. {
  29254. int ret = 0;
  29255. WOLFSSL_SESSION* session;
  29256. (void)bogusID;
  29257. #ifdef HAVE_SESSION_TICKET
  29258. if (ssl->options.useTicket == 1) {
  29259. session = ssl->session;
  29260. }
  29261. else if (bogusID == 1 && ssl->options.rejectTicket == 0) {
  29262. WOLFSSL_MSG("Bogus session ID without session ticket");
  29263. return BUFFER_ERROR;
  29264. }
  29265. else
  29266. #endif
  29267. {
  29268. session = wolfSSL_GetSession(ssl, ssl->arrays->masterSecret, 1);
  29269. }
  29270. if (!session) {
  29271. WOLFSSL_MSG("Session lookup for resume failed");
  29272. ssl->options.resuming = 0;
  29273. return ret;
  29274. }
  29275. #if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_TICKET_EXPIRE) && \
  29276. !defined(NO_ASN_TIME)
  29277. /* check if the ticket is valid */
  29278. if (LowResTimer() > session->bornOn + ssl->timeout) {
  29279. WOLFSSL_MSG("Expired session ticket, fall back to full handshake.");
  29280. ssl->options.resuming = 0;
  29281. }
  29282. #endif /* HAVE_SESSION_TICKET && !WOLFSSL_NO_TICKET_EXPIRE && !NO_ASN_TIME */
  29283. else if (session->haveEMS != ssl->options.haveEMS) {
  29284. /* RFC 7627, 5.3, server-side */
  29285. /* if old sess didn't have EMS, but new does, full handshake */
  29286. if (!session->haveEMS && ssl->options.haveEMS) {
  29287. WOLFSSL_MSG("Attempting to resume a session that didn't "
  29288. "use EMS with a new session with EMS. Do full "
  29289. "handshake.");
  29290. ssl->options.resuming = 0;
  29291. }
  29292. /* if old sess used EMS, but new doesn't, MUST abort */
  29293. else if (session->haveEMS && !ssl->options.haveEMS) {
  29294. WOLFSSL_MSG("Trying to resume a session with EMS without "
  29295. "using EMS");
  29296. #ifdef WOLFSSL_EXTRA_ALERTS
  29297. SendAlert(ssl, alert_fatal, handshake_failure);
  29298. #endif
  29299. ret = EXT_MASTER_SECRET_NEEDED_E;
  29300. WOLFSSL_ERROR_VERBOSE(ret);
  29301. }
  29302. }
  29303. else {
  29304. #ifndef NO_RESUME_SUITE_CHECK
  29305. int j;
  29306. /* Check client suites include the one in session */
  29307. for (j = 0; j < clSuites->suiteSz; j += 2) {
  29308. if (clSuites->suites[j] == session->cipherSuite0 &&
  29309. clSuites->suites[j+1] == session->cipherSuite) {
  29310. break;
  29311. }
  29312. }
  29313. if (j == clSuites->suiteSz) {
  29314. WOLFSSL_MSG("Prev session's cipher suite not in ClientHello");
  29315. #ifdef WOLFSSL_EXTRA_ALERTS
  29316. SendAlert(ssl, alert_fatal, illegal_parameter);
  29317. #endif
  29318. ret = UNSUPPORTED_SUITE;
  29319. WOLFSSL_ERROR_VERBOSE(ret);
  29320. }
  29321. #endif
  29322. if (ret == 0 && ssl->options.resuming) {
  29323. /* for resumption use the cipher suite from session */
  29324. ssl->options.cipherSuite0 = session->cipherSuite0;
  29325. ssl->options.cipherSuite = session->cipherSuite;
  29326. ret = SetCipherSpecs(ssl);
  29327. if (ret == 0) {
  29328. ret = PickHashSigAlgo(ssl, clSuites->hashSigAlgo,
  29329. clSuites->hashSigAlgoSz);
  29330. }
  29331. }
  29332. else if (ret == 0) {
  29333. if (MatchSuite(ssl, clSuites) < 0) {
  29334. WOLFSSL_MSG("Unsupported cipher suite, ClientHello");
  29335. ret = UNSUPPORTED_SUITE;
  29336. WOLFSSL_ERROR_VERBOSE(ret);
  29337. }
  29338. }
  29339. if (ret == 0) {
  29340. ret = wc_RNG_GenerateBlock(ssl->rng,
  29341. ssl->arrays->serverRandom, RAN_LEN);
  29342. }
  29343. if (ret == 0) {
  29344. #ifdef NO_OLD_TLS
  29345. ret = DeriveTlsKeys(ssl);
  29346. #else
  29347. #ifndef NO_TLS
  29348. if (ssl->options.tls)
  29349. ret = DeriveTlsKeys(ssl);
  29350. #endif
  29351. if (!ssl->options.tls)
  29352. ret = DeriveKeys(ssl);
  29353. #endif
  29354. /* SERVER: peer auth based on session secret. */
  29355. ssl->options.peerAuthGood = (ret == 0);
  29356. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  29357. }
  29358. }
  29359. return ret;
  29360. }
  29361. /* handle processing of client_hello (1) */
  29362. int DoClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  29363. word32 helloSz)
  29364. {
  29365. byte b;
  29366. byte bogusID = 0; /* flag for a bogus session id */
  29367. ProtocolVersion pv;
  29368. #ifdef WOLFSSL_SMALL_STACK
  29369. Suites* clSuites = NULL;
  29370. #else
  29371. Suites clSuites[1];
  29372. #endif
  29373. word32 i = *inOutIdx;
  29374. word32 begin = i;
  29375. int ret = 0;
  29376. byte lesserVersion;
  29377. WOLFSSL_START(WC_FUNC_CLIENT_HELLO_DO);
  29378. WOLFSSL_ENTER("DoClientHello");
  29379. #ifdef WOLFSSL_CALLBACKS
  29380. if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
  29381. if (ssl->toInfoOn) AddLateName("ClientHello", &ssl->timeoutInfo);
  29382. #endif
  29383. /* do not change state in the SSL object before the next region of code
  29384. * to be able to statelessly compute a DTLS cookie */
  29385. #ifdef WOLFSSL_DTLS
  29386. /* Update the ssl->options.dtlsStateful setting `if` statement in
  29387. * wolfSSL_accept when changing this one. */
  29388. if (IsDtlsNotSctpMode(ssl) && IsDtlsNotSrtpMode(ssl) && !IsSCR(ssl)) {
  29389. DtlsSetSeqNumForReply(ssl);
  29390. ret = DoClientHelloStateless(ssl, input, inOutIdx, helloSz);
  29391. if (ret != 0 || !ssl->options.dtlsStateful) {
  29392. int alertType = TranslateErrorToAlert(ret);
  29393. if (alertType != invalid_alert) {
  29394. int err;
  29395. /* propogate socket errors to avoid re-calling send alert */
  29396. err = SendAlert(ssl, alert_fatal, alertType);
  29397. if (err == SOCKET_ERROR_E)
  29398. ret = SOCKET_ERROR_E;
  29399. }
  29400. *inOutIdx += helloSz;
  29401. DtlsResetState(ssl);
  29402. if (DtlsIgnoreError(ret))
  29403. ret = 0;
  29404. return ret;
  29405. }
  29406. }
  29407. ssl->options.dtlsStateful = 1;
  29408. #endif /* WOLFSSL_DTLS */
  29409. /* protocol version, random and session id length check */
  29410. if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz)
  29411. return BUFFER_ERROR;
  29412. /* protocol version */
  29413. XMEMCPY(&pv, input + i, OPAQUE16_LEN);
  29414. ssl->chVersion = pv; /* store */
  29415. i += OPAQUE16_LEN;
  29416. /* Legacy protocol version cannot negotiate TLS 1.3 or higher. */
  29417. if (pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_3_MINOR)
  29418. pv.minor = TLSv1_2_MINOR;
  29419. lesserVersion = !ssl->options.dtls && ssl->version.minor > pv.minor;
  29420. lesserVersion |= ssl->options.dtls && ssl->version.minor < pv.minor;
  29421. if (lesserVersion) {
  29422. byte belowMinDowngrade;
  29423. word16 haveRSA = 0;
  29424. word16 havePSK = 0;
  29425. int keySz = 0;
  29426. if (!ssl->options.downgrade) {
  29427. WOLFSSL_MSG("Client trying to connect with lesser version");
  29428. ret = VERSION_ERROR;
  29429. goto out;
  29430. }
  29431. belowMinDowngrade = pv.minor < ssl->options.minDowngrade;
  29432. /* DTLS versions increase backwards (-1,-2,-3) ecc */
  29433. if (ssl->options.dtls)
  29434. belowMinDowngrade = ssl->options.dtls
  29435. && pv.minor > ssl->options.minDowngrade;
  29436. if (belowMinDowngrade) {
  29437. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  29438. ret = VERSION_ERROR;
  29439. goto out;
  29440. }
  29441. if (!ssl->options.dtls) {
  29442. if (pv.minor == SSLv3_MINOR) {
  29443. /* turn off tls */
  29444. WOLFSSL_MSG("\tdowngrading to SSLv3");
  29445. ssl->options.tls = 0;
  29446. ssl->options.tls1_1 = 0;
  29447. ssl->version.minor = SSLv3_MINOR;
  29448. }
  29449. else if (pv.minor == TLSv1_MINOR) {
  29450. /* turn off tls 1.1+ */
  29451. WOLFSSL_MSG("\tdowngrading to TLSv1");
  29452. ssl->options.tls1_1 = 0;
  29453. ssl->version.minor = TLSv1_MINOR;
  29454. }
  29455. else if (pv.minor == TLSv1_1_MINOR) {
  29456. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  29457. ssl->version.minor = TLSv1_1_MINOR;
  29458. }
  29459. else if (pv.minor == TLSv1_2_MINOR) {
  29460. WOLFSSL_MSG(" downgrading to TLSv1.2");
  29461. ssl->version.minor = TLSv1_2_MINOR;
  29462. }
  29463. }
  29464. else {
  29465. if (pv.minor == DTLSv1_2_MINOR) {
  29466. WOLFSSL_MSG("\tDowngrading to DTLSv1.2");
  29467. ssl->options.tls1_3 = 0;
  29468. ssl->version.minor = DTLSv1_2_MINOR;
  29469. }
  29470. else if (pv.minor == DTLS_MINOR) {
  29471. WOLFSSL_MSG("\tDowngrading to DTLSv1.0");
  29472. ssl->options.tls1_3 = 0;
  29473. ssl->version.minor = DTLS_MINOR;
  29474. }
  29475. }
  29476. #ifndef NO_RSA
  29477. haveRSA = 1;
  29478. #endif
  29479. #ifndef NO_PSK
  29480. havePSK = ssl->options.havePSK;
  29481. #endif
  29482. #ifndef NO_CERTS
  29483. keySz = ssl->buffers.keySz;
  29484. #endif
  29485. ret = AllocateSuites(ssl);
  29486. if (ret != 0)
  29487. goto out;
  29488. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  29489. ssl->options.haveDH, ssl->options.haveECDSAsig,
  29490. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  29491. ssl->options.haveFalconSig,
  29492. ssl->options.haveDilithiumSig, ssl->options.haveAnon,
  29493. TRUE, ssl->options.side);
  29494. }
  29495. /* check if option is set to not allow the current version
  29496. * set from either wolfSSL_set_options or wolfSSL_CTX_set_options */
  29497. if (!ssl->options.dtls && ssl->options.downgrade &&
  29498. ssl->options.mask > 0) {
  29499. int reset = 0;
  29500. if (ssl->version.minor == TLSv1_2_MINOR &&
  29501. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) ==
  29502. WOLFSSL_OP_NO_TLSv1_2) {
  29503. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  29504. ssl->version.minor = TLSv1_1_MINOR;
  29505. reset = 1;
  29506. }
  29507. if (ssl->version.minor == TLSv1_1_MINOR &&
  29508. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) ==
  29509. WOLFSSL_OP_NO_TLSv1_1) {
  29510. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  29511. ssl->options.tls1_1 = 0;
  29512. ssl->version.minor = TLSv1_MINOR;
  29513. reset = 1;
  29514. }
  29515. if (ssl->version.minor == TLSv1_MINOR &&
  29516. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) ==
  29517. WOLFSSL_OP_NO_TLSv1) {
  29518. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  29519. ssl->options.tls = 0;
  29520. ssl->options.tls1_1 = 0;
  29521. ssl->version.minor = SSLv3_MINOR;
  29522. reset = 1;
  29523. }
  29524. if (ssl->version.minor == SSLv3_MINOR &&
  29525. (ssl->options.mask & WOLFSSL_OP_NO_SSLv3) ==
  29526. WOLFSSL_OP_NO_SSLv3) {
  29527. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  29528. ret = VERSION_ERROR;
  29529. goto out;
  29530. }
  29531. if (ssl->version.minor < ssl->options.minDowngrade) {
  29532. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  29533. ret = VERSION_ERROR;
  29534. goto out;
  29535. }
  29536. if (reset) {
  29537. word16 haveRSA = 0;
  29538. word16 havePSK = 0;
  29539. int keySz = 0;
  29540. #ifndef NO_RSA
  29541. haveRSA = 1;
  29542. #endif
  29543. #ifndef NO_PSK
  29544. havePSK = ssl->options.havePSK;
  29545. #endif
  29546. #ifndef NO_CERTS
  29547. keySz = ssl->buffers.keySz;
  29548. #endif
  29549. ret = AllocateSuites(ssl);
  29550. if (ret != 0)
  29551. goto out;
  29552. /* reset cipher suites to account for TLS version change */
  29553. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  29554. ssl->options.haveDH, ssl->options.haveECDSAsig,
  29555. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  29556. ssl->options.haveFalconSig,
  29557. ssl->options.haveDilithiumSig, ssl->options.haveAnon,
  29558. TRUE, ssl->options.side);
  29559. }
  29560. }
  29561. /* random */
  29562. XMEMCPY(ssl->arrays->clientRandom, input + i, RAN_LEN);
  29563. i += RAN_LEN;
  29564. #ifdef SHOW_SECRETS
  29565. {
  29566. int j;
  29567. printf("client random: ");
  29568. for (j = 0; j < RAN_LEN; j++)
  29569. printf("%02x", ssl->arrays->clientRandom[j]);
  29570. printf("\n");
  29571. }
  29572. #endif
  29573. /* session id */
  29574. b = input[i++];
  29575. #ifdef HAVE_SESSION_TICKET
  29576. if (b > 0 && b < ID_LEN) {
  29577. bogusID = 1;
  29578. WOLFSSL_MSG("Client sent bogus session id, let's allow for echo");
  29579. }
  29580. #endif
  29581. if (b == ID_LEN || bogusID) {
  29582. if ((i - begin) + b > helloSz) {
  29583. ret = BUFFER_ERROR;
  29584. goto out;
  29585. }
  29586. XMEMCPY(ssl->arrays->sessionID, input + i, b);
  29587. ssl->arrays->sessionIDSz = b;
  29588. i += b;
  29589. ssl->options.resuming = 1; /* client wants to resume */
  29590. WOLFSSL_MSG("Client wants to resume session");
  29591. }
  29592. else if (b) {
  29593. WOLFSSL_MSG("Invalid session ID size");
  29594. ret = BUFFER_ERROR; /* session ID nor 0 neither 32 bytes long */
  29595. goto out;
  29596. }
  29597. #ifdef WOLFSSL_DTLS
  29598. /* cookie */
  29599. if (ssl->options.dtls) {
  29600. word8 peerCookieSz;
  29601. if ((i - begin) + OPAQUE8_LEN > helloSz) {
  29602. ret = BUFFER_ERROR;
  29603. goto out;
  29604. }
  29605. peerCookieSz = input[i++];
  29606. if (peerCookieSz) {
  29607. if (peerCookieSz > MAX_COOKIE_LEN) {
  29608. ret = BUFFER_ERROR;
  29609. goto out;
  29610. }
  29611. if ((i - begin) + peerCookieSz > helloSz) {
  29612. ret = BUFFER_ERROR;
  29613. goto out;
  29614. }
  29615. i += peerCookieSz;
  29616. }
  29617. }
  29618. #endif /* WOLFSSL_DTLS */
  29619. /* suites */
  29620. if ((i - begin) + OPAQUE16_LEN > helloSz) {
  29621. ret = BUFFER_ERROR;
  29622. goto out;
  29623. }
  29624. #ifdef WOLFSSL_SMALL_STACK
  29625. clSuites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  29626. DYNAMIC_TYPE_SUITES);
  29627. if (clSuites == NULL) {
  29628. ret = MEMORY_E;
  29629. goto out;
  29630. }
  29631. #endif
  29632. XMEMSET(clSuites, 0, sizeof(Suites));
  29633. ato16(&input[i], &clSuites->suiteSz);
  29634. i += OPAQUE16_LEN;
  29635. /* Cipher suite lists are always multiples of two in length. */
  29636. if (clSuites->suiteSz % 2 != 0) {
  29637. ret = BUFFER_ERROR;
  29638. goto out;
  29639. }
  29640. /* suites and compression length check */
  29641. if ((i - begin) + clSuites->suiteSz + OPAQUE8_LEN > helloSz) {
  29642. ret = BUFFER_ERROR;
  29643. goto out;
  29644. }
  29645. if (clSuites->suiteSz > WOLFSSL_MAX_SUITE_SZ) {
  29646. ret = BUFFER_ERROR;
  29647. goto out;
  29648. }
  29649. XMEMCPY(clSuites->suites, input + i, clSuites->suiteSz);
  29650. #ifdef HAVE_SERVER_RENEGOTIATION_INFO
  29651. /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
  29652. if (FindSuite(clSuites, 0, TLS_EMPTY_RENEGOTIATION_INFO_SCSV) >= 0) {
  29653. TLSX* extension;
  29654. /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
  29655. ret = TLSX_AddEmptyRenegotiationInfo(&ssl->extensions, ssl->heap);
  29656. if (ret != WOLFSSL_SUCCESS)
  29657. goto out;
  29658. extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO);
  29659. if (extension) {
  29660. ssl->secure_renegotiation =
  29661. (SecureRenegotiation*)extension->data;
  29662. ssl->secure_renegotiation->enabled = 1;
  29663. }
  29664. }
  29665. #endif /* HAVE_SERVER_RENEGOTIATION_INFO */
  29666. #if defined(HAVE_FALLBACK_SCSV) || defined(OPENSSL_ALL)
  29667. /* check for TLS_FALLBACK_SCSV suite */
  29668. if (FindSuite(clSuites, TLS_FALLBACK_SCSV, 0) >= 0) {
  29669. WOLFSSL_MSG("Found Fallback SCSV");
  29670. if (ssl->ctx->method->version.minor > pv.minor) {
  29671. WOLFSSL_MSG("Client trying to connect with lesser version");
  29672. SendAlert(ssl, alert_fatal, inappropriate_fallback);
  29673. ret = VERSION_ERROR;
  29674. goto out;
  29675. }
  29676. }
  29677. #endif
  29678. i += clSuites->suiteSz;
  29679. clSuites->hashSigAlgoSz = 0;
  29680. /* compression length */
  29681. b = input[i++];
  29682. if ((i - begin) + b > helloSz) {
  29683. ret = BUFFER_ERROR;
  29684. goto out;
  29685. }
  29686. if (b == 0) {
  29687. WOLFSSL_MSG("No compression types in list");
  29688. #ifdef WOLFSSL_EXTRA_ALERTS
  29689. SendAlert(ssl, alert_fatal, decode_error);
  29690. #endif
  29691. ret = COMPRESSION_ERROR;
  29692. goto out;
  29693. }
  29694. {
  29695. /* compression match types */
  29696. int matchNo = 0;
  29697. int matchZlib = 0;
  29698. while (b--) {
  29699. byte comp = input[i++];
  29700. if (comp == NO_COMPRESSION) {
  29701. matchNo = 1;
  29702. }
  29703. if (comp == ZLIB_COMPRESSION) {
  29704. matchZlib = 1;
  29705. }
  29706. }
  29707. if (ssl->options.usingCompression == 0 && matchNo) {
  29708. WOLFSSL_MSG("Matched No Compression");
  29709. } else if (ssl->options.usingCompression && matchZlib) {
  29710. WOLFSSL_MSG("Matched zlib Compression");
  29711. } else if (ssl->options.usingCompression && matchNo) {
  29712. WOLFSSL_MSG("Could only match no compression, turning off");
  29713. ssl->options.usingCompression = 0; /* turn off */
  29714. } else {
  29715. WOLFSSL_MSG("Could not match compression");
  29716. #ifdef WOLFSSL_EXTRA_ALERTS
  29717. SendAlert(ssl, alert_fatal, illegal_parameter);
  29718. #endif
  29719. ret = COMPRESSION_ERROR;
  29720. goto out;
  29721. }
  29722. }
  29723. *inOutIdx = i;
  29724. /* tls extensions */
  29725. if ((i - begin) < helloSz) {
  29726. #ifdef HAVE_TLS_EXTENSIONS
  29727. if (TLSX_SupportExtensions(ssl))
  29728. #else
  29729. if (IsAtLeastTLSv1_2(ssl))
  29730. #endif
  29731. {
  29732. /* Process the hello extension. Skip unsupported. */
  29733. word16 totalExtSz;
  29734. #ifdef HAVE_TLS_EXTENSIONS
  29735. /* auto populate extensions supported unless user defined */
  29736. if ((ret = TLSX_PopulateExtensions(ssl, 1)) != 0)
  29737. goto out;
  29738. #endif
  29739. if ((i - begin) + OPAQUE16_LEN > helloSz) {
  29740. ret = BUFFER_ERROR;
  29741. goto out;
  29742. }
  29743. ato16(&input[i], &totalExtSz);
  29744. i += OPAQUE16_LEN;
  29745. if ((i - begin) + totalExtSz > helloSz) {
  29746. ret = BUFFER_ERROR;
  29747. goto out;
  29748. }
  29749. #ifdef HAVE_TLS_EXTENSIONS
  29750. /* tls extensions */
  29751. if ((ret = TLSX_Parse(ssl, input + i, totalExtSz, client_hello,
  29752. clSuites)))
  29753. goto out;
  29754. #ifdef WOLFSSL_TLS13
  29755. if (TLSX_Find(ssl->extensions,
  29756. TLSX_SUPPORTED_VERSIONS) != NULL) {
  29757. WOLFSSL_MSG(
  29758. "Client attempting to connect with higher version");
  29759. ret = VERSION_ERROR;
  29760. goto out;
  29761. }
  29762. #endif
  29763. #ifdef HAVE_SNI
  29764. if((ret=SNI_Callback(ssl)))
  29765. goto out;
  29766. #endif
  29767. #ifdef HAVE_ALPN
  29768. if((ret=ALPN_Select(ssl)))
  29769. goto out;
  29770. #endif
  29771. i += totalExtSz;
  29772. #else
  29773. while (totalExtSz) {
  29774. word16 extId, extSz;
  29775. if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz) {
  29776. ret = BUFFER_ERROR;
  29777. goto out;
  29778. }
  29779. ato16(&input[i], &extId);
  29780. i += OPAQUE16_LEN;
  29781. ato16(&input[i], &extSz);
  29782. i += OPAQUE16_LEN;
  29783. if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz) {
  29784. ret = BUFFER_ERROR;
  29785. goto out;
  29786. }
  29787. if (extId == HELLO_EXT_SIG_ALGO) {
  29788. word16 hashSigAlgoSz;
  29789. ato16(&input[i], &hashSigAlgoSz);
  29790. i += OPAQUE16_LEN;
  29791. if (OPAQUE16_LEN + hashSigAlgoSz > extSz) {
  29792. ret = BUFFER_ERROR;
  29793. goto out;
  29794. }
  29795. if (hashSigAlgoSz % 2 != 0) {
  29796. ret = BUFFER_ERROR;
  29797. goto out;
  29798. }
  29799. clSuites->hashSigAlgoSz = hashSigAlgoSz;
  29800. if (clSuites->hashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
  29801. WOLFSSL_MSG("ClientHello SigAlgo list exceeds max, "
  29802. "truncating");
  29803. clSuites->hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
  29804. }
  29805. XMEMCPY(clSuites->hashSigAlgo, &input[i],
  29806. clSuites->hashSigAlgoSz);
  29807. i += hashSigAlgoSz;
  29808. }
  29809. #ifdef HAVE_EXTENDED_MASTER
  29810. else if (extId == HELLO_EXT_EXTMS)
  29811. ssl->options.haveEMS = 1;
  29812. #endif
  29813. else
  29814. i += extSz;
  29815. totalExtSz -= OPAQUE16_LEN + OPAQUE16_LEN + extSz;
  29816. }
  29817. #endif
  29818. *inOutIdx = i;
  29819. }
  29820. else
  29821. *inOutIdx = begin + helloSz; /* skip extensions */
  29822. }
  29823. #ifdef WOLFSSL_DTLS_CID
  29824. if (ssl->options.useDtlsCID)
  29825. DtlsCIDOnExtensionsParsed(ssl);
  29826. #endif /* WOLFSSL_DTLS_CID */
  29827. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  29828. ssl->options.haveSessionId = 1;
  29829. /* ProcessOld uses same resume code */
  29830. if (ssl->options.resuming) {
  29831. ret = HandleTlsResumption(ssl, bogusID, clSuites);
  29832. if (ret != 0)
  29833. goto out;
  29834. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_ENCRYPT_THEN_MAC) && \
  29835. !defined(WOLFSSL_AEAD_ONLY)
  29836. if (ssl->options.encThenMac && ssl->specs.cipher_type == block) {
  29837. ret = TLSX_EncryptThenMac_Respond(ssl);
  29838. if (ret != 0)
  29839. goto out;
  29840. }
  29841. else
  29842. ssl->options.encThenMac = 0;
  29843. #endif
  29844. if (ssl->options.clientState == CLIENT_KEYEXCHANGE_COMPLETE) {
  29845. WOLFSSL_LEAVE("DoClientHello", ret);
  29846. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
  29847. goto out;
  29848. }
  29849. }
  29850. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_DH_DEFAULT_PARAMS)
  29851. #if defined(HAVE_FFDHE) && defined(HAVE_SUPPORTED_CURVES)
  29852. if (TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS) != NULL) {
  29853. /* Set FFDHE parameters or clear DHE parameters if FFDH parameters
  29854. * present and no matches in the server's list. */
  29855. ret = TLSX_SupportedFFDHE_Set(ssl);
  29856. if (ret != 0)
  29857. goto out;
  29858. }
  29859. #endif
  29860. #endif
  29861. #ifdef OPENSSL_EXTRA
  29862. /* Give user last chance to provide a cert for cipher selection */
  29863. if (ret == 0 && ssl->ctx->certSetupCb != NULL)
  29864. ret = CertSetupCbWrapper(ssl);
  29865. #endif
  29866. if (ret == 0)
  29867. ret = MatchSuite(ssl, clSuites);
  29868. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_ENCRYPT_THEN_MAC) && \
  29869. !defined(WOLFSSL_AEAD_ONLY)
  29870. if (ret == 0 && ssl->options.encThenMac &&
  29871. ssl->specs.cipher_type == block) {
  29872. ret = TLSX_EncryptThenMac_Respond(ssl);
  29873. }
  29874. else
  29875. ssl->options.encThenMac = 0;
  29876. #endif
  29877. #ifdef WOLFSSL_DTLS
  29878. if (ret == 0 && ssl->options.dtls)
  29879. DtlsMsgPoolReset(ssl);
  29880. #endif
  29881. out:
  29882. #ifdef WOLFSSL_SMALL_STACK
  29883. if (clSuites != NULL)
  29884. XFREE(clSuites, ssl->heap, DYNAMIC_TYPE_SUITES);
  29885. #endif
  29886. WOLFSSL_LEAVE("DoClientHello", ret);
  29887. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
  29888. if (ret != 0) {
  29889. WOLFSSL_ERROR_VERBOSE(ret);
  29890. }
  29891. return ret;
  29892. }
  29893. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  29894. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  29895. typedef struct DcvArgs {
  29896. byte* output; /* not allocated */
  29897. word32 sendSz;
  29898. word16 sz;
  29899. word32 sigSz;
  29900. word32 idx;
  29901. word32 begin;
  29902. byte hashAlgo;
  29903. byte sigAlgo;
  29904. } DcvArgs;
  29905. static void FreeDcvArgs(WOLFSSL* ssl, void* pArgs)
  29906. {
  29907. DcvArgs* args = (DcvArgs*)pArgs;
  29908. (void)ssl;
  29909. (void)args;
  29910. }
  29911. /* handle processing of certificate_verify (15) */
  29912. static int DoCertificateVerify(WOLFSSL* ssl, byte* input,
  29913. word32* inOutIdx, word32 size)
  29914. {
  29915. int ret = 0;
  29916. #ifdef WOLFSSL_ASYNC_CRYPT
  29917. DcvArgs* args = NULL;
  29918. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  29919. #else
  29920. DcvArgs args[1];
  29921. #endif
  29922. WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_DO);
  29923. WOLFSSL_ENTER("DoCertificateVerify");
  29924. #ifdef WOLFSSL_ASYNC_CRYPT
  29925. if (ssl->async == NULL) {
  29926. ssl->async = (struct WOLFSSL_ASYNC*)
  29927. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  29928. DYNAMIC_TYPE_ASYNC);
  29929. if (ssl->async == NULL)
  29930. ERROR_OUT(MEMORY_E, exit_dcv);
  29931. }
  29932. args = (DcvArgs*)ssl->async->args;
  29933. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  29934. if (ret != WC_NOT_PENDING_E) {
  29935. /* Check for error */
  29936. if (ret < 0)
  29937. goto exit_dcv;
  29938. }
  29939. else
  29940. #endif
  29941. {
  29942. /* Reset state */
  29943. ret = 0;
  29944. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  29945. XMEMSET(args, 0, sizeof(DcvArgs));
  29946. args->hashAlgo = sha_mac;
  29947. args->sigAlgo = anonymous_sa_algo;
  29948. args->idx = *inOutIdx;
  29949. args->begin = *inOutIdx;
  29950. #ifdef WOLFSSL_ASYNC_CRYPT
  29951. ssl->async->freeArgs = FreeDcvArgs;
  29952. #endif
  29953. }
  29954. switch(ssl->options.asyncState)
  29955. {
  29956. case TLS_ASYNC_BEGIN:
  29957. {
  29958. #ifdef WOLFSSL_CALLBACKS
  29959. if (ssl->hsInfoOn)
  29960. AddPacketName(ssl, "CertificateVerify");
  29961. if (ssl->toInfoOn)
  29962. AddLateName("CertificateVerify", &ssl->timeoutInfo);
  29963. #endif
  29964. /* Advance state and proceed */
  29965. ssl->options.asyncState = TLS_ASYNC_BUILD;
  29966. } /* case TLS_ASYNC_BEGIN */
  29967. FALL_THROUGH;
  29968. case TLS_ASYNC_BUILD:
  29969. {
  29970. if (IsAtLeastTLSv1_2(ssl)) {
  29971. if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN > size) {
  29972. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  29973. }
  29974. DecodeSigAlg(&input[args->idx], &args->hashAlgo,
  29975. &args->sigAlgo);
  29976. args->idx += 2;
  29977. }
  29978. #ifndef NO_RSA
  29979. else if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0)
  29980. args->sigAlgo = rsa_sa_algo;
  29981. #endif
  29982. #ifdef HAVE_ECC
  29983. else if (ssl->peerEccDsaKeyPresent)
  29984. args->sigAlgo = ecc_dsa_sa_algo;
  29985. #endif
  29986. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  29987. else if (ssl->peerEd25519KeyPresent)
  29988. args->sigAlgo = ed25519_sa_algo;
  29989. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  29990. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  29991. else if (ssl->peerEd448KeyPresent)
  29992. args->sigAlgo = ed448_sa_algo;
  29993. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  29994. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  29995. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  29996. }
  29997. ato16(input + args->idx, &args->sz);
  29998. args->idx += OPAQUE16_LEN;
  29999. if ((args->idx - args->begin) + args->sz > size ||
  30000. args->sz > ENCRYPT_LEN) {
  30001. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  30002. }
  30003. #ifdef HAVE_ECC
  30004. if (ssl->peerEccDsaKeyPresent) {
  30005. WOLFSSL_MSG("Doing ECC peer cert verify");
  30006. /* make sure a default is defined */
  30007. #if !defined(NO_SHA)
  30008. SetDigest(ssl, sha_mac);
  30009. #elif !defined(NO_SHA256)
  30010. SetDigest(ssl, sha256_mac);
  30011. #elif defined(WOLFSSL_SHA384)
  30012. SetDigest(ssl, sha384_mac);
  30013. #elif defined(WOLFSSL_SHA512)
  30014. SetDigest(ssl, sha512_mac);
  30015. #else
  30016. #error No digest enabled for ECC sig verify
  30017. #endif
  30018. if (IsAtLeastTLSv1_2(ssl)) {
  30019. if (args->sigAlgo != ecc_dsa_sa_algo) {
  30020. WOLFSSL_MSG("Oops, peer sent ECC key but not in verify");
  30021. }
  30022. SetDigest(ssl, args->hashAlgo);
  30023. }
  30024. }
  30025. #endif /* HAVE_ECC */
  30026. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  30027. if (ssl->peerEd25519KeyPresent) {
  30028. WOLFSSL_MSG("Doing ED25519 peer cert verify");
  30029. if (IsAtLeastTLSv1_2(ssl) &&
  30030. args->sigAlgo != ed25519_sa_algo) {
  30031. WOLFSSL_MSG(
  30032. "Oops, peer sent ED25519 key but not in verify");
  30033. }
  30034. }
  30035. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  30036. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  30037. if (ssl->peerEd448KeyPresent) {
  30038. WOLFSSL_MSG("Doing ED448 peer cert verify");
  30039. if (IsAtLeastTLSv1_2(ssl) &&
  30040. args->sigAlgo != ed448_sa_algo) {
  30041. WOLFSSL_MSG(
  30042. "Oops, peer sent ED448 key but not in verify");
  30043. }
  30044. }
  30045. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  30046. /* Advance state and proceed */
  30047. ssl->options.asyncState = TLS_ASYNC_DO;
  30048. } /* case TLS_ASYNC_BUILD */
  30049. FALL_THROUGH;
  30050. case TLS_ASYNC_DO:
  30051. {
  30052. #ifndef NO_RSA
  30053. if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
  30054. WOLFSSL_MSG("Doing RSA peer cert verify");
  30055. ret = RsaVerify(ssl,
  30056. input + args->idx,
  30057. args->sz,
  30058. &args->output,
  30059. args->sigAlgo, args->hashAlgo,
  30060. ssl->peerRsaKey,
  30061. #ifdef HAVE_PK_CALLBACKS
  30062. &ssl->buffers.peerRsaKey
  30063. #else
  30064. NULL
  30065. #endif
  30066. );
  30067. if (ret >= 0) {
  30068. if (args->sigAlgo == rsa_sa_algo)
  30069. args->sendSz = ret;
  30070. else {
  30071. args->sigSz = ret;
  30072. args->sendSz = ssl->buffers.digest.length;
  30073. }
  30074. ret = 0;
  30075. }
  30076. }
  30077. #endif /* !NO_RSA */
  30078. #ifdef HAVE_ECC
  30079. if (ssl->peerEccDsaKeyPresent) {
  30080. WOLFSSL_MSG("Doing ECC peer cert verify");
  30081. ret = EccVerify(ssl,
  30082. input + args->idx, args->sz,
  30083. ssl->buffers.digest.buffer, ssl->buffers.digest.length,
  30084. ssl->peerEccDsaKey,
  30085. #ifdef HAVE_PK_CALLBACKS
  30086. &ssl->buffers.peerEccDsaKey
  30087. #else
  30088. NULL
  30089. #endif
  30090. );
  30091. /* SERVER: Data verified with certificate's public key. */
  30092. ssl->options.peerAuthGood = ssl->options.havePeerCert &&
  30093. (ret == 0);
  30094. }
  30095. #endif /* HAVE_ECC */
  30096. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  30097. if (ssl->peerEd25519KeyPresent) {
  30098. WOLFSSL_MSG("Doing Ed25519 peer cert verify");
  30099. ret = Ed25519Verify(ssl,
  30100. input + args->idx, args->sz,
  30101. ssl->hsHashes->messages, ssl->hsHashes->prevLen,
  30102. ssl->peerEd25519Key,
  30103. #ifdef HAVE_PK_CALLBACKS
  30104. &ssl->buffers.peerEd25519Key
  30105. #else
  30106. NULL
  30107. #endif
  30108. );
  30109. /* SERVER: Data verified with certificate's public key. */
  30110. ssl->options.peerAuthGood = ssl->options.havePeerCert &&
  30111. (ret == 0);
  30112. }
  30113. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  30114. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  30115. if (ssl->peerEd448KeyPresent) {
  30116. WOLFSSL_MSG("Doing Ed448 peer cert verify");
  30117. ret = Ed448Verify(ssl,
  30118. input + args->idx, args->sz,
  30119. ssl->hsHashes->messages, ssl->hsHashes->prevLen,
  30120. ssl->peerEd448Key,
  30121. #ifdef HAVE_PK_CALLBACKS
  30122. &ssl->buffers.peerEd448Key
  30123. #else
  30124. NULL
  30125. #endif
  30126. );
  30127. /* SERVER: Data verified with certificate's public key. */
  30128. ssl->options.peerAuthGood = ssl->options.havePeerCert &&
  30129. (ret == 0);
  30130. }
  30131. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  30132. #ifdef WOLFSSL_ASYNC_CRYPT
  30133. /* handle async pending */
  30134. if (ret == WC_PENDING_E)
  30135. goto exit_dcv;
  30136. #endif
  30137. /* Check for error */
  30138. if (ret != 0) {
  30139. ret = SIG_VERIFY_E;
  30140. goto exit_dcv;
  30141. }
  30142. /* Advance state and proceed */
  30143. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  30144. } /* case TLS_ASYNC_DO */
  30145. FALL_THROUGH;
  30146. case TLS_ASYNC_VERIFY:
  30147. {
  30148. #ifndef NO_RSA
  30149. if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
  30150. if (IsAtLeastTLSv1_2(ssl)) {
  30151. #ifdef WC_RSA_PSS
  30152. if (args->sigAlgo == rsa_pss_sa_algo) {
  30153. SetDigest(ssl, args->hashAlgo);
  30154. #ifdef HAVE_SELFTEST
  30155. ret = wc_RsaPSS_CheckPadding(
  30156. ssl->buffers.digest.buffer,
  30157. ssl->buffers.digest.length,
  30158. args->output, args->sigSz,
  30159. HashAlgoToType(args->hashAlgo));
  30160. #else
  30161. ret = wc_RsaPSS_CheckPadding_ex(
  30162. ssl->buffers.digest.buffer,
  30163. ssl->buffers.digest.length,
  30164. args->output, args->sigSz,
  30165. HashAlgoToType(args->hashAlgo), -1,
  30166. mp_count_bits(&ssl->peerRsaKey->n));
  30167. #endif
  30168. if (ret != 0) {
  30169. ret = SIG_VERIFY_E;
  30170. goto exit_dcv;
  30171. }
  30172. }
  30173. else
  30174. #endif
  30175. {
  30176. #ifndef WOLFSSL_SMALL_STACK
  30177. byte encodedSig[MAX_ENCODED_SIG_SZ];
  30178. #else
  30179. byte* encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  30180. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  30181. if (encodedSig == NULL) {
  30182. ERROR_OUT(MEMORY_E, exit_dcv);
  30183. }
  30184. #endif
  30185. if (args->sigAlgo != rsa_sa_algo) {
  30186. WOLFSSL_MSG("Oops, peer sent RSA key but not "
  30187. "in verify");
  30188. }
  30189. SetDigest(ssl, args->hashAlgo);
  30190. args->sigSz = wc_EncodeSignature(encodedSig,
  30191. ssl->buffers.digest.buffer,
  30192. ssl->buffers.digest.length,
  30193. TypeHash(args->hashAlgo));
  30194. if (args->sendSz != args->sigSz || !args->output ||
  30195. XMEMCMP(args->output, encodedSig,
  30196. min(args->sigSz, MAX_ENCODED_SIG_SZ)) != 0) {
  30197. ret = VERIFY_CERT_ERROR;
  30198. }
  30199. #ifdef WOLFSSL_SMALL_STACK
  30200. XFREE(encodedSig, ssl->heap,
  30201. DYNAMIC_TYPE_SIGNATURE);
  30202. #endif
  30203. }
  30204. }
  30205. else {
  30206. if (args->sendSz != FINISHED_SZ || !args->output ||
  30207. XMEMCMP(args->output,
  30208. &ssl->hsHashes->certHashes, FINISHED_SZ) != 0) {
  30209. ret = VERIFY_CERT_ERROR;
  30210. }
  30211. }
  30212. if (ret == 0) {
  30213. /* SERVER: Data verified with cert's public key. */
  30214. ssl->options.peerAuthGood = ssl->options.havePeerCert &&
  30215. (ret == 0);
  30216. }
  30217. }
  30218. #endif /* !NO_RSA */
  30219. if (ret != 0)
  30220. break;
  30221. /* Advance state and proceed */
  30222. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  30223. } /* case TLS_ASYNC_VERIFY */
  30224. FALL_THROUGH;
  30225. case TLS_ASYNC_FINALIZE:
  30226. {
  30227. if (IsEncryptionOn(ssl, 0)) {
  30228. args->idx += ssl->keys.padSz;
  30229. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  30230. if (ssl->options.startedETMRead)
  30231. args->idx += MacSize(ssl);
  30232. #endif
  30233. }
  30234. ssl->options.havePeerVerify = 1;
  30235. /* Set final index */
  30236. args->idx += args->sz;
  30237. *inOutIdx = args->idx;
  30238. /* Advance state and proceed */
  30239. ssl->options.asyncState = TLS_ASYNC_END;
  30240. } /* case TLS_ASYNC_FINALIZE */
  30241. FALL_THROUGH;
  30242. case TLS_ASYNC_END:
  30243. {
  30244. break;
  30245. }
  30246. default:
  30247. ret = INPUT_CASE_ERROR;
  30248. } /* switch(ssl->options.asyncState) */
  30249. exit_dcv:
  30250. WOLFSSL_LEAVE("DoCertificateVerify", ret);
  30251. WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_DO);
  30252. #ifdef WOLFSSL_ASYNC_CRYPT
  30253. /* Handle async operation */
  30254. if (ret == WC_PENDING_E) {
  30255. /* Mark message as not received so it can process again */
  30256. ssl->msgsReceived.got_certificate_verify = 0;
  30257. return ret;
  30258. }
  30259. #endif /* WOLFSSL_ASYNC_CRYPT */
  30260. #ifdef WOLFSSL_EXTRA_ALERTS
  30261. if (ret == BUFFER_ERROR)
  30262. SendAlert(ssl, alert_fatal, decode_error);
  30263. else if (ret == SIG_VERIFY_E)
  30264. SendAlert(ssl, alert_fatal, decrypt_error);
  30265. else if (ret != 0)
  30266. SendAlert(ssl, alert_fatal, bad_certificate);
  30267. #endif
  30268. /* Digest is not allocated, so do this to prevent free */
  30269. if(ssl->buffers.digest.buffer) {
  30270. if (!ssl->options.dontFreeDigest) {
  30271. /*This should not happen*/
  30272. XFREE(ssl->buffers.digest.buffer,
  30273. ssl->heap, DYNAMIC_TYPE_DIGEST);
  30274. }
  30275. }
  30276. ssl->buffers.digest.buffer = NULL;
  30277. ssl->buffers.digest.length = 0;
  30278. ssl->options.dontFreeDigest = 0;
  30279. #ifdef WOLFSSL_ASYNC_CRYPT
  30280. /* Cleanup async */
  30281. FreeAsyncCtx(ssl, 0);
  30282. #else
  30283. FreeDcvArgs(ssl, args);
  30284. #endif
  30285. /* Final cleanup */
  30286. FreeKeyExchange(ssl);
  30287. if (ret != 0) {
  30288. WOLFSSL_ERROR_VERBOSE(ret);
  30289. }
  30290. return ret;
  30291. }
  30292. #endif /* (!NO_RSA || ECC || ED25519 || ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  30293. /* handle generation of server_hello_done (14) */
  30294. int SendServerHelloDone(WOLFSSL* ssl)
  30295. {
  30296. byte* output;
  30297. int sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  30298. int ret;
  30299. WOLFSSL_START(WC_FUNC_SERVER_HELLO_DONE_SEND);
  30300. WOLFSSL_ENTER("SendServerHelloDone");
  30301. #ifdef WOLFSSL_DTLS
  30302. if (ssl->options.dtls)
  30303. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  30304. #endif
  30305. if (IsEncryptionOn(ssl, 1))
  30306. sendSz += MAX_MSG_EXTRA;
  30307. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  30308. * is not advanced yet */
  30309. ssl->options.buildingMsg = 1;
  30310. /* check for available size */
  30311. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  30312. return ret;
  30313. /* get output buffer */
  30314. output = ssl->buffers.outputBuffer.buffer +
  30315. ssl->buffers.outputBuffer.length;
  30316. AddHeaders(output, 0, server_hello_done, ssl);
  30317. if (IsEncryptionOn(ssl, 1)) {
  30318. byte* input;
  30319. int inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
  30320. int recordHeaderSz = RECORD_HEADER_SZ;
  30321. if (ssl->options.dtls) {
  30322. recordHeaderSz += DTLS_RECORD_EXTRA;
  30323. inputSz += DTLS_HANDSHAKE_EXTRA;
  30324. }
  30325. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  30326. if (input == NULL)
  30327. return MEMORY_E;
  30328. XMEMCPY(input, output + recordHeaderSz, inputSz);
  30329. #ifdef WOLFSSL_DTLS
  30330. if (IsDtlsNotSctpMode(ssl) &&
  30331. (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello_done)) != 0) {
  30332. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  30333. return ret;
  30334. }
  30335. #endif
  30336. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  30337. handshake, 1, 0, 0, CUR_ORDER);
  30338. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  30339. if (sendSz < 0)
  30340. return sendSz;
  30341. } else {
  30342. #ifdef WOLFSSL_DTLS
  30343. if (IsDtlsNotSctpMode(ssl)) {
  30344. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello_done)) != 0)
  30345. return ret;
  30346. }
  30347. if (ssl->options.dtls)
  30348. DtlsSEQIncrement(ssl, CUR_ORDER);
  30349. #endif
  30350. ret = HashOutput(ssl, output, sendSz, 0);
  30351. if (ret != 0)
  30352. return ret;
  30353. }
  30354. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  30355. if (ssl->hsInfoOn)
  30356. AddPacketName(ssl, "ServerHelloDone");
  30357. if (ssl->toInfoOn) {
  30358. ret = AddPacketInfo(ssl, "ServerHelloDone", handshake, output,
  30359. sendSz, WRITE_PROTO, 0, ssl->heap);
  30360. if (ret != 0)
  30361. return ret;
  30362. }
  30363. #endif
  30364. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  30365. ssl->options.buildingMsg = 0;
  30366. ssl->buffers.outputBuffer.length += sendSz;
  30367. ret = SendBuffered(ssl);
  30368. WOLFSSL_LEAVE("SendServerHelloDone", ret);
  30369. WOLFSSL_END(WC_FUNC_SERVER_HELLO_DONE_SEND);
  30370. return ret;
  30371. }
  30372. #endif /* !WOLFSSL_NO_TLS12 */
  30373. #ifdef HAVE_SESSION_TICKET
  30374. /* create a new session ticket, 0 on success */
  30375. int CreateTicket(WOLFSSL* ssl)
  30376. {
  30377. InternalTicket* it;
  30378. ExternalTicket* et;
  30379. int encLen;
  30380. int ret;
  30381. int error;
  30382. word32 itHash = 0;
  30383. byte zeros[WOLFSSL_TICKET_MAC_SZ]; /* biggest cmp size */
  30384. WOLFSSL_ASSERT_SIZEOF_GE(ssl->session->staticTicket, *et);
  30385. WOLFSSL_ASSERT_SIZEOF_GE(et->enc_ticket, *it);
  30386. if (ssl->session->ticket != ssl->session->staticTicket) {
  30387. /* Always use the static ticket buffer */
  30388. XFREE(ssl->session->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK);
  30389. ssl->session->ticket = ssl->session->staticTicket;
  30390. ssl->session->ticketLenAlloc = 0;
  30391. }
  30392. et = (ExternalTicket*)ssl->session->ticket;
  30393. it = (InternalTicket*)et->enc_ticket;
  30394. #ifdef WOLFSSL_ASYNC_CRYPT
  30395. if (ssl->error != WC_PENDING_E)
  30396. #endif
  30397. {
  30398. XMEMSET(et, 0, sizeof(*et));
  30399. }
  30400. /* build internal */
  30401. it->pv.major = ssl->version.major;
  30402. it->pv.minor = ssl->version.minor;
  30403. it->suite[0] = ssl->options.cipherSuite0;
  30404. it->suite[1] = ssl->options.cipherSuite;
  30405. #ifdef WOLFSSL_EARLY_DATA
  30406. c32toa(ssl->options.maxEarlyDataSz, it->maxEarlyDataSz);
  30407. #endif
  30408. if (!ssl->options.tls1_3) {
  30409. XMEMCPY(it->msecret, ssl->arrays->masterSecret, SECRET_LEN);
  30410. #ifndef NO_ASN_TIME
  30411. c32toa(LowResTimer(), it->timestamp);
  30412. #endif
  30413. it->haveEMS = (byte) ssl->options.haveEMS;
  30414. }
  30415. else {
  30416. #ifdef WOLFSSL_TLS13
  30417. #ifdef WOLFSSL_32BIT_MILLI_TIME
  30418. word32 now = TimeNowInMilliseconds();
  30419. #else
  30420. sword64 now = TimeNowInMilliseconds();
  30421. #endif
  30422. if (now == 0) {
  30423. ret = GETTIME_ERROR;
  30424. goto error;
  30425. }
  30426. /* Client adds to ticket age to obfuscate. */
  30427. ret = wc_RNG_GenerateBlock(ssl->rng, it->ageAdd,
  30428. sizeof(it->ageAdd));
  30429. if (ret != 0) {
  30430. ret = BAD_TICKET_ENCRYPT;
  30431. goto error;
  30432. }
  30433. ato32(it->ageAdd, &ssl->session->ticketAdd);
  30434. c16toa(ssl->session->namedGroup, it->namedGroup);
  30435. #ifdef WOLFSSL_32BIT_MILLI_TIME
  30436. c32toa(now, it->timestamp);
  30437. #else
  30438. c32toa((word32)(now >> 32), it->timestamp);
  30439. c32toa((word32)now , it->timestamp + OPAQUE32_LEN);
  30440. #endif
  30441. /* Resumption master secret. */
  30442. XMEMCPY(it->msecret, ssl->session->masterSecret, SECRET_LEN);
  30443. if (ssl->session->ticketNonce.len > MAX_TICKET_NONCE_STATIC_SZ) {
  30444. WOLFSSL_MSG("Bad ticket nonce value");
  30445. ret = BAD_TICKET_MSG_SZ;
  30446. goto error;
  30447. }
  30448. XMEMCPY(it->ticketNonce, ssl->session->ticketNonce.data,
  30449. ssl->session->ticketNonce.len);
  30450. it->ticketNonceLen = ssl->session->ticketNonce.len;
  30451. #endif
  30452. }
  30453. #ifdef WOLFSSL_TICKET_HAVE_ID
  30454. {
  30455. const byte* id = NULL;
  30456. byte idSz = 0;
  30457. if (ssl->session->haveAltSessionID) {
  30458. id = ssl->session->altSessionID;
  30459. idSz = ID_LEN;
  30460. }
  30461. else if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL) {
  30462. id = ssl->arrays->sessionID;
  30463. idSz = ssl->arrays->sessionIDSz;
  30464. }
  30465. else {
  30466. id = ssl->session->sessionID;
  30467. idSz = ssl->session->sessionIDSz;
  30468. }
  30469. if (idSz == 0) {
  30470. ret = wc_RNG_GenerateBlock(ssl->rng, ssl->session->altSessionID,
  30471. ID_LEN);
  30472. if (ret != 0)
  30473. goto error;
  30474. ssl->session->haveAltSessionID = 1;
  30475. id = ssl->session->altSessionID;
  30476. idSz = ID_LEN;
  30477. }
  30478. /* make sure idSz is not larger than ID_LEN */
  30479. if (idSz > ID_LEN)
  30480. idSz = ID_LEN;
  30481. XMEMCPY(it->id, id, idSz);
  30482. }
  30483. #endif
  30484. /* encrypt */
  30485. encLen = WOLFSSL_TICKET_ENC_SZ; /* max size user can use */
  30486. if (ssl->ctx->ticketEncCb == NULL
  30487. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(WOLFSSL_WPAS_SMALL)
  30488. ||
  30489. /* SSL_OP_NO_TICKET turns off tickets in <= 1.2. Forces
  30490. * "stateful" tickets for 1.3 so just use the regular
  30491. * stateless ones. */
  30492. (!IsAtLeastTLSv1_3(ssl->version) &&
  30493. (ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0)
  30494. #endif
  30495. ) {
  30496. /* Use BAD_TICKET_ENCRYPT to signal missing ticket callback */
  30497. ret = BAD_TICKET_ENCRYPT;
  30498. }
  30499. else {
  30500. itHash = HashObject((byte*)it, sizeof(*it), &error);
  30501. if (error == 0) {
  30502. ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv, et->mac,
  30503. 1, et->enc_ticket, sizeof(InternalTicket), &encLen,
  30504. ssl->ctx->ticketEncCtx);
  30505. }
  30506. else {
  30507. ret = WOLFSSL_TICKET_RET_FATAL;
  30508. }
  30509. }
  30510. if (ret != WOLFSSL_TICKET_RET_OK) {
  30511. #ifdef WOLFSSL_ASYNC_CRYPT
  30512. if (ret == WC_PENDING_E) {
  30513. return ret;
  30514. }
  30515. #endif
  30516. goto error;
  30517. }
  30518. if (encLen < (int)sizeof(InternalTicket) ||
  30519. encLen > (int)WOLFSSL_TICKET_ENC_SZ) {
  30520. WOLFSSL_MSG("Bad user ticket encrypt size");
  30521. ret = BAD_TICKET_KEY_CB_SZ;
  30522. }
  30523. /* sanity checks on encrypt callback */
  30524. /* internal ticket can't be the same if encrypted */
  30525. if (itHash == HashObject((byte*)it, sizeof(*it), &error) || error != 0)
  30526. {
  30527. WOLFSSL_MSG("User ticket encrypt didn't encrypt or hash failed");
  30528. ret = BAD_TICKET_ENCRYPT;
  30529. goto error;
  30530. }
  30531. XMEMSET(zeros, 0, sizeof(zeros));
  30532. /* name */
  30533. if (XMEMCMP(et->key_name, zeros, WOLFSSL_TICKET_NAME_SZ) == 0) {
  30534. WOLFSSL_MSG("User ticket encrypt didn't set name");
  30535. ret = BAD_TICKET_ENCRYPT;
  30536. goto error;
  30537. }
  30538. /* iv */
  30539. if (XMEMCMP(et->iv, zeros, WOLFSSL_TICKET_IV_SZ) == 0) {
  30540. WOLFSSL_MSG("User ticket encrypt didn't set iv");
  30541. ret = BAD_TICKET_ENCRYPT;
  30542. goto error;
  30543. }
  30544. /* mac */
  30545. if (XMEMCMP(et->mac, zeros, WOLFSSL_TICKET_MAC_SZ) == 0) {
  30546. WOLFSSL_MSG("User ticket encrypt didn't set mac");
  30547. ret = BAD_TICKET_ENCRYPT;
  30548. goto error;
  30549. }
  30550. /* set size */
  30551. c16toa((word16)encLen, et->enc_len);
  30552. if (encLen < (int)WOLFSSL_TICKET_ENC_SZ) {
  30553. /* move mac up since whole enc buffer not used */
  30554. XMEMMOVE(et->enc_ticket + encLen, et->mac,
  30555. WOLFSSL_TICKET_MAC_SZ);
  30556. }
  30557. ssl->session->ticketLen =
  30558. (word16)(encLen + WOLFSSL_TICKET_FIXED_SZ);
  30559. return ret;
  30560. error:
  30561. #ifdef WOLFSSL_CHECK_MEM_ZERO
  30562. /* Ticket has sensitive data in it now. */
  30563. wc_MemZero_Add("Create Ticket internal", it, sizeof(InternalTicket));
  30564. #endif
  30565. ForceZero(it, sizeof(*it));
  30566. #ifdef WOLFSSL_CHECK_MEM_ZERO
  30567. wc_MemZero_Check(it, sizeof(InternalTicket));
  30568. #endif
  30569. WOLFSSL_ERROR_VERBOSE(ret);
  30570. return ret;
  30571. }
  30572. int DoDecryptTicket(const WOLFSSL* ssl, const byte* input, word32 len,
  30573. InternalTicket **it)
  30574. {
  30575. ExternalTicket* et;
  30576. int ret;
  30577. int outLen;
  30578. word16 inLen;
  30579. WOLFSSL_START(WC_FUNC_TICKET_DO);
  30580. WOLFSSL_ENTER("DoDecryptTicket");
  30581. if (len > SESSION_TICKET_LEN ||
  30582. len < (word32)(sizeof(InternalTicket) + WOLFSSL_TICKET_FIXED_SZ)) {
  30583. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_MSG_SZ);
  30584. return WOLFSSL_TICKET_RET_REJECT;
  30585. }
  30586. et = (ExternalTicket*)input;
  30587. /* decrypt */
  30588. ato16(et->enc_len, &inLen);
  30589. if (inLen > WOLFSSL_TICKET_ENC_SZ) {
  30590. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_MSG_SZ);
  30591. return WOLFSSL_TICKET_RET_REJECT;
  30592. }
  30593. outLen = (int)inLen; /* may be reduced by user padding */
  30594. if (ssl->ctx->ticketEncCb == NULL
  30595. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(WOLFSSL_WPAS_SMALL)
  30596. ||
  30597. /* SSL_OP_NO_TICKET turns off tickets in < 1.2. Forces
  30598. * "stateful" tickets for 1.3 so just use the regular
  30599. * stateless ones. */
  30600. (!IsAtLeastTLSv1_3(ssl->version) &&
  30601. (ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0)
  30602. #endif
  30603. ) {
  30604. /* Use BAD_TICKET_ENCRYPT to signal missing ticket callback */
  30605. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_ENCRYPT);
  30606. ret = WOLFSSL_TICKET_RET_REJECT;
  30607. }
  30608. else {
  30609. /* Callback uses ssl without const but for DTLS, it really shouldn't
  30610. * modify its state. */
  30611. ret = ssl->ctx->ticketEncCb((WOLFSSL*)ssl, et->key_name, et->iv,
  30612. et->enc_ticket + inLen, 0,
  30613. et->enc_ticket, inLen, &outLen,
  30614. ssl->ctx->ticketEncCtx);
  30615. }
  30616. if (ret != WOLFSSL_TICKET_RET_OK) {
  30617. #ifdef WOLFSSL_ASYNC_CRYPT
  30618. if (ret == WC_PENDING_E) {
  30619. return ret;
  30620. }
  30621. #endif /* WOLFSSL_ASYNC_CRYPT */
  30622. if (ret != WOLFSSL_TICKET_RET_CREATE) {
  30623. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_KEY_CB_SZ);
  30624. return WOLFSSL_TICKET_RET_REJECT;
  30625. }
  30626. }
  30627. if (outLen > (int)inLen || outLen < (int)sizeof(InternalTicket)) {
  30628. WOLFSSL_MSG("Bad user ticket decrypt len");
  30629. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_KEY_CB_SZ);
  30630. return BAD_TICKET_KEY_CB_SZ;
  30631. }
  30632. *it = (InternalTicket*)et->enc_ticket;
  30633. return ret;
  30634. }
  30635. static int DoClientTicketCheckVersion(const WOLFSSL* ssl,
  30636. InternalTicket* it)
  30637. {
  30638. if (ssl->version.minor < it->pv.minor) {
  30639. WOLFSSL_MSG("Ticket has greater version");
  30640. return VERSION_ERROR;
  30641. }
  30642. else if (ssl->version.minor > it->pv.minor) {
  30643. if (IsAtLeastTLSv1_3(it->pv) != IsAtLeastTLSv1_3(ssl->version)) {
  30644. WOLFSSL_MSG("Tickets cannot be shared between "
  30645. "TLS 1.3 and TLS 1.2 and lower");
  30646. return VERSION_ERROR;
  30647. }
  30648. if (!ssl->options.downgrade) {
  30649. WOLFSSL_MSG("Ticket has lesser version");
  30650. return VERSION_ERROR;
  30651. }
  30652. WOLFSSL_MSG("Downgrading protocol due to ticket");
  30653. if (it->pv.minor < ssl->options.minDowngrade) {
  30654. WOLFSSL_MSG("Ticket has lesser version than allowed");
  30655. return VERSION_ERROR;
  30656. }
  30657. }
  30658. #ifdef WOLFSSL_TLS13
  30659. /* Check resumption master secret. */
  30660. if (IsAtLeastTLSv1_3(it->pv) &&
  30661. it->ticketNonceLen > MAX_TICKET_NONCE_STATIC_SZ) {
  30662. WOLFSSL_MSG("Unsupported ticketNonce len in ticket");
  30663. return BAD_TICKET_ENCRYPT;
  30664. }
  30665. #endif
  30666. return 0;
  30667. }
  30668. #if defined(WOLFSSL_TLS13)
  30669. /* Return 0 when check successful. <0 on failure. */
  30670. int DoClientTicketCheck(const WOLFSSL* ssl, const PreSharedKey* psk,
  30671. sword64 timeout, const byte* suite)
  30672. {
  30673. word32 ticketAdd;
  30674. #ifdef WOLFSSL_32BIT_MILLI_TIME
  30675. word32 now;
  30676. sword64 diff;
  30677. word32 ticketSeen; /* Time ticket seen (ms) */
  30678. ato32(psk->it->timestamp, &ticketSeen);
  30679. now = TimeNowInMilliseconds();
  30680. if (now == 0)
  30681. return GETTIME_ERROR;
  30682. /* Difference between now and time ticket constructed
  30683. * (from decrypted ticket). */
  30684. diff = now;
  30685. diff -= ticketSeen;
  30686. if (diff > timeout * 1000 ||
  30687. diff > (sword64)TLS13_MAX_TICKET_AGE * 1000)
  30688. return -1;
  30689. #else
  30690. sword64 diff;
  30691. sword64 ticketSeen; /* Time ticket seen (ms) */
  30692. word32 seenHi, seenLo;
  30693. ato32(psk->it->timestamp , &seenHi);
  30694. ato32(psk->it->timestamp + OPAQUE32_LEN, &seenLo);
  30695. ticketSeen = ((sword64)seenHi << 32) + seenLo;
  30696. diff = TimeNowInMilliseconds();
  30697. if (diff == 0)
  30698. return GETTIME_ERROR;
  30699. /* Difference between now and time ticket constructed
  30700. * (from decrypted ticket). */
  30701. diff -= ticketSeen;
  30702. if (diff > timeout * 1000 ||
  30703. diff > (sword64)TLS13_MAX_TICKET_AGE * 1000)
  30704. return -1;
  30705. #endif
  30706. ato32(psk->it->ageAdd, &ticketAdd);
  30707. /* Subtract client's ticket age and unobfuscate. */
  30708. diff -= psk->ticketAge;
  30709. diff += ticketAdd;
  30710. /* Check session and ticket age timeout.
  30711. * Allow +/- 1000 milliseconds on ticket age.
  30712. */
  30713. if (diff < -1000 || diff - MAX_TICKET_AGE_DIFF * 1000 > 1000)
  30714. return -1;
  30715. #if !defined(WOLFSSL_PSK_ONE_ID) && !defined(WOLFSSL_PRIORITIZE_PSK)
  30716. /* Check whether resumption is possible based on suites in SSL and
  30717. * ciphersuite in ticket.
  30718. */
  30719. (void)ssl;
  30720. if (XMEMCMP(suite, psk->it->suite, SUITE_LEN) != 0)
  30721. return -1;
  30722. #else
  30723. (void)suite;
  30724. if (!FindSuiteSSL(ssl, psk->it->suite))
  30725. return -1;
  30726. #endif
  30727. return 0;
  30728. }
  30729. #endif /* WOLFSSL_SLT13 */
  30730. void DoClientTicketFinalize(WOLFSSL* ssl, InternalTicket* it,
  30731. const WOLFSSL_SESSION* sess)
  30732. {
  30733. #ifdef WOLFSSL_TICKET_HAVE_ID
  30734. ssl->session->haveAltSessionID = 1;
  30735. XMEMCPY(ssl->session->altSessionID, it->id, ID_LEN);
  30736. #endif
  30737. if (sess != NULL) {
  30738. byte bogusID[ID_LEN];
  30739. byte bogusIDSz = ssl->session->sessionIDSz;
  30740. XMEMCPY(bogusID, ssl->session->sessionID, ID_LEN);
  30741. /* Failure here should not interupt the resumption. We already have
  30742. * all the cipher material we need in `it` */
  30743. WOLFSSL_MSG("Copying in session from passed in arg");
  30744. (void)wolfSSL_DupSession(sess, ssl->session, 1);
  30745. /* Restore the fake ID */
  30746. XMEMCPY(ssl->session->sessionID, bogusID, ID_LEN);
  30747. ssl->session->sessionIDSz= bogusIDSz;
  30748. }
  30749. #ifdef WOLFSSL_TICKET_HAVE_ID
  30750. else {
  30751. if (wolfSSL_GetSession(ssl, NULL, 1) != NULL) {
  30752. WOLFSSL_MSG("Found session matching the session id"
  30753. " found in the ticket");
  30754. }
  30755. else {
  30756. WOLFSSL_MSG("Can't find session matching the session id"
  30757. " found in the ticket");
  30758. }
  30759. }
  30760. #endif
  30761. if (!IsAtLeastTLSv1_3(ssl->version)) {
  30762. XMEMCPY(ssl->arrays->masterSecret, it->msecret, SECRET_LEN);
  30763. /* Copy the haveExtendedMasterSecret property from the ticket to
  30764. * the saved session, so the property may be checked later. */
  30765. ssl->session->haveEMS = it->haveEMS;
  30766. ato32((const byte*)&it->timestamp, &ssl->session->bornOn);
  30767. #ifndef NO_RESUME_SUITE_CHECK
  30768. ssl->session->cipherSuite0 = it->suite[0];
  30769. ssl->session->cipherSuite = it->suite[1];
  30770. #endif
  30771. }
  30772. else {
  30773. #ifdef WOLFSSL_TLS13
  30774. /* This should have been already checked in
  30775. * DoClientTicketCheckVersion */
  30776. if (it->ticketNonceLen > MAX_TICKET_NONCE_STATIC_SZ) {
  30777. WOLFSSL_MSG("Unsupported ticketNonce len in ticket");
  30778. return;
  30779. }
  30780. /* Restore information to renegotiate. */
  30781. #ifdef WOLFSSL_32BIT_MILLI_TIME
  30782. ato32(it->timestamp, &ssl->session->ticketSeen);
  30783. #else
  30784. {
  30785. word32 seenHi, seenLo;
  30786. ato32(it->timestamp , &seenHi);
  30787. ato32(it->timestamp + OPAQUE32_LEN, &seenLo);
  30788. ssl->session->ticketSeen = ((sword64)seenHi << 32) + seenLo;
  30789. }
  30790. #endif
  30791. ato32(it->ageAdd, &ssl->session->ticketAdd);
  30792. ssl->session->cipherSuite0 = it->suite[0];
  30793. ssl->session->cipherSuite = it->suite[1];
  30794. #ifdef WOLFSSL_EARLY_DATA
  30795. ato32(it->maxEarlyDataSz, &ssl->session->maxEarlyDataSz);
  30796. #endif
  30797. /* Resumption master secret. */
  30798. XMEMCPY(ssl->session->masterSecret, it->msecret, SECRET_LEN);
  30799. #if defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  30800. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  30801. if (ssl->session->ticketNonce.data
  30802. != ssl->session->ticketNonce.dataStatic) {
  30803. XFREE(ssl->session->ticketNonce.data, ssl->heap,
  30804. DYNAMIC_TYPE_SESSION_TICK);
  30805. ssl->session->ticketNonce.data =
  30806. ssl->session->ticketNonce.dataStatic;
  30807. }
  30808. #endif /* defined(WOLFSSL_TICKET_NONCE_MALLOC) && FIPS_VERSION_GE(5,3) */
  30809. XMEMCPY(ssl->session->ticketNonce.data, it->ticketNonce,
  30810. it->ticketNonceLen);
  30811. ssl->session->ticketNonce.len = it->ticketNonceLen;
  30812. ato16(it->namedGroup, &ssl->session->namedGroup);
  30813. #endif
  30814. }
  30815. ssl->version.minor = it->pv.minor;
  30816. }
  30817. #if defined(WOLFSSL_TLS13)
  30818. static void PopulateInternalTicketFromSession(const WOLFSSL_SESSION* sess,
  30819. InternalTicket* it)
  30820. {
  30821. #ifdef WOLFSSL_32BIT_MILLI_TIME
  30822. word32 milliBornOn = sess->bornOn;
  30823. #else
  30824. sword64 milliBornOn = (sword64)sess->bornOn;
  30825. #endif
  30826. /* Convert to milliseconds */
  30827. milliBornOn *= 1000;
  30828. it->pv = sess->version;
  30829. it->suite[0] = sess->cipherSuite0;
  30830. it->suite[1] = sess->cipherSuite;
  30831. XMEMCPY(it->msecret, sess->masterSecret, SECRET_LEN);
  30832. #ifdef WOLFSSL_32BIT_MILLI_TIME
  30833. c32toa(milliBornOn, it->timestamp);
  30834. #else
  30835. c32toa((word32)(milliBornOn >> 32), it->timestamp);
  30836. c32toa((word32)milliBornOn , it->timestamp + OPAQUE32_LEN);
  30837. #endif
  30838. it->haveEMS = (byte)sess->haveEMS;
  30839. c32toa(sess->ticketAdd, it->ageAdd);
  30840. c16toa(sess->namedGroup, it->namedGroup);
  30841. if (sess->ticketNonce.len <= MAX_TICKET_NONCE_STATIC_SZ) {
  30842. it->ticketNonceLen = sess->ticketNonce.len;
  30843. XMEMCPY(it->ticketNonce, sess->ticketNonce.data,
  30844. sess->ticketNonce.len);
  30845. }
  30846. #ifdef WOLFSSL_EARLY_DATA
  30847. c32toa(sess->maxEarlyDataSz, it->maxEarlyDataSz);
  30848. #endif
  30849. #ifdef WOLFSSL_TICKET_HAVE_ID
  30850. if (sess->haveAltSessionID)
  30851. XMEMCPY(it->id, sess->altSessionID, ID_LEN);
  30852. else
  30853. XMEMCPY(it->id, sess->sessionID, ID_LEN);
  30854. #endif
  30855. }
  30856. static const WOLFSSL_SESSION* GetSesionFromCacheOrExt(const WOLFSSL* ssl,
  30857. const byte* id, psk_sess_free_cb_ctx* freeCtx)
  30858. {
  30859. const WOLFSSL_SESSION* sess = NULL;
  30860. int ret;
  30861. XMEMSET(freeCtx, 0, sizeof(*freeCtx));
  30862. #ifdef HAVE_EXT_CACHE
  30863. if (ssl->ctx->get_sess_cb != NULL) {
  30864. int copy = 0;
  30865. sess = ssl->ctx->get_sess_cb((WOLFSSL*)ssl,
  30866. id, ID_LEN, &copy);
  30867. if (sess != NULL) {
  30868. freeCtx->extCache = 1;
  30869. /* If copy not set then free immediately */
  30870. if (!copy)
  30871. freeCtx->freeSess = 1;
  30872. }
  30873. }
  30874. #endif
  30875. if (sess == NULL) {
  30876. ret = TlsSessionCacheGetAndRdLock(id, &sess, &freeCtx->row,
  30877. ssl->options.side);
  30878. if (ret != 0)
  30879. sess = NULL;
  30880. }
  30881. return sess;
  30882. }
  30883. static void FreeSessionFromCacheOrExt(const WOLFSSL* ssl,
  30884. const WOLFSSL_SESSION* sess, psk_sess_free_cb_ctx* freeCtx)
  30885. {
  30886. (void)ssl;
  30887. (void)sess;
  30888. #ifdef HAVE_EXT_CACHE
  30889. if (freeCtx->extCache) {
  30890. if (freeCtx->freeSess)
  30891. /* In this case sess is not longer const and the external cache
  30892. * wants us to free it. */
  30893. wolfSSL_FreeSession(ssl->ctx, (WOLFSSL_SESSION*)sess);
  30894. }
  30895. else
  30896. #endif
  30897. TlsSessionCacheUnlockRow(freeCtx->row);
  30898. }
  30899. /* Parse ticket sent by client, returns callback return value. Doesn't
  30900. * modify ssl and stores the InternalTicket inside psk */
  30901. int DoClientTicket_ex(const WOLFSSL* ssl, PreSharedKey* psk, int retainSess)
  30902. {
  30903. int ret;
  30904. int decryptRet = WOLFSSL_TICKET_RET_REJECT;
  30905. WOLFSSL_START(WC_FUNC_TICKET_DO);
  30906. WOLFSSL_ENTER("DoClientTicket_ex");
  30907. if (psk->identityLen == ID_LEN && IsAtLeastTLSv1_3(ssl->version)) {
  30908. /* This is a stateful ticket. We can be sure about this because
  30909. * stateless tickets are much longer. */
  30910. const WOLFSSL_SESSION* sess = NULL;
  30911. sess = GetSesionFromCacheOrExt(ssl, psk->identity,
  30912. &psk->sess_free_cb_ctx);
  30913. if (sess != NULL) {
  30914. /* Session found in cache. Copy in relevant info to psk */
  30915. byte* tmp;
  30916. WOLFSSL_MSG("Found session matching the session id"
  30917. " found in the ticket");
  30918. /* Allocate and populate an InternalTicket */
  30919. tmp = (byte*)XREALLOC(psk->identity, sizeof(InternalTicket),
  30920. ssl->heap, DYNAMIC_TYPE_TLSX);
  30921. if (tmp != NULL) {
  30922. XMEMSET(tmp, 0, sizeof(InternalTicket));
  30923. psk->identity = tmp;
  30924. psk->identityLen = sizeof(InternalTicket);
  30925. psk->it = (InternalTicket*)tmp;
  30926. PopulateInternalTicketFromSession(sess, psk->it);
  30927. decryptRet = WOLFSSL_TICKET_RET_OK;
  30928. if (retainSess) {
  30929. psk->sess = sess;
  30930. psk->sess_free_cb = FreeSessionFromCacheOrExt;
  30931. }
  30932. }
  30933. if (psk->sess == NULL) {
  30934. FreeSessionFromCacheOrExt(ssl, sess,
  30935. &psk->sess_free_cb_ctx);
  30936. XMEMSET(&psk->sess_free_cb_ctx, 0,
  30937. sizeof(psk_sess_free_cb_ctx));
  30938. }
  30939. }
  30940. }
  30941. else {
  30942. decryptRet = DoDecryptTicket(ssl, psk->identity, psk->identityLen,
  30943. &psk->it);
  30944. }
  30945. switch (decryptRet) {
  30946. case WOLFSSL_TICKET_RET_OK:
  30947. psk->decryptRet = PSK_DECRYPT_OK;
  30948. break;
  30949. case WOLFSSL_TICKET_RET_CREATE:
  30950. psk->decryptRet = PSK_DECRYPT_CREATE;
  30951. break;
  30952. default:
  30953. psk->decryptRet = PSK_DECRYPT_FAIL;
  30954. return decryptRet;
  30955. }
  30956. #ifdef WOLFSSL_CHECK_MEM_ZERO
  30957. /* Internal ticket successfully decrypted. */
  30958. wc_MemZero_Add("Do Client Ticket internal", psk->it,
  30959. sizeof(InternalTicket));
  30960. #endif
  30961. ret = DoClientTicketCheckVersion(ssl, psk->it);
  30962. if (ret != 0) {
  30963. psk->decryptRet = PSK_DECRYPT_FAIL;
  30964. ForceZero(psk->identity, psk->identityLen);
  30965. #ifdef WOLFSSL_CHECK_MEM_ZERO
  30966. wc_MemZero_Check(psk->it, sizeof(InternalTicket));
  30967. #endif
  30968. return ret;
  30969. }
  30970. return decryptRet;
  30971. }
  30972. #endif /* WOLFSL_TLS13 */
  30973. /* Parse ticket sent by client, returns callback return value */
  30974. int DoClientTicket(WOLFSSL* ssl, const byte* input, word32 len)
  30975. {
  30976. int decryptRet = WOLFSSL_TICKET_RET_REJECT;
  30977. int ret;
  30978. InternalTicket* it;
  30979. #ifdef WOLFSSL_TLS13
  30980. InternalTicket staticIt;
  30981. const WOLFSSL_SESSION* sess = NULL;
  30982. psk_sess_free_cb_ctx freeCtx;
  30983. XMEMSET(&freeCtx, 0, sizeof(psk_sess_free_cb_ctx));
  30984. #endif
  30985. WOLFSSL_START(WC_FUNC_TICKET_DO);
  30986. WOLFSSL_ENTER("DoClientTicket");
  30987. #ifdef WOLFSSL_TLS13
  30988. if (len == ID_LEN && IsAtLeastTLSv1_3(ssl->version)) {
  30989. /* This is a stateful ticket. We can be sure about this because
  30990. * stateless tickets are much longer. */
  30991. sess = GetSesionFromCacheOrExt(ssl, input, &freeCtx);
  30992. if (sess != NULL) {
  30993. it = &staticIt;
  30994. XMEMSET(it, 0, sizeof(InternalTicket));
  30995. PopulateInternalTicketFromSession(sess, it);
  30996. decryptRet = WOLFSSL_TICKET_RET_OK;
  30997. }
  30998. }
  30999. else
  31000. #endif
  31001. decryptRet = DoDecryptTicket(ssl, input, len, &it);
  31002. if (decryptRet != WOLFSSL_TICKET_RET_OK &&
  31003. decryptRet != WOLFSSL_TICKET_RET_CREATE) {
  31004. it = NULL;
  31005. goto cleanup;
  31006. }
  31007. #ifdef WOLFSSL_CHECK_MEM_ZERO
  31008. /* Internal ticket successfully decrypted. */
  31009. wc_MemZero_Add("Do Client Ticket internal", it, sizeof(InternalTicket));
  31010. #endif
  31011. ret = DoClientTicketCheckVersion(ssl, it);
  31012. if (ret != 0) {
  31013. decryptRet = ret;
  31014. goto cleanup;
  31015. }
  31016. DoClientTicketFinalize(ssl, it, NULL);
  31017. cleanup:
  31018. if (it != NULL) {
  31019. ForceZero(it, sizeof(*it));
  31020. #ifdef WOLFSSL_CHECK_MEM_ZERO
  31021. wc_MemZero_Check(it, sizeof(InternalTicket));
  31022. #endif
  31023. }
  31024. #ifdef WOLFSSL_TLS13
  31025. if (sess != NULL)
  31026. FreeSessionFromCacheOrExt(ssl, sess, &freeCtx);
  31027. #endif
  31028. return decryptRet;
  31029. }
  31030. #ifdef WOLFSSL_TLS13
  31031. void CleanupClientTickets(PreSharedKey* psk)
  31032. {
  31033. for (; psk != NULL; psk = psk->next) {
  31034. if (psk->decryptRet == PSK_DECRYPT_OK ||
  31035. psk->decryptRet == PSK_DECRYPT_CREATE) {
  31036. psk->decryptRet = PSK_DECRYPT_NONE;
  31037. ForceZero(psk->identity, psk->identityLen);
  31038. #ifdef WOLFSSL_CHECK_MEM_ZERO
  31039. /* We want to check the InternalTicket area since that is what
  31040. * we registered in DoClientTicket_ex */
  31041. wc_MemZero_Check((((ExternalTicket*)psk->identity)->enc_ticket),
  31042. sizeof(InternalTicket));
  31043. #endif
  31044. }
  31045. }
  31046. }
  31047. #endif /* WOLFSSL_TLS13 */
  31048. /* send Session Ticket */
  31049. int SendTicket(WOLFSSL* ssl)
  31050. {
  31051. byte* output;
  31052. int ret;
  31053. int sendSz;
  31054. word32 length = SESSION_HINT_SZ + LENGTH_SZ;
  31055. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  31056. WOLFSSL_START(WC_FUNC_TICKET_SEND);
  31057. WOLFSSL_ENTER("SendTicket");
  31058. if (ssl->options.createTicket) {
  31059. ret = CreateTicket(ssl);
  31060. if (ret != 0)
  31061. return ret;
  31062. }
  31063. length += ssl->session->ticketLen;
  31064. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  31065. if (!ssl->options.dtls) {
  31066. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
  31067. sendSz += MAX_MSG_EXTRA;
  31068. }
  31069. else {
  31070. #ifdef WOLFSSL_DTLS
  31071. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  31072. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  31073. #endif
  31074. }
  31075. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
  31076. sendSz += cipherExtraData(ssl);
  31077. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  31078. * is not advanced yet */
  31079. ssl->options.buildingMsg = 1;
  31080. /* check for available size */
  31081. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  31082. return ret;
  31083. /* get output buffer */
  31084. output = ssl->buffers.outputBuffer.buffer +
  31085. ssl->buffers.outputBuffer.length;
  31086. AddHeaders(output, length, session_ticket, ssl);
  31087. /* hint */
  31088. c32toa(ssl->ctx->ticketHint, output + idx);
  31089. idx += SESSION_HINT_SZ;
  31090. /* length */
  31091. c16toa(ssl->session->ticketLen, output + idx);
  31092. idx += LENGTH_SZ;
  31093. /* ticket */
  31094. XMEMCPY(output + idx, ssl->session->ticket, ssl->session->ticketLen);
  31095. idx += ssl->session->ticketLen;
  31096. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  31097. byte* input;
  31098. int inputSz = idx; /* build msg adds rec hdr */
  31099. int recordHeaderSz = RECORD_HEADER_SZ;
  31100. if (ssl->options.dtls)
  31101. recordHeaderSz += DTLS_RECORD_EXTRA;
  31102. inputSz -= recordHeaderSz;
  31103. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  31104. if (input == NULL)
  31105. return MEMORY_E;
  31106. XMEMCPY(input, output + recordHeaderSz, inputSz);
  31107. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  31108. handshake, 1, 0, 0, CUR_ORDER);
  31109. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  31110. if (sendSz < 0)
  31111. return sendSz;
  31112. }
  31113. else {
  31114. #ifdef WOLFSSL_DTLS
  31115. if (ssl->options.dtls) {
  31116. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, session_ticket)) != 0)
  31117. return ret;
  31118. DtlsSEQIncrement(ssl, CUR_ORDER);
  31119. }
  31120. #endif
  31121. ret = HashOutput(ssl, output, sendSz, 0);
  31122. if (ret != 0)
  31123. return ret;
  31124. }
  31125. ssl->buffers.outputBuffer.length += sendSz;
  31126. ssl->options.buildingMsg = 0;
  31127. if (!ssl->options.groupMessages)
  31128. ret = SendBuffered(ssl);
  31129. WOLFSSL_LEAVE("SendTicket", ret);
  31130. WOLFSSL_END(WC_FUNC_TICKET_SEND);
  31131. return ret;
  31132. }
  31133. #ifndef WOLFSSL_NO_DEF_TICKET_ENC_CB
  31134. /* Initialize the context for session ticket encryption.
  31135. *
  31136. * @param [in] ctx SSL context.
  31137. * @param [in] keyCtx Context for session ticket encryption.
  31138. * @return 0 on success.
  31139. * @return BAD_MUTEX_E when initializing mutex fails.
  31140. */
  31141. static int TicketEncCbCtx_Init(WOLFSSL_CTX* ctx, TicketEncCbCtx* keyCtx)
  31142. {
  31143. int ret = 0;
  31144. XMEMSET(keyCtx, 0, sizeof(*keyCtx));
  31145. keyCtx->ctx = ctx;
  31146. #ifdef WOLFSSL_CHECK_MEM_ZERO
  31147. wc_MemZero_Add("TicketEncCbCtx_Init keyCtx->name", keyCtx->name,
  31148. sizeof(keyCtx->name));
  31149. wc_MemZero_Add("TicketEncCbCtx_Init keyCtx->key[0]", keyCtx->key[0],
  31150. sizeof(keyCtx->key[0]));
  31151. wc_MemZero_Add("TicketEncCbCtx_Init keyCtx->key[1]", keyCtx->key[1],
  31152. sizeof(keyCtx->key[1]));
  31153. #endif
  31154. #ifndef SINGLE_THREADED
  31155. ret = wc_InitMutex(&keyCtx->mutex);
  31156. #endif
  31157. return ret;
  31158. }
  31159. /* Setup the session ticket encryption context for this.
  31160. *
  31161. * Initialize RNG, generate name, generate primary key and set primary key
  31162. * expirary.
  31163. *
  31164. * @param [in] keyCtx Context for session ticket encryption.
  31165. * @param [in] heap Dynamic memory allocation hint.
  31166. * @param [in] devId Device identifier.
  31167. * @return 0 on success.
  31168. * @return Other value when random number generator fails.
  31169. */
  31170. static int TicketEncCbCtx_Setup(TicketEncCbCtx* keyCtx, void* heap, int devId)
  31171. {
  31172. int ret;
  31173. #ifndef SINGLE_THREADED
  31174. ret = 0;
  31175. /* Check that key wasn't set up while waiting. */
  31176. if (keyCtx->expirary[0] == 0)
  31177. #endif
  31178. {
  31179. ret = wc_InitRng_ex(&keyCtx->rng, heap, devId);
  31180. if (ret == 0) {
  31181. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->name,
  31182. sizeof(keyCtx->name));
  31183. }
  31184. if (ret == 0) {
  31185. /* Mask of the bottom bit - used for index of key. */
  31186. keyCtx->name[WOLFSSL_TICKET_NAME_SZ - 1] &= 0xfe;
  31187. /* Generate initial primary key. */
  31188. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->key[0],
  31189. WOLFSSL_TICKET_KEY_SZ);
  31190. }
  31191. if (ret == 0) {
  31192. keyCtx->expirary[0] = LowResTimer() + WOLFSSL_TICKET_KEY_LIFETIME;
  31193. }
  31194. }
  31195. return ret;
  31196. }
  31197. /* Free the context for session ticket encryption.
  31198. *
  31199. * Zeroize keys and name.
  31200. *
  31201. * @param [in] keyCtx Context for session ticket encryption.
  31202. */
  31203. static void TicketEncCbCtx_Free(TicketEncCbCtx* keyCtx)
  31204. {
  31205. /* Zeroize sensitive data. */
  31206. ForceZero(keyCtx->name, sizeof(keyCtx->name));
  31207. ForceZero(keyCtx->key[0], sizeof(keyCtx->key[0]));
  31208. ForceZero(keyCtx->key[1], sizeof(keyCtx->key[1]));
  31209. #ifdef WOLFSSL_CHECK_MEM_ZERO
  31210. wc_MemZero_Check(keyCtx->name, sizeof(keyCtx->name));
  31211. wc_MemZero_Check(keyCtx->key[0], sizeof(keyCtx->key[0]));
  31212. wc_MemZero_Check(keyCtx->key[1], sizeof(keyCtx->key[1]));
  31213. #endif
  31214. #ifndef SINGLE_THREADED
  31215. wc_FreeMutex(&keyCtx->mutex);
  31216. #endif
  31217. wc_FreeRng(&keyCtx->rng);
  31218. }
  31219. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
  31220. !defined(WOLFSSL_TICKET_ENC_AES128_GCM) && \
  31221. !defined(WOLFSSL_TICKET_ENC_AES256_GCM)
  31222. /* Ticket encryption/decryption implementation.
  31223. *
  31224. * @param [in] key Key for encryption/decryption.
  31225. * @param [in] keyLen Length of key in bytes.
  31226. * @param [in] iv IV/Nonce for encryption/decryption.
  31227. * @param [in] aad Additional authentication data.
  31228. * @param [in] aadSz Length of additional authentication data.
  31229. * @param [in] in Data to encrypt/decrypt.
  31230. * @param [in] inLen Length of encrypted data.
  31231. * @param [out] out Resulting data from encrypt/decrypt.
  31232. * @param [out] outLen Size of resulting data.
  31233. * @param [in] tag Authentication tag for encrypted data.
  31234. * @param [in] heap Dynamic memory allocation data hint.
  31235. * @param [in] enc 1 when encrypting, 0 when decrypting.
  31236. * @return 0 on success.
  31237. * @return Other value when encryption/decryption fails.
  31238. */
  31239. static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
  31240. byte* in, int inLen, byte* out, int* outLen, byte* tag,
  31241. void* heap, int enc)
  31242. {
  31243. int ret;
  31244. (void)keyLen;
  31245. (void)heap;
  31246. if (enc) {
  31247. ret = wc_ChaCha20Poly1305_Encrypt(key, iv, aad, aadSz, in, inLen, out,
  31248. tag);
  31249. }
  31250. else {
  31251. ret = wc_ChaCha20Poly1305_Decrypt(key, iv, aad, aadSz, in, inLen, tag,
  31252. out);
  31253. }
  31254. *outLen = inLen;
  31255. return ret;
  31256. }
  31257. #elif defined(HAVE_AESGCM)
  31258. /* Ticket encryption/decryption implementation.
  31259. *
  31260. * @param [in] key Key for encryption/decryption.
  31261. * @param [in] keyLen Length of key in bytes.
  31262. * @param [in] iv IV/Nonce for encryption/decryption.
  31263. * @param [in] aad Additional authentication data.
  31264. * @param [in] aadSz Length of additional authentication data.
  31265. * @param [in] in Data to encrypt/decrypt.
  31266. * @param [in] inLen Length of encrypted data.
  31267. * @param [out] out Resulting data from encrypt/decrypt.
  31268. * @param [out] outLen Size of resulting data.
  31269. * @param [in] tag Authentication tag for encrypted data.
  31270. * @param [in] heap Dynamic memory allocation data hint.
  31271. * @param [in] enc 1 when encrypting, 0 when decrypting.
  31272. * @return 0 on success.
  31273. * @return MEMORY_E when dynamic memory allocation fails.
  31274. * @return Other value when encryption/decryption fails.
  31275. */
  31276. static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
  31277. byte* in, int inLen, byte* out, int* outLen, byte* tag,
  31278. void* heap, int enc)
  31279. {
  31280. int ret;
  31281. #ifdef WOLFSSL_SMALL_STACK
  31282. Aes* aes;
  31283. #else
  31284. Aes aes[1];
  31285. #endif
  31286. (void)heap;
  31287. #ifdef WOLFSSL_SMALL_STACK
  31288. aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_TMP_BUFFER);
  31289. if (aes == NULL)
  31290. return MEMORY_E;
  31291. #endif
  31292. if (enc) {
  31293. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  31294. if (ret == 0) {
  31295. ret = wc_AesGcmSetKey(aes, key, keyLen);
  31296. }
  31297. if (ret == 0) {
  31298. ret = wc_AesGcmEncrypt(aes, in, out, inLen, iv, GCM_NONCE_MID_SZ,
  31299. tag, AES_BLOCK_SIZE, aad, aadSz);
  31300. }
  31301. wc_AesFree(aes);
  31302. }
  31303. else {
  31304. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  31305. if (ret == 0) {
  31306. ret = wc_AesGcmSetKey(aes, key, keyLen);
  31307. }
  31308. if (ret == 0) {
  31309. ret = wc_AesGcmDecrypt(aes, in, out, inLen, iv, GCM_NONCE_MID_SZ,
  31310. tag, AES_BLOCK_SIZE, aad, aadSz);
  31311. }
  31312. wc_AesFree(aes);
  31313. }
  31314. #ifdef WOLFSSL_SMALL_STACK
  31315. XFREE(aes, heap, DYNAMIC_TYPE_TMP_BUFFER);
  31316. #endif
  31317. *outLen = inLen;
  31318. return ret;
  31319. }
  31320. #else
  31321. #error "No encryption algorithm available for default ticket encryption."
  31322. #endif
  31323. /* Choose a key to use for encryption.
  31324. *
  31325. * Generate a new key if the current ones are expired.
  31326. * If the secondary key has not been used and the primary key has expired then
  31327. * generate a new primary key.
  31328. *
  31329. * @param [in] Ticket encryption callback context.
  31330. * @param [in] Session ticket lifetime.
  31331. * @param [out] Index of key to use for encryption.
  31332. * @return 0 on success.
  31333. * @return Other value when random number generation fails.
  31334. */
  31335. static int TicketEncCbCtx_ChooseKey(TicketEncCbCtx* keyCtx, int ticketHint,
  31336. int* keyIdx)
  31337. {
  31338. int ret = 0;
  31339. /* Get new current time as lock may have taken some time. */
  31340. word32 now = LowResTimer();
  31341. /* Check expirary of primary key for encrypt. */
  31342. if (keyCtx->expirary[0] >= now + ticketHint) {
  31343. *keyIdx = 0;
  31344. }
  31345. /* Check expirary of primary key for encrypt. */
  31346. else if (keyCtx->expirary[1] >= now + ticketHint) {
  31347. *keyIdx = 1;
  31348. }
  31349. /* No key available to use. */
  31350. else {
  31351. int genKey;
  31352. /* Generate which ever key is expired for decrypt - primary first. */
  31353. if (keyCtx->expirary[0] < now) {
  31354. genKey = 0;
  31355. }
  31356. else if (keyCtx->expirary[1] < now) {
  31357. genKey = 1;
  31358. }
  31359. /* Timeouts and expirary should not allow this to happen. */
  31360. else {
  31361. return BAD_STATE_E;
  31362. }
  31363. /* Generate the required key */
  31364. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->key[genKey],
  31365. WOLFSSL_TICKET_KEY_SZ);
  31366. if (ret == 0) {
  31367. keyCtx->expirary[genKey] = now + WOLFSSL_TICKET_KEY_LIFETIME;
  31368. *keyIdx = genKey;
  31369. }
  31370. }
  31371. return ret;
  31372. }
  31373. /* Default Session Ticket encryption/decryption callback.
  31374. *
  31375. * Use ChaCha20-Poly1305 or AES-GCM to encrypt/decrypt the ticket.
  31376. * Two keys are used:
  31377. * - When the first expires for encryption, then use the other.
  31378. * - Don't encrypt with key if the ticket lifetime will go beyond expirary.
  31379. * - Generate a new primary key when primary key expired for decrypt and
  31380. * no secondary key is activate for encryption.
  31381. * - Generate a new secondary key when expired and needed.
  31382. * - Calculate expirary starting from first encrypted ticket.
  31383. * - Key name has last bit set to indicate index of key.
  31384. * Keys expire for decryption after ticket key lifetime from the first encrypted
  31385. * ticket.
  31386. * Keys can only be use for encryption while the ticket hint does not exceed
  31387. * the key lifetime.
  31388. * Lifetime of a key must be greater than the lifetime of a ticket. This means
  31389. * that if one ticket is only valid for decryption, then the other will be
  31390. * valid for encryption.
  31391. * AAD = key_name | iv | ticket len (16-bits network order)
  31392. *
  31393. * @param [in] ssl SSL connection.
  31394. * @param [in,out] key_name Name of key from client.
  31395. * Encrypt: name of key returned.
  31396. * Decrypt: name from ticket message to check.
  31397. * @param [in] iv IV to use in encryption/decryption.
  31398. * @param [in] mac MAC for authentication of encrypted data.
  31399. * @param [in] enc 1 when encrypting ticket, 0 when decrypting.
  31400. * @param [in,out] ticket Encrypted/decrypted session ticket bytes.
  31401. * @param [in] inLen Length of incoming ticket.
  31402. * @param [out] outLen Length of outgoing ticket.
  31403. * @param [in] userCtx Context for encryption/decryption of ticket.
  31404. * @return WOLFSSL_TICKET_RET_OK when successful.
  31405. * @return WOLFSSL_TICKET_RET_CREATE when successful and a new ticket is to
  31406. * be created for TLS 1.2 and below.
  31407. * @return WOLFSSL_TICKET_RET_REJECT when failed to produce valid encrypted or
  31408. * decrypted ticket.
  31409. * @return WOLFSSL_TICKET_RET_FATAL when key name does not match.
  31410. */
  31411. static int DefTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ],
  31412. byte iv[WOLFSSL_TICKET_IV_SZ],
  31413. byte mac[WOLFSSL_TICKET_MAC_SZ],
  31414. int enc, byte* ticket, int inLen, int* outLen,
  31415. void* userCtx)
  31416. {
  31417. int ret;
  31418. TicketEncCbCtx* keyCtx = (TicketEncCbCtx*)userCtx;
  31419. WOLFSSL_CTX* ctx = keyCtx->ctx;
  31420. word16 sLen = XHTONS((word16)inLen);
  31421. byte aad[WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + sizeof(sLen)];
  31422. int aadSz = WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + sizeof(sLen);
  31423. byte* p = aad;
  31424. int keyIdx = 0;
  31425. WOLFSSL_ENTER("DefTicketEncCb");
  31426. /* Check we have setup the RNG, name and primary key. */
  31427. if (keyCtx->expirary[0] == 0) {
  31428. #ifndef SINGLE_THREADED
  31429. /* Lock around access to expirary and key - stop initial key being
  31430. * generated twice at the same time. */
  31431. if (wc_LockMutex(&keyCtx->mutex) != 0) {
  31432. WOLFSSL_MSG("Couldn't lock key context mutex");
  31433. return WOLFSSL_TICKET_RET_REJECT;
  31434. }
  31435. #endif
  31436. /* Sets expirary of primary key in setup. */
  31437. ret = TicketEncCbCtx_Setup(keyCtx, ssl->ctx->heap, ssl->ctx->devId);
  31438. #ifndef SINGLE_THREADED
  31439. wc_UnLockMutex(&keyCtx->mutex);
  31440. #endif
  31441. if (ret != 0)
  31442. return ret;
  31443. }
  31444. if (enc) {
  31445. /* Return the name of the key - missing key index. */
  31446. XMEMCPY(key_name, keyCtx->name, WOLFSSL_TICKET_NAME_SZ);
  31447. /* Generate a new IV into buffer to be returned.
  31448. * Don't use the RNG in keyCtx as it's for generating private data. */
  31449. ret = wc_RNG_GenerateBlock(ssl->rng, iv, WOLFSSL_TICKET_IV_SZ);
  31450. if (ret != 0) {
  31451. return WOLFSSL_TICKET_RET_REJECT;
  31452. }
  31453. }
  31454. else {
  31455. /* Mask of last bit that is the key index. */
  31456. byte lastByte = key_name[WOLFSSL_TICKET_NAME_SZ - 1] & 0xfe;
  31457. /* For decryption, see if we know this key - check all but last byte. */
  31458. if (XMEMCMP(key_name, keyCtx->name, WOLFSSL_TICKET_NAME_SZ - 1) != 0) {
  31459. return WOLFSSL_TICKET_RET_FATAL;
  31460. }
  31461. /* Ensure last byte without index bit matches too. */
  31462. if (lastByte != keyCtx->name[WOLFSSL_TICKET_NAME_SZ - 1]) {
  31463. return WOLFSSL_TICKET_RET_FATAL;
  31464. }
  31465. }
  31466. /* Build AAD from: key name, iv, and length of ticket. */
  31467. XMEMCPY(p, keyCtx->name, WOLFSSL_TICKET_NAME_SZ);
  31468. p += WOLFSSL_TICKET_NAME_SZ;
  31469. XMEMCPY(p, iv, WOLFSSL_TICKET_IV_SZ);
  31470. p += WOLFSSL_TICKET_IV_SZ;
  31471. XMEMCPY(p, &sLen, sizeof(sLen));
  31472. /* Encrypt ticket. */
  31473. if (enc) {
  31474. word32 now;
  31475. now = LowResTimer();
  31476. /* As long as encryption expirary isn't imminent - no lock. */
  31477. if (keyCtx->expirary[0] > now + ctx->ticketHint) {
  31478. keyIdx = 0;
  31479. }
  31480. else if (keyCtx->expirary[1] > now + ctx->ticketHint) {
  31481. keyIdx = 1;
  31482. }
  31483. else {
  31484. #ifndef SINGLE_THREADED
  31485. /* Lock around access to expirary and key - stop key being generated
  31486. * twice at the same time. */
  31487. if (wc_LockMutex(&keyCtx->mutex) != 0) {
  31488. WOLFSSL_MSG("Couldn't lock key context mutex");
  31489. return WOLFSSL_TICKET_RET_REJECT;
  31490. }
  31491. #endif
  31492. ret = TicketEncCbCtx_ChooseKey(keyCtx, ctx->ticketHint, &keyIdx);
  31493. #ifndef SINGLE_THREADED
  31494. wc_UnLockMutex(&keyCtx->mutex);
  31495. #endif
  31496. if (ret != 0) {
  31497. return WOLFSSL_TICKET_RET_REJECT;
  31498. }
  31499. }
  31500. /* Set the name of the key to the index chosen. */
  31501. key_name[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  31502. /* Update AAD too. */
  31503. aad[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  31504. /* Encrypt ticket data. */
  31505. ret = TicketEncDec(keyCtx->key[keyIdx], WOLFSSL_TICKET_KEY_SZ, iv, aad,
  31506. aadSz, ticket, inLen, ticket, outLen, mac, ssl->heap,
  31507. 1);
  31508. if (ret != 0) return WOLFSSL_TICKET_RET_REJECT;
  31509. }
  31510. /* Decrypt ticket. */
  31511. else {
  31512. /* Get index of key from name. */
  31513. keyIdx = key_name[WOLFSSL_TICKET_NAME_SZ - 1] & 0x1;
  31514. /* Update AAD with index. */
  31515. aad[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  31516. /* Check expirary */
  31517. if (keyCtx->expirary[keyIdx] <= LowResTimer()) {
  31518. return WOLFSSL_TICKET_RET_REJECT;
  31519. }
  31520. /* Decrypt ticket data. */
  31521. ret = TicketEncDec(keyCtx->key[keyIdx], WOLFSSL_TICKET_KEY_SZ, iv, aad,
  31522. aadSz, ticket, inLen, ticket, outLen, mac, ssl->heap,
  31523. 0);
  31524. if (ret != 0) {
  31525. return WOLFSSL_TICKET_RET_REJECT;
  31526. }
  31527. }
  31528. #ifndef WOLFSSL_TICKET_DECRYPT_NO_CREATE
  31529. if (!IsAtLeastTLSv1_3(ssl->version) && !enc)
  31530. return WOLFSSL_TICKET_RET_CREATE;
  31531. #endif
  31532. return WOLFSSL_TICKET_RET_OK;
  31533. }
  31534. #endif /* !WOLFSSL_NO_DEF_TICKET_ENC_CB */
  31535. #endif /* HAVE_SESSION_TICKET */
  31536. #ifndef WOLFSSL_NO_TLS12
  31537. #if defined(HAVE_SECURE_RENEGOTIATION) && \
  31538. !defined(NO_WOLFSSL_SERVER)
  31539. /* handle generation of server's hello_request (0) */
  31540. int SendHelloRequest(WOLFSSL* ssl)
  31541. {
  31542. byte* output;
  31543. int sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  31544. int ret;
  31545. WOLFSSL_START(WC_FUNC_HELLO_REQUEST_SEND);
  31546. WOLFSSL_ENTER("SendHelloRequest");
  31547. if (IsEncryptionOn(ssl, 1))
  31548. sendSz += MAX_MSG_EXTRA;
  31549. if (ssl->options.dtls)
  31550. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  31551. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  31552. * is not advanced yet */
  31553. ssl->options.buildingMsg = 1;
  31554. /* check for available size */
  31555. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  31556. return ret;
  31557. /* get output buffer */
  31558. output = ssl->buffers.outputBuffer.buffer +
  31559. ssl->buffers.outputBuffer.length;
  31560. AddHeaders(output, 0, hello_request, ssl);
  31561. if (IsEncryptionOn(ssl, 1)) {
  31562. byte* input;
  31563. int inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
  31564. int recordHeaderSz = RECORD_HEADER_SZ;
  31565. if (ssl->options.dtls) {
  31566. recordHeaderSz += DTLS_RECORD_EXTRA;
  31567. inputSz += DTLS_HANDSHAKE_EXTRA;
  31568. }
  31569. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  31570. if (input == NULL)
  31571. return MEMORY_E;
  31572. XMEMCPY(input, output + recordHeaderSz, inputSz);
  31573. #ifdef WOLFSSL_DTLS
  31574. if (IsDtlsNotSctpMode(ssl) &&
  31575. (ret = DtlsMsgPoolSave(ssl, input, inputSz, hello_request)) != 0) {
  31576. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  31577. return ret;
  31578. }
  31579. #endif
  31580. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  31581. handshake, 0, 0, 0, CUR_ORDER);
  31582. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  31583. if (sendSz < 0)
  31584. return sendSz;
  31585. }
  31586. ssl->buffers.outputBuffer.length += sendSz;
  31587. ssl->options.buildingMsg = 0;
  31588. ret = SendBuffered(ssl);
  31589. WOLFSSL_LEAVE("SendHelloRequest", ret);
  31590. WOLFSSL_END(WC_FUNC_HELLO_REQUEST_SEND);
  31591. return ret;
  31592. }
  31593. #endif /* HAVE_SECURE_RENEGOTIATION && !NO_WOLFSSL_SERVER */
  31594. #ifdef WOLFSSL_DTLS
  31595. /* handle generation of DTLS hello_verify_request (3) */
  31596. int SendHelloVerifyRequest(WOLFSSL* ssl,
  31597. const byte* cookie, byte cookieSz)
  31598. {
  31599. byte* output;
  31600. int length = VERSION_SZ + ENUM_LEN + cookieSz;
  31601. int idx = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
  31602. int sendSz = length + idx;
  31603. int ret;
  31604. /* are we in scr */
  31605. if (IsEncryptionOn(ssl, 1)) {
  31606. sendSz += MAX_MSG_EXTRA;
  31607. }
  31608. /* reset hashes */
  31609. ret = InitHandshakeHashes(ssl);
  31610. if (ret != 0)
  31611. return ret;
  31612. /* check for available size */
  31613. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  31614. return ret;
  31615. /* get output buffer */
  31616. output = ssl->buffers.outputBuffer.buffer +
  31617. ssl->buffers.outputBuffer.length;
  31618. /* Hello Verify Request should use the same sequence number
  31619. * as the Client Hello unless we are in renegotiation then
  31620. * don't change numbers */
  31621. #ifdef HAVE_SECURE_RENEGOTIATION
  31622. if (!IsSCR(ssl))
  31623. #endif
  31624. {
  31625. ssl->keys.dtls_sequence_number_hi = ssl->keys.curSeq_hi;
  31626. ssl->keys.dtls_sequence_number_lo = ssl->keys.curSeq_lo;
  31627. }
  31628. AddHeaders(output, length, hello_verify_request, ssl);
  31629. output[idx++] = DTLS_MAJOR;
  31630. output[idx++] = DTLS_MINOR;
  31631. output[idx++] = cookieSz;
  31632. if (cookie == NULL || cookieSz == 0)
  31633. return COOKIE_ERROR;
  31634. XMEMCPY(output + idx, cookie, cookieSz);
  31635. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  31636. if (ssl->hsInfoOn)
  31637. AddPacketName(ssl, "HelloVerifyRequest");
  31638. if (ssl->toInfoOn) {
  31639. ret = AddPacketInfo(ssl, "HelloVerifyRequest", handshake, output,
  31640. sendSz, WRITE_PROTO, 0, ssl->heap);
  31641. if (ret != 0)
  31642. return ret;
  31643. }
  31644. #endif
  31645. /* are we in scr */
  31646. if (IsEncryptionOn(ssl, 1)) {
  31647. byte* input;
  31648. int inputSz = DTLS_HANDSHAKE_HEADER_SZ + length; /* build msg adds rec hdr */
  31649. int recordHeaderSz = DTLS_RECORD_HEADER_SZ;
  31650. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  31651. if (input == NULL)
  31652. return MEMORY_E;
  31653. XMEMCPY(input, output + recordHeaderSz, inputSz);
  31654. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  31655. handshake, 0, 0, 0, CUR_ORDER);
  31656. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  31657. if (sendSz < 0)
  31658. return sendSz;
  31659. }
  31660. ssl->buffers.outputBuffer.length += sendSz;
  31661. return SendBuffered(ssl);
  31662. }
  31663. #endif /* WOLFSSL_DTLS */
  31664. typedef struct DckeArgs {
  31665. byte* output; /* not allocated */
  31666. word32 length;
  31667. word32 idx;
  31668. word32 begin;
  31669. word32 sigSz;
  31670. #ifndef NO_RSA
  31671. int lastErr;
  31672. #endif
  31673. } DckeArgs;
  31674. static void FreeDckeArgs(WOLFSSL* ssl, void* pArgs)
  31675. {
  31676. DckeArgs* args = (DckeArgs*)pArgs;
  31677. (void)ssl;
  31678. (void)args;
  31679. }
  31680. /* handle processing client_key_exchange (16) */
  31681. static int DoClientKeyExchange(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  31682. word32 size)
  31683. {
  31684. int ret;
  31685. #ifdef WOLFSSL_ASYNC_CRYPT
  31686. DckeArgs* args = NULL;
  31687. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  31688. #else
  31689. DckeArgs args[1];
  31690. #endif
  31691. (void)size;
  31692. (void)input;
  31693. WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_DO);
  31694. WOLFSSL_ENTER("DoClientKeyExchange");
  31695. #ifdef WOLFSSL_ASYNC_CRYPT
  31696. if (ssl->async == NULL) {
  31697. ssl->async = (struct WOLFSSL_ASYNC*)
  31698. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  31699. DYNAMIC_TYPE_ASYNC);
  31700. if (ssl->async == NULL)
  31701. ERROR_OUT(MEMORY_E, exit_dcke);
  31702. }
  31703. args = (DckeArgs*)ssl->async->args;
  31704. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  31705. if (ret != WC_NOT_PENDING_E) {
  31706. /* Check for error */
  31707. if (ret < 0)
  31708. goto exit_dcke;
  31709. }
  31710. else
  31711. #endif /* WOLFSSL_ASYNC_CRYPT */
  31712. {
  31713. /* Reset state */
  31714. ret = 0;
  31715. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  31716. XMEMSET(args, 0, sizeof(DckeArgs));
  31717. args->idx = *inOutIdx;
  31718. args->begin = *inOutIdx;
  31719. #ifdef WOLFSSL_ASYNC_CRYPT
  31720. ssl->async->freeArgs = FreeDckeArgs;
  31721. #endif
  31722. }
  31723. /* Do Client Key Exchange State Machine */
  31724. switch(ssl->options.asyncState)
  31725. {
  31726. case TLS_ASYNC_BEGIN:
  31727. {
  31728. /* Sanity checks */
  31729. /* server side checked in SanityCheckMsgReceived */
  31730. if (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
  31731. WOLFSSL_MSG("Client sending keyexchange at wrong time");
  31732. SendAlert(ssl, alert_fatal, unexpected_message);
  31733. ERROR_OUT(OUT_OF_ORDER_E, exit_dcke);
  31734. }
  31735. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  31736. if (ssl->options.verifyPeer &&
  31737. (ssl->options.mutualAuth || ssl->options.failNoCert)) {
  31738. if (!ssl->options.havePeerCert) {
  31739. WOLFSSL_MSG("client didn't present peer cert");
  31740. ERROR_OUT(NO_PEER_CERT, exit_dcke);
  31741. }
  31742. }
  31743. if (ssl->options.verifyPeer && ssl->options.failNoCertxPSK) {
  31744. if (!ssl->options.havePeerCert &&
  31745. !ssl->options.usingPSK_cipher) {
  31746. WOLFSSL_MSG("client didn't present peer cert");
  31747. ERROR_OUT(NO_PEER_CERT, exit_dcke);
  31748. }
  31749. }
  31750. #endif /* !NO_CERTS && !WOLFSSL_NO_CLIENT_AUTH */
  31751. #if defined(WOLFSSL_CALLBACKS)
  31752. if (ssl->hsInfoOn) {
  31753. AddPacketName(ssl, "ClientKeyExchange");
  31754. }
  31755. if (ssl->toInfoOn) {
  31756. AddLateName("ClientKeyExchange", &ssl->timeoutInfo);
  31757. }
  31758. #endif
  31759. if (ssl->arrays->preMasterSecret == NULL) {
  31760. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  31761. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN,
  31762. ssl->heap, DYNAMIC_TYPE_SECRET);
  31763. if (ssl->arrays->preMasterSecret == NULL) {
  31764. ERROR_OUT(MEMORY_E, exit_dcke);
  31765. }
  31766. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  31767. }
  31768. switch (ssl->specs.kea) {
  31769. #ifndef NO_RSA
  31770. case rsa_kea:
  31771. {
  31772. break;
  31773. } /* rsa_kea */
  31774. #endif /* !NO_RSA */
  31775. #ifndef NO_PSK
  31776. case psk_kea:
  31777. {
  31778. /* sanity check that PSK server callback has been set */
  31779. if (ssl->options.server_psk_cb == NULL) {
  31780. WOLFSSL_MSG("No server PSK callback set");
  31781. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  31782. }
  31783. break;
  31784. }
  31785. #endif /* !NO_PSK */
  31786. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  31787. defined(HAVE_CURVE448)
  31788. case ecc_diffie_hellman_kea:
  31789. {
  31790. break;
  31791. }
  31792. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  31793. #ifndef NO_DH
  31794. case diffie_hellman_kea:
  31795. {
  31796. break;
  31797. }
  31798. #endif /* !NO_DH */
  31799. #if !defined(NO_DH) && !defined(NO_PSK)
  31800. case dhe_psk_kea:
  31801. {
  31802. /* sanity check that PSK server callback has been set */
  31803. if (ssl->options.server_psk_cb == NULL) {
  31804. WOLFSSL_MSG("No server PSK callback set");
  31805. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  31806. }
  31807. break;
  31808. }
  31809. #endif /* !NO_DH && !NO_PSK */
  31810. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  31811. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  31812. case ecdhe_psk_kea:
  31813. {
  31814. /* sanity check that PSK server callback has been set */
  31815. if (ssl->options.server_psk_cb == NULL) {
  31816. WOLFSSL_MSG("No server PSK callback set");
  31817. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  31818. }
  31819. break;
  31820. }
  31821. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  31822. default:
  31823. WOLFSSL_MSG("Bad kea type");
  31824. ret = BAD_KEA_TYPE_E;
  31825. } /* switch (ssl->specs.kea) */
  31826. /* Check for error */
  31827. if (ret != 0) {
  31828. goto exit_dcke;
  31829. }
  31830. /* Advance state and proceed */
  31831. ssl->options.asyncState = TLS_ASYNC_BUILD;
  31832. } /* TLS_ASYNC_BEGIN */
  31833. FALL_THROUGH;
  31834. case TLS_ASYNC_BUILD:
  31835. {
  31836. switch (ssl->specs.kea) {
  31837. #ifndef NO_RSA
  31838. case rsa_kea:
  31839. {
  31840. word16 keySz;
  31841. ssl->buffers.keyType = rsa_sa_algo;
  31842. ret = DecodePrivateKey(ssl, &keySz);
  31843. if (ret != 0) {
  31844. goto exit_dcke;
  31845. }
  31846. args->length = (word32)keySz;
  31847. ssl->arrays->preMasterSz = SECRET_LEN;
  31848. if (ssl->options.tls) {
  31849. word16 check;
  31850. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  31851. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  31852. }
  31853. ato16(input + args->idx, &check);
  31854. args->idx += OPAQUE16_LEN;
  31855. if ((word32)check != args->length) {
  31856. WOLFSSL_MSG("RSA explicit size doesn't match");
  31857. #ifdef WOLFSSL_EXTRA_ALERTS
  31858. SendAlert(ssl, alert_fatal, bad_record_mac);
  31859. #endif
  31860. ERROR_OUT(RSA_PRIVATE_ERROR, exit_dcke);
  31861. }
  31862. }
  31863. if ((args->idx - args->begin) + args->length > size) {
  31864. WOLFSSL_MSG("RSA message too big");
  31865. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  31866. }
  31867. /* pre-load PreMasterSecret with RNG data */
  31868. ret = wc_RNG_GenerateBlock(ssl->rng,
  31869. &ssl->arrays->preMasterSecret[VERSION_SZ],
  31870. SECRET_LEN - VERSION_SZ);
  31871. if (ret != 0) {
  31872. goto exit_dcke;
  31873. }
  31874. args->output = NULL;
  31875. break;
  31876. } /* rsa_kea */
  31877. #endif /* !NO_RSA */
  31878. #ifndef NO_PSK
  31879. case psk_kea:
  31880. {
  31881. byte* pms = ssl->arrays->preMasterSecret;
  31882. word16 ci_sz;
  31883. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  31884. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  31885. }
  31886. ato16(input + args->idx, &ci_sz);
  31887. args->idx += OPAQUE16_LEN;
  31888. if (ci_sz > MAX_PSK_ID_LEN) {
  31889. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  31890. }
  31891. if ((args->idx - args->begin) + ci_sz > size) {
  31892. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  31893. }
  31894. XMEMCPY(ssl->arrays->client_identity,
  31895. input + args->idx, ci_sz);
  31896. args->idx += ci_sz;
  31897. ssl->arrays->client_identity[ci_sz] = '\0'; /* null term */
  31898. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  31899. ssl->arrays->client_identity, ssl->arrays->psk_key,
  31900. MAX_PSK_KEY_LEN);
  31901. if (ssl->arrays->psk_keySz == 0 ||
  31902. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  31903. #if defined(WOLFSSL_EXTRA_ALERTS) || \
  31904. defined(WOLFSSL_PSK_IDENTITY_ALERT)
  31905. SendAlert(ssl, alert_fatal,
  31906. unknown_psk_identity);
  31907. #endif
  31908. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  31909. }
  31910. /* SERVER: Pre-shared Key for peer authentication. */
  31911. ssl->options.peerAuthGood = 1;
  31912. /* make psk pre master secret */
  31913. /* length of key + length 0s + length of key + key */
  31914. c16toa((word16) ssl->arrays->psk_keySz, pms);
  31915. pms += OPAQUE16_LEN;
  31916. XMEMSET(pms, 0, ssl->arrays->psk_keySz);
  31917. pms += ssl->arrays->psk_keySz;
  31918. c16toa((word16) ssl->arrays->psk_keySz, pms);
  31919. pms += OPAQUE16_LEN;
  31920. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  31921. ssl->arrays->preMasterSz =
  31922. (ssl->arrays->psk_keySz * 2) + (OPAQUE16_LEN * 2);
  31923. break;
  31924. }
  31925. #endif /* !NO_PSK */
  31926. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  31927. defined(HAVE_CURVE448)
  31928. case ecc_diffie_hellman_kea:
  31929. {
  31930. #ifdef HAVE_ECC
  31931. ecc_key* private_key = ssl->eccTempKey;
  31932. /* handle static private key */
  31933. if (ssl->specs.static_ecdh &&
  31934. ssl->ecdhCurveOID != ECC_X25519_OID &&
  31935. ssl->ecdhCurveOID != ECC_X448_OID) {
  31936. word16 keySz;
  31937. ssl->buffers.keyType = ecc_dsa_sa_algo;
  31938. ret = DecodePrivateKey(ssl, &keySz);
  31939. if (ret != 0) {
  31940. goto exit_dcke;
  31941. }
  31942. private_key = (ecc_key*)ssl->hsKey;
  31943. }
  31944. #endif
  31945. /* import peer ECC key */
  31946. if ((args->idx - args->begin) + OPAQUE8_LEN > size) {
  31947. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  31948. }
  31949. args->length = input[args->idx++];
  31950. if ((args->idx - args->begin) + args->length > size) {
  31951. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  31952. }
  31953. #ifdef HAVE_CURVE25519
  31954. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  31955. #ifdef HAVE_PK_CALLBACKS
  31956. /* if callback then use it for shared secret */
  31957. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  31958. break;
  31959. }
  31960. #endif
  31961. if (ssl->peerX25519Key == NULL) {
  31962. /* alloc/init on demand */
  31963. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  31964. (void**)&ssl->peerX25519Key);
  31965. if (ret != 0) {
  31966. goto exit_dcke;
  31967. }
  31968. } else if (ssl->peerX25519KeyPresent) {
  31969. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  31970. ssl->peerX25519Key);
  31971. ssl->peerX25519KeyPresent = 0;
  31972. if (ret != 0) {
  31973. goto exit_dcke;
  31974. }
  31975. }
  31976. if ((ret = wc_curve25519_check_public(
  31977. input + args->idx, args->length,
  31978. EC25519_LITTLE_ENDIAN)) != 0) {
  31979. #ifdef WOLFSSL_EXTRA_ALERTS
  31980. if (ret == BUFFER_E)
  31981. SendAlert(ssl, alert_fatal, decode_error);
  31982. else if (ret == ECC_OUT_OF_RANGE_E)
  31983. SendAlert(ssl, alert_fatal, bad_record_mac);
  31984. else {
  31985. SendAlert(ssl, alert_fatal,
  31986. illegal_parameter);
  31987. }
  31988. #endif
  31989. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  31990. }
  31991. if (wc_curve25519_import_public_ex(
  31992. input + args->idx, args->length,
  31993. ssl->peerX25519Key,
  31994. EC25519_LITTLE_ENDIAN)) {
  31995. #ifdef WOLFSSL_EXTRA_ALERTS
  31996. SendAlert(ssl, alert_fatal, illegal_parameter);
  31997. #endif
  31998. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  31999. }
  32000. ssl->arrays->preMasterSz = CURVE25519_KEYSIZE;
  32001. ssl->peerX25519KeyPresent = 1;
  32002. break;
  32003. }
  32004. #endif
  32005. #ifdef HAVE_CURVE448
  32006. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  32007. #ifdef HAVE_PK_CALLBACKS
  32008. /* if callback then use it for shared secret */
  32009. if (ssl->ctx->X448SharedSecretCb != NULL) {
  32010. break;
  32011. }
  32012. #endif
  32013. if (ssl->peerX448Key == NULL) {
  32014. /* alloc/init on demand */
  32015. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  32016. (void**)&ssl->peerX448Key);
  32017. if (ret != 0) {
  32018. goto exit_dcke;
  32019. }
  32020. } else if (ssl->peerX448KeyPresent) {
  32021. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  32022. ssl->peerX448Key);
  32023. ssl->peerX448KeyPresent = 0;
  32024. if (ret != 0) {
  32025. goto exit_dcke;
  32026. }
  32027. }
  32028. if ((ret = wc_curve448_check_public(
  32029. input + args->idx, args->length,
  32030. EC448_LITTLE_ENDIAN)) != 0) {
  32031. #ifdef WOLFSSL_EXTRA_ALERTS
  32032. if (ret == BUFFER_E)
  32033. SendAlert(ssl, alert_fatal, decode_error);
  32034. else if (ret == ECC_OUT_OF_RANGE_E)
  32035. SendAlert(ssl, alert_fatal, bad_record_mac);
  32036. else {
  32037. SendAlert(ssl, alert_fatal,
  32038. illegal_parameter);
  32039. }
  32040. #endif
  32041. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  32042. }
  32043. if (wc_curve448_import_public_ex(
  32044. input + args->idx, args->length,
  32045. ssl->peerX448Key,
  32046. EC448_LITTLE_ENDIAN)) {
  32047. #ifdef WOLFSSL_EXTRA_ALERTS
  32048. SendAlert(ssl, alert_fatal, illegal_parameter);
  32049. #endif
  32050. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  32051. }
  32052. ssl->arrays->preMasterSz = CURVE448_KEY_SIZE;
  32053. ssl->peerX448KeyPresent = 1;
  32054. break;
  32055. }
  32056. #endif
  32057. #ifdef HAVE_ECC
  32058. #ifdef HAVE_PK_CALLBACKS
  32059. /* if callback then use it for shared secret */
  32060. if (ssl->ctx->EccSharedSecretCb != NULL) {
  32061. break;
  32062. }
  32063. #endif
  32064. if (!ssl->specs.static_ecdh &&
  32065. ssl->eccTempKeyPresent == 0) {
  32066. WOLFSSL_MSG("Ecc ephemeral key not made correctly");
  32067. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  32068. }
  32069. if (ssl->peerEccKey == NULL) {
  32070. /* alloc/init on demand */
  32071. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  32072. (void**)&ssl->peerEccKey);
  32073. if (ret != 0) {
  32074. goto exit_dcke;
  32075. }
  32076. } else if (ssl->peerEccKeyPresent) {
  32077. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  32078. ssl->peerEccKey);
  32079. ssl->peerEccKeyPresent = 0;
  32080. if (ret != 0) {
  32081. goto exit_dcke;
  32082. }
  32083. }
  32084. if (wc_ecc_import_x963_ex(input + args->idx,
  32085. args->length, ssl->peerEccKey,
  32086. private_key->dp->id)) {
  32087. #ifdef WOLFSSL_EXTRA_ALERTS
  32088. SendAlert(ssl, alert_fatal, illegal_parameter);
  32089. #endif
  32090. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  32091. }
  32092. ssl->arrays->preMasterSz = private_key->dp->size;
  32093. ssl->peerEccKeyPresent = 1;
  32094. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  32095. /* client_hello may have sent FFEDH2048, which sets namedGroup,
  32096. but that is not being used, so clear it */
  32097. /* resolves issue with server side wolfSSL_get_curve_name */
  32098. ssl->namedGroup = 0;
  32099. #endif
  32100. #endif /* HAVE_ECC */
  32101. break;
  32102. }
  32103. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  32104. #ifndef NO_DH
  32105. case diffie_hellman_kea:
  32106. {
  32107. word16 clientPubSz;
  32108. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  32109. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  32110. }
  32111. ato16(input + args->idx, &clientPubSz);
  32112. args->idx += OPAQUE16_LEN;
  32113. if ((args->idx - args->begin) + clientPubSz > size) {
  32114. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  32115. }
  32116. args->sigSz = clientPubSz;
  32117. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  32118. (void**)&ssl->buffers.serverDH_Key);
  32119. if (ret != 0) {
  32120. goto exit_dcke;
  32121. }
  32122. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  32123. ssl->buffers.serverDH_P.buffer,
  32124. ssl->buffers.serverDH_P.length,
  32125. ssl->buffers.serverDH_G.buffer,
  32126. ssl->buffers.serverDH_G.length);
  32127. /* set the max agree result size */
  32128. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  32129. break;
  32130. }
  32131. #endif /* !NO_DH */
  32132. #if !defined(NO_DH) && !defined(NO_PSK)
  32133. case dhe_psk_kea:
  32134. {
  32135. word16 clientSz;
  32136. /* Read in the PSK hint */
  32137. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  32138. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  32139. }
  32140. ato16(input + args->idx, &clientSz);
  32141. args->idx += OPAQUE16_LEN;
  32142. if (clientSz > MAX_PSK_ID_LEN) {
  32143. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  32144. }
  32145. if ((args->idx - args->begin) + clientSz > size) {
  32146. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  32147. }
  32148. XMEMCPY(ssl->arrays->client_identity, input + args->idx,
  32149. clientSz);
  32150. args->idx += clientSz;
  32151. ssl->arrays->client_identity[clientSz] = '\0'; /* null term */
  32152. /* Read in the DHE business */
  32153. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  32154. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  32155. }
  32156. ato16(input + args->idx, &clientSz);
  32157. args->idx += OPAQUE16_LEN;
  32158. if ((args->idx - args->begin) + clientSz > size) {
  32159. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  32160. }
  32161. args->sigSz = clientSz;
  32162. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  32163. (void**)&ssl->buffers.serverDH_Key);
  32164. if (ret != 0) {
  32165. goto exit_dcke;
  32166. }
  32167. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  32168. ssl->buffers.serverDH_P.buffer,
  32169. ssl->buffers.serverDH_P.length,
  32170. ssl->buffers.serverDH_G.buffer,
  32171. ssl->buffers.serverDH_G.length);
  32172. break;
  32173. }
  32174. #endif /* !NO_DH && !NO_PSK */
  32175. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  32176. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  32177. case ecdhe_psk_kea:
  32178. {
  32179. word16 clientSz;
  32180. /* Read in the PSK hint */
  32181. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  32182. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  32183. }
  32184. ato16(input + args->idx, &clientSz);
  32185. args->idx += OPAQUE16_LEN;
  32186. if (clientSz > MAX_PSK_ID_LEN) {
  32187. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  32188. }
  32189. if ((args->idx - args->begin) + clientSz > size) {
  32190. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  32191. }
  32192. XMEMCPY(ssl->arrays->client_identity,
  32193. input + args->idx, clientSz);
  32194. args->idx += clientSz;
  32195. ssl->arrays->client_identity[clientSz] = '\0'; /* null term */
  32196. /* import peer ECC key */
  32197. if ((args->idx - args->begin) + OPAQUE8_LEN > size) {
  32198. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  32199. }
  32200. args->length = input[args->idx++];
  32201. if ((args->idx - args->begin) + args->length > size) {
  32202. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  32203. }
  32204. args->sigSz = ENCRYPT_LEN - OPAQUE16_LEN;
  32205. #ifdef HAVE_CURVE25519
  32206. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  32207. #ifdef HAVE_PK_CALLBACKS
  32208. /* if callback then use it for shared secret */
  32209. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  32210. break;
  32211. }
  32212. #endif
  32213. if (ssl->eccTempKeyPresent == 0) {
  32214. WOLFSSL_MSG(
  32215. "X25519 ephemeral key not made correctly");
  32216. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  32217. }
  32218. if (ssl->peerX25519Key == NULL) {
  32219. /* alloc/init on demand */
  32220. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  32221. (void**)&ssl->peerX25519Key);
  32222. if (ret != 0) {
  32223. goto exit_dcke;
  32224. }
  32225. } else if (ssl->peerX25519KeyPresent) {
  32226. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  32227. ssl->peerX25519Key);
  32228. ssl->peerX25519KeyPresent = 0;
  32229. if (ret != 0) {
  32230. goto exit_dcke;
  32231. }
  32232. }
  32233. if ((ret = wc_curve25519_check_public(
  32234. input + args->idx, args->length,
  32235. EC25519_LITTLE_ENDIAN)) != 0) {
  32236. #ifdef WOLFSSL_EXTRA_ALERTS
  32237. if (ret == BUFFER_E)
  32238. SendAlert(ssl, alert_fatal, decode_error);
  32239. else if (ret == ECC_OUT_OF_RANGE_E)
  32240. SendAlert(ssl, alert_fatal, bad_record_mac);
  32241. else {
  32242. SendAlert(ssl, alert_fatal,
  32243. illegal_parameter);
  32244. }
  32245. #endif
  32246. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  32247. }
  32248. if (wc_curve25519_import_public_ex(
  32249. input + args->idx, args->length,
  32250. ssl->peerX25519Key,
  32251. EC25519_LITTLE_ENDIAN)) {
  32252. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  32253. }
  32254. ssl->peerX25519KeyPresent = 1;
  32255. break;
  32256. }
  32257. #endif
  32258. #ifdef HAVE_CURVE448
  32259. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  32260. #ifdef HAVE_PK_CALLBACKS
  32261. /* if callback then use it for shared secret */
  32262. if (ssl->ctx->X448SharedSecretCb != NULL) {
  32263. break;
  32264. }
  32265. #endif
  32266. if (ssl->eccTempKeyPresent == 0) {
  32267. WOLFSSL_MSG(
  32268. "X448 ephemeral key not made correctly");
  32269. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  32270. }
  32271. if (ssl->peerX448Key == NULL) {
  32272. /* alloc/init on demand */
  32273. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  32274. (void**)&ssl->peerX448Key);
  32275. if (ret != 0) {
  32276. goto exit_dcke;
  32277. }
  32278. } else if (ssl->peerX448KeyPresent) {
  32279. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  32280. ssl->peerX448Key);
  32281. ssl->peerX448KeyPresent = 0;
  32282. if (ret != 0) {
  32283. goto exit_dcke;
  32284. }
  32285. }
  32286. if ((ret = wc_curve448_check_public(
  32287. input + args->idx, args->length,
  32288. EC448_LITTLE_ENDIAN)) != 0) {
  32289. #ifdef WOLFSSL_EXTRA_ALERTS
  32290. if (ret == BUFFER_E)
  32291. SendAlert(ssl, alert_fatal, decode_error);
  32292. else if (ret == ECC_OUT_OF_RANGE_E)
  32293. SendAlert(ssl, alert_fatal, bad_record_mac);
  32294. else {
  32295. SendAlert(ssl, alert_fatal,
  32296. illegal_parameter);
  32297. }
  32298. #endif
  32299. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  32300. }
  32301. if (wc_curve448_import_public_ex(
  32302. input + args->idx, args->length,
  32303. ssl->peerX448Key,
  32304. EC448_LITTLE_ENDIAN)) {
  32305. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  32306. }
  32307. ssl->peerX448KeyPresent = 1;
  32308. break;
  32309. }
  32310. #endif
  32311. #ifdef HAVE_PK_CALLBACKS
  32312. /* if callback then use it for shared secret */
  32313. if (ssl->ctx->EccSharedSecretCb != NULL) {
  32314. break;
  32315. }
  32316. #endif
  32317. if (ssl->eccTempKeyPresent == 0) {
  32318. WOLFSSL_MSG("Ecc ephemeral key not made correctly");
  32319. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  32320. }
  32321. if (ssl->peerEccKey == NULL) {
  32322. /* alloc/init on demand */
  32323. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  32324. (void**)&ssl->peerEccKey);
  32325. if (ret != 0) {
  32326. goto exit_dcke;
  32327. }
  32328. }
  32329. else if (ssl->peerEccKeyPresent) {
  32330. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  32331. ssl->peerEccKey);
  32332. ssl->peerEccKeyPresent = 0;
  32333. if (ret != 0) {
  32334. goto exit_dcke;
  32335. }
  32336. }
  32337. if (wc_ecc_import_x963_ex(input + args->idx,
  32338. args->length, ssl->peerEccKey,
  32339. ssl->eccTempKey->dp->id)) {
  32340. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  32341. }
  32342. ssl->peerEccKeyPresent = 1;
  32343. break;
  32344. }
  32345. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  32346. default:
  32347. ret = BAD_KEA_TYPE_E;
  32348. } /* switch (ssl->specs.kea) */
  32349. /* Check for error */
  32350. if (ret != 0) {
  32351. goto exit_dcke;
  32352. }
  32353. /* Advance state and proceed */
  32354. ssl->options.asyncState = TLS_ASYNC_DO;
  32355. } /* TLS_ASYNC_BUILD */
  32356. FALL_THROUGH;
  32357. case TLS_ASYNC_DO:
  32358. {
  32359. switch (ssl->specs.kea) {
  32360. #ifndef NO_RSA
  32361. case rsa_kea:
  32362. {
  32363. RsaKey* key = (RsaKey*)ssl->hsKey;
  32364. ret = RsaDec(ssl,
  32365. input + args->idx,
  32366. args->length,
  32367. &args->output,
  32368. &args->sigSz,
  32369. key,
  32370. #ifdef HAVE_PK_CALLBACKS
  32371. ssl->buffers.key
  32372. #else
  32373. NULL
  32374. #endif
  32375. );
  32376. /* Errors that can occur here that should be
  32377. * indistinguishable:
  32378. * RSA_BUFFER_E, RSA_PAD_E and RSA_PRIVATE_ERROR
  32379. */
  32380. #ifdef WOLFSSL_ASYNC_CRYPT
  32381. if (ret == WC_PENDING_E)
  32382. goto exit_dcke;
  32383. #endif
  32384. if (ret == BAD_FUNC_ARG)
  32385. goto exit_dcke;
  32386. args->lastErr = ret - (SECRET_LEN - args->sigSz);
  32387. ret = 0;
  32388. break;
  32389. } /* rsa_kea */
  32390. #endif /* !NO_RSA */
  32391. #ifndef NO_PSK
  32392. case psk_kea:
  32393. {
  32394. break;
  32395. }
  32396. #endif /* !NO_PSK */
  32397. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  32398. defined(HAVE_CURVE448)
  32399. case ecc_diffie_hellman_kea:
  32400. {
  32401. void* private_key = ssl->eccTempKey;
  32402. (void)private_key;
  32403. #ifdef HAVE_CURVE25519
  32404. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  32405. ret = X25519SharedSecret(ssl,
  32406. (curve25519_key*)private_key,
  32407. ssl->peerX25519Key,
  32408. input + args->idx, &args->length,
  32409. ssl->arrays->preMasterSecret,
  32410. &ssl->arrays->preMasterSz,
  32411. WOLFSSL_SERVER_END
  32412. );
  32413. break;
  32414. }
  32415. #endif
  32416. #ifdef HAVE_CURVE448
  32417. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  32418. ret = X448SharedSecret(ssl,
  32419. (curve448_key*)private_key,
  32420. ssl->peerX448Key,
  32421. input + args->idx, &args->length,
  32422. ssl->arrays->preMasterSecret,
  32423. &ssl->arrays->preMasterSz,
  32424. WOLFSSL_SERVER_END
  32425. );
  32426. break;
  32427. }
  32428. #endif
  32429. #ifdef HAVE_ECC
  32430. if (ssl->specs.static_ecdh) {
  32431. private_key = ssl->hsKey;
  32432. }
  32433. /* Generate shared secret */
  32434. ret = EccSharedSecret(ssl,
  32435. (ecc_key*)private_key, ssl->peerEccKey,
  32436. input + args->idx, &args->length,
  32437. ssl->arrays->preMasterSecret,
  32438. &ssl->arrays->preMasterSz,
  32439. WOLFSSL_SERVER_END
  32440. );
  32441. #ifdef WOLFSSL_ASYNC_CRYPT
  32442. if (ret != WC_PENDING_E)
  32443. #endif
  32444. {
  32445. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  32446. (void**)&ssl->peerEccKey);
  32447. ssl->peerEccKeyPresent = 0;
  32448. }
  32449. #endif
  32450. break;
  32451. }
  32452. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  32453. #ifndef NO_DH
  32454. case diffie_hellman_kea:
  32455. {
  32456. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  32457. ssl->buffers.serverDH_Priv.buffer,
  32458. ssl->buffers.serverDH_Priv.length,
  32459. input + args->idx,
  32460. (word16)args->sigSz,
  32461. ssl->arrays->preMasterSecret,
  32462. &ssl->arrays->preMasterSz,
  32463. ssl->buffers.serverDH_P.buffer,
  32464. ssl->buffers.serverDH_P.length);
  32465. break;
  32466. }
  32467. #endif /* !NO_DH */
  32468. #if !defined(NO_DH) && !defined(NO_PSK)
  32469. case dhe_psk_kea:
  32470. {
  32471. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  32472. ssl->buffers.serverDH_Priv.buffer,
  32473. ssl->buffers.serverDH_Priv.length,
  32474. input + args->idx,
  32475. (word16)args->sigSz,
  32476. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  32477. &ssl->arrays->preMasterSz,
  32478. ssl->buffers.serverDH_P.buffer,
  32479. ssl->buffers.serverDH_P.length);
  32480. break;
  32481. }
  32482. #endif /* !NO_DH && !NO_PSK */
  32483. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  32484. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  32485. case ecdhe_psk_kea:
  32486. {
  32487. #ifdef HAVE_CURVE25519
  32488. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  32489. ret = X25519SharedSecret(ssl,
  32490. (curve25519_key*)ssl->eccTempKey,
  32491. ssl->peerX25519Key,
  32492. input + args->idx, &args->length,
  32493. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  32494. &args->sigSz,
  32495. WOLFSSL_SERVER_END
  32496. );
  32497. #ifdef WOLFSSL_ASYNC_CRYPT
  32498. if (ret != WC_PENDING_E)
  32499. #endif
  32500. {
  32501. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  32502. (void**)&ssl->peerX25519Key);
  32503. ssl->peerX25519KeyPresent = 0;
  32504. }
  32505. break;
  32506. }
  32507. #endif
  32508. #ifdef HAVE_CURVE448
  32509. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  32510. ret = X448SharedSecret(ssl,
  32511. (curve448_key*)ssl->eccTempKey,
  32512. ssl->peerX448Key,
  32513. input + args->idx, &args->length,
  32514. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  32515. &args->sigSz,
  32516. WOLFSSL_SERVER_END
  32517. );
  32518. #ifdef WOLFSSL_ASYNC_CRYPT
  32519. if (ret != WC_PENDING_E)
  32520. #endif
  32521. {
  32522. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  32523. (void**)&ssl->peerX448Key);
  32524. ssl->peerX448KeyPresent = 0;
  32525. }
  32526. break;
  32527. }
  32528. #endif
  32529. /* Generate shared secret */
  32530. ret = EccSharedSecret(ssl,
  32531. ssl->eccTempKey, ssl->peerEccKey,
  32532. input + args->idx, &args->length,
  32533. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  32534. &args->sigSz,
  32535. WOLFSSL_SERVER_END
  32536. );
  32537. if (!ssl->specs.static_ecdh
  32538. #ifdef WOLFSSL_ASYNC_CRYPT
  32539. && ret != WC_PENDING_E
  32540. #endif
  32541. ) {
  32542. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  32543. (void**)&ssl->peerEccKey);
  32544. ssl->peerEccKeyPresent = 0;
  32545. }
  32546. break;
  32547. }
  32548. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  32549. default:
  32550. ret = BAD_KEA_TYPE_E;
  32551. } /* switch (ssl->specs.kea) */
  32552. /* Check for error */
  32553. if (ret != 0) {
  32554. goto exit_dcke;
  32555. }
  32556. /* Advance state and proceed */
  32557. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  32558. } /* TLS_ASYNC_DO */
  32559. FALL_THROUGH;
  32560. case TLS_ASYNC_VERIFY:
  32561. {
  32562. switch (ssl->specs.kea) {
  32563. #ifndef NO_RSA
  32564. case rsa_kea:
  32565. {
  32566. byte *tmpRsa;
  32567. byte mask;
  32568. /* Add the signature length to idx */
  32569. args->idx += args->length;
  32570. #ifdef DEBUG_WOLFSSL
  32571. /* check version (debug warning message only) */
  32572. if (args->output != NULL) {
  32573. if (args->output[0] != ssl->chVersion.major ||
  32574. args->output[1] != ssl->chVersion.minor) {
  32575. WOLFSSL_MSG("preMasterSecret version mismatch");
  32576. }
  32577. }
  32578. #endif
  32579. /* RFC5246 7.4.7.1:
  32580. * Treat incorrectly formatted message blocks and/or
  32581. * mismatched version numbers in a manner
  32582. * indistinguishable from correctly formatted RSA blocks
  32583. */
  32584. ret = args->lastErr;
  32585. args->lastErr = 0; /* reset */
  32586. /* On error 'ret' will be negative */
  32587. mask = ((unsigned int)ret >>
  32588. ((sizeof(ret) * 8) - 1)) - 1;
  32589. /* build PreMasterSecret */
  32590. ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
  32591. ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
  32592. tmpRsa = input + args->idx - VERSION_SZ - SECRET_LEN;
  32593. ctMaskCopy(~mask, (byte*)&args->output, (byte*)&tmpRsa,
  32594. sizeof(args->output));
  32595. if (args->output != NULL) {
  32596. int i;
  32597. /* Use random secret on error */
  32598. for (i = VERSION_SZ; i < SECRET_LEN; i++) {
  32599. ssl->arrays->preMasterSecret[i] =
  32600. ctMaskSel(mask, args->output[i],
  32601. ssl->arrays->preMasterSecret[i]);
  32602. }
  32603. }
  32604. /* preMasterSecret has RNG and version set
  32605. * return proper length and ignore error
  32606. * error will be caught as decryption error
  32607. */
  32608. args->sigSz = SECRET_LEN;
  32609. ret = 0;
  32610. break;
  32611. } /* rsa_kea */
  32612. #endif /* !NO_RSA */
  32613. #ifndef NO_PSK
  32614. case psk_kea:
  32615. {
  32616. break;
  32617. }
  32618. #endif /* !NO_PSK */
  32619. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  32620. defined(HAVE_CURVE448)
  32621. case ecc_diffie_hellman_kea:
  32622. {
  32623. /* skip past the imported peer key */
  32624. args->idx += args->length;
  32625. break;
  32626. }
  32627. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  32628. #ifndef NO_DH
  32629. case diffie_hellman_kea:
  32630. {
  32631. args->idx += (word16)args->sigSz;
  32632. break;
  32633. }
  32634. #endif /* !NO_DH */
  32635. #if !defined(NO_DH) && !defined(NO_PSK)
  32636. case dhe_psk_kea:
  32637. {
  32638. byte* pms = ssl->arrays->preMasterSecret;
  32639. word16 clientSz = (word16)args->sigSz;
  32640. args->idx += clientSz;
  32641. c16toa((word16)ssl->arrays->preMasterSz, pms);
  32642. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  32643. pms += ssl->arrays->preMasterSz;
  32644. /* Use the PSK hint to look up the PSK and add it to the
  32645. * preMasterSecret here. */
  32646. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  32647. ssl->arrays->client_identity, ssl->arrays->psk_key,
  32648. MAX_PSK_KEY_LEN);
  32649. if (ssl->arrays->psk_keySz == 0 ||
  32650. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  32651. #if defined(WOLFSSL_EXTRA_ALERTS) || \
  32652. defined(WOLFSSL_PSK_IDENTITY_ALERT)
  32653. SendAlert(ssl, alert_fatal,
  32654. unknown_psk_identity);
  32655. #endif
  32656. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  32657. }
  32658. /* SERVER: Pre-shared Key for peer authentication. */
  32659. ssl->options.peerAuthGood = 1;
  32660. c16toa((word16) ssl->arrays->psk_keySz, pms);
  32661. pms += OPAQUE16_LEN;
  32662. XMEMCPY(pms, ssl->arrays->psk_key,
  32663. ssl->arrays->psk_keySz);
  32664. ssl->arrays->preMasterSz += ssl->arrays->psk_keySz +
  32665. OPAQUE16_LEN;
  32666. break;
  32667. }
  32668. #endif /* !NO_DH && !NO_PSK */
  32669. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  32670. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  32671. case ecdhe_psk_kea:
  32672. {
  32673. byte* pms = ssl->arrays->preMasterSecret;
  32674. word16 clientSz = (word16)args->sigSz;
  32675. /* skip past the imported peer key */
  32676. args->idx += args->length;
  32677. /* Add preMasterSecret */
  32678. c16toa(clientSz, pms);
  32679. ssl->arrays->preMasterSz = OPAQUE16_LEN + clientSz;
  32680. pms += ssl->arrays->preMasterSz;
  32681. /* Use the PSK hint to look up the PSK and add it to the
  32682. * preMasterSecret here. */
  32683. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  32684. ssl->arrays->client_identity, ssl->arrays->psk_key,
  32685. MAX_PSK_KEY_LEN);
  32686. if (ssl->arrays->psk_keySz == 0 ||
  32687. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  32688. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  32689. }
  32690. /* SERVER: Pre-shared Key for peer authentication. */
  32691. ssl->options.peerAuthGood = 1;
  32692. c16toa((word16) ssl->arrays->psk_keySz, pms);
  32693. pms += OPAQUE16_LEN;
  32694. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  32695. ssl->arrays->preMasterSz +=
  32696. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  32697. break;
  32698. }
  32699. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  32700. default:
  32701. ret = BAD_KEA_TYPE_E;
  32702. } /* switch (ssl->specs.kea) */
  32703. /* Check for error */
  32704. if (ret != 0) {
  32705. goto exit_dcke;
  32706. }
  32707. /* Advance state and proceed */
  32708. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  32709. } /* TLS_ASYNC_VERIFY */
  32710. FALL_THROUGH;
  32711. case TLS_ASYNC_FINALIZE:
  32712. {
  32713. if (IsEncryptionOn(ssl, 0)) {
  32714. args->idx += ssl->keys.padSz;
  32715. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  32716. if (ssl->options.startedETMRead)
  32717. args->idx += MacSize(ssl);
  32718. #endif
  32719. }
  32720. ret = MakeMasterSecret(ssl);
  32721. /* Check for error */
  32722. if (ret != 0) {
  32723. goto exit_dcke;
  32724. }
  32725. /* Advance state and proceed */
  32726. ssl->options.asyncState = TLS_ASYNC_END;
  32727. } /* TLS_ASYNC_FINALIZE */
  32728. FALL_THROUGH;
  32729. case TLS_ASYNC_END:
  32730. {
  32731. /* Set final index */
  32732. *inOutIdx = args->idx;
  32733. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  32734. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  32735. if (ssl->options.verifyPeer) {
  32736. ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
  32737. }
  32738. #endif
  32739. break;
  32740. } /* TLS_ASYNC_END */
  32741. default:
  32742. ret = INPUT_CASE_ERROR;
  32743. } /* switch(ssl->options.asyncState) */
  32744. exit_dcke:
  32745. WOLFSSL_LEAVE("DoClientKeyExchange", ret);
  32746. WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_DO);
  32747. #ifdef WOLFSSL_ASYNC_CRYPT
  32748. /* Handle async operation */
  32749. if (ret == WC_PENDING_E) {
  32750. /* Mark message as not received so it can process again */
  32751. ssl->msgsReceived.got_client_key_exchange = 0;
  32752. return ret;
  32753. }
  32754. /* Cleanup async */
  32755. FreeAsyncCtx(ssl, 0);
  32756. #else
  32757. FreeDckeArgs(ssl, args);
  32758. #endif /* WOLFSSL_ASYNC_CRYPT */
  32759. #ifdef OPENSSL_ALL
  32760. /* add error ret value to error queue */
  32761. if (ret != 0) {
  32762. WOLFSSL_ERROR(ret);
  32763. }
  32764. #endif
  32765. /* Cleanup PMS */
  32766. if (ssl->arrays->preMasterSecret != NULL) {
  32767. ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  32768. }
  32769. ssl->arrays->preMasterSz = 0;
  32770. /* Final cleanup */
  32771. FreeKeyExchange(ssl);
  32772. return ret;
  32773. }
  32774. #endif /* !WOLFSSL_NO_TLS12 */
  32775. #ifdef HAVE_SNI
  32776. int SNI_Callback(WOLFSSL* ssl)
  32777. {
  32778. int ad = 0;
  32779. int sniRet = 0;
  32780. int ret = 0;
  32781. /* Stunnel supports a custom sni callback to switch an SSL's ctx
  32782. * when SNI is received. Call it now if exists */
  32783. if(ssl && ssl->ctx && ssl->ctx->sniRecvCb) {
  32784. WOLFSSL_MSG("Calling custom sni callback");
  32785. sniRet = ssl->ctx->sniRecvCb(ssl, &ad, ssl->ctx->sniRecvCbArg);
  32786. switch (sniRet) {
  32787. case warning_return:
  32788. WOLFSSL_MSG("Error in custom sni callback. Warning alert");
  32789. ret = SendAlert(ssl, alert_warning, ad);
  32790. break;
  32791. case fatal_return:
  32792. WOLFSSL_MSG("Error in custom sni callback. Fatal alert");
  32793. SendAlert(ssl, alert_fatal, ad);
  32794. return FATAL_ERROR;
  32795. case noack_return:
  32796. WOLFSSL_MSG("Server quietly not acking servername.");
  32797. break;
  32798. default:
  32799. break;
  32800. }
  32801. }
  32802. return ret;
  32803. }
  32804. #endif /* HAVE_SNI */
  32805. #endif /* NO_WOLFSSL_SERVER */
  32806. #ifdef WOLFSSL_ASYNC_CRYPT
  32807. int wolfSSL_AsyncPop(WOLFSSL* ssl, byte* state)
  32808. {
  32809. int ret = 0;
  32810. WC_ASYNC_DEV* asyncDev;
  32811. WOLF_EVENT* event;
  32812. if (ssl == NULL) {
  32813. return BAD_FUNC_ARG;
  32814. }
  32815. /* check for pending async */
  32816. asyncDev = ssl->asyncDev;
  32817. if (asyncDev) {
  32818. /* grab event pointer */
  32819. event = &asyncDev->event;
  32820. ret = wolfAsync_EventPop(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL);
  32821. if (ret != WC_NOT_PENDING_E && ret != WC_PENDING_E) {
  32822. /* advance key share state if doesn't need called again */
  32823. if (state && (asyncDev->event.flags & WC_ASYNC_FLAG_CALL_AGAIN) == 0) {
  32824. (*state)++;
  32825. }
  32826. /* clear event */
  32827. XMEMSET(&asyncDev->event, 0, sizeof(WOLF_EVENT));
  32828. /* clear async dev */
  32829. ssl->asyncDev = NULL;
  32830. }
  32831. }
  32832. else {
  32833. ret = WC_NOT_PENDING_E;
  32834. }
  32835. WOLFSSL_LEAVE("wolfSSL_AsyncPop", ret);
  32836. return ret;
  32837. }
  32838. int wolfSSL_AsyncInit(WOLFSSL* ssl, WC_ASYNC_DEV* asyncDev, word32 flags)
  32839. {
  32840. int ret;
  32841. WOLF_EVENT* event;
  32842. if (ssl == NULL || asyncDev == NULL) {
  32843. return BAD_FUNC_ARG;
  32844. }
  32845. /* grab event pointer */
  32846. event = &asyncDev->event;
  32847. /* init event */
  32848. ret = wolfAsync_EventInit(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL, ssl, flags);
  32849. WOLFSSL_LEAVE("wolfSSL_AsyncInit", ret);
  32850. return ret;
  32851. }
  32852. int wolfSSL_AsyncPush(WOLFSSL* ssl, WC_ASYNC_DEV* asyncDev)
  32853. {
  32854. int ret;
  32855. WOLF_EVENT* event;
  32856. if (ssl == NULL || asyncDev == NULL) {
  32857. return BAD_FUNC_ARG;
  32858. }
  32859. /* grab event pointer */
  32860. event = &asyncDev->event;
  32861. /* store reference to active async operation */
  32862. ssl->asyncDev = asyncDev;
  32863. /* place event into queue */
  32864. ret = wolfAsync_EventQueuePush(&ssl->ctx->event_queue, event);
  32865. /* success means return WC_PENDING_E */
  32866. if (ret == 0) {
  32867. ret = WC_PENDING_E;
  32868. }
  32869. WOLFSSL_LEAVE("wolfSSL_AsyncPush", ret);
  32870. return ret;
  32871. }
  32872. #endif /* WOLFSSL_ASYNC_CRYPT */
  32873. /**
  32874. * Return the max fragment size. This is essentially the maximum
  32875. * fragment_length available.
  32876. * @param ssl WOLFSSL object containing ciphersuite information.
  32877. * @param maxFragment The amount of space we want to check is available. This
  32878. * is only the fragment length WITHOUT the (D)TLS headers.
  32879. * @return Max fragment size
  32880. */
  32881. int wolfSSL_GetMaxFragSize(WOLFSSL* ssl, int maxFragment)
  32882. {
  32883. (void) ssl; /* Avoid compiler warnings */
  32884. if (maxFragment > MAX_RECORD_SIZE) {
  32885. maxFragment = MAX_RECORD_SIZE;
  32886. }
  32887. #ifdef HAVE_MAX_FRAGMENT
  32888. if ((ssl->max_fragment != 0) && ((word16)maxFragment > ssl->max_fragment)) {
  32889. maxFragment = ssl->max_fragment;
  32890. }
  32891. #endif /* HAVE_MAX_FRAGMENT */
  32892. #ifdef WOLFSSL_DTLS
  32893. if (IsDtlsNotSctpMode(ssl)) {
  32894. int outputSz, mtuSz;
  32895. /* Given a input buffer size of maxFragment, how big will the
  32896. * encrypted output be? */
  32897. if (IsEncryptionOn(ssl, 1)) {
  32898. outputSz = BuildMessage(ssl, NULL, 0, NULL,
  32899. maxFragment + DTLS_HANDSHAKE_HEADER_SZ,
  32900. application_data, 0, 1, 0, CUR_ORDER);
  32901. }
  32902. else {
  32903. outputSz = maxFragment + DTLS_RECORD_HEADER_SZ +
  32904. DTLS_HANDSHAKE_HEADER_SZ;
  32905. }
  32906. /* Readjust maxFragment for MTU size. */
  32907. #if defined(WOLFSSL_DTLS_MTU)
  32908. mtuSz = ssl->dtlsMtuSz;
  32909. #else
  32910. mtuSz = MAX_MTU;
  32911. #endif
  32912. maxFragment = ModifyForMTU(ssl, maxFragment, outputSz, mtuSz);
  32913. }
  32914. #endif
  32915. return maxFragment;
  32916. }
  32917. #if defined(WOLFSSL_IOTSAFE) && defined(HAVE_PK_CALLBACKS)
  32918. IOTSAFE *wolfSSL_get_iotsafe_ctx(WOLFSSL *ssl)
  32919. {
  32920. if (ssl == NULL)
  32921. return NULL;
  32922. return &ssl->iotsafe;
  32923. }
  32924. int wolfSSL_set_iotsafe_ctx(WOLFSSL *ssl, IOTSAFE *iotsafe)
  32925. {
  32926. if ((ssl == NULL) || (iotsafe == NULL))
  32927. return BAD_FUNC_ARG;
  32928. XMEMCPY(&ssl->iotsafe, iotsafe, sizeof(IOTSAFE));
  32929. return 0;
  32930. }
  32931. #endif
  32932. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  32933. /* create an instance of WOLFSSL_BY_DIR_HASH structure */
  32934. WOLFSSL_BY_DIR_HASH* wolfSSL_BY_DIR_HASH_new(void)
  32935. {
  32936. WOLFSSL_BY_DIR_HASH* dir_hash;
  32937. WOLFSSL_ENTER("wolfSSL_BY_DIR_HASH_new");
  32938. dir_hash = (WOLFSSL_BY_DIR_HASH*)XMALLOC(sizeof(WOLFSSL_BY_DIR_HASH), NULL,
  32939. DYNAMIC_TYPE_OPENSSL);
  32940. if (dir_hash) {
  32941. XMEMSET(dir_hash, 0, sizeof(WOLFSSL_BY_DIR_HASH));
  32942. }
  32943. return dir_hash;
  32944. }
  32945. /* release a WOLFSSL_BY_DIR_HASH resource */
  32946. void wolfSSL_BY_DIR_HASH_free(WOLFSSL_BY_DIR_HASH* dir_hash)
  32947. {
  32948. if (dir_hash == NULL)
  32949. return;
  32950. XFREE(dir_hash, NULL, DYNAMIC_TYPE_OPENSSL);
  32951. }
  32952. /* create an instance of WOLFSSL_STACK for STACK_TYPE_BY_DIR_hash */
  32953. WOLFSSL_STACK* wolfSSL_sk_BY_DIR_HASH_new_null(void)
  32954. {
  32955. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  32956. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_new_null");
  32957. if (sk) {
  32958. sk->type = STACK_TYPE_BY_DIR_hash;
  32959. }
  32960. return sk;
  32961. }
  32962. /* returns value less than 0 on fail to match
  32963. * On a successful match the priority level found is returned
  32964. */
  32965. int wolfSSL_sk_BY_DIR_HASH_find(
  32966. WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk, const WOLFSSL_BY_DIR_HASH* toFind)
  32967. {
  32968. WOLFSSL_STACK* next;
  32969. int i, sz;
  32970. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_find");
  32971. if (sk == NULL || toFind == NULL) {
  32972. return WOLFSSL_FAILURE;
  32973. }
  32974. sz = wolfSSL_sk_BY_DIR_HASH_num(sk);
  32975. next = sk;
  32976. for (i = 0; i < sz && next != NULL; i++) {
  32977. if (next->data.dir_hash->hash_value == toFind->hash_value) {
  32978. return sz - i; /* reverse because stack pushed highest on first */
  32979. }
  32980. next = next->next;
  32981. }
  32982. return -1;
  32983. }
  32984. /* return a number of WOLFSSL_BY_DIR_HASH in stack */
  32985. int wolfSSL_sk_BY_DIR_HASH_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk)
  32986. {
  32987. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_num");
  32988. if (sk == NULL)
  32989. return -1;
  32990. return (int)sk->num;
  32991. }
  32992. /* return WOLFSSL_BY_DIR_HASH instance at i */
  32993. WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_value(
  32994. const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk, int i)
  32995. {
  32996. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_value");
  32997. for (; sk != NULL && i > 0; i--)
  32998. sk = sk->next;
  32999. if (i != 0 || sk == NULL)
  33000. return NULL;
  33001. return sk->data.dir_hash;
  33002. }
  33003. /* pop WOLFSSL_BY_DIR_HASH instance, and remove its node from stack */
  33004. WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_pop(
  33005. WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk)
  33006. {
  33007. WOLFSSL_STACK* node;
  33008. WOLFSSL_BY_DIR_HASH* hash;
  33009. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_pop");
  33010. if (sk == NULL) {
  33011. return NULL;
  33012. }
  33013. node = sk->next;
  33014. hash = sk->data.dir_hash;
  33015. if (node != NULL) { /* update sk and remove node from stack */
  33016. sk->data.dir_hash = node->data.dir_hash;
  33017. sk->next = node->next;
  33018. wolfSSL_sk_free_node(node);
  33019. }
  33020. else { /* last x509 in stack */
  33021. sk->data.dir_hash = NULL;
  33022. }
  33023. if (sk->num > 0) {
  33024. sk->num -= 1;
  33025. }
  33026. return hash;
  33027. }
  33028. /* release all contents in stack, and then release stack itself. */
  33029. /* Second argument is a function pointer to release resources. */
  33030. /* It calls the function to release resources when it is passed */
  33031. /* instead of wolfSSL_BY_DIR_HASH_free(). */
  33032. void wolfSSL_sk_BY_DIR_HASH_pop_free(WOLF_STACK_OF(BY_DIR_HASH)* sk,
  33033. void (*f) (WOLFSSL_BY_DIR_HASH*))
  33034. {
  33035. WOLFSSL_STACK* node;
  33036. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_pop_free");
  33037. if (sk == NULL) {
  33038. return;
  33039. }
  33040. /* parse through stack freeing each node */
  33041. node = sk->next;
  33042. while (node && sk->num > 1) {
  33043. WOLFSSL_STACK* tmp = node;
  33044. node = node->next;
  33045. if (f)
  33046. f(tmp->data.dir_hash);
  33047. else
  33048. wolfSSL_BY_DIR_HASH_free(tmp->data.dir_hash);
  33049. tmp->data.dir_hash = NULL;
  33050. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  33051. sk->num -= 1;
  33052. }
  33053. /* free head of stack */
  33054. if (sk->num == 1) {
  33055. if (f)
  33056. f(sk->data.dir_hash);
  33057. else
  33058. wolfSSL_BY_DIR_HASH_free(sk->data.dir_hash);
  33059. sk->data.dir_hash = NULL;
  33060. }
  33061. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  33062. }
  33063. /* release all contents in stack, and then release stack itself */
  33064. void wolfSSL_sk_BY_DIR_HASH_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk)
  33065. {
  33066. wolfSSL_sk_BY_DIR_HASH_pop_free(sk, NULL);
  33067. }
  33068. /* Adds the WOLFSSL_BY_DIR_HASH to the stack "sk". "sk" takes control of "in" and
  33069. * tries to free it when the stack is free'd.
  33070. *
  33071. * return 1 on success 0 on fail
  33072. */
  33073. int wolfSSL_sk_BY_DIR_HASH_push(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk,
  33074. WOLFSSL_BY_DIR_HASH* in)
  33075. {
  33076. WOLFSSL_STACK* node;
  33077. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_push");
  33078. if (sk == NULL || in == NULL) {
  33079. return WOLFSSL_FAILURE;
  33080. }
  33081. /* no previous values in stack */
  33082. if (sk->data.dir_hash == NULL) {
  33083. sk->data.dir_hash = in;
  33084. sk->num += 1;
  33085. return WOLFSSL_SUCCESS;
  33086. }
  33087. /* stack already has value(s) create a new node and add more */
  33088. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  33089. DYNAMIC_TYPE_OPENSSL);
  33090. if (node == NULL) {
  33091. WOLFSSL_MSG("Memory error");
  33092. return WOLFSSL_FAILURE;
  33093. }
  33094. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  33095. /* push new obj onto head of stack */
  33096. node->data.dir_hash = sk->data.dir_hash;
  33097. node->next = sk->next;
  33098. node->type = sk->type;
  33099. sk->next = node;
  33100. sk->data.dir_hash = in;
  33101. sk->num += 1;
  33102. return WOLFSSL_SUCCESS;
  33103. }
  33104. /* create an instance of WOLFSSL_BY_DIR_entry structure */
  33105. WOLFSSL_BY_DIR_entry* wolfSSL_BY_DIR_entry_new(void)
  33106. {
  33107. WOLFSSL_BY_DIR_entry* entry;
  33108. WOLFSSL_ENTER("wolfSSL_BY_DIR_entry_new");
  33109. entry = (WOLFSSL_BY_DIR_entry*)XMALLOC(sizeof(WOLFSSL_BY_DIR_entry), NULL,
  33110. DYNAMIC_TYPE_OPENSSL);
  33111. if (entry) {
  33112. XMEMSET(entry, 0, sizeof(WOLFSSL_BY_DIR_entry));
  33113. }
  33114. return entry;
  33115. }
  33116. /* release a WOLFSSL_BY_DIR_entry resource */
  33117. void wolfSSL_BY_DIR_entry_free(WOLFSSL_BY_DIR_entry* entry)
  33118. {
  33119. WOLFSSL_ENTER("wolfSSL_BY_DIR_entry_free");
  33120. if (entry == NULL)
  33121. return;
  33122. if (entry->hashes) {
  33123. wolfSSL_sk_BY_DIR_HASH_free(entry->hashes);
  33124. }
  33125. if (entry->dir_name != NULL) {
  33126. XFREE(entry->dir_name, NULL, DYNAMIC_TYPE_OPENSSL);
  33127. }
  33128. XFREE(entry, NULL, DYNAMIC_TYPE_OPENSSL);
  33129. }
  33130. WOLFSSL_STACK* wolfSSL_sk_BY_DIR_entry_new_null(void)
  33131. {
  33132. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  33133. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_new_null");
  33134. if (sk) {
  33135. sk->type = STACK_TYPE_BY_DIR_entry;
  33136. }
  33137. return sk;
  33138. }
  33139. /* return a number of WOLFSSL_BY_DIR_entry in stack */
  33140. int wolfSSL_sk_BY_DIR_entry_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk)
  33141. {
  33142. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_num");
  33143. if (sk == NULL)
  33144. return -1;
  33145. return (int)sk->num;
  33146. }
  33147. /* return WOLFSSL_BY_DIR_entry instance at i */
  33148. WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_value(
  33149. const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk, int i)
  33150. {
  33151. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_value");
  33152. for (; sk != NULL && i > 0; i--)
  33153. sk = sk->next;
  33154. if (i != 0 || sk == NULL)
  33155. return NULL;
  33156. return sk->data.dir_entry;
  33157. }
  33158. /* pop WOLFSSL_BY_DIR_entry instance first, and remove its node from stack */
  33159. WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_pop(
  33160. WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk)
  33161. {
  33162. WOLFSSL_STACK* node;
  33163. WOLFSSL_BY_DIR_entry* entry;
  33164. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_pop");
  33165. if (sk == NULL) {
  33166. return NULL;
  33167. }
  33168. node = sk->next;
  33169. entry = sk->data.dir_entry;
  33170. if (node != NULL) { /* update sk and remove node from stack */
  33171. sk->data.dir_entry = node->data.dir_entry;
  33172. sk->next = node->next;
  33173. wolfSSL_sk_free_node(node);
  33174. }
  33175. else { /* last x509 in stack */
  33176. sk->data.dir_entry = NULL;
  33177. }
  33178. if (sk->num > 0) {
  33179. sk->num -= 1;
  33180. }
  33181. return entry;
  33182. }
  33183. /* release all contents in stack, and then release stack itself. */
  33184. /* Second argument is a function pointer to release resources. */
  33185. /* It calls the function to release resources when it is passed */
  33186. /* instead of wolfSSL_BY_DIR_entry_free(). */
  33187. void wolfSSL_sk_BY_DIR_entry_pop_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk,
  33188. void (*f) (WOLFSSL_BY_DIR_entry*))
  33189. {
  33190. WOLFSSL_STACK* node;
  33191. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_pop_free");
  33192. if (sk == NULL) {
  33193. return;
  33194. }
  33195. /* parse through stack freeing each node */
  33196. node = sk->next;
  33197. while (node && sk->num > 1) {
  33198. WOLFSSL_STACK* tmp = node;
  33199. node = node->next;
  33200. if (f)
  33201. f(tmp->data.dir_entry);
  33202. else
  33203. wolfSSL_BY_DIR_entry_free(tmp->data.dir_entry);
  33204. tmp->data.dir_entry = NULL;
  33205. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  33206. sk->num -= 1;
  33207. }
  33208. /* free head of stack */
  33209. if (sk->num == 1) {
  33210. if (f)
  33211. f(sk->data.dir_entry);
  33212. else
  33213. wolfSSL_BY_DIR_entry_free(sk->data.dir_entry);
  33214. sk->data.dir_entry = NULL;
  33215. }
  33216. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  33217. }
  33218. /* release all contents in stack, and then release stack itself */
  33219. void wolfSSL_sk_BY_DIR_entry_free(WOLF_STACK_OF(wolfSSL_BY_DIR_entry) *sk)
  33220. {
  33221. wolfSSL_sk_BY_DIR_entry_pop_free(sk, NULL);
  33222. }
  33223. /* Adds the wolfSSL_BY_DIR_entry to the stack "sk". "sk" takes control of "in" and
  33224. * tries to free it when the stack is free'd.
  33225. *
  33226. * return 1 on success 0 on fail
  33227. */
  33228. int wolfSSL_sk_BY_DIR_entry_push(WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk,
  33229. WOLFSSL_BY_DIR_entry* in)
  33230. {
  33231. WOLFSSL_STACK* node;
  33232. if (sk == NULL || in == NULL) {
  33233. return WOLFSSL_FAILURE;
  33234. }
  33235. /* no previous values in stack */
  33236. if (sk->data.dir_entry == NULL) {
  33237. sk->data.dir_entry = in;
  33238. sk->num += 1;
  33239. return WOLFSSL_SUCCESS;
  33240. }
  33241. /* stack already has value(s) create a new node and add more */
  33242. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  33243. DYNAMIC_TYPE_OPENSSL);
  33244. if (node == NULL) {
  33245. WOLFSSL_MSG("Memory error");
  33246. return WOLFSSL_FAILURE;
  33247. }
  33248. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  33249. /* push new obj onto head of stack */
  33250. node->data.dir_entry = sk->data.dir_entry;
  33251. node->next = sk->next;
  33252. node->type = sk->type;
  33253. sk->next = node;
  33254. sk->data.dir_entry = in;
  33255. sk->num += 1;
  33256. return WOLFSSL_SUCCESS;
  33257. }
  33258. #endif /* OPENSSL_ALL */
  33259. #undef ERROR_OUT
  33260. #endif /* WOLFCRYPT_ONLY */